AI活用

Sakana Fugu APIの使い方|JavaScriptでFugu・Fugu Ultraを呼び出す方法

Sakana Fugu APIをJavaScriptから呼び出す方法を解説。OpenAI SDK、baseURL、FuguとFugu Ultra、reasoning effort、会話履歴、JSON検証、料金・安全なWebアプリ構成まで紹介します。

この記事の目次
  1. 結論:最初はFuguをhighで試し、難しい比較・検証だけFugu Ultraへ切り替える
  2. Sakana Fugu APIとは?
  3. 事前準備
  4. Node.jsプロジェクトを作成する
  5. APIキーを環境変数へ保存する
  6. JavaScriptでFuguを呼び出す最小コード
  7. reasoning effortの設定方法
  8. Fugu Ultraへ切り替える方法
  9. FuguとFugu Ultraの選び方
  10. Fuguが向いている例
  11. Fugu Ultraが向いている例
  12. 会話履歴を継続する方法
  13. JSONとして使える回答を取得する
  14. タイムアウトと再試行を設定する
  15. Webアプリへ組み込む安全な構成
  16. 入力へ制限を設ける
  17. 費用の上限を設ける
  18. 回答をそのまま実行しない
  19. 料金を確認するときのポイント
  20. よくあるエラーと確認方法
  21. 401 Unauthorized
  22. 404またはmodel not found
  23. reasoning effortのエラー
  24. 応答が遅い
  25. 前回の内容を覚えていない
  26. あわせて読みたい記事
  27. よくある質問
  28. まとめ
  29. 参考リンク

Sakana Fugu APIは、1つの固定モデルへ処理を任せるのではなく、タスクに応じて複数のモデルやエージェントを組み合わせて回答を作るAPIです。OpenAI互換のエンドポイントが用意されているため、JavaScriptではOpenAI SDKの接続先を変更して試せます。

ただし、FuguとFugu Ultraでは処理の仕組み、推奨される推論設定、料金の考え方が異なります。既存のOpenAI向けコードをそのまま置き換えるだけではなく、タイムアウト、履歴の渡し方、コスト上限、出力検証まで設計しておくことが重要です。

この記事では、APIキーの準備、JavaScriptからの呼び出し、Fugu Ultraの使い分け、会話履歴、エラー処理、Webアプリへ組み込むときの安全な構成まで解説します。

情報確認日:2026年7月11日(日本時間)

結論:最初はFuguをhighで試し、難しい比較・検証だけFugu Ultraへ切り替える

この記事の結論

  • APIのベースURLはhttps://api.sakana.ai/v1
  • 通常タスクはfugu、複数の視点や検証が必要なタスクはfugu-ultraを候補にする
  • Fuguの推論レベルはhighxhighmaxから選ぶ
  • 会話を続ける場合は、過去の入力と出力をアプリ側で保持して再送する
  • 本番環境ではAPIキーをブラウザへ置かず、サーバー側にタイムアウトと利用上限を設ける

Sakana Fugu APIとは?

Sakana Fuguは、入力された仕事に合わせてモデルの組み合わせ方を変えるAIシステムです。利用者は1つのAPIへ依頼を送り、内部のオーケストレーションはFugu側が担当します。

一般的なAPIでは、利用者がモデル名を1つ選び、そのモデルへ直接処理させます。Fuguは、複数のモデル候補や役割を動的に編成する点が異なります。特にFugu Ultraは、難しいタスクに対して複数のエージェントを使い、異なる案の生成や検証を行う用途を想定しています。

モデルID 向いている仕事 考え方
fugu 調査、要約、コード説明、通常の設計相談 まず試す標準モデル
fugu-ultra 複数案の比較、難しい設計、長い検証、重要な判断材料の整理 1〜3のエージェントを動的に編成する上位構成

事前準備

Node.jsプロジェクトを作成する

mkdir sakana-fugu-sample
cd sakana-fugu-sample
npm init -y
npm install openai dotenv
npm pkg set type=module

APIキーを環境変数へ保存する

Sakana AI ConsoleでAPIキーを発行し、プロジェクト直下の.envへ保存します。キー名はアプリ側で自由に決められます。

SAKANA_API_KEY=your_api_key_here

.gitignoreへ次を追加します。

.env
.env.*
node_modules/
logs/

APIキーをReactやVueのフロントエンドコードへ埋め込まないでください。ビルド後のJavaScriptから取得されるため、第三者に使われる可能性があります。ブラウザからは自分のサーバーAPIを呼び、そのサーバーからFugu APIへ接続します。

JavaScriptでFuguを呼び出す最小コード

index.jsを作成します。

import "dotenv/config";
import OpenAI from "openai";

const apiKey = process.env.SAKANA_API_KEY;

if (!apiKey) {
  throw new Error("SAKANA_API_KEYが設定されていません");
}

const client = new OpenAI({
  apiKey,
  baseURL: "https://api.sakana.ai/v1",
  timeout: 120_000,
});

const response = await client.responses.create({
  model: "fugu",
  input: [
    {
      role: "user",
      content:
        "ReactでAPI検索画面を作るときの構成を、セキュリティとテストの観点を含めて提案してください。",
    },
  ],
  reasoning: {
    effort: "high",
  },
});

console.log(response.output_text);

実行します。

node index.js

接続部分のポイントは、OpenAI SDKのbaseURLをSakana Fugu APIへ変更することです。既存のOpenAI互換コードを移植しやすい一方、すべての独自機能が完全に同じとは限りません。利用するパラメータはSakana AIの最新ドキュメントで確認してください。

reasoning effortの設定方法

Fuguでは、推論に使う計算量をreasoning.effortで指定します。公式ドキュメントではFugu向けにhighxhighmaxが案内されています。

設定 使いどころ 注意点
high 通常の調査、実装案、比較、コードレビュー まずこの設定から試す
xhigh 複雑な設計、長いコードの分析、複数条件の検討 待ち時間とトークン量が増えやすい
max 失敗コストが高く、深い検証が必要な問題 通常の質問へ常用しない

推論レベルを上げれば常に回答が良くなるわけではありません。入力条件が曖昧なままでは、長く考えても期待する成果物にならないことがあります。目的、制約、完成条件、検証方法を先に伝える方が効果的です。

Fugu Ultraへ切り替える方法

モデル名をfugu-ultraへ変更します。Fugu Ultraは複数エージェントを動的に編成するため、単純な要約や短い質問では過剰になる場合があります。

const response = await client.responses.create({
  model: "fugu-ultra",
  input: `
次のWebアプリの認証設計を3つの観点から検証してください。

- セキュリティ担当: 攻撃経路と権限境界
- バックエンド担当: セッション、DB、API設計
- 運用担当: ログ、監視、障害時の復旧

最後に、3者の指摘を統合した推奨構成と、
実装前に確認すべきチェックリストを返してください。
`,
  reasoning: {
    effort: "xhigh",
  },
});

console.log(response.output_text);

役割をプロンプト内で指定しても、内部の編成が必ずその人数や名称どおりになるとは限りません。役割指定は「どの観点を欠かさないか」を明確にするために使います。

FuguとFugu Ultraの選び方

Fuguが向いている例

  • 既存コードの説明や改善点の整理
  • 技術記事の構成案や要約
  • API仕様からTypeScript型を作る
  • エラーログから原因候補を出す
  • 複数ライブラリの一般的な比較

Fugu Ultraが向いている例

  • 複数の実装案を独立に考え、評価基準で比較する
  • 大きな設計変更のリスクを複数視点から洗い出す
  • 長い調査結果を検証し、矛盾や不足を探す
  • コード、仕様、テスト、運用手順を一緒にレビューする
  • 重要な意思決定のために反対意見も含めて整理する

会話履歴を継続する方法

Fugu APIでは、過去の会話をアプリ側で保持し、次のリクエストへ含める構成にします。previous_response_idに依存せず、必要な履歴を明示的に渡す設計が分かりやすいです。

const messages = [
  {
    role: "user",
    content: "Node.jsで使うログ設計の基本方針を作ってください。",
  },
];

const first = await client.responses.create({
  model: "fugu",
  input: messages,
  reasoning: { effort: "high" },
});

messages.push({
  role: "assistant",
  content: first.output_text,
});

messages.push({
  role: "user",
  content: "個人情報をログへ残さない具体的な実装ルールを追加してください。",
});

const second = await client.responses.create({
  model: "fugu",
  input: messages,
  reasoning: { effort: "high" },
});

console.log(second.output_text);

履歴を無制限に追加すると、入力トークンと料金が増えます。長い会話では、確定した要件と未解決事項だけを構造化して残し、古い往復を要約する方法が有効です。

JSONとして使える回答を取得する

Webアプリへ組み込む場合は、文章をそのまま解析するより、返してほしい項目を明示します。APIが対応する構造化出力の最新仕様を確認したうえで、アプリ側でも必ず検証します。

const response = await client.responses.create({
  model: "fugu",
  input: `
次のエラーを分類してください。

Error: connect ECONNREFUSED 127.0.0.1:5432

JSONだけを返してください。
{
  "category": "network | database | auth | application",
  "summary": "短い説明",
  "checks": ["確認項目"],
  "dangerous_actions": ["避ける操作"]
}
`,
  reasoning: { effort: "high" },
});

const text = response.output_text;

let result;
try {
  result = JSON.parse(text);
} catch {
  throw new Error("JSONとして解析できない回答でした");
}

if (!Array.isArray(result.checks)) {
  throw new Error("checksが配列ではありません");
}

console.log(result);

モデルの出力は外部入力として扱います。JSONとして解析できても、許可していないコマンドやURLが含まれる可能性があります。実行前にスキーマ、文字数、列挙値、パス、URL、コマンドを検証してください。

タイムアウトと再試行を設定する

複数モデルを使う処理は、短いチャットより時間がかかることがあります。本番環境では、無制限に待たず、利用者へ進行状態を示します。

