<?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>Forem: Akira</title>
    <description>The latest articles on Forem by Akira (@aakira).</description>
    <link>https://forem.com/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>Forem: Akira</title>
      <link>https://forem.com/aakira</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/aakira"/>
    <language>en</language>
    <item>
      <title>MCPサーバーテストプレイブック：Apidogを活用した手動・自動テスト</title>
      <dc:creator>Akira</dc:creator>
      <pubDate>Mon, 11 May 2026 08:53:19 +0000</pubDate>
      <link>https://forem.com/aakira/mcpsabatesutopureibutukuapidogwohuo-yong-sitashou-dong-zi-dong-tesuto-434m</link>
      <guid>https://forem.com/aakira/mcpsabatesutopureibutukuapidogwohuo-yong-sitashou-dong-zi-dong-tesuto-434m</guid>
      <description>&lt;p&gt;「Ableton Live MCP」のShow HN投稿が今週初め、118ポイントと78件のコメントを獲得しました。Model Context Protocol（MCP）は、Anthropic専用の実験から、1年足らずでエージェント統合の事実上のレイヤーへ広がりました。今では、Claude Desktop、Cursor、独自エージェントから外部ツール・リソース・プロンプトを呼び出すための実装対象として扱われています。&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;一方で、MCPサーバーのテスト方法はまだ整っていません。stdio経由でJSON-RPCを手動実行する方法は「hello world」には十分ですが、ツールが12個、プロンプトが3個、外部API依存があるサーバーではすぐに破綻します。&lt;/p&gt;

&lt;p&gt;この記事では、MCPサーバーを手動で検証し、その後 &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; で自動テスト化する手順をまとめます。目的は、MCPサーバーを通常のAPIと同じように、契約、モック、回帰テスト付きで出荷できる状態にすることです。&lt;/p&gt;

&lt;p&gt;より広いエージェント設計の文脈から来ている場合は、&lt;a href="http://apidog.com/blog/how-to-write-agents-md-files?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;agents.mdガイド&lt;/a&gt; も合わせて読むと、MCPサーバーの契約をチームで共有しやすくなります。&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MCP&lt;/strong&gt; はAnthropicのModel Context Protocolであり、stdioまたはHTTP上のJSON-RPC 2.0として動作します。&lt;/li&gt;
&lt;li&gt;主なプリミティブは、ツール、リソース、プロンプトです。&lt;/li&gt;
&lt;li&gt;MCPサーバーのテストでは、主に &lt;code&gt;initialize&lt;/code&gt;、&lt;code&gt;tools/list&lt;/code&gt;、&lt;code&gt;tools/call&lt;/code&gt;、&lt;code&gt;resources/read&lt;/code&gt;、&lt;code&gt;prompts/get&lt;/code&gt; の応答を検証します。&lt;/li&gt;
&lt;li&gt;最初はMCP Inspectorやstdioで手動確認し、ワイヤーレベルのリクエスト・レスポンスを把握します。&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; にJSON-RPCリクエストを保存し、JSONPathアサーション、モック、CI実行を追加します。&lt;/li&gt;
&lt;li&gt;外部API依存はApidogのモックサーバーで置き換え、CIを高速かつ決定論的にします。&lt;/li&gt;
&lt;li&gt;リクエストコレクション、モック、CIランナーをまとめて使う場合は、&lt;a href="https://apidog.com/download?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;

&lt;h2&gt;
  
  
  MCPの正体を短く整理する
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://spec.modelcontextprotocol.io/" rel="noopener noreferrer"&gt;Model Context Protocol仕様&lt;/a&gt; は、AIクライアントと外部機能をつなぐJSON-RPC 2.0ベースのプロトコルです。&lt;/p&gt;

&lt;p&gt;クライアントには、たとえば次のようなものがあります。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Desktop&lt;/li&gt;
&lt;li&gt;Cursor&lt;/li&gt;
&lt;li&gt;独自のAIエージェント&lt;/li&gt;
&lt;li&gt;MCP対応IDEや開発ツール&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MCPクライアントはサーバーを起動し、最初に &lt;code&gt;initialize&lt;/code&gt; ハンドシェイクを実行します。その後、ツール、リソース、プロンプトに対してJSON-RPC呼び出しを行います。&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;&lt;code&gt;initialize&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;プロトコルバージョンと機能のネゴシエーション&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tools/list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;公開ツールと入力スキーマの一覧取得&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tools/call&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ツールの実行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;resources/list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;読み取り可能なリソース一覧の取得&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;resources/read&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;URI指定リソースの読み取り&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prompts/list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;プロンプトテンプレート一覧の取得&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prompts/get&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;トランスポートは主に2種類です。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stdio：stdin/stdoutで改行区切りのJSON-RPCフレームをやり取りする&lt;/li&gt;
&lt;li&gt;HTTP：通常は &lt;code&gt;POST /&lt;/code&gt; とSSEを使ってストリーミングする&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ローカルMCPサーバーはstdio、リモートMCPサーバーはHTTPを使うことが多いです。&lt;/p&gt;

&lt;p&gt;MCPでは、&lt;code&gt;tools/list&lt;/code&gt; のレスポンス形状が壊れるだけで、Claude DesktopやCursorなど複数のクライアントが同時にツールを認識できなくなります。したがって、MCPサーバーは通常のAPIと同じく契約テストが必要です。&lt;/p&gt;

&lt;h2&gt;
  
  
  MCPサーバーでテストすべき項目
&lt;/h2&gt;

&lt;p&gt;堅牢なMCPサーバーテストでは、少なくとも次の6領域を確認します。&lt;/p&gt;

&lt;h3&gt;
  
  
  1. プロトコル準拠
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;initialize&lt;/code&gt; が正しい &lt;code&gt;protocolVersion&lt;/code&gt; を返すか確認します。&lt;/p&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;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"result"&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;"protocolVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-04-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"capabilities"&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;"tools"&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;"resources"&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;"prompts"&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;"serverInfo"&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;"example-mcp-server"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&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;確認ポイント：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;protocolVersion&lt;/code&gt; が期待値と一致する&lt;/li&gt;
&lt;li&gt;実際に対応している機能だけを &lt;code&gt;capabilities&lt;/code&gt; に出している&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;serverInfo.name&lt;/code&gt; と &lt;code&gt;serverInfo.version&lt;/code&gt; が存在する&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. スキーマの正確性
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;tools/list&lt;/code&gt; 内の各ツールに、正しい &lt;code&gt;inputSchema&lt;/code&gt; があるか確認します。&lt;/p&gt;

&lt;p&gt;見るべき項目：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;name&lt;/code&gt; が一意である&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;description&lt;/code&gt; が空ではない&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;inputSchema&lt;/code&gt; が有効なJSON Schemaである&lt;/li&gt;
&lt;li&gt;必須引数が &lt;code&gt;required&lt;/code&gt; に入っている&lt;/li&gt;
&lt;li&gt;型が実装と一致している&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;"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;"get_weather"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"inputSchema"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"properties"&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;"city"&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;改善例：&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;"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;"get_weather"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"inputSchema"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"properties"&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;"city"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"天気を取得する都市名。例: Tokyo"&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;"required"&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;"city"&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;h3&gt;
  
  
  3. ツールの動作
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;tools/call&lt;/code&gt; が期待通りのコンテンツブロックを返すか確認します。&lt;/p&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;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&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="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"result"&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;"content"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Tokyo: 24°C, cloudy"&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;確認ポイント：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;content&lt;/code&gt; が配列である&lt;/li&gt;
&lt;li&gt;各ブロックに &lt;code&gt;type&lt;/code&gt; がある&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;text&lt;/code&gt;、&lt;code&gt;image&lt;/code&gt;、&lt;code&gt;resource&lt;/code&gt; などの型が仕様に沿っている&lt;/li&gt;
&lt;li&gt;成功時に &lt;code&gt;isError: true&lt;/code&gt; が付いていない&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. ツールのエラー処理
&lt;/h3&gt;

&lt;p&gt;MCPでは、ツール実行時の失敗はJSON-RPCエラーではなく、通常の結果として返します。&lt;/p&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;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&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="mi"&gt;43&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"result"&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;"isError"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"content"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"city is required"&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;避けるべき例：&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;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&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="mi"&gt;43&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&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;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;-32602&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;"city is required"&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;JSON-RPCエラーは、プロトコルレベルの失敗を示します。ツール内部の入力エラーや外部APIエラーに使うと、クライアントが接続を閉じる場合があります。&lt;/p&gt;

&lt;h3&gt;
  
  
  5. リソースアクセス
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;resources/list&lt;/code&gt; で返したURIが、&lt;code&gt;resources/read&lt;/code&gt; で実際に読めるか確認します。&lt;/p&gt;

&lt;p&gt;確認ポイント：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;URIが安定している&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;resources/read&lt;/code&gt; が同じURIを解決できる&lt;/li&gt;
&lt;li&gt;ページネーションがある場合、2ページ目以降も読める&lt;/li&gt;
&lt;li&gt;存在しないURIに対して適切なエラーを返す&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. プロンプトのレンダリング
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;prompts/get&lt;/code&gt; が正しい &lt;code&gt;messages&lt;/code&gt; 配列を返すか確認します。&lt;/p&gt;

&lt;p&gt;確認ポイント：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;messages&lt;/code&gt; が配列である&lt;/li&gt;
&lt;li&gt;各メッセージに &lt;code&gt;role&lt;/code&gt; と &lt;code&gt;content&lt;/code&gt; がある&lt;/li&gt;
&lt;li&gt;引数が正しい位置に展開される&lt;/li&gt;
&lt;li&gt;必須引数が不足した場合にエラーになる&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  stdioでMCPサーバーを手動テストする
&lt;/h2&gt;

&lt;p&gt;まずは自動化せず、MCPサーバーがワイヤーレベルで何を返すか確認します。&lt;/p&gt;

&lt;p&gt;まだサーバーを作っていない場合は、PythonまたはTypeScriptで &lt;a href="https://modelcontextprotocol.io/quickstart" rel="noopener noreferrer"&gt;公式MCP SDKクイックスタート&lt;/a&gt; を使って最小構成を作成します。&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP Inspectorで起動確認する
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @modelcontextprotocol/inspector node your-server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MCP Inspectorは、MCPサーバーと通信するローカルWeb UIを起動します。&lt;/p&gt;

&lt;p&gt;ここで確認すること：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;サーバーが起動する&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;initialize&lt;/code&gt; が成功する&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tools/list&lt;/code&gt; が表示される&lt;/li&gt;
&lt;li&gt;各ツールを手動実行できる&lt;/li&gt;
&lt;li&gt;エラー時のレスポンス形状が正しい&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  生のstdioでJSON-RPCを送る
&lt;/h3&gt;

&lt;p&gt;Inspectorで問題がなければ、次は生のJSON-RPCを送ります。&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;echo&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2026-04-01","capabilities":{}}}'&lt;/span&gt; | node your-server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;次に、&lt;code&gt;tools/list&lt;/code&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="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}'&lt;/span&gt; | node your-server.js
&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 shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"get_weather","arguments":{"city":"Tokyo"}}}'&lt;/span&gt; | node your-server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;この段階で、次のリクエスト・レスポンスを保存しておきます。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;initialize&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tools/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;主要ツールの正常系 &lt;code&gt;tools/call&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;主要ツールの異常系 &lt;code&gt;tools/call&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resources/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resources/read&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prompts/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prompts/get&lt;/code&gt;&lt;/li&gt;
&lt;/ul&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&lt;/a&gt; に登録する契約テストの元になります。&lt;/p&gt;

&lt;h2&gt;
  
  
  手動テストからApidogでの自動化へ移行する
&lt;/h2&gt;

&lt;p&gt;手動テストは、初期の形状バグを見つけるには有効です。しかし、次のような状態になったら自動化が必要です。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ツール数が増えてきた&lt;/li&gt;
&lt;li&gt;外部API依存がある&lt;/li&gt;
&lt;li&gt;PRごとに回帰確認したい&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tools/list&lt;/code&gt; のスキーマ変更を検知したい&lt;/li&gt;
&lt;li&gt;Claude Desktopで毎回手動確認するのが遅い&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;基本パターンは次の通りです。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;手動で取得したJSON-RPCリクエストをApidogに保存する&lt;/li&gt;
&lt;li&gt;各レスポンスにJSONPathアサーションを追加する&lt;/li&gt;
&lt;li&gt;外部APIをモックする&lt;/li&gt;
&lt;li&gt;CIでスイートを実行する&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. MCPサーバー用のApidogプロジェクトを作成する
&lt;/h2&gt;

&lt;p&gt;Apidogで新しいプロジェクトを作成します。&lt;/p&gt;

&lt;p&gt;HTTP MCPサーバーの場合は、ベースURLにMCPサーバーのHTTPエンドポイントを設定します。&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;http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;stdioのみのMCPサーバーの場合は、テスト用に薄いHTTPラッパーを用意します。公式Inspectorを使うか、HTTPで受け取ったJSON-RPCをstdioに転送する小さなNode.jsスクリプトを使います。&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;Apidog
  -&amp;gt; HTTP POST /rpc
    -&amp;gt; wrapper.js
      -&amp;gt; stdio
        -&amp;gt; your-server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;非HTTPバックエンドをHTTP経由でテストする考え方は、&lt;a href="http://apidog.com/blog/api-testing-without-postman-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;2026年のPostmanなしのAPIテスト&lt;/a&gt; でも同じです。&lt;/p&gt;

&lt;h2&gt;
  
  
  2. 標準リクエストを保存する
&lt;/h2&gt;

&lt;p&gt;Apidogに、MCPの主要メソッドをリクエストとして保存します。&lt;/p&gt;

&lt;p&gt;最低限、次を登録します。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;initialize&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tools/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tools/call&lt;/code&gt; 正常系&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tools/call&lt;/code&gt; 異常系&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resources/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resources/read&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prompts/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prompts/get&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;tools/call&lt;/code&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;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&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="mi"&gt;42&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;"tools/call"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"params"&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;"get_weather"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&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;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Tokyo"&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;異常系も必ず保存します。&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;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&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="mi"&gt;43&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;"tools/call"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"params"&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;"get_weather"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&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;h2&gt;
  
  
  3. JSONPathアサーションを追加する
&lt;/h2&gt;

&lt;p&gt;自動テストで重要なのは、リクエストを送ることではなく、レスポンスの契約を検証することです。&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;initialize&lt;/code&gt; のアサーション例
&lt;/h3&gt;

&lt;p&gt;確認項目：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;$.result.protocolVersion&lt;/code&gt; が期待値と一致する&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$.result.capabilities&lt;/code&gt; が存在する&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$.result.serverInfo.name&lt;/code&gt; が存在する&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 plaintext"&gt;&lt;code&gt;$.result.protocolVersion == "2026-04-01"
$.result.capabilities exists
$.result.serverInfo.name exists
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;tools/list&lt;/code&gt; のアサーション例
&lt;/h3&gt;

&lt;p&gt;確認項目：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;$.result.tools&lt;/code&gt; が存在する&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$.result.tools&lt;/code&gt; が空でない&lt;/li&gt;
&lt;li&gt;各ツールに &lt;code&gt;name&lt;/code&gt; がある&lt;/li&gt;
&lt;li&gt;各ツールに &lt;code&gt;description&lt;/code&gt; がある&lt;/li&gt;
&lt;li&gt;各ツールに &lt;code&gt;inputSchema&lt;/code&gt; がある&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 plaintext"&gt;&lt;code&gt;$.result.tools exists
$.result.tools.length &amp;gt; 0
$.result.tools[0].name exists
$.result.tools[0].description exists
$.result.tools[0].inputSchema exists
&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 plaintext"&gt;&lt;code&gt;$.result.tools.length == 10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;tools/call&lt;/code&gt; 正常系のアサーション例
&lt;/h3&gt;

&lt;p&gt;確認項目：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;$.result.content&lt;/code&gt; が配列である&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$.result.content[0].type&lt;/code&gt; が期待値と一致する&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$.result.isError&lt;/code&gt; が存在しない、または &lt;code&gt;false&lt;/code&gt;
&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 plaintext"&gt;&lt;code&gt;$.result.content exists
$.result.content[0].type == "text"
$.result.isError != true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;tools/call&lt;/code&gt; 異常系のアサーション例
&lt;/h3&gt;

&lt;p&gt;確認項目：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;$.result.isError&lt;/code&gt; が &lt;code&gt;true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;エラーメッセージが存在する&lt;/li&gt;
&lt;li&gt;JSON-RPCの &lt;code&gt;error&lt;/code&gt; ではなく &lt;code&gt;result&lt;/code&gt; として返る&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 plaintext"&gt;&lt;code&gt;$.result.isError == true
$.result.content[0].text exists
$.error not exists
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;エラーメッセージの完全一致は避け、安定したエラーコードや正規表現で検証する方が安全です。&lt;/p&gt;

&lt;h2&gt;
  
  
  4. アップストリームAPIをモックする
&lt;/h2&gt;

&lt;p&gt;多くのMCPサーバーは、外部APIをラップします。&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;天気API&lt;/li&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;li&gt;Linear&lt;/li&gt;
&lt;li&gt;Notion&lt;/li&gt;
&lt;li&gt;社内データベース&lt;/li&gt;
&lt;li&gt;インシデント管理API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CIで毎回ライブAPIを呼ぶと、次の問題が起きます。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;レート制限に引っかかる&lt;/li&gt;
&lt;li&gt;ネットワーク障害でテストが落ちる&lt;/li&gt;
&lt;li&gt;テスト結果がデータ状態に依存する&lt;/li&gt;
&lt;li&gt;外部API利用コストが増える&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;この部分はApidogのモックサーバーで置き換えます。&lt;/p&gt;

&lt;p&gt;手順：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Apidogで外部APIのエンドポイントを定義する&lt;/li&gt;
&lt;li&gt;レスポンス例を登録する&lt;/li&gt;
&lt;li&gt;モックサーバーを起動する&lt;/li&gt;
&lt;li&gt;テスト時だけMCPサーバーの外部API URLをモックURLに向ける&lt;/li&gt;
&lt;li&gt;本番実行時は実APIのURLに戻す&lt;/li&gt;
&lt;/ol&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;# CI&lt;/span&gt;
&lt;span class="nv"&gt;WEATHER_API_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://mock.apidog.com/project/xxx

&lt;span class="c"&gt;# production&lt;/span&gt;
&lt;span class="nv"&gt;WEATHER_API_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://api.weather.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;モックを使うことで、MCPサーバーのテストは次のようになります。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;外部ネットワークに依存しない&lt;/li&gt;
&lt;li&gt;数秒で終わる&lt;/li&gt;
&lt;li&gt;毎回同じ結果になる&lt;/li&gt;
&lt;li&gt;スキーマ回帰を早期に検知できる&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;モックを使った契約優先のワークフローは、&lt;a href="http://apidog.com/blog/api-tool-contract-first-development?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;契約優先のAPI開発&lt;/a&gt; でも詳しく説明しています。&lt;/p&gt;

&lt;h2&gt;
  
  
  5. CIでMCPテストスイートを実行する
&lt;/h2&gt;

&lt;p&gt;ApidogプロジェクトはCLIランナーで実行できます。&lt;code&gt;apidog run&lt;/code&gt; は保存済みリクエストを実行し、アサーションを評価し、失敗時に非ゼロで終了します。&lt;/p&gt;

&lt;p&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="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;MCP server tests&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;22&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci&lt;/span&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;Start MCP HTTP wrapper&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node test/wrapper.js &amp;amp;&lt;/span&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 Apidog suite&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx apidog run --project-id $APIDOG_PROJECT --env ci&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;APIDOG_PROJECT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.APIDOG_PROJECT }}&lt;/span&gt;
          &lt;span class="na"&gt;APIDOG_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.APIDOG_TOKEN }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;これで、すべてのpushとpull requestでMCP契約テストが実行されます。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;tools/list&lt;/code&gt; のスキーマ変更、必須引数の欠落、ツールのエラー形式の崩れは、リリース前に検知できます。&lt;/p&gt;

&lt;h2&gt;
  
  
  良いMCPテストカバレッジの目安
&lt;/h2&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&lt;/a&gt; でMCPサーバーをテストする場合、現実的なスイートは次の構成になります。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;initialize&lt;/code&gt;：1件&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tools/list&lt;/code&gt;：1件&lt;/li&gt;
&lt;li&gt;各ツールの &lt;code&gt;tools/call&lt;/code&gt;：2〜4件

&lt;ul&gt;
&lt;li&gt;正常系&lt;/li&gt;
&lt;li&gt;必須引数不足&lt;/li&gt;
&lt;li&gt;型不正&lt;/li&gt;
&lt;li&gt;外部APIエラー&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;各リソースファミリーの &lt;code&gt;resources/list&lt;/code&gt;：1件&lt;/li&gt;

&lt;li&gt;各リソースファミリーの &lt;code&gt;resources/read&lt;/code&gt;：1件&lt;/li&gt;

&lt;li&gt;各プロンプトの &lt;code&gt;prompts/list&lt;/code&gt;：1件&lt;/li&gt;

&lt;li&gt;各プロンプトの &lt;code&gt;prompts/get&lt;/code&gt;：1件&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;たとえば、次のMCPサーバーを考えます。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ツール：10個&lt;/li&gt;
&lt;li&gt;リソース：3種類&lt;/li&gt;
&lt;li&gt;プロンプト：4個&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;この場合、テストスイートはおおよそ50〜70リクエストになります。モックサーバーを使えば、ローカルでもCIでも短時間で実行できます。&lt;/p&gt;

&lt;h2&gt;
  
  
  MCPサーバーテストでよくある間違い
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;initialize&lt;/code&gt; を省略する
&lt;/h3&gt;

&lt;p&gt;一部のMCPサーバーは、&lt;code&gt;initialize&lt;/code&gt; のタイミングでツールレジストリや設定を初期化します。&lt;/p&gt;

&lt;p&gt;そのため、いきなり &lt;code&gt;tools/list&lt;/code&gt; を呼ぶと落ちる場合があります。&lt;/p&gt;

