ENZH

How I Built a 73-Neta Omakase Field Guide in an Afternoon

A friend shared a gorgeous little course the other day — an omakase 认鱼课, a fish-identification deck for reading a high-end sushi counter. Beautiful typography, one elegant card per fish. One problem: the "English" names were Latin binomials. Thunnus orientalis. Pseudocaranx dentex. Lovely, and completely useless when the itamae looks at you and the menu says Hamachi or Sea Bream.

I wanted the other version — the one that maps 中文 → 日本語 → the name actually printed on an American menu. So I built it. Or more honestly: I orchestrated a small team of agents to build it, and spent the afternoon as editor-in-chief.

Here's the field guide, free: download the PDF (92 pages). And here's how it got made.

Three stages, three different tools

The pipeline had three layers, and the whole trick was using a different kind of tool for each:

1. Research — a multi-agent workflow. Nine agents, one per fish category (赤身, 白身, 光物, 貝, 海老蟹…), each compiling its neta into a structured record: Chinese name, Japanese (kana + romaji), the US-menu English name, Latin binomial, season, how to spot it at the counter, texture, how it's served, the fish it gets confused with. The single most important field — the US menu name — got web-search verification, because that's exactly where a language model's training data quietly lies to you. Ask it to translate 鯛 and it'll confidently say "sea bream," while half of America prints "red snapper." Verify, don't trust.

2. Images — gpt-image-2. Two photoreal shots per fish: the whole fish (for market ID) and the neta as served (what you actually see on the rice). About 150 images. The accuracy lives in the prompt — describe the distinctive coloration and markings and the model gets the species right surprisingly often: the skipjack's belly stripes, the ishidai's black bars, the kinmedai's red skin.

3. Assembly — boring, deterministic code. A generator reads the dataset and emits a print-styled HTML book; headless Chrome prints it to PDF. No AI in this layer, on purpose. Layout is a place you want determinism, not vibes.

That's a shape I keep coming back to: agents for the fan-out, code for the spine. The model is a subroutine the deterministic code calls — never the driver.

Two war stories

No build is honest without the parts that broke.

The tuna-shaped bug. I started image generation on a rate-limited endpoint (cheap, but 10 requests a minute — a 150-image job crawls). I switched to a faster key for parallelism, and suddenly every whole-fish image failed while every plating image succeeded. Same code, same prompts, same model. The tell was the pattern itself: the only thing that differed between the two was image size. Whole-fish shots were 1792×1024 — a legacy size the newer image model rejects; it only accepts 1536×1024. The old endpoint had silently tolerated it; the new one didn't. One-line fix. The lesson is ancient: when a failure splits perfectly along one axis, the bug is on that axis.

The appendix that bred blank pages. The order cheat-sheet is one long table — 82 rows. Rendered as a single overflowing section, it sprouted half-blank pages and split a fish's name across a page break. The fix wasn't CSS cleverness; it was making pagination deterministic: chunk the rows in code, one bounded page at a time, and never end a page on a section header. Let a layout engine flow freely and it will surprise you; tell it exactly where the breaks go and it won't.

The second dataset

Halfway through, a second agent handed me a different 71-item dataset — same fish, different shape. It had numeric taste profiles (fat / firmness / aroma, each 1–5) and a flesh-color hex per neta. Too good to ignore.

I didn't hand-merge it. I had an agent assign a calibrated profile to all 73 of my fish using that dataset as the rating rubric, so the scale stayed consistent across the ones it covered and the ones it didn't. Now every card carries a little 脂 / 弹 / 香 bar chart and a dot in the fish's actual flesh color. That's the kind of enrichment that's tedious by hand and nearly free to delegate.

What's actually in it

73 neta across 9 categories. Every card gives you 中文 / 日本語 / the US menu name, season, how to ID it at the counter, texture, how it's served, confusion pairs, ID keywords, a taste-profile strip, and two photos.

Plus the things you actually need at the counter:

  • a sushi-form primer — 握り / 軍艦 / 巻 / 手巻 / 刺身
  • a prep-technique glossary — 漬け / 昆布締め / 炙り / 煮切り… (often more telling than the fish itself)
  • a menu-warning page — the "white tuna" that's actually escolar; "which tuna is it — bluefin, bigeye, or yellowfin?"; salmon isn't traditional Edomae; fugu needs a licensed chef
  • a 5-page order cheat-sheet you can scan before you point

The part that actually mattered

The whole thing took an afternoon, and most of that was me reviewing, not building. The interesting shift isn't "AI made the pictures." It's that the coordination got cheap. Nine parallel researchers, a verification pass, two image batches, a taste-profile calibration, a deterministic assembler — that's a small production line, and I ran it from a chair.

The skill that paid off wasn't prompting. It was knowing where to put the determinism — schema, layout, pagination — and where to let the fan-out run — research, photos. Get that division right and an afternoon is enough.

Anyway: next time you're at the counter and the menu says Hamachi, you'll know it's young yellowtail, best in winter, firm and clean, and easy to confuse with kanpachi. Itadakimasu.


→ Download the field guide (PDF, 92 pages)

Inspired by a beautifully designed omakase 认鱼课 infographic. The fish photos are AI-generated for reference and aesthetics, not a species-identification standard — when it matters, trust the itamae. Licensed CC BY-NC.

Builder LogsPart 7 of 16
← PrevNext →

© Xingfan Xia 2024 - 2026 · CC BY-NC 4.0