async function runFugu(input, { model = "fugu", retries = 2 } = {}) {
  let lastError;

  for (let attempt = 0; attempt <= retries; attempt += 1) {
    try {
      return await client.responses.create({
        model,
        input,
        reasoning: {
          effort: model === "fugu-ultra" ? "xhigh" : "high",
        },
      });
    } catch (error) {
      lastError = error;

      const status = error?.status;
      const retryable =
        status === 408 ||
        status === 409 ||
        status === 429 ||
        (typeof status === "number" && status >= 500);

      if (!retryable || attempt === retries) {
        throw error;
      }

      const waitMs = 1000 * 2 ** attempt;
      await new Promise((resolve) => setTimeout(resolve, waitMs));
    }
  }

  throw lastError;
}

タイムアウトした処理を無条件で再送すると、同じ高額な処理が重複する場合があります。請求状況やAPIの冪等性に関する最新仕様を確認し、再試行回数を小さくします。

Webアプリへ組み込む安全な構成

ブラウザ
   │ 自分の認証・入力
   ▼
WebアプリのサーバーAPI
   ├─ ユーザー認証
   ├─ 入力サイズ制限
   ├─ 利用回数・予算制限
   ├─ プロンプトの組み立て
   ├─ 出力スキーマ検証
   └─ 監査ログ(秘密情報は除外)
   │
   ▼
Sakana Fugu API

入力へ制限を設ける

  • 文字数、ファイル数、ファイルサイズを制限する
  • 許可する利用目的を決める
  • 個人情報や秘密情報を送信する前にマスキングする
  • URLやファイルを自動取得する場合は送信先を制限する

費用の上限を設ける

  • 利用者ごとの1日上限を設ける
  • Fugu Ultraを使える操作を限定する
  • 入力と出力の最大トークンを設定する
  • 請求アラートと利用ログを用意する

回答をそのまま実行しない

AIが生成したSQL、シェルコマンド、ファイルパス、HTTPリクエストを自動実行する場合は、許可リストと人間の承認を設けます。特に削除、公開、課金、権限変更を伴う操作は分離してください。

料金を確認するときのポイント

FuguとFugu Ultraは料金の考え方が異なります。Fuguでは、内部で利用されたモデルに応じた料金が関係します。Fugu Ultraは公式料金ページに固定の入出力単価が掲載されていますが、長いコンテキストでは単価が変わる場合があります。

料金や対応モデルは更新される可能性があるため、公開中のアプリへ固定値をハードコードするのではなく、運用資料と画面表示を定期的に見直してください。

よくあるエラーと確認方法

401 Unauthorized

APIキー、環境変数名、不要な空白、利用中のプロジェクトを確認します。キーそのものをログへ出さないでください。

404またはmodel not found

fuguまたはfugu-ultraのモデルID、ベースURL、アカウントでの提供状況を確認します。

reasoning effortのエラー

Fugu向けに案内されているhighxhighmaxを使用し、SDKとAPIの最新仕様を確認します。

応答が遅い

Fugu Ultraや高い推論レベルを通常処理へ使っていないか確認します。入力を小さくし、処理を同期で待たせる必要があるか見直します。

前回の内容を覚えていない

必要な会話履歴を次のinputへ含めているか確認します。アプリ側で確定事項を保存してください。

あわせて読みたい記事

よくある質問

OpenAI SDKを使わず、fetchでも呼び出せますか?

呼び出せます。OpenAI互換のHTTP APIへAuthorizationヘッダーとJSONを送ります。ただし、レスポンス形式やエラー処理を自分で実装する必要があります。

Fugu Ultraを毎回使うべきですか?

単純な要約、分類、短いコード説明では過剰になりやすいです。まずFuguで品質を測り、複数視点の検証が必要な操作だけUltraへ分ける方が、速度と費用を管理しやすくなります。

既存のOpenAI APIコードをそのまま移行できますか?

基本的なResponses APIやChat Completionsは移植しやすいですが、すべてのモデル固有パラメータや機能が同一とは限りません。小さな回帰テストを作って確認してください。

Fuguで会話を継続するにはどうしますか?

アプリ側で過去のユーザー入力と必要な回答を保持し、次のリクエストへ含めます。長い履歴は要約し、確定した要件を構造化して保存すると効率的です。

個人情報を送ってもよいですか?

利用規約、データ処理条件、組織の情報管理ルールを確認してください。不要な個人情報や秘密情報は送らず、必要な場合もマスキング、アクセス制御、保存期間を設計します。

まとめ

Sakana Fugu APIは、OpenAI互換の呼び出し方を保ちながら、タスクに応じた動的なモデル編成を利用できる点が特徴です。通常はfuguhighから始め、複数案の比較や重要な設計レビューだけfugu-ultraへ切り替えると扱いやすくなります。

本番環境へ組み込む際は、APIキーをサーバー側で管理し、タイムアウト、利用上限、会話履歴、出力検証、危険操作の承認まで用意してください。モデルの能力だけではなく、失敗しても安全なアプリ側の設計が重要です。

参考リンク