From 9a87d9511b0718587d888b68044f05ecf16f1054 Mon Sep 17 00:00:00 2001 From: Tom Beckenham <34339192+tombeckenham@users.noreply.github.com> Date: Fri, 13 Nov 2026 10:12:15 +1100 Subject: [PATCH] Read the BytePlus image table under its annotated header (#640) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The ModelArk pricing page added a note line to the "Output image" header and reworded Seedream 5.0 pro's pixel tiers ("P ≤ 2.61 million"), so the image table matched no header and every poll threw "parsed 0 model rows". The output column is now the one header starting "Output image", and the tier pattern follows the new wording. Still fail-closed: no table, or a row in any other wording, yields no price. Fixture is the image table cut verbatim from the page on 2026-11-13. --- src/server/providers/byteplus-pricing.test.ts | 52 +- src/server/providers/byteplus-pricing.ts | 68 +- .../fixtures/byteplus-pricing-images.json | 672 ++++++++++++++++++ 3 files changed, 765 insertions(+), 27 deletions(-) create mode 100644 src/server/providers/fixtures/byteplus-pricing-images.json diff --git a/src/server/providers/byteplus-pricing.test.ts b/src/server/providers/byteplus-pricing.test.ts index 4402b47e..7ca2eb15 100644 --- a/src/server/providers/byteplus-pricing.test.ts +++ b/src/server/providers/byteplus-pricing.test.ts @@ -19,6 +19,7 @@ import { sharePublishedAliases, } from './byteplus-pricing.ts' import type { ByteplusDoc } from './byteplus-pricing.ts' +import liveImages from './fixtures/byteplus-pricing-images.json' import { pricingDoc } from './fixtures/byteplus-pricing-doc.ts' import type { PricingTable } from './fixtures/byteplus-pricing-doc.ts' import { overlayModelFacts } from './reasoning-config.ts' @@ -583,7 +584,7 @@ const IMAGE_TABLE: PricingTable = { [ 'dola-seedream-5-0-pro-260628', 'First image: Free From the second image: $0.003 Pricing varies by image generation scenario.', - 'Single-image generation: Up to 2.61 million pixels (1.5K or lower): $0.045 More than 2.61 million pixels (higher than 1.5K): $0.09 Layer decomposition: Up to 2.61 million pixels (1.5K or lower): $0.0225 More than 2.61 million pixels (higher than 1.5K): $0.045', + 'Single-image generation: P ≤ 2.61 million (1.5K or lower): $0.045 P > 2.61 million (higher than 1.5K): $0.09 Layer decomposition: P ≤ 2.61 million (1.5K or lower): $0.0225 P > 2.61 million (higher than 1.5K): $0.045', ], ['seedream-5-0-lite-260128', 'Free', '$0.035'], ['dola-seedream-5-0-flash-260915', 'Free', '$0.018'], @@ -764,6 +765,55 @@ describe('byteplus video and image tables', () => { }) }) +describe('byteplus image table as published 2026-11-13 (#640)', () => { + // The image table cut verbatim from the live doc: the "Output image" + // header now carries a note line, and Seedream 5.0 pro's tiers read + // "P ≤ 2.61 million". + const page: ByteplusDoc = liveImages + + it('reads the flat rows under the annotated header', () => { + expect(parseByteplusImages(page)).toEqual( + new Map([ + ['dola-seedream-5-0-flash-260915', 0.018], + ['seedream-5-0-lite-260128', 0.035], + ['seedream-4-5-251128', 0.04], + ['seedream-4-0-250828', 0.03], + ['seededit-3-0-i2i-250628', 0.03], + ]), + ) + }) + + it('reads Seedream 5.0 pro tiers and leaves Seedream 5.5 unpriced', () => { + expect(parseByteplusPixelTiers(page)).toEqual( + new Map([ + [ + 'dola-seedream-5-0-pro-260628', + { + extraInput: 0.003, + maxLowPixels: 2.61e6, + lowLevel: '1.5K', + low: 0.045, + high: 0.09, + }, + ], + ]), + ) + }) + + it('still parses nothing from a table with no output column', () => { + const none = pricingDoc([ + { + rows: [ + ['Model ID', 'Input image'], + ['seedream-4-0-250828', 'Free'], + ], + }, + ]) + expect(parseByteplusImages(none).size).toBe(0) + expect(parseByteplusPixelTiers(none).size).toBe(0) + }) +}) + /** The tutorial's model and pixel tables as the live page words them. */ const GUIDE = doc( [ diff --git a/src/server/providers/byteplus-pricing.ts b/src/server/providers/byteplus-pricing.ts index 0dc0afe7..cc110b55 100644 --- a/src/server/providers/byteplus-pricing.ts +++ b/src/server/providers/byteplus-pricing.ts @@ -838,29 +838,52 @@ export function parseByteplusVideo( return out } +interface ImageRow { + id: string + input: string + output: string + cells: Array +} + /** - * Image table: `Model ID ‖ Input image ‖ Output image`, USD per image - * (`$0.035`). Only flat rows with free input images are read here; Seedream 5.0 - * pro's pixel-tiered row is `parseByteplusPixelTiers`. Only the first - * matching table is read. + * Image table rows: `Model ID ‖ Input image ‖ Output image`. Since + * 2026-11-12 (#640) the output header carries a note line ("P is the total + * pixel count of a single output image."), so that column is the one header + * starting "Output image". Only the first matching table is read. + */ +function imageRows(doc: ByteplusDoc): Array { + for (const { keys, rows } of tablesWith(doc, ['model id', 'input image'])) { + const outputs = keys.flatMap((key, at) => + /^output image\b/.test(key) ? [at] : [], + ) + const [output] = outputs + if (output === undefined || outputs.length > 1) continue + return rows.map((cells) => ({ + id: (cells[keys.indexOf('model id')] ?? '').split(' ')[0] ?? '', + input: (cells[keys.indexOf('input image')] ?? '').trim(), + output: (cells[output] ?? '').trim(), + cells, + })) + } + return [] +} + +/** + * Flat image rows, USD per output image (`$0.035`) with free input images. + * Seedream 5.0 pro's pixel-tiered row is `parseByteplusPixelTiers`; any + * other row (Seedream 5.5's paid inputs and bounded pixel tiers) is + * unpriced and warned. */ export function parseByteplusImages(doc: ByteplusDoc): Map { const out = new Map() - const [table] = tablesWith(doc, ['model id', 'input image', 'output image']) - if (!table) return out - const at = (key: string) => table.keys.indexOf(key) - for (const row of table.rows) { - const id = (row[at('model id')] ?? '').split(' ')[0] ?? '' + for (const { id, input, output, cells } of imageRows(doc)) { if (!/^[a-z0-9-]+$/.test(id)) continue - const input = (row[at('input image')] ?? '').trim() - const output = dollars((row[at('output image')] ?? '').trim()) - if (!/^free$/i.test(input) || output === null) { - // Pixel-tiered rows belong to `parseByteplusPixelTiers`. - const tiered = pixelTierRates(input, row[at('output image')] ?? '') - if (!tiered) warnUnread('image', id, row) + const rate = dollars(output) + if (!/^free$/i.test(input) || rate === null) { + if (!pixelTierRates(input, output)) warnUnread('image', id, cells) continue } - out.set(id, output) + out.set(id, rate) } return out } @@ -1009,7 +1032,7 @@ const PIXEL_TIER_INPUT = // Layer decomposition is not read: the page says one request's layers can // land in different tiers, so the card refuses that mode. const PIXEL_TIER_OUTPUT = - /^Single-image generation: Up to ([\d.]+) million pixels \(([\d.]+)K or lower\): \$([\d.]+) More than \1 million pixels \(higher than \2K\): \$([\d.]+) Layer decomposition: /i + /^Single-image generation: P ≤ ([\d.]+) million \(([\d.]+)K or lower\): \$([\d.]+) P > \1 million \(higher than \2K\): \$([\d.]+) Layer decomposition: /i /** One image-table row as pixel tiers, or null for any other wording. */ function pixelTierRates( @@ -1034,15 +1057,8 @@ export function parseByteplusPixelTiers( doc: ByteplusDoc, ): Map { const out = new Map() - const [table] = tablesWith(doc, ['model id', 'input image', 'output image']) - if (!table) return out - const at = (key: string) => table.keys.indexOf(key) - for (const row of table.rows) { - const id = (row[at('model id')] ?? '').split(' ')[0] ?? '' - const rates = pixelTierRates( - row[at('input image')] ?? '', - row[at('output image')] ?? '', - ) + for (const { id, input, output } of imageRows(doc)) { + const rates = pixelTierRates(input, output) if (/^[a-z0-9-]+$/.test(id) && rates) out.set(id, rates) } return out diff --git a/src/server/providers/fixtures/byteplus-pricing-images.json b/src/server/providers/fixtures/byteplus-pricing-images.json new file mode 100644 index 00000000..d5703062 --- /dev/null +++ b/src/server/providers/fixtures/byteplus-pricing-images.json @@ -0,0 +1,672 @@ +{ + "data": { + "0": { + "ops": [ + { + "insert": "*", + "attributes": { + "aceTable": "rs5c0kfak9nz3y2f8w8bz1vw1au1cp1i0z cs9m37flvw9phnlqbewt7pc5v73z8mtlmr", + "aceTableMode": "list", + "full": "true" + } + } + ] + }, + "rs5c0kfak9nz3y2f8w8bz1vw1au1cp1i0z": { + "ops": [ + { + "insert": { + "id": "r1wii9q245hncnp608wusqbwue2j6gva5f" + }, + "attributes": { + "backgroundColor": "{\"5mqku70m\":\"\",\"374cj031\":\"\",\"7udzd8ng\":\"\"}" + } + }, + { + "insert": { + "id": "r1kpf6gbgumwn62ichadyv5ejldheiim2m" + }, + "attributes": { + "backgroundColor": "{\"cgr1hmkv\":\"\",\"481wchc1\":\"\",\"3mg39h5z\":\"\"}" + } + }, + { + "insert": { + "id": "r1jrdtjc4ns65yjc2jifz9ik21hsni7g1l" + }, + "attributes": { + "backgroundColor": "{\"1m3ykgch\":\"\",\"m5lom5y3\":\"\",\"lle1nhla\":\"\"}" + } + }, + { + "insert": { + "id": "r15lqw4icl4h6fydytmbh1137l2snbwaoi" + }, + "attributes": { + "backgroundColor": "{\"4tzvf4a5\":\"\",\"9p1f0ivl\":\"\",\"a3q0cm19\":\"\"}" + } + }, + { + "insert": { + "id": "r1u5lf36slhvr82be9no0vj7nc1v0tl8l9" + }, + "attributes": { + "backgroundColor": "{\"u95gjjqb\":\"\",\"8s4ru0rb\":\"\",\"82olkyqz\":\"\"}" + } + }, + { + "insert": { + "id": "r1k3gzbq0n8os07chg676azmt7a6hkro2v" + }, + "attributes": { + "backgroundColor": "{\"9itf4pdc\":\"\",\"1ucuevuj\":\"\",\"b74tn8z2\":\"\"}" + } + }, + { + "insert": { + "id": "r11sqcwvtv63obl85gu7fwzn4t2l0b5rw5" + }, + "attributes": { + "backgroundColor": "{\"7udegeag\":\"\",\"n1rpwmei\":\"\",\"kutr59mv\":\"\"}" + } + }, + { + "insert": { + "id": "r1zq2bp6ny4ujturji9bqc1k5sunvlbnmf" + }, + "attributes": { + "backgroundColor": "{\"z47doqg0\":\"\",\"eb7h88r7\":\"\",\"yhd0qvlj\":\"\"}" + } + } + ], + "zoneId": "rs5c0kfak9nz3y2f8w8bz1vw1au1cp1i0z", + "zoneType": "R" + }, + "cs9m37flvw9phnlqbewt7pc5v73z8mtlmr": { + "ops": [ + { + "insert": { + "id": "c120ycai5tfupdi255b5899uivqv1z8pnj" + }, + "attributes": { + "backgroundColor": "{\"5mqku70m\":\"\",\"cgr1hmkv\":\"\",\"1m3ykgch\":\"\",\"4tzvf4a5\":\"\",\"u95gjjqb\":\"\",\"9itf4pdc\":\"\",\"7udegeag\":\"\",\"z47doqg0\":\"\"}", + "colWidth": "120", + "colWidthSpan": "2" + } + }, + { + "insert": { + "id": "c1s26ojjn397jjcm47a9s3yj0g54jo8vnt" + }, + "attributes": { + "backgroundColor": "{\"374cj031\":\"\",\"481wchc1\":\"\",\"m5lom5y3\":\"\",\"9p1f0ivl\":\"\",\"8s4ru0rb\":\"\",\"1ucuevuj\":\"\",\"n1rpwmei\":\"\",\"eb7h88r7\":\"\"}", + "colWidth": "360", + "colWidthSpan": "2" + } + }, + { + "insert": { + "id": "c1aggm47l19cvdf098al6hpq68v9jq2jwm" + }, + "attributes": { + "backgroundColor": "{\"7udzd8ng\":\"\",\"3mg39h5z\":\"\",\"lle1nhla\":\"\",\"a3q0cm19\":\"\",\"82olkyqz\":\"\",\"b74tn8z2\":\"\",\"kutr59mv\":\"\",\"yhd0qvlj\":\"\"}", + "colWidth": "500", + "colWidthSpan": "2" + } + } + ], + "zoneId": "cs9m37flvw9phnlqbewt7pc5v73z8mtlmr", + "zoneType": "C" + }, + "xr1wii9q245hncnp608wusqbwue2j6gva5fxc120ycai5tfupdi255b5899uivqv1z8pnj": { + "ops": [ + { + "insert": "*", + "attributes": { + "lineId": "nfyx91a38p", + "lmkr": "1" + } + }, + { + "insert": "Model ID\n" + } + ], + "zoneId": "xr1wii9q245hncnp608wusqbwue2j6gva5fxc120ycai5tfupdi255b5899uivqv1z8pnj", + "zoneType": "Z" + }, + "xr1wii9q245hncnp608wusqbwue2j6gva5fxc1s26ojjn397jjcm47a9s3yj0g54jo8vnt": { + "ops": [ + { + "insert": "*", + "attributes": { + "lineId": "ntic21fv9p", + "lmkr": "1" + } + }, + { + "insert": "Input image\n" + } + ], + "zoneId": "xr1wii9q245hncnp608wusqbwue2j6gva5fxc1s26ojjn397jjcm47a9s3yj0g54jo8vnt", + "zoneType": "Z" + }, + "xr1wii9q245hncnp608wusqbwue2j6gva5fxc1aggm47l19cvdf098al6hpq68v9jq2jwm": { + "ops": [ + { + "insert": "*", + "attributes": { + "lineId": "ngjdi1acu8", + "lmkr": "1" + } + }, + { + "insert": "Output image\n" + }, + { + "insert": "*", + "attributes": { + "blockquote": "true", + "lineId": "ngl1f1adno", + "lmkr": "1", + "wrapperIndent": "0" + } + }, + { + "insert": "P is the total pixel count of a single output image.\n" + } + ], + "zoneId": "xr1wii9q245hncnp608wusqbwue2j6gva5fxc1aggm47l19cvdf098al6hpq68v9jq2jwm", + "zoneType": "Z" + }, + "xr1kpf6gbgumwn62ichadyv5ejldheiim2mxc120ycai5tfupdi255b5899uivqv1z8pnj": { + "ops": [ + { + "insert": "*", + "attributes": { + "lineId": "n3hjo14wi5", + "lmkr": "1" + } + }, + { + "insert": "dola-seedream-5-5-261028", + "attributes": { + "inlineCode": "true" + } + }, + { + "insert": "\n" + } + ], + "zoneId": "xr1kpf6gbgumwn62ichadyv5ejldheiim2mxc120ycai5tfupdi255b5899uivqv1z8pnj", + "zoneType": "Z" + }, + "xr1kpf6gbgumwn62ichadyv5ejldheiim2mxc1s26ojjn397jjcm47a9s3yj0g54jo8vnt": { + "ops": [ + { + "insert": "*", + "attributes": { + "lineId": "mm5js0xfvi", + "lmkr": "1" + } + }, + { + "insert": "$0.008\n" + } + ], + "zoneId": "xr1kpf6gbgumwn62ichadyv5ejldheiim2mxc1s26ojjn397jjcm47a9s3yj0g54jo8vnt", + "zoneType": "Z" + }, + "xr1kpf6gbgumwn62ichadyv5ejldheiim2mxc1aggm47l19cvdf098al6hpq68v9jq2jwm": { + "ops": [ + { + "insert": "*", + "attributes": { + "lineId": "nq4ya1ehjp", + "list": "bullet1", + "lmkr": "1", + "origin-start": "1", + "start": "1" + } + }, + { + "insert": "921,600 ≤ P ≤ 1536² × 1.05² (2,601,123.84): $0.020\n" + }, + { + "insert": "*", + "attributes": { + "lineId": "nq69g1eiip", + "list": "bullet1", + "lmkr": "1", + "origin-start": "1", + "start": "1" + } + }, + { + "insert": "1536² × 1.05² (2,601,123.84) < P ≤ 2048² × 1.05² (4,624,220.16): $0.035\n" + } + ], + "zoneId": "xr1kpf6gbgumwn62ichadyv5ejldheiim2mxc1aggm47l19cvdf098al6hpq68v9jq2jwm", + "zoneType": "Z" + }, + "xr1jrdtjc4ns65yjc2jifz9ik21hsni7g1lxc120ycai5tfupdi255b5899uivqv1z8pnj": { + "ops": [ + { + "insert": "*", + "attributes": { + "lineId": "mi4s10vsr0", + "lmkr": "1" + } + }, + { + "insert": "dola-seedream-5-0-pro-260628", + "attributes": { + "inlineCode": "true" + } + }, + { + "insert": "\n" + } + ], + "zoneId": "xr1jrdtjc4ns65yjc2jifz9ik21hsni7g1lxc120ycai5tfupdi255b5899uivqv1z8pnj", + "zoneType": "Z" + }, + "xr1jrdtjc4ns65yjc2jifz9ik21hsni7g1lxc1s26ojjn397jjcm47a9s3yj0g54jo8vnt": { + "ops": [ + { + "insert": "*", + "attributes": { + "lineId": "nardd17y6z", + "list": "bullet1", + "lmkr": "1", + "origin-start": "1", + "start": "1" + } + }, + { + "insert": "First image: Free\n" + }, + { + "insert": "*", + "attributes": { + "lineId": "nat0y17z5p", + "list": "bullet1", + "lmkr": "1", + "origin-start": "1", + "start": "1" + } + }, + { + "insert": "From the second image: $0.003\n" + }, + { + "insert": "*", + "attributes": { + "blockquote": "true", + "lineId": "naup4180j4", + "lmkr": "1", + "wrapperIndent": "0" + } + }, + { + "insert": "Pricing varies by image generation scenario.\n" + } + ], + "zoneId": "xr1jrdtjc4ns65yjc2jifz9ik21hsni7g1lxc1s26ojjn397jjcm47a9s3yj0g54jo8vnt", + "zoneType": "Z" + }, + "xr1jrdtjc4ns65yjc2jifz9ik21hsni7g1lxc1aggm47l19cvdf098al6hpq68v9jq2jwm": { + "ops": [ + { + "insert": "*", + "attributes": { + "lineId": "o2pl41jnsc", + "list": "bullet1", + "lmkr": "1", + "origin-start": "1", + "start": "1" + } + }, + { + "insert": "Single-image generation:\n" + }, + { + "insert": "*", + "attributes": { + "lineId": "o2r8m1joxg", + "list": "bullet2", + "lmkr": "1", + "origin-start": "1", + "start": "1" + } + }, + { + "insert": "P ≤ 2.61 million (1.5K or lower): $0.045\n" + }, + { + "insert": "*", + "attributes": { + "lineId": "o2t7h1jpts", + "list": "bullet2", + "lmkr": "1", + "origin-start": "1", + "start": "1" + } + }, + { + "insert": "P > 2.61 million (higher than 1.5K): $0.09\n" + }, + { + "insert": "*", + "attributes": { + "lineId": "o2uhb1jq85", + "list": "bullet1", + "lmkr": "1", + "origin-start": "1", + "start": "1" + } + }, + { + "insert": "Layer decomposition:\n" + }, + { + "insert": "*", + "attributes": { + "lineId": "o2w3g1jrld", + "list": "bullet2", + "lmkr": "1", + "origin-start": "1", + "start": "1" + } + }, + { + "insert": "P ≤ 2.61 million (1.5K or lower): $0.0225\n" + }, + { + "insert": "*", + "attributes": { + "lineId": "o2ypm1jsag", + "list": "bullet2", + "lmkr": "1", + "origin-start": "1", + "start": "1" + } + }, + { + "insert": "P > 2.61 million (higher than 1.5K): $0.045\n" + } + ], + "zoneId": "xr1jrdtjc4ns65yjc2jifz9ik21hsni7g1lxc1aggm47l19cvdf098al6hpq68v9jq2jwm", + "zoneType": "Z" + }, + "xr15lqw4icl4h6fydytmbh1137l2snbwaoixc120ycai5tfupdi255b5899uivqv1z8pnj": { + "ops": [ + { + "insert": "*", + "attributes": { + "lineId": "nkgxj1c4ne", + "lmkr": "1" + } + }, + { + "insert": "dola-seedream-5-0-flash-260915", + "attributes": { + "inlineCode": "true" + } + }, + { + "insert": "\n" + } + ], + "zoneId": "xr15lqw4icl4h6fydytmbh1137l2snbwaoixc120ycai5tfupdi255b5899uivqv1z8pnj", + "zoneType": "Z" + }, + "xr15lqw4icl4h6fydytmbh1137l2snbwaoixc1s26ojjn397jjcm47a9s3yj0g54jo8vnt": { + "ops": [ + { + "insert": "*", + "attributes": { + "lineId": "m8uva0s6za", + "lmkr": "1" + } + }, + { + "insert": "Free\n" + } + ], + "zoneId": "xr15lqw4icl4h6fydytmbh1137l2snbwaoixc1s26ojjn397jjcm47a9s3yj0g54jo8vnt", + "zoneType": "Z" + }, + "xr15lqw4icl4h6fydytmbh1137l2snbwaoixc1aggm47l19cvdf098al6hpq68v9jq2jwm": { + "ops": [ + { + "insert": "*", + "attributes": { + "lineId": "o373n1jx5t", + "lmkr": "1" + } + }, + { + "insert": "$0.018\n" + } + ], + "zoneId": "xr15lqw4icl4h6fydytmbh1137l2snbwaoixc1aggm47l19cvdf098al6hpq68v9jq2jwm", + "zoneType": "Z" + }, + "xr1u5lf36slhvr82be9no0vj7nc1v0tl8l9xc120ycai5tfupdi255b5899uivqv1z8pnj": { + "ops": [ + { + "insert": "*", + "attributes": { + "lineId": "mj4wb0w4fg", + "lmkr": "1" + } + }, + { + "insert": "seedream-5-0-lite-260128", + "attributes": { + "inlineCode": "true" + } + }, + { + "insert": "\n" + } + ], + "zoneId": "xr1u5lf36slhvr82be9no0vj7nc1v0tl8l9xc120ycai5tfupdi255b5899uivqv1z8pnj", + "zoneType": "Z" + }, + "xr1u5lf36slhvr82be9no0vj7nc1v0tl8l9xc1s26ojjn397jjcm47a9s3yj0g54jo8vnt": { + "ops": [ + { + "insert": "*", + "attributes": { + "lineId": "n4hg515bre", + "lmkr": "1" + } + }, + { + "insert": "Free\n" + } + ], + "zoneId": "xr1u5lf36slhvr82be9no0vj7nc1v0tl8l9xc1s26ojjn397jjcm47a9s3yj0g54jo8vnt", + "zoneType": "Z" + }, + "xr1u5lf36slhvr82be9no0vj7nc1v0tl8l9xc1aggm47l19cvdf098al6hpq68v9jq2jwm": { + "ops": [ + { + "insert": "*", + "attributes": { + "lineId": "nskie1fhcn", + "lmkr": "1" + } + }, + { + "insert": "$0.035\n" + } + ], + "zoneId": "xr1u5lf36slhvr82be9no0vj7nc1v0tl8l9xc1aggm47l19cvdf098al6hpq68v9jq2jwm", + "zoneType": "Z" + }, + "xr1k3gzbq0n8os07chg676azmt7a6hkro2vxc120ycai5tfupdi255b5899uivqv1z8pnj": { + "ops": [ + { + "insert": "*", + "attributes": { + "lineId": "ob2rv1n0kx", + "lmkr": "1" + } + }, + { + "insert": "seedream-4-5-251128", + "attributes": { + "inlineCode": "true" + } + }, + { + "insert": "\n" + } + ], + "zoneId": "xr1k3gzbq0n8os07chg676azmt7a6hkro2vxc120ycai5tfupdi255b5899uivqv1z8pnj", + "zoneType": "Z" + }, + "xr1k3gzbq0n8os07chg676azmt7a6hkro2vxc1s26ojjn397jjcm47a9s3yj0g54jo8vnt": { + "ops": [ + { + "insert": "*", + "attributes": { + "lineId": "obfdd1n6ny", + "lmkr": "1" + } + }, + { + "insert": "Free\n" + } + ], + "zoneId": "xr1k3gzbq0n8os07chg676azmt7a6hkro2vxc1s26ojjn397jjcm47a9s3yj0g54jo8vnt", + "zoneType": "Z" + }, + "xr1k3gzbq0n8os07chg676azmt7a6hkro2vxc1aggm47l19cvdf098al6hpq68v9jq2jwm": { + "ops": [ + { + "insert": "*", + "attributes": { + "lineId": "mokku0ybb8", + "lmkr": "1" + } + }, + { + "insert": "$0.04\n" + } + ], + "zoneId": "xr1k3gzbq0n8os07chg676azmt7a6hkro2vxc1aggm47l19cvdf098al6hpq68v9jq2jwm", + "zoneType": "Z" + }, + "xr11sqcwvtv63obl85gu7fwzn4t2l0b5rw5xc120ycai5tfupdi255b5899uivqv1z8pnj": { + "ops": [ + { + "insert": "*", + "attributes": { + "lineId": "nvmkj1gqb8", + "lmkr": "1" + } + }, + { + "insert": "seedream-4-0-250828", + "attributes": { + "inlineCode": "true" + } + }, + { + "insert": "\n" + } + ], + "zoneId": "xr11sqcwvtv63obl85gu7fwzn4t2l0b5rw5xc120ycai5tfupdi255b5899uivqv1z8pnj", + "zoneType": "Z" + }, + "xr11sqcwvtv63obl85gu7fwzn4t2l0b5rw5xc1s26ojjn397jjcm47a9s3yj0g54jo8vnt": { + "ops": [ + { + "insert": "*", + "attributes": { + "lineId": "nc7je18hqg", + "lmkr": "1" + } + }, + { + "insert": "Free\n" + } + ], + "zoneId": "xr11sqcwvtv63obl85gu7fwzn4t2l0b5rw5xc1s26ojjn397jjcm47a9s3yj0g54jo8vnt", + "zoneType": "Z" + }, + "xr11sqcwvtv63obl85gu7fwzn4t2l0b5rw5xc1aggm47l19cvdf098al6hpq68v9jq2jwm": { + "ops": [ + { + "insert": "*", + "attributes": { + "lineId": "mf9ze0usgw", + "lmkr": "1" + } + }, + { + "insert": "$0.03\n" + } + ], + "zoneId": "xr11sqcwvtv63obl85gu7fwzn4t2l0b5rw5xc1aggm47l19cvdf098al6hpq68v9jq2jwm", + "zoneType": "Z" + }, + "xr1zq2bp6ny4ujturji9bqc1k5sunvlbnmfxc120ycai5tfupdi255b5899uivqv1z8pnj": { + "ops": [ + { + "insert": "*", + "attributes": { + "lineId": "mmrzi0xn0x", + "lmkr": "1" + } + }, + { + "insert": "seededit-3-0-i2i-250628", + "attributes": { + "inlineCode": "true" + } + }, + { + "insert": "\n" + } + ], + "zoneId": "xr1zq2bp6ny4ujturji9bqc1k5sunvlbnmfxc120ycai5tfupdi255b5899uivqv1z8pnj", + "zoneType": "Z" + }, + "xr1zq2bp6ny4ujturji9bqc1k5sunvlbnmfxc1s26ojjn397jjcm47a9s3yj0g54jo8vnt": { + "ops": [ + { + "insert": "*", + "attributes": { + "lineId": "n4lno15dge", + "lmkr": "1" + } + }, + { + "insert": "Free\n" + } + ], + "zoneId": "xr1zq2bp6ny4ujturji9bqc1k5sunvlbnmfxc1s26ojjn397jjcm47a9s3yj0g54jo8vnt", + "zoneType": "Z" + }, + "xr1zq2bp6ny4ujturji9bqc1k5sunvlbnmfxc1aggm47l19cvdf098al6hpq68v9jq2jwm": { + "ops": [ + { + "insert": "*", + "attributes": { + "lineId": "ma1aw0soaf", + "lmkr": "1" + } + }, + { + "insert": "$0.03\n" + } + ], + "zoneId": "xr1zq2bp6ny4ujturji9bqc1k5sunvlbnmfxc1aggm47l19cvdf098al6hpq68v9jq2jwm", + "zoneType": "Z" + } + } +}