Our 42-second AI story video took $24.21 of generation, then the person reviewing it found 11 defects (an extra arm, a bag hanging from a bag) and it never went out. Re the 200k lost creative jobs thread: here rendering is cheap and catching what's wrong is most of the work. Who checks yours?
Kıvanç Yüksel
@smiletoai.com
Building SmileToAI by myself — generate images, narrate audio, make video, write, all in one place. Teaching myself robotics starting from linear algebra, because skipping fundamentals never actually works. Warsaw.
Weekly test, one run per model, no rerolls: a woman writing with her left hand. Only Nano Banana 2.1 put the pen there. GPT Image 2 rewrote my prompt to "clearly left-handed" and still drew the right hand. I picked handedness because anyone can check it in a second.
Checked our API for the Brotli CVE (CVSS 9.2). Python layer: 0 brotli or brotlicffi in the lockfile, so httpx, requests and aiohttp can't decode br. Image layer: Debian libbrotli1 1.1.0-2+b7, one build short of the fixed 1.1.0-2+deb13u1, and curl links it. Rebuild pending, so not fixed yet.
Building in public: we moved our MCP server from SDK 1.28.1 to 2.3.0. Renamed APIs and a new HTTP client failed loudly, which was cheap. The costly change was silent: 2.x no longer validates tool arguments against the schema. We put the check back with jsonschema, same error text.
Every week I give four image models the same prompt, one run each, no rerolls. Four weeks in: 16 tries, 6 misses, and no two misses alike. With this week's convergence debate in mind: the one miss with an obvious source is a clock at 10:10, the pose watch ads use.
LiteLLM 1.107.0 shipped a credential stealer on PyPI Oct 21, its second compromise this year. It ran on every Python start, imported or not. Keeping our provider keys out of one package is part of why we wrote our own adapters. https://safedep.io/litellm-pypi-compromise-credential-stealer-backdoor/
Building in public: our single-head Alembic test landed Oct 17, and main still split into two migration heads 4 times in the next 4 days, 8h17m in total. Each time it was a pricing-seed migration and a feature migration off the same parent. The test only ever saw one PR at a time.
I first tried a cube's reflection on four image models, all four passed, so I made it harder: a bathroom mirror reflecting a clock at 3:00, numerals reversed. Nano Banana 2.1 and gpt-image-2 got the numerals and the hand at 9. FLUX.2 Pro flipped only some numerals. Grok Imagine drew a normal one.
Building in public: our read-aloud mode has to keep every word of a document. On 2026-10-12 one model pass turned a 21,346-character doc into a 2,765-character script. Now it's 2,000-character sections joined in code. A section that keeps under 80% of its text falls back to the source.
A model provider's "succeeded" is a claim. The stored file is the receipt. In a test of ours a provider returned succeeded with an empty output list, and our worker settled it: 840 Sparks charged, an empty object on the canvas. Since yesterday a run with no stored output fails, hold released.
Building in public, the boring part: I found 3 dated shutdowns in models we run. The one I worry about doesn't fail. After Nov 2, xAI serves grok-imagine-image-quality as grok-imagine-image-2.0 at quality=low. https://docs.x.ai/developers/migration/imagine-image-quality-nov-2
Same prompt, 4 models #3: exactly seven lemons in one row, shot from above. Three of the four drew seven. FLUX.2 Pro drew five, evenly spaced and well lit, which is why I nearly missed it. Last week FLUX also gave me 10:10 when I asked for 4:35. One try each, I kept what came back.
gpt-6.1-sol lists at $2/$10 per 1M tokens, half of gpt-5.6-sol, which runs our top chat tier. In July the price wasn't our problem. The OpenAI SDK's responses.stream() threw IndexError when reasoning items came before the message. Not retested on 6.1. https://developers.openai.com/api/docs/pricing
Gemini's live transcription bills silence: 25 audio tokens per streamed second, pauses included, so a quiet minute costs over half a talking one. No usage numbers come back; our dictation relay counts the seconds itself. Whistle skips silence on-device: https://cactuscompute.com/blog/whistle
Haiku 5.5 is priced by prompt size: $0.10 per million input tokens up to 100k, $0.50 past it. So 99k tokens of input is about a cent and 101k about five, if the whole prompt takes the higher rate (my read of the table). We compact chat at 48k by default, for quality. Now it's a cost setting too.
Building in public, yesterday's bug: an 8 s asyncio.wait_for that never fired. The calls took 14.5 s and 19.4 s and returned normally. The xAI SDK call was synchronous inside an async def, so it blocked the event loop, and the loop is what raises the timeout. The fix was asyncio.to_thread.
Same prompt, 4 models #2: only gpt-image-2 drew the analog clock at 4:35 I asked for. FLUX gave me 10:10, the watch-ad pose, and Grok about 1:00. Gemini got the minute hand right but stopped the hour hand short of the 4, so it reads 3:35. One try each, I kept whatever came back.
Out of credits on Gemini is HTTP 402 now. OpenAI and xAI still send a 429, and Gemini's per-minute 429 says to check your billing details. Our router didn't fail over on a 402, so on Oct 2 our empty Gemini account meant errors, not fallback. Status codes alone won't tell you who's out of money.
pgvector filters after the HNSW scan, so a filter matching 10% of rows gets ~4 of the default 40 candidates. turbopuffer's post on demoting its vector index sent me to our notebook search: one HNSW index over every team's chunks, filters in the WHERE. https://github.com/pgvector/pgvector#filtering
@kyisaiah47.thecompound.tech your solo builders pack sounds like my kind of people. I build and ship an AI app by myself and post the unglamorous bits too. Would you add me?
Gemini 4 Argon raises the output limit from 64K to 1M tokens. At $20 per 1M output once the intro price ends, a call that fills it costs $20. We leave max_output_tokens unset on purpose in one of our narration pipelines. At 64K that was a cheap default. At 1M I don't think it is.
Red RGB(196,52,52) and green RGB(30,140,30) both become grey 95. Black-and-white keeps brightness and drops hue, so colorizing is a guess. Our guide says that: https://smiletoai.com/blog/how-to-colorize-black-and-white-photos?utm_source=bluesky&utm_medium=social&utm_campaign=pillar-a
Reading the Opus 5.5 migration guide. Per token it's cheaper than Opus 5 ($4/$20 vs $5/$25 per million). Per request, maybe not: thinking is always on, disabling it is a 400, and thinking tokens bill as output. https://platform.claude.com/docs/en/models/opus-5-5/migration-guide
An infographic came back with garbled bullet lines the prompt explicitly ruled out. I re-ran the identical prompt 3 times and got 3 clean pictures, so the bug is rare, not something the prompt causes every time. Rewrote it anyway, 4 clean renders. I'm logging that as didn't regress, not fixed.
Our bot protection's top anonymous /api/user client was our own prod box. Pricing page server-renders, finds no user, refetches /api/user at the public origin, so it exits the container and returns via Cloudflare. ~376 a week, all for visitors with only a consent or analytics cookie.
Background removal: first I rejected prompting an image model for a "transparent PNG". Models without alpha paint the checkerboard into the pixels and redraw your subject too. I kept a segmentation model (BiRefNet) matting the original photo, so your exact pixels survive with soft edges.
Gemini's docs say inline requests are fine up to 100 MB, 50 MB for PDFs. On Sept 16 the API refused an 11,108,599-byte PDF we sent inline: "exceeds the maximum size: 10000000". So 10,000,000 bytes per part, decimal. Not sure yet whether that's the model or the code-execution tool being on.
Two video APIs retire six days apart, and their deprecation tables read very differently. OpenAI removes sora-2 and its Videos API on Sep 24. Replacement column: --- Google shuts down gemini-omni-flash-preview on Sep 30, 92 days after launch. Replacement: gemini-omni-1.1-flash.
Scoring transcripts against LibriSpeech this week, I got two errors on a transcript that was right. The reference says PASSER BY, the transcript said passerby. I dropped that clip. The real misses looked like dwelt coming back as drought, and only the diff tells you which kind you've got.
Six hours of 500s in production last Friday, green health check the whole way. The probe asked whether the database answered, which is not the same as asking whether the schema matched the code in the container. Migrations at 0187, tables at 0184, every send hitting a column that did not exist.