コンテンツにスキップ
FreshApp Demo

開発者向けドキュメント

生成 API ドキュメント

生成 API を使って、自分のコードから当サイトのモデルで生成を作成します。リクエストにはモデルとその入力を書き、返ってきた生成を終わるまで追跡して、ファイルを当サイトからダウンロードします。このページのモデル、料金、上限、エラーコードは、いま実際に適用されているものです。

API で生成を作成するには、有料のクレジットパックか有効な有料サブスクリプションが必要で、使われるのは有料クレジットだけです。読み取り、一覧、ダウンロードはアカウントのどのキーでもできます。

クイックスタート

API キーのページでキーを作成し、サーバーにだけ置いて API_KEY に設定します。以下の例では seed-audio-1.0 で生成を作成し、終わるまで読み取って、最初のファイルをダウンロードします。

新しいリクエストごとに新しい Idempotency-Key を送ります。応答がなかったときは、同じキーと同じ本文で送り直してください。最初のリクエストが作った生成が返り、請求は 1 回だけです。

cURL

export API_ORIGIN='https://demo.freshapp.ai'
export API_KEY='sk_YOUR_API_KEY'

curl --fail-with-body "$API_ORIGIN/api/v1/generations" \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: order-1001' \
  -d '{"model":"seed-audio-1.0","input":{"prompt":"夜明けの崖に立つ灯台、穏やかな海、やわらかな光。"}}'

# Read it every 5 to 10 seconds until its status ends.
curl --fail-with-body "$API_ORIGIN/api/v1/generations/GENERATION_ID" \
  -H "Authorization: Bearer $API_KEY"

# A delivered output's url is a signed link: no key needed.
curl --fail-with-body -o result "OUTPUT_URL"

TypeScript クライアント

import { createClient } from './open-api-client';

const client = createClient({
  baseUrl: "https://demo.freshapp.ai",
  apiKey: process.env.API_KEY, // on your server only
});
const generation = await client.create(
  {
    "model": "seed-audio-1.0",
    "input": {
      "prompt": "夜明けの崖に立つ灯台、穏やかな海、やわらかな光。"
    }
  },
  { idempotencyKey: "order-1001" }
);
const done = await client.wait(generation.id);
for (const output of done.outputs)
  if (output.status === 'delivered') {
    const file = await client.download(output);
    // file.body is the output, as output.content_type says
  }

React フック

import { createClient } from './open-api-client';
import { useGeneration } from './open-api-react';

// In a browser on this site: no key, the visitor's own session.
const client = createClient();

export function Progress({ id }: { id: string }) {
  const { generation, error, done } = useGeneration(client, id);
  if (error) return <p>{String(error)}</p>;
  return <p>{generation?.status ?? '…'}{done ? ' ✓' : ''}</p>;
}

キーと権限

すべてのリクエストは、API キーのページで作成したキーを Authorization: Bearer に付けて送ります。キーは sk_ に続く 43 文字の英数字、ハイフン、アンダースコアで、作成時とローテーション時に一度だけ表示されます。Authorization 付きのリクエストはキーだけで判断され、横にあるログイン状態が使われることはありません。

キーは読み取り専用(一覧・取得・ダウンロード)か、生成も可能(作成とキャンセル)のどちらかです。読み取り専用のキーで作成やキャンセルをしようとすると 403 insufficient_scope になり、何も書き込まれません。

キーにはアドレスとネットワークからなる IP 許可リストを付けられます。それ以外のアドレスからは 403 ip_not_allowed になります。キーの権限を広げる、上限を上げる、許可リストを広げるには最近のログインが必要ですが、狭めるときは不要です。

キーをローテーションするとすぐに新しい値になり、古い値は使えなくなります。キーを無効にするとそれきり使えません。まだモデルに送っていない生成はキャンセルされてクレジットが戻り、すでに進行中の生成はそのまま完了します。

API で生成を作成できるのは有料の利用資格があるアカウントだけで(ない場合は 403 not_eligible)、API が使うのは有料クレジットだけです(足りない場合は 402 insufficient_credits)。プレゼントやチェックインのクレジットはウェブサイト用に残ります。

生成 API のエンドポイント

すべてのパスは当サイト上にあります。リクエストとレスポンスの本文は、結果ファイルを除いて JSON です。

https://demo.freshapp.ai

メソッドパス必要な権限内容
POST/api/v1/generationsgenerations:write生成を作成します。Idempotency-Key が必要で、202 と生成を返します。
GET/api/v1/generationsgenerations:readアカウントの生成を新しい順に、ページ単位で返します(limit、cursor、module)。テキストの生成は ID で読み取るだけです。
GET/api/v1/generations/{id}generations:readアカウントの生成 1 件を、出力、クレジット、終了の理由とともに返します。
POST/api/v1/generations/{id}/cancelgenerations:writeまだモデルに送っていない生成をキャンセルし、クレジットを戻します。
GET, HEAD/api/media/{id}generations:read (または署名付きリンク)出力のファイルです。バイト範囲は 1 つまで。署名付きリンクはキー不要で、どのアドレスからでも使えます。

モデルと料金

当サイトで有効なモデルを、API での書き方で示します。ID を model に、フィールドを input に指定してください。リクエストは作成時に最も高くなる場合の額を確保し、終わったら納品された分だけ支払います。

モデル ID名前種類料金1 回の最大入力フィールド
seed-audio-1.0Seed Audio 1.0音声1 分あたり 75 クレジット; 納品時は最低 10 クレジット150 クレジットprompt (必須), voice, audio_references, image_url, output_format, sample_rate, speed, volume, pitch, multilingual

冪等性

生成の作成には、1〜128 文字の英数字、ピリオド、コロン、アンダースコア、ハイフンからなる Idempotency-Key ヘッダーが必要です。注文番号など自分のシステムの ID を使えば、同じ作業にはいつも同じキーが付きます。

同じキーと同じリクエストなら、何度送っても同じ生成が返り、請求は 1 回だけです。同じキーで別のリクエストを送ると 409 idempotency_conflict になり、何も作成されません。

タイムアウトや接続の切断は、リクエストが失敗したという意味ではありません。同じキーと同じ本文で送り直し、応答が来るまで両方を保管してください。5xx、429、408 も同じで、Retry-After のとおり待ってから同じリクエストをそのまま送り直します。

ステータスとポーリング

GET /api/v1/generations/{id} で生成を読み取ります。最初は 5 秒ごと、その後は最長 10 秒ごとに、ステータスが終わるまで続けてください。429 のときは Retry-After に次に読み取る時期が書かれています。

ステータス意味
queued受け付け済みで、モデルに送られるのを待っています。まだキャンセルできます。
processingモデルに送られたか、ファイルの保存と精算の最中です。
succeededすべての出力が納品され、クレジットの精算も済みました。
partially_succeeded一部の出力が納品されて請求され、残りの分のクレジットは戻りました。
failed何も納品されませんでした。理由は error にあり、確保したクレジットは戻りました。
canceled送られる前に、あなたが、またはキーの無効化によってキャンセルされました。クレジットは戻りました。

billing.reserved_credits は生成の作成時に確保した額です。精算後は charged_credits が支払った額、refunded_credits が戻った額になり、それまではどちらも null で、held_credits に確保中の額が出ます。

手動の確認を待っている生成には、確認の開始時刻が review に表示され、確認が終わるまでクレジットを確保したままです。その後、生成が続くか、クレジットが戻ります。

結果ファイル

納品された出力にはそれぞれ当サイト上の url があります。キーで読み取った場合は署名付きリンクで、1 時間はキーなしでどのアドレスからでも開けるので、そのままダウンロードツールに渡せます。1 時間を過ぎたら、生成をもう一度読み取って新しいリンクを受け取ってください。

キーそのものを使って GET /api/media/{id} からファイルを取得することもでき、その場合はキーの許可リストが適用されます。どちらも HEAD と 1 つのバイト範囲(Range: bytes=0-1023)に対応し、ほかのサイトへリダイレクトすることはありません。

入力で参照するファイル(音声サンプルや画像など)は、このアカウントがウェブサイトでアップロードしたもの、当サイトのサンプル、または当サイトが許可するソースへのリンクである必要があります。それ以外はクレジットを確保する前に拒否されます。

上限

以下はいずれも当サイトがいま適用している上限で、拒否されたときはどれに達したかが示されます。

  • 1 回のリクエストで確保できるのは最大 150 クレジットで、有効なモデルのうち最も高いリクエストの料金です。キーにもっと低い値を設定でき、リクエストの max_credits でその回だけさらに下げられます。超えると 400 request_limit_exceeded になります。
  • キーごとに 1 UTC 日あたり最大 5,000 クレジットで、キーごとの上限を最大 1,000,000 まで設定できます。超えたキーは次の UTC 日まで 429 key_daily_limit_exceeded になります。
  • アカウントのすべてのキーとその AI クライアントの合計は、1 UTC 日あたり最大 10,000 クレジットで、アカウント独自の上限も設定できます。超えると 429 account_daily_limit_exceeded になります。
  • キーごと・アカウントごとに、1 分あたり作成とキャンセルは 20 回、読み取りとダウンロードは 240 回までです。超えると Retry-After 付きの 429 rate_limited になります。
  • 1 つのアカウントで同時に実行できる生成は最大 2 件で、それ以上は 429 too_many_active で待つことになります。
  • リクエスト本文は最大 32 KiB の JSON で、それより大きいと 413 request_too_large になります。

エラーコード

エラーは {"error": {"code": …, "message": …}} の形で返ります。code は必ず次の表のどれかで、message は開発者向けの英語の説明です。429 と 503 では、待つ秒数が Retry-After に入ります。失敗またはキャンセルされた生成は、生成用と記されたコードのどれかを error フィールドに持ちます。

HTTPコード意味対処
401invalid_credentialAPI キーがない、形式が正しくない、存在しない、無効にされた、または置き換えられました。API キーとその権限、許可リストを確認してください。
401credential_revokedリクエストの処理中にキーが無効化またはローテーションされました。無効にされたキーの待機中の生成はキャンセルされ、クレジットが戻ります。API キーとその権限、許可リストを確認してください。
403insufficient_scopeこのキーではこの操作ができません。必要な権限はエラーの required_scope にあります。API キーとその権限、許可リストを確認してください。
403ip_not_allowedこのアドレスからはこのキーを使えません。キーの IP 許可リストの外です。API キーとその権限、許可リストを確認してください。
401unauthorizedウェブサイトのログインが切れました。もう一度ログインしてください。リクエストを直してから送り直してください。
403invalid_originウェブサイトからのリクエストは当サイト自身から送る必要があります。リクエストを直してから送り直してください。
403forbidden信頼できるクライアントのアドレスがないリクエストです。サイトのサポートにお問い合わせください。
400invalid_requestリクエストの形式が正しくありません(JSON、ヘッダー(Idempotency-Key、Content-Type)、またはクエリ)。リクエストを直してから送り直してください。
400invalid_input入力がモデルのフィールドに合わないか、モデルが使えない入力です。リクエストを直してから送り直してください。
413request_too_largeリクエスト本文が大きすぎます。リクエストを直してから送り直してください。
409idempotency_conflictこの Idempotency-Key はすでに別のリクエストに使われています。リクエストを直してから送り直してください。
404model_unavailableモデルが存在しないか、現在は使えません。リクエストを直してから送り直してください。
404not_foundこのアカウントにはそのパス、生成、ファイルはありません。リクエストを直してから送り直してください。
405method_not_allowedこのパスはこのメソッドを受け付けません。使えるものは Allow に並んでいます。リクエストを直してから送り直してください。
409not_cancelable生成はすでにモデルに送られたか、終わっています。リクエストを直してから送り直してください。
409not_readyファイルの準備がまだできていません。Retry-After のとおり待ってから送り直してください。
410expired保存期間を過ぎたため、ファイルは削除されました。リクエストを直してから送り直してください。
400request_limit_exceededこのリクエストの料金が max_credits、またはキーやサイトの 1 回あたりの上限を超えます。リクエストを直してから送り直してください。
403not_eligibleAPI で生成するには有料のアカウントが必要です。クレジットパックかプランを購入してください。API が使うのは有料クレジットだけです。
403email_unverified生成するにはアカウントのメールアドレスを確認してください。リクエストを直してから送り直してください。
402insufficient_creditsクレジットが足りません。API が使うのは有料クレジットだけです。クレジットパックかプランを購入してください。API が使うのは有料クレジットだけです。
403generation_restrictedコンテンツの拒否が続いたため、このアカウントの生成は一時停止中です。いつまでかは ends_at にあります。サイトのサポートにお問い合わせください。
403trial_pausedお試しの出力が何度か上限を超えたため、このアカウントのウェブサイトのお試しは一時停止中です。いつまでかは ends_at にあります。お試しでないリクエストはこれまでどおり使えます。リクエストを直してから送り直してください。
429key_daily_limit_exceededこのキーの 1 日の支出上限に達しました。Retry-After のとおり待ってから送り直してください。 Retry-After:次の UTC 日まで。
429account_daily_limit_exceededアカウントの API での 1 日の支出上限に達しました。Retry-After のとおり待ってから送り直してください。 Retry-After:次の UTC 日まで。
429rate_limited短時間にリクエストが多すぎます。Retry-After のとおり待ってから送り直してください。 Retry-After:制限期間の残り。
429too_many_activeアカウントで実行中の生成が多すぎます。Retry-After のとおり待ってから送り直してください。 Retry-After:30 秒。
429too_many_under_reviewアカウントの生成の一部が手動の確認を待っています。Retry-After のとおり待ってから送り直してください。 Retry-After:3,600 秒。
503busy現在、サイト全体で実行中の生成が多すぎます。Retry-After のとおり待ってから送り直してください。 Retry-After:30 秒。
503paused生成は現在一時停止しています。Retry-After のとおり待ってから送り直してください。 Retry-After:60 秒。
503temporarily_unavailableいまはリクエストを完了できませんでした。同じ Idempotency-Key で同じリクエストを送り直してください。 Retry-After:60 秒。
503api_unavailableこのサイトではまだ生成を利用できません。Retry-After のとおり待ってから送り直してください。 Retry-After:60 秒。
503retryリクエストの処理中に、キーの設定などが変わりました。同じ Idempotency-Key で同じリクエストを送り直してください。 Retry-After:60 秒。
503unavailableファイルに一時的にアクセスできません。Retry-After のとおり待ってから送り直してください。 Retry-After:60 秒。
500internal_errorサイトで問題が発生しました。同じ Idempotency-Key で同じリクエストを送り直してください。
400request_failed専用のコードがない理由でリクエストが拒否されました。サイトのサポートにお問い合わせください。
400captcha_requiredウェブサイトのセキュリティチェックを完了してください。リクエストを直してから送り直してください。
403captcha_failedウェブサイトのセキュリティチェックに通りませんでした。リクエストを直してから送り直してください。
503captcha_unavailableウェブサイトのセキュリティチェックが利用できません。Retry-After のとおり待ってから送り直してください。 Retry-After:60 秒。
400reference_unavailable参照しているアップロードがないか、このアカウントのものではありません。リクエストを直してから送り直してください。
413reference_too_large参照するアップロードは合計 10 MB までです。リクエストを直してから送り直してください。
503reference_storage_unavailable参照ファイルの保存先が利用できません。Retry-After のとおり待ってから送り直してください。 Retry-After:60 秒。
409storage_quota_exceededアカウントの保存容量がいっぱいです。サイトのサポートにお問い合わせください。
生成の中canceled生成は送られる前にキャンセルされ、クレジットは戻りました。リクエストを直してから送り直してください。
生成の中submission_expired生成を時間内に送れなかったため、クレジットは戻りました。同じ Idempotency-Key で同じリクエストを送り直してください。
生成の中model_busyモデルが混み合っていたため、クレジットは戻りました。Retry-After のとおり待ってから送り直してください。
生成の中content_rejectedコンテンツの安全チェックで入力または出力が拒否されました。リクエストを直してから送り直してください。
生成の中result_expired結果を時間内に保存できませんでした。サイトのサポートにお問い合わせください。
生成の中generation_failed生成に失敗しました。サイトのサポートにお問い合わせください。
生成の中delivery_failed結果を納品できなかったため、クレジットは戻りました。サイトのサポートにお問い合わせください。
生成の中trial_limit_exceededウェブサイトのお試しの出力が上限を超えたため納品されず、クレジットは戻りました。リクエストを直してから送り直してください。

TypeScript クライアントと React フック

TypeScript クライアント open-api-client.ts はほかのパッケージを必要とせず、サーバー、ワーカー、ブラウザで動きます。サーバーでは baseUrl と apiKey を渡し、当サイト上のブラウザではどちらも渡さなければ、訪問者自身のログイン状態でリクエストします。

create は Idempotency-Key(指定したもの、または新しいランダム値)を送り、接続の切断、5xx、429、408 のときは Retry-After のとおり待ってから同じリクエストを送り直します。あきらめたときはエラーにキーが入っているので、あとでそのキーで送り直せます。localStorage などの store を渡すと、ページを再読み込みしても最初のキーが使われます。

wait は生成を終わるまで読み取ります。間隔は最初 5 秒、その後は最長 10 秒で、中止するとすぐに止まります。download は出力のファイルを取得し、キーを付けるのは当サイト自身の署名なしリンクだけです。

React フック open-api-react.ts はクライアントの wait で生成を 1 件追跡し、コンポーネントがアンマウントされると止まります。2 つのファイルをダウンロードして同じ場所に置き、拡張子を .ts に変えてください。

ダウンロード