One ledger for FLUX.3 credits and Sume USD cost with Python Decimal

BFL bills FLUX.3 in credits at $0.01 each; Sume reports usage.cost in USD. A Decimal ledger puts both on one scale: $0.100 + $0.041 + $0.15 = $0.291.

5 min readSume
All posts

Black Forest Labs prices FLUX.3 Image in credits, where 1 credit is $0.01, and its pages show USD equivalents: $0.041 for 768x768, $0.048 for about 1 MP, $0.100 for about 4 MP and $0.607 for about 16 MP (read 2026-10-09). Sume reports usage.cost already in USD. If you use both, convert credits to dollars once, at the edge, with Decimal. The sample ledger adds 10.0 credits ($0.100), 4.1 credits ($0.041) and a Sume 2K image at $0.15, for a total of $0.291.

Two units in one table

Sume does not list FLUX.3, so the BFL rows here are for a team that calls BFL directly for that model and Sume for the others. The conversion functions keep the two sources apart so that nobody adds 10 credits to 0.15 dollars.

Ledger rows (BFL pricing page and Sume price list, read 2026-10-09)
RowRaw valueUSD
FLUX.3 2k via BFL10.0 credits x $0.01$0.100
FLUX.3 768sq via BFL4.1 credits x $0.01$0.041
nano-banana-2.1 2K via Sumeusage.cost 0.15$0.150
Total$0.291

Why Decimal and strings

Floats cannot hold 0.1 exactly, so sums drift in the last digits and a reconciliation against an invoice fails by a cent. Decimal(str(x)) takes the value from its printed form, so 4.1 becomes exactly 4.1 and 4.1 x 0.01 becomes exactly 0.041. Pass the strings from the JSON, not floats you computed.

Check the unit of the field you read before you divide. BFL's docs say the submission response includes the cost, and the pricing page states 1 credit = $0.01; confirm in your own response whether that number is in credits or already in dollars, because dividing a dollar figure by 100 is a quiet 100x error. On Sume the unit is not in doubt: usage.cost is USD.

Code

The script is three small pieces: a constant for the credit value, one conversion function per source, and a printed ledger with a total.

Why bother with two sources in one ledger? Teams that compare models often run the same prompt through several and add up the spend by hand. A shared unit makes the comparison honest. For the three rows above, the FLUX.3 images cost $0.141 together and the Sume image costs $0.15, so a single Sume 2K image is within a cent of two BFL images at those sizes.

Keep the ledger append-only. Add a row for each call with its source, raw value and USD, and compute totals from the rows. When a vendor changes a price, old rows keep the price that applied when you paid, and new rows pick up the new one.

If you also use Sume video or image jobs, add a row for each with the usage.cost from the completed job. Sume's number is a billable amount, so it needs no conversion, and the sum at the bottom is your whole spend on generation for the period.

  • Convert at the boundary, not in reports.
  • Keep the raw value in a column beside the USD value.
  • Re-read the vendor's page before month-end; credit values can change.
from decimal import Decimal as D

USD_PER_BFL_CREDIT = D("0.01")  # BFL docs: 1 credit = $0.01

def usd_from_bfl(cost_credits):
    return D(str(cost_credits)) * USD_PER_BFL_CREDIT

def usd_from_sume(usage_cost):
    return D(str(usage_cost))  # Sume usage.cost is already USD

ledger = [
    ("flux-3 2k (BFL)", usd_from_bfl(10.0)),
    ("flux-3 768sq (BFL)", usd_from_bfl(4.1)),
    ("nano-banana-2.1 2K (Sume)", usd_from_sume(0.15)),
]
for name, usd in ledger:
    print(f"{name:<28} ${usd:.3f}")
print(f"{'total':<28} ${sum(u for _, u in ledger):.3f}")

Sources

Related posts

More in Pricing

All Pricing posts

Written by Sume