Seedream 5.5 is live on Atlas Cloud — native transparent PNG & 80+ round editing

開發人員的生成式 AI API:別再交付「成功」的失敗

為開發人員提供的生成式 AI API 可讓您的應用程式將輸入傳送給模型,並接收生成的內容。請根據您所需的輸入、輸出格式、等待時間和驗收標準來選擇。

你的請求成功回傳。但應用程式仍然沒有可用的圖片。也許回應中包含了任務 ID,或是完成的圖片多了一個物件,導致它不適合放在頁面上。

開發者適用的生成式 AI API 讓你的應用程式將輸入傳送給模型,並接收生成的內容。請依照你所需的輸入、輸出格式、等待時間與驗收標準來選擇。接著建立任務處理與檢查機制,把回應轉換成使用者可以使用的成果。

本指南會帶你走完從選擇到交付的圖片工作流程。你將獲得任務選擇表、對應的 JavaScript 與 Python 範例、3 個具體的圖片需求,以及一份成本計算表。同樣的決策流程也適用於文字與影片,只是協定與輸出檢查不同。

重點摘要

  • 先選擇任務與驗收標準,再選擇模型。
  • 儲存非同步任務 ID,讓中斷的工作可以續行。
  • 衡量每個被接受輸出的成本,包括被拒絕的生成結果。
  • 在顯示完成結果之前,先測試檔案與業務限制。

開發者適用的生成式 AI API:功能為何

模型負責執行生成。API 定義你的軟體如何請求這項工作。SDK 則以特定語言的輔助工具包裝介面。託管平台負責營運模型的存取,而你的應用程式則提供使用者體驗、權限,以及接受結果的規則。

在閱讀產品頁面時,這些區別很重要。一款能生成圖片的聊天應用程式,並不代表它的開發者端點接受相同的輸入。SDK 就算提供方便的方法,也不代表你不需要了解其底層回應與失敗狀態。

請從以下任務對照表開始。互動欄位描述的是可評估的應用程式設計,而不是保證每家供應商都支援該模式。

任務輸入所需能力輸出待評估的互動方式驗收標準
客服回覆草稿工單與已核准的說明內容有依據的文字生成草稿文字同步或串流能回覆工單;不捏造政策
文件欄位擷取文件文字或支援的檔案結構化擷取JSON 欄位請求或排隊任務結構描述有效且有來源佐證
編輯插圖書面視覺需求文字轉圖片圖片檔案非同步任務物件、版面、尺寸正確
圖片編輯來源圖片與指令以圖片為條件的編輯編輯後的圖片非同步任務完成要求的變更;保留細節
影片生成提示詞或支援的參考資料影片生成影片檔案排隊任務長度、動態正確,必要時包含音訊
檢索輔助回答問題與檢索到的段落檢索加上生成回答與參考資料同步或串流主張有檢索到的段落佐證

生成圖片、分析上傳的圖片,以及編輯既有圖片,是三種不同的能力。請逐一明確驗證。同樣地,影片端點可能支援起始畫面,卻不支援任意的多圖片參考。

嵌入向量會將輸入轉換成可用於檢索與相似度計算的向量。它們能協助在生成回答之前找到相關文件。但嵌入向量本身不會產生回答,也不能證明檢索到的內容支持其主張。

實務上的界線是輸入 → 請求 → 輸出 → 應用程式驗收。最後這個階段由你負責。生成的發票欄位仍需要驗證;圖片仍需要檢查;客服回覆仍需要確認是否有權做出其中所承諾的事。

協定選擇也各不相同。Google 的參考文件區分了標準生成、串流與即時互動。請將這視為互動模式各有差異的證據,而不是假設其他服務也有一樣的支援。(Google Gemini API 參考文件,2026 年 9 月存取。)

開發者適用的生成式 AI API:如何選擇

在比較各家型錄之前,先寫一份簡短的驗收需求。以編輯圖片功能為例,這可能包含指定橫向輸出、限制物件數量、不得出現可見品牌,以及人工審查步驟。以工單分類為例,則可能指定固定的標籤集,以及明確的「不確定」結果。

請依下列順序評估候選方案:

  1. 輸入與輸出。 針對支援的檔案、輸入限制、輸出格式與參考圖片行為,檢查確切的模型端點。模型系列名稱過於籠統,不足以做為合約依據。
  2. 任務符合度。 嘗試具代表性的需求,包括棘手的情況。將限制條件失敗與檔案或網路失敗分開計算,才能知道需要修正什麼。
  3. 整合適配度。 確認驗證機制、回應封裝、任務狀態值,以及用戶端程式庫支援。也要納入將這些調整至現有後端所需的工作。
  4. 等待時間與並行處理。 決定使用者是否可以離開再回來。在承諾提供有短時限的互動體驗之前,先測試你預期的工作負載。
  5. 計費透明度。 確認計費單位,以及哪些設定會改變計費。檢查失敗與退費的處理方式,而不是假設每個送出的請求都收取相同費用。
  6. 資料要求。 對照你實際打算傳送的資料,檢視輸入處理、保留、刪除與適用條款。在使用敏感資料之前,先記錄尚未釐清的問題。
  7. 變更管理。 保留一組回歸測試,並記錄模型識別碼、提示詞與參數。規劃在更新或替換後,你要如何重新評估行為。

機構指引說明了為什麼存取與資料規則應納入這項決策:哈佛大學描述了其 AI 開發者工具的核准存取途徑與限制。那些是哈佛大學的安排,並非你應用程式的通用許可。(Harvard University Information Technology,2026 年 9 月存取。)

存取途徑適合的團隊整合工作營運責任主要限制選擇前應驗證
直接使用模型供應商專注於單一供應商能力的團隊供應商專屬 API、帳號、轉接器你的應用程式與任務;供應商推論增加供應商會增加各自獨立的合約端點功能、地區、配額、條款
多模型託管平台評估多個支援模型的團隊共用存取加上各模型專屬驗證你的應用程式與任務;平台託管的推論共用存取並未統一所有參數確切模型、結構描述、計費、資料路徑
自行託管的開放模型具備基礎架構與模型服務能力的團隊部署、對外提供、保護並維護推論硬體、服務、擴充、監控、更新容量與工程負擔授權、硬體相容性、輸送量、維護

Atlas Cloud 是當同一個應用程式需要多種模型能力時,可評估的一種託管選項。本文以其圖片任務介面做為具體範例。你仍然需要驗證每個模型的輸入與輸出;只更改模型 ID 並不足夠。

image.png

官方圖片端點文件,顯示輸出格式、品質與尺寸限制

模型專屬參數是整合合約的一部分。在重複使用請求內容之前,請先閱讀其允許的值。

對小型 SaaS 團隊來說,有用的比較基準是交付一個被接受結果的總投入。除了推論費用之外,也要納入轉接器程式碼、支援調查、審查時間與遷移測試。這樣才能避免方便的原型掩蓋了昂貴的正式環境工作流程。

開發者適用的生成式 AI API:第一個請求

本範例使用 GPT Image 2 Text-to-Image,模型 ID 為 openai/gpt-image-2/text-to-image。其端點文件列出 quality: high、size: 2048x1152 與 output_format: png。這些是以下範例所請求的設定。

1. 先在測試環境中確認提示詞。 使用下方的早餐需求,不要加入參考圖片。按下「執行」之前,先確認模型名稱與已套用的設定。若某個選項在你離開欄位後會回復,那就不是你要求的設定。

plaintext
1Create a realistic editorial food photograph for an article about a simple breakfast.
2
3On a light oak table, show exactly one white ceramic plate holding exactly two slices of toasted sourdough bread, one small clear glass bowl of strawberry jam, and one stainless steel butter knife resting to the right of the plate.
4
5Use soft morning window light from the left, natural colors, a three-quarter overhead camera angle, and realistic bread texture. Keep every requested object fully inside the frame.
6
7No people, no hands, no drinks, no extra dishes, no packaging, no logos, no text, and no watermark. Landscape composition, 16:9.

2. 將驗證機制保留在伺服器端。 你的前端應請求自己的後端來啟動任務。將 ATLAS_API_KEY 存放在伺服器環境中。絕不要將它放入瀏覽器 JavaScript、圖片 URL 或使用者端可見的日誌中。將 ATLAS_API_HOST 設為 api.atlascloud.ai;這是主機名稱,不含通訊協定或路徑。

3. 只提交一次並保存 ID。 文件記載的生成路由是 POST /api/v1/model/generateImage。讀取 data.id,然後將它對應到你的應用程式任務並儲存。如果提交的回應遺失,請先調查,再建立另一個可能計費的任務。

4. 輪詢已儲存的任務。 查詢 GET /api/v1/model/prediction/{prediction_id}。預測文件 說明了 processing、completed 與 failed 狀態,輸出 URL 位於 data.outputs。即使狀態為 completed,仍應檢查輸出陣列是否非空。

5. 下載並驗證。 將檔案儲存在你的控管之下,確認它可以正常解碼,並對照需求檢查。唯有如此,才將被接受的結果回傳給應用程式。下載或驗證錯誤應保留並附加在既有任務上。

以下程式碼是根據官方介面文件整理而成,並非做為即時 API 效能基準。本文的媒體工作流程使用瀏覽器測試環境,而非 API 金鑰。

將確切的早餐提示詞存為 prompt.txt。若使用 Node.js,請使用內建 fetch 的環境,安裝 sharp,並將此程式碼存為 generate.mjs。在專用的工作目錄中執行。除非你刻意要建立兩個任務,否則只執行兩種語言範例中的其中一個。

javascript
1import { readFile, writeFile, mkdir } from 'node:fs/promises';
2import sharp from 'sharp';
3
4const key = process.env.ATLAS_API_KEY;
5const host = process.env.ATLAS_API_HOST;
6if (!key || host !== 'api.atlascloud.ai') {
7  throw new Error('Set ATLAS_API_KEY and ATLAS_API_HOST');
8}
9const base = 'https:' + '//' + host;
10const headers = { Authorization: `Bearer ${key}` };
11const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
12const payload = {
13  model: 'openai/gpt-image-2/text-to-image',
14  prompt: await readFile('prompt.txt', 'utf8'),
15  quality: 'high', size: '2048x1152', output_format: 'png'
16};
17await mkdir('output', { recursive: true });
18await writeFile('output/request.json', JSON.stringify(payload, null, 2));
19
20async function api(path, method = 'GET', body) {
21  const response = await fetch(base + path, {
22    method,
23    headers: { ...headers, 'Content-Type': 'application/json' },
24    body: body ? JSON.stringify(body) : undefined,
25    signal: AbortSignal.timeout(30000)
26  });
27  const requestId = response.headers.get('x-request-id');
28  console.error(JSON.stringify({ method, status: response.status, requestId }));
29  if (!response.ok) {
30    const error = new Error(`HTTP ${response.status}; request ${requestId}`);
31    error.retryable = [429, 500, 503, 504].includes(response.status);
32    throw error;
33  }
34  const json = await response.json();
35  if (!json.data) throw new Error('Missing response data');
36  return json.data;
37}
38
39let id = process.env.PREDICTION_ID;
40try {
41  if (!id) {
42    // Deliberately no automatic retry for submission.
43    const submitted = await api('/api/v1/model/generateImage', 'POST', payload);
44    id = submitted.id;
45    if (typeof id !== 'string' || !id) throw new Error('Missing prediction ID');
46    await writeFile('output/prediction-id.txt', id);
47  }
48  const deadline = Date.now() + 600000;
49  let errors = 0;
50  let outputUrl;
51  while (Date.now() < deadline) {
52    let job;
53    try {
54      job = await api('/api/v1/model/prediction/' + encodeURIComponent(id));
55      errors = 0;
56    } catch (error) {
57      const transient = error.retryable ||
58        ['TimeoutError', 'AbortError'].includes(error.name) ||
59        error instanceof TypeError;
60      if (!transient || ++errors > 3) throw error;
61      await sleep(Math.min(30000, 1000 * 2 ** errors) + Math.random() * 500);
62      continue;
63    }
64    if (job.status === 'failed') {
65      throw new Error(`Task failed; code ${job.error_code ?? 'unknown'}`);
66    }
67    if (job.status === 'completed') {
68      outputUrl = job.outputs?.[0];
69      if (typeof outputUrl !== 'string' || !outputUrl) {
70        throw new Error('Completed task has no output');
71      }
72      break;
73    }
74    if (job.status !== 'processing') throw new Error('Unexpected task status');
75    await sleep(2000);
76  }
77  if (!outputUrl) throw new Error('Polling deadline reached; resume this ID');
78  const url = new URL(outputUrl);
79  if (url.protocol !== 'https:') throw new Error('Unexpected output protocol');
80  // Do not forward the API credential to the media host.
81  const file = await fetch(url, { signal: AbortSignal.timeout(60000) });
82  if (!file.ok) throw new Error(`Download HTTP ${file.status}`);
83  const bytes = Buffer.from(await file.arrayBuffer());
84  await sharp(bytes, { limitInputPixels: 20000000 }).raw().toBuffer();
85  const meta = await sharp(bytes).metadata();
86  if (meta.format !== 'png' || meta.width !== 2048 || meta.height !== 1152) {
87    throw new Error('File format or dimensions differ from the request');
88  }
89  await writeFile('output/breakfast.png', bytes);
90  console.log(JSON.stringify({ id, state: 'ready_for_review',
91    file: 'output/breakfast.png' }));
92} catch (error) {
93  console.error(JSON.stringify({ id: id ?? null, state: 'needs_attention',
94    error: error.message }));
95  process.exitCode = 1;
96}

較短的 Python 等效版本使用 requests 與 Pillow、相同的 prompt.txt,以及完全相同的設定。它也接受 PREDICTION_ID 以便續行。這些指令碼示範的是單一本機任務;部署後的服務則需要持久的任務記錄與有上限的下載。

python
1import io, json, os, random, time
2from pathlib import Path
3from urllib.parse import quote, urlparse
4import requests
5from PIL import Image
6
7key = os.environ['ATLAS_API_KEY']
8assert os.environ['ATLAS_API_HOST'] == 'api.atlascloud.ai'
9base = 'https:' + '//' + os.environ['ATLAS_API_HOST']
10headers = {'Authorization': 'Bearer ' + key}
11out = Path('output')
12out.mkdir(exist_ok=True)
13payload = dict(model='openai/gpt-image-2/text-to-image',
14               prompt=Path('prompt.txt').read_text(encoding='utf-8'),
15               quality='high', size='2048x1152', output_format='png')
16job_id = os.getenv('PREDICTION_ID')
17try:
18    if not job_id:
19        # A submission timeout needs investigation, not a blind retry.
20        r = requests.post(base + '/api/v1/model/generateImage',
21                          headers=headers, json=payload, timeout=30)
22        r.raise_for_status()
23        job_id = r.json()['data']['id']
24        if not isinstance(job_id, str) or not job_id:
25            raise ValueError('Missing prediction ID')
26        (out / 'prediction-id.txt').write_text(job_id)
27    deadline, errors, url = time.monotonic() + 600, 0, None
28    while time.monotonic() < deadline:
29        try:
30            r = requests.get(base + '/api/v1/model/prediction/' +
31                             quote(job_id, safe=''), headers=headers, timeout=30)
32            r.raise_for_status()
33        except requests.RequestException as exc:
34            status = exc.response.status_code if exc.response is not None else None
35            if status not in (None, 429, 500, 503, 504) or errors >= 3:
36                raise
37            errors += 1
38            time.sleep(min(30, 2 ** errors) + random.random() / 2)
39            continue
40        errors = 0
41        job = r.json()['data']
42        if job['status'] == 'failed':
43            raise RuntimeError('Task failed: ' + str(job.get('error_code')))
44        if job['status'] == 'completed':
45            outputs = job.get('outputs') or []
46            if not outputs or not isinstance(outputs[0], str) or not outputs[0]:
47                raise ValueError('Completed task has no output')
48            url = outputs[0]
49            break
50        if job['status'] != 'processing':
51            raise ValueError('Unexpected task status')
52        time.sleep(2)
53    if not url:
54        raise TimeoutError('Polling deadline reached; resume this ID')
55    if urlparse(url).scheme != 'https':
56        raise ValueError('Unexpected output protocol')
57    r = requests.get(url, timeout=60)  # No Authorization header here.
58    r.raise_for_status()
59    with Image.open(io.BytesIO(r.content)) as image:
60        image.load()
61        if image.format != 'PNG' or image.size != (2048, 1152):
62            raise ValueError('Unexpected file format or dimensions')
63    (out / 'breakfast.png').write_bytes(r.content)
64    print(json.dumps(dict(id=job_id, state='ready_for_review')))
65except Exception as exc:
66    print(json.dumps(dict(id=job_id, state='needs_attention', error=str(exc))))
67    raise SystemExit(1)

image.png已完成的 GPT Image 2 測試環境,顯示送出的早餐提示詞與完成的輸出

一次完成的測試環境執行,會一併記錄送出的提示詞、輸出尺寸、品質設定與生成的結果。

輪詢期限會讓這個用戶端停止等待,但不會取消伺服器端的工作。已在進行中的請求可能在輪詢時間結束後才完成,因此這並非嚴格的端對端延遲保證。請保留 ID,並讓背景工作者稍後再檢查。

開發者適用的生成式 AI API:實務應用

以下 3 個需求測試不同的要求。它們是各自獨立的請求,而不是其中一個結果成為下一個輸入的鏈結。請維持相同的模型與請求設定,讓各需求之間的差異容易理解。

A. 美食編輯圖片:數量與位置。 早餐提示詞測試輸出是否包含 2 片吐司、1 個盤子、1 個果醬碗與 1 把刀子。刀子必須位於盤子右側,且所有必要物件都必須完整留在畫面內。

image.png

早餐圖片生成範例,搭配物件數量與刀子位置檢查sT生成的結果包含所要求的盤子、吐司、果醬碗與右側刀子,可供下方的位置審查使用.

請逐一檢查重疊的切片。視覺上很逼真的早餐,仍可能因為背景出現杯子或刀子移到盤子上而判定失敗。如果結果不合格,請修改含糊的空間指令、一次只改一個變項,並保留拒絕原因。避免反覆要求「整體更好」的圖片。

B. 文章封面:可用的標題空間。 這項請求將構圖視為版面配置的相依條件。頁面編輯需要左側留有空白,右側則放置工具與花盆。之後再使用 HTML/CSS 加入實際標題,使其保持可編輯且易讀。

plaintext
1Create a realistic editorial photograph for an article about repairing everyday objects.
2
3On the right half of a light wooden workbench, show one pair of worn gardening gloves, one small metal hand trowel, and one unbranded terracotta plant pot. The left 45 percent of the image must remain an empty, softly lit section of the same workbench, suitable for adding a headline later.
4
5Use natural side light from a nearby window, believable material textures, neutral colors, and a slightly elevated camera angle.
6
7No people, no hands, no extra tools, no plants, no logos, no letters, no text, and no watermark. Landscape composition, 16:9.

image.png工作檯封面範例,顯示所要求的左側標題空間與右側物件

結果在左側保留了可用的空白,同時將手套、花盆與鏟子留在右側。

請在預定的發佈裁切比例下檢查結果。當行動版卡片從中央裁切時,橫向主圖可能會失去有用的空白區域。如果構圖不合格,請指定更嚴格的物件邊界,或變更應用程式的裁切方式。不要藉由把文字放在所要求的物件上來掩蓋失敗。

C. 布料插圖:細節與順序。 下一個請求要求 3 塊折疊的布料樣本,且可見紋理要能區辨。它測試數量、位置,以及結果在以讀者實際看到的尺寸呈現時,是否足以做為說明性插圖。

plaintext
1Create a realistic close-up editorial photograph for an article explaining common fabric textures.
2
3Show exactly three folded fabric swatches arranged side by side on a neutral matte gray surface: natural beige linen on the left, blue cotton denim in the center, and dark green wool on the right.
4
5Use the same soft daylight across all three fabrics, an overhead camera angle, and sufficient depth of field to keep the visible weave of each fabric in focus. Preserve natural wrinkles and believable fiber detail.
6
7No labels, no rulers, no sewing tools, no hands, no additional objects, no text, no logos, and no watermark. Landscape composition, 16:9.

image.pngAI 生成的布料插圖,附米色、藍色與深綠色樣本位置檢查

所要求的三塊樣本在視覺上可清楚區分。這個生成的紋理只是插圖,並非真實產品纖維組成的證據。

如果中間的樣本缺乏可辨識的織紋,請記錄該問題,並調整取景或細節指令。絕不要將生成的紋理描述為真實產品的實測特性。

文字功能也需要同樣嚴謹的檢查。以工單分類為例,請拒絕允許集合之外的標籤,並保留一條「不確定」的路徑。以文件擷取為例,除了可解析的 JSON 之外,還要要求欄位與來源範圍。語法上有效的回應,仍可能把錯誤的金額放進錯誤的欄位。

開發者適用的生成式 AI API:處理失敗

請分別追蹤傳輸成功、任務完成與業務驗收。成功的 HTTP 回應可能包含一個處理中的任務。已完成的任務可能產生損壞的下載檔。可讀取的圖片可能違反需求。每一種情況都需要不同的復原動作。

請刻意設定 3 個時間參數:個別 HTTP 逾時、輪詢間隔,以及整體等待時間。範例使用 30 秒的 API 請求逾時、2 秒的輪詢間隔,以及 10 分鐘的輪詢時間。這些是應用程式的選擇,並非服務宣稱的效能。

徵狀可能原因接下來檢查重試做法
參數錯誤不支援的欄位或值確切的端點結構描述與送出的內容先修正請求
HTTP 401驗證問題或路由錯誤金鑰設定與端點路徑不要原樣重試
餘額不足可用餘額或額度帳戶計費狀態先解決資金或額度問題
HTTP 429達到速率限制帳戶/模型並行數與請求速率有上限的退避加上隨機抖動
任務回報失敗模型、輸入或政策失敗預測 ID、錯誤碼、錯誤詳情先調查,再重新生成
輪詢逾時用戶端期限或任務緩慢既有任務狀態繼續查詢同一個 ID
完成但輸出為空缺少或非預期的結果完整的結構化任務回應標記待調查;不要盲目重新送出

目前的平台錯誤文件指出,LLM 與媒體端點不會提供 Retry-After 或剩餘速率限制標頭。請採用用戶端延遲策略;不要讓復原機制依賴這些路由不會回傳的標頭。其他 API 系列可能會有不同的行為。

請讓自動讀取重試保持有上限。指數型延遲加上少量隨機抖動,有助於避免大量工作者同時重試。如果節流持續發生,請降低並行數。重複失敗應成為可觀察的事件,而不是隱藏在載入指示器背後的無盡迴圈。

提交重試需要更嚴格的處理。當你在送出內容後連線中斷,你可能不知道伺服器是否已建立任務。請在提交前記錄本機意圖,並在沒有收到預測 ID 時,調查請求歷史或支援追蹤記錄。除非端點文件有記載,否則不要自行發明冪等標頭。

取得 ID 之後,請用它來續行。下載失敗應觸發另一次下載嘗試或狀態檢查,而不是另一次圖片生成請求。範例刻意將自動重試行為保留在輪詢讀取上,並在提交失敗時停止。

每個任務都應保留你的應用程式任務 ID、預測 ID、請求 ID、模型、設定、時間戳記與最終處置結果。提示詞只應依適當的資料政策儲存。絕不要將授權標頭或敏感的使用者內容放入一般錯誤日誌中。

提供前端能夠解釋的狀態:準備中、處理中、檢查輸出中、就緒,或需要關注。當有人重新載入頁面時,顯示可復原的任務。在同一個本機任務待處理期間,停用重複提交,但在適當情況下仍允許刻意發起新請求。

開發者適用的生成式 AI API:實際成本

低廉的請求價格無法告訴你一個可用功能的成本。你的預算需要知道實際收取的金額、被接受的輸出數量,以及交付這些輸出所需的支援工作。

文字 API 通常會區分輸入與輸出符元。長脈絡、檢索到的段落、對話歷史與重複的回應,都可能計入用量。請記錄所選端點實際計費的類別,而不是對每種工作負載套用單一的符元估算。

就圖片而言,請檢視確切模型的計費單位與配置。尺寸與品質對不同模型的計費影響可能不同。就影片而言,長度、解析度與模型選擇都可能改變費用。不要將型錄上的起始價格當成特定配置的報價。

本文研究期間,並未同時在型錄與詳情頁上驗證所選圖片模型在高品質、2048 × 1152 下的確切價格。本文不主張任何現行單價或折扣。在執行付費的正式環境評估之前,請先確認。

請使用 2 個相關計算:

plaintext
1API cost per accepted output = actual API charges / accepted outputs
2
3Full feature cost per accepted output =
4(API charges + attributable review + storage + transfer + processing costs)
5/ accepted outputs

請讓觀察期間保持一致。對於持續性的儲存,請說明該計算是涵蓋第一個月、一段明確的保留期間,還是分攤的經常性成本。避免將某個模型僅含推論的數字,與另一個工作流程的完整成本相比。

假設性範例: 你送出 100 個請求並接受 80 個輸出。將該批次實際總費用除以 80。如果 100 個請求都被收取相同的金額 c,則每個被接受輸出的 API 成本會是 1.25c。這個條件很重要:它並不假設每個失敗的請求都會計費。

模型設定提交次數實際費用被接受的輸出每個被接受輸出的 API 成本測量日期
GPT Image 2 Text-to-Imagehigh;2048x1152;PNG待記錄待記錄待記錄待計算待記錄
同一模型,下一評估批次記錄確切設定待記錄待記錄待記錄待計算待記錄

請將此視為工作表,而非結果表。這些圖片示範並不能確立具代表性的接受率或正式環境成本。請將測試環境的報價與已結算的計費記錄分開,尤其是在測試環境中評估時。

當被接受的輸出為零時,請將該批次回報為未成功,並顯示總支出。在這種情況下,每個被接受輸出的成本比率無法計算。隱藏失敗的批次會讓你的預算看起來比應用程式的實際表現更好。

先減少浪費:在提交前驗證輸入、儲存任務 ID、防止意外重複,並在產品允許時重複使用已被接受的素材。接著在相同的需求與檢查下,比較更便宜的設定。某個設定若降低了報價,卻讓拒絕處理的工作加倍,反而可能提高功能成本。

測試輸出,而不只是回應

在草擬提示詞時就寫下驗收標準。這能避免一張很有說服力的圖片事後改變你對成功的定義。請將硬性要求與選用偏好分開,並記錄審查者拒絕某個結果的原因。

將有明確機械式答案的檢查自動化:下載成功、檔案解碼、格式、尺寸與檔案大小限制。就 JSON 而言,請驗證結構描述、必要欄位、允許的標籤與型別。缺少必要欄位時,不應悄悄變成自行捏造的預設值。

需要解讀的要求則採用人工審查。在早餐範例中,審查者必須分辨重疊的切片、辨識刀子、評估其位置,並找出多餘的物件。自動化視覺檢查器可以提供協助,但在讓它獨自核准結果之前,請先評估它的錯誤。

早餐審查應包含以下獨立檢查:

  • 正好 2 片吐司、1 個白色盤子、1 個透明果醬碗與 1 把刀子。
  • 刀子位於盤子右側;必要物件完整在畫面內。
  • 沒有多餘的杯子、餐具、手、包裝或可見品牌。
  • 可讀取的 PNG,尺寸符合要求。

image.png驗證記錄,將檔案中繼資料檢查與視覺驗收檢查分開

該記錄將生成檔案的真實尺寸與大小,與其視覺驗收檢查分開回報。

從實際功能建立一組固定的回歸測試:一般請求、擁擠的構圖、互相衝突的指令、困難的裁切,以及相關的輸入限制。為需求與審查規則建立版本。在變更模型、提示詞範本或輸出設定時,重複執行這些測試。

請分別回報技術成功與被接受輸出率。一個可讀取但包含多餘物件的檔案,既是成功交付,也是內容遭拒。將這些結果合併成單一成功數字,會掩蓋你團隊需要修正的問題。

2025 年開發者調查發現,46% 不信任 AI 工具準確性,33% 表示信任;3% 回報高度信任。這些回應針對的是開發工作流程中的 AI 工具,並非生成 API 的實測失敗率。(Stack Overflow Developer Survey,2025 年。)

同樣地,3 次示範執行無法確立整體準確度或有意義的 p95 延遲。請在你預期正式環境會遇到的各種條件下,收集更大且相關的樣本,並保留離群值。用這些示範來開發檢查機制,再用系統化評估來做出發佈決定。

正式上線前的檢查清單

第一個能運作的請求,只解決了發佈決策的一小部分。你的應用程式還必須控制支出、復原未完成的工作,並在沒有可用結果時說明發生了什麼事。

保護存取。 將憑證保留在後端、區隔環境、限制任務記錄的存取,並規劃憑證輪替。針對擁有該任務的使用者,授權每個狀態與下載請求。難以猜測的任務 ID 不能取代權限檢查。

限制輸入與資源使用。 驗證提示詞長度、上傳類型與大小、請求的輸出設定,以及支援的組合。對於下載的媒體,強制執行允許的目的地、重新導向、位元組限制與解碼限制。上述的精簡指令碼僅示範生命週期,並非強化的公開下載服務。

在提交前設定預算。 定義每位使用者與每個任務的限制、最大並行任務數,以及誰可以請求更昂貴的設定。在工作待處理期間保留預算,這樣同時發出的請求才不會都通過同一個剩餘餘額檢查。

保存狀態。 在呼叫供應商之前先寫入本機任務。立即儲存回傳的預測 ID,並讓輪詢在程序重新啟動後可以續行。如果提交狀態不明,請使用調查狀態,而不是告訴使用者任務確定失敗。

掌管交付的素材。 決定被接受的檔案存放位置、誰可以存取,以及何時到期。驗證供應商連結的壽命與保留條款,而不是無限期依賴暫時性的輸出 URL。將衍生檔案的刪除納入應用程式的資料工作流程。

讓失敗易於理解。 區分延遲的任務、遭拒的結果與服務錯誤。提供清楚的途徑,以便刻意重試或請求審查。保留使用者的需求,讓復原時不必重新建構工作內容。

監控變更。 分別追蹤完成率、接受率、成本與等待時間。在模型或參數變更後重新執行回歸測試,並在可行的情況下保留先前的配置。將敏感日誌去識別化,並為內容與營運記錄設定保留期間。

若要為自己的應用程式評估範例平台,請先從 Atlas Cloud 模型型錄 開始,然後閱讀所選端點與預測文件。選擇一項任務、定義驗收標準,並在擴大使用範圍之前,記錄評估實際交付的成果。

常見問題

我的應用程式該選擇哪一款生成式 AI API?

請依據功能的輸入、輸出、可接受的等待時間與審查要求來選擇。對你在法律與營運上可使用的候選方案,執行相同的代表性需求。除了能力之外,也比較被接受輸出的成本與整合工作。這 3 個圖片範例並未確立任何通用的選擇。

有提供給開發者的免費生成式 AI API 嗎?

有些服務提供試用或有限的免費用量,但可用性、資格、配額與允許用途都會變動。請驗證確切端點的現行條款。免費的消費級工具額度不一定包含 API 存取。即使模型權重可以下載,自行託管也同樣耗用硬體、電力與工程時間。

使用生成式 AI API 需要機器學習經驗嗎?

你可以從 HTTP、JSON、驗證與一般後端開發技能開始。要推出可靠的功能,還額外需要評估與營運工作。你需要足夠了解模型的限制,才能定義可接受的輸出,但不一定要自己訓練模型。

一個 API 能處理文字、圖片與影片嗎?

一個平台可能提供全部 3 種,但每種能力可能使用不同的端點、參數、輸出類型與等待模式。請逐一驗證每個介面。共用帳號或憑證並不會讓文字請求內容與圖片或影片模型相容。

為什麼我的圖片請求回傳的是任務 ID,而不是圖片?

該端點以非同步方式提交工作。請儲存 ID 並查詢文件記載的狀態路由。任務完成時再取回檔案,然後加以驗證。如果你的用戶端停止等待,伺服器端的任務可能仍在執行;在提交另一個任務之前,先續行該任務。

如何在不破壞工作流程的情況下降低 API 成本?

防止重複提交、提早驗證輸入、在適當情況下重複使用已被接受的素材,並以不變的驗收標準測試更便宜的配置。衡量每個被接受結果的實際費用。開發者適用的生成式 AI API,唯有在周遭應用程式能以你能永續負擔的成本交付可用工作時,才真正發揮價值。

最新模型

一個 API,暢享全模態 AI。

探索全部模型