Sakana AI(Fugu / Namazu)を Harness パイプラインから呼び出す
本文中の Harness は、このサイトが扱う DeepSeek Harness(DSH)ではなく、Harness.io(CI/CD プラットフォーム) を指します。Sakana AI は Quarto とは直接関係のない、あくまで 「LLM を自動化パイプラインに組み込む応用のヒント」 として記載します。
API キーの管理・レートリミット・トークンの扱いなどは、必ず Sakana AI 公式コンソール・ドキュメント(console.sakana.ai)を参照してください。本ページの内容は検証時点の仕様に基づくもので、将来変更される可能性があります。
1. Sakana AI のエンドポイント取得
Sakana AI は API 経由で Fugu(マルチエージェント)と Sakana Namazu(日本語特化 LLM)の 2 系統を提供し、いずれも OpenAI 互換のエンドポイントから利用できます。
| 項目 | 内容 |
|---|---|
| ベース URL | https://api.sakana.ai/v1 |
| エンドポイント | POST /v1/chat/completions / POST /v1/responses / GET /v1/models |
| 認証ヘッダー | Authorization: Bearer <YOUR_API_KEY> |
| モデル指定 | リクエストボディの model: fugu / fugu-ultra / fugu-cyber / sakana-namazu |
- API キーは Sakana AI コンソール(console.sakana.ai)で発行します(
fish_で始まる文字列)。環境変数SAKANA_API_KEYで保存するのが公式推奨です。 - 生成リクエストには Responses API(
/v1/responses)が公式推奨です。既存の OpenAI Chat Completions 互換クライアントを使う場合は/v1/chat/completionsも利用できます。 - Fugu 系のモデルでは思考レベルを
reasoning.effort("high"/"xhigh"/"max")で指定します。Chat Completions ではtemperature/top_pなどの一部サンプリングパラメータは受け付けても無視される場合があるため注意してください。 - Sakana Namazu は日本語特化の単一モデルで、
temperature/top_pの指定が可能です。
2. Harness にシークレットを登録
API キーをパイプラインに直接書かず、Harness の Secret Manager に保存します。
- Setup → Secrets → + New Secret
- 種類: Encrypted Text
- キー名:
SAKANA_API_TOKEN - 値: Sakana AI コンソールで発行したキー
このシークレットはパイプライン実行時に ${secrets.getValue("SAKANA_API_TOKEN")} で参照できます。
3. パイプラインステップで Sakana AI を呼び出す例
3-1. Bash ステップ(curl 使用・Fugu)
steps:
- name: "Generate AI response with Sakana Fugu"
type: Run
spec:
shell: Bash
command: |
#!/usr/bin/env bash
API_TOKEN=$(secrets.getValue "SAKANA_API_TOKEN")
PROMPT="以下の要件で CloudFormation テンプレートを作成してください:\n- VPC とサブネット\n- 2 つの EC2 インスタンス (t3.micro)\n- インターネットゲートウェイ"
RESPONSE=$(curl -sS -X POST "https://api.sakana.ai/v1/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_TOKEN" \
-d "$(cat <<EOF
{
"model": "fugu",
"messages": [{"role":"user","content":"$PROMPT"}],
"max_completion_tokens": 1500
}
EOF
)")
echo "=== Sakana Fugu からの応答 ==="
echo "$RESPONSE" | jq -r '.choices[0].message.content'- ポイント
secrets.getValueでシークレットを安全に取得。jqで JSON から生成されたテキストだけを抽出。- 出力を長くしたい場合は
max_completion_tokensを大きめに設定。
3-2. Python ステップ(公式 SDK 使用・Namazu)
steps:
- name: "Sakana Namazu 呼び出し (Python)"
type: Run
spec:
shell: Bash
command: |
#!/usr/bin/env bash
python - <<'PY'
import os, json
from openai import OpenAI
api_token = os.getenv("SAKANA_API_KEY")
prompt = """以下の要件で Terraform 設定を作成してください:
- AWS provider
- VPC / 2 つのサブネット
- 1 つの RDS (db.t3.micro)"""
client = OpenAI(
base_url="https://api.sakana.ai/v1",
api_key=api_token,
)
resp = client.chat.completions.create(
model="sakana-namazu",
messages=[{"role": "user", "content": prompt}],
max_tokens=1200,
)
print(resp.choices[0].message.content)
PY
envVariables:
SAKANA_API_KEY: "<+secrets.getValue('SAKANA_API_TOKEN')>"Sakana API は OpenAI 互換なので、公式の Python SDK(openai パッケージ)をそのまま使えます。base_url を https://api.sakana.ai/v1、api_key に Sakana のキーを指定するだけです。Fugu で生成品質を上げたい場合は client.responses.create(model="fugu-ultra", reasoning={"effort": "high"}, ...) のように Responses API を使うのが推奨です。
4. 実務での活用例
| シナリオ | 目的 | 実装例 |
|---|---|---|
| コードレビュー自動化 | PR の差分を要約し、改善点を提案 | git diff → Fugu に送信 → コメントを自動生成し、GitHub API で PR に投稿 |
| インフラ構成自動生成 | 要件定義(テキスト) → IaC(Terraform / CloudFormation) | Bash ステップで出力をファイルに保存し、terraform init → apply |
| テストケース生成 | 受け取った仕様書からテストシナリオを生成 | 仕様テキスト → Fugu に「ユニットテストを書いて」指示 → 結果を src/test に保存 |
| 日本語ドキュメント作成 | アーキテクチャ図の説明文や API 仕様書のドラフト(日本語) | Markdown テンプレート → Namazu に要件を渡し、アウトプットを README.md に上書き |
5. ベストプラクティス
- API キーは最小権限で – Sakana AI のキーは用途に応じて必要最小限のスコープに絞り、コードに直接書かない。
- リトライロジック – ネットワーク障害やレートリミットに備えて、
curl/requestsにリトライ(--retryや backoff)を実装する。 - モデル・パラメータの使い分け – 通常タスクは
fugu、品質重視・検証が必要なタスクはfugu-ultraを使い、reasoning.effortで思考レベルを調整する。 - 応答サイズ制御 –
max_completion_tokensを調整し、不要に長い出力を防ぐ。 - 監査ログ – Harness の Audit 機能で外部 API コールを記録し、トラブル時に呼び出し履歴を追跡できるようにする。
- シークレットローテーション – 定期的に新しい Sakana AI キーを生成し、Harness のシークレットを更新する(更新間隔は運用方針に合わせて決定)。
料金・レートリミット・サブスクリプション vs 従量課金の扱いなどは、Sakana AI 公式の料金ページ・FAQ で確認してください。本ページに数値を明記しないのは、検証時点の仕様と異なる可能性があるためです。
6. 典型的なエラーメッセージと対処
| エラー | 内容 | 対処 |
|---|---|---|
401 Unauthorized |
トークンが無効・期限切れ | シークレットの API キーを再取得し、パイプライン変数を更新 |
429 Too Many Requests |
レートリミット超過 | レスポンスの Retry-After ヘッダーを読み取り、待機後再実行 |
model_not_found |
モデル名が誤っている / アクセス権がない | GET /v1/models で利用可能なモデル ID を確認(fugu-cyber はアクセス制限あり) |
500 Internal Server Error |
サーバ側障害(稀) | 短時間でリトライ、障害が続く場合は Sakana 公式のステータスページを確認 |
まとめ
- シークレット登録 – Sakana AI のキーを Harness に安全に保管する。
- パイプラインステップで
curlまたは公式 SDK(OpenAI 互換)を呼び出し、モデル(fugu/fugu-ultra/sakana-namazuなど)を指定する。 - 出力をファイル / 変数に保存し、次のビルドステップやデプロイに組み込む。
- リトライ・ロギング・権限管理を徹底し、安定した CI/CD フローを実現する。
この手順で、Sakana AI(Fugu / Namazu)の生成能力を自動化パイプラインに統合し、コード生成、日本語ドキュメント作成、インフラ構成自動化などをシームレスに実行できます。詳細は必ず Sakana AI 公式コンソール を参照してください。