首頁 > 科技與 AI > FLUX API 免費嗎?BFL paid credits 與 FLUX.2 local Free 分流

延伸主題

FLUX API 免費嗎?BFL paid credits 與 FLUX.2 local Free 分流

查核 BFL FLUX.2、flux-2-pro-preview、F...

以 BFL FLUX.2 image tiles、local GPU workstation、flux-2-pro-preview cloud pipeline、organization credit ledger 與 paid API gate 呈現 YOLO LAB 原創編輯封面

本篇是免費 token fuel 系列第 105 篇,查核 Black Forest Labs 的 FLUX API 能否提供學生主要 AI Agent 可使用的免費 API credits。結論先講:官方 Quick Start 要求建立帳戶後先加 credits、經由 Stripe 完成付款,再建立 API key;官方 credits 頁也說 credits 由組織管理、需要購買。FLUX.2 [dev] 在 pricing 頁的 Free 是 local development、non-commercial 的模型路線,不是 hosted FLUX API 的免費 token。因此本篇分類為 EXCLUDED_BFL_FLUX_API_NO_FREE_CREDITS_LOCAL_DEV_SEPARATE,不列入已確認的免費 API token 清單。

以 BFL FLUX.2 image tiles、local GPU workstation、flux-2-pro-preview cloud pipeline、organization credit ledger 與 paid API gate 呈現 YOLO LAB 原創編輯封面
YOLO LAB 原創編輯封面:以 FLUX.2 image tiles、local GPU、API cloud pipeline、organization credit ledger 與 paid gate 呈現 BFL hosted API 和 local Free 路線的分流;非 Black Forest Labs 官方宣傳圖。

這次最容易混淆的地方有三個。第一,FLUX 模型有可下載或本地使用的 free/open-weights 路線,不代表 BFL API 免費。第二,Playground 可以在瀏覽器試模型,不代表 API request 不扣 credits。第三,官方定價使用 credit 這個字,但每 1 credit 等於 USD 0.01,這是付費帳本的單位,不是免費 token grant。主要 Agent 必須把 hosted API、Playground 與 self-hosted model 分成三種 surface。

查核日期為 2026-08-25。BFL 的模型、價格、API endpoints、credits、資料處理、license 與使用政策會變動。本文不註冊 BFL、不登入 dashboard、不加付款方式、不購買 credits、不建立或索取 API key、不送圖片、不使用 MCP OAuth、不上傳素材,也不把任何人的 key、cookie 或帳戶交給主要 Agent。本文只保存官方證據與安全的本地分類規則。

本系列的「捕獲」只代表合法發現、核對與排除方案,不代表抓取公開程式碼裡的 BFL secret、分享團隊 credits、輪換帳戶、規避 402/429、把 playground session 變成 API token,或用本地模型 license 逃避 hosted service 的付款規則。學生可以學會 model routing 與本地 adapter,但真正的雲端帳戶和素材仍由 owner 按官方 terms 管理。共通的安全使用原則可延伸閱讀 YOLO LAB AI agent 使用 FAQ

下面的程式碼都是離線 manifest、credit guard、async lifecycle、license gate、資料政策與 fallback 示意。所有 key、organization id、request id、圖片與輸出都使用 placeholder、hash 或布林值;範例不會對 BFL API 發送請求。文章的目的不是教學生取得免費 key,而是讓主要 Agent 在看到「FLUX 免費」時能判斷到底是本地模型免費、Playground 試用,還是需要付款的 API。

截至 2026-08-25 的敲門模型:API flux-2-pro-preview/local FLUX.2 [klein] 4B,surface 仍分離

BFL 官方文件目前把 FLUX.2 列為推薦模型家族;image generation guide 將 flux-2-pro-preview 描述為最新的 FLUX.2 [pro] preview endpoint,也是最適合先做 API route recheck 的入口。FLUX.2 overview 另列 FLUX.2 [klein] 4B 為可在約 13GB VRAM 消費級 GPU 執行的 open-weights 路線。本篇用 API preview 與 local klein 4B 作為兩條敲門入口,但不把任一模型名稱解讀成免費 hosted API balance。

API model、Playground model 與 local weight 的 source、endpoint、credit、license、hardware 與 data policy 要分開保存。若 preview endpoint、pricing calculator、model id 或 open-weight license 改變,先回到 MODEL_RECHECK_REQUIRED;只有付款與 grant evidence 同時成立,才可由 owner 重新評估受限 media canary。

Quick Start 已經明確寫出付款順序

BFL 官方 Quick Start 把流程分成 create account、add credits、create API key、make first API call。Add credits 的步驟要求到組織的 API → Credits,選擇金額並透過 Stripe 完成付款;文件還說 credits 會在付款後可用。這不是「註冊即送 API credits」的描述,而是付費後才進入 API route 的明確證據。

因此學生不能把建立帳戶、看見 Default Organization、看到 API → Keys 或能打開 Playground 當成免費 API 開通。帳戶結構只是 access control 與 billing 的容器;真正的 API fuel 是 organization credit balance。沒有正確的 credit read-back 與 owner 付款授權,Agent 應停在 research 或 local route。

function classifyBflQuickStart(snapshot) {
  if (snapshot.accountCreated !== true) return 'ACCOUNT_NOT_CONFIRMED';
  if (snapshot.creditsRequirePayment === true) return 'PAID_API_ROUTE';
  if (snapshot.apiKeyVisible && snapshot.balanceKnown !== true) return 'KEY_WITHOUT_FUEL';
  return 'BFL_API_REVERIFY_REQUIRED';
}

BFL credit 是付款單位,不是免費 token

BFL 官方 pricing 說 1 credit 等於 USD 0.01,FLUX API 與 Playground 使用同一套 credit pricing;不同 model、解析度與 batch size 會有不同價格。這裡的 credit 是影像生成的計價單位,不能轉成文字模型的 input token、output token 或固定圖片數。即使帳戶 balance 顯示數字,也要先知道它是 paid balance 還是 promotional grant。

定價頁目前列出 FLUX.2 [klein] 按 megapixel 計算、FLUX.2 [pro]、[max]、[flex] 等不同路線,也列出 FLUX.2 [dev] 的 Free 文字,但該欄位明確限定 local development、non-commercial。主要 Agent 的 manifest 要保存 unit=bfl_creditcurrency=USDsurfacelicense,不能看到 Free 就把所有 model 路由到 API。

function classifyBflUnit(model) {
  if (model.surface === 'local' && model.free === true) return 'LOCAL_LICENSE_REVIEW';
  if (model.surface === 'api' && model.creditPriceKnown === true) return 'PAID_CREDIT_ROUTE';
  if (model.surface === 'playground') return 'PLAYGROUND_NOT_API_PROOF';
  return 'MODEL_SURFACE_UNKNOWN';
}

FLUX.2 dev 的 Free 是本地路線

官方 pricing 把 FLUX.2 [dev] 標成 Free,並說明用途是 local development、non-commercial;官方文件也把 open weights 與 self-hosted 路線分開。這對學生很有價值,因為它可能讓學生在自己的硬體、合法環境與符合 license 的用途下練習 prompt、image pipeline、queue 與評估,但它不會替學生建立 BFL hosted API key,也不會提供 BFL 組織的雲端 compute。

本地模型也不是無條件免費。硬體、電力、磁碟、下載、runtime、模型 license 與商業用途都要由 owner 讀回;non-commercial 不能直接用來做商業服務。當 Agent 從 local inference 切到 BFL API 時,應明確變更 surface、billing、資料處理與 license record,不能把本地成功當成 API 已有免費額度。

function chooseFluxSurface(job, model) {
  if (model.openWeights === true && job.runMode === 'local') {
    return { route: 'LOCAL_INFERENCE', review: 'LICENSE_AND_HARDWARE' };
  }
  if (job.runMode === 'api') return { route: 'BFL_API', review: 'PAID_BALANCE' };
  return { route: 'OWNER_REVIEW', review: 'SURFACE_UNCLEAR' };
}

Playground 可以試用但不代表 API 免費

BFL Quick Start 與 pricing 頁都把 Playground 當成可以快速試模型的入口,但 pricing 同時說 API 與 Playground 使用 credits。這代表瀏覽器介面與 API 可能是不同操作入口,卻共用付費帳本。學生看到 Playground 產生圖片,只能證明該帳戶有某種可用的 playground access,不能證明有免費 API balance。

Playground 的輸入也可能受到 web service 的資料、內容與共享設定影響。不要用登入後的瀏覽器 cookie、自動化點擊或抓取網路請求來假造 API fuel;不要把一個 Playground output 的成功當成可以讓主要 Agent 自動大量生成。要接 API,就必須由 owner 建立 project-scoped key 並讀回 organization balance。

function playgroundEvidence(evidence) {
  if (evidence.playgroundSucceeded !== true) return 'PLAYGROUND_NOT_CONFIRMED';
  if (evidence.sharedCreditLedger === true) return 'PAID_LEDGER_SHARED';
  if (evidence.apiBalanceReadback !== true) return 'PLAYGROUND_NOT_API_PROOF';
  return 'API_OWNER_REVIEW';
}

API credits 由 organization 管理

BFL credits and billing 文件說 credits 在 organization level 管理,所有 team members 從同一個 credit pool 使用;usage 則按 project 追蹤。這種設計適合 owner 監督,但也表示分享 key 不會創造新的免費額度,反而可能讓學生、測試 worker 與 production worker 消耗同一筆 paid balance。主要 Agent 應將 organization owner、project scope 與 spend policy 保存為 metadata。

組織內的 transfer credits 也是管理既有 credits 的功能,不是平台送出的 student grant。若 owner 想把餘額移到另一個 organization,要依官方 dashboard 與權限流程人工處理,Agent 不應自動轉移或把別人的 credit pool 當成可共享燃料。學生最安全的練習是 local fixture,直到 owner 明確批准一個低額 paid canary。

function organizationBudget(meta) {
  if (meta.organizationBalanceKnown !== true) return 'BALANCE_READBACK_REQUIRED';
  if (meta.paymentSource === 'promotional') return 'PROMO_SCOPE_REVIEW';
  if (meta.paymentSource === 'paid') return 'PAID_OWNER_REVIEW';
  return 'FUNDING_SOURCE_UNKNOWN';
}

Project-scoped key 不會創造免費額度

BFL organizations and projects 文件說每個 project 可以建立自己的 API keys 與 usage tracking,適合分開 production、staging 與 development。這是 secret scope 與 auditability 的好設計,但所有 project 仍從組織 credit pool 使用。新增 key 或新增 project 不會增加 balance,也不應被當成免費 key 生成器。

對主要 Agent,可以為每個 sidecar 建立最小 scope、短期或可撤銷的 project key,但這是 owner 的 paid governance 選項,不是本篇要領取的 free fuel。key 的真實值只在 server-side secret manager;學生只拿到 provider、project、scope、expiry 與 balance 狀態,不拿 key 原文。

function keyScopeGate(keyMeta) {
  if (keyMeta.valueInSource || keyMeta.valueInClient) return 'SECRET_EXPOSURE_STOP';
  if (keyMeta.projectScoped !== true) return 'PROJECT_SCOPE_REQUIRED';
  if (keyMeta.ownerApproved !== true) return 'OWNER_APPROVAL_REQUIRED';
  if (keyMeta.balancePool !== 'organization') return 'POOL_READBACK_REQUIRED';
  return 'KEY_METADATA_SAFE_FOR_AGENT';
}

Credits balance endpoint 的用途

BFL 官方 API reference 提供 GET /v1/credits 來讀取目前 credit balance,示例使用 x-key header。這個 endpoint 很適合做 owner-approved budget read-back,但它只會回答目前 balance,不會自動證明 balance 是免費、永久、可轉讓或符合某個學生資格。Agent 必須同時保存 funding source、checkedAt 與 account scope。

balance read-back 也不應放進公開文章或 log。文章只需描述 header 名稱與 placeholder;真正的回應應在 owner 控制的 secure runner 中遮罩、hash 化或只保存數值區間。若 endpoint 回傳 unauthorized、空值、不同 organization 或舊 project,就停在 manual review,不要自動換另一把 key。

function readbackBflBalance(response, expected) {
  if (response.status === 401 || response.status === 403) return 'AUTH_SCOPE_STOP';
  if (response.status !== 200) return 'BALANCE_RETRY_MANUALLY';
  if (!Number.isFinite(response.credits)) return 'BALANCE_SHAPE_STOP';
  if (response.project !== expected.project) return 'PROJECT_MISMATCH';
  return { state: 'BALANCE_READ', credits: response.credits };
}

FLUX API 是非同步 image generation

BFL image generation 文件說 API 採 asynchronous design:先提交 generation request,再 polling 結果。這種生命週期要用 request id、polling URL、deadline、final status 與 output download 來管理。它與免費或付費無關,但在付費 credit route 上更不能把一次 timeout 直接轉成多次 retry,因為原始工作可能仍在執行並扣除費用。

官方也列出 global 與 regional endpoint,並提醒 delivery URL 不應直接長期提供給使用者,建議下載並由自己的 infrastructure 重新服務。這會增加 output retention、storage、access control 與刪除責任。學生的 local fixture 只需模擬 pending、ready、failed、expired,不必為了練習而送真實圖片。

function nextBflPoll(state) {
  if (state.deadlineReached) return 'STOP_AND_RECONCILE';
  if (state.status === 'Ready') return 'DOWNLOAD_ONCE';
  if (state.status === 'Failed') return 'RECORD_FAILURE';
  if (state.status === 'Pending' || state.status === 'Processing') return 'POLL_WITH_BACKOFF';
  return 'UNKNOWN_STATUS_STOP';
}

402 與 429 是不同的停止原因

BFL generation guide 說 credits 用完時會得到 HTTP 402,並指向 dashboard 的 Add 來購買額外 credits。402 是付款或餘額問題,不是可以用 retry 解決的暫時網路錯誤。主要 Agent 收到 402 時要停止、保存 job metadata、通知 owner;不得自動加卡、購買、轉帳或把另一個帳戶的 key 填入。

同一份文件說 API 有 active-task limit,超過限制時回 429;一般 endpoint 目前最多 24 個 active tasks,特定模型可能更低。429 要使用受限 backoff,不能以平行請求放大負載,也不能把 429 當成「免費額度快用完」的證據。402、429、5xx、模型不支援與輸入驗證錯誤要各自記錄。

function classifyBflHttp(status) {
  if (status === 402) return 'PAID_BALANCE_STOP';
  if (status === 429) return 'ACTIVE_TASK_BACKOFF';
  if (status === 401 || status === 403) return 'AUTH_OR_SCOPE_STOP';
  if (status >= 500) return 'PROVIDER_FAILURE_ONE_RETRY_REVIEW';
  return status >= 400 ? 'REQUEST_FIX_REQUIRED' : 'CONTINUE_LIFECYCLE';
}

不能用 retry 代替付款 read-back

當工作被 402 擋下,重試不會產生 credits;當工作被 429 擋下,快速重試只會延長 throttling。當 request id 已建立但 output 尚未回來,重送可能產生重複工作與額外付費。Agent 要先查 status、balance、usage 與 request id,再由 owner 判斷是否需要一次受控 retry。

對學生教學,可用本地 fake responses 測試四條路:402 進 paid handoff、429 進 exponential backoff、5xx 只做一個有 deadline 的 retry、未知狀態直接 stop。這樣不需要取得 BFL key,也不會誤把 provider 的付費錯誤當成免費燃料缺口。

function retryPolicy(result, attempt) {
  if (result.status === 402) return 'NO_RETRY_OWNER_PAYMENT';
  if (result.status === 429) return attempt < 2 ? 'BACKOFF_THEN_RECHECK' : 'RATE_LIMIT_HANDOFF';
  if (result.status >= 500) return attempt === 0 ? 'ONE_RETRY_WITH_DEADLINE' : 'MANUAL_HANDOFF';
  return 'NO_GENERIC_RETRY';
}

Model pricing 會隨解析度改變

BFL pricing 頁對 FLUX.2 Klein 使用 megapixel-based pricing,輸出解析度越高,價格可能越高;batch request 也會按圖片數倍增。這代表即使 owner 願意做 paid canary,也必須先固定 model、width、height、batch size 與 output type,再做一次預估與 balance read-back。不能用一張低解析度圖片的成本外推 4MP 或多張 batch。

學生 Agent 的 media budget 要把最大解析度、最大圖片數、最大 active tasks 與每日/每週 spending limit 寫出來。若官方 dashboard 提供 project spending controls,就由 owner 設定;如果 read-back 不到限制狀態,Agent 不應自行假設 provider 會阻止超支。免費清單最終要服務的是學習可持續性,而不是把小額 paid account 用到歸零。

function bflMediaGuard(job, policy) {
  if (job.width * job.height > policy.maxPixels) return 'PIXEL_BUDGET_STOP';
  if (job.batchSize > policy.maxBatch) return 'BATCH_BUDGET_STOP';
  if (job.activeTasks >= policy.maxActiveTasks) return 'ACTIVE_TASK_STOP';
  if (policy.spendingLimitReadback !== true) return 'SPENDING_LIMIT_UNKNOWN';
  return 'OWNER_APPROVED_PAID_CANARY';
}

API 與 self-hosted license 要分開

BFL 的 self-hosted commercial license 文件明確說該 license 不授予透過 FLUX API 存取模型的權利。這是另一個重要分界:下載模型與本地推理要讀 self-hosted 或 non-commercial license;雲端 API 要讀 Developer Terms 與 FLUX API Service Terms。即使同一個模型名稱出現在兩個地方,權利、成本、資料處理與可用 endpoint 都可能不同。

主要 Agent 不應把「本地可下載」當成「可以在 BFL API 免費使用」,也不應把 API paid output 的條款自動套到本地模型。每次 route change 都要重新檢查 license、商用用途、模型權重、輸入權利與輸出責任。學生若只做課堂練習,優先使用 synthetic input 與清楚標示的 non-commercial fixture。

function licenseGate(surface, useCase) {
  if (surface === 'api' && useCase.license === 'self-hosted-only') return 'API_LICENSE_MISMATCH';
  if (surface === 'local' && useCase.commercial === true && useCase.commercialLicense !== true) {
    return 'NON_COMMERCIAL_STOP';
  }
  if (!useCase.inputRights) return 'INPUT_RIGHTS_REQUIRED';
  return 'LICENSE_OWNER_REVIEW';
}

Terms 的帳戶責任不能由學生 Agent 代承擔

BFL Developer Terms 說使用 developer account 即代表同意條款;代表公司或組織使用時,使用者必須有權限綁定該實體,而且帳戶 owner 要對所有 usage 負責,即使某些使用不是 owner 親自操作。這使得學生課程不能共用一個未經治理的 API key,不能讓 worker 在沒有 scope、budget、撤銷與 audit 的情況下長期運作。

Terms、Usage Policy、Developer Terms、FLUX API Service Terms 與模型 license 要按使用 surface 一起讀。只讀 marketing pricing 不足以批准 production。若學生未成年、代表學校、處理客戶內容或輸出涉及人物肖像,要由合資格 owner 完成 terms、consent 與資料權利判斷。

function termsGate(actor, account) {
  if (actor.ownerOfAccount !== true) return 'ACCOUNT_OWNER_REQUIRED';
  if (account.organizationUse && actor.authorizedRepresentative !== true) return 'ENTITY_AUTH_REQUIRED';
  if (actor.termsReviewed !== true) return 'TERMS_REVIEW_REQUIRED';
  if (account.sharedKey === true) return 'SHARED_KEY_STOP';
  return 'MANUAL_OWNER_ROUTE';
}

資料政策允許 opt out 不代表預設本地

BFL Privacy Policy 說服務會處理帳戶、付款、使用與輸入輸出資料;官方 Website Terms 又說在適用情況下,輸入與輸出可能被用來提供、開發、訓練與改善服務,並提供聯絡方式讓使用者對未來 training use opt out。這不等於所有資料都會被拿去訓練,也不等於可以把私人資料直接上傳;它表示 data policy 必須在送出前由 owner 讀回並作出選擇。

學生 Agent 的預設資料集應是 synthetic images、公開授權素材或已得到明確同意的 fixture。未公開產品畫面、學生個資、客戶肖像、醫療資料、研究成果、私人 repository 與有保密義務的素材,沒有 data processing agreement 或 owner 核准就不送 BFL。若要 opt out,要由帳戶 owner 按官方流程處理,不能把文章裡的文字當作設定已完成。

function bflDataGate(asset, policy) {
  if (asset.sensitive === true) return 'SENSITIVE_ASSET_LOCAL_ONLY';
  if (asset.ownerApproved !== true) return 'OWNER_APPROVAL_REQUIRED';
  if (policy.trainingChoiceReadback !== true) return 'DATA_POLICY_READBACK';
  if (asset.rights !== 'cleared') return 'INPUT_RIGHTS_STOP';
  return 'SYNTHETIC_OR_CLEARED_CANARY';
}

人物與 biometric data 需要額外審查

BFL Developer Terms 涉及 identifiable person、biometric data、聲音或影片等內容時,要求 developer 取得必要的 permission、consent、waiver、license 或 release,並遵守適用法律。這個責任不會因 API 是 paid 或 model 是 open weights 而消失。學生課堂若要做人物影像,應先換成合成角色,避免把免費 fuel 的問題與肖像、識別或生物特徵風險混在一起。

Agent 可以檢查檔案 metadata 與 owner 標記,但不能自行判斷某個真人是否已同意,也不能把公開網路圖片視為可任意改造。對涉及臉部、聲音、身份、監控或識別的工作,一律轉人工與法律審查。這是一個強制 stop,不是可以用低解析度或少量 credits 迴避的限制。

function biometricGate(asset) {
  if (asset.identifiablePerson !== true) return 'NO_IDENTIFIABLE_PERSON_FLAG';
  if (asset.consentDocumented !== true) return 'CONSENT_REQUIRED';
  if (asset.biometricData === true && asset.legalReview !== true) return 'BIOMETRIC_REVIEW_REQUIRED';
  return 'OWNER_APPROVED_PERSON_DATA_ONLY';
}

Open weights 的成本仍然存在

本地 FLUX model 路線沒有 BFL API credit charge,但學生仍要付出硬體時間、GPU memory、儲存空間、下載頻寬、電力與維護成本。若在遠端 GPU 上執行,還會有雲端 instance、storage、egress 與 idle time 的付款風險。主要 Agent 的 fuel ledger 不應把「沒有 API invoice」寫成零成本。

本地 route 的優點是資料可以在 owner 控制的環境內處理,且不需要 BFL hosted key;缺點是部署複雜、速度與品質需要自行驗證,license 也可能限制商用。文章可以把 open weights 當成學習 sidecar 候選,但要另外記錄 GPU availability、model hash、license version、runtime version 與 local storage cleanup。

function localCostGuard(job, machine) {
  if (machine.modelLoaded !== true) return 'LOCAL_MODEL_NOT_READY';
  if (machine.gpuMemoryFree < job.minimumGpuMemory) return 'GPU_MEMORY_STOP';
  if (machine.diskFree < job.minimumDisk) return 'DISK_BUDGET_STOP';
  if (job.commercial === true && job.commercialLicense !== true) return 'LICENSE_STOP';
  return 'LOCAL_OWNER_REVIEW';
}

API 交付 URL 不能永久公開

BFL image generation 文件說結果中的 sample URL 來自 regional delivery endpoint,並建議把圖片下載後由自己的 infrastructure 重新提供,也提醒 delivery URL 不應直接提供給終端使用者。這是輸出權限與保留管理問題:API request 成功不代表可以把第三方 URL 寫進公開文章、學生群組或 cache 永久保存。

學生 Agent 只需保存 output hash、mime、尺寸、下載狀態與 owner-approved storage id;真正的圖片檔放到合適的 private bucket 或本地資料夾,並設置清除期限。若 output URL 過期、下載失敗或收到不明 host,不要盲目重送 generation;先依 request id 查狀態,再由 owner決定是否重新產生。

function outputGuard(result, storage) {
  if (!result.sampleUrl) return 'OUTPUT_URL_MISSING';
  if (!result.host.endsWith('.bfl.ai')) return 'DELIVERY_HOST_REVIEW';
  if (storage.ownerApproved !== true) return 'PRIVATE_STORAGE_REQUIRED';
  if (storage.expiryDays > 7) return 'RETENTION_REVIEW';
  return 'DOWNLOAD_TO_CONTROLLED_STORAGE';
}

BFL MCP 也不等於免費 API

BFL 官方 MCP integration 介紹 OAuth 方式的 FLUX MCP server,說使用者不需要在對話裡貼 API key;工具也包含查詢 credits。這是比較安全的 connector surface,但官方文件的 authentication 或 billing 錯誤仍要求確認帳戶與 sufficient credits。免貼 key 不等於免付款,也不等於沒有 organization billing。

主要 Agent 不應因為 MCP 介面看起來容易就自動啟動 generation。若要使用 MCP,仍須明確設定 owner、帳戶、scope、資料 policy、spend limit、output storage 與人工批准;本篇不登入、不連接、不呼叫任何 BFL MCP。學生先用 fake tool contract 測試 get_creditsgenerate_image 的 stop conditions 即可。

function mcpBillingGate(tool, state) {
  if (tool.oauthConnected !== true) return 'OAUTH_OWNER_REVIEW';
  if (tool.creditsReadback !== true) return 'CREDITS_READBACK_REQUIRED';
  if (state.paymentSurface === true) return 'PAID_MCP_OWNER_REVIEW';
  if (state.inputRights !== true) return 'INPUT_RIGHTS_STOP';
  return 'CONTROLLED_TOOL_CANARY';
}

免費 provider 429 時不能靜默切 BFL

如果主要 Agent 的免費文字或圖片 provider 回 429,不能把 BFL API 當成無聲 fallback,因為 BFL 需要自己的 paid credit balance、project key、model price 與資料政策。靜默切換會讓學生不知不覺產生付款、輸入傳輸與 license 後果,也會把不同模型的輸出品質與版權責任混在一起。

正確的 fallback 順序是先退 local fixture、排程延後、降低工作量、換已確認的免費 surface,最後才是 owner 明確批准的 paid provider。每次切換要記錄原始 provider、429 時間、輸入 hash、fallback reason 與是否進入付費 surface。沒有 owner approval 時,BFL route 必須保持 disabled。

function routeAfterFree429(job, providers) {
  if (providers.localReady === true) return { route: 'LOCAL_FIXTURE', reason: 'FREE_PROVIDER_429' };
  if (providers.knownFreeSidecar === true) return { route: 'KNOWN_FREE_SIDE_CAR', reason: 'REVIEW_SCOPE' };
  if (providers.bflOwnerApproved === true) return { route: 'BFL_PAID_OWNER_REVIEW', reason: 'EXPLICIT_APPROVAL' };
  return { route: 'QUEUE_AND_HANDOFF', reason: 'NO_FREE_FALLBACK' };
}

免費 fuel manifest 的 BFL 欄位

BFL 的 manifest 至少要保存 provider、surface、model、license、pricing URL、credits URL、balance endpoint、creditUnit、creditUsdValue、freeApiGrant、localFreeRoute、playgroundAccess、apiPaymentRequired、projectScope、organizationPool、rateLimit、http402、http429、trainingChoice、inputRights、outputStorage、checkedAt 與 nextReviewAt。freeApiGrant 必須是 false 或 unknown,不要因為 model page 有 Free 就預設 true。

也要把正面與負面證據分開。pricing 可以證明某一個本地 model 的 Free license 描述;Quick Start 與 billing 可以證明 API credits 需要付款;API reference 可以證明 balance endpoint;Terms 與 Privacy 可以證明 account、輸入輸出與權利責任。這些證據互相補充,不應把單一頁面的 Free 標籤擴大成整個 provider 的免費 API。

function makeBflManifest(e) {
  return {
    provider: 'black-forest-labs',
    surface: e.surface,
    model: e.model,
    creditUnit: 'bfl_credit',
    creditUsdValue: e.creditUsdValue ?? 0.01,
    freeApiGrant: e.apiPaymentRequired === true ? false : 'unknown',
    localFreeRoute: e.localFree === true,
    playgroundAccess: e.playgroundAccess ?? 'unknown',
    balanceEndpoint: 'https://api.bfl.ai/v1/credits',
    checkedAt: e.checkedAt,
    nextReviewAt: e.nextReviewAt
  };
}

本地 dry-run 可以先完成哪些工作

即使 BFL API 被排除,學生 Agent 仍可先做完整的本地 adapter:把文字 prompt 轉成 image job、固定 model 與解析度、建立 input hash、模擬 credits estimate、測試 402/429 分流、保存 async request state、驗證 output storage、檢查 license 與建立人工 handoff。這些工作不需 BFL account,也不會觸發付款。

dry-run 成功的定義是 adapter contract 通過,不是 provider ready。測試 fixture 要刻意包含 paid balance、zero balance、unknown balance、local non-commercial、commercial license missing、sensitive asset、expired output URL 與 active task limit。只有當每個 fixture 都回到可預期的 route,才算具備可安全研究的整合骨架。

function bflDryRun(job, manifest) {
  const local = manifest.localFreeRoute === true && job.runMode === 'local';
  const api = manifest.apiPaymentRequired === false && manifest.balanceKnown === true;
  if (local) return { adapterReady: true, providerReady: false, route: 'LOCAL_FIXTURE' };
  if (api) return { adapterReady: true, providerReady: true, route: 'OWNER_CANARY' };
  return { adapterReady: true, providerReady: false, route: 'PAID_HANDOFF' };
}

可以重新列入候選的證據

BFL API 要從排除型 recheck 重新列入免費候選,官方至少要出現明確的 API free grant、grant amount、期限、model scope、地區與申請資格;Quick Start 不再要求先付款,或文件清楚說明 signup balance 的來源;API dashboard 能由 owner 讀回 grant;zero balance、402、退款與 expiry 行為可驗證;Terms、Privacy、Usage Policy 與資料保留規則也要適合學生的合成素材。

「FLUX.2 [dev] Free」本身不足以達成這些條件,因為它證明的是 local development 路線。若未來 BFL 推出 educational API grant,也要與 local license 分開記錄,再做一次低額、短期限、owner-approved 的 synthetic image canary。成功後仍只代表該帳戶、該 project、該 model 的受限 sidecar,不代表整個 API 永久免費。

function promoteBfl(e) {
  const required = [e.apiGrant, e.grantAmount, e.expiry, e.dashboardReadback, e.termsReviewed];
  if (required.includes(false)) return 'KEEP_EXCLUDED';
  if (required.includes(undefined)) return 'EVIDENCE_INCOMPLETE';
  if (e.syntheticCanaryPassed !== true) return 'CANARY_REQUIRED';
  return 'CONDITIONAL_API_SIDE_CAR';
}

本篇對學生 Agent 的實際結論

目前學生可以使用的是 BFL 官方文件中的學習知識與可能符合 license 的本地模型路線,不是免費 hosted FLUX API token。要使用 API,Quick Start 要求先加 credits、完成付款,再由 project 建立 key;credits 頁又說 organization pool 會被 team members 共用。這些都代表 API 是 owner 付款與治理的 surface。

學生可以做 local dry-run、模型 license 查核、synthetic image 評估、budget 模擬與 fallback 測試;學生不應索取他人 BFL key、共享 organization credits、抓取 MCP/Playground session、繞過 402/429、用多帳戶延長試用,或把 local non-commercial model 當成可商用 API。主要 Agent 將 BFL 保持為 LOCAL_REVIEWPAID_OWNER_REVIEW

function studentBflStatus(record) {
  if (record.apiPaymentRequired === true && record.apiGrant !== true) return 'EXCLUDED_FREE_API';
  if (record.localFreeRoute === true) return 'LOCAL_LICENSE_REVIEW';
  if (record.ownerApproved === true) return 'PAID_OWNER_CANARY';
  return 'RESEARCH_ONLY';
}

官方來源與重新查核順序

本篇的付款與帳戶核心證據是 BFL 官方 Quick Startpricing overviewimage generation guideFLUX.2 overviewcredits and billingorganizations and projects。這些頁面共同支持:API 與 Playground 使用 credits、credits 由 organization 管理、加 credits 要完成付款、project key 不會自動產生免費 balance。

重查 BFL 時,先看官方 pricing 是否仍把 API 與 Playground 綁在 credits,再看 Quick Start 是否仍要求 Add Credits 與付款,接著查 organization balance、project key、API 402/429 與最新 Terms。最後才看模型是否有 local free 或 open-weights 標籤。這個順序可以防止先看到 model marketing 的 Free,再回頭替 hosted API 找理由;對燃料清單來說,付款闸門與 API surface 應該先於模型品質。

如果未來出現新 promotional credit,也要確認它是每個 account 一次、每個 organization 一次、每個 project 一次,還是只給特定邀請者。要保存 grant 的到期日、可用 model、是否能用於 Playground、是否能轉移、是否會自動扣 paid balance,以及 zero balance 後服務如何停止。沒有這些欄位,就只能放在「線索」而不是主要 Agent 的燃料路由。

API lifecycle 與 balance 來源是 官方 credits endpointimage generation guideMCP integration。模型與權利要對照 Developer TermsFLUX API Service Termsself-hosted commercial licensePrivacy PolicyUsage Policy

第 105 篇因此完成為排除型文章:BFL FLUX API 暫不作免費 token fuel;FLUX.2 [dev] 的 local free 路線另存為待 license/硬體審查的 sidecar。下一篇會繼續查找另一個尚未收錄的官方 API 或明確免費額度,仍然按照一篇完成、再進下一篇的節奏推進。

作者與編輯責任

本文署名作者:

|YOLO LAB 主編

YOLO LAB 的文章由署名作者或編輯團隊完成。主編 Dex 負責編輯制度、重要事實查核原則、AI 協作規範與重大更正;文章中的分析與判斷以公開來源、作品內容及可驗證資料為依據。

文章若有需要補充或修正的資料,可透過聯絡頁提供原始來源、日期與具體段落,編輯團隊會依出版政策檢查。

KEEP READING

接著讀什麼?

從同一主題繼續閱讀,或回到 YOLO LAB 的完整文章索引,找到下一個值得投入時間的問題。

發表迴響

探索更多來自 YOLO LAB 的內容

立即訂閱即可持續閱讀,還能取得所有封存文章。

繼續閱讀