gemini-3.1-pro-preview @ low · api
apilow
- config
- gemini-3.1-pro-preview-eff-low--api--official--dev
- batch
- 2026-07-19--unified
- transport
- google-gemini-developer-api-openai-compat
- protocol
- api · metered
- served model
- gemini-3.1-pro-preview
- captured
- Jul 18, 2026, 11:54 AM · N=4
variant
live
slot 0 · P-q · sandboxed iframe

The screenshot is the exact frozen pixels the similarity channels measured. Run live re-executes the raw output in a sandboxed iframe; its rendering depends on your browser and fonts and is not guaranteed to match the measured pixels.
similarity neighbors
nearest
claude-opus-4-6 @low · kiro0.66claude-opus-4-6 @max · kiro0.66claude-opus-4-6 @high · kiro0.61claude-opus-4-6 @medium · kiro0.61deepseek-v4-flash · opencode0.61farthest
hy3-free · api0.44gpt-5.4-mini @medium · api0.44claude-opus-4-8 @low · kiro0.44minimax-m2.7 · opencode0.45mimo-v2.5-pro · opencode0.45within session 2026-07-19--unified
similarity measures convergence within this session — not quality.
Fidelity — does the card show the right data?
- namematch
- conditionmatch
- datematch
- max tempmatchshown: 25
- min tempmatchshown: 16
- hourlymatchcoverage 24/24 · 24 match · 0 mismatch · 0 not shown
- request sidematch0 violation(s)
extractor fidelity-extractor-v1+Berlin-2026-07-15
Source — raw model output, one byte unchanged
download card.html<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Weather Card</title>
<style>
:root {
--bg-gradient: linear-gradient(135deg, #6dd5ed, #2193b0);
--card-bg: rgba(255, 255, 255, 0.2);
--card-border: rgba(255, 255, 255, 0.4);
--text-color: #ffffff;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
background: var(--bg-gradient);
color: var(--text-color);
width: 1280px;
height: 800px;
display: flex;
justify-content: center;
align-items: center;
overflow: hidden;
}
.card {
background: var(--card-bg);
border: 1px solid var(--card-border);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
border-radius: 24px;
padding: 40px;
width: 600px;
box-shadow: 0 16px 40px rgba(0,0,0,0.2);
display: flex;
flex-direction: column;
gap: 30px;
}
.header {
text-align: center;
}
.location {
font-size: 2.5rem;
font-weight: 700;
letter-spacing: 1px;
margin-bottom: 8px;
text-shadow: 0 2px 4px rgba(0,0,0,0.15);
}
.date {
font-size: 1.2rem;
font-weight: 400;
opacity: 0.9;
}
.current-weather {
display: flex;
justify-content: space-around;
align-items: center;
background: rgba(0, 0, 0, 0.1);
border-radius: 16px;
padding: 24px;
}
.condition {
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
}
.icon {
font-size: 4rem;
line-height: 1;
filter: drop-shadow(0 4px 6px rgba(0,0,0,0.2));
}
.condition-text {
font-size: 1.2rem;
font-weight: 500;
}
.temperatures {
display: flex;
flex-direction: column;
gap: 8px;
}
.temp-row {
display: flex;
align-items: baseline;
gap: 8px;
}
.temp-label {
font-size: 1.1rem;
opacity: 0.8;
width: 40px;
}
.temp-value {
font-size: 2.2rem;
font-weight: 600;
}
.hourly-container {
display: flex;
overflow-x: auto;
gap: 16px;
padding-bottom: 12px;
}
.hourly-container::-webkit-scrollbar {
height: 8px;
}
.hourly-container::-webkit-scrollbar-track {
background: rgba(255,255,255,0.1);
border-radius: 4px;
}
.hourly-container::-webkit-scrollbar-thumb {
background: rgba(255,255,255,0.4);
border-radius: 4px;
}
.hour-item {
display: flex;
flex-direction: column;
align-items: center;
background: rgba(255,255,255,0.15);
padding: 12px 16px;
border-radius: 12px;
min-width: 80px;
gap: 8px;
}
.hour-time {
font-size: 1rem;
opacity: 0.9;
}
.hour-temp {
font-size: 1.3rem;
font-weight: 600;
}
.error-message {
text-align: center;
font-size: 1.5rem;
font-weight: 600;
color: #ffcccc;
}
.hidden {
display: none !important;
}
</style>
</head>
<body>
<div class="card" id="weather-card">
<div class="header">
<div class="location" id="loc-name">Loading...</div>
<div class="date" id="loc-date"></div>
</div>
<div class="current-weather hidden" id="current-weather">
<div class="condition">
<div class="icon" id="weather-icon"></div>
<div class="condition-text" id="weather-text"></div>
</div>
<div class="temperatures">
<div class="temp-row">
<span class="temp-label">Max</span>
<span class="temp-value" id="temp-max"></span>
</div>
<div class="temp-row">
<span class="temp-label">Min</span>
<span class="temp-value" id="temp-min"></span>
</div>
</div>
</div>
<div class="hourly-container hidden" id="hourly-container"></div>
<div class="error-message hidden" id="error-message">Unable to load weather data.</div>
</div>
<script>
function getWMO(code) {
if (code === 0) return { text: "Clear sky", icon: "☀️" };
if ([1, 2, 3].includes(code)) return { text: "Partly cloudy", icon: "⛅" };
if ([45, 48].includes(code)) return { text: "Fog", icon: "🌫️" };
if ([51, 53, 55, 56, 57].includes(code)) return { text: "Drizzle", icon: "🌧️" };
if ([61, 63, 65, 66, 67].includes(code)) return { text: "Rain", icon: "🌧️" };
if ([71, 73, 75, 77].includes(code)) return { text: "Snow", icon: "❄️" };
if ([80, 81, 82].includes(code)) return { text: "Showers", icon: "🌦️" };
if ([85, 86].includes(code)) return { text: "Snow showers", icon: "🌨️" };
if ([95, 96, 99].includes(code)) return { text: "Thunderstorm", icon: "⛈️" };
return { text: "Unknown", icon: "❓" };
}
async function init() {
const params = new URLSearchParams(window.location.search);
const lat = params.get('lat') || '52.52';
const lon = params.get('lon') || '13.405';
const name = params.get('name') || 'Berlin';
const todayStr = new Date().toISOString().split('T')[0];
const date = params.get('date') || todayStr;
document.getElementById('loc-name').textContent = name;
document.getElementById('loc-date').textContent = date;
const isPast = date < todayStr;
const endpoint = isPast ? '/api/om/archive' : '/api/om/forecast';
const url = `${endpoint}?latitude=${lat}&longitude=${lon}&daily=temperature_2m_max,temperature_2m_min,weather_code&hourly=temperature_2m&timezone=UTC&temperature_unit=celsius&start_date=${date}&end_date=${date}`;
try {
const response = await fetch(url);
if (!response.ok) throw new Error('Network response was not ok');
const data = await response.json();
if (!data.daily || !data.hourly) throw new Error('Invalid data format');
const maxTemp = data.daily.temperature_2m_max[0];
const minTemp = data.daily.temperature_2m_min[0];
const code = data.daily.weather_code[0];
const wmo = getWMO(code);
document.getElementById('temp-max').innerHTML = `${Math.round(maxTemp)}°`;
document.getElementById('temp-min').innerHTML = `${Math.round(minTemp)}°`;
document.getElementById('weather-icon').textContent = wmo.icon;
document.getElementById('weather-text').textContent = wmo.text;
document.getElementById('current-weather').classList.remove('hidden');
const hourlyContainer = document.getElementById('hourly-container');
const hourlyTemps = data.hourly.temperature_2m;
const hourlyTimes = data.hourly.time;
for (let i = 0; i < hourlyTemps.length; i++) {
if (hourlyTemps[i] === null) continue;
const timeStr = hourlyTimes[i].split('T')[1].substring(0, 5); // "HH:MM"
const temp = Math.round(hourlyTemps[i]);
const item = document.createElement('div');
item.className = 'hour-item';
const timeEl = document.createElement('span');
timeEl.className = 'hour-time';
timeEl.textContent = timeStr;
const tempEl = document.createElement('span');
tempEl.className = 'hour-temp';
tempEl.innerHTML = `${temp}°`;
item.appendChild(timeEl);
item.appendChild(tempEl);
hourlyContainer.appendChild(item);
}
document.getElementById('hourly-container').classList.remove('hidden');
} catch (error) {
document.getElementById('current-weather').classList.add('hidden');
document.getElementById('hourly-container').classList.add('hidden');
document.getElementById('error-message').classList.remove('hidden');
}
}
init();
</script>
</body>
</html>L1 — cheap deterministic descriptors
| bytes total | 7,561 | html / css / js | 1,035 / 2,827 / 3,699 |
|---|---|---|---|
| dom nodes | 24 | dom depth | 7 |
| css rules | 24 | js present | yes |
| brightness | 155.2 | contrast | 18.3 |
| colorfulness | 55.0 | whitespace | 33.2% |
This slot's telemetry
| prompt tokens | 348 | completion tokens | 2,680 |
|---|---|---|---|
| total tokens | 3,028 | wall | 30.1 s |
| cost | — | request id | — |
config.json614 B
{
"N": 4,
"auth": {
"credential_ref": "WCB_GEMINI_KEY",
"method": "api-key"
},
"billing": "metered",
"config_id": "gemini-3.1-pro-preview-eff-low--api--official--dev",
"effort": "low",
"family": "gemini",
"m": {
"min": 4,
"q": 4
},
"model_id": "gemini-3.1-pro-preview",
"protocol": "api",
"served_model": "gemini-3.1-pro-preview",
"telemetry": {
"completion_tokens": 24342,
"cost_usd": null,
"prompt_tokens": 2748,
"total_tokens": 27090,
"wall_ms": 236764
},
"transport": "google-gemini-developer-api-openai-compat",
"vendor_sanction_ref": null
}send-log4.7 KB
{
"N": 4,
"batch_id": "2026-07-20--official-gemini",
"config_id": "gemini-3.1-pro-preview-eff-low--api--official--dev",
"positions": [
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-07-19T15:21:24.726208+00:00",
"http_status": 200,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-19T15:21:01.067358+00:00"
}
],
"block_index": 0,
"model_reaching_attempt_index": 0,
"slot_index": 0,
"terminal_state": "valid",
"variant": "P-min"
},
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-07-19T15:21:57.423758+00:00",
"http_status": 200,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-19T15:21:27.311639+00:00"
}
],
"block_index": 0,
"model_reaching_attempt_index": 0,
"slot_index": 0,
"terminal_state": "valid",
"variant": "P-q"
},
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-07-19T15:22:15.798363+00:00",
"http_status": 200,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-19T15:22:01.154679+00:00"
}
],
"block_index": 1,
"model_reaching_attempt_index": 0,
"slot_index": 1,
"terminal_state": "valid",
"variant": "P-min"
},
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-07-19T15:22:49.484718+00:00",
"http_status": 200,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-19T15:22:18.445096+00:00"
}
],
"block_index": 1,
"model_reaching_attempt_index": 0,
"slot_index": 1,
"terminal_state": "valid",
"variant": "P-q"
},
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-07-19T15:23:23.192103+00:00",
"http_status": 200,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-19T15:22:53.191832+00:00"
}
],
"block_index": 2,
"model_reaching_attempt_index": 0,
"slot_index": 2,
"terminal_state": "valid",
"variant": "P-q"
},
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-07-19T15:23:49.409620+00:00",
"http_status": 200,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-19T15:23:25.806816+00:00"
}
],
"block_index": 2,
"model_reaching_attempt_index": 0,
"slot_index": 2,
"terminal_state": "valid",
"variant": "P-min"
},
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-07-19T15:24:50.657407+00:00",
"http_status": 200,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-19T15:23:52.016001+00:00"
}
],
"block_index": 3,
"model_reaching_attempt_index": 0,
"slot_index": 3,
"terminal_state": "valid",
"variant": "P-q"
},
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-07-19T15:25:19.097932+00:00",
"http_status": 200,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-19T15:24:54.025170+00:00"
}
],
"block_index": 3,
"model_reaching_attempt_index": 0,
"slot_index": 3,
"terminal_state": "valid",
"variant": "P-min"
}
],
"retry_policy": {
"max_unreachable_retries": 5,
"rate_limit_backoff": {
"max_attempts": 4,
"max_total_ms": 60000
}
}
}