&lt;p&gt;必ず次の順序でテストします。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;initialize&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tools/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tools/call&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resources/*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prompts/*&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  エラーメッセージを完全一致で検証する
&lt;/h3&gt;

&lt;p&gt;エラーテキストは変更されやすいため、完全一致は壊れやすいです。&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;$.result.content[0].text == "city is required"
&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 plaintext"&gt;&lt;code&gt;$.result.isError == true
$.result.content[0].text contains "city"
&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と違う形状を返していると、テストは成功しても本番で壊れます。&lt;/p&gt;

&lt;p&gt;対策：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;リリースごとに実APIレスポンスからモックを更新する&lt;/li&gt;
&lt;li&gt;重要な外部APIは契約テストを別途持つ&lt;/li&gt;
&lt;li&gt;モックフィクスチャをレビュー対象にする&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ストリーミングをテストしない
&lt;/h3&gt;

&lt;p&gt;HTTP MCPサーバーはSSEでツール結果をストリーミングすることがあります。&lt;/p&gt;

&lt;p&gt;確認ポイント：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSEを有効にしたリクエストでテストする&lt;/li&gt;
&lt;li&gt;組み立て後の結果に対してアサーションする&lt;/li&gt;
&lt;li&gt;タイムアウトや途中切断も確認する&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apidogは保存済みリクエストでSSEを扱えます。HTTP MCPサーバーをテストする場合は、リクエスト設定でストリーミングを有効にしてください。&lt;/p&gt;

&lt;h3&gt;
  
  
  並行実行をテストしない
&lt;/h3&gt;

&lt;p&gt;MCPクライアントは、エージェントループ内で複数の &lt;code&gt;tools/call&lt;/code&gt; を並行実行することがあります。&lt;/p&gt;

&lt;p&gt;単一リクエストでは成功しても、共有状態やキャッシュが原因で本番だけ壊れるケースがあります。&lt;/p&gt;

&lt;p&gt;確認すべきこと：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;同じツールを同時に複数回呼ぶ&lt;/li&gt;
&lt;li&gt;異なるツールを同時に呼ぶ&lt;/li&gt;
&lt;li&gt;外部APIモックに遅延を入れる&lt;/li&gt;
&lt;li&gt;タイムアウト時の挙動を見る&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  プロトコルエラーとツールエラーを混同する
&lt;/h3&gt;

&lt;p&gt;MCPでは、プロトコルレベルの失敗とツール実行の失敗を分けます。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSON-RPCエラー：不正なメソッド、無効なJSON-RPC、プロトコル違反&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;isError: true&lt;/code&gt;：ツール実行時の入力エラー、外部APIエラー、業務エラー&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;これを混同すると、Claude Desktopなどのクライアントが接続を閉じる場合があります。同様の契約バグについては、&lt;a href="http://apidog.com/blog/api-tool-contract-first-development?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;APIプラットフォームの契約優先開発&lt;/a&gt; でも扱っています。&lt;/p&gt;

&lt;h2&gt;
  
  
  実世界のユースケース
&lt;/h2&gt;

&lt;h3&gt;
  
  
  社内インシデント管理MCPサーバー
&lt;/h3&gt;

&lt;p&gt;あるチームは、社内インシデント管理API用のMCPサーバーを構築しました。&lt;/p&gt;

&lt;p&gt;Apidogで &lt;code&gt;tools/list&lt;/code&gt; の形状にアサーションを追加したところ、1週間で3件の回帰を検出しました。いずれも、Claude Desktopを使うエンジニア全員に壊れたツール定義が配布される可能性がある変更でした。&lt;/p&gt;

&lt;h3&gt;
  
  
  Notion用オープンソースMCPサーバー
&lt;/h3&gt;

&lt;p&gt;Notion向けMCPサーバーを公開している開発者は、Apidogモックを使ってCI中のNotion API呼び出しを置き換えています。&lt;/p&gt;

&lt;p&gt;結果：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Notionのレート制限に依存しない&lt;/li&gt;
&lt;li&gt;すべてのPRでテストが走る&lt;/li&gt;
&lt;li&gt;コントリビューターがNotion APIキーを持つ必要がない&lt;/li&gt;
&lt;li&gt;テストが数秒で完了する&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  複数MCPサーバーを運用するプラットフォームチーム
&lt;/h3&gt;

&lt;p&gt;14個の内部MCPサーバーを運用するチームでは、各サーバーの契約を共有Apidogワークスペースに置いています。&lt;/p&gt;

&lt;p&gt;新しいMCPサーバーはベーステストスイートを継承し、レビュー担当者はマージ前にスキーマ差分を確認できます。&lt;/p&gt;

&lt;p&gt;特に &lt;code&gt;tools/list&lt;/code&gt; のアサーションにより、引数名変更による大規模なクライアント影響を事前に検知できました。&lt;/p&gt;

&lt;h2&gt;
  
  
  実装チェックリスト
&lt;/h2&gt;

&lt;p&gt;MCPサーバーのテストを始めるなら、次の順で進めるのが実用的です。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;MCP Inspectorでサーバーを起動する&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;initialize&lt;/code&gt; が成功することを確認する&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tools/list&lt;/code&gt; のレスポンスを保存する&lt;/li&gt;
&lt;li&gt;各ツールの正常系 &lt;code&gt;tools/call&lt;/code&gt; を実行する&lt;/li&gt;
&lt;li&gt;各ツールの異常系 &lt;code&gt;tools/call&lt;/code&gt; を実行する&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;resources/*&lt;/code&gt; と &lt;code&gt;prompts/*&lt;/code&gt; を確認する&lt;/li&gt;
&lt;li&gt;ApidogにJSON-RPCリクエストを登録する&lt;/li&gt;
&lt;li&gt;JSONPathアサーションを追加する&lt;/li&gt;
&lt;li&gt;外部APIをApidogモックに置き換える&lt;/li&gt;
&lt;li&gt;CIで &lt;code&gt;apidog run&lt;/code&gt; を実行する&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;MCPは急速に普及しましたが、テスト方法はまだ手動中心です。しかし、MCPサーバーはJSON-RPC APIです。REST APIと同じように、契約、モック、CIによる回帰テストを持つべきです。&lt;/p&gt;

&lt;p&gt;要点は次の5つです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MCPサーバーはJSON-RPC APIとして扱う&lt;/li&gt;
&lt;li&gt;最初はMCP Inspectorとstdioで手動確認する&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;li&gt;
&lt;code&gt;initialize&lt;/code&gt;、&lt;code&gt;tools/list&lt;/code&gt;、&lt;code&gt;tools/call&lt;/code&gt;、&lt;code&gt;resources/read&lt;/code&gt;、&lt;code&gt;prompts/get&lt;/code&gt; にアサーションを追加する&lt;/li&gt;
&lt;li&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; のモックで置き換え、CIを安定させる&lt;/li&gt;
&lt;/ul&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&lt;/a&gt; でプロジェクトを作成し、手動でキャプチャした &lt;code&gt;tools/list&lt;/code&gt; のリクエストを貼り付け、JSONPathアサーションを1つ追加してください。そこから、MCPサーバーの契約テストを段階的に拡張できます。&lt;/p&gt;

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

&lt;h3&gt;
  
  
  MCPとは何ですか？
&lt;/h3&gt;

&lt;p&gt;MCP（Model Context Protocol）は、AIクライアントが外部ツール、リソース、プロンプトを呼び出すためのAnthropicのオープン仕様です。stdioまたはストリーミング可能なHTTP上でJSON-RPC 2.0として動作します。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://spec.modelcontextprotocol.io/" rel="noopener noreferrer"&gt;MCPの完全な仕様&lt;/a&gt; は &lt;a href="http://modelcontextprotocol.io" rel="noopener noreferrer"&gt;modelcontextprotocol.io&lt;/a&gt; で公開されています。&lt;/p&gt;

&lt;h3&gt;
  
  
  HTTPラッパーなしでMCPサーバーをテストできますか？
&lt;/h3&gt;

&lt;p&gt;手動テストなら可能です。&lt;a href="https://github.com/modelcontextprotocol/inspector" rel="noopener noreferrer"&gt;公式MCPインスペクター&lt;/a&gt; はstdioと直接通信できます。&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&lt;/a&gt; で自動テストする場合は、CI中だけstdioを薄いHTTPラッパーで包む構成が実用的です。本番トラフィックは引き続きstdioのままで問題ありません。&lt;/p&gt;

&lt;h3&gt;
  
  
  MCPサーバーが呼び出す外部APIはどうモックしますか？
&lt;/h3&gt;

&lt;p&gt;Apidogプロジェクトで外部APIエンドポイントをモックとして定義します。テスト中はMCPサーバーの設定をモックURLに向け、本番では実URLに切り替えます。&lt;/p&gt;

&lt;p&gt;同じパターンは &lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;QAエンジニア向けのAPIテストツール&lt;/a&gt; でも説明しています。&lt;/p&gt;

&lt;h3&gt;
  
  
  ツール結果のストリーミングはどうテストしますか？
&lt;/h3&gt;

&lt;p&gt;HTTP MCPサーバーはSSEでツール結果をストリーミングすることがあります。Apidogの保存済みリクエストでSSEを有効にし、組み立て後の結果に対してアサーションを実行します。&lt;/p&gt;

&lt;h3&gt;
  
  
  プロトコルバージョンはテストすべきですか？
&lt;/h3&gt;

&lt;p&gt;はい。&lt;code&gt;initialize&lt;/code&gt; の &lt;code&gt;protocolVersion&lt;/code&gt; は必ず固定してアサーションしてください。ここがずれると、クライアントとの互換性問題がサイレントに発生します。&lt;/p&gt;

&lt;h3&gt;
  
  
  実際のClaude Desktopに対してテストすべきですか？
&lt;/h3&gt;

&lt;p&gt;はい。リリース前のスモークテストとしては有効です。&lt;/p&gt;

&lt;p&gt;ただし、Claude Desktopを回帰テストの中心に置くべきではありません。手動で遅く、非決定論的だからです。回帰テストは &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; で自動化し、Claude Desktopは最終確認に使うのが実用的です。&lt;/p&gt;

&lt;h3&gt;
  
  
  実際のMCPサーバー実装はどこで見られますか？
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/modelcontextprotocol/servers" rel="noopener noreferrer"&gt;公式MCPサーバーリポジトリ&lt;/a&gt; に、ファイルシステム、GitHub、Slack、Postgresなどのリファレンス実装があります。ツール定義、入力スキーマ、エラー処理を見ると、良いMCPサーバーの形状を理解しやすくなります。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Maigretとは何か：壊れないOSINTスキャナー</title>
      <dc:creator>Akira</dc:creator>
      <pubDate>Mon, 11 May 2026 06:09:14 +0000</pubDate>
      <link>https://forem.com/aakira/maigrettohahe-kahuai-renaiosintsukiyana-g17</link>
      <guid>https://forem.com/aakira/maigrettohahe-kahuai-renaiosintsukiyana-g17</guid>
      <description>&lt;p&gt;ほとんどのOSINTツールは、ウェブサイトのURL構造変更、エンドポイント移動、CAPTCHA強化によってすぐに古くなります。&lt;a href="https://github.com/soxoj/maigret" rel="noopener noreferrer"&gt;Maigret&lt;/a&gt;は例外です。3,000以上のサイトに対応し、Pythonパッケージ、Telegramボット、Web UIを提供しながら、長期間メンテナンスされ続けています。この記事では、Maigretの実装パターンを分解し、壊れにくいスキャナーや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;p&gt;このガイドは、単に「ユーザー名を検索する方法」ではなく、エンジニア向けにMaigretの設計を読むためのものです。Maigretが何をしているのか、合法的な調査・セキュリティ用途は何か、数千サイトにスケールする仕組みは何か、そしてシグネチャデータベース、ドリフト検出、再帰的検証といった考え方を、日々の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;での検証にどう転用できるかを扱います。&lt;/p&gt;

&lt;p&gt;まだ読んでいない場合は、&lt;a href="http://apidog.com/blog/api-testing-without-postman-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;2026年版 PostmanなしのAPIテスト&lt;/a&gt;も参考になります。この記事では、パターンマッチングやドリフト検出をAPIテストの文脈で扱っています。&lt;/p&gt;

&lt;h2&gt;
  
  
  要約（TL;DR）
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Maigretは、ユーザー名を入力すると3,000以上のサイトで公開アカウントをチェックし、プロフィール情報を抽出します。&lt;/li&gt;
&lt;li&gt;中核は、バージョン管理されたサイトシグネチャデータベースです。&lt;/li&gt;
&lt;li&gt;検出は単純なHTTPステータスコードではなく、存在文字列、不在文字列、正規表現、ヘッダー、タグなどの複数シグナルで行われます。&lt;/li&gt;
&lt;li&gt;正当な用途には、OSINT調査、アカウント回復、行方不明者捜索、ブランド悪用監視、承認済みレッドチーム活動があります。&lt;/li&gt;
&lt;li&gt;個人の同意なしに使用すると、ハラスメントやストーキングに該当する可能性があります。&lt;/li&gt;
&lt;li&gt;Maigretの設計パターンは、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;でのAPI検証にも有効です。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Maigretとは何か、そして何ではないか
&lt;/h2&gt;

&lt;p&gt;Maigretは、&lt;a href="https://github.com/soxoj" rel="noopener noreferrer"&gt;soxoj&lt;/a&gt;によってメンテナンスされているMITライセンスのPythonツールです。READMEでは「3,000以上のサイトからユーザー名で個人の情報を収集する」と説明されています。&lt;/p&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;pip &lt;span class="nb"&gt;install &lt;/span&gt;maigret
maigret username
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Maigretはサイトデータベースを参照し、対象ユーザー名が各サイトに存在するかを確認し、見つかった公開プロフィールから情報を抽出してレポートを生成します。&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%2F05%2Fimage-16.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%2F05%2Fimage-16.png" alt="" width="800" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;重要な前提は3つあります。&lt;/p&gt;

&lt;p&gt;1つ目は、Maigretが扱うのは公開データのみだということです。ログイン、認証情報の悪用、APIキーの利用は行いません。匿名アクセスで見えるプロフィールページがあれば読み取り、見えなければ「見つからない」または「不明」と判断します。&lt;/p&gt;

&lt;p&gt;2つ目は、正当な調査の文脈で使われていることです。調査報道、行方不明者捜索、詐欺対策、ブランド保護、承認済みレッドチーム活動などで利用されています。&lt;/p&gt;

&lt;p&gt;3つ目は、悪用可能性があることです。本人の同意なく個人を追跡する目的で実行すると、倫理的にも法的にも問題になります。この記事では、人をターゲットにする手順ではなく、ツール設計とAPIテストに応用できる実装パターンに焦点を当てます。&lt;/p&gt;

&lt;h2&gt;
  
  
  サイトシグネチャデータベース
&lt;/h2&gt;

&lt;p&gt;Maigretの中心は、サイトごとのシグネチャデータベースです。各エントリは、スキャナーが次の判断を行えるだけの情報を持っています。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;対象サイトでユーザー名をどうURLに埋め込むか&lt;/li&gt;
&lt;li&gt;アカウントが存在する場合、ページに何が表示されるか&lt;/li&gt;
&lt;li&gt;アカウントが存在しない場合、ページに何が表示されるか&lt;/li&gt;
&lt;li&gt;公開プロフィールからどの情報を抽出できるか&lt;/li&gt;
&lt;li&gt;レート制限やCAPTCHAの可能性があるか&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;このデータベースはJSON形式で管理され、リポジトリでバージョン管理されています。Maigretは実行時にGitHubから更新を取得できるため、サイト側の変更に追従しやすくなっています。&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 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;"endpoint"&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 /users/{id}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expectedStatus"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requiredFields"&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;"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;"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;"email"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"forbiddenFields"&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;"password"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requiredHeaders"&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;"content-type"&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;a href="http://apidog.com/blog/api-tool-contract-first-development?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;コントラクトファーストAPI開発&lt;/a&gt;や&lt;a href="http://apidog.com/blog/mcp-server-testing-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;MCPサーバーテストプレイブック&lt;/a&gt;でも同じ発想が使われます。&lt;/p&gt;

&lt;h2&gt;
  
  
  Maigretが「見つかった」と「見つからない」を判定する方法
&lt;/h2&gt;

&lt;p&gt;単純なスキャナーなら、次のようにHTTP GETしてステータスコードだけを見ます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://example.com/user/&amp;lt;username&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;しかし実際のサイトでは、存在しないユーザーでも&lt;code&gt;200 OK&lt;/code&gt;を返すことがあります。たとえば、次のようなケースです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;「そのユーザーはいません」というページを&lt;code&gt;200&lt;/code&gt;で返す&lt;/li&gt;
&lt;li&gt;ホームページへフォールバックする&lt;/li&gt;
&lt;li&gt;CAPTCHAページを返す&lt;/li&gt;
&lt;li&gt;キャッシュされた汎用ページを返す&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;そのため、Maigretはステータスコードだけでは判断しません。サイトシグネチャには、より具体的なルールが含まれます。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;urlMain&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;url&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;presenseStrs&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;absenceStrs&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;ユーザー名抽出用の正規表現&lt;/li&gt;
&lt;li&gt;カスタムヘッダー&lt;/li&gt;
&lt;li&gt;カテゴリタグ&lt;/li&gt;
&lt;li&gt;国タグ&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;判定イメージは次のようになります。&lt;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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response_text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;presence_strs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;absence_strs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;has_required_signals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response_text&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;presence_strs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;has_absence_signals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response_text&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;absence_strs&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;has_required_signals&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;has_absence_signals&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;「見つかった」と判断するには、存在を示す文字列が揃っており、不在を示す文字列が含まれていない必要があります。それ以外は「不明」として扱い、手動確認の余地を残します。&lt;/p&gt;

&lt;p&gt;これはAPIテストでも重要です。&lt;code&gt;200 OK&lt;/code&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"&gt;Apidog&lt;/a&gt;では、1つのリクエストに対してステータスコード、レスポンスボディ、ヘッダーなどのアサーションを設定できます。これは、Maigretの&lt;code&gt;presenseStrs&lt;/code&gt;と&lt;code&gt;absenceStrs&lt;/code&gt;をAPIテストに置き換えたものです。&lt;/p&gt;

&lt;h2&gt;
  
  
  再帰的検索と情報抽出
&lt;/h2&gt;

&lt;p&gt;Maigretはアカウントを見つけると、公開プロフィールから追加情報を抽出します。&lt;/p&gt;

&lt;p&gt;対象になり得る情報は次のようなものです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;別のユーザー名&lt;/li&gt;
&lt;li&gt;実名&lt;/li&gt;
&lt;li&gt;メールアドレス&lt;/li&gt;
&lt;li&gt;電話番号&lt;/li&gt;
&lt;li&gt;外部リンク&lt;/li&gt;
&lt;li&gt;他サービスのプロフィールURL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;抽出ルールもサイトごとに定義されます。GitHub、LinkedIn、Instagramではプロフィール構造が異なるため、同じ抽出ロジックでは不十分です。&lt;/p&gt;

&lt;p&gt;さらにMaigretは、抽出した識別子を再度検索に使うことがあります。これにより、1つのユーザー名から関連アカウントをたどる再帰的な探索が可能になります。&lt;/p&gt;

&lt;p&gt;APIテストでもこの考え方は使えます。たとえば、あるレスポンスに未文書化フィールドが含まれていた場合、それを無視せず、関連エンドポイントやダウンストリーム処理の検証に使います。&lt;/p&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;"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;"user_123"&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;"Alice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"billingProfileId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bp_789"&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;billingProfileId&lt;/code&gt;が仕様書にないなら、次を確認します。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;このフィールドは意図されたものか&lt;/li&gt;
&lt;li&gt;関連する請求APIに存在するか&lt;/li&gt;
&lt;li&gt;公開してよい情報か&lt;/li&gt;
&lt;li&gt;テストケースに追加すべきか&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Maigretの再帰的検索は、APIテストにおける「レスポンスから次の検証対象を発見する」パターンとして応用できます。&lt;/p&gt;

&lt;h2&gt;
  
  
  CAPTCHAとレート制限の処理
&lt;/h2&gt;

&lt;p&gt;Maigretは、CAPTCHAやレート制限を完全に突破するツールではありません。レスポンスの形状から検出し、必要に応じて処理を切り替えます。&lt;/p&gt;

&lt;p&gt;主な戦略は次のとおりです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User-Agentのローテーション&lt;/li&gt;
&lt;li&gt;サイトごとのリトライヘッダーの尊重&lt;/li&gt;
&lt;li&gt;モバイル版または簡易ドメインへのフォールバック&lt;/li&gt;
&lt;li&gt;サイトが許可する場合のTorまたはI2P経由ルーティング&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ただし、サイトが強力な自動化防止策を導入している場合、Maigretは「CAPTCHA検出」と記録し、手動確認を促します。敵対的に防御を突破するのではなく、公開アクセスとして許される範囲で動作します。&lt;/p&gt;

&lt;p&gt;APIテストでも同じ姿勢が必要です。レート制限に遭遇したら、突破しようとするのではなく、検出してバックオフします。&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;retryAfter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Retry-After&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Rate limited. Retry after: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;retryAfter&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; seconds`&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;テストランナーがレート制限を無視してリクエストを投げ続けると、チームのIPがブロックされる可能性があります。Maigretのように、制限を信号として扱い、適切に停止または待機する設計が安全です。&lt;/p&gt;

&lt;h2&gt;
  
  
  シグネチャのドリフト問題
&lt;/h2&gt;

&lt;p&gt;3,000以上のサイトに対応するデータベースは、更新され続けて初めて価値があります。サイトは次のように変化します。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;プロフィールページのHTMLを変更する&lt;/li&gt;
&lt;li&gt;URLパターンを変更する&lt;/li&gt;
&lt;li&gt;CAPTCHAを追加する&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;Maigretはこれに対して複数のレイヤーで対応しています。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHubリポジトリからの自動更新&lt;/li&gt;
&lt;li&gt;コミュニティによるプルリクエスト&lt;/li&gt;
&lt;li&gt;手動更新用の&lt;code&gt;--update&lt;/code&gt;フラグ&lt;/li&gt;
&lt;li&gt;既知の存在ユーザー名に対する検証ハーネス&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;重要なのは、既知の存在ユーザー名を使ってシグネチャがまだ機能しているかを確認する点です。これはAPIテストの回帰テストと同じです。&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 plaintext"&gt;&lt;code&gt;保存済みフィクスチャ
        ↓
定期実行
        ↓
現在のレスポンスと比較
        ↓
差分があればドリフトとして通知
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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&lt;/a&gt;でも、エンドポイントごとに期待レスポンスやアサーションを定義し、継続的に検証できます。&lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;DeepSeek V4 APIガイド&lt;/a&gt;では、特定ベンダーAPIを検証する際の考え方も扱っています。&lt;/p&gt;

&lt;h2&gt;
  
  
  オプションのAI要約モード
&lt;/h2&gt;

&lt;p&gt;Maigretには&lt;code&gt;--ai&lt;/code&gt;フラグがあります。これは、OpenAI互換のLLMエンドポイントを使って、生の検索結果を短い調査要約に変換する機能です。APIキーはユーザーが用意します。&lt;/p&gt;

&lt;p&gt;重要なのは、LLMが判定を行わないことです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ユーザー名が存在するかどうかは、ルールベースで判定する&lt;/li&gt;
&lt;li&gt;LLMは、その結果を読みやすく要約する&lt;/li&gt;
&lt;li&gt;判断ロジックと文章生成を分離する&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;これはAPI監視でも良い設計です。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;決定論的なアサーション
        ↓
合否判定
        ↓
実行ログ
        ↓
LLMによる要約
        ↓
Slackやレポートに投稿
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;LLMをテストの判定者にするのではなく、後処理器として使う方が安定します。&lt;a href="http://apidog.com/blog/computer-use-vs-structured-apis?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;コンピューター利用 vs 構造化API&lt;/a&gt;でも、構造化されたルールを先に置く重要性を説明しています。&lt;/p&gt;

&lt;h2&gt;
  
  
  正当なユースケース
&lt;/h2&gt;

&lt;p&gt;Maigretの使用が明確に適切な場面は限られます。&lt;/p&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;p&gt;一方で、次の用途は不適切です。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;好奇心で見知らぬ人を調べる&lt;/li&gt;
&lt;li&gt;元パートナーを追跡する&lt;/li&gt;
&lt;li&gt;同意のない個人データセットを作る&lt;/li&gt;
&lt;li&gt;ハラスメント目的で使う&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ツールが公開情報だけを扱うとしても、使い方によっては法的・倫理的な境界を越えます。&lt;/p&gt;

&lt;h2&gt;
  
  
  APIテストに適用できるMaigretのパターン
&lt;/h2&gt;

&lt;p&gt;MaigretからAPIテストに直接転用できるパターンは5つあります。&lt;/p&gt;

&lt;h3&gt;
  
  
  1. チェックをコードではなくシグネチャとして管理する
&lt;/h3&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;"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;"Get user profile"&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;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/users/{id}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expect"&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;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"requiredJsonPaths"&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;"$.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;"$.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;"$.email"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"forbiddenJsonPaths"&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;"$.password"&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;これにより、新しいエンドポイントや外部ベンダーAPIを追加しやすくなります。&lt;/p&gt;

&lt;h3&gt;
  
  
  2. ステータスコードだけで判定しない
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;200 OK&lt;/code&gt;は成功の一部でしかありません。&lt;/p&gt;

&lt;p&gt;最低限、次を組み合わせて確認します。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ステータスコード&lt;/li&gt;
&lt;li&gt;レスポンスボディの必須フィールド&lt;/li&gt;
&lt;li&gt;含まれてはいけないフィールド&lt;/li&gt;
&lt;li&gt;エラー形式&lt;/li&gt;
&lt;li&gt;Content-Type&lt;/li&gt;
&lt;li&gt;認証・認可ヘッダー&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. シグネチャを継続的に更新する
&lt;/h3&gt;

&lt;p&gt;API仕様は変化します。人間が気づく前にテストが検出できるよう、アサーションや仕様を同期・更新できる状態にします。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://apidog.com/blog/api-testing-without-postman-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;PostmanなしのAPIテスト&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%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-17.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%2F05%2Fimage-17.png" alt="" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. ドリフト検出を定期実行する
&lt;/h3&gt;

&lt;p&gt;既知の良好なフィクスチャを保存し、定期的に実行します。差分が出たら、APIの破壊的変更や仕様外変更として検知します。&lt;/p&gt;

&lt;h3&gt;
  
  
  5. LLMは判定ではなくレポート生成に使う
&lt;/h3&gt;

&lt;p&gt;合否判定は決定論的なルールで行います。LLMは、実行結果を人間が読みやすい形に要約するために使います。&lt;/p&gt;

&lt;p&gt;この分離により、テスト結果の信頼性を保ちながら、レポートの可読性を上げられます。&lt;/p&gt;

&lt;h2&gt;
  
  
  Maigret実行時の一般的な落とし穴
&lt;/h2&gt;

&lt;p&gt;Maigretを試すエンジニアは、次の点に注意してください。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;-a&lt;/code&gt;なしで完全スキャンだと思い込む&lt;/strong&gt;
デフォルトでは上位サイト中心のスキャンになります。ロングテールまで調べる場合は&lt;code&gt;-a&lt;/code&gt;を使います。
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  maigret username &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;タグを無視する&lt;/strong&gt;
&lt;code&gt;--tags&lt;/code&gt;でカテゴリや国を絞り込めます。対象地域に応じてタグを指定しないと、重要なサイトを見落とす可能性があります。
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  maigret username &lt;span class="nt"&gt;--tags&lt;/span&gt; jp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;更新をスキップする&lt;/strong&gt;
古いシグネチャは誤判定の原因になります。本格的な調査前には更新します。
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  maigret &lt;span class="nt"&gt;--update&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Torブロックをユーザー情報として解釈する&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
一部サイトはTor出口ノードをブロックします。これは対象ユーザーの存在有無とは関係ありません。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;抽出フィールドを証拠として扱う&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Maigretはページに公開されている情報を抽出します。ページ自体が偽装されている可能性もあります。結果は証拠ではなく、調査の手がかりとして扱うべきです。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  実際のユースケース
&lt;/h2&gt;

&lt;p&gt;あるセキュリティコンサルティング会社では、レッドチーム活動のスコープ確認時にMaigretを使い、クライアントの公開攻撃対象領域を把握しています。出力はキックオフレポートに含められ、調査開始前の共通認識を作るために使われます。&lt;/p&gt;

&lt;p&gt;フリーランスの詐欺調査官は、&lt;code&gt;--ai&lt;/code&gt;フラグを使って3,000サイトのスキャン結果を短い概要にまとめ、非技術系クライアント向けのレポートにしています。検索と判定は決定論的に行い、LLMは読みやすさを補助します。&lt;/p&gt;

&lt;p&gt;あるエンジニアリングチームは、Maigretと同じ設計思想を内部APIテストに応用しています。シグネチャデータベース、定期リプレイ、ドリフト検出を使い、200以上のマイクロサービスの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;を使っていますが、考え方はMaigretと同じです。&lt;/p&gt;

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

&lt;p&gt;Maigretは、変化し続ける外部サイトに対して、壊れにくい検出ルールをどう管理するかを示す良い実例です。OSINTを実施しないエンジニアにとっても、その設計は学ぶ価値があります。&lt;/p&gt;

&lt;p&gt;特に重要なのは次の5点です。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maigretは、バージョン管理されたシグネチャデータベースで3,000以上のサイトを扱う&lt;/li&gt;
&lt;li&gt;単純なステータスコードではなく、複数シグナルで判定する&lt;/li&gt;
&lt;li&gt;長期運用ではドリフト検出が不可欠&lt;/li&gt;
&lt;li&gt;LLMは判定ではなく後処理に使う&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;でのAPIテストにも応用できる&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;次にやることはシンプルです。Maigretのサイトデータベース形式を読み、次に自分のAPIエンドポイントを同じ視点で整理してください。各エンドポイントに対して、ステータスコード、必須フィールド、不在であるべきフィールド、ヘッダー、既知の良好なレスポンスを定義します。&lt;/p&gt;

&lt;p&gt;ベンダーが深夜にフィールド名を変更したとき、ユーザーより先にテストスイートが検知できれば、その設計は成功です。&lt;/p&gt;

&lt;p&gt;&amp;lt;!--kg-card-begin: html--&amp;gt;&lt;/p&gt;
&lt;br&gt;
        &lt;br&gt;
        &lt;br&gt;
    &amp;lt;!--kg-card-end: html--&amp;gt;
&lt;h2&gt;
  
  
  よくある質問
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Maigretは合法的に使用できますか？&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;管轄区域と対象によります。自分自身、自分が所有するアカウント、書面で許可を得た企業、または承認された調査報道の一部として使う場合は、一般的に問題になりにくいです。一方で、同意のない個人に対して使うと、ストーキングやハラスメント関連の法律に抵触する可能性があります。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MaigretはPythonなしで動作しますか？&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;公式パッケージはPython 3.10+向けです。作者は、手軽な検索用の&lt;a href="https://t.me/maigret_search_bot" rel="noopener noreferrer"&gt;Telegramボット&lt;/a&gt;や、ローカルインストールを避けたいユーザー向けのCloud Shell設定も提供しています。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3,000サイトという主張はどの程度正確ですか？&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;リポジトリ内のサイトデータベースには3,000以上のエントリがあります。ただし、すべてが常に有効とは限りません。自動更新とコミュニティのメンテナンスにより、動作するサブセットが更新され続けています。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AIモードは何をしますか？&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;--ai&lt;/code&gt;フラグは、OpenAI互換のLLMを使って決定論的な検索結果を読みやすい要約に変換します。検索や判定そのものを変更するものではありません。APIキーはユーザーが用意します。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MaigretをCIで使えますか？&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OSINT調査そのものは対話的な作業であり、CI向きではありません。ただし、Maigretが使っている設計パターン、つまりシグネチャデータベース、ドリフト検出、定期リプレイは、APIテストのCIパイプラインに向いています。&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;/p&gt;

&lt;p&gt;&lt;strong&gt;Sherlockとは何が違いますか？&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sherlockはより古く、よりシンプルなユーザー名検索ツールです。Maigretは、情報抽出、再帰検索、CAPTCHA処理、AI要約モード、より豊富なサイトデータベースを追加しています。どちらもMITライセンスで、OSINTツール設計を学ぶ上で参考になります。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;古いシグネチャはどこに報告すればよいですか？&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;MaigretリポジトリのGitHub issueまたはプルリクエストで報告できます。コミュニティによる更新が、サイトデータベースの鮮度を保つ重要な仕組みです。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Claude Code 無効なcustom3pエンタープライズ構成エラーの修正方法</title>
      <dc:creator>Akira</dc:creator>
      <pubDate>Mon, 11 May 2026 03:28:51 +0000</pubDate>
      <link>https://forem.com/aakira/claude-code-wu-xiao-nacustom3pentapuraizugou-cheng-eranoxiu-zheng-fang-fa-20k8</link>
      <guid>https://forem.com/aakira/claude-code-wu-xiao-nacustom3pentapuraizugou-cheng-eranoxiu-zheng-fang-fa-20k8</guid>
      <description>&lt;p&gt;Claude CodeをDeepSeek V4、OpenRouter、またはその他のサードパーティモデルプロバイダーに接続すると、&lt;code&gt;Invalid custom3p enterprise config&lt;/code&gt;というエラーが出ることがあります。このエラーはドキュメント上で分かりにくく、Claude Codeが公式にサポートしているサードパーティプロバイダー設定でも発生します。&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;code&gt;custom3p&lt;/code&gt;の意味、設定が失敗する主な原因、そしてOpenRouter、LiteLLM、ローカルvLLMなどで動かすための修正手順を実装ベースで整理します。&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;Invalid custom3p enterprise config&lt;/code&gt;は、Claude Codeがサードパーティプロバイダー設定を検証できないときに出るエラーです。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;custom3p&lt;/code&gt;は、&lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;で指定されたAnthropic以外のAPIエンドポイントに対するClaude Code内部のラベルです。&lt;/p&gt;

&lt;p&gt;よくある原因は次のとおりです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;の末尾に余計な&lt;code&gt;/v1&lt;/code&gt;がある&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;と&lt;code&gt;ANTHROPIC_AUTH_TOKEN&lt;/code&gt;を取り違えている&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;~/.claude/settings.json&lt;/code&gt;が不正なJSONになっている&lt;/li&gt;
&lt;li&gt;新規インストールでオンボーディングが完了していない&lt;/li&gt;
&lt;li&gt;ゲートウェイが必要なヘッダーを転送していない&lt;/li&gt;
&lt;li&gt;Team / Enterpriseの管理ポリシーと競合している&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;まずはベースURLから確認してください。多くのケースでは、&lt;code&gt;/v1&lt;/code&gt;を削除するだけで解決します。&lt;/p&gt;

&lt;h2&gt;
  
  
  「custom3p」とは何か
&lt;/h2&gt;

&lt;p&gt;Claude Codeはリクエストを以下のいずれかのモードでルーティングします。&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;Anthropic API（デフォルト）&lt;/td&gt;
&lt;td&gt;オーバーライド設定なし&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon Bedrock&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CLAUDE_CODE_USE_BEDROCK=1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Vertex AI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CLAUDE_CODE_USE_VERTEX=1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft Foundry&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CLAUDE_CODE_USE_FOUNDRY=1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;カスタムサードパーティ&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;がAnthropic以外を指す場合&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;最後の「カスタムサードパーティ」が&lt;code&gt;custom3p&lt;/code&gt;です。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;がLiteLLM、OpenRouter、ローカルvLLM、企業内ゲートウェイなどを指している場合、Claude Codeはその設定を&lt;code&gt;custom3p&lt;/code&gt;として扱い、最初のAPI呼び出し前に検証します。&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;Invalid custom3p enterprise config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;これは設定検証エラーであり、ポリシーブロックではありません。設定を直せば解決できます。&lt;/p&gt;

&lt;h2&gt;
  
  
  なぜ今このエラーが増えているのか
&lt;/h2&gt;

&lt;p&gt;2026年4月、AnthropicはClaude CodeクライアントIDを偽装してClaude Pro / Maxのサブスクリプションアクセスを取得していたサードパーティagenticツールをブロックしました。OpenClawのようにClaude Codeセッションを独自バックエンド経由でルーティングしていたツールは影響を受けました。&lt;/p&gt;

&lt;p&gt;ただし、この記事で扱う問題はそれとは別です。&lt;/p&gt;

&lt;p&gt;その後、開発者はClaude Codeの公式サードパーティプロバイダーサポートを使い、OpenRouterやLiteLLMなどのバックエンドにルーティングし始めました。Redditでは、Claude CodeのエージェントループをOpenRouter経由でDeepSeek V4 Proに切り替える例も共有されています。出力100万トークンあたり$0.87とAnthropicの$15を比較すると、約17倍のコスト差があります。&lt;/p&gt;

&lt;p&gt;問題は、Claude Codeの公式サードパーティプロバイダーサポートには正しいエンタープライズ設定が必要なことです。1つでも項目を間違えると、&lt;code&gt;Invalid custom3p enterprise config&lt;/code&gt;が発生します。&lt;/p&gt;

&lt;h2&gt;
  
  
  根本原因1：&lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;の末尾に&lt;code&gt;/v1&lt;/code&gt;がある
&lt;/h2&gt;

&lt;p&gt;最も多い原因です。&lt;/p&gt;

&lt;p&gt;Claude Codeは、設定したベースURLに自動で&lt;code&gt;/v1/messages&lt;/code&gt;を追加します。そのため、ベースURLにすでに&lt;code&gt;/v1&lt;/code&gt;が含まれていると、最終的なパスが次のようになります。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/v1/v1/messages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;この場合、ゲートウェイは多くの場合&lt;code&gt;404&lt;/code&gt;を返します。&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;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://api.openrouter.ai/api/v1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://litellm.yourcompany.com/v1"&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 shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://api.openrouter.ai/api"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://litellm.yourcompany.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  実際の到達URLを確認する
&lt;/h3&gt;

&lt;p&gt;Claude Codeが呼び出すURLと同じ形式でテストします。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"%{http_code}"&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;$ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/v1/messages"&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":"claude-sonnet-4-6","max_tokens":1,"messages":[{"role":"user","content":"hi"}]}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;判定の目安は次のとおりです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;200&lt;/code&gt;：エンドポイントに到達できている&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;400&lt;/code&gt;：リクエスト内容は不正だが、エンドポイント自体は存在する&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;404&lt;/code&gt;：URL構造が間違っている可能性が高い&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;404&lt;/code&gt;なら、まず&lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;から&lt;code&gt;/v1&lt;/code&gt;を削除してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  根本原因2：認証情報の環境変数が違う
&lt;/h2&gt;

&lt;p&gt;Claude Codeは認証方式に応じて2種類の環境変数を使います。&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;x-api-key&lt;/code&gt;ヘッダー&lt;/td&gt;
&lt;td&gt;APIキー認証を想定するAnthropic互換ゲートウェイ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ANTHROPIC_AUTH_TOKEN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Authorization: Bearer&lt;/code&gt;ヘッダー&lt;/td&gt;
&lt;td&gt;OAuth形式のゲートウェイ、LiteLLM、多くのOpenRouter設定&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;OpenRouterはBearerトークンを想定します。&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;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sk-or-your-openrouter-key"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://openrouter.ai/api"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OpenRouterで&lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;を使うと、&lt;code&gt;x-api-key&lt;/code&gt;ヘッダーが送信されます。OpenRouter側がそのヘッダーを認証に使わない場合、認証に失敗し、Claude Codeは無効なエンタープライズ設定として扱います。&lt;/p&gt;

&lt;p&gt;LiteLLMの場合は次のようにします。&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;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sk-litellm-your-virtual-key"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://your-litellm-server:4000"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;DeepSeekゲートウェイやAPIキーで動かすローカルvLLMサーバーでは、次のように&lt;code&gt;ANTHROPIC_API_KEY&lt;/code&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="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_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;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://your-vllm-server"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;使用しているゲートウェイがどのヘッダーを期待しているかを必ず確認してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  根本原因3：&lt;code&gt;settings.json&lt;/code&gt;が不正なJSONになっている
&lt;/h2&gt;

&lt;p&gt;環境変数ではなく&lt;code&gt;~/.claude/settings.json&lt;/code&gt;で設定している場合、JSONの構文エラーでも検証に失敗します。&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;"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;"ANTHROPIC_BASE_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://openrouter.ai/api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_AUTH_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;"sk-or-your-key"&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;JSONでは最後の要素にカンマを付けられません。&lt;/p&gt;

&lt;h3&gt;
  
  
  よくあるミス：スマートクォート
&lt;/h3&gt;

&lt;p&gt;ドキュメントやWordからコピーした文字列に、通常の&lt;code&gt;"&lt;/code&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;"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="err"&gt;“ANTHROPIC_BASE_URL”:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;“https://openrouter.ai/api”&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;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;"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;"ANTHROPIC_BASE_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://openrouter.ai/api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_AUTH_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;"sk-or-your-openrouter-key"&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;h3&gt;
  
  
  起動前にJSONを検証する
&lt;/h3&gt;

&lt;p&gt;Pythonで確認します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"import json, os; json.load(open(os.path.expanduser('~/.claude/settings.json')))"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Valid JSON"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;jq&lt;/code&gt;でも確認できます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="nb"&gt;.&lt;/span&gt; ~/.claude/settings.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ここでパースエラーが出る場合、Claude Codeは設定を読み込めません。&lt;/p&gt;

&lt;h2&gt;
  
  
  根本原因4：新規インストールでオンボーディングが完了していない
&lt;/h2&gt;

&lt;p&gt;Claude Codeは、&lt;code&gt;settings.json&lt;/code&gt;からエンタープライズ設定を読み込む前に、&lt;code&gt;~/.claude.json&lt;/code&gt;の&lt;code&gt;hasCompletedOnboarding: true&lt;/code&gt;を確認します。&lt;/p&gt;

&lt;p&gt;新規インストールでこのフラグがない場合、Claude Codeはオンボーディングモードとして扱い、&lt;code&gt;settings.json&lt;/code&gt;の設定を読み込まないことがあります。&lt;/p&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="nb"&gt;cat&lt;/span&gt; ~/.claude.json | python3 &lt;span class="nt"&gt;-m&lt;/span&gt; json.tool 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep &lt;/span&gt;hasCompletedOnboarding
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;キーが存在しない、または&lt;code&gt;false&lt;/code&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;"hasCompletedOnboarding"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"primaryApiKey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sk-placeholder"&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;primaryApiKey&lt;/code&gt;はプレースホルダーです。実際の認証は&lt;code&gt;settings.json&lt;/code&gt;または環境変数で上書きされます。フォーマットチェックを通すため、&lt;code&gt;sk-&lt;/code&gt;で始まる任意の値を設定します。&lt;/p&gt;

&lt;p&gt;保存後、Claude Codeを再起動してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  根本原因5：ゲートウェイが必要なヘッダーを転送していない
&lt;/h2&gt;

&lt;p&gt;Claude Codeの検証では、機能ハンドシェイクのために複数のヘッダーを送信します。ゲートウェイやプロキシがそれらを削除すると、Claude Codeが期待するレスポンスと一致せず、&lt;code&gt;Invalid custom3p enterprise config&lt;/code&gt;になります。&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;anthropic-beta
anthropic-version
X-Claude-Code-Session-Id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;LiteLLMではv1.82.9以降、通常はデフォルトで動作します。&lt;/p&gt;

&lt;p&gt;nginxなどのカスタムプロキシを使っている場合は、明示的に転送してください。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/v1/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://backend&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;anthropic-beta&lt;/span&gt; &lt;span class="nv"&gt;$http_anthropic_beta&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;anthropic-version&lt;/span&gt; &lt;span class="nv"&gt;$http_anthropic_version&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Claude-Code-Session-Id&lt;/span&gt; &lt;span class="nv"&gt;$http_x_claude_code_session_id&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;ゲートウェイ側でベータヘッダーを転送できない場合は、Claude Code起動前に次を設定します。&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;CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;これにより、Claude Codeはベータヘッダーを必要とする機能をスキップします。一部の実験的機能は使えなくなりますが、コアのエージェントループは動作します。&lt;/p&gt;

&lt;h2&gt;
  
  
  根本原因6：エンタープライズポリシーと競合している
&lt;/h2&gt;

&lt;p&gt;TeamまたはEnterpriseプランで管理者が管理設定を配布している場合、その設定はローカルの&lt;code&gt;~/.claude/settings.json&lt;/code&gt;や環境変数より優先されます。&lt;/p&gt;

&lt;p&gt;たとえば、次のような管理ポリシーがあると、ローカル設定が正しくてもエラーになります。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;使用可能モデルが制限されている&lt;/li&gt;
&lt;li&gt;カスタムベースURLがブロックされている&lt;/li&gt;
&lt;li&gt;特定のゲートウェイドメインが許可されていない&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 shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; ~/.claude/managed-settings.json 2&amp;gt;/dev/null &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"管理設定が見つかりました"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code内でも確認できます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;「管理設定」が有効な場合、管理者に次のいずれかを依頼します。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ゲートウェイドメインを許可されたベースURLに追加する&lt;/li&gt;
&lt;li&gt;ゲートウェイのモデルIDを含む&lt;code&gt;availableModels&lt;/code&gt;を設定する&lt;/li&gt;
&lt;li&gt;カスタムベースURL制限から対象ユーザーを除外する&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;自分で管理するエンタープライズデプロイメントでは、管理設定はmacOSなら次のようなパスに配置されます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/Library/Application Support/ClaudeCode/managed-settings.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Windows / Linuxでは同等の管理設定パスを確認してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  完全な動作構成例
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Claude Code + OpenRouter（DeepSeek V4 Pro）
&lt;/h2&gt;

&lt;p&gt;OpenRouterはAnthropic互換APIを公開しています。DeepSeek V4 ProでClaude Codeのエージェントループを動かす場合は、&lt;code&gt;~/.claude/settings.json&lt;/code&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;"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;"ANTHROPIC_BASE_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://openrouter.ai/api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_AUTH_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;"sk-or-your-openrouter-key"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_DEFAULT_SONNET_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;"deepseek/deepseek-v4-pro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_DEFAULT_OPUS_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;"deepseek/deepseek-v4-pro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_DEFAULT_HAIKU_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;"deepseek/deepseek-v4-pro"&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;ベースURLを変更しても、Claude Codeはデフォルトでは&lt;code&gt;claude-sonnet-4-6&lt;/code&gt;を要求します。そのため、OpenRouterでDeepSeekに固定したい場合はモデル名のオーバーライドが必要です。&lt;/p&gt;

&lt;p&gt;OpenRouterはツール呼び出しに関するAnthropicのストリーミング仕様を完全には実装していません。一部のケースでは、関数呼び出しの引数が空で届く可能性があります。主要なエージェントループは動作しますが、複雑なマルチツールチェーンでは注意してください。&lt;/p&gt;

&lt;p&gt;互換性の更新は、&lt;a href="https://openrouter.ai/docs/guides/coding-agents/claude-code-integration" rel="noopener noreferrer"&gt;OpenRouterのClaude Code統合ドキュメント&lt;/a&gt;を確認してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  Claude Code + LiteLLM（任意のプロバイダー）
&lt;/h2&gt;

&lt;p&gt;LiteLLMはClaude Code向けの互換性が高いゲートウェイです。ヘッダー転送を処理し、OpenAI、Anthropic、Vertex、Bedrock、Hugging Faceモデルへのルーティングをサポートします。&lt;/p&gt;

&lt;p&gt;LiteLLMの&lt;code&gt;config.yaml&lt;/code&gt;例です。&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="na"&gt;model_list&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;model_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;claude-sonnet-4-6&lt;/span&gt;
    &lt;span class="na"&gt;litellm_params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deepseek/deepseek-v4&lt;/span&gt;
      &lt;span class="na"&gt;api_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk-your-deepseek-key"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;model_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;claude-opus-4-7&lt;/span&gt;
    &lt;span class="na"&gt;litellm_params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deepseek/deepseek-v4-pro&lt;/span&gt;
      &lt;span class="na"&gt;api_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk-your-deepseek-key"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code側の&lt;code&gt;~/.claude/settings.json&lt;/code&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;"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;"ANTHROPIC_BASE_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;"http://localhost:4000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_AUTH_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;"sk-litellm-your-key"&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;この構成では、Claude Codeは&lt;code&gt;claude-sonnet-4-6&lt;/code&gt;を送信します。LiteLLMがそのモデル名を受け取り、DeepSeek V4へルーティングします。そのため、Claude Code側でモデル名をオーバーライドする必要はありません。&lt;/p&gt;

&lt;h2&gt;
  
  
  Claude Code + ローカルvLLM
&lt;/h2&gt;

&lt;p&gt;ローカル推論では、&lt;a href="https://docs.vllm.ai/en/stable/serving/integrations/claude_code/" rel="noopener noreferrer"&gt;vLLM&lt;/a&gt;をAnthropic互換モードで起動します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; vllm.entrypoints.openai.api_server &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--model&lt;/span&gt; deepseek-ai/DeepSeek-V3 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--dtype&lt;/span&gt; auto &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--api-key&lt;/span&gt; local-key &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code側を設定します。&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;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:8000"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"local-key"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_DEFAULT_SONNET_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"deepseek-ai/DeepSeek-V3"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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 shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;--debug&lt;/span&gt; 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-100&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;確認するポイントは次のとおりです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Sending request to:&lt;/code&gt;：実際に呼び出しているURL&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Response status:&lt;/code&gt;：ゲートウェイからのHTTPステータス&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;enterprise config error:&lt;/code&gt;：内部検証メッセージ&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ゲートウェイ側を確認する場合は、Claude Codeに近いリクエストを&lt;code&gt;curl&lt;/code&gt;で送ります。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/v1/messages"&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="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="k"&gt;}&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;"anthropic-version: 2023-06-01"&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;"anthropic-beta: max-tokens-3-5-sonnet-2024-07-15"&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": "claude-sonnet-4-6",
    "max_tokens": 10,
    "messages": [{"role": "user", "content": "hi"}]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;有効なゲートウェイなら、メッセージ構造を含む&lt;code&gt;200&lt;/code&gt;が返ります。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;401&lt;/code&gt;、&lt;code&gt;403&lt;/code&gt;、&lt;code&gt;422&lt;/code&gt;が返る場合は、Claude Codeではなくゲートウェイ側の認証またはリクエスト形式の問題です。&lt;/p&gt;

&lt;h2&gt;
  
  
  ApidogでAPIをテストする
&lt;/h2&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&lt;/a&gt;を使うと、LLMゲートウェイを通過するリクエストとレスポンスを確認しやすくなります。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/v1/messages&lt;/code&gt;エンドポイント用のコレクションを作成し、動作するリクエストテンプレートを保存しておくと、Claude Codeを毎回起動し直さずにプロバイダー間の挙動を比較できます。&lt;/p&gt;

&lt;p&gt;Apidogで次のように設定します。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ゲートウェイURLを指す新しいコレクションを作成する&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;anthropic-version&lt;/code&gt;をコレクションレベル変数にする&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;anthropic-beta&lt;/code&gt;をコレクションレベル変数にする&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Authorization&lt;/code&gt;をコレクションレベル変数にする&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/v1/messages&lt;/code&gt;へのPOSTリクエストを保存する&lt;/li&gt;
&lt;li&gt;ゲートウェイを切り替えるときは変数だけ変更する&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%2Fvfnjdxfx0c0r0pkrxfew.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%2Fvfnjdxfx0c0r0pkrxfew.png" alt="ApidogでLLMゲートウェイをテストする画面" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;これは、&lt;code&gt;Invalid custom3p enterprise config&lt;/code&gt;を引き起こすヘッダー転送問題の切り分けに役立ちます。Claude Code側の設定を疑う前に、ゲートウェイがどのヘッダーを受け取り、どのヘッダーをバックエンドへ転送しているかを確認できます。&lt;/p&gt;

&lt;h2&gt;
  
  
  知っておくべきClaude Code関連設定
&lt;/h2&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 shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;これにより、エンタープライズ設定の検証からベータ機能ハンドシェイクが外れます。エージェントループは引き続き動作しますが、ベータヘッダーに依存する機能は使えなくなります。&lt;/p&gt;

&lt;h2&gt;
  
  
  ゲートウェイ検出機能付きモデルピッカー
&lt;/h2&gt;

&lt;p&gt;Claude Code v2.1.129以降では、ゲートウェイのモデルリストから&lt;code&gt;/model&lt;/code&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="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Codeは起動時にゲートウェイの&lt;code&gt;/v1/models&lt;/code&gt;エンドポイントをクエリし、検出したモデルをピッカーに追加します。&lt;/p&gt;

&lt;p&gt;ただし、追加されるのは&lt;code&gt;claude&lt;/code&gt;または&lt;code&gt;anthropic&lt;/code&gt;で始まるIDを持つモデルのみです。DeepSeekのようなモデルを使う場合は、&lt;code&gt;ANTHROPIC_DEFAULT_SONNET_MODEL&lt;/code&gt;で手動固定してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  カスタムモデルピッカーエントリ
&lt;/h2&gt;

&lt;p&gt;単一のカスタムモデルを&lt;code&gt;/model&lt;/code&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="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_CUSTOM_MODEL_OPTION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"deepseek/deepseek-v4-pro"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_CUSTOM_MODEL_OPTION_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"DeepSeek V4 Pro"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_CUSTOM_MODEL_OPTION_DESCRIPTION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Claude Opusより17倍安価"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;これは&lt;code&gt;/model&lt;/code&gt;ピッカーの下部に表示されます。セッション中にゲートウェイモデルとデフォルトのClaudeモデルを切り替えやすくなります。&lt;/p&gt;

&lt;h2&gt;
  
  
  関連ガイド
&lt;/h2&gt;

&lt;p&gt;カスタムモデルバックエンドでClaude Codeを使う場合は、次のガイドも参考になります。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://apidog.com/blog/how-to-write-agents-md-files?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API開発チーム向けのAGENTS.mdファイルの書き方&lt;/a&gt; — 特定のスタックに合わせてClaude Codeの動作を設定する&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://apidog.com/blog/ruflo-multi-agent-claude-code?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Ruflo: Claude Codeのためのマルチエージェントオーケストレーション&lt;/a&gt; — スウォーム、永続メモリ、100以上のMCPツールをClaude Codeに追加する&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://apidog.com/blog/get-free-unlimited-claude-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Puter.js経由で無料かつ無制限のClaude APIを入手&lt;/a&gt; — クライアントアプリを構築している場合のブラウザベースの代替手段&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://apidog.com/blog/best-local-llms-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;2026年版最高のローカルLLM&lt;/a&gt; — vLLMを通じてローカルで推論を実行したい場合&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h2&gt;
  
  
  Claude Codeでサードパーティプロバイダーを使うことはAnthropicの規約違反ですか？
&lt;/h2&gt;

&lt;p&gt;いいえ。&lt;/p&gt;

&lt;p&gt;Anthropicは、Bedrock、Vertex AI、Foundry、およびカスタムゲートウェイ経由のルーティングに関する&lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;パターンを文書化し、公式にサポートしています。&lt;/p&gt;

&lt;p&gt;2026年4月にブロックされたのは、Claude CodeクライアントIDを偽装してAnthropic自身のAPIにサブスクリプション料金でアクセスしようとしたサードパーティツールです。&lt;/p&gt;

&lt;p&gt;自分のAPIキーでOpenRouterや独自ゲートウェイを使う構成とは別の問題です。&lt;/p&gt;

&lt;h2&gt;
  
  
  Claude CodeのエージェントループはDeepSeek V4 Proで動作しますか？
&lt;/h2&gt;

&lt;p&gt;コアのループは動作します。&lt;/p&gt;

&lt;p&gt;たとえば次の操作です。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ファイル編集&lt;/li&gt;
&lt;li&gt;シェルコマンド実行&lt;/li&gt;
&lt;li&gt;複数ステップのタスク実行&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;一方、サードパーティプロバイダー経由では次の機能が動作しない場合があります。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MCPサーバーツール&lt;/li&gt;
&lt;li&gt;画像 / ビジョン入力&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;これらが必要な場合は、Anthropic APIまたはBedrock / Vertexを使う必要があります。&lt;/p&gt;

&lt;h2&gt;
  
  
  エンタープライズプランではないのに、なぜ「エンタープライズ設定」と表示されるのですか？
&lt;/h2&gt;

&lt;p&gt;Claude Codeは、サブスクリプションの種類に関係なく、サードパーティプロバイダー設定を「エンタープライズ設定」と呼びます。&lt;/p&gt;

&lt;p&gt;これはコード上のラベルであり、プラン制限ではありません。無料またはProの個人開発者でも、カスタムサードパーティプロバイダーを設定できます。&lt;/p&gt;

&lt;h2&gt;
  
  
  セッション中にAnthropicとサードパーティプロバイダーを切り替えられますか？
&lt;/h2&gt;

&lt;p&gt;同じセッション内ではできません。&lt;/p&gt;

&lt;p&gt;ベースURLは起動時に読み込まれます。切り替えるには、Claude Codeを終了し、環境変数または設定ファイルを変更してから新しいセッションを開始してください。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/aattaran/deepclaude" rel="noopener noreferrer"&gt;DeepClaude&lt;/a&gt;は、&lt;code&gt;--backend ds&lt;/code&gt;や&lt;code&gt;--backend anthropic&lt;/code&gt;のようなCLIフラグでこの切り替えをラップしています。&lt;/p&gt;

&lt;h2&gt;
  
  
  ゲートウェイが企業ファイアウォールの背後にあります。プロキシ設定は使えますか？
&lt;/h2&gt;

&lt;p&gt;はい。起動前に&lt;code&gt;HTTPS_PROXY&lt;/code&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="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;HTTPS_PROXY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://your-proxy:8080"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://your-internal-gateway"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;企業プロキシによるTLSインターセプトがある場合は、CA証明書も指定します。&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;NODE_EXTRA_CA_CERTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/path/to/corporate-ca-bundle.pem"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  curlテストは通るのにClaude Codeではエラーになります。何が違いますか？
&lt;/h2&gt;

&lt;p&gt;Claude Codeは、単純な&lt;code&gt;curl&lt;/code&gt;では再現されないプリフライト検証リクエストを行います。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;--debug&lt;/code&gt;付きでClaude Codeを起動し、実際のプリフライトリクエストを確認してください。&lt;/p&gt;

&lt;p&gt;よくある差分は次のとおりです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;anthropic-beta&lt;/code&gt;ヘッダー&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;X-Claude-Code-Session-Id&lt;/code&gt;ヘッダー&lt;/li&gt;
&lt;li&gt;検証リクエストのJSONボディ形式&lt;/li&gt;
&lt;li&gt;モデル名の違い&lt;/li&gt;
&lt;li&gt;認証ヘッダー形式の違い&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;code&gt;Invalid custom3p enterprise config&lt;/code&gt;は、設定検証エラーです。ポリシーブロックではありません。&lt;/p&gt;

&lt;p&gt;確認順は次のとおりです。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;から余計な&lt;code&gt;/v1&lt;/code&gt;を削除する&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ANTHROPIC_AUTH_TOKEN&lt;/code&gt;と&lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;の使い分けを確認する&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;~/.claude/settings.json&lt;/code&gt;をJSONとして検証する&lt;/li&gt;
&lt;li&gt;新規インストールでは&lt;code&gt;hasCompletedOnboarding&lt;/code&gt;を確認する&lt;/li&gt;
&lt;li&gt;ゲートウェイが必要なヘッダーを転送しているか確認する&lt;/li&gt;
&lt;li&gt;管理ポリシーと競合していないか確認する&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;設定が正しく検証されると、Claude Codeのエージェントループは選択したバックエンド経由で実行できます。OpenRouterまたはLiteLLM経由のDeepSeek V4 Proは、多くのClaude Codeユースケースを低コストでカバーできます。&lt;/p&gt;

&lt;p&gt;主な制限はMCPツールとビジョン入力です。これらが必要な場合は、Anthropic API、Bedrock、またはVertexを使用してください。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Gemini API 無制限無料利用</title>
      <dc:creator>Akira</dc:creator>
      <pubDate>Sat, 09 May 2026 06:59:55 +0000</pubDate>
      <link>https://forem.com/aakira/gemini-api-wu-zhi-xian-wu-liao-li-yong-23n2</link>
      <guid>https://forem.com/aakira/gemini-api-wu-zhi-xian-wu-liao-li-yong-23n2</guid>
      <description>&lt;p&gt;GoogleのGeminiファミリーは、大量ワークロード向けの費用対効果が高いフロンティアモデルラインです。ただし、無料の公開アプリ、サイドプロジェクト、ハッカソン用途でも、エンドポイントを数千人が使い始めるとAPI料金はすぐに増えます。Puter.jsを使うと、Google APIキーなしでGemini 2.5 Pro、Gemini 2.5 Flash、Gemini 2.0 Flash、Gemini 3 Flash Preview、Gemma 2/3/4ファミリーをブラウザから呼び出せます。課金は開発者ではなくエンドユーザーのPuterアカウント側で処理されるため、開発者側は無料で使えます。&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;ul&gt;
&lt;li&gt;
&lt;strong&gt;Puter.js&lt;/strong&gt;を使うと、Google APIキー、Google Cloudプロジェクト、バックエンドサーバーなしでGemini/Gemmaモデルを呼び出せます。&lt;/li&gt;
&lt;li&gt;サポートされるGeminiには、&lt;strong&gt;2.5 Pro、2.5 Flash、2.5 Flash Lite、2.0 Flash、2.0 Flash Lite、3 Flash Preview&lt;/strong&gt;などがあります。&lt;/li&gt;
&lt;li&gt;サポートされるGemmaには、複数サイズの&lt;strong&gt;Gemma 2、3、4&lt;/strong&gt;があります。&lt;/li&gt;
&lt;li&gt;実装は&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;タグ1つと&lt;code&gt;puter.ai.chat()&lt;/code&gt;だけです。&lt;/li&gt;
&lt;li&gt;ストリーミング、画像入力、温度調整、マルチターン会話をブラウザで扱えます。&lt;/li&gt;
&lt;li&gt;エンドユーザーがPuterアカウント経由で使用料を負担するため、開発者側のAPIキー管理や請求リスクを避けられます。&lt;/li&gt;
&lt;li&gt;公式Gemini APIとPuterの比較・移行検証には、&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;

&lt;h2&gt;
  
  
  「無料無制限」の仕組み
&lt;/h2&gt;

&lt;p&gt;Puter.jsはLLMの課金モデルを反転させます。&lt;/p&gt;

&lt;p&gt;通常は開発者がGoogle AI Studioキーを持ち、すべてのトークンコストを負担します。一方、PuterではエンドユーザーがPuterにサインインし、そのユーザーの残高から利用分が処理されます。新規Puterアカウントにはスタータークレジットが付与され、必要に応じてユーザーがチャージできます。&lt;/p&gt;

&lt;p&gt;開発者側の実装上のメリットは次の通りです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Google Cloudプロジェクトが不要&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google AI Studioキーが不要&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;開発者側の利用上限管理が不要&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ユーザー数に応じて利用枠が分散される&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Googleへの直接課金を持たずにGeminiを組み込める&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ただし、Puterはブラウザファーストです。ログイン済みユーザーセッションを前提にするため、cron、バッチ、Webhookなどのバックエンド処理には向きません。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ1: Puter.jsをインストールする
&lt;/h2&gt;

&lt;p&gt;静的HTMLならCDNを1行追加します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;これでブラウザから&lt;code&gt;puter&lt;/code&gt;オブジェクトを使えます。&lt;/p&gt;

&lt;p&gt;バンドルされたアプリで使う場合はnpmからインストールします。&lt;br&gt;
&lt;/p&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; @heyputer/puter.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@heyputer/puter.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ステップ2: モデルを選ぶ
&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;モデルID&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;google/gemini-2.5-pro&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;深い推論、複雑な分析、長文コンテキストタスク&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemini-2.5-flash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;日常的なデフォルト。速度、品質、コストのバランスが良い&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemini-2.5-flash-lite&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;大量分類、タグ付け、軽量Q&amp;amp;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemini-2.0-flash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;安定したベースラインとして使いたい場合&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemini-3-flash-preview&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;最新プレビューを試したい場合&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemma-3-27b-it&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;オープンGemmaの命令チューニング済みモデルを使いたい場合&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemma-4-31b-it&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;より大きなGemmaモデルを試したい場合&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;多くのアプリでは、まず&lt;code&gt;google/gemini-2.5-flash&lt;/code&gt;をデフォルトにします。&lt;/p&gt;

&lt;p&gt;推奨の切り替え方は次の通りです。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MODEL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;reasoning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-pro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;cheap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash-lite&lt;/span&gt;&lt;span class="dl"&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;ul&gt;
&lt;li&gt;通常のチャット: &lt;code&gt;google/gemini-2.5-flash&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;難しい推論: &lt;code&gt;google/gemini-2.5-pro&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;大量の分類・タグ付け: &lt;code&gt;google/gemini-2.5-flash-lite&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ステップ3: Geminiと会話する
&lt;/h2&gt;

&lt;p&gt;最小構成は次の通りです。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Explain machine learning in three sentences&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&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;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;puter&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="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;このHTMLをブラウザで開くと、PuterがGemini呼び出しを処理します。ユーザーがPuterにサインインしていない場合は、初回実行時にサインインまたはアカウント作成の流れになります。&lt;/p&gt;

&lt;p&gt;APIキー、環境変数、バックエンドサーバーは不要です。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ4: UIに組み込む
&lt;/h2&gt;

&lt;p&gt;実際のアプリでは、入力欄と出力領域を用意して呼び出します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"prompt"&lt;/span&gt; &lt;span class="na"&gt;rows=&lt;/span&gt;&lt;span class="s"&gt;"5"&lt;/span&gt; &lt;span class="na"&gt;cols=&lt;/span&gt;&lt;span class="s"&gt;"60"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
日本語で、REST APIとGraphQLの違いを説明してください。
  &lt;span class="nt"&gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"send"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;送信&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;pre&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"output"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/pre&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;promptEl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;prompt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;outputEl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;output&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sendBtn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;send&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;sendBtn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;outputEl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;生成中...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;promptEl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;

        &lt;span class="nx"&gt;outputEl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;outputEl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`Error: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;最初はこの形で動作確認し、その後にReact、Vue、Svelteなどへ移植すると実装しやすくなります。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ5: 応答をストリーミングする
&lt;/h2&gt;

&lt;p&gt;チャットUIや長文回答では、ストリーミングを有効にします。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Explain photosynthesis in detail&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&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="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;outputDiv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&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;&lt;code&gt;part.text&lt;/code&gt;には応答の断片が入ります。UIに順次追加すれば、ユーザーは回答がリアルタイムに生成される様子を見られます。&lt;/p&gt;

&lt;p&gt;HTMLに組み込むと次のようになります。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"output"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;streamAnswer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;outputDiv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;output&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;outputDiv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Geminiをブラウザアプリに組み込む手順を説明してください。&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&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="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;outputDiv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&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="nf"&gt;streamAnswer&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ステップ6: 画像入力を使う
&lt;/h2&gt;

&lt;p&gt;Geminiの強みの1つはマルチモーダル入力です。画像URLを渡すと、画像の内容を説明させたり、画像に関する質問をしたりできます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;What do you see in this image? Describe colors, objects, and mood.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://assets.puter.site/doge.jpeg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&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;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;puter&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="nx"&gt;response&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;ul&gt;
&lt;li&gt;代替テキスト生成&lt;/li&gt;
&lt;li&gt;ビジュアルQA&lt;/li&gt;
&lt;li&gt;スクリーンショット分析&lt;/li&gt;
&lt;li&gt;OCR補助&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;自然画像や図の理解ではGeminiは強力です。ただし、テキストが非常に密集したスクリーンショットでは、GPT-5.xの方が有利な場合があります。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ7: 温度を調整する
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;temperature&lt;/code&gt;を指定すると、出力のランダム性を調整できます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Write a creative short story about a robot chef&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.2&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;目安は次の通りです。&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;temperature&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;code&gt;0.0&lt;/code&gt;〜&lt;code&gt;0.3&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSONや分類など構造化出力&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0.0&lt;/code&gt;〜&lt;code&gt;0.2&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;通常のチャット&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0.5&lt;/code&gt;〜&lt;code&gt;0.7&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;クリエイティブライティング&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0.7&lt;/code&gt;〜&lt;code&gt;1.0&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Gemini Flashでは、一般的なチャット用途なら&lt;code&gt;0.7&lt;/code&gt;前後から試すとよいです。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ8: マルチターン会話を実装する
&lt;/h2&gt;

&lt;p&gt;会話履歴はメッセージ配列として渡します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&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="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;I am building a Next.js app with Postgres.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Got it. What do you need help with?&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;How should I structure migrations?&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-pro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&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;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sendMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userInput&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userInput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&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;Geminiは渡された履歴全体を読み取り、会話の文脈を維持します。&lt;/p&gt;

&lt;h2&gt;
  
  
  同じプロンプトでGeminiを他のモデルと比較する
&lt;/h2&gt;

&lt;p&gt;Puterは主要なLLMを単一のインターフェースで扱えます。ユースケースに合うモデルを見つけるには、同じプロンプトを複数モデルに投げて比較します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;models&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;x-ai/grok-4.3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Refactor this React component to use hooks: ...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;models&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;elapsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;elapsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&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="s2"&gt;ms`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;---&lt;/span&gt;&lt;span class="dl"&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;比較時は、少なくとも次の項目を記録します。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;レイテンシー&lt;/li&gt;
&lt;li&gt;回答品質&lt;/li&gt;
&lt;li&gt;コードの正確性&lt;/li&gt;
&lt;li&gt;指示追従性&lt;/li&gt;
&lt;li&gt;日本語品質&lt;/li&gt;
&lt;li&gt;長文での安定性&lt;/li&gt;
&lt;li&gt;ユーザーにとって許容できる応答時間&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;傾向として、Gemini Flashはレイテンシー面で使いやすく、Sonnetはコーディング品質、GPT-5.5は長文生成、Grok 4.3はコスト面で比較対象になります。最終的には、実際のプロンプトでベンチマークしてください。&lt;/p&gt;

&lt;h2&gt;
  
  
  得られるものと得られないもの
&lt;/h2&gt;

&lt;p&gt;Puter経由で得られるもの:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gemini 2.5/2.0/3 Flash系モデル&lt;/li&gt;
&lt;li&gt;Gemini 2.5 Pro&lt;/li&gt;
&lt;li&gt;Open Gemmaファミリー&lt;/li&gt;
&lt;li&gt;マルチターン会話&lt;/li&gt;
&lt;li&gt;ストリーミング応答&lt;/li&gt;
&lt;li&gt;画像URL入力&lt;/li&gt;
&lt;li&gt;温度、最大トークン数、システムプロンプト&lt;/li&gt;
&lt;li&gt;ブラウザベースの本番アプリで使える実行パス&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Puterのバージョンや公開状況によっては得られない可能性があるもの:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Geminiでのネイティブ関数呼び出し&lt;/li&gt;
&lt;li&gt;コード実行ツール&lt;/li&gt;
&lt;li&gt;Google検索による根拠付け&lt;/li&gt;
&lt;li&gt;Geminiの最大200万トークンの長文コンテキスト&lt;/li&gt;
&lt;li&gt;ブラウザセッションなしのサーバーサイド実行&lt;/li&gt;
&lt;li&gt;Google側レート制限の直接的な可視化&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;コード実行、検索グラウンディング、長大コンテキストが必要なエージェント型ワークフローでは、公式Google AI Studio APIの方が適しています。&lt;/p&gt;

&lt;p&gt;一般的なチャット、Q&amp;amp;A、コンテンツ生成、画像理解、プロトタイプでは、Puterで十分に始められます。&lt;/p&gt;

&lt;h2&gt;
  
  
  Puterと公式Gemini APIの使い分け
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Puterを使うべきケース
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;無料の公開アプリを出したい&lt;/li&gt;
&lt;li&gt;APIキー漏洩や高額請求のリスクを避けたい&lt;/li&gt;
&lt;li&gt;Google Cloudプロジェクトを作りたくない&lt;/li&gt;
&lt;li&gt;静的サイトでGeminiを使いたい&lt;/li&gt;
&lt;li&gt;ハッカソンやプロトタイプを高速に作りたい&lt;/li&gt;
&lt;li&gt;ブラウザ拡張機能にLLMを組み込みたい&lt;/li&gt;
&lt;li&gt;ユーザーがPuterへのサインインを許容できる&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  公式Gemini APIを使うべきケース
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;cron、バッチ、Webhookなどサーバーサイド呼び出しが必要&lt;/li&gt;
&lt;li&gt;コード実行が必要&lt;/li&gt;
&lt;li&gt;Google検索による根拠付けが必要&lt;/li&gt;
&lt;li&gt;最大200万トークンのフルコンテキストが必要&lt;/li&gt;
&lt;li&gt;Googleとの直接契約やコンプライアンス要件がある&lt;/li&gt;
&lt;li&gt;独自データセットでファインチューニングしたい&lt;/li&gt;
&lt;li&gt;ユーザーにPuterサインインを要求できない&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gemini 3 Flashの単独ウォークスルーは、&lt;a href="http://apidog.com/blog/how-to-use-gemini-3-flash-preview-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Gemini 3 Flash Preview APIの利用方法&lt;/a&gt;を参照してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  Apidogで統合テストを整理する
&lt;/h2&gt;

&lt;p&gt;Puterの呼び出しはブラウザ内で実行されるため、通常のバックエンド用APIテストランナーからそのままスクリプト化するのは難しいです。&lt;/p&gt;

&lt;p&gt;実装時は次の流れにすると整理しやすくなります。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Puterスクリプトを含む小さな静的ページを作る&lt;/li&gt;
&lt;li&gt;プロンプトやモデル名をクエリパラメータで渡せるようにする&lt;/li&gt;
&lt;li&gt;公式APIへ移行する可能性がある場合は、ApidogでGoogle Gemini APIのリクエストを別環境として管理する&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;puter-prototype&lt;/code&gt;と&lt;code&gt;gemini-prod&lt;/code&gt;を分けて、同じ仕様を比較できるようにする&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;例:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;puter-prototype&lt;/code&gt;: Puterページをホストするlocalhost URL&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gemini-prod&lt;/code&gt;: &lt;code&gt;https://generativelanguage.googleapis.com/v1&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidogをダウンロード&lt;/a&gt;し、Puterプロトタイプと公式Gemini APIを別環境として管理しておくと、移行時に比較しやすくなります。&lt;/p&gt;

&lt;p&gt;より広範なAPIテストパターンは、&lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;QAエンジニア向けAPIテストツール&lt;/a&gt;も参考になります。&lt;/p&gt;

&lt;h2&gt;
  
  
  Puter経由で使える他のLLMパス
&lt;/h2&gt;

&lt;p&gt;同じユーザー課金モデルは、他の主要LLMにも適用されます。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://apidog.com/blog/get-free-unlimited-claude-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;無料無制限のClaude APIを入手&lt;/a&gt;（Anthropic Opus、Sonnet、Haiku）&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://apidog.com/blog/get-free-unlimited-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;無料無制限のGPT-5.5 APIを入手&lt;/a&gt;（OpenAIの全カタログ）&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://apidog.com/blog/how-to-use-grok-4-3-api-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Grok 4.3を無料で使う方法&lt;/a&gt;（xAI）&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/get-free-unlimited-deepseek-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;無料無制限のDeepSeek APIを入手&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Puterでは、&lt;code&gt;model&lt;/code&gt;文字列を切り替えるだけでプロバイダーも切り替えられます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Summarize this text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Summarize this text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&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;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  これは本当に無制限ですか？
&lt;/h3&gt;

&lt;p&gt;開発者側から見ると無制限です。エンドユーザーはPuterアカウントの残高に応じて利用します。新規アカウントにはスタータークレジットが付与され、必要に応じてユーザーがチャージできます。&lt;/p&gt;

&lt;h3&gt;
  
  
  GoogleアカウントやGoogle Cloudプロジェクトは必要ですか？
&lt;/h3&gt;

&lt;p&gt;不要です。PuterがGoogleとの接続を処理します。開発者がGoogle APIキーを扱う必要はありません。&lt;/p&gt;

&lt;h3&gt;
  
  
  本番環境で使えますか？
&lt;/h3&gt;

&lt;p&gt;ブラウザベースのアプリであれば使えます。重要なのは、ユーザーがPuterへのサインインを許容できるかどうかです。&lt;/p&gt;

&lt;h3&gt;
  
  
  Puter経由のGeminiは公式APIと同じですか？
&lt;/h3&gt;

&lt;p&gt;Puterはユーザーの代わりにGoogleのAPIを呼び出します。モデルの基本的な動作は変わりません。ただし、Puterを経由する分、レイテンシーがわずかに増える可能性があります。&lt;/p&gt;

&lt;h3&gt;
  
  
  Geminiの200万トークンコンテキストは使えますか？
&lt;/h3&gt;

&lt;p&gt;Puterは現在、すべてのモデルバリアントで200万トークン上限を完全に公開しているわけではありません。非常に長いコンテキストが必要な場合は、公式Google AI Studio APIを選ぶべきです。多くのユースケースは20万トークンを大きく下回るため、その範囲ではPuterで対応できます。&lt;/p&gt;

&lt;h3&gt;
  
  
  Discordボットやバックエンドサービスで使えますか？
&lt;/h3&gt;

&lt;p&gt;Puterはブラウザファーストで、ユーザーセッションを前提とします。Discordボット、cron、バックエンドサービスでは、公式Gemini APIを直接使う方が適しています。&lt;/p&gt;

&lt;h3&gt;
  
  
  どのモデルをデフォルトにすべきですか？
&lt;/h3&gt;

&lt;p&gt;まずは&lt;code&gt;google/gemini-2.5-flash&lt;/code&gt;です。速度、品質、コストのバランスが良く、多くのプロンプトに対応できます。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;通常用途: &lt;code&gt;google/gemini-2.5-flash&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;難しい推論: &lt;code&gt;google/gemini-2.5-pro&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;大量分類: &lt;code&gt;google/gemini-2.5-flash-lite&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  画像生成はサポートされていますか？
&lt;/h3&gt;

&lt;p&gt;Puterは現在、OpenAIの&lt;code&gt;gpt-image-2&lt;/code&gt;およびDALL-Eバリアントを介した画像生成を公開しており、Imagenではありません。画像生成パスについては、&lt;a href="http://apidog.com/blog/get-free-unlimited-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;無料無制限のGPT-5.5 APIを入手&lt;/a&gt;を参照してください。&lt;/p&gt;

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

&lt;p&gt;Puter.jsを使うと、Google CloudのセットアップなしでGeminiをブラウザアプリに組み込めます。最小実装は、CDNスクリプトを読み込み、&lt;code&gt;puter.ai.chat()&lt;/code&gt;を呼び出すだけです。&lt;/p&gt;

&lt;p&gt;まずは次の構成から始めるのが実用的です。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;あなたのプロンプト&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&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;無料公開アプリ、静的サイト、ハッカソン、プロトタイプでは、PuterはAPIキーなしでGeminiを試すためのシンプルな選択肢です。&lt;/p&gt;

&lt;p&gt;一方で、サーバーサイド実行、ファインチューニング、コード実行、検索グラウンディング、最大200万トークンの長文コンテキストが必要な場合は、公式Google AI Studio 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"&gt;Apidog&lt;/a&gt;で公式APIリクエストを整理しつつ、Puterプロトタイプと比較すれば、実装段階でどちらを採用すべきか判断しやすくなります。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>無料GPT-5.5 API使い放題 &amp; 全OpenAIモデル利用</title>
      <dc:creator>Akira</dc:creator>
      <pubDate>Sat, 09 May 2026 02:35:27 +0000</pubDate>
      <link>https://forem.com/aakira/wu-liao-gpt-55-apishi-ifang-ti-quan-openaimoderuli-yong-4l4p</link>
      <guid>https://forem.com/aakira/wu-liao-gpt-55-apishi-ifang-ti-quan-openaimoderuli-yong-4l4p</guid>
      <description>&lt;p&gt;OpenAIのGPT-5.5は有料APIとして提供され、入力100万トークンあたり5ドル、出力100万トークンあたり30ドルがかかります。サイドプロジェクト、ハッカソン、無料公開アプリでは、このコストが実装前の障壁になります。Puter.jsを使うと、OpenAIキーなしでGPT-5.5、GPT-5.5 Pro、GPT-5.x系、GPT-Image-2、DALL-E、OpenAI TTSをブラウザから呼び出せます。課金は開発者ではなく、Puterにサインインしたエンドユーザー側で処理されます。&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;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Puter.js&lt;/strong&gt;を使うと、APIキー、OpenAIアカウント、サーバーなしでOpenAIモデルをブラウザから呼び出せます。&lt;/li&gt;
&lt;li&gt;対応テキストモデルには、&lt;strong&gt;gpt-5.5、gpt-5.5-pro、gpt-5.4、gpt-5、gpt-5-mini、o1、o3、gpt-4.1、gpt-4o&lt;/strong&gt;、チャット/Codex系バリアントが含まれます。&lt;/li&gt;
&lt;li&gt;画像生成: &lt;strong&gt;gpt-image-2、gpt-image-1.5、dall-e-3&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;TTS: &lt;strong&gt;gpt-4o-mini-tts、tts-1、tts-1-hd&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;最小構成は&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;タグ1つと&lt;code&gt;puter.ai.chat()&lt;/code&gt;だけです。&lt;/li&gt;
&lt;li&gt;ストリーミング、関数呼び出し、画像入力、画像生成、TTSをブラウザで実装できます。&lt;/li&gt;
&lt;li&gt;エンドユーザーはPuterアカウントから自身の使用量を支払います。&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;でPuter版と公式OpenAI API版のプロンプトを比較してください。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  「無料無制限」の仕組み
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://developer.puter.com/tutorials/free-unlimited-openai-api/" rel="noopener noreferrer"&gt;Puter.js&lt;/a&gt;は、LLM利用時の課金主体を開発者からエンドユーザーに移します。開発者がOpenAI APIキーを保持して全トークン費用を負担する代わりに、ユーザーがPuterにサインインし、そのユーザーのPuter残高から呼び出しが課金されます。&lt;/p&gt;

&lt;p&gt;開発者側のメリットは次の3つです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;OpenAIアカウントやAPIキーを管理しなくてよい&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;
各ユーザーが自身のPuterアカウントで実行します。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;請求リスクを抑えられる&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
公開アプリで予期せぬOpenAI請求が発生する構成を避けられます。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ただし、Puter.jsはブラウザファーストです。ログイン済みユーザーセッションを前提とするため、Node.jsのバックエンドスクリプトやcronジョブで使う用途には向きません。サーバーサイド実行が必要な場合は、公式OpenAI APIを使うのが適切です。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ1: インストール
&lt;/h2&gt;

&lt;p&gt;CDN版なら、HTMLに1行追加するだけです。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;バンドル済みアプリではNPM版を使えます。&lt;br&gt;
&lt;/p&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; @heyputer/puter.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@heyputer/puter.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CDN版は、静的HTML、ハッカソン用プロトタイプ、静的サイト、ブラウザ拡張機能に向いています。NPM版は、ビルド環境やTypeScriptを使うアプリで扱いやすい選択肢です。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ2: モデルを選択する
&lt;/h2&gt;

&lt;p&gt;PuterはGPT-5.x系と既存OpenAIモデルを公開しています。用途ごとの選択例は次の通りです。&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;モデルID&lt;/th&gt;
&lt;th&gt;使用場面&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gpt-5.5-pro&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;高度な推論、コーディングエージェント、複雑な分析&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gpt-5.5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;日常的なチャット、品質とコストのバランス&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gpt-5.4-nano&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;高速・低コストな分類や大量テキスト処理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gpt-5.4-mini&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;チャットUI向けのミドルティア&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gpt-5.3-codex&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;コード生成・コード解析&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;o3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;複雑な推論チェーン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;o1-pro&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;エージェントによる多段階プランニング&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;gpt-4.1&lt;/code&gt;, &lt;code&gt;gpt-4o&lt;/code&gt;, &lt;code&gt;gpt-4o-mini&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;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gpt-image-2&lt;/code&gt;: 最新、鮮明な出力、高速。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gpt-image-1.5&lt;/code&gt; / &lt;code&gt;gpt-image-1&lt;/code&gt; / &lt;code&gt;dall-e-3&lt;/code&gt; / &lt;code&gt;dall-e-2&lt;/code&gt;: 古いが安定した選択肢。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;テキスト読み上げ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gpt-4o-mini-tts&lt;/code&gt;: 最新の自然な音声。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tts-1&lt;/code&gt;, &lt;code&gt;tts-1-hd&lt;/code&gt;: クラシックなTTS、低レイテンシー用途。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ステップ3: GPT-5.5に応答させる
&lt;/h2&gt;

&lt;p&gt;最小構成のチャット呼び出しです。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;WebSocketsについて3文で説明してください。&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&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;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;puter&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="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;このHTMLをブラウザで開くと、Puterが呼び出しを処理します。ユーザーは必要に応じてPuterにサインインし、応答がページに表示されます。APIキー、環境変数、サーバーは不要です。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ4: 応答をストリーミングする
&lt;/h2&gt;

&lt;p&gt;チャットUIや長文生成では、&lt;code&gt;stream: true&lt;/code&gt;を使って逐次表示します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;相対性理論について詳しく説明してください。&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;puter&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="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&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;code&gt;part.text&lt;/code&gt;をUIのメッセージバブルに追記すれば、ユーザーには回答がリアルタイムに生成されているように見えます。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ5: ビジョン、画像入力を使う
&lt;/h2&gt;

&lt;p&gt;第2引数に画像URLを渡すと、モデルに画像を読み取らせて質問できます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;この画像に何が見えますか？色、オブジェクト、雰囲気を説明してください。&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://assets.puter.site/doge.jpeg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&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;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;puter&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="nx"&gt;response&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;ul&gt;
&lt;li&gt;altテキスト生成&lt;/li&gt;
&lt;li&gt;ビジュアルQA&lt;/li&gt;
&lt;li&gt;スクリーンショット分析&lt;/li&gt;
&lt;li&gt;OCR&lt;/li&gt;
&lt;li&gt;アクセシビリティ支援&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ステップ6: 画像を生成する
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;puter.ai.txt2img()&lt;/code&gt;は、生成済み画像を含む&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;要素を返します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;txt2img&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;未来的な夜の都市景観、シネマティック、ネオン、雨。&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-image-2&lt;/span&gt;&lt;span class="dl"&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;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageElement&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageElement&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;画像生成の費用は、ユーザーのPuterアカウント残高から支払われます。無料公開の画像ジェネレーターやプロトタイプを作る場合、開発者側でOpenAI請求を抱えない構成にできます。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ7: テキスト読み上げを実装する
&lt;/h2&gt;

&lt;p&gt;OpenAI TTSは&lt;code&gt;txt2speech()&lt;/code&gt;から呼び出せます。戻り値は音声を含む&lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&gt;要素です。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;txt2speech&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;おかえりなさい。あなたのアカウント残高は$1,247.50です。&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;openai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-4o-mini-tts&lt;/span&gt;&lt;span class="dl"&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;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;audio&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;controls&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;audio&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;ul&gt;
&lt;li&gt;音声プロンプト&lt;/li&gt;
&lt;li&gt;アプリ内ナレーション&lt;/li&gt;
&lt;li&gt;ポッドキャストイントロ&lt;/li&gt;
&lt;li&gt;アクセシビリティ向け読み上げ&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ステップ8: 関数呼び出しを使う
&lt;/h2&gt;

&lt;p&gt;関数呼び出しは、OpenAI形式に近い形でツールを宣言します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;function&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;function&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;get_weather&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;都市の現在の天気を取得します。&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;city&lt;/span&gt;&lt;span class="dl"&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;東京の現在の天気は？&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tools&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;toolCalls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toolCalls&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// ここで実際の関数を実行し、結果をモデルに返す&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;toolCalls&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="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;toolCalls&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="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arguments&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;既存のOpenAI向けツール定義がある場合、近い形式で再利用できます。本番環境でツール駆動型フローを検証する場合は、&lt;a href="http://apidog.com/blog/mcp-server-testing-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ApidogでのMCPサーバーテスト&lt;/a&gt;も参考になります。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ9: temperatureとmax_tokensを調整する
&lt;/h2&gt;

&lt;p&gt;標準的なOpenAIパラメータは、オプションオブジェクトに渡します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;火星について教えてください。&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&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;目安:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;事実ベースの回答: &lt;code&gt;temperature: 0.0〜0.3&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;創造的な文章: &lt;code&gt;temperature: 0.7〜1.0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;コスト制御: &lt;code&gt;max_tokens&lt;/code&gt;で出力上限を設定&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;公開アプリでは、&lt;code&gt;max_tokens&lt;/code&gt;を設定してユーザー側の消費を予測しやすくするのが実用的です。&lt;/p&gt;

&lt;h2&gt;
  
  
  提供されるものと、されない可能性があるもの
&lt;/h2&gt;

&lt;p&gt;Puter経由のGPT-5.5アクセスは便利ですが、公式OpenAI APIの全機能をそのまま置き換えるものではありません。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;提供されるもの:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GPT-5.5、GPT-5.5 Pro、GPT-5.4系、Codex系バリアント&lt;/li&gt;
&lt;li&gt;GPT-4.1、GPT-4o、o1、o3などの既存OpenAIモデル&lt;/li&gt;
&lt;li&gt;GPT-Image-2およびDALL-Eによる画像生成&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gpt-4o-mini-tts&lt;/code&gt;を含むOpenAI TTS&lt;/li&gt;
&lt;li&gt;ストリーミング&lt;/li&gt;
&lt;li&gt;ビジョン入力&lt;/li&gt;
&lt;li&gt;関数呼び出し&lt;/li&gt;
&lt;li&gt;&lt;code&gt;temperature&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;max_tokens&lt;/code&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;Responses API&lt;/li&gt;
&lt;li&gt;プロンプトキャッシュによるコスト最適化&lt;/li&gt;
&lt;li&gt;Files API&lt;/li&gt;
&lt;li&gt;ブラウザセッションなしのサーバーサイド利用&lt;/li&gt;
&lt;li&gt;OpenAIからの直接のレートリミットヘッダー&lt;/li&gt;
&lt;li&gt;OpenAIの構造化出力モードやJSONスキーマ強制&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;本格的なサーバーサイド本番フローには、公式OpenAI APIが適しています。一方、ブラウザアプリ、サイドプロジェクト、公開ツール、静的サイトではPuterが実装しやすい選択肢です。&lt;/p&gt;

&lt;h2&gt;
  
  
  Puterと公式OpenAI APIの使い分け
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Puterを使う場合
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;無料公開アプリをリリースしたい&lt;/li&gt;
&lt;li&gt;開発者側の課金リスクを避けたい&lt;/li&gt;
&lt;li&gt;OpenAI APIキーを管理したくない&lt;/li&gt;
&lt;li&gt;静的サイト、ハッカソン、ブラウザ拡張機能でAI機能を使いたい&lt;/li&gt;
&lt;li&gt;ユーザーがPuterサインインを許容できる&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  公式OpenAI APIを使う場合
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;cron、Webhook、バッチ処理などサーバーサイド呼び出しが必要&lt;/li&gt;
&lt;li&gt;プロンプトキャッシュでコストを最適化したい&lt;/li&gt;
&lt;li&gt;Responses API、Files、構造化出力が必要&lt;/li&gt;
&lt;li&gt;コンプライアンス上の契約関係が必要&lt;/li&gt;
&lt;li&gt;ユーザーに外部サインインを要求できない&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;多くのプロジェクトでは、まずPuterでプロトタイプを作り、制限に当たった段階で公式APIへ移行する流れが現実的です。メッセージ形式が近いため、移行作業も比較的シンプルです。&lt;/p&gt;

&lt;p&gt;有料の本番環境セットアップについては、&lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;GPT-5.5 APIの使用方法&lt;/a&gt;を参照してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  Apidogで統合テストを整理する
&lt;/h2&gt;

&lt;p&gt;Puterの呼び出しはブラウザ内で発生するため、バックエンドのテストランナーから直接実行する構成には向きません。実装時は次のように分けると管理しやすくなります。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Puterスクリプトを含む小さな静的ページを作る。&lt;/li&gt;
&lt;li&gt;プロンプトやモデル名をクエリパラメータで渡せるようにする。&lt;/li&gt;
&lt;li&gt;将来移行する可能性のある公式OpenAI APIのリクエストをApidogで定義する。&lt;/li&gt;
&lt;li&gt;Puter検証用とOpenAI本番用を、同じApidogコレクション内の別環境として管理する。&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%2F96pq8yfcm9zepoxri4x9.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%2F96pq8yfcm9zepoxri4x9.png" alt="Apidog interface" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidogをダウンロード&lt;/a&gt;し、次のような環境を作成します。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;puter-prototype&lt;/code&gt;: Puterページをホストするlocalhost URL&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;openai-prod&lt;/code&gt;: &lt;code&gt;https://api.openai.com/v1&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;これにより、プロトタイプから本番移行する際も、同じコレクションをベースに検証できます。より広いAPIテスト設計については、&lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;QAエンジニア向けのAPIテストツール&lt;/a&gt;を参照してください。&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;これは本当に無制限ですか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
開発者側から見ると無制限です。エンドユーザーは自身のPuterアカウント残高を使います。新規アカウントには初期クレジットが付与され、必要に応じてユーザーがチャージします。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenAIアカウントは必要ですか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
いいえ。OpenAIとの接続はPuter側が処理します。開発者がOpenAI APIキーを扱う必要はありません。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;本番環境で使えますか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ブラウザベースのアプリであれば使えます。判断ポイントは、ユーザーがPuterにサインインすることを許容できるかどうかです。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Puter経由のGPT-5.5は公式APIと同じ性能ですか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Puterはユーザーの代理として公式OpenAI APIを呼び出します。追加ホップによりレイテンシーが少し増える可能性はありますが、モデルの動作自体は変わりません。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;プロンプトキャッシュは使えますか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Puterは現在、OpenAIのプロンプトキャッシュの価格管理機能を公開していません。大きな固定システムプロンプトを使い、キャッシュ割引が重要な場合は公式APIを使ってください。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;バックエンドサービスで使えますか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
きれいには使えません。Puterはブラウザファーストで、ユーザーセッションを前提とします。バックエンドサービスでは公式OpenAI APIを使うべきです。無料のサーバーサイド選択肢については、&lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;GPT-5.5 APIを無料で使う方法&lt;/a&gt;を参照してください。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;どのモデルをデフォルトにすべきですか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
日常的な推論には&lt;code&gt;gpt-5.5&lt;/code&gt;、大量分類には&lt;code&gt;gpt-5.4-nano&lt;/code&gt;、複雑な推論には&lt;code&gt;gpt-5.5-pro&lt;/code&gt;、長い推論チェーンには&lt;code&gt;o3&lt;/code&gt;が候補です。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ユーザーに高額な料金がかかりますか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
多くのチャット用途では、1セッションあたり数セント程度に収まるケースが一般的です。ただし画像生成は相対的に高くなります。&lt;code&gt;max_tokens&lt;/code&gt;を設定し、不要な生成呼び出しを避けてください。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Puterで画像を生成できますか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
はい。&lt;code&gt;txt2img()&lt;/code&gt;で&lt;code&gt;gpt-image-2&lt;/code&gt;またはDALL-Eを使えます。画像生成費用はユーザーのPuter残高から支払われます。公式の有料APIガイドは、&lt;a href="http://apidog.com/blog/how-to-use-gpt-image-2-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;GPT-Image-2 APIの使用方法&lt;/a&gt;を参照してください。&lt;/p&gt;

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

&lt;p&gt;Puter.jsを使うと、ブラウザベースのアプリにGPT-5.5、画像生成、TTS、ストリーミング、関数呼び出しを短いコードで組み込めます。開発者はOpenAIキーを持たず、エンドユーザーのPuterアカウントで利用量が処理されます。&lt;/p&gt;

&lt;p&gt;サーバーサイド処理、プロンプトキャッシュ、Responses API、Files API、厳密な構造化出力が必要な場合は、公式OpenAI APIを選んでください。プロトタイプ、ハッカソン、無料公開アプリ、静的サイトではPuterが実装しやすい選択肢です。&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&lt;/a&gt;でリクエストを整理し、Puter版と公式API版を比較して、プロジェクトに合う実装パスを選びましょう。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>無料 無制限 Claude Opus 4.7 API 入手</title>
      <dc:creator>Akira</dc:creator>
      <pubDate>Sat, 09 May 2026 02:28:46 +0000</pubDate>
      <link>https://forem.com/aakira/wu-liao-wu-zhi-xian-claude-opus-47-api-ru-shou-482m</link>
      <guid>https://forem.com/aakira/wu-liao-wu-zhi-xian-claude-opus-47-api-ru-shou-482m</guid>
      <description>&lt;p&gt;AnthropicのClaudeファミリーは、本格的なコーディング、エージェント的な作業、長文コンテキストの推論に強いクローズドソースモデルラインであり、API価格にもそれが反映されています。Sonnetは100万トークンあたり3ドル/15ドル、Opusはそれ以上です。サイドプロジェクトやプロトタイプでは、このコストが導入前のブレーキになりがちです。Puter.jsを使うと、AnthropicキーなしでClaudeのラインアップ（Opus 4.7、Sonnet 4.6、Haiku 4.5、その他のバリアント）をブラウザから利用でき、課金は開発者ではなくエンドユーザー側のPuterアカウントに紐づきます。&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;このガイドでは、Puter.jsでClaudeを呼び出すためのセットアップ、モデルID、実装コード、ストリーミング、複数ターン会話、公開前に確認すべき制約を順に説明します。&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Puter.js&lt;/strong&gt;を使うと、APIキーなし、Anthropicへの直接課金なし、サーバーなしでClaudeファミリーをブラウザから呼び出せます。&lt;/li&gt;
&lt;li&gt;エンドユーザーはPuterアカウントで自身の使用量をまかないます。開発者側でAnthropicキーを管理する必要はありません。&lt;/li&gt;
&lt;li&gt;サポートされるモデル: &lt;strong&gt;Opus 4.7, Opus 4.6, Opus 4.6 Fast, Opus 4.5, Opus 4.1, Opus 4, Sonnet 4.6, Sonnet 4.5, Sonnet 4, Haiku 4.5&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;最小構成は、1つの&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;タグと&lt;code&gt;puter.ai.chat()&lt;/code&gt;の呼び出しだけです。&lt;/li&gt;
&lt;li&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;でPuter経由のClaudeと公式Anthropic APIに対して同じプロンプトを実行すると比較しやすくなります。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  「無料無制限」の仕組み
&lt;/h2&gt;

&lt;p&gt;Puter.jsは、ブラウザで動作するサーバーレスのクラウドおよびAIライブラリです。&lt;/p&gt;

&lt;p&gt;通常は開発者がAnthropic APIキーを保持し、利用量に応じて課金されます。一方、Puter.jsではエンドユーザーがPuterにサインインし、そのPuterアカウントの残高からAPI呼び出しの料金が処理されます。新規Puterアカウントにはスタートアップクレジットが付与され、必要に応じてユーザーがチャージできます。&lt;/p&gt;

&lt;p&gt;開発者側の実装上のメリットは次の通りです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;APIキーをリポジトリに置かなくてよい&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;
各ユーザーが自身のPuterアカウントで実行するため、開発者のAnthropic請求に利用量が集中しません。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Anthropicとの直接契約が不要&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Puterが仲介するため、Anthropicキーなしで利用できます。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ただし、Puter.jsはブラウザファーストです。ログイン済みユーザーセッションを前提とするため、バックエンドのPythonスクリプト、cron、Discordボットなどから直接使う用途には向きません。その場合は公式Anthropic APIを使う方が適しています。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ1: Puter.jsを読み込む
&lt;/h2&gt;

&lt;p&gt;静的HTMLやプロトタイプでは、HTMLに次のタグを追加するだけです。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ビルドステップは不要です。&lt;code&gt;npm install&lt;/code&gt;、APIキー設定、サーバー実装も必要ありません。&lt;/p&gt;

&lt;p&gt;Vite、Webpack、Next.jsなどのバンドル環境で使う場合は、NPMパッケージも利用できます。&lt;br&gt;
&lt;/p&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; @heyputer/puter.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@heyputer/puter.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;最小検証ならCDNタグが最速です。既存のフロントエンドアプリに組み込む場合はNPMインポートを使うと管理しやすくなります。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ2: Claudeモデルを選ぶ
&lt;/h2&gt;

&lt;p&gt;PuterはClaudeの複数モデルを公開しています。モデルIDはAnthropicの命名規則に近い形式です。&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;モデルID&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;claude-opus-4-7&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;最新のフラッグシップ。深い推論、複雑なエージェント的作業&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4-6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;以前のフラッグシップ。強力なコーディング用途&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4.6-fast&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;低レイテンシーのOpusバリアント&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4-5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;プロダクションエージェント向けの安定した選択肢&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4-1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;レガシーな安定版。挙動を読みやすい&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Opus 4のベースライン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-sonnet-4-6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;日常利用のデフォルト候補。品質と速度のバランスがよい&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-sonnet-4-5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;以前のSonnet。多くのタスクで十分に実用的&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-sonnet-4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sonnet 4のベースライン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-haiku-4-5&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;/p&gt;

&lt;ul&gt;
&lt;li&gt;通常のチャット、Q&amp;amp;A、コード補助: &lt;code&gt;claude-sonnet-4-6&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;高速な分類、大量処理: &lt;code&gt;claude-haiku-4-5&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;長文推論、複雑なコードレビュー、多段階計画: &lt;code&gt;claude-opus-4-7&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ステップ3: 最小コードでClaudeを呼び出す
&lt;/h2&gt;

&lt;p&gt;まずはHTMLファイル1つで動作確認します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Explain quantum computing in simple terms&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&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;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;puter&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="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&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="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;このファイルをブラウザで開くと、PuterがAPI呼び出しを処理します。ユーザーは必要に応じてPuterにサインイン、または初回実行時に無料アカウントを作成します。&lt;/p&gt;

&lt;p&gt;レスポンスはAnthropicのメッセージAPIに近い構造です。プレーンテキストを読む場合は、通常次のフィールドを参照します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&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="nx"&gt;text&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 javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;block&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&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;h2&gt;
  
  
  ステップ4: 応答をストリーミングする
&lt;/h2&gt;

&lt;p&gt;長い回答では、完了まで待ってから表示すると遅く感じられます。&lt;code&gt;stream: true&lt;/code&gt;を指定し、&lt;code&gt;for await&lt;/code&gt;でチャンクを処理します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Write a detailed essay on the impact of artificial intelligence on society&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;puter&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="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&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;チャットUIに組み込む場合は、各&lt;code&gt;part.text&lt;/code&gt;を既存のメッセージ要素に追記します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#assistant-message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&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;これで、ユーザーは回答がリアルタイムに生成されているように感じられます。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ5: 複数ターンの会話を実装する
&lt;/h2&gt;

&lt;p&gt;単発の文字列ではなく、メッセージ配列を渡すと会話履歴を維持できます。各メッセージは&lt;code&gt;role&lt;/code&gt;と&lt;code&gt;content&lt;/code&gt;を持ちます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&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="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;I am building a Next.js app with Postgres.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Got it. What do you need help with?&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;How should I structure the migrations folder?&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;claude-opus-4-7&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&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="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;実際のチャットUIでは、ユーザー入力とアシスタント応答を同じ配列に追加してから、次のリクエストで再送します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sendMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userText&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userText&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;assistantText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&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="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;assistantText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;assistantText&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;Claudeは渡されたトランスクリプト全体を参照して、文脈を維持します。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ6: システムプロンプトを設定する
&lt;/h2&gt;

&lt;p&gt;出力形式、ペルソナ、制約はシステムメッセージで定義します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&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="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;system&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;You are a senior backend engineer. Reply in numbered bullets, never more than five.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;How do I prevent SQL injection in a Node app?&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&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="nx"&gt;text&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;ul&gt;
&lt;li&gt;回答の粒度&lt;/li&gt;
&lt;li&gt;出力フォーマット&lt;/li&gt;
&lt;li&gt;禁止事項&lt;/li&gt;
&lt;li&gt;口調&lt;/li&gt;
&lt;li&gt;役割設定&lt;/li&gt;
&lt;li&gt;コード例の有無&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;例として、日本語で短く回答させたい場合は次のようにします。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&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="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;system&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;あなたは経験豊富なWebエンジニアです。回答は日本語で、実装手順を中心に簡潔に説明してください。&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Expressで認証ミドルウェアを設計する方法を教えてください。&lt;/span&gt;&lt;span class="dl"&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;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 javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;models&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;claude-haiku-4-5&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;claude-opus-4-7&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Refactor this React component to use hooks: ...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;models&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;elapsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;elapsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&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="s2"&gt;ms`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&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="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;---&lt;/span&gt;&lt;span class="dl"&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;比較時は、少なくとも次の観点を記録すると判断しやすくなります。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;初回応答までの時間&lt;/li&gt;
&lt;li&gt;完了までの時間&lt;/li&gt;
&lt;li&gt;コードの正確性&lt;/li&gt;
&lt;li&gt;指示への追従&lt;/li&gt;
&lt;li&gt;回答の冗長さ&lt;/li&gt;
&lt;li&gt;失敗時の挙動&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;一般的には、軽い分類や要約はHaiku、日常的な実装支援はSonnet、複雑な推論やレビューはOpusから試すとよいです。&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&lt;/a&gt;でPuterの無料パスと公式Anthropic APIを比較する場合は、両プロバイダーを同じコレクション内に保持し、環境を切り替えて同じプロンプトを実行します。&lt;/p&gt;

&lt;h2&gt;
  
  
  得られるものと得られないもの
&lt;/h2&gt;

&lt;p&gt;Puter経由でClaudeを使うと、ブラウザアプリに素早くAI機能を組み込めます。ただし、公式APIのすべての機能を同じ粒度で制御できるわけではありません。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;得られるもの:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claudeモデルのカタログ&lt;/li&gt;
&lt;li&gt;複数ターン会話&lt;/li&gt;
&lt;li&gt;システムプロンプト&lt;/li&gt;
&lt;li&gt;ストリーミング応答&lt;/li&gt;
&lt;li&gt;ブラウザからの直接呼び出し&lt;/li&gt;
&lt;li&gt;開発者側のAnthropic APIキー不要&lt;/li&gt;
&lt;li&gt;開発者側の課金負担なし&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;得られない可能性があるもの（Puterのバージョンに依存）:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ネイティブのツール使用 / 関数呼び出し&lt;/li&gt;
&lt;li&gt;ビジョン入力（画像添付）&lt;/li&gt;
&lt;li&gt;Anthropicのプロンプトキャッシュによるコスト制御&lt;/li&gt;
&lt;li&gt;ブラウザコンテキストなしでのサーバーサイド利用&lt;/li&gt;
&lt;li&gt;Anthropicのレート制限ヘッダーなどの直接的な可視性&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;詳細なツール使用ワークフローが必要な場合は、公式Anthropic APIまたは&lt;a href="http://apidog.com/blog/mcp-server-testing-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ApidogでのMCPサーバーテスト&lt;/a&gt;のような構成の方が制御しやすくなります。&lt;/p&gt;

&lt;p&gt;一方、一般的なチャットボット、Q&amp;amp;Aアプリ、コンテンツ生成、学習用プロトタイプであれば、Puter.jsの機能で十分なケースが多いです。&lt;/p&gt;

&lt;h2&gt;
  
  
  Puterと公式Anthropic APIの使い分け
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Puterを使うべき場合
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;無料の公開アプリをリリースし、開発者側の課金負担を避けたい。&lt;/li&gt;
&lt;li&gt;プロトタイプ段階で、Anthropicの請求設定をまだ行いたくない。&lt;/li&gt;
&lt;li&gt;静的サイト、ハッカソンプロジェクト、ブラウザ拡張機能にClaudeを組み込みたい。&lt;/li&gt;
&lt;li&gt;サーバーを立てずにフロントエンドだけで試したい。&lt;/li&gt;
&lt;li&gt;ユーザーがPuterへのサインインを許容できる。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  公式Anthropic APIを使うべき場合
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;cronジョブ、APIエンドポイント、バッチ処理などサーバーサイド実行が必要。&lt;/li&gt;
&lt;li&gt;安定した長いシステムプロンプトに対してプロンプトキャッシュを使いたい。&lt;/li&gt;
&lt;li&gt;高度なツール使用、ビジョン入力、Files APIなどが必要。&lt;/li&gt;
&lt;li&gt;コンプライアンスや契約面でAnthropicとの直接関係が必要。&lt;/li&gt;
&lt;li&gt;ユーザーにPuterサインインを要求できない。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;多くのプロジェクトでは、最初にPuterでプロトタイプを作り、制約に当たった段階で公式APIへ移行する流れが現実的です。メッセージ形式が近いため、移行時の設計変更を抑えやすくなります。&lt;/p&gt;

&lt;p&gt;GPT系APIの同等機能については、&lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;GPT-5.5 APIの使用方法&lt;/a&gt;も参照してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  Apidogで連携テストする
&lt;/h2&gt;

&lt;p&gt;Puterの呼び出しはブラウザで実行されるため、一般的なバックエンドAPIテストランナーから直接同じ形で叩くことはできません。実装時は、次のように分けて検証すると扱いやすくなります。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Puterスクリプトを含む小さな静的ページを作る。&lt;/li&gt;
&lt;li&gt;プロンプトをクエリパラメータや入力欄から渡せるようにする。&lt;/li&gt;
&lt;li&gt;公式Anthropic APIへ移行する可能性がある場合は、ApidogでAnthropic APIのリクエストも定義する。&lt;/li&gt;
&lt;li&gt;Puter用とAnthropic用を別環境として管理する。&lt;/li&gt;
&lt;li&gt;同じプロンプトで速度、出力、失敗時の挙動を比較する。&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%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-28.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%2F05%2Fimage-28.png" alt="" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidogをダウンロード&lt;/a&gt;し、例えば次の2つの環境を作成します。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;puter-prototype&lt;/code&gt;&lt;br&gt;&lt;br&gt;
Puterページをホストするlocalhost URL&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;anthropic-prod&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;https://api.anthropic.com/v1&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Puterでプロトタイプを作り、必要になったら公式APIに移行する場合でも、同じプロンプトセットを使って比較できます。&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;これは本当に無制限ですか？隠れた上限はありますか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
開発者側から見ると無制限です。エンドユーザーは自身のPuterアカウントの残高を使用します。新規アカウントにはスタートアップクレジットが付与され、必要に応じてユーザーがチャージします。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anthropicに登録する必要はありますか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
いいえ。PuterがAnthropicとの関係を処理します。開発者がAnthropic APIキーを扱う必要はありません。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;本番環境で使えますか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ブラウザベースのアプリであれば使用できます。確認すべきポイントは、ユーザーがPuterへのサインインを許容できるかどうかです。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Puter経由のClaudeは公式APIと同じように動作しますか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Puterはユーザーに代わってClaudeを呼び出します。追加の経路があるため、レイテンシーが変わる可能性はあります。モデル選定や出力品質は、実際のプロンプトで比較するのが安全です。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claudeのプロンプトキャッシュは使えますか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Puterは現在、Anthropicのプロンプトキャッシュの料金制御を直接公開していない可能性があります。安定した長いシステムプロンプトがあり、キャッシュ割引を前提にしたい場合は公式APIを検討してください。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Discordボットやバックエンドサービスで使えますか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Puterはブラウザファーストで、ユーザーセッションを前提とします。バックエンドサービス、Bot、cron、バッチ処理には公式Anthropic APIの方が適しています。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;どのモデルをデフォルトにすべきですか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
まずは&lt;code&gt;claude-sonnet-4-6&lt;/code&gt;が扱いやすいです。より深い推論が必要なら&lt;code&gt;claude-opus-4-7&lt;/code&gt;、大量の軽量処理なら&lt;code&gt;claude-haiku-4-5&lt;/code&gt;を試します。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ユーザーに高額請求が発生しますか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
チャットスタイルの一般的な利用であれば、使用量は比較的小さくなりやすいです。ただし、長文コンテキストや大量実行では消費が増えるため、アプリ側でプロンプト長や実行頻度を制御する設計が重要です。&lt;/p&gt;

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

&lt;p&gt;Puter.jsを使うと、Anthropic APIキーを管理せずに、ブラウザベースのアプリへClaudeを組み込めます。実装はシンプルです。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;script src="https://js.puter.com/v2/"&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;を追加する。&lt;/li&gt;
&lt;li&gt;モデルIDを選ぶ。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;puter.ai.chat()&lt;/code&gt;を呼び出す。&lt;/li&gt;
&lt;li&gt;必要に応じてストリーミング、会話履歴、システムプロンプトを追加する。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;サーバーサイド処理、プロンプトキャッシュ、高度なツール使用、厳密なコンプライアンス要件がある場合は、公式Anthropic APIを使う方が適しています。&lt;/p&gt;

&lt;p&gt;一方で、プロトタイプ、無料公開アプリ、ハッカソン、サイドプロジェクト、静的サイトでは、Puter.jsは導入コストの低い選択肢です。&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&lt;/a&gt;で同じプロンプトを管理し、Puter経由と公式APIを比較して、アプリに合う実装方針を選びましょう。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Grok 4.3を無料で使う方法：2026年、4つの有効な手段</title>
      <dc:creator>Akira</dc:creator>
      <pubDate>Sat, 09 May 2026 02:24:58 +0000</pubDate>
      <link>https://forem.com/aakira/grok-43wowu-liao-deshi-ufang-fa-2026nian-4tunoyou-xiao-nashou-duan-2m94</link>
      <guid>https://forem.com/aakira/grok-43wowu-liao-deshi-ufang-fa-2026nian-4tunoyou-xiao-nashou-duan-2m94</guid>
      <description>&lt;p&gt;Grok 4.3は、2026年5月時点でのxAIの主力モデルです。1Mトークンのコンテキストウィンドウ、ネイティブ動画入力、100万トークンあたり$1.25/$2.50の価格設定が特徴ですが、プロトタイプ、学習、サイドプロジェクトであれば、次の3つの経路で無料利用を始められます。xAIコンソールのプロモーションクレジット、Puter.jsのユーザー支払いモデル、そしてgrok.com / Xの無料チャットUIです。&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;この記事では、それぞれの経路について、アカウント設定、実装例、API呼び出し、導入前に確認すべき制約を実装ベースで整理します。有料APIの詳細は「&lt;a href="http://apidog.com/blog/how-to-use-grok-4-3-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Grok 4.3 APIの利用方法&lt;/a&gt;」、音声版は「&lt;a href="http://apidog.com/blog/how-to-use-grok-voice-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Grok Voiceを無料で利用する方法&lt;/a&gt;」を参照してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Grok 4.3への無料パスは3つ&lt;/strong&gt;: xAIコンソールのプロモーションクレジット、Puter.js、&lt;a href="http://grok.com" rel="noopener noreferrer"&gt;grok.com&lt;/a&gt; / XチャットUI。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;開発者向けに最も実装しやすいのはPuter.js&lt;/strong&gt;: エンドユーザーが利用料を負担するため、開発者側でAPIキーや請求を管理しません。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API統合の検証にはxAIコンソール&lt;/strong&gt;: 新規アカウントのプロモーションクレジットで、実際のAPIサーフェスを試せます。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;コード不要ならgrok.com / X&lt;/strong&gt;: 1日のメッセージ制限はありますが、API実装なしで試せます。&lt;/li&gt;
&lt;li&gt;Puter.jsのモデルIDは &lt;code&gt;x-ai/grok-4.3&lt;/code&gt;、xAI直接利用のモデルIDは &lt;code&gt;grok-4.3&lt;/code&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;を使うと、xAI直接利用とOpenRouterのリクエストを同じスキーマで比較できます。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  パス1: xAIコンソールのプロモーションクレジット
&lt;/h2&gt;

&lt;p&gt;実際のGrok 4.3 APIを試したい場合は、xAIコンソールから始めるのが最短です。プロダクションと同じAPI形式で検証できます。&lt;/p&gt;

&lt;h3&gt;
  
  
  ステップ1: xAIコンソールにサインアップする
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;console.x.ai&lt;/code&gt; にアクセスし、アカウントを作成します。サインインはXアカウント経由で行われます。X側で求められる認証以外に、追加のメール認証は不要です。&lt;/p&gt;

&lt;h3&gt;
  
  
  ステップ2: Billingでクレジットを確認する
&lt;/h3&gt;

&lt;p&gt;xAIは、新規アカウント向けに無料クレジットを付与するプロモーションを実施することがあります。金額や対象期間は変わるため、サインアップ後に &lt;strong&gt;Billing&lt;/strong&gt; タブを確認してください。&lt;/p&gt;

&lt;p&gt;過去には、Grok 4.1 FastやAgent Tools APIなど、特定モデルや機能に対する無料利用プロモーションも提供されています。通常、このクレジットは自動更新されないため、プロトタイプ検証用として使うのが現実的です。&lt;/p&gt;

&lt;h3&gt;
  
  
  ステップ3: APIキーを環境変数に設定する
&lt;/h3&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;"xai-..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ステップ4: Chat Completions APIを呼び出す
&lt;/h3&gt;

&lt;p&gt;xAIのエンドポイントはOpenAI互換です。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.x.ai/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;"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-4.3",
    "messages": [
      {
        "role": "user",
        "content": "Explain prompt caching in three sentences."
      }
    ],
    "reasoning_effort": "low"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;プロトタイプ段階では、まず &lt;code&gt;reasoning_effort&lt;/code&gt; を &lt;code&gt;low&lt;/code&gt; にします。&lt;code&gt;medium&lt;/code&gt; や &lt;code&gt;high&lt;/code&gt; は推論コストが増え、無料クレジットを早く消費します。&lt;/p&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;短所&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;クレジットは有限&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1Mコンテキスト、動画入力、関数呼び出しを検証できる&lt;/td&gt;
&lt;td&gt;プロモーション条件は変更される&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;有料プラン移行時のコード変更が少ない&lt;/td&gt;
&lt;td&gt;無料枠内でしか使えない&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;推奨:&lt;/strong&gt; 本番APIの挙動を確認したい場合は、xAIコンソールから始めてください。完全なリクエストスキーマは「&lt;a href="http://apidog.com/blog/how-to-use-grok-4-3-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Grok 4.3 APIの利用方法&lt;/a&gt;」で確認できます。&lt;/p&gt;

&lt;h2&gt;
  
  
  パス2: Puter.js（ユーザー支払い、開発者無料）
&lt;/h2&gt;

&lt;p&gt;公開WebアプリにGrok 4.3を組み込みたい場合、Puter.jsは最も実装しやすい無料パスです。開発者ではなく、エンドユーザーのPuterアカウントに利用料が紐づきます。&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%2F05%2Fimage-26.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%2F05%2Fimage-26.png" alt="Puter.jsは開発者に料金を課さず、LLMの使用料をユーザーに直接請求する" width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  仕組み
&lt;/h3&gt;

&lt;p&gt;Puter.jsは、Grok、GPT、Claude、Gemini、DeepSeekなどのLLMをブラウザから呼び出せるJavaScriptクライアントです。&lt;/p&gt;

&lt;p&gt;通常のAPI連携では、開発者がAPIキーを管理し、利用料を支払います。一方、Puter.jsでは、&lt;strong&gt;エンドユーザーが自身のPuterアカウントで利用料を負担します&lt;/strong&gt;。そのため、開発者は請求設定やAPIキー配布を管理せずに、無料ツールやサイドプロジェクトを公開できます。&lt;/p&gt;

&lt;h3&gt;
  
  
  ステップ1: Puter.jsを読み込む
&lt;/h3&gt;

&lt;p&gt;HTMLに次のscriptタグを追加します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;APIキーは不要です。開発者側でPuterアカウントを作成する必要もありません。&lt;/p&gt;

&lt;h3&gt;
  
  
  ステップ2: Grok 4.3を呼び出す
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;puter.ai.chat()&lt;/code&gt; にモデルID &lt;code&gt;x-ai/grok-4.3&lt;/code&gt; を指定します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Summarize the trade-offs between SQLite and Postgres in three bullets.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-ai/grok-4.3&lt;/span&gt;&lt;span class="dl"&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;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ユーザーが初めて実行すると、Puterはサインインまたは無料アカウント作成を求めます。その後のAI利用は、ユーザー自身のPuter残高から消費されます。&lt;/p&gt;

&lt;h3&gt;
  
  
  ステップ3: ストリーミングを使う
&lt;/h3&gt;

&lt;p&gt;ストリーミングレスポンスも利用できます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Walk me through migrating a React app to Next.js.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-ai/grok-4.3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;reasoning_effort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;medium&lt;/span&gt;&lt;span class="dl"&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="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chunk&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stdout&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="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&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;ブラウザUIに表示する場合は、&lt;code&gt;process.stdout.write&lt;/code&gt; の代わりにDOMを更新します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#output&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chunk&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&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;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;短所&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;開発者の費用が継続的に0ドル&lt;/td&gt;
&lt;td&gt;ユーザーはPuterにサインインする必要がある&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;リポジトリにAPIキーを置かなくてよい&lt;/td&gt;
&lt;td&gt;バックエンド専用処理には向かない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;複数LLMを同じ形式で扱える&lt;/td&gt;
&lt;td&gt;xAI直接利用よりレイテンシが増える場合がある&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公開Webアプリに組み込みやすい&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;strong&gt;推奨:&lt;/strong&gt; 公開Webアプリ、無料ツール、サイドプロジェクト、課金管理を持ちたくないプロダクトではPuter.jsが有効です。一方、社内バッチ、Discordボット、サーバーサイド自動化など、ユーザーがブラウザで直接実行しない用途には向きません。&lt;/p&gt;

&lt;p&gt;関連する無料APIパターンは「&lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;DeepSeek V4 APIを無料で利用する方法&lt;/a&gt;」および「&lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;GPT-5.5 APIを無料で利用する方法&lt;/a&gt;」も参照してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  パス3: grok.comとXアプリ
&lt;/h2&gt;

&lt;p&gt;コードから呼び出す必要がなく、Grok 4.3と会話できればよい場合は、チャットUIを使います。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="http://grok.com" rel="noopener noreferrer"&gt;grok.com&lt;/a&gt;&lt;/strong&gt;: Xアカウントでサインインして使うWebチャット。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Xアプリ&lt;/strong&gt;: モバイルアプリまたはWebアプリのGrokタブから利用。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;無料ユーザーには1日のメッセージクォータがあります。クォータは24時間ごとにリセットされます。&lt;/p&gt;

&lt;p&gt;このパスはAPIではないため、スクリプト化やアプリへの組み込みはできません。用途は次のようなケースです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;単発の調査質問&lt;/li&gt;
&lt;li&gt;API実装前のプロンプト検証&lt;/li&gt;
&lt;li&gt;モデルの応答傾向の確認&lt;/li&gt;
&lt;li&gt;Grokが対象タスクに合うかの事前評価&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="http://grok.com" rel="noopener noreferrer"&gt;grok.com&lt;/a&gt; の無料プランでは、デフォルトでより小さなGrokバリアント（現在はGrok 4.1）が使われます。Xのプレミアムサブスクリプションでは、チャットUI上でGrok 4.3がアンロックされ、より高いクォータが提供されます。&lt;/p&gt;

&lt;h2&gt;
  
  
  パス4: OpenRouter（安価だがGrok 4.3は無料ではない）
&lt;/h2&gt;

&lt;p&gt;OpenRouterは、複数のモデルプロバイダーを1つのAPIキーと共通インターフェースで扱えるゲートウェイです。&lt;/p&gt;

&lt;p&gt;OpenRouter経由のGrok 4.3は、xAI直接利用と同じく100万トークンあたり$1.25/$2.50なので無料ではありません。ただし、OpenRouterでは一部のGrokモデルに対して、無料バリアント（例: &lt;code&gt;grok-4-fast:free&lt;/code&gt;）が提供されています。&lt;/p&gt;

&lt;p&gt;Grok 4.3そのものが必要な場合は、上記3つのパスを使います。Grok系の出力を無料で試したいだけなら、OpenRouterの無料モデルを検討できます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://openrouter.ai/api/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;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$OPENROUTER_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": "x-ai/grok-4-fast:free",
    "messages": [
      {
        "role": "user",
        "content": "Hello!"
      }
    ]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OpenRouterは、同じキーでDeepSeekや他のオープンモデルを試す用途にも使えます。&lt;/p&gt;

&lt;h2&gt;
  
  
  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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;xAIコンソール（クレジット）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0（クレジット内）&lt;/td&gt;
&lt;td&gt;該当なし&lt;/td&gt;
&lt;td&gt;APIプロトタイプ、本番APIの学習&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Puter.js&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;継続的に$0&lt;/td&gt;
&lt;td&gt;セッションあたり数セント&lt;/td&gt;
&lt;td&gt;公開Webアプリ、無料ツール、サイドプロジェクト&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="http://grok.com" rel="noopener noreferrer"&gt;grok.com&lt;/a&gt; / X&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;$0（クォータあり）&lt;/td&gt;
&lt;td&gt;非開発者、単発質問、プロンプト検証&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OpenRouter無料モデル&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;該当なし&lt;/td&gt;
&lt;td&gt;Grok 4.3に限定しない無料のGrok系出力&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  ApidogでxAIとOpenRouterのリクエストを比較する
&lt;/h2&gt;

&lt;p&gt;複数プロバイダーで同じモデル系統を使う場合は、同一リクエストを保存し、ベースURLとモデルIDだけを切り替えて比較すると検証が速くなります。&lt;/p&gt;

&lt;h3&gt;
  
  
  セットアップ例
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Apidogで新しい環境を作成する。&lt;/li&gt;
&lt;li&gt;環境変数を追加する。

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;XAI_API_KEY&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OPENROUTER_API_KEY&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BASE_URL&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;xAI用の環境を作成する。

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;BASE_URL=https://api.x.ai/v1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;OpenRouter用の環境を作成する。

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;BASE_URL=https://openrouter.ai/api/v1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Chat Completions用のリクエストを1つ作成する。&lt;/li&gt;
&lt;li&gt;環境を切り替えて、レスポンス、トークン数、レイテンシを比較する。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidogをダウンロード&lt;/a&gt;して、新しいコレクションを作成してください。xAIとOpenRouterはいずれもOpenAI Chat Completionsスキーマに対応しているため、モデル文字列を除けばリクエストボディをほぼ同じにできます。&lt;/p&gt;

&lt;p&gt;クロスプロバイダーテストの詳細は「&lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;QAエンジニア向けAPIテストツール&lt;/a&gt;」を参照してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  無料利用で注意すべき制約
&lt;/h2&gt;

&lt;p&gt;無料パスを使う場合、次の制約を前提に設計してください。&lt;/p&gt;

&lt;h3&gt;
  
  
  1. レート制限が厳しい
&lt;/h3&gt;

&lt;p&gt;コンソールクレジットは、無制限のスループットを意味しません。大量テストでは、クレジットを使い切る前に429エラーに到達する可能性があります。&lt;/p&gt;

&lt;p&gt;実装時は、リトライとバックオフを入れてください。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;callWithRetry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;retries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&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="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;retries&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&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="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;retries&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="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pow&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="nx"&gt;i&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;h3&gt;
  
  
  2. プロンプトキャッシングの効果を体感しにくい
&lt;/h3&gt;

&lt;p&gt;Grok 4.3のプロンプトキャッシングは、100万トークンあたり$0.20で利用できる重要機能です。ただし、数十回程度のプロトタイプでは、キャッシュによるコスト削減は見えにくいです。&lt;/p&gt;

&lt;p&gt;長いシステムプロンプトを繰り返し使う本番運用で効果が出ます。&lt;/p&gt;

&lt;h3&gt;
  
  
  3. サポートは限定的
&lt;/h3&gt;

&lt;p&gt;無料コンソールアカウントでは、サポートはベストエフォートです。本番障害やSLAが必要な場合は、有料プランを前提にしてください。&lt;/p&gt;

&lt;h2&gt;
  
  
  有料プランに移行するタイミング
&lt;/h2&gt;

&lt;p&gt;次のいずれかに当てはまる場合は、無料パスから有料利用への移行を検討します。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;継続的なスループットが必要&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;週に複数回レート制限に到達する。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;長い固定プロンプトを繰り返し使う&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;5万トークン以上の安定したシステムプロンプトがあり、キャッシングの恩恵を受けられる。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;コンプライアンス要件がある&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;SOC 2監査証跡、BAA、地域データレジデンシーなどが必要。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;移行自体はシンプルです。OpenRouterではベースURLを切り替え、xAIコンソールではAPIキーや課金設定を更新します。OpenAI互換スキーマを維持していれば、アプリケーションコードの変更は最小限で済みます。&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Grok 4.3は本当に無料ですか？&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;xAIコンソールでは、自動更新されないプロモーションクレジットによるトライアルです。Puter.jsでは、開発者にとっては構造的に無料です。利用料はユーザー側に紐づきます。&lt;a href="http://grok.com" rel="noopener noreferrer"&gt;grok.com&lt;/a&gt; では、無料の1日メッセージクォータがあります。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grok 4.3をPythonやNode.jsのバックエンドから無料で使えますか？&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;はい。xAIコンソールの無料クレジットが残っている間は可能です。クレジットを使い切った後は、有料プランに移行するか、Puter.jsのようなユーザー支払いモデルに切り替える必要があります。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Puter.jsはNode.jsでも動作しますか？&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Puter.jsはブラウザ優先です。ユーザー支払いモデルも、ブラウザ上でユーザーに認証を引き渡す設計です。バックエンド専用用途では、xAIコンソールのクレジットを使うのが現実的です。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PuterでGrok 4.3を使うモデルIDは何ですか？&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;x-ai/grok-4.3&lt;/code&gt; です。PuterのLLMカタログでは、同じプロバイダー/モデル形式を使います。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;無料クレジットで関数呼び出しや動画入力も使えますか？&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;はい。コンソールクレジットは、Grok 4.3の機能に対して通常の使用量として適用されます。1Mコンテキスト、関数呼び出し、動画入力、推論の労力を試せます。ただし、動画入力はコンテキストを大きく消費するため、トークン使用量に注意してください。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grok Voiceの無料プランとは何が違いますか？&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Grok Voiceはコンソール上で構造的に無料です（1分あたりの料金なし）。Grok 4.3テキストはクレジットで賄われます。詳しくは「&lt;a href="http://apidog.com/blog/how-to-use-grok-voice-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Grok Voiceを無料で利用する方法&lt;/a&gt;」を参照してください。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;無料のGrok 4.3 miniはありますか？&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;まだありません。xAIは4.3ライン向けの別ミニSKUをリリースしていません。近い選択肢は、OpenRouterの &lt;code&gt;grok-4-fast:free&lt;/code&gt; です。ただし、これはGrok 4.3そのものではなく、より小さく高速なGrok 4バリアントです。&lt;/p&gt;

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

&lt;p&gt;Grok 4.3を無料で試す合法的なパスは3つあります。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;本番APIに近い形で検証するなら &lt;strong&gt;xAIコンソール&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;公開Webアプリに組み込むなら &lt;strong&gt;Puter.js&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;コード不要で試すだけなら &lt;strong&gt;grok.com / X&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Grok 4.3そのものが必要ない場合は、OpenRouterの無料Grok系モデルも選択肢になります。Grok 4.3を有料で使う場合でも、価格は100万トークンあたり$1.25/$2.50なので、サイドプロジェクトでも試しやすい水準です。&lt;/p&gt;

&lt;p&gt;完全な有料APIチュートリアルは「&lt;a href="http://apidog.com/blog/how-to-use-grok-4-3-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Grok 4.3 APIの利用方法&lt;/a&gt;」、OpenAIとの比較は「&lt;a href="http://apidog.com/blog/grok-voice-vs-gpt-realtime-best-voice-model?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Grok Voice vs GPT-Realtime&lt;/a&gt;」を参照してください。&lt;/p&gt;

&lt;p&gt;Apidogでリクエストを一度作成し、ベースURLとモデルIDを切り替えれば、無料クレジット、OpenRouter、将来の有料運用まで同じ検証フローで扱えます。&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%2F05%2Fimage-27.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%2F05%2Fimage-27.png" alt="APIテストツールApidogのスクリーンショット" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Grok 4.3 API の使い方</title>
      <dc:creator>Akira</dc:creator>
      <pubDate>Fri, 08 May 2026 07:41:17 +0000</pubDate>
      <link>https://forem.com/aakira/grok-43-api-noshi-ifang-23me</link>
      <guid>https://forem.com/aakira/grok-43-api-noshi-ifang-23me</guid>
      <description>&lt;p&gt;xAIはGrok 4.3を段階的に展開しました。2026年4月17日にベータ版、4月30日にAPIアクセス、5月6日に一般提供が開始されています。主な変更点は、1,000,000トークンのコンテキストウィンドウ、Grokシリーズ初のネイティブビデオ入力、常時稼働の推論機能、Grok 4.20比で約40%の価格引き下げです。8つのレガシーGrokモデルは5月15日に廃止されるため、&lt;code&gt;grok-3&lt;/code&gt;または&lt;code&gt;grok-4&lt;/code&gt;系を使っている場合は、早めに&lt;code&gt;grok-4.3&lt;/code&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;p&gt;この記事では、コードからGrok 4.3を呼び出す実装手順をまとめます。エンドポイント、認証、OpenAI互換の&lt;code&gt;base_url&lt;/code&gt;、&lt;code&gt;reasoning_effort&lt;/code&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;/p&gt;

&lt;p&gt;同じリリースの音声側については、&lt;a href="http://apidog.com/blog/how-to-use-grok-voice-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Grok Voiceを無料で使う方法&lt;/a&gt;をご覧ください。OpenAIの主力音声モデルとの比較については、&lt;a href="http://apidog.com/blog/grok-voice-vs-gpt-realtime-best-voice-model?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Grok Voice vs GPT-Realtime&lt;/a&gt;をご覧ください。&lt;/p&gt;

&lt;h2&gt;
  
  
  要点
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Grok 4.3は&lt;strong&gt;2026年5月6日&lt;/strong&gt;にGAとなりました。&lt;/li&gt;
&lt;li&gt;8つのレガシーモデルは&lt;strong&gt;2026年5月15日&lt;/strong&gt;に廃止されます。&lt;/li&gt;
&lt;li&gt;価格は&lt;strong&gt;入力100万トークンあたり1.25ドル&lt;/strong&gt;、&lt;strong&gt;出力100万トークンあたり2.50ドル&lt;/strong&gt;、キャッシュ入力は&lt;strong&gt;100万トークンあたり0.20ドル&lt;/strong&gt;です。&lt;/li&gt;
&lt;li&gt;Grok 4.20と比較して約40%の値下げです。&lt;/li&gt;
&lt;li&gt;コンテキストウィンドウは&lt;strong&gt;100万トークン&lt;/strong&gt;です。&lt;/li&gt;
&lt;li&gt;Grokシリーズ初のネイティブ&lt;strong&gt;ビデオ入力&lt;/strong&gt;をサポートします。&lt;/li&gt;
&lt;li&gt;推論エフォートは&lt;code&gt;low&lt;/code&gt; / &lt;code&gt;medium&lt;/code&gt; / &lt;code&gt;high&lt;/code&gt;です。デフォルトは&lt;code&gt;medium&lt;/code&gt;です。&lt;/li&gt;
&lt;li&gt;エンドポイントは&lt;code&gt;https://api.x.ai/v1/chat/completions&lt;/code&gt;です。&lt;/li&gt;
&lt;li&gt;OpenAI互換のChat Completions形式で呼び出せます。&lt;/li&gt;
&lt;li&gt;標準ティアのスループットは約159トークン/秒です。&lt;/li&gt;
&lt;li&gt;Artificial Analysisのインテリジェンス指数は53で、146モデル中10位です。&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;を使うと、推論設定を変数化し、GrokとOpenAI互換モードの両方で同じリクエストを再生できます。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Grok 4.3で何が変わったか
&lt;/h2&gt;

&lt;p&gt;Grok 4.3で実装時に影響が大きい変更は次の5つです。&lt;/p&gt;

&lt;h3&gt;
  
  
  1. 価格が下がった
&lt;/h3&gt;

&lt;p&gt;Grok 4.20と比較して、入力は37.5%減、出力は58.3%減です。キャッシュされた入力は100万トークンあたり0.20ドルなので、長いシステムプロンプトや固定コンテキストを繰り返し使う構成ではコストを抑えやすくなります。&lt;/p&gt;

&lt;h3&gt;
  
  
  2. コンテキストが100万トークンになった
&lt;/h3&gt;

&lt;p&gt;Grok 4.20の256kから、Grok 4.3では100万トークンに拡張されています。中規模のコードベース、長い契約書、決算説明会の全文などを1回のプロンプトに含めやすくなります。&lt;/p&gt;

&lt;h3&gt;
  
  
  3. ビデオURLを直接渡せる
&lt;/h3&gt;

&lt;p&gt;Grokシリーズでは初めて、ネイティブビデオ入力に対応しました。アプリ側でキーフレームを手動抽出しなくても、ビデオURLをコンテンツブロックに含めて推論できます。&lt;/p&gt;

&lt;h3&gt;
  
  
  4. 推論が常時有効になった
&lt;/h3&gt;

&lt;p&gt;Grok 4.3はすべてのリクエストでベースラインの推論ステップを実行します。&lt;code&gt;reasoning_effort&lt;/code&gt;で深さを調整できますが、推論なしのモードにはなりません。&lt;/p&gt;

&lt;h3&gt;
  
  
  5. エージェント用途が改善された
&lt;/h3&gt;

&lt;p&gt;Grok 4.20と比較してGDPval-AAで300 Eloポイント向上しています。ツール選択、多段階ワークフロー、ツールエラーからの回復など、エージェント実装で重要な挙動が改善されています。&lt;/p&gt;

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

&lt;p&gt;最初のリクエストを送る前に、次を用意します。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;console.x.ai&lt;/code&gt;のxAIコンソールアカウント&lt;/li&gt;
&lt;li&gt;APIキーを発行できる有料ティア&lt;/li&gt;
&lt;li&gt;OpenAI SDKまたはxAI SDK&lt;/li&gt;
&lt;li&gt;リクエストを保存・再実行できるAPIクライアント&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%2F05%2Fimage-24.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%2F05%2Fimage-24.png" alt="image" width="800" height="502"&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;"xai-..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;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;openai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  エンドポイントと認証
&lt;/h2&gt;

&lt;p&gt;Grok 4.3はOpenAI互換のChat Completionsインターフェースで呼び出します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST https://api.x.ai/v1/chat/completions
&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 plaintext"&gt;&lt;code&gt;Authorization: Bearer $XAI_API_KEY
Content-Type: application/json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OpenAI SDKを使う場合は、&lt;code&gt;base_url&lt;/code&gt;をxAIのURLに変更します。&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;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;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/v1&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;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;grok-4.3&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;Summarize the trade-offs of GraphQL vs REST in three bullets.&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;reasoning_effort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium&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="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;既存のOpenAI SDKベースの実装では、主な変更点は次の2つです。&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;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/v1&lt;/span&gt;&lt;span class="sh"&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-4.3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  リクエストパラメータ
&lt;/h2&gt;

&lt;p&gt;Grok 4.3でよく使うパラメータは次の通りです。&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;model&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;&lt;code&gt;grok-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;messages&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;array&lt;/td&gt;
&lt;td&gt;OpenAIメッセージ形式&lt;/td&gt;
&lt;td&gt;必須。&lt;code&gt;role: system / user / assistant&lt;/code&gt;をサポートします。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;reasoning_effort&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;low&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;オプション。デフォルトは&lt;code&gt;medium&lt;/code&gt;です。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;max_tokens&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;1–32768&lt;/td&gt;
&lt;td&gt;出力トークン数を制限します。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;temperature&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;0.0–2.0&lt;/td&gt;
&lt;td&gt;デフォルトは1.0です。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;top_p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;0.0–1.0&lt;/td&gt;
&lt;td&gt;核サンプリング。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stream&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;bool&lt;/td&gt;
&lt;td&gt;true / false&lt;/td&gt;
&lt;td&gt;trueの場合、サーバー送信イベントでストリーミングします。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tools&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;array&lt;/td&gt;
&lt;td&gt;OpenAIツール形式&lt;/td&gt;
&lt;td&gt;関数呼び出しに使います。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tool_choice&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string / object&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;auto&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt;, または特定のツール&lt;/td&gt;
&lt;td&gt;OpenAI互換の指定方式です。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;response_format&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;object&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ type: "json_object" }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;構造化出力に使います。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;seed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;任意&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;temperature: 0&lt;/code&gt;と組み合わせて再現性を高めます。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;最小の&lt;code&gt;curl&lt;/code&gt;リクエストは次の通りです。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.x.ai/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;"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-4.3",
    "messages": [
      {
        "role": "system",
        "content": "You are a senior backend engineer."
      },
      {
        "role": "user",
        "content": "Review this query plan and flag the bottleneck."
      }
    ],
    "reasoning_effort": "high"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;応答はOpenAI互換形式です。本文は&lt;code&gt;choices[].message.content&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;content&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;content&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;利用量は&lt;code&gt;usage&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;usage&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;usage&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;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prompt_tokens&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;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completion_tokens&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;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;応答には、&lt;code&gt;prompt_tokens&lt;/code&gt;、&lt;code&gt;completion_tokens&lt;/code&gt;、&lt;code&gt;reasoning_tokens&lt;/code&gt;、&lt;code&gt;total_tokens&lt;/code&gt;の内訳が含まれます。&lt;/p&gt;

&lt;h2&gt;
  
  
  推論エフォートの選び方
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;reasoning_effort&lt;/code&gt;は、レイテンシ、出力トークン数、推論の深さに影響します。&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;low&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;分類、要約、ルール抽出、単純なQ&amp;amp;Aに使います。&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;"reasoning_effort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"low"&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;h3&gt;
  
  
  &lt;code&gt;medium&lt;/code&gt;
&lt;/h3&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;"reasoning_effort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"medium"&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;medium&lt;/code&gt;から始めます。&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;high&lt;/code&gt;
&lt;/h3&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;"reasoning_effort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&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;p&gt;Grok 4.3では推論が常時有効です。&lt;code&gt;low&lt;/code&gt;を指定しても推論は完全には無効になりません。低コスト・低レイテンシに寄せたい場合は&lt;code&gt;low&lt;/code&gt;を使い、推論そのものをゼロにする前提の設計は避けてください。&lt;/p&gt;

&lt;h2&gt;
  
  
  関数呼び出し
&lt;/h2&gt;

&lt;p&gt;Grok 4.3ではOpenAI互換の関数呼び出し形式をそのまま使えます。&lt;/p&gt;

&lt;p&gt;次の例では、ユーザーIDからユーザー情報を取得する&lt;code&gt;lookup_user&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;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;lookup_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;Look up a user by 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;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;string&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;grok-4.3&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;Find user u_42 and tell me their last login.&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;reasoning_effort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium&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;tool_calls&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="nf"&gt;print&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;実装フローは次の通りです。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;tools&lt;/code&gt;で呼び出し可能な関数を宣言する&lt;/li&gt;
&lt;li&gt;モデルが&lt;code&gt;tool_calls&lt;/code&gt;を返す&lt;/li&gt;
&lt;li&gt;アプリ側で実際の関数を実行する&lt;/li&gt;
&lt;li&gt;結果を&lt;code&gt;tool&lt;/code&gt;ロールのメッセージとしてモデルに返す&lt;/li&gt;
&lt;li&gt;最終回答を生成する&lt;/li&gt;
&lt;/ol&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;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;Find user u_42 and tell me their last login.&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="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="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;tool&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;tool_call_id&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_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="nb"&gt;id&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;{&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="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;u_42&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="s"&gt;last_login&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="s"&gt;2026-05-01T10:30:00Z&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="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;final_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;grok-4.3&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="n"&gt;messages&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="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;final_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;GDPval-AAにおける300 Eloポイントの向上は、ツール選択や多段階処理で特に効きます。ツールフローを検証する場合は、&lt;a href="http://apidog.com/blog/mcp-server-testing-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ApidogでのMCPサーバーテスト&lt;/a&gt;も参考になります。&lt;/p&gt;

&lt;h2&gt;
  
  
  ビデオ入力
&lt;/h2&gt;

&lt;p&gt;Grok 4.3はネイティブビデオ入力をサポートします。ビデオURLは、&lt;code&gt;messages[].content&lt;/code&gt;の配列に&lt;code&gt;video_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;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;grok-4.3&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;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 what happens in this clip and flag any anomalies.&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;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/clip.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="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;p&gt;ビデオ入力で注意する点は次の通りです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ビデオは入力トークンとしてカウントされます。&lt;/li&gt;
&lt;li&gt;長いクリップはコンテキストとコストを大きく消費します。&lt;/li&gt;
&lt;li&gt;コストが重要な場合は、送信前にトリミングまたはダウンサンプリングします。&lt;/li&gt;
&lt;li&gt;モデルがフレームをネイティブに推論するため、手動のキーフレーム抽出は必須ではありません。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  100万トークンコンテキストの使いどころ
&lt;/h2&gt;

&lt;p&gt;100万トークンのコンテキストは、単なるベンチマーク用ではなく、実装上も使いやすい機能です。&lt;/p&gt;

&lt;p&gt;代表的なユースケースは次の通りです。&lt;/p&gt;

&lt;h3&gt;
  
  
  コードベース全体のレビュー
&lt;/h3&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;以下をレビューしてください。

1. Git diff
2. 変更された全ファイル
3. テストログ
4. lint結果

観点:
- バグ
- セキュリティ
- パフォーマンス
- 後方互換性
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  長文ドキュメントQ&amp;amp;A
&lt;/h3&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;以下の契約書を読み、解約条項、責任制限、更新条件を要約してください。
不明点がある場合は、該当箇所を引用してください。
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  長期会話履歴
&lt;/h3&gt;

&lt;p&gt;エージェントの会話履歴を長く保持し、パーソナライズされた応答に使います。&lt;/p&gt;

&lt;p&gt;キャッシュ入力は100万トークンあたり0.20ドルです。たとえば、安定した40万トークンのシステムプロンプトを使う場合、新規入力として毎回送るより、キャッシュされた呼び出しのほうが大幅に安くなります。&lt;/p&gt;

&lt;h2&gt;
  
  
  レガシーGrokモデルからの移行
&lt;/h2&gt;

&lt;p&gt;8つのレガシーGrokモデルは&lt;strong&gt;2026年5月15日午後12時（PT）&lt;/strong&gt;に廃止されます。該当モデルを本番環境で使っている場合は、期限までに&lt;code&gt;model&lt;/code&gt;を&lt;code&gt;grok-4.3&lt;/code&gt;へ切り替えてください。&lt;/p&gt;

&lt;p&gt;基本的なリクエスト形式は変わらないため、多くの呼び出しはモデル名の変更だけで動作します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- model="grok-4.20"
&lt;/span&gt;&lt;span class="gi"&gt;+ model="grok-4.3"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;移行時に確認すべき点は2つです。&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;reasoning_effort&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;一部のレガシーモデルでは&lt;code&gt;reasoning_effort&lt;/code&gt;を使っていなかった可能性があります。Grok 4.3は常に推論を実行するため、以前の高速な非推論パスと同じレイテンシを期待しないでください。&lt;/p&gt;

&lt;p&gt;低レイテンシに寄せる場合は、まず&lt;code&gt;low&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;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;grok-4.3&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="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;reasoning_effort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;low&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. 出力形式
&lt;/h3&gt;

&lt;p&gt;Grok 4.3はGrok 4.20よりも構造化された出力を返す傾向があります。正規表現で強く後処理している場合は、切り替え前に実データで再テストしてください。&lt;/p&gt;

&lt;p&gt;OpenAIライン全体の価格比較については、&lt;a href="http://apidog.com/blog/gpt-5-5-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;GPT-5.5の価格設定&lt;/a&gt;を、推論モデルの比較については、&lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;GPT-5.5 APIの使用方法&lt;/a&gt;をご覧ください。&lt;/p&gt;

&lt;h2&gt;
  
  
  ApidogでGrok 4.3をテストする
&lt;/h2&gt;

&lt;p&gt;Grok 4.3を自分のユースケースで検証するには、同じプロンプトを複数設定で比較できる形にしておくと便利です。&lt;/p&gt;

&lt;p&gt;手順は次の通りです。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Apidogで環境を作成する&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;XAI_API_KEY&lt;/code&gt;を環境変数として保存する&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;BASE_URL&lt;/code&gt;に&lt;code&gt;https://api.x.ai/v1&lt;/code&gt;を設定する&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;reasoning_effort&lt;/code&gt;が&lt;code&gt;low&lt;/code&gt;のリクエストを作る&lt;/li&gt;
&lt;li&gt;同じリクエストを複製して&lt;code&gt;medium&lt;/code&gt;と&lt;code&gt;high&lt;/code&gt;を作る&lt;/li&gt;
&lt;li&gt;3つを実行する&lt;/li&gt;
&lt;li&gt;応答内容、レイテンシ、&lt;code&gt;usage.reasoning_tokens&lt;/code&gt;を比較する&lt;/li&gt;
&lt;li&gt;OpenAI互換API向けの別バリアントを作り、同じ入力でモデル比較する&lt;/li&gt;
&lt;/ol&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;{{BASE_URL}}/chat/completions
&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 plaintext"&gt;&lt;code&gt;Authorization: Bearer {{XAI_API_KEY}}
Content-Type: application/json
&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;"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-4.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"messages"&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;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"system"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"You are a senior backend engineer."&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;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Review this API design and identify risks."&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;"reasoning_effort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{REASONING_EFFORT}}"&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;REASONING_EFFORT&lt;/code&gt;を環境変数またはリクエスト変数にしておくと、&lt;code&gt;low&lt;/code&gt;、&lt;code&gt;medium&lt;/code&gt;、&lt;code&gt;high&lt;/code&gt;の比較が簡単になります。&lt;/p&gt;

&lt;p&gt;比較を実行するには、&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidogをダウンロード&lt;/a&gt;してください。プロバイダーを切り替えても同じコレクションを使い回せるため、Grok 4.3と他のOpenAI互換モデルを同じ条件で比較できます。&lt;/p&gt;

&lt;p&gt;より広いAPIテスト戦略については、&lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;QAエンジニアのためのAPIテストツール&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%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-23.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%2F05%2Fimage-23.png" alt="image" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  レート制限
&lt;/h2&gt;

&lt;p&gt;xAIコンソールのティア制限は、ティア1の1分あたり数千リクエストから、エンタープライズティアの数十万リクエストまで変化します。具体的な数値は変動するため、実装前にコンソールダッシュボードを確認してください。&lt;/p&gt;

&lt;p&gt;xAIが公開している159トークン/秒のスループットは、集計値ではなくストリームごとの出力速度です。同時リクエスト数は、契約ティアの制限内でスケールします。&lt;/p&gt;

&lt;p&gt;レート制限に達した場合、APIは&lt;code&gt;429&lt;/code&gt;を返します。&lt;code&gt;retry-after&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;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&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;RateLimitError&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="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;try&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;grok-4.3&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="n"&gt;messages&lt;/span&gt;&lt;span class="p"&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;except&lt;/span&gt; &lt;span class="n"&gt;RateLimitError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&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="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&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;wait&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;ul&gt;
&lt;li&gt;リクエストキューを使う&lt;/li&gt;
&lt;li&gt;同時実行数を制御する&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;429&lt;/code&gt;をメトリクス化する&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;retry-after&lt;/code&gt;を尊重する&lt;/li&gt;
&lt;li&gt;長い入力はキャッシュする&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;max_tokens&lt;/code&gt;を明示して出力上限を制御する&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Grok 4.3はOpenAI SDKで使えますか？
&lt;/h3&gt;

&lt;p&gt;はい。Chat CompletionsについてはOpenAI互換です。OpenAI SDKを使い、&lt;code&gt;base_url&lt;/code&gt;と&lt;code&gt;model&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;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;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/v1&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Responses APIをサポートしていますか？
&lt;/h3&gt;

&lt;p&gt;現在、xAIのインターフェースはChat Completionsです。Responses APIはOpenAI専用です。&lt;/p&gt;

&lt;h3&gt;
  
  
  実際のコンテキスト制限はどのくらいですか？
&lt;/h3&gt;

&lt;p&gt;1,000,000トークンです。ただし、長い入力は費用が増えるため、安定したプロンプトは積極的にキャッシュしてください。&lt;/p&gt;

&lt;h3&gt;
  
  
  常時稼働の推論機能はレイテンシに影響しますか？
&lt;/h3&gt;

&lt;p&gt;はい。非推論モデルと比較すると、最初のトークンのレイテンシはやや高くなります。一方で、Grok 4.3は約159トークン/秒でストリーミングされるため、エンドツーエンドの応答時間は競争力があります。&lt;/p&gt;

&lt;p&gt;精度を重視するワークロードでは、このトレードオフは受け入れやすいはずです。&lt;/p&gt;

&lt;h3&gt;
  
  
  Grok 4.3をGrok Voiceと組み合わせて使えますか？
&lt;/h3&gt;

&lt;p&gt;はい。音声エージェントである&lt;code&gt;grok-voice-think-fast-1.0&lt;/code&gt;は、推論時に内部でGrok 4.3を呼び出します。TTSやSTTプリミティブ上に構築した音声ループから、Grok 4.3を直接呼び出すこともできます。&lt;/p&gt;

&lt;h3&gt;
  
  
  5月15日以降、古いGrok 3 / Grok 4への呼び出しはどうなりますか？
&lt;/h3&gt;

&lt;p&gt;410エラー、つまりモデル廃止エラーで失敗します。期限までに&lt;code&gt;grok-4.3&lt;/code&gt;へ移行してください。&lt;/p&gt;

&lt;h3&gt;
  
  
  Grok 4.3は画像入力をサポートしていますか？
&lt;/h3&gt;

&lt;p&gt;はい。新しいビデオ入力と並行して画像入力もサポートします。OpenAIと同じ形式で、コンテンツブロックに画像URLを渡します。&lt;/p&gt;

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

&lt;p&gt;Grok 4.3は、価格、コンテキスト長、推論機能、ビデオ入力の面で大きく更新されたモデルです。OpenAI互換のChat Completions形式で呼び出せるため、既存のOpenAI SDKベースの実装では、主に&lt;code&gt;base_url&lt;/code&gt;と&lt;code&gt;model&lt;/code&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"&gt;Apidog&lt;/a&gt;で&lt;code&gt;low&lt;/code&gt;、&lt;code&gt;medium&lt;/code&gt;、&lt;code&gt;high&lt;/code&gt;の3つの推論バリアントを作り、実際のプロンプトでレイテンシ、出力品質、推論トークン数を比較することです。&lt;/p&gt;

&lt;p&gt;レガシーGrokモデルを使っている場合は、5月15日までに&lt;code&gt;grok-4.3&lt;/code&gt;へ移行してください。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>2026年 おすすめ音声モデル：Grok Voice vs GPT-Realtime 徹底比較</title>
      <dc:creator>Akira</dc:creator>
      <pubDate>Fri, 08 May 2026 07:34:17 +0000</pubDate>
      <link>https://forem.com/aakira/2026nian-osusumeyin-sheng-moderugrok-voice-vs-gpt-realtime-che-di-bi-jiao-1afi</link>
      <guid>https://forem.com/aakira/2026nian-osusumeyin-sheng-moderugrok-voice-vs-gpt-realtime-che-di-bi-jiao-1afi</guid>
      <description>&lt;p&gt;xAIがGrok Voiceを、OpenAIがGPT-Realtime-2を同じ週に展開したことで、2026年に音声モデルを選ぶ開発者には2つの現実的な主力候補があります。どちらも推論機能付きの音声対音声モデルで、WebSocket経由で動作し、ツール利用をサポートし、人間らしい抑揚で応答します。選定では、レイテンシ、価格、音声カタログ、推論の深さ、SIP・画像入力・音声クローニングの要否を具体的に比較してください。個別の導入手順は「&lt;a href="http://apidog.com/blog/gpt-realtime-2-api/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;GPT-Realtime-2の使い方&lt;/a&gt;」と「&lt;a href="http://apidog.com/blog/how-to-use-grok-voice-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Grok Voiceを無料で使う方法&lt;/a&gt;」を参照できます。負荷下でWebSocketセッションを検証する場合は、&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;/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;ul&gt;
&lt;li&gt;
&lt;strong&gt;Grok Voice (&lt;code&gt;grok-voice-think-fast-1.0&lt;/code&gt;)&lt;/strong&gt; は、&lt;strong&gt;レイテンシ&lt;/strong&gt;、&lt;strong&gt;無料コンソールアクセス&lt;/strong&gt;、&lt;strong&gt;音声カタログ&lt;/strong&gt;、&lt;strong&gt;音声クローニング&lt;/strong&gt;で優位です。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPT-Realtime-2&lt;/strong&gt; は、&lt;strong&gt;推論の深さ&lt;/strong&gt;、&lt;strong&gt;128kコンテキストウィンドウ&lt;/strong&gt;、&lt;strong&gt;画像入力&lt;/strong&gt;、&lt;strong&gt;ネイティブSIP&lt;/strong&gt;、&lt;strong&gt;MCP&lt;/strong&gt;で優位です。&lt;/li&gt;
&lt;li&gt;有料利用の価格は大きく異なります。GPT-Realtime-2は音声入力が&lt;strong&gt;100万オーディオトークンあたり$32&lt;/strong&gt;、音声出力が&lt;strong&gt;$64&lt;/strong&gt;です。Grok Voiceはコンソール上では音声の分単位課金がなく、Grok 4.3の推論に対して&lt;strong&gt;100万トークンあたり$1.25/$2.50&lt;/strong&gt;を支払います。&lt;/li&gt;
&lt;li&gt;大量利用、低レイテンシ、音声クローニングが必要なアプリでは&lt;strong&gt;Grok Voice&lt;/strong&gt;を優先します。&lt;/li&gt;
&lt;li&gt;複雑な推論、マルチモーダル音声エージェント、SIPベースのコールセンターでは&lt;strong&gt;GPT-Realtime-2&lt;/strong&gt;を優先します。&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;でWebSocketテストを一度作成すれば、URLを切り替えて両モデルを比較できます。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2つのモデルを1つの表で比較
&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;Grok Voice (&lt;code&gt;grok-voice-think-fast-1.0&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;GPT-Realtime-2&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;strong&gt;1秒未満&lt;/strong&gt;（xAIの主張: 最も近い競合より約5倍速い）&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;low&lt;/code&gt; 推論では1秒未満、&lt;code&gt;high&lt;/code&gt; / &lt;code&gt;xhigh&lt;/code&gt; ではより遅い&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;推論レベル&lt;/td&gt;
&lt;td&gt;low / medium / high（Grok 4.3が基盤）&lt;/td&gt;
&lt;td&gt;minimal / low / medium / high / xhigh&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;基盤となる知能&lt;/td&gt;
&lt;td&gt;Grok 4.3（知能指数 53）&lt;/td&gt;
&lt;td&gt;GPT-5クラス&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;コンテキストウィンドウ&lt;/td&gt;
&lt;td&gt;1,000,000トークン（Grok 4.3）&lt;/td&gt;
&lt;td&gt;128,000トークン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;プリセット音声&lt;/td&gt;
&lt;td&gt;80以上（Eve、Ara、Rex、Sal、Leoの5つの音声エージェントペルソナ）&lt;/td&gt;
&lt;td&gt;10（新しく2つ: Cedar、Marin。8つは再調整済み）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;言語（TTS）&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;公式には非公開&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;言語（STT）&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;GPT-Realtimeから継承&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;音声クローニング&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;あり&lt;/strong&gt;。1分サンプル、2分未満のトレーニング&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;strong&gt;あり&lt;/strong&gt;（写真、スクリーンショット）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;リモートMCPサーバー&lt;/td&gt;
&lt;td&gt;ツール利用は可能。ネイティブMCPは宣伝されていない&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;あり&lt;/strong&gt;（APIがMCPツールを実行）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ネイティブSIP / 電話発信&lt;/td&gt;
&lt;td&gt;自前のSIPプロバイダーを使用&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;あり&lt;/strong&gt;（&lt;code&gt;?call_id={call_id}&lt;/code&gt; エンドポイント）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;オーディオ形式&lt;/td&gt;
&lt;td&gt;PCM16、MP3、μ-law&lt;/td&gt;
&lt;td&gt;PCM16、G.711 μ-law、A-law&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;料金モデル&lt;/td&gt;
&lt;td&gt;音声については&lt;strong&gt;コンソールで無料&lt;/strong&gt;。Grok 4.3の推論のみ課金（$1.25/$2.50/1M）&lt;/td&gt;
&lt;td&gt;入力オーディオ1Mあたり$32、出力オーディオ1Mあたり$64、テキスト1Mあたり$4/$24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;コンプライアンス&lt;/td&gt;
&lt;td&gt;SOC 2 Type II、HIPAA準拠（BAA）、GDPR&lt;/td&gt;
&lt;td&gt;SOC 2、GDPR（OpenAI Enterpriseに準拠）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  レイテンシで選ぶならGrok Voice
&lt;/h2&gt;

&lt;p&gt;xAIは、&lt;code&gt;grok-voice-think-fast-1.0&lt;/code&gt;について「最も近い競合より約5倍速い」と主張しています。この倍率はxAI自身のベンチマークに基づくため、そのまま採用するのではなく自分のワークロードで測定してください。&lt;/p&gt;

&lt;p&gt;ただし、方向性としてはGrok Voiceが低レイテンシ寄りです。Grokの最初の音声出力までの時間は1秒を大きく下回り、GPT-Realtime-2は推論レベルに応じておおむね800ms〜1500msの範囲に収まります。&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;- WebSocket接続開始時刻
- ユーザー音声送信完了時刻
- 最初の音声チャンク受信時刻
- 応答完了時刻
- 推論レベル
- 使用トークン数
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;電話やライブ会話では、600msと1200msの差が体感品質に直結します。ユーザーが「自然に会話できる」と感じるか、「ボットが考え込んでいる」と感じるかを分ける要素です。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;推奨:&lt;/strong&gt; 消費者向け音声アプリ、音声チャット、リアルタイム応答が重要なUXでは、まずGrok Voiceを検証してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  価格設定は課金単位から比較する
&lt;/h2&gt;

&lt;p&gt;両者は課金の形が異なるため、単純なモデル単価だけでは比較できません。&lt;/p&gt;

&lt;h3&gt;
  
  
  GPT-Realtime-2
&lt;/h3&gt;

&lt;p&gt;GPT-Realtime-2は音声をトークンとして課金します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;音声入力:  $32 / 1M audio tokens
音声出力:  $64 / 1M audio tokens
テキスト:  $4 / $24 / 1M tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;1秒の音声は約50トークンです。均衡の取れたターン制の5分間会話では、約30,000トークン、つまり音声I/Oで約$1.50を消費します。安定したシステムプロンプトでは、キャッシュ入力によりコストを下げられます。&lt;/p&gt;

&lt;h3&gt;
  
  
  Grok Voice
&lt;/h3&gt;

&lt;p&gt;Grok Voiceは、xAIコンソール上ではTTS、STT、音声エージェント、カスタム音声に対して分単位または音声トークン単位の課金がありません。課金対象はGrok 4.3の推論です。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;推論入力: $1.25 / 1M tokens
推論出力: $2.50 / 1M tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;同じ5分間通話では、推論トークンは音声トークンより約1桁少なくなりやすいため、$0.10未満に収まる可能性があります。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;推奨:&lt;/strong&gt; 1日あたり10,000分以上の大量利用を想定する場合は、Grok Voiceの単位経済を先に検証してください。営業電話や規制対象サポートなど少量・高リスクのフローでは、価格差より推論品質を優先します。&lt;/p&gt;

&lt;p&gt;Grok 4.3の価格については「&lt;a href="http://apidog.com/blog/how-to-use-grok-4-3-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Grok 4.3 APIの使い方&lt;/a&gt;」、OpenAIの価格については「&lt;a href="http://apidog.com/blog/gpt-5-5-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;GPT-5.5の価格設定&lt;/a&gt;」も参照してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  推論の深さで選ぶならGPT-Realtime-2
&lt;/h2&gt;

&lt;p&gt;GPT-Realtime-2は、OpenAIが「GPT-5クラス」と説明する音声対音声モデルです。Big Bench Audioでは96.6%、Audio MultiChallengeでは48.5%を記録しています。&lt;code&gt;minimal&lt;/code&gt;から&lt;code&gt;xhigh&lt;/code&gt;まで5段階の推論レベルを指定できるため、リクエストごとにレイテンシと品質を調整できます。&lt;/p&gt;

&lt;p&gt;実装では、ユースケースごとに推論レベルを固定せず、ルーティングするのが現実的です。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;selectReasoningLevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;intent&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;faq&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;intent&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;simple_status_check&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;low&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;intent&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sales_call&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;intent&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;medium&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;intent&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;regulated_support&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;intent&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;multi_tool_reasoning&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;high&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;low&lt;/span&gt;&lt;span class="dl"&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;Grok VoiceはGrok 4.3を基盤にしています。Grok 4.3はArtificial Analysisで知能指数53を達成し、146モデル中10位にランクインしました。エージェントタスクに強い一方、公開ベンチマーク上の音声対音声推論ではGPT-Realtime-2が優勢です。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;推奨:&lt;/strong&gt; エージェントが意図の明確化、多数のツール選択、長い会話履歴に基づく判断を行う場合は、GPT-Realtime-2を優先してください。FAQや定型スクリプト中心なら、Grok Voiceの低レイテンシが勝つ場面が多くなります。&lt;/p&gt;

&lt;h2&gt;
  
  
  音声カタログで選ぶ
&lt;/h2&gt;

&lt;p&gt;Grokは28言語にわたる80以上のプリセット音声を提供します。音声エージェントではEve、Ara、Rex、Sal、Leoの5つのペルソナを使い、TTSではより広いライブラリから選択できます。さらに、音声クローニングにも対応しています。&lt;/p&gt;

&lt;p&gt;GPT-Realtime-2は合計10音声です。Realtime API向けの新しいCedar、Marinに加え、alloy、ash、ballad、coral、echo、sage、shimmer、verseの8音声が再調整されています。音声数は少ないですが、一貫したオーディオスタックと予測しやすい抑揚制御が強みです。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;推奨:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ブランド音声、地域アクセント、キャラクター音声が必要: &lt;strong&gt;Grok Voice&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;少数の高品質音声で一貫性を重視: &lt;strong&gt;GPT-Realtime-2&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  音声クローニングが必要ならGrok Voice
&lt;/h2&gt;

&lt;p&gt;xAIのカスタム音声は、約1分のクリアなスピーチから音声をクローンし、2分以内に&lt;code&gt;voice_id&lt;/code&gt;を返します。同じ&lt;code&gt;voice_id&lt;/code&gt;はTTSエンドポイントと音声エージェントの両方で使えます。&lt;/p&gt;

&lt;p&gt;OpenAIは現在、Realtime APIで音声クローニングを公開していません。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;推奨:&lt;/strong&gt; カスタムブランド音声やキャラクター音声が要件に含まれるなら、Grok Voiceを選んでください。&lt;/p&gt;

&lt;h2&gt;
  
  
  画像入力が必要ならGPT-Realtime-2
&lt;/h2&gt;

&lt;p&gt;GPT-Realtime-2は、テキスト、音声、画像を入力として受け取れます。ユーザーのターンにスクリーンショットや写真を添付し、エージェントに内容を説明させながら会話を継続できます。&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;- フィールドサポート
- 音声駆動QA
- アクセシビリティ向けナレーション
- 画面共有中のトラブルシューティング
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Grok Voiceは現在、テキストと音声のみです。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;推奨:&lt;/strong&gt; エージェントがユーザーの画面や写真を理解する必要があるなら、GPT-Realtime-2を選んでください。&lt;/p&gt;

&lt;p&gt;OpenAIのビジョンスタックについては「&lt;a href="http://apidog.com/blog/how-to-use-gpt-image-2-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;GPT-Image-2 APIの使い方&lt;/a&gt;」も参照できます。&lt;/p&gt;

&lt;h2&gt;
  
  
  SIPおよび電話統合
&lt;/h2&gt;

&lt;p&gt;OpenAIのRealtime APIはネイティブSIPをサポートしています。SIPトランクをOpenAIのゲートウェイに向け、インバウンドコールでは次のようなWebSocketセッションを開きます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wss://api.openai.com/v1/realtime?call_id={call_id}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;この構成では、独自のSIPブリッジ層を省略できます。&lt;/p&gt;

&lt;p&gt;一方、Grok Voiceは電話向けにμ-law出力をサポートしていますが、Twilio、Telnyx、PlivoなどのSIPプロバイダーとブリッジは自分で実装する必要があります。&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; SIPプロバイダー
  -&amp;gt; 自前ブリッジ
  -&amp;gt; Grok Voice WebSocket
  -&amp;gt; 自前ブリッジ
  -&amp;gt; SIPプロバイダー
  -&amp;gt; ユーザー電話
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;推奨:&lt;/strong&gt; コールセンターエージェントを短期間で構築し、SIP統合の実装量を減らしたい場合はGPT-Realtime-2が適しています。&lt;/p&gt;

&lt;h2&gt;
  
  
  MCPとツール利用
&lt;/h2&gt;

&lt;p&gt;どちらのモデルも関数呼び出しをサポートします。違いはMCPの扱いです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GPT-Realtime-2&lt;/strong&gt; はリモートMCPサーバーをネイティブにサポートします。サーバーURLとツール許可リストを設定すると、Realtime APIがMCPツール呼び出しを実行します。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grok Voice&lt;/strong&gt; は関数呼び出しをサポートし、組み込みの&lt;code&gt;web_search&lt;/code&gt;ツールを持ちます。ただし、MCPは第一級プリミティブとしては宣伝されていません。&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 javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;get_order_status&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;注文IDから配送状況を取得する&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;order_id&lt;/span&gt;&lt;span class="dl"&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;一方、銀行、保険、社内業務エージェントのように50以上のツールを横断する場合は、MCP統合が重要になります。音声エージェントのホットパスで自前サーバーを往復させずにツールをディスパッチできるためです。&lt;/p&gt;

&lt;p&gt;MCPサーバー単体の検証については「&lt;a href="http://apidog.com/blog/mcp-server-testing-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ApidogでのMCPサーバーテスト&lt;/a&gt;」を参照してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  ユースケース別の選び方
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;消費者向け音声アプリ、大量利用、低レイテンシ重視:&lt;/strong&gt; Grok Voice&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;音声クローニングが必要:&lt;/strong&gt; Grok Voice&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;10言語以上の多言語TTS:&lt;/strong&gt; Grok Voice&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;スクリーンショットや写真を理解する音声エージェント:&lt;/strong&gt; GPT-Realtime-2&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SIPを使うコールセンター:&lt;/strong&gt; GPT-Realtime-2&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;50以上のツールを持つ多段階推論エージェント:&lt;/strong&gt; GPT-Realtime-2（MCP）&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;長文コンテキスト会話:&lt;/strong&gt; GPT-Realtime-2。ただし1Mコンテキストを活用でき、音声トークンコストを許容できるならGrok 4.3も検討&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;最も安価な本番環境音声エージェント:&lt;/strong&gt; コンソール版Grok Voice&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ベンチマーク重視の高精度推論:&lt;/strong&gt; &lt;code&gt;xhigh&lt;/code&gt;推論を使うGPT-Realtime-2&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  導入前に両方をテストする手順
&lt;/h2&gt;

&lt;p&gt;最初にどちらかを決め打ちするより、同じ会話フィクスチャを使って1週間比較する方が安全です。&lt;/p&gt;

&lt;h3&gt;
  
  
  1. フィクスチャ会話を作る
&lt;/h3&gt;

&lt;p&gt;10ターン程度の会話を用意します。最低限、以下を含めます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- 1つのツール呼び出し
- 1つの曖昧さ解消
- 1つの長い回答
- 実ユーザー音声の録音
- 中断または言い直し
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. WebSocketリクエストを一度だけ作る
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;でWebSocketリクエスト、JSONメッセージシーケンス、環境変数を設定します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;XAI_API_KEY
OPENAI_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. 実行ごとにURLを切り替える
&lt;/h3&gt;

&lt;p&gt;Grok Voice:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wss://api.x.ai/v1/realtime?model=grok-voice-think-fast-1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GPT-Realtime-2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wss://api.openai.com/v1/realtime?model=gpt-realtime-2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. 同じ指標を記録する
&lt;/h3&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;- first_audio_latency_ms
- total_response_time_ms
- interruption_recovery_time_ms
- input_audio_tokens
- output_audio_tokens
- reasoning_tokens
- estimated_cost
- tool_call_success_rate
- human_rating
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. 結果をバージョン管理する
&lt;/h3&gt;

&lt;p&gt;Apidogのコレクション形式はポータブルです。比較用のリクエスト、環境変数、レスポンス例をリポジトリに置けば、チーム内で再現できます。&lt;/p&gt;

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

&lt;h3&gt;
  
  
  同じアプリで両方のモデルを使い、ランタイムでルーティングできますか？
&lt;/h3&gt;

&lt;p&gt;できます。どちらも近いイベント形状で動作します。軽い意図分類器を前段に置き、カジュアルな用途はGrok Voice、複雑な推論やツール利用はGPT-Realtime-2へ送る構成が現実的です。&lt;/p&gt;

&lt;h3&gt;
  
  
  非英語の音声品質はどちらが良いですか？
&lt;/h3&gt;

&lt;p&gt;Grokは言語カバレッジで優位です。80以上の音声とTTSで28言語を提供します。ただし、両方が対応する言語では実際の品質差が小さい場合もあるため、対象言語ごとに録音サンプルで評価してください。&lt;/p&gt;

&lt;h3&gt;
  
  
  GPT-Realtime-2は一般的なワークロードに対して高い価格を払う価値がありますか？
&lt;/h3&gt;

&lt;p&gt;FAQ応答中心のカスタマーサポートなら、必ずしも価値があるとは限りません。CRMを読み込み、複数ツールをディスパッチし、中断から回復しながら会話を継続する営業エージェントでは、推論品質の差に価値があります。&lt;/p&gt;

&lt;h3&gt;
  
  
  どちらかのモデルで有名人の実際の音声をクローニングできますか？
&lt;/h3&gt;

&lt;p&gt;できません。どちらのベンダーも、音声クローニングは同意されたサンプルに限定しています。許可なく有名人をクローニングすることは、両プラットフォームの利用規約に違反します。&lt;/p&gt;

&lt;h3&gt;
  
  
  後から一方からもう一方へ移行するにはどうすればよいですか？
&lt;/h3&gt;

&lt;p&gt;イベント名や&lt;code&gt;session.update&lt;/code&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;/p&gt;

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

&lt;p&gt;Grok VoiceとGPT-Realtime-2の間に、すべてのケースで正しい選択はありません。判断軸は、レイテンシ、価格、音声カタログ、推論の深さ、SIP・MCP・画像入力などの統合要件です。&lt;/p&gt;

&lt;p&gt;低レイテンシの消費者向け音声アプリを作るなら、Grok Voiceを先に検証してください。画像を理解し、50個以上のツールを扱い、SIPブリッジなしで電話対応するマルチモーダル音声エージェントを作るなら、GPT-Realtime-2を選ぶ方が実装しやすくなります。&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&lt;/a&gt;でWebSocketテストを一度作り、同じ会話フィクスチャで両方を1週間測定してください。最終判断は、推測ではなくレイテンシ、成功率、コストのデータで行うべきです。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Grok Voiceを無料で使う方法: コンソール設定、声のクローン、リアルタイム音声エージェント</title>
      <dc:creator>Akira</dc:creator>
      <pubDate>Fri, 08 May 2026 07:29:58 +0000</pubDate>
      <link>https://forem.com/aakira/grok-voicewowu-liao-deshi-ufang-fa-konsorushe-ding-sheng-nokuron-riarutaimuyin-sheng-eziento-1b96</link>
      <guid>https://forem.com/aakira/grok-voicewowu-liao-deshi-ufang-fa-konsorushe-ding-sheng-nokuron-riarutaimuyin-sheng-eziento-1b96</guid>
      <description>&lt;p&gt;xAIはGrok 4.3のリリースに合わせてGrok Voiceを公開しました。開発者にとって重要なのは、xAI Consoleから音声機能を無料で試せる点です。TTS、STT、リアルタイムボイスエージェント、カスタムボイスクローンを使えます。課金対象になるのは、エージェントが推論時に消費するGrok 4.3の基盤トークンです。このガイドでは、APIキー取得、音声選択、WebSocket接続、TTS呼び出し、そして&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;a href="http://apidog.com/blog/how-to-use-grok-4-3-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Grok 4.3 APIガイド&lt;/a&gt;と&lt;a href="http://apidog.com/blog/grok-voice-vs-gpt-realtime-best-voice-model?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;GroK Voice対GPT-Realtime&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;ul&gt;
&lt;li&gt;Grok Voiceは&lt;strong&gt;xAI Console&lt;/strong&gt;（&lt;code&gt;console.x.ai&lt;/code&gt;）から無料で利用できます。TTS、STT、ボイスエージェント、カスタムボイスに対して、1分あたりまたはトークンあたりの音声課金はありません。&lt;/li&gt;
&lt;li&gt;フラッグシップモデルは&lt;code&gt;grok-voice-think-fast-1.0&lt;/code&gt;です。最初の音声までの時間は&lt;strong&gt;1秒未満&lt;/strong&gt;で、xAIは最も近い競合製品より約&lt;strong&gt;5倍高速&lt;/strong&gt;と説明しています。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;28言語&lt;/strong&gt;で80以上のプリセット音声を利用できます。ボイスエージェント向けにはEve、Ara、Rex、Sal、Leoの5つの組み込みペルソナがあります。&lt;/li&gt;
&lt;li&gt;約&lt;strong&gt;1分間の音声&lt;/strong&gt;からカスタム音声をクローンできます。&lt;strong&gt;2分未満&lt;/strong&gt;で利用可能な&lt;code&gt;voice_id&lt;/code&gt;が返されます。&lt;/li&gt;
&lt;li&gt;WebSocketエンドポイントは次のとおりです。
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wss://api.x.ai/v1/realtime?model=grok-voice-think-fast-1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;TTS、STT、カスタムボイスは同じAPIサーフェスで扱えます。&lt;/li&gt;
&lt;li&gt;WebSocketセッションの再生、比較、デバッグには&lt;a href="https://apidog.com/download?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;

&lt;h2&gt;
  
  
  Grok Voiceが無料で提供するもの
&lt;/h2&gt;

&lt;p&gt;xAI ConsoleでAPIキーを発行すると、音声機能を追加料金なしで試せます。まず&lt;code&gt;console.x.ai&lt;/code&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%2Fzjkeqwamuyap7ndjjrwg.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%2Fzjkeqwamuyap7ndjjrwg.png" alt="Grok Voiceの機能と無料アクセス" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&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;テキスト読み上げ（TTS）&lt;/strong&gt;：28言語、80以上のプリセット音声。MP3または電話向けμ-lawで出力できます。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;音声認識（STT）&lt;/strong&gt;：25入力言語のストリーミングおよびバッチ転写。単語レベルのタイムスタンプと話者分離を利用できます。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;カスタムボイス&lt;/strong&gt;：短い音声サンプルから声をクローンし、返された&lt;code&gt;voice_id&lt;/code&gt;をTTSとボイスエージェントで再利用できます。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;注意点は、ボイスエージェントが推論にGrok 4.3を使う場合、その基盤トークン使用量はコンソールクレジットの対象になることです。プロトタイプ検証には無料クレジットを使えますが、本番利用ではプラン確認が必要です。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ1：コンソールキーを取得する
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;console.x.ai&lt;/code&gt;にアクセスし、Xアカウントでサインインします。&lt;strong&gt;API Keys&lt;/strong&gt;ページから、&lt;code&gt;voice&lt;/code&gt;と&lt;code&gt;chat&lt;/code&gt;スコープを有効にしたキーを作成します。&lt;/p&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="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;"xai-..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ブラウザアプリやモバイルアプリなど、クライアントに親キーを置けない場合は、サーバー側で一時トークンを発行します。コンソール設定または&lt;code&gt;/v1/realtime/sessions&lt;/code&gt;エンドポイントを使い、短命なトークンをクライアントに渡します。&lt;/p&gt;

&lt;p&gt;実装方針は次のとおりです。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;サーバーで&lt;code&gt;XAI_API_KEY&lt;/code&gt;を保持する。&lt;/li&gt;
&lt;li&gt;クライアントがセッション開始を要求する。&lt;/li&gt;
&lt;li&gt;サーバーが一時トークンを発行する。&lt;/li&gt;
&lt;li&gt;クライアントは一時トークンでWebSocketに接続する。&lt;/li&gt;
&lt;li&gt;親キーはサーバー外へ出さない。&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  ステップ2：音声を選択する
&lt;/h2&gt;

&lt;p&gt;Grok Voiceでは、プリセット音声またはカスタム音声を使います。&lt;/p&gt;

&lt;h3&gt;
  
  
  プリセット音声を使う
&lt;/h3&gt;

&lt;p&gt;ボイスエージェントには5つの名前付きペルソナがあります。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Eve&lt;/strong&gt;：女性、エネルギッシュ。明るいサポートフロー向け。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ara&lt;/strong&gt;：女性、温かい。一般的なアシスタント向け。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rex&lt;/strong&gt;：男性、自信がある。セールススクリプト向け。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sal&lt;/strong&gt;：ニュートラル、滑らか。ナレーションや長文読み上げ向け。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leo&lt;/strong&gt;：男性、権威的。コンプライアンスやフォーマルな案内向け。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TTS APIでは、より大きなプリセットライブラリを使えます。28言語、80以上の音声を&lt;code&gt;voice&lt;/code&gt;パラメーターで指定します。&lt;/p&gt;

&lt;h3&gt;
  
  
  カスタムボイスを作成する
&lt;/h3&gt;

&lt;p&gt;単一話者による約1分間のきれいなWAVファイルを用意します。ノイズ、BGM、複数話者は避けます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.x.ai/v1/custom-voices &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;-F&lt;/span&gt; &lt;span class="s2"&gt;"name=narrator-jane"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"language=en"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"audio=@sample.wav"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;成功すると&lt;code&gt;voice_id&lt;/code&gt;が返ります。このIDはTTSとボイスエージェントの両方で使えます。&lt;/p&gt;

&lt;p&gt;参照クリップの最大長は120秒ですが、長さよりも品質が重要です。静かな部屋で、一定の音量、単一話者、ワンテイクで録音してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ3：WebSocket経由でGrokに話させる
&lt;/h2&gt;

&lt;p&gt;ボイスエージェントはWebSocketセッションとして動作します。接続後にセッション設定を送り、入力音声を追加し、サーバーから返る音声イベントを処理します。&lt;/p&gt;

&lt;p&gt;最小構成のNode.jsクライアントは次のようになります。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;WebSocket&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ws&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WebSocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;wss://api.x.ai/v1/realtime?model=grok-voice-think-fast-1.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;open&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&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="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;session.update&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;voice&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ara&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You are a friendly support agent. Keep replies under two sentences.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;input_audio_format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pcm16&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;output_audio_format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pcm16&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;turn_detection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;server_vad&lt;/span&gt;&lt;span class="dl"&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="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;response.audio.delta&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stdout&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="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;base64&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;response.audio.done&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;response completed&lt;/span&gt;&lt;span class="dl"&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;ユーザー音声は、base64エンコードしたPCM16フレームを&lt;code&gt;input_audio_buffer.append&lt;/code&gt;イベントで送信します。&lt;/p&gt;

&lt;p&gt;概念的には次の流れです。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;input_audio_buffer.append&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;base64Pcm16Chunk&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;ul&gt;
&lt;li&gt;
&lt;code&gt;response.audio.delta&lt;/code&gt;：音声チャンク&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;response.audio.done&lt;/code&gt;：音声応答の完了&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;response.function_call_arguments.done&lt;/code&gt;：ツール呼び出し引数の確定&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;error&lt;/code&gt;：エラー&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ブラウザやデスクトップアプリでは24 kHz PCM16をデフォルトにすると扱いやすいです。電話システムにブリッジする場合はμ-lawを検討します。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ4：ツール使用を追加する
&lt;/h2&gt;

&lt;p&gt;ボイスエージェントは関数呼び出しをサポートしています。これにより、会話中に注文検索、予約確認、ユーザー情報取得などの社内APIを呼び出せます。&lt;/p&gt;

&lt;p&gt;セッション設定でツールを宣言します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;session.update&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;tools&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="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;function&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lookup_order&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Look up the status of a customer order by order number.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&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="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;order_id&lt;/span&gt;&lt;span class="dl"&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="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;モデルがツールを呼び出す場合、&lt;code&gt;response.function_call_arguments.done&lt;/code&gt;イベントを発行します。アプリ側では次の処理を行います。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;イベントから関数名と引数を取り出す。&lt;/li&gt;
&lt;li&gt;自分のAPIまたはDBを呼び出す。&lt;/li&gt;
&lt;li&gt;結果を&lt;code&gt;conversation.item.create&lt;/code&gt;で返す。&lt;/li&gt;
&lt;li&gt;モデルが会話を再開し、音声で回答する。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ツール結果を返す例です。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;conversation.item.create&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;function_call_output&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;call_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;call_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;shipped&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;eta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Friday&lt;/span&gt;&lt;span class="dl"&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;組み込みの&lt;code&gt;web_search&lt;/code&gt;ツールも利用できます。独自の検索レイヤーを実装せずに、新しい情報を使って回答を補強したい場合に有効です。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ5：エージェントなしでTTSを使用する
&lt;/h2&gt;

&lt;p&gt;会話エージェントが不要で、アプリ内アナウンス、音声プロンプト、ポッドキャストイントロなどの読み上げだけが必要な場合は、RESTのTTSエンドポイントを使います。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.x.ai/v1/tts &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-tts-1",
    "voice": "ara",
    "input": "Welcome back to your account. Your last login was Tuesday at 3pm.",
    "format": "mp3"
  }'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; greeting.mp3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;出力フォーマットは次のように使い分けます。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;mp3&lt;/code&gt;：アプリ、Web、ナレーション向け&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mulaw&lt;/code&gt;：8 kHz、電話回線向け&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TTSエンドポイントは同期式です。WebSocketセッションを作成する必要はなく、レスポンスとして音声バイトが返ります。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ6：Apidogで全フローをテストする
&lt;/h2&gt;

&lt;p&gt;WebSocket APIはステートフルなため、ターミナルだけで検証するとイベントの追跡が難しくなります。&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;を使うと、WebSocketメッセージを保存、再生、比較できます。&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%2Fi62iow0zbhkz10jerr2c.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%2Fi62iow0zbhkz10jerr2c.png" alt="ApidogでのWebSocketテストフローを示すスクリーンショット" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;検証手順は次のとおりです。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;新しいWebSocketリクエストを作成する。&lt;/li&gt;
&lt;li&gt;URLに次を設定する。
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wss://api.x.ai/v1/realtime?model=grok-voice-think-fast-1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;環境変数に&lt;code&gt;XAI_API_KEY&lt;/code&gt;を保存する。&lt;/li&gt;
&lt;li&gt;Authorizationヘッダーを設定する。
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Authorization: Bearer {{XAI_API_KEY}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;送信メッセージとして&lt;code&gt;session.update&lt;/code&gt;を保存する。&lt;/li&gt;
&lt;li&gt;フィクスチャ音声を&lt;code&gt;input_audio_buffer.append&lt;/code&gt;として送る。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;response.create&lt;/code&gt;を送信して応答を開始する。&lt;/li&gt;
&lt;li&gt;返ってくるイベントをツリーで確認する。&lt;/li&gt;
&lt;li&gt;音声、プロンプト、ツール定義を変えて再実行し、結果を比較する。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidogをダウンロード&lt;/a&gt;すれば、TTSとSTTのRESTリクエストも同じプロジェクトで管理できます。ステートフルAPIのテスト設計については、&lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;QAエンジニア向けのAPIテストツール&lt;/a&gt;も参考になります。&lt;/p&gt;

&lt;h2&gt;
  
  
  無料枠の制限
&lt;/h2&gt;

&lt;p&gt;xAI Consoleでは音声機能自体に1分あたりまたはトークンあたりの料金はありません。ただし、開発時に意識すべき制限があります。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;レート制限&lt;/strong&gt;：悪用防止のため、各エンドポイントには1分あたりのリクエスト上限があります。開発やデモには十分ですが、本番負荷テストでは上限に注意してください。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;カスタム音声クォータ&lt;/strong&gt;：1アカウントが保持できるカスタム音声クローン数には上限があります。不要な音声を削除してスロットを空けられます。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;推論トークン&lt;/strong&gt;：ボイスエージェントがGrok 4.3で推論する場合、コンソールクレジットの対象になります。無料クレジットはプロトタイプ向けであり、本番では有料プランの確認が必要です。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;レート制限に当たる場合は、リクエストのバッチ化、リトライ間隔の調整、有料ティアへの移行を検討します。APIの呼び出し形式は変わらず、主に上限が変わります。&lt;/p&gt;

&lt;h2&gt;
  
  
  音声を比較する
&lt;/h2&gt;

&lt;p&gt;本番投入前に、同じテキストを複数の音声で読み上げて比較します。音声ごとにトーンの解釈が異なるため、短いテストセットを用意するとミスマッチを早く見つけられます。&lt;/p&gt;

&lt;p&gt;最低限、次の3種類を試してください。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2文の挨拶&lt;/li&gt;
&lt;li&gt;確認フレーズ（例：「承知いたしました、すべて設定済みです」）&lt;/li&gt;
&lt;li&gt;数字、日付、コンマを含む長い文&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;さらに、同じプロンプトを次の3つの指示で読み上げると、イントネーションの差を確認できます。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;落ち着いて&lt;/li&gt;
&lt;li&gt;通常&lt;/li&gt;
&lt;li&gt;緊急&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Grokのプリセット音声は、ベンチマークした多くのTTSエンジンよりもこの変化を扱いやすいですが、本番前には必ずユースケースごとに聴取テストを行ってください。&lt;/p&gt;

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

&lt;h3&gt;
  
  
  APIは本当に無料ですか？隠れた上限はありますか？
&lt;/h3&gt;

&lt;p&gt;音声機能（TTS、STT、ボイスエージェント、カスタムボイス）には、コンソール上で1分あたりまたはトークンあたりの音声課金はありません。ただし、ボイスエージェントが使う基盤推論モデルはコンソールクレジットの対象です。無料クレジットはプロトタイピングには十分ですが、本番利用ではプラン確認が必要です。&lt;/p&gt;

&lt;h3&gt;
  
  
  X（Twitter）アカウントは必要ですか？
&lt;/h3&gt;

&lt;p&gt;はい。xAI ConsoleへのサインインにはXアカウントを使用します。&lt;/p&gt;

&lt;h3&gt;
  
  
  ブラウザからGrok Voiceを使用できますか？
&lt;/h3&gt;

&lt;p&gt;はい。一時トークンを使えば可能です。サーバー側で&lt;code&gt;/v1/realtime/sessions&lt;/code&gt;から短命なトークンを発行し、そのトークンをブラウザに渡してWebSocket接続します。親APIキーはサーバー外に出しません。&lt;/p&gt;

&lt;h3&gt;
  
  
  どのような音質を期待できますか？
&lt;/h3&gt;

&lt;p&gt;TTS出力は高音質MP3または8 kHz μ-lawです。ボイスエージェントは内部で24 kHz PCM16を使用します。音質は主要な商用TTSエンジンと同等であり、レイテンシーが大きな差別化要因です。&lt;/p&gt;

&lt;h3&gt;
  
  
  電話回線で動作しますか？
&lt;/h3&gt;

&lt;p&gt;はい。μ-law出力はSIPおよびPSTNブリッジで一般的なフォーマットです。ただし、SIPプロバイダーは別途必要です。xAIは現在、独自のSIPゲートウェイを提供していません。&lt;/p&gt;

&lt;h3&gt;
  
  
  他のツールと比較してクローン品質はどうですか？
&lt;/h3&gt;

&lt;p&gt;クローン品質は、音声の長さより参照オーディオの品質に強く依存します。静かな部屋で録音したきれいな60秒のサンプルは、ノイズの多い120秒のサンプルより良い結果になりやすいです。生成された&lt;code&gt;voice_id&lt;/code&gt;は、再クローンなしでTTSとボイスエージェントの両方に使えます。&lt;/p&gt;

&lt;h3&gt;
  
  
  Grok VoiceをゲームのAIキャラクターに使用できますか？
&lt;/h3&gt;

&lt;p&gt;はい。TTSエンドポイントはランタイム生成に使えます。カスタムボイスを使えば、キャラクターごとに異なる声を持たせられます。長いセリフではレイテンシーに注意し、必要に応じてテキストをチャンク化して生成します。&lt;/p&gt;

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

&lt;p&gt;Grok Voiceは、リアルタイムボイスエージェントを試すための実装しやすい選択肢です。xAI Consoleでは音声機能自体に1分あたりの料金がなく、プリセット音声、TTS、STT、カスタムボイス、WebSocketベースの会話セッションを一通り検証できます。&lt;/p&gt;

&lt;p&gt;最短の検証手順は次のとおりです。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;xAI ConsoleでAPIキーを作る。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;grok-voice-think-fast-1.0&lt;/code&gt;にWebSocket接続する。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;session.update&lt;/code&gt;で音声と指示を設定する。&lt;/li&gt;
&lt;li&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;/ol&gt;

&lt;p&gt;Grok 4.3の推論APIと組み合わせる場合は、&lt;a href="http://apidog.com/blog/how-to-use-grok-4-3-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Grok 4.3 APIガイド&lt;/a&gt;を参照してください。OpenAIのスタックと比較したい場合は、&lt;a href="http://apidog.com/blog/grok-voice-vs-gpt-realtime-best-voice-model?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Grok Voice vs GPT-Realtime&lt;/a&gt;が参考になります。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>GPT-Realtime-2とは？APIの使い方</title>
      <dc:creator>Akira</dc:creator>
      <pubDate>Fri, 08 May 2026 07:23:57 +0000</pubDate>
      <link>https://forem.com/aakira/gpt-realtime-2tohaapinoshi-ifang-3i28</link>
      <guid>https://forem.com/aakira/gpt-realtime-2tohaapinoshi-ifang-3i28</guid>
      <description>&lt;p&gt;OpenAIは2026年11月6日に新世代の音声モデルを発表しました。中心となるのは、GPT-5クラスの推論、128,000トークンのコンテキストウィンドウ、回答品質とレイテンシを調整できる推論エフォートを備えた音声対音声モデル「GPT-Realtime-2」です。既存のRealtime APIサーフェス上で動作するため、すでに &lt;code&gt;gpt-realtime&lt;/code&gt; を使っている場合は、モデルIDの変更と一部フィールド追加で移行できます。&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;この記事では、GPT-Realtime-2の変更点、料金、WebSocket/SIPでの呼び出し方法、そして毎回音声を録音し直さずにRealtimeセッションを再生・比較できるよう、&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;/p&gt;

&lt;p&gt;OpenAIの2026年モデルライン全体を把握したい場合は、&lt;a href="http://apidog.com/blog/what-is-gpt-5-5?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;GPT-5.5とは&lt;/a&gt;を参照してください。マルチモーダルな兄弟モデルについては、&lt;a href="http://apidog.com/blog/how-to-use-gpt-image-2-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;GPT-Image-2 APIの使用方法&lt;/a&gt;も参考になります。&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GPT-Realtime-2は、OpenAIの主力音声対音声モデルです。&lt;/li&gt;
&lt;li&gt;GPT-5クラスの推論、128kコンテキスト、最大32k出力トークンを備えています。&lt;/li&gt;
&lt;li&gt;音声料金は、入力100万トークンあたり &lt;strong&gt;$32&lt;/strong&gt;、出力100万トークンあたり &lt;strong&gt;$64&lt;/strong&gt; です。キャッシュ済み入力は $0.40/100万トークンです。&lt;/li&gt;
&lt;li&gt;新音声は &lt;strong&gt;Cedar&lt;/strong&gt; と &lt;strong&gt;Marin&lt;/strong&gt;。どちらもRealtime API専用です。&lt;/li&gt;
&lt;li&gt;推論エフォートは &lt;code&gt;minimal&lt;/code&gt;、&lt;code&gt;low&lt;/code&gt;、&lt;code&gt;medium&lt;/code&gt;、&lt;code&gt;high&lt;/code&gt;、&lt;code&gt;xhigh&lt;/code&gt; の5段階です。デフォルトはレイテンシ優先の &lt;code&gt;low&lt;/code&gt; です。&lt;/li&gt;
&lt;li&gt;WebSocketでは &lt;code&gt;wss://api.openai.com/v1/realtime?model=gpt-realtime-2&lt;/code&gt; に接続します。&lt;/li&gt;
&lt;li&gt;SIPでは着信通話をRealtimeセッションに接続できます。&lt;/li&gt;
&lt;li&gt;同時リリースとして、ライブ翻訳用の &lt;strong&gt;GPT-Realtime-Translate&lt;/strong&gt; と、ストリーミングSTT用の &lt;strong&gt;GPT-Realtime-Whisper&lt;/strong&gt; があります。&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;を使うと、WebSocketセッションのスクリプト化、フレームのキャプチャ、実行間の比較ができます。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  GPT-Realtime-2とは？
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://openai.com/index/advancing-voice-intelligence-with-new-models-in-the-api/" rel="noopener noreferrer"&gt;GPT-Realtime-2&lt;/a&gt;は、音声を入力し、音声を出力するエンドツーエンドの音声対音声モデルです。&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;STT → LLM → TTS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;という3段パイプラインを組むのではなく、モデルが以下を一度に処理します。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;音声入力の理解&lt;/li&gt;
&lt;li&gt;文字起こし相当の処理&lt;/li&gt;
&lt;li&gt;推論&lt;/li&gt;
&lt;li&gt;ツール選択&lt;/li&gt;
&lt;li&gt;音声生成&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;gpt-realtime&lt;/code&gt; が置き換えた旧来のパイプラインを、GPT-Realtime-2ではより強力な推論コアで拡張しています。&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%2F05%2Fimage-18.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%2F05%2Fimage-18.png" alt="" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GPT-Realtime-2は、入力としてテキスト、音声、画像を受け取り、出力としてテキストと音声を返します。今回の重要な追加点は画像入力です。&lt;/p&gt;

&lt;p&gt;たとえば、ライブ会話中にユーザーがスクリーンショットを送信し、音声で「このエラーは何ですか？」と質問できます。モデルは画面内容を見たうえで、音声で回答を継続できます。&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;モデルID&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gpt-realtime-2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;コンテキストウィンドウ&lt;/td&gt;
&lt;td&gt;128,000トークン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;最大出力&lt;/td&gt;
&lt;td&gt;32,000トークン&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;テキスト、音声&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;知識カットオフ&lt;/td&gt;
&lt;td&gt;2024年9月30日&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;推論レベル&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;minimal&lt;/code&gt;, &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt;, &lt;code&gt;xhigh&lt;/code&gt;
&lt;/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;リモートMCPサーバー&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;画像入力&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SIP電話発信&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  gpt-realtimeからの変更点
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;gpt-realtime-1.5&lt;/code&gt; と比較すると、GPT-Realtime-2では音声理解と指示追従性が改善されています。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Big Bench Audio（音声インテリジェンス）&lt;/strong&gt;: 81.4% → 96.6%&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audio MultiChallenge（指示の追従性）&lt;/strong&gt;: 34.7% → 48.5%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;これらのスコアは &lt;code&gt;high&lt;/code&gt; および &lt;code&gt;xhigh&lt;/code&gt; 推論で記録されています。本番環境のデフォルトはレイテンシ優先の &lt;code&gt;low&lt;/code&gt; なので、実運用では品質と応答速度のバランスを見ながら調整します。&lt;/p&gt;

&lt;p&gt;実装上、特に重要な変更は次の4つです。&lt;/p&gt;

&lt;h3&gt;
  
  
  1. プレアンブル
&lt;/h3&gt;

&lt;p&gt;モデルは、本回答の前に短いフィラーを発話できます。&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;確認します。
少しお待ちください。
それでは見てみます。
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;これにより、ツール実行や推論中の無音時間をユーザーに感じさせにくくなります。&lt;/p&gt;

&lt;h3&gt;
  
  
  2. 音声ナレーション付きの並列ツール呼び出し
&lt;/h3&gt;

&lt;p&gt;モデルは複数の関数を並列に呼び出しながら、処理状況を音声で説明できます。&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;残高と直近の取引を確認しています。
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;これにより、ツール実行中に2〜3秒沈黙するような体験を避けやすくなります。&lt;/p&gt;

&lt;h3&gt;
  
  
  3. 回復性能の向上
&lt;/h3&gt;

&lt;p&gt;曖昧な発話、途中で遮られた発話、部分的に失敗したターンを、会話全体をリセットせずに処理しやすくなっています。&lt;/p&gt;

&lt;h3&gt;
  
  
  4. ドメインごとのトーン制御
&lt;/h3&gt;

&lt;p&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%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-19.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%2F05%2Fimage-19.png" alt="" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;コンテキストは32kから128kトークンに拡張されました。銀行業務、カスタマーサポート、チュータリングなど、長時間の音声セッションを扱うユースケースで特に有効です。&lt;/p&gt;

&lt;h2&gt;
  
  
  料金
&lt;/h2&gt;

&lt;p&gt;GPT-Realtime-2はトークン単位で課金されます。テキスト、音声、画像で料金が異なります。&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;テキスト&lt;/td&gt;
&lt;td&gt;$4.00 / 100万&lt;/td&gt;
&lt;td&gt;$0.40 / 100万&lt;/td&gt;
&lt;td&gt;$24.00 / 100万&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;音声&lt;/td&gt;
&lt;td&gt;$32.00 / 100万&lt;/td&gt;
&lt;td&gt;$0.40 / 100万&lt;/td&gt;
&lt;td&gt;$64.00 / 100万&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;画像&lt;/td&gt;
&lt;td&gt;$5.00 / 100万&lt;/td&gt;
&lt;td&gt;$0.50 / 100万&lt;/td&gt;
&lt;td&gt;該当なし&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;キャッシュ済み入力は、繰り返し使うコンテキストのコストを大きく下げます。安定したシステムプロンプト、共通FAQ、再利用されるドキュメントを持つエージェントでは、キャッシュを活用する設計にしておくべきです。&lt;/p&gt;

&lt;p&gt;OpenAIラインの他モデルとの比較は、&lt;a href="http://apidog.com/blog/gpt-5-5-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;GPT-5.5の料金&lt;/a&gt;を参照してください。&lt;/p&gt;

&lt;p&gt;コンパニオンモデルは分単位で課金されます。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GPT-Realtime-Translate&lt;/strong&gt;: $0.034/分。70の入力言語と13の出力言語に対応。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPT-Realtime-Whisper&lt;/strong&gt;: $0.017/分。ライブキャプションや連続文字起こし向けのストリーミング音声認識。&lt;/li&gt;
&lt;/ul&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;音声で会話し、推論し、ツールも使う&lt;/td&gt;
&lt;td&gt;GPT-Realtime-2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ライブ多言語通訳&lt;/td&gt;
&lt;td&gt;GPT-Realtime-Translate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;文字起こしのみ&lt;/td&gt;
&lt;td&gt;GPT-Realtime-Whisper&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  エンドポイントと認証
&lt;/h2&gt;

&lt;p&gt;GPT-Realtime-2は複数のAPIサーフェスで公開されています。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST https://api.openai.com/v1/chat/completions
POST https://api.openai.com/v1/responses
WSS  wss://api.openai.com/v1/realtime?model=gpt-realtime-2
WSS  wss://api.openai.com/v1/realtime?call_id={call_id}   # SIP用
POST https://api.openai.com/v1/realtime/translations
POST https://api.openai.com/v1/realtime/transcription_sessions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;音声エージェントを実装する場合は、通常WebSocketエンドポイントを使います。&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;Authorization: Bearer $OPENAI_API_KEY
OpenAI-Beta: realtime=v1
&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 shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sk-proj-..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  WebSocket経由で接続する
&lt;/h2&gt;

&lt;p&gt;最小構成のNode.jsクライアントは次のようになります。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;WebSocket&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ws&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WebSocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;wss://api.openai.com/v1/realtime?model=gpt-realtime-2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;OpenAI-Beta&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;realtime=v1&lt;/span&gt;&lt;span class="dl"&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="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;open&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&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="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;session.update&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;voice&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cedar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;あなたはフィンテックアプリのフレンドリーなサポートエージェントです。&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;input_audio_format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pcm16&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;output_audio_format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pcm16&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;turn_detection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;server_vad&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;reasoning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;effort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;low&lt;/span&gt;&lt;span class="dl"&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="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;response.audio.delta&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// base64 PCM16オーディオチャンク。&lt;/span&gt;
    &lt;span class="c1"&gt;// 実運用ではスピーカー、ブラウザ、または音声ストリームへ渡す。&lt;/span&gt;
    &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stdout&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="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;base64&lt;/span&gt;&lt;span class="dl"&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;Realtime APIはイベント駆動です。&lt;/p&gt;

&lt;p&gt;基本フローは次のようになります。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;WebSocketに接続する&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;session.update&lt;/code&gt; で音声、プロンプト、音声フォーマット、VAD、推論エフォートを設定する&lt;/li&gt;
&lt;li&gt;ユーザー音声を &lt;code&gt;input_audio_buffer.append&lt;/code&gt; で送る&lt;/li&gt;
&lt;li&gt;必要に応じて &lt;code&gt;response.create&lt;/code&gt; を送る&lt;/li&gt;
&lt;li&gt;サーバーから &lt;code&gt;response.audio.delta&lt;/code&gt; を受け取り、再生する&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;24 kHzのPCM16は安全なデフォルトです。電話システムにブリッジする場合は、G.711 mu-lawおよびA-lawも重要です。&lt;/p&gt;

&lt;p&gt;Pythonで実装する場合、&lt;code&gt;openai&lt;/code&gt; SDK &lt;code&gt;&amp;gt;= 2.1.0&lt;/code&gt; の &lt;code&gt;realtime&lt;/code&gt; クライアントで同じイベント名を扱えます。RealtimeサーフェスとResponses APIを比較したい場合は、&lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;GPT-5.5 APIの使用方法&lt;/a&gt;を参照してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  音声
&lt;/h2&gt;

&lt;p&gt;このリリースでは2つの新しい音声が追加されています。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cedar&lt;/strong&gt;: 暖かい中音域の男性声。一般的なエージェントのデフォルトに向いています。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Marin&lt;/strong&gt;: 明るくクリアな女性声。翻訳やアナウンスに向いています。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;どちらもRealtime API専用です。&lt;/p&gt;

&lt;p&gt;既存の8つの音声も引き続き利用できます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;alloy
ash
ballad
coral
echo
sage
shimmer
verse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;セッション中に音声を切り替える場合は、&lt;code&gt;voice&lt;/code&gt; を含む &lt;code&gt;session.update&lt;/code&gt; を再送します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;session.update&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;voice&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;marin&lt;/span&gt;&lt;span class="dl"&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;h2&gt;
  
  
  画像入力
&lt;/h2&gt;

&lt;p&gt;GPT-Realtime-2では、任意のユーザーターンに画像を添付できます。&lt;/p&gt;

&lt;p&gt;たとえば、スクリーンショットを送って「このエラーは何を意味しますか？」と聞く場合は次のようにします。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;conversation.item.create&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&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="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;input_image&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;image_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://example.com/screenshot.png&lt;/span&gt;&lt;span class="dl"&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="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;input_text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;このエラーは何を意味しますか？&lt;/span&gt;&lt;span class="dl"&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="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;response.create&lt;/span&gt;&lt;span class="dl"&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;ul&gt;
&lt;li&gt;
&lt;strong&gt;音声駆動QA&lt;/strong&gt;: テスターが壊れたUIのスクリーンショットを送り、エージェントが問題を音声で説明する。&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;画像モデル全体については、&lt;a href="http://apidog.com/blog/how-to-use-gpt-image-2-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;GPT-Image-2 APIの使用方法&lt;/a&gt;を参照してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  関数呼び出しとMCP
&lt;/h2&gt;

&lt;p&gt;GPT-Realtime-2は、標準の関数ツールとリモートMCPサーバーの両方を同じセッションで扱えます。&lt;/p&gt;

&lt;p&gt;標準の関数呼び出しは、チャット補完と同じ考え方です。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;session.update&lt;/code&gt; でツールを宣言する&lt;/li&gt;
&lt;li&gt;モデルが &lt;code&gt;response.function_call_arguments.delta&lt;/code&gt; を発行する&lt;/li&gt;
&lt;li&gt;クライアント側で関数を実行する&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;conversation.item.create&lt;/code&gt; で &lt;code&gt;function_call_output&lt;/code&gt; を返す&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;GPT-Realtime-2では、複数の関数を並列に呼び出しながら、音声で進行状況を説明できます。&lt;/p&gt;

&lt;p&gt;リモートMCPサーバーを使う場合は、MCP URLと許可するツールをセッションに設定します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;session.update&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mcp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;server_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://mcp.example.com/sse&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;allowed_tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lookup_account&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;list_transactions&lt;/span&gt;&lt;span class="dl"&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;MCPを使うと、クライアント側で関数呼び出しのイベントループをすべて処理する必要がなくなります。音声エージェントが多数のツールを持つ場合でも、応答性を保ちやすくなります。&lt;/p&gt;

&lt;p&gt;音声エージェントに組み込む前にMCPサーバーを検証する場合は、&lt;a href="http://apidog.com/blog/mcp-server-testing-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ApidogでのMCPサーバーテスト&lt;/a&gt;の手順が参考になります。&lt;/p&gt;

&lt;h2&gt;
  
  
  SIP電話発信
&lt;/h2&gt;

&lt;p&gt;GPT-Realtime-2は、実際の電話通話にも接続できます。&lt;/p&gt;

&lt;p&gt;SIPトランクをOpenAIのSIPゲートウェイに向けると、着信通話に対して次のWebSocketセッションを開きます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wss://api.openai.com/v1/realtime?call_id={call_id}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;モデルはG.711 mu-lawおよびA-lawを直接受け付けるため、ブリッジ側で必ずしもトランスコードする必要はありません。&lt;/p&gt;

&lt;p&gt;これは、ブラウザデモではなくコールセンター向け音声エージェントを構築する場合に重要です。電話エージェントの多くは、実際にはツールディスパッチが中心です。並列ツール呼び出しやMCPと組み合わせることで、通話中に必要なデータ取得と回答をまとめて実装できます。&lt;/p&gt;

&lt;h2&gt;
  
  
  推論レベル
&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;minimal&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;単一ターンのYes/No回答&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;low&lt;/code&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;code&gt;medium&lt;/code&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;code&gt;high&lt;/code&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;code&gt;xhigh&lt;/code&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;本番導入時は、まず &lt;code&gt;low&lt;/code&gt; から始めるのが現実的です。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;reasoning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;effort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;low&lt;/span&gt;&lt;span class="dl"&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;code&gt;medium&lt;/code&gt;、&lt;code&gt;high&lt;/code&gt;、&lt;code&gt;xhigh&lt;/code&gt; に上げます。&lt;code&gt;high&lt;/code&gt; 以上では、ユーザーが通話中に待ち時間を感じる可能性があります。&lt;/p&gt;

&lt;h2&gt;
  
  
  ApidogでRealtime APIをテストする
&lt;/h2&gt;

&lt;p&gt;WebSocket APIは状態を持つため、ターミナルだけでデバッグすると再現性が下がります。Apidogを使うと、Realtimeセッションを保存・再生・比較できます。&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%2F05%2Fimage-20.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%2F05%2Fimage-20.png" alt="" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;実装時の基本手順は次のとおりです。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;新しいWebSocketリクエストを作成する&lt;/li&gt;
&lt;li&gt;URLに &lt;code&gt;wss://api.openai.com/v1/realtime?model=gpt-realtime-2&lt;/code&gt; を設定する&lt;/li&gt;
&lt;li&gt;認証にBearerトークンを設定する&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;OpenAI-Beta: realtime=v1&lt;/code&gt; ヘッダーを追加する&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;session.update&lt;/code&gt;、&lt;code&gt;input_audio_buffer.append&lt;/code&gt;、&lt;code&gt;response.create&lt;/code&gt; のJSONメッセージを順番に登録する&lt;/li&gt;
&lt;li&gt;単一接続に対して再生する&lt;/li&gt;
&lt;li&gt;サーバーイベントをツリーで確認する&lt;/li&gt;
&lt;li&gt;推論エフォートや音声を変えて、実行結果を比較する&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidogをダウンロード&lt;/a&gt;したら、HTTP APIと同じように環境変数を管理できます。&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;OPENAI_API_KEY=sk-proj-...
voice=cedar
reasoning_effort=low
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;比較対象として別の高速マルチモーダルモデルも確認したい場合は、&lt;a href="http://apidog.com/blog/how-to-use-gemini-3-flash-preview-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Gemini 3 Flash Preview APIの使用方法&lt;/a&gt;を参照してください。&lt;/p&gt;

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

&lt;h3&gt;
  
  
  どのモデルIDを渡せばよいですか？
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;gpt-realtime-2&lt;/code&gt; です。&lt;/p&gt;

&lt;p&gt;ロールバックが必要な場合、以前のモデルは &lt;code&gt;gpt-realtime&lt;/code&gt; として利用可能です。軽量版として &lt;code&gt;gpt-realtime-2-mini&lt;/code&gt; もライブです。&lt;/p&gt;

&lt;h3&gt;
  
  
  出力音声が再生されている間に入力音声をストリーミングできますか？
&lt;/h3&gt;

&lt;p&gt;はい。Realtime APIはデフォルトでサーバーサイドの音声活動検出（VAD）を使います。&lt;/p&gt;

&lt;p&gt;ユーザーが話し始めると、モデルは発話を停止できます。VADを無効にして、クライアント側で会話境界を制御することもできます。&lt;/p&gt;

&lt;h3&gt;
  
  
  128kのコンテキストには音声トークンも含まれますか？
&lt;/h3&gt;

&lt;p&gt;はい。音声もトークン化されます。&lt;/p&gt;

&lt;p&gt;フォーマットにもよりますが、1秒の音声は約50トークンです。長いサポート通話は、長いテキストチャットよりも早くコンテキストを消費する可能性があります。&lt;/p&gt;

&lt;h3&gt;
  
  
  ファインチューニングはサポートされていますか？
&lt;/h3&gt;

&lt;p&gt;まだです。&lt;/p&gt;

&lt;p&gt;モデルカードによると、GPT-Realtime-2はまだファインチューニング、予測出力、チャット補完におけるテキストストリーミングをサポートしていません。Realtimeエンドポイントは本質的に音声をストリーミングします。&lt;/p&gt;

&lt;h3&gt;
  
  
  TTSを接続したGPT-5.5と何が違いますか？
&lt;/h3&gt;

&lt;p&gt;GPT-Realtime-2は、音声を直接理解するエンドツーエンドの音声モデルです。&lt;/p&gt;

&lt;p&gt;TTS付きのテキストモデルでは、ユーザーのトーン、ためらい、強調などを扱いにくくなります。ユーザーが「何を言ったか」だけでなく「どう話したか」に反応する必要があるなら、GPT-Realtime-2が適しています。&lt;/p&gt;

&lt;p&gt;純粋なテキスト推論には、&lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;GPT-5.5 APIの使用方法&lt;/a&gt;を参照してください。&lt;/p&gt;

&lt;h3&gt;
  
  
  どのレート制限が適用されますか？
&lt;/h3&gt;

&lt;p&gt;ティア1は毎分40,000トークンから始まり、ティア5では15M TPMまでスケールします。レート制限はモデルごとなので、既存のGPT-5クォータは引き継がれません。&lt;/p&gt;

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

&lt;p&gt;GPT-Realtime-2は、音声エージェントとテキストエージェントの差を縮めるモデルです。128kコンテキスト、GPT-5クラスの推論、画像入力、ネイティブMCP、SIPサポートにより、電話を受け、スクリーンショットを見て、リモートツールを呼び出し、会話の失敗から回復する音声エージェントをWebSocketベースで構築できます。&lt;/p&gt;

&lt;p&gt;本番導入では、まず次の流れがおすすめです。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ApidogでWebSocketセッションをスクリプト化する&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;session.update&lt;/code&gt; の設定を固定する&lt;/li&gt;
&lt;li&gt;ツールリストを確定する&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;low&lt;/code&gt; 推論から開始する&lt;/li&gt;
&lt;li&gt;品質差を計測できた場合だけ推論レベルを上げる&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;音声トークンの料金は入力 $32/100万、出力 $64/100万です。安定したシステムプロンプトや再利用コンテキストがある場合は、キャッシュ済み入力を活用してコストを抑える設計にしておきましょう。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>2026年 おすすめローカルLLM</title>
      <dc:creator>Akira</dc:creator>
      <pubDate>Fri, 08 May 2026 06:39:30 +0000</pubDate>
      <link>https://forem.com/aakira/2026nian-osusumerokarullm-19gi</link>
      <guid>https://forem.com/aakira/2026nian-osusumerokarullm-19gi</guid>
      <description>&lt;p&gt;2026年にローカルLLMを選ぶときは、「どのモデルが最強か」ではなく、VRAM、レイテンシー、用途（コーディング、推論、多言語、ビジョン、ツール呼び出し）から逆算するのが実装上の近道です。この記事では、ローカルで動かす価値のあるLLMを選び、Ollama / vLLM / LM StudioでOpenAI互換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;でテスト・リプレイ・モックする手順まで整理します。&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;ul&gt;
&lt;li&gt;2026年における「最高の」ローカルLLMは、VRAM予算、レイテンシー目標、ユースケースによって変わります。&lt;/li&gt;
&lt;li&gt;24GB GPUでは、&lt;strong&gt;Qwen 3.6 32B&lt;/strong&gt;と&lt;strong&gt;DeepSeek V4 Flash&lt;/strong&gt;が有力なオールラウンダーです。&lt;/li&gt;
&lt;li&gt;8GB以下のGPUでは、&lt;strong&gt;Gemma 4 9B&lt;/strong&gt;と&lt;strong&gt;Llama 5.1 8B&lt;/strong&gt;が扱いやすい選択肢です。&lt;/li&gt;
&lt;li&gt;推論またはコーディング重視なら、量子化された&lt;strong&gt;DeepSeek V4 Pro&lt;/strong&gt;または&lt;strong&gt;GLM 5&lt;/strong&gt;が候補になります。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama&lt;/strong&gt;または&lt;strong&gt;LM Studio&lt;/strong&gt;を使うと、OpenAI互換のHTTPエンドポイントとして公開できます。&lt;/li&gt;
&lt;li&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;でテストできます。&lt;/li&gt;
&lt;li&gt;Apidogを使うと、ホスト型LLMのトークン予算を消費せずに、ローカルモデルのトラフィックをモック、リプレイ、ベンチマークできます。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;すでにDeepSeek V4に絞って検証している場合は、&lt;a href="http://apidog.com/blog/how-to-run-deepseek-v4-locally?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;DeepSeek V4ローカルインストールガイド&lt;/a&gt;と&lt;a href="http://apidog.com/blog/what-is-deepseek-v4?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;DeepSeek V4概要&lt;/a&gt;も参考になります。&lt;/p&gt;

&lt;h2&gt;
  
  
  2026年にローカルLLMが再び重要になる理由
&lt;/h2&gt;

&lt;p&gt;数年前まで、ローカルLLMは「品質が低いが安い」選択肢でした。現在は状況が変わっています。オープンウェイトモデルはホスト型GPT-4クラスのシステムに近づき、推論、コーディング、分類、抽出、ツール呼び出しでは実用上十分な精度を出せるケースが増えています。&lt;/p&gt;

&lt;p&gt;もう一つの変化はハードウェアです。24GBのコンシューマーGPUで32Bクラスの4ビット量子化モデルを実行でき、64GB以上のユニファイドメモリを搭載したMacでも実用的なローカル推論が可能です。&lt;/p&gt;

&lt;p&gt;ローカルLLMを採用する主な理由は次のとおりです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;データを外部APIに送信したくない&lt;/li&gt;
&lt;li&gt;推論コストを固定化したい&lt;/li&gt;
&lt;li&gt;ベンダーロックインを避けたい&lt;/li&gt;
&lt;li&gt;CIや開発環境で決定論的にLLM APIをテストしたい&lt;/li&gt;
&lt;li&gt;モデルのバージョンや量子化方式を自分たちで制御したい&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ただし、モデルが動くだけでは不十分です。本番アプリケーションでは、ローカルモデルもHTTP APIとして扱い、リクエスト形式、レスポンス形式、ツール呼び出し、ストリーミング、エラー時の挙動を検証する必要があります。&lt;/p&gt;

&lt;h2&gt;
  
  
  モデル選定の基準
&lt;/h2&gt;

&lt;p&gt;このリストは、単純なリーダーボード順位ではなく、実装しやすさを重視して選んでいます。&lt;/p&gt;

&lt;p&gt;確認した観点は次のとおりです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;商用利用を許可するライセンスまたはコミュニティライセンスであること&lt;/li&gt;
&lt;li&gt;2026年時点でメンテナンスが継続していること&lt;/li&gt;
&lt;li&gt;Ollama、vLLM、LM StudioのいずれかでOpenAI互換APIとして公開できること&lt;/li&gt;
&lt;li&gt;推論、コード、多言語、ビジョン、長文コンテキスト、ツール呼び出しのいずれかに強みがあること&lt;/li&gt;
&lt;li&gt;一般的な開発者が入手できるハードウェアで実行可能な構成があること&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;比較には、&lt;a href="https://chat.lmsys.org/" rel="noopener noreferrer"&gt;LMSYSアリーナ&lt;/a&gt;と&lt;a href="https://huggingface.co/spaces/open-llm-leaderboard/open_llm_leaderboard" rel="noopener noreferrer"&gt;Hugging Face Open LLM Leaderboard&lt;/a&gt;も参照しています。&lt;/p&gt;

&lt;h2&gt;
  
  
  2026年に実行する価値のあるローカルLLM
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. DeepSeek V4 Pro
&lt;/h3&gt;

&lt;p&gt;DeepSeek V4 Proは、DeepSeek V4リリースのフラッグシップです。Hugging Faceでは4ビットGGUFやAWQとして入手可能です。&lt;/p&gt;

&lt;p&gt;完全なモデルは大規模で、ローカル実行には高いメモリ要件があります。Q4量子化でも、80GB H100のペア、または192GBユニファイドメモリ級のMac Studio M3 Ultraのような環境が必要になります。&lt;/p&gt;

&lt;p&gt;多くのチームにとって、V4 Proを直接ローカル運用するのは現実的ではありません。ただし、蒸留モデルや小型バリアントが推論能力を引き継いでいるため、V4系を評価する価値はあります。&lt;/p&gt;

&lt;p&gt;完全なモデルをOpenAI互換エンドポイント経由で使う方法は、&lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;DeepSeek V4 APIの使用方法&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;/li&gt;
&lt;li&gt;大規模なローカル検証環境&lt;/li&gt;
&lt;li&gt;Mac Studio M3 Ultraまたは複数GPU環境を持つチーム&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;必要ハードウェアの目安&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;192GBユニファイドメモリ&lt;/li&gt;
&lt;li&gt;または80GB GPU 2基&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;a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Pro" rel="noopener noreferrer"&gt;Hugging FaceのDeepSeek V4 Pro GGUF&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. DeepSeek V4 Flash
&lt;/h3&gt;

&lt;p&gt;DeepSeek V4 Flashは、より現実的にローカル運用しやすいV4バリアントです。合計284B、アクティブ13Bの構成で、4ビット量子化では24GB VRAMに収まります。&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%2F05%2Fimage-11.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%2F05%2Fimage-11.png" alt="" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;多くのチームが実際に試すなら、まずV4 Flashから始めるのが現実的です。推論、RAG、コーディング補助、社内エージェントの検証に使いやすいモデルです。&lt;/p&gt;

&lt;p&gt;Ollamaでのセットアップは、&lt;a href="http://apidog.com/blog/how-to-run-deepseek-v4-locally?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;DeepSeek V4ローカルインストールガイド&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;/li&gt;
&lt;li&gt;コーディングアシスタント&lt;/li&gt;
&lt;li&gt;RAGの回答生成&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;ul&gt;
&lt;li&gt;Q4: 24GB VRAM&lt;/li&gt;
&lt;li&gt;Q3: 16GB VRAMでも実行可能だが品質低下あり&lt;/li&gt;
&lt;/ul&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 shell"&gt;&lt;code&gt;ollama pull deepseek-v4-flash
ollama serve
&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;ollama pull deepseek-v4-flash&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash" rel="noopener noreferrer"&gt;Hugging Face GGUF&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Qwen 3.6
&lt;/h3&gt;

&lt;p&gt;Qwen 3.6は、多言語、構造化出力、ツール呼び出しのバランスが良いモデルです。特に中国語、日本語、韓国語、アラビア語など、英語以外を扱うプロダクトでは有力な候補になります。&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%2F05%2Fimage-14.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%2F05%2Fimage-14.png" alt="" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Qwen 3.6 32Bは、Q4量子化で24GB VRAMに収まり、ツール呼び出し形式もOpenAI互換のワークフローに合わせやすいです。&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;日本語を含むチャットボット&lt;/li&gt;
&lt;li&gt;構造化出力&lt;/li&gt;
&lt;li&gt;ツール呼び出し&lt;/li&gt;
&lt;li&gt;コストと品質のバランスが必要なAPI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;必要ハードウェアの目安&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Q4: 24GB VRAM&lt;/li&gt;
&lt;/ul&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 shell"&gt;&lt;code&gt;ollama pull qwen3.6:32b
ollama serve
&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;ollama pull qwen3.6:32b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://huggingface.co/Qwen/Qwen3.6-32B" rel="noopener noreferrer"&gt;Hugging FaceのQwen 3.6&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. GLM 5.1
&lt;/h3&gt;

&lt;p&gt;GLM 5.1は、ツール呼び出し、構造化抽出、JSONモードのようなワークロードに向いています。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://z.ai/blog/glm-5.1" rel="noopener noreferrer"&gt;GLM 5.1&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%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-13.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%2F05%2Fimage-13.png" alt="" width="800" height="382"&gt;&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;/li&gt;
&lt;li&gt;構造化データ抽出&lt;/li&gt;
&lt;li&gt;JSONスキーマに沿った応答生成&lt;/li&gt;
&lt;li&gt;分類タスク&lt;/li&gt;
&lt;li&gt;業務フローの自動化&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ローカルLLMをOpenAI互換APIとして公開する
&lt;/h2&gt;

&lt;p&gt;モデルを選んだら、次はアプリケーションから呼び出せるHTTP APIとして公開します。&lt;/p&gt;

&lt;p&gt;2026年時点で実装しやすい選択肢は次の3つです。&lt;/p&gt;

&lt;h3&gt;
  
  
  Ollama
&lt;/h3&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;ollama serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ollamaは次のURLでOpenAI互換エンドポイントを公開します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:11434/v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;既存コードがOpenAI SDKを使っている場合、&lt;code&gt;base_url&lt;/code&gt;を差し替えるだけでローカルモデルを呼び出せます。&lt;/p&gt;

&lt;h3&gt;
  
  
  vLLM
&lt;/h3&gt;

&lt;p&gt;本番環境や高スループット用途ではvLLMが候補になります。&lt;/p&gt;

&lt;p&gt;vLLMは連続バッチ処理をサポートし、低レイテンシーと高スループットが必要なAPIサーバーに向いています。&lt;/p&gt;

&lt;p&gt;一般的には次のようなOpenAI互換エンドポイントを公開します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:8000/v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  LM Studio
&lt;/h3&gt;

&lt;p&gt;LM StudioはGUIでモデルを管理したい個人開発者に向いています。&lt;/p&gt;

&lt;p&gt;設定画面でローカルサーバーを有効化すると、HTTPエンドポイントとしてモデルを呼び出せます。&lt;/p&gt;

&lt;p&gt;このパターンについては、&lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;DeepSeek V4を無料で使う方法&lt;/a&gt;でも説明されています。&lt;/p&gt;

&lt;h2&gt;
  
  
  PythonからローカルLLMを呼び出す
&lt;/h2&gt;

&lt;p&gt;OllamaをOpenAI互換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="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;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="c1"&gt;# Ollamaでは任意の文字列でよい
&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="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;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;qwen3.6:32b&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;MoEと高密度モデルの3つの違いを要約してください。&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;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.3&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="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;code&gt;model&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;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;deepseek-v4-flash&lt;/span&gt;&lt;span class="sh"&gt;"&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 python"&gt;&lt;code&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;llama5.1:8b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;アプリケーション側では、次の2つを環境変数にしておくと切り替えが簡単です。&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="nv"&gt;LLM_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:11434/v1
&lt;span class="nv"&gt;LLM_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;qwen3.6:32b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ApidogでローカルLLMをテストする
&lt;/h2&gt;

&lt;p&gt;ローカルLLMで重要なのは、モデルの品質だけではありません。リクエストとレスポンスを再現可能に検証できることです。&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%2F05%2Fimage-15.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%2F05%2Fimage-15.png" alt="" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;OllamaやvLLMが落ちた場合、原因調査は自分たちの責任になります。GPUのOOM、ドライバークラッシュ、モデルロード失敗、ストリーミング中断、ツール呼び出し形式の差分などを確認する必要があります。&lt;/p&gt;

&lt;p&gt;curlだけで運用すると、次の作業が面倒になります。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;同じプロンプトを複数モデルに投げる&lt;/li&gt;
&lt;li&gt;temperatureやmax_tokensを変えて再実行する&lt;/li&gt;
&lt;li&gt;ストリーミングレスポンスを比較する&lt;/li&gt;
&lt;li&gt;CI用にレスポンスをモックする&lt;/li&gt;
&lt;li&gt;チームでリクエスト仕様を共有する&lt;/li&gt;
&lt;/ul&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&lt;/a&gt;を使うと、OllamaやvLLMのエンドポイントを通常のAPIとして扱えます。&lt;/p&gt;

&lt;h3&gt;
  
  
  1. リクエストコレクションを作成する
&lt;/h3&gt;

&lt;p&gt;Apidogで次のようなPOSTリクエストを作成します。&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 http://localhost:11434/v1/chat/completions
Content-Type: application/json
Authorization: Bearer ollama
&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;"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;"qwen3.6:32b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"messages"&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;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"system"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MoEモデルのメリットを3つ挙げてください。"&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;"temperature"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"max_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;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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;モデルごとに次のパラメータを保存しておくと、差し替え時の検証が楽になります。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;model&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;messages&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;temperature&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;max_tokens&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stream&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tools&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tool_choice&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. モデル間で同じプロンプトをリプレイする
&lt;/h3&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;"qwen3.6:32b"&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;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;"deepseek-v4-flash"&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;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;"llama5.1:8b"&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上でレスポンスを比較すれば、モデル変更による出力の差分を確認できます。&lt;/p&gt;

&lt;p&gt;特に確認すべき点は次のとおりです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSONが壊れていないか&lt;/li&gt;
&lt;li&gt;ツール呼び出し形式が期待どおりか&lt;/li&gt;
&lt;li&gt;回答が長すぎないか&lt;/li&gt;
&lt;li&gt;日本語の品質が落ちていないか&lt;/li&gt;
&lt;li&gt;エラー時のレスポンス形式がアプリ側で処理できるか&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. CI用にエンドポイントをモックする
&lt;/h3&gt;

&lt;p&gt;CIで毎回ローカルLLMを起動すると、テストが不安定になります。&lt;/p&gt;

&lt;p&gt;理由は次のとおりです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GPUがCI環境にない&lt;/li&gt;
&lt;li&gt;モデルロードに時間がかかる&lt;/li&gt;
&lt;li&gt;OOMで失敗する&lt;/li&gt;
&lt;li&gt;ストリーミング結果が毎回微妙に変わる&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ApidogでローカルLLMエンドポイントをモックすれば、アプリケーション側のテストはGPUに依存しません。&lt;/p&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;"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;"chatcmpl-local-mock"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chat.completion"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1760000000&lt;/span&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;"qwen3.6:32b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"choices"&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;"index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"assistant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MoEモデルのメリットは、計算効率、スケーラビリティ、専門化された推論能力です。"&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;"finish_reason"&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="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;
  
  
  4. スループットをベンチマークする
&lt;/h3&gt;

&lt;p&gt;量子化方式を変えた場合は、必ずベンチマークします。&lt;/p&gt;

&lt;p&gt;比較対象の例:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Q3&lt;/li&gt;
&lt;li&gt;Q4&lt;/li&gt;
&lt;li&gt;Q5&lt;/li&gt;
&lt;li&gt;8Bモデル&lt;/li&gt;
&lt;li&gt;32Bモデル&lt;/li&gt;
&lt;li&gt;Ollama&lt;/li&gt;
&lt;li&gt;vLLM&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;1秒あたりのトークン数&lt;/li&gt;
&lt;li&gt;エラー率&lt;/li&gt;
&lt;li&gt;長文コンテキスト時のVRAM使用量&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. チーム向けにAPI仕様を文書化する
&lt;/h3&gt;

&lt;p&gt;ローカルLLMも本番APIと同じように仕様化します。&lt;/p&gt;

&lt;p&gt;ApidogプロジェクトからOpenAPI 3.1をエクスポートすれば、チームメイトは次の点をすぐ確認できます。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;どのURLを呼ぶか&lt;/li&gt;
&lt;li&gt;どのモデル名を使うか&lt;/li&gt;
&lt;li&gt;必須パラメータは何か&lt;/li&gt;
&lt;li&gt;ストリーミングの有無&lt;/li&gt;
&lt;li&gt;エラー時のレスポンス形式&lt;/li&gt;
&lt;li&gt;ツール呼び出しのJSONスキーマ&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;同じワークフローは、&lt;a href="http://apidog.com/blog/best-self-hosted-postman-alternatives-2026-2?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Postmanの代替としてのApidog&lt;/a&gt;でも説明されています。&lt;/p&gt;

&lt;h2&gt;
  
  
  ローカルLLM実装時のよくある間違い
&lt;/h2&gt;

&lt;h3&gt;
  
  
  GPUに収まる最大モデルを選ぶ
&lt;/h3&gt;

&lt;p&gt;最大モデルが常に最良とは限りません。&lt;/p&gt;

&lt;p&gt;たとえば、Q3の32Bモデルより、Q5の14Bモデルの方が安定して良い結果を出す場合があります。4ビットを超える領域では、パラメータ数だけでなく量子化品質も重要です。&lt;/p&gt;

&lt;h3&gt;
  
  
  コンテキスト長のVRAM消費を忘れる
&lt;/h3&gt;

&lt;p&gt;長いコンテキストを使うと、KVキャッシュがVRAMを消費します。&lt;/p&gt;

&lt;p&gt;32Bモデルで32Kトークンのコンテキストを使う場合、Q4でも追加で数GBのVRAMが必要になります。モデルがロードできても、長文入力でOOMになることがあります。&lt;/p&gt;

&lt;h3&gt;
  
  
  出所不明のファインチューンを使う
&lt;/h3&gt;

&lt;p&gt;Hugging Face上の任意のファインチューンをそのまま本番に入れるのは避けるべきです。&lt;/p&gt;

&lt;p&gt;最低限、次を確認します。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;元モデルのカード&lt;/li&gt;
&lt;li&gt;ライセンス&lt;/li&gt;
&lt;li&gt;作者の信頼性&lt;/li&gt;
&lt;li&gt;ダウンロード数&lt;/li&gt;
&lt;li&gt;変更内容&lt;/li&gt;
&lt;li&gt;セーフティやシステムプロンプトへの影響&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;悪意あるファインチューンは現実的なリスクです。&lt;/p&gt;

&lt;h3&gt;
  
  
  モックレイヤーを用意しない
&lt;/h3&gt;

&lt;p&gt;ローカルモデルは落ちます。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GPUドライバーがクラッシュする&lt;/li&gt;
&lt;li&gt;プロセスがOOMで終了する&lt;/li&gt;
&lt;li&gt;モデルロードに失敗する&lt;/li&gt;
&lt;li&gt;GPUがサーマルスロットリングする&lt;/li&gt;
&lt;li&gt;ストリーミングが途中で切れる&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CIや単体テストが実モデルに直接依存すると不安定になります。&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;/p&gt;

&lt;h3&gt;
  
  
  ツール呼び出し形式の差を無視する
&lt;/h3&gt;

&lt;p&gt;Llama 5.1、Qwen 3.6、DeepSeek V4はいずれもツール呼び出しをサポートしますが、出力されるJSON形式には差があります。&lt;/p&gt;

&lt;p&gt;本番でモデルを差し替える前に、次を必ず検証してください。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tool_calls&lt;/code&gt;の構造&lt;/li&gt;
&lt;li&gt;argumentsが文字列かJSONオブジェクトか&lt;/li&gt;
&lt;li&gt;スキーマ違反時の挙動&lt;/li&gt;
&lt;li&gt;複数ツール呼び出し時の順序&lt;/li&gt;
&lt;li&gt;ストリーミング時の差分出力&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  実世界でのユースケース
&lt;/h2&gt;

&lt;h3&gt;
  
  
  カスタマーサポートエージェント
&lt;/h3&gt;

&lt;p&gt;カスタマーサポートエージェントを運用するスタートアップは、単一の4090でGPT-5.5からQwen 3.6 32Bに移行しました。&lt;/p&gt;

&lt;p&gt;レイテンシーは800ミリ秒未満に保たれ、月間の推論費用は9,400ドルから0ドルに減少しました。CIではApidogモックを使い、LLMレスポンスに依存するテストを安定化しています。&lt;/p&gt;

&lt;h3&gt;
  
  
  音声アシスタント
&lt;/h3&gt;

&lt;p&gt;音声アシスタントを開発する個人開発者は、16GBのユニファイドメモリを搭載したM2 ProでGemma 4 9Bを実行しています。&lt;/p&gt;

&lt;p&gt;マルチトークン予測のドラフターにより、1秒あたり60トークンの生成が可能で、会話体験を損なわない速度を実現しています。&lt;/p&gt;

&lt;h3&gt;
  
  
  フィンテックの要約バッチ
&lt;/h3&gt;

&lt;p&gt;フィンテックの研究チームは、規制当局への提出書類を夜間にバッチ要約するため、2台の4090でDeepSeek V4 Flashを実行しています。&lt;/p&gt;

&lt;p&gt;要約あたりのコストは、電気代とサーバーメンテナンス時間に限定されます。&lt;/p&gt;

&lt;h2&gt;
  
  
  実装手順のまとめ
&lt;/h2&gt;

&lt;p&gt;ローカルLLMを導入する場合は、次の順番で進めると失敗しにくいです。&lt;/p&gt;

&lt;h3&gt;
  
  
  1. ハードウェアからモデルを決める
&lt;/h3&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;8GB以下&lt;/td&gt;
&lt;td&gt;Gemma 4 9B、Llama 5.1 8B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16GB&lt;/td&gt;
&lt;td&gt;小型モデル、Q3量子化モデル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24GB&lt;/td&gt;
&lt;td&gt;Qwen 3.6 32B、DeepSeek V4 Flash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;64GB以上&lt;/td&gt;
&lt;td&gt;大きめのMoEモデル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;192GB級&lt;/td&gt;
&lt;td&gt;DeepSeek V4 Pro級の検証&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  2. Ollamaで起動する
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull qwen3.6:32b
ollama serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. OpenAI 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;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;local&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;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="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;qwen3.6:32b&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;このAPIレスポンスを要約してください。&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;h3&gt;
  
  
  4. Apidogで同じリクエストを保存する
&lt;/h3&gt;

&lt;p&gt;Apidogに次のエンドポイントを登録します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST http://localhost:11434/v1/chat/completions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;モデルごとのリクエストを保存し、変更時にリプレイします。&lt;/p&gt;

&lt;h3&gt;
  
  
  5. CIではモックを使う
&lt;/h3&gt;

&lt;p&gt;本番と同じレスポンス形式をApidogでモックし、GPUなしでもテストが通るようにします。&lt;/p&gt;

&lt;h3&gt;
  
  
  6. 本番切り替え前に比較する
&lt;/h3&gt;

&lt;p&gt;次を比較します。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ホスト型API&lt;/li&gt;
&lt;li&gt;Qwen&lt;/li&gt;
&lt;li&gt;DeepSeek&lt;/li&gt;
&lt;li&gt;Llama&lt;/li&gt;
&lt;li&gt;Gemma&lt;/li&gt;
&lt;li&gt;GLM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;同じプロンプトを投げ、レスポンス差分、レイテンシー、失敗率を確認します。&lt;/p&gt;

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

&lt;p&gt;2026年のローカルLLM選びでは、モデル名だけでなく、VRAM、レイテンシー、量子化方式、ツール呼び出し、テスト方法まで含めて設計する必要があります。&lt;/p&gt;

&lt;p&gt;実用上の選び方は次のとおりです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;24GB GPUなら、Qwen 3.6 32BまたはDeepSeek V4 Flash&lt;/li&gt;
&lt;li&gt;小型ハードウェアなら、Llama 5.1 8BまたはGemma 4 9B&lt;/li&gt;
&lt;li&gt;ツール呼び出し中心なら、GLM 5系&lt;/li&gt;
&lt;li&gt;推論重視で大規模環境があるなら、DeepSeek V4 Pro&lt;/li&gt;
&lt;li&gt;APIとして運用するなら、Ollama / vLLM / LM StudioでOpenAI互換エンドポイントにする&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;

&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;ollama pull qwen3.6:32b
ollama serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;その後、Apidogを次のURLに向けます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:11434/v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;これで、ホスト型LLMと同じ形式でローカルLLMをテスト、リプレイ、ベンチマークできます。&lt;/p&gt;

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

&lt;h3&gt;
  
  
  2026年に24GB GPUに最適なローカルLLMは何ですか？
&lt;/h3&gt;

&lt;p&gt;多くのワークロードでは、Q4のQwen 3.6 32BまたはQ4のDeepSeek V4 Flashです。&lt;/p&gt;

&lt;p&gt;多言語やツール呼び出しが多い場合はQwen、推論やコーディングを重視する場合はDeepSeek V4 Flashを検討してください。DeepSeek V4のローカル実行については、&lt;a href="http://apidog.com/blog/how-to-run-deepseek-v4-locally?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;DeepSeek V4ローカルガイド&lt;/a&gt;も参考になります。&lt;/p&gt;

&lt;h3&gt;
  
  
  MacでローカルLLMを実行できますか？
&lt;/h3&gt;

&lt;p&gt;はい。16GB以上のユニファイドメモリを搭載したAppleシリコンでは、Llama 5.1 8BやGemma 4 9Bを実行できます。&lt;/p&gt;

&lt;p&gt;192GBのM3 Ultra級であれば、Q4のDeepSeek V4 Proのような大規模モデルも検証対象になります。OllamaまたはLM Studioを使うと始めやすいです。&lt;/p&gt;

&lt;h3&gt;
  
  
  OpenAIをテストするのと同じ方法でローカルLLMをテストするには？
&lt;/h3&gt;

&lt;p&gt;OpenAI互換クライアントと&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;code&gt;base_url&lt;/code&gt;をローカルサービスURLに向けます。&lt;/p&gt;

&lt;p&gt;Ollamaの場合:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:11434/v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;vLLMの場合:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:8000/v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;リクエスト形式はOpenAI Chat Completionsと同じで、ベースURLとモデル名だけを変更します。&lt;/p&gt;

&lt;h3&gt;
  
  
  ローカルLLMの品質は本当にホスト型と同等ですか？
&lt;/h3&gt;

&lt;p&gt;推論、コーディング、分類、抽出、ツール呼び出しでは、上位のオープンモデルがホスト型モデルに近い品質を出すケースがあります。&lt;/p&gt;

&lt;p&gt;一方で、ビジョン、長文コンテキストのドキュメントQA、クリエイティブライティングでは、ホスト型モデルが依然として有利な場面があります。&lt;/p&gt;

&lt;h3&gt;
  
  
  コストはどうなりますか？
&lt;/h3&gt;

&lt;p&gt;4090 GPUでDeepSeek V4 Flashを動かす場合、主な変動費は電気代です。ホスト型APIでは、同じボリュームで月額数百ドルから数千ドルになることがあります。&lt;/p&gt;

&lt;p&gt;損益分岐点はワークロードによりますが、月あたり約500万トークンが一つの目安になります。&lt;/p&gt;

&lt;h3&gt;
  
  
  本番アプリをホスト型とローカル型の間で切り替えるには？
&lt;/h3&gt;

&lt;p&gt;OpenAIクライアントを維持し、次の2つを差し替えます。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;base_url&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;model&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;切り替え前には、リプレイツールで同じリクエストを実行し、レスポンス差分を確認してください。この考え方は、&lt;a href="http://apidog.com/blog/api-testing-without-postman-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Postmanを使わないAPIテスト&lt;/a&gt;でも説明されています。&lt;/p&gt;

&lt;h3&gt;
  
  
  最新のリーダーボードはどこで見られますか？
&lt;/h3&gt;

&lt;p&gt;次の2つを確認してください。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://huggingface.co/spaces/open-llm-leaderboard/open_llm_leaderboard" rel="noopener noreferrer"&gt;Hugging Face Open LLM Leaderboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chat.lmsys.org/" rel="noopener noreferrer"&gt;LMSYS Chatbot Arena&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;それぞれ測定している観点が異なるため、両方を見て判断するのがおすすめです。&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
