本番で使うときの注意とエラー
1. 許可はキーを作るときに決まる
許可を後から変える API はありません。
成果テキストの許可が無いキーで /result を呼ぶと、resultText は null になり、resultTextWithheld に理由が入ります。
テキストだけの実行には、「成果テキスト」と「クラウド実行の起動」の両方を許可したキーを使います。許可が足りないときは、キーを作り直してください(最初の準備)。
2. 結果の中身を確かめる
エンジンが一時的に失敗すると、status は done なのに、resultText がエラーの文だけ、ということがあります。
status だけでなく、resultText が期待した形になっているかも確かめてください。
形が違うときは、やり直します。別のエンジンで送り直すのも有効です。
3. /result の waitS は最大 25 秒
1 回のリクエストでは、終わりまで待てないことがあります。
terminal が true になるまで、呼び続けてください。作成には、数分以上かかることがあります。
4. 定期の処理では、毎回まず回収する
ほかの仕事が無いときだけ /result を回収する作りにすると、仕事が続く間、回収がいつまでも後回しになります。
毎回の処理の最初に、回収を試してください。終わった結果がたまらなくなります。
5. 失敗を記録する
起動、回収、中身の確認のそれぞれで、失敗をログに残すか、通知してください。
どこで止まったかが分かります。
通信が切れて起動を送り直すときは、同じ Idempotency-Key で送ると、二重に起動しません(1 人で実行する)。
よくあるエラー
| コード | 意味 | 次にすること |
|---|---|---|
400 |
入力の形が正しくない。serverAuth: true が無い、Idempotency-Key が無い、エンジン名や model・effort の値が受け付けられない、など。 |
応答の error を見て、入力を直す。 |
401 |
キーの形が正しくない、無効、取り消し済み、または期限切れ。 | キーを確かめる。期限切れなら作り直す。 |
403 |
キーに「クラウド実行の起動」の許可が無い、またはエンジンが限定の外。 | 許可のあるキーを使う。 |
404 |
runId が無い、または自分のものではない。 |
runId を確かめる。 |
409 |
同じ Idempotency-Key で別の本文を送った、または前の送信がまだ処理中。 |
新しい起動なら新しい鍵を使う。送り直しなら、少し待ってから同じ鍵と同じ本文で送る。 |
412 |
そのエンジンの認証が金庫に無い、または失効している。 | デスクトップの Fuga から、クラウド金庫に保管し直す(最初の準備)。 |
413 |
リクエストの本文が大きすぎる(2,000,000 バイトまで)。 | プロンプトを短くする。 |
429 |
1 日の上限、または同時実行の上限に達した。呼び出しの回数が多すぎる。認証の失敗が続いた。 | /quota で今の値と上限を確かめる。Retry-After ヘッダーがあれば、その秒数だけ待つ。 |
503 |
一時的に使えない(cloud-api-unavailable)。 |
時間をおいて、もう一度呼ぶ。 |
呼び出しの回数には、Base URL の側にも上限があります。既定では、1 つのキーで、起動は 24 時間に 100 単位(/launch は 1、/orchestrate は 3、params.requirementsImageGeneration: true を書くと 2 を足す)、読み取りは 5 分に 300 回までです。
上限と使った数を見る(/quota)
curl -s -X POST "https://www.kamui.ai/api/cloud/quota" \
-H "x-kamui-api-key: kamui_sk_..." -H "Content-Type: application/json" -d '{}'
# → { "daily": { "used": 3, "limit": 100 }, "active": { "used": 1, "limit": 5 } }
dailyは、直近 24 時間に始めた実行の数と、その上限です。activeは、今動いている実行の数と、同時実行の上限です。- 数はアカウント全体で数えます。上の数字は例です。上限の値は、
/quotaで確かめてください。
コピーして使える最小のクライアント
Node.js 18 以上で動きます。追加の依存はありません。
実行を始め、終わるまで待ち、結果を表示します。
run.mjs として保存し、KAMUI_API_KEY=kamui_sk_... node run.mjs "作業の指示" で動かします。
// run.mjs — 追加の依存なし(Node 18 以上)
import { randomUUID } from "node:crypto";
const BASE = "https://www.kamui.ai/api/cloud";
const post = async (path, body, extraHeaders = {}) => {
const r = await fetch(BASE + path, {
method: "POST",
headers: {
"content-type": "application/json",
"x-kamui-api-key": process.env.KAMUI_API_KEY,
...extraHeaders,
},
body: JSON.stringify(body),
});
const j = await r.json();
if (!r.ok) throw new Error(`${path} ${r.status}: ${j.error ?? ""}`);
return j;
};
// 起動: repoUrl を付けると Git で、省くとテキストで受け取る
const { runId } = await post(
"/launch",
{
serverAuth: true,
engine: "codex",
prompt: process.argv[2] ?? "1+1 の答えだけを返してください",
},
{ "Idempotency-Key": randomUUID() },
);
console.log("runId:", runId);
// 終わるまで待つ(waitS は 1 回で最大 25 秒)
let res;
do {
res = await post("/result", { runId, waitS: 25 });
console.log("status:", res.status);
} while (!res.terminal);
console.log(res.resultText ?? res.resultTextWithheld ?? JSON.stringify(res.artifact));