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の推論レベルは
high、xhigh、maxから選ぶ - 会話を続ける場合は、過去の入力と出力をアプリ側で保持して再送する
- 本番環境では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向けにhigh、xhigh、maxが案内されています。
| 設定 | 使いどころ | 注意点 |
|---|---|---|
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向けに案内されているhigh、xhigh、maxを使用し、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互換の呼び出し方を保ちながら、タスクに応じた動的なモデル編成を利用できる点が特徴です。通常はfuguとhighから始め、複数案の比較や重要な設計レビューだけfugu-ultraへ切り替えると扱いやすくなります。
本番環境へ組み込む際は、APIキーをサーバー側で管理し、タイムアウト、利用上限、会話履歴、出力検証、危険操作の承認まで用意してください。モデルの能力だけではなく、失敗しても安全なアプリ側の設計が重要です。