GEMINI LABJP
STUDIO — The planned standalone AI Studio app for Android and iOS has been cancelled, with its app-building tools folded directly into the Gemini app alongside image, video, text and code workBENCH — Gemini 3.7 Flash moved from 49.0 to 65.3 percent on DeepSWE, a long-horizon coding benchmark, while costing half as much per tokenREACH — Beyond the Gemini API, 3.7 Flash is available in Android Studio, Google Antigravity, the Gemini Enterprise Agent Platform, and Spark in the Gemini appAPI — The sampling parameters temperature, top_p and top_k are now deprecated. If you relied on them to keep output steady, it is time to decide where reproducibility comes from insteadROBOTICS — gemini-robotics-er-1.6-preview shuts down on August 31, nine days out. Its successors, er-2-preview and er-2-streaming-preview, accept text, image, video and audio inputASSISTANT — Replacing Google Assistant with Gemini on Android begins September 4, thirteen days from now. Worth checking any app that leans on App Actions or voice shortcutsSTUDIO — The planned standalone AI Studio app for Android and iOS has been cancelled, with its app-building tools folded directly into the Gemini app alongside image, video, text and code workBENCH — Gemini 3.7 Flash moved from 49.0 to 65.3 percent on DeepSWE, a long-horizon coding benchmark, while costing half as much per tokenREACH — Beyond the Gemini API, 3.7 Flash is available in Android Studio, Google Antigravity, the Gemini Enterprise Agent Platform, and Spark in the Gemini appAPI — The sampling parameters temperature, top_p and top_k are now deprecated. If you relied on them to keep output steady, it is time to decide where reproducibility comes from insteadROBOTICS — gemini-robotics-er-1.6-preview shuts down on August 31, nine days out. Its successors, er-2-preview and er-2-streaming-preview, accept text, image, video and audio inputASSISTANT — Replacing Google Assistant with Gemini on Android begins September 4, thirteen days from now. Worth checking any app that leans on App Actions or voice shortcuts
Articles/API / SDK
API / SDK/2026-08-22Intermediate

Once You Pass Twenty Mediation Groups, How Do You Find the Setting That Went Missing?

As ad mediation groups multiply, missing sources and type drift accumulate quietly. Here is the split I settled on: normalize the settings into one matrix, let code confirm the gaps, and send Gemini only the cells that need judgment.

gemini106gemini-api282admob5structured-output26indie-dev46

Premium Article

When I extended mediation on the iOS side and added Liftoff, InMobi, and Unity Ads, the change covered four apps and more than twenty groups. I opened them one at a time in the console, checking that every network appeared in the same shape. Around the tenth group I lost track of where I had already been.

A week later I found that one group was missing a single network. Revenue for that group was slightly lower, but nothing that would register as an anomaly. Missing configuration tends to show up in exactly that quiet way.

So I rebuilt the check. The short version: finding the gaps is a job for code, and what Gemini receives is only the question of whether each gap is deliberate.

"Tell Me What Looks Wrong" Will Not Surface an Absence

My first attempt was the obvious one. I dumped all twenty-odd groups into text and asked Gemini to point out inconsistencies.

What came back were cells where the eCPM was clearly off by an order of magnitude, and group names that broke the naming convention. Both were correct observations. But the one thing I most wanted — a network missing from a single group — never appeared.

Once I thought about why, it made sense. An anomaly in something that exists leaves traces in the text. An absence exists only as nothing written in a particular place. To notice that row 19 lacks an element every other row has, you first collect the union of elements across all rows, then diff each row against it. That is set arithmetic, not reading comprehension.

Rather than push a language model into work it is poorly shaped for, I changed the shape of what I handed it.

Step One: Normalize the Settings Into a Single Matrix

A console export works, and so does hand-written JSON transcribed from screenshots. What matters is getting to a form you can pivot into a group-by-network matrix.

# groups: transcribed from the console. In production, read the export instead.
groups = [
    {"group": "RWD-iOS-Wallpaper-JP", "app": "wallpaper", "sources": [
        {"network": "admob_bidding", "type": "bidding"},
        {"network": "applovin",      "type": "bidding"},
        {"network": "liftoff",       "type": "bidding"},
        {"network": "inmobi",        "type": "bidding"},
        {"network": "unity",         "type": "waterfall", "ecpm": 4.2}]},
    {"group": "RWD-iOS-Wallpaper-US", "app": "wallpaper", "sources": [
        {"network": "admob_bidding", "type": "bidding"},
        {"network": "applovin",      "type": "bidding"},
        {"network": "liftoff",       "type": "bidding"},
        {"network": "unity",         "type": "waterfall", "ecpm": 4.2}]},
    {"group": "RWD-iOS-Ukiyoe-JP", "app": "ukiyoe", "sources": [
        {"network": "admob_bidding", "type": "bidding"},
        {"network": "applovin",      "type": "bidding"},
        {"network": "liftoff",       "type": "bidding"},
        {"network": "inmobi",        "type": "bidding"},
        {"network": "unity",         "type": "waterfall", "ecpm": 0.42}]},
    {"group": "RWD-iOS-Healing-JP", "app": "healing", "sources": [
        {"network": "admob_bidding", "type": "bidding"},
        {"network": "applovin",      "type": "waterfall", "ecpm": 3.9},
        {"network": "liftoff",       "type": "bidding"},
        {"network": "inmobi",        "type": "bidding"},
        {"network": "unity",         "type": "waterfall", "ecpm": 4.2}]},
]
 
 
def build_matrix(groups):
    """Build a group x network table.
    Unset cells become None, and those are the candidates for 'missing'."""
    networks = sorted({s["network"] for g in groups for s in g["sources"]})
    matrix = {}
    for g in groups:
        by_net = {s["network"]: s for s in g["sources"]}
        matrix[g["group"]] = {n: by_net.get(n) for n in networks}
    return networks, matrix
 
 
networks, matrix = build_matrix(groups)
for name, row in matrix.items():
    print(name, {n: (row[n]["type"] if row[n] else "-") for n in networks})

Running it locally gives you this:

RWD-iOS-Wallpaper-JP {'admob_bidding': 'bidding', 'applovin': 'bidding', 'inmobi': 'bidding', 'liftoff': 'bidding', 'unity': 'waterfall'}
RWD-iOS-Wallpaper-US {'admob_bidding': 'bidding', 'applovin': 'bidding', 'inmobi': '-', 'liftoff': 'bidding', 'unity': 'waterfall'}
RWD-iOS-Ukiyoe-JP    {'admob_bidding': 'bidding', 'applovin': 'bidding', 'inmobi': 'bidding', 'liftoff': 'bidding', 'unity': 'waterfall'}
RWD-iOS-Healing-JP   {'admob_bidding': 'bidding', 'applovin': 'waterfall', 'inmobi': 'bidding', 'liftoff': 'bidding', 'unity': 'waterfall'}

One dash. The thing I lost track of at group ten is now sitting in plain view. It is only a reshaping, but the nature of the check changes at this point.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
You will be able to split data that contains absences into the part code should settle and the part a language model should judge
You will catch a missing ad network during a few minutes of pre-flight checking instead of noticing it weeks later in the revenue numbers
You will be able to lift the responseSchema-to-report implementation straight into your own project
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Gemini Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $15 for lifetime access
View Membership →

Related Articles

API / SDK2026-07-13
When responseSchema Can't Do $ref: Handling Recursive Schemas in Production with responseJsonSchema
Gemini's responseSchema is an OpenAPI subset with no $ref or $defs, so it can't express shared definitions or recursion. Here's how I moved to responseJsonSchema to reuse localized fields and handle a recursive category tree in production.
API / SDK2026-06-30
Letting Gemini Listen to a Long Track and Build Its Chapters — Timestamped Structured Extraction
How I replaced hours of hand-chaptering long healing-audio tracks with Gemini's audio understanding: uploading long files via the Files API, pinning JSON output with response_schema, and the validation code that catches audio-specific quirks like timestamp drift and phantom silence.
API / SDK2026-06-26
Reliable Text-in-Image with Gemini 3.1 Flash Image — an OCR-Verified Pipeline
After the preview shutdown, the GA gemini-3.1-flash-image still occasionally garbles text baked into images. Here is a generate -> read-back-verify -> regenerate/composite pipeline, with working code and an unattended retry budget.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →