gpt-5.4 @ medium · api
apimedium
- config
- gpt-5.4-eff-medium--api--official--dev
- batch
- 2026-07-19--unified
- transport
- openai-official-api
- protocol
- api · metered
- served model
- gpt-5.4-2026-03-05
- 采集于
- 2026年7月18日 11:54 · N=4
variant
live
slot 0 · P-q · sandboxed iframe

截图是 similarity 通道测量时的原始像素。运行 live 会在 sandboxed iframe 中重新执行原始输出;渲染结果取决于你的浏览器和字体,不保证与测量像素一致。
similarity 邻居
最近
claude-opus-4-8 @medium · kiro0.67gpt-5.4 @high · api0.66gpt-5.4 @xhigh · api0.66gpt-5.6-sol @low · kiro0.66gpt-5.6-terra @high · codex-oauth0.66最远
gpt-5.6-luna @high · kiro0.41gpt-5.6-luna @medium · codex-oauth0.42gpt-5.6-luna @low · codex-oauth0.42gpt-5.6-sol @ultra · codex-oauth0.44gpt-5.5 @low · codex-oauth0.44限于 session 2026-07-19--unified
similarity 衡量本 session 内的趋同程度 —— 不是质量。
Fidelity —— 卡片展示的数据对不对?
- namematch
- conditionmatch
- datematch
- max tempmatch展示值:25.3
- min tempmatch展示值:16
- hourlymatchcoverage 24/24 · 24 命中 · 0 不符 · 0 未展示
- request sidematch0 处违规
extractor fidelity-extractor-v1+Berlin-2026-07-15
源码 —— 原始模型输出,一字节未改
下载 card.html<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Weather Card</title>
<style>
:root {
color-scheme: dark;
--bg1: #0b1323;
--bg2: #27456d;
--glow1: rgba(255, 194, 92, 0.30);
--glow2: rgba(91, 190, 255, 0.24);
--accent: rgba(255, 255, 255, 0.10);
--text: #ffffff;
--muted: rgba(255, 255, 255, 0.78);
--soft: rgba(255, 255, 255, 0.62);
--border: rgba(255, 255, 255, 0.16);
--panel: rgba(255, 255, 255, 0.08);
--panel-strong: rgba(255, 255, 255, 0.12);
--shadow: rgba(0, 0, 0, 0.34);
}
* { box-sizing: border-box; }
html, body {
width: 100%;
height: 100%;
margin: 0;
overflow: hidden;
}
body {
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
color: var(--text);
background:
radial-gradient(40rem 40rem at 14% 18%, var(--glow1), transparent 55%),
radial-gradient(34rem 34rem at 86% 20%, var(--glow2), transparent 52%),
linear-gradient(135deg, var(--bg1), var(--bg2));
display: flex;
align-items: center;
justify-content: center;
padding: 32px;
transition: background 700ms ease, color 300ms ease;
position: relative;
letter-spacing: -0.02em;
}
body::before {
content: "";
position: absolute;
inset: 0;
pointer-events: none;
background:
linear-gradient(rgba(255,255,255,0.04), rgba(255,255,255,0.01)),
repeating-linear-gradient(
90deg,
transparent 0,
transparent 78px,
rgba(255,255,255,0.015) 79px,
transparent 80px
);
opacity: 0.45;
}
body.theme-clear {
--bg1: #07152c;
--bg2: #2f84dd;
--glow1: rgba(255, 198, 95, 0.42);
--glow2: rgba(108, 226, 255, 0.28);
--accent: rgba(255, 214, 126, 0.14);
}
body.theme-clouds {
--bg1: #101826;
--bg2: #4d6886;
--glow1: rgba(190, 215, 242, 0.18);
--glow2: rgba(150, 176, 213, 0.18);
--accent: rgba(205, 219, 239, 0.10);
}
body.theme-fog {
--bg1: #1a202a;
--bg2: #7a8797;
--glow1: rgba(235, 241, 246, 0.14);
--glow2: rgba(190, 201, 215, 0.16);
--accent: rgba(225, 233, 240, 0.08);
}
body.theme-rain {
--bg1: #08121d;
--bg2: #305b83;
--glow1: rgba(95, 171, 255, 0.18);
--glow2: rgba(104, 213, 255, 0.16);
--accent: rgba(125, 192, 255, 0.10);
}
body.theme-snow {
--bg1: #11304d;
--bg2: #8bb9de;
--glow1: rgba(248, 251, 255, 0.18);
--glow2: rgba(175, 228, 255, 0.20);
--accent: rgba(234, 245, 255, 0.12);
}
body.theme-storm {
--bg1: #0d1020;
--bg2: #43426b;
--glow1: rgba(160, 122, 255, 0.20);
--glow2: rgba(99, 147, 255, 0.20);
--accent: rgba(171, 157, 255, 0.10);
}
.ambient {
position: absolute;
border-radius: 999px;
filter: blur(24px);
opacity: 0.55;
pointer-events: none;
mix-blend-mode: screen;
animation: float 11s ease-in-out infinite;
}
.ambient.a {
width: 260px;
height: 260px;
left: 60px;
bottom: 40px;
background: rgba(255,255,255,0.06);
animation-delay: -2s;
}
.ambient.b {
width: 200px;
height: 200px;
right: 90px;
bottom: 90px;
background: var(--accent);
animation-delay: -5s;
}
.ambient.c {
width: 180px;
height: 180px;
right: 280px;
top: 80px;
background: rgba(255,255,255,0.05);
animation-delay: -8s;
}
@keyframes float {
0%, 100% { transform: translateY(0) translateX(0); }
50% { transform: translateY(-14px) translateX(8px); }
}
.card {
position: relative;
width: min(1120px, calc(100vw - 64px));
min-height: 680px;
border-radius: 34px;
padding: 34px 34px 28px;
background:
linear-gradient(180deg, rgba(255,255,255,0.18), rgba(255,255,255,0.08)),
radial-gradient(24rem 24rem at 100% 0%, var(--accent), transparent 55%);
border: 1px solid rgba(255,255,255,0.18);
box-shadow:
0 28px 80px var(--shadow),
inset 0 1px 0 rgba(255,255,255,0.18);
backdrop-filter: blur(28px) saturate(150%);
-webkit-backdrop-filter: blur(28px) saturate(150%);
overflow: hidden;
}
.card::before {
content: "";
position: absolute;
inset: 0;
pointer-events: none;
background:
linear-gradient(145deg, rgba(255,255,255,0.10), transparent 30%, transparent 70%, rgba(255,255,255,0.03));
opacity: 0.9;
}
.card-inner {
position: relative;
z-index: 1;
height: 100%;
}
.status-state {
height: 618px;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
flex-direction: column;
gap: 14px;
padding: 20px;
}
.status-icon {
width: 104px;
height: 104px;
display: grid;
place-items: center;
border-radius: 28px;
font-size: 54px;
background: rgba(255,255,255,0.12);
border: 1px solid rgba(255,255,255,0.16);
box-shadow: inset 0 1px 0 rgba(255,255,255,0.18);
}
.pulse {
animation: pulse 1.8s ease-in-out infinite;
}
@keyframes pulse {
0%, 100% { transform: scale(1); opacity: 0.92; }
50% { transform: scale(1.04); opacity: 1; }
}
.status-title {
font-size: 38px;
font-weight: 760;
line-height: 1.05;
margin-top: 8px;
}
.status-text {
max-width: 620px;
font-size: 18px;
color: var(--muted);
line-height: 1.5;
}
.top {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 28px;
margin-bottom: 24px;
}
.eyebrow {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 8px 12px;
border-radius: 999px;
background: rgba(255,255,255,0.11);
border: 1px solid rgba(255,255,255,0.16);
color: rgba(255,255,255,0.86);
font-size: 13px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.12em;
}
.eyebrow .dot {
width: 7px;
height: 7px;
border-radius: 999px;
background: currentColor;
opacity: 0.9;
}
h1 {
margin: 14px 0 10px;
font-size: 58px;
line-height: 0.98;
font-weight: 800;
max-width: 650px;
text-wrap: balance;
}
.date-line {
font-size: 24px;
color: rgba(255,255,255,0.90);
margin-bottom: 10px;
}
.meta-line {
display: flex;
flex-wrap: wrap;
gap: 10px;
color: var(--soft);
font-size: 14px;
}
.meta-chip {
padding: 8px 12px;
border-radius: 999px;
background: rgba(255,255,255,0.08);
border: 1px solid rgba(255,255,255,0.10);
}
.hero {
display: flex;
flex-direction: column;
align-items: flex-end;
gap: 14px;
flex-shrink: 0;
}
.icon-badge {
width: 152px;
height: 152px;
border-radius: 30px;
display: grid;
place-items: center;
font-size: 78px;
background:
radial-gradient(circle at 28% 22%, rgba(255,255,255,0.34), rgba(255,255,255,0.12) 42%, rgba(255,255,255,0.08) 100%);
border: 1px solid rgba(255,255,255,0.22);
box-shadow:
inset 0 1px 0 rgba(255,255,255,0.20),
0 18px 36px rgba(0,0,0,0.16);
}
.condition {
text-align: right;
}
.condition-name {
font-size: 30px;
font-weight: 760;
line-height: 1.1;
margin-bottom: 4px;
}
.condition-sub {
font-size: 16px;
color: var(--muted);
}
.temp-band {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 18px;
margin-bottom: 28px;
}
.metric {
padding: 22px 24px;
border-radius: 24px;
background:
linear-gradient(180deg, rgba(6,12,24,0.18), rgba(255,255,255,0.06));
border: 1px solid rgba(255,255,255,0.12);
box-shadow: inset 0 1px 0 rgba(255,255,255,0.08);
min-height: 132px;
}
.metric-label {
font-size: 14px;
font-weight: 700;
color: var(--soft);
text-transform: uppercase;
letter-spacing: 0.12em;
margin-bottom: 12px;
}
.metric-value {
font-size: 50px;
line-height: 1;
font-weight: 800;
letter-spacing: -0.04em;
}
.metric-note {
margin-top: 8px;
font-size: 15px;
color: var(--muted);
}
.section-head {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 16px;
margin-bottom: 14px;
}
.section-title {
font-size: 21px;
font-weight: 760;
letter-spacing: -0.02em;
}
.section-note {
color: var(--soft);
font-size: 14px;
}
.hourly-wrap {
border-radius: 28px;
padding: 18px 16px 16px;
background:
linear-gradient(180deg, rgba(5,10,20,0.16), rgba(255,255,255,0.05));
border: 1px solid rgba(255,255,255,0.12);
box-shadow: inset 0 1px 0 rgba(255,255,255,0.08);
}
.hourly {
display: grid;
gap: 10px;
align-items: end;
height: 290px;
}
.hour {
min-width: 0;
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
}
.hour-temp {
font-size: 15px;
line-height: 1;
font-weight: 760;
color: rgba(255,255,255,0.96);
}
.bar-track {
width: 100%;
flex: 1;
min-height: 178px;
padding: 6px;
border-radius: 18px;
border: 1px solid rgba(255,255,255,0.10);
background:
linear-gradient(180deg, rgba(255,255,255,0.09), rgba(255,255,255,0.03));
display: flex;
align-items: flex-end;
box-shadow: inset 0 1px 0 rgba(255,255,255,0.05);
position: relative;
overflow: hidden;
}
.bar-track::before {
content: "";
position: absolute;
inset: 0;
background:
linear-gradient(to top, rgba(255,255,255,0.04), transparent 28%),
repeating-linear-gradient(
to top,
transparent 0,
transparent 22%,
rgba(255,255,255,0.04) 22.7%,
transparent 23.4%
);
opacity: 0.55;
pointer-events: none;
}
.bar {
width: 100%;
border-radius: 12px;
background: linear-gradient(180deg, var(--c1), var(--c2));
box-shadow:
0 10px 18px rgba(0,0,0,0.18),
inset 0 1px 0 rgba(255,255,255,0.25);
position: relative;
}
.bar::after {
content: "";
position: absolute;
left: 20%;
right: 20%;
top: 10%;
height: 20%;
border-radius: 999px;
background: rgba(255,255,255,0.22);
filter: blur(2px);
opacity: 0.7;
}
.hour-label {
font-size: 12px;
color: var(--soft);
font-weight: 700;
letter-spacing: 0.04em;
}
@media (max-width: 1100px) {
.top { flex-direction: column; }
.hero { align-items: flex-start; }
.condition { text-align: left; }
}
</style>
</head>
<body class="theme-clear">
<div class="ambient a"></div>
<div class="ambient b"></div>
<div class="ambient c"></div>
<main class="card" id="card" aria-live="polite">
<div class="card-inner">
<div class="status-state">
<div class="status-icon pulse">⏳</div>
<div class="status-title">Loading weather</div>
<div class="status-text" id="loadingText">Preparing forecast…</div>
</div>
</div>
</main>
<script>
(function () {
const card = document.getElementById('card');
const loadingText = document.getElementById('loadingText');
const todayUTC = new Date().toISOString().slice(0, 10);
const params = new URLSearchParams(location.search);
const lat = parseFinite(params.get('lat'), 52.52);
const lon = parseFinite(params.get('lon'), 13.405);
const name = cleanName(params.get('name')) || 'Berlin';
const date = normalizeDate(params.get('date'), todayUTC);
if (loadingText) {
loadingText.textContent = `Fetching weather for ${name} on ${formatDateUTC(date)}.`;
}
document.title = `${name} Weather — ${date}`;
const endpoint = date < todayUTC ? '/api/om/archive' : '/api/om/forecast';
const query = new URLSearchParams({
latitude: String(lat),
longitude: String(lon),
daily: 'temperature_2m_max,temperature_2m_min,weather_code',
hourly: 'temperature_2m',
timezone: 'UTC',
temperature_unit: 'celsius',
start_date: date,
end_date: date
});
fetch(`${endpoint}?${query.toString()}`, { headers: { 'Accept': 'application/json' } })
.then(async (response) => {
let data;
try {
data = await response.json();
} catch (_) {
throw new Error(`Bad response (${response.status})`);
}
if (!response.ok) {
throw new Error(data && data.reason ? String(data.reason) : `HTTP ${response.status}`);
}
return data;
})
.then((data) => {
const daily = data && data.daily;
const hourly = data && data.hourly;
if (!daily || !hourly) {
throw new Error('Missing weather data');
}
const max = firstFinite(daily.temperature_2m_max);
const min = firstFinite(daily.temperature_2m_min);
const code = firstFinite(daily.weather_code, null);
const times = Array.isArray(hourly.time) ? hourly.time : [];
const temps = Array.isArray(hourly.temperature_2m) ? hourly.temperature_2m : [];
const hours = [];
for (let i = 0; i < Math.min(times.length, temps.length); i++) {
const t = String(times[i] || '');
const temp = Number(temps[i]);
if (t.slice(0, 10) === date && Number.isFinite(temp)) {
hours.push({ time: t, temp });
}
}
if (!Number.isFinite(max) || !Number.isFinite(min) || !hours.length) {
throw new Error('Incomplete weather data');
}
renderWeather({
lat,
lon,
name,
date,
max,
min,
code,
hours
});
})
.catch((error) => {
renderError(name, date, error && error.message ? String(error.message) : '');
});
function renderWeather(state) {
const info = conditionInfo(state.code);
document.body.className = `theme-${info.theme}`;
document.title = `${state.name} Weather — ${state.date}`;
const hourMin = Math.min.apply(null, state.hours.map(h => h.temp));
const hourMax = Math.max.apply(null, state.hours.map(h => h.temp));
const hourRange = Math.max(0.01, hourMax - hourMin);
const dailyRange = state.max - state.min;
const hoursHtml = state.hours.map((h) => {
const norm = (h.temp - hourMin) / hourRange;
const height = 18 + norm * 82;
const hue = 212 - norm * 180;
const c1 = `hsla(${clamp(hue + 14, 8, 240)}, 96%, 88%, 0.98)`;
const c2 = `hsla(${clamp(hue - 10, 8, 240)}, 92%, ${58 - norm * 6}%, 0.96)`;
const label = h.time.slice(11, 13);
return `
<div class="hour">
<div class="hour-temp">${escapeHtml(fmtTemp(h.temp, 0))}°</div>
<div class="bar-track">
<div class="bar" style="height:${height.toFixed(2)}%;--c1:${c1};--c2:${c2};"></div>
</div>
<div class="hour-label">${escapeHtml(label)}:00</div>
</div>
`;
}).join('');
card.innerHTML = `
<div class="card-inner">
<div class="top">
<div class="meta">
<div class="eyebrow"><span class="dot"></span> Weather card · UTC</div>
<h1>${escapeHtml(state.name)}</h1>
<div class="date-line">${escapeHtml(formatDateUTC(state.date))}</div>
<div class="meta-line">
<div class="meta-chip">Lat ${escapeHtml(trimZeros(state.lat, 3))}</div>
<div class="meta-chip">Lon ${escapeHtml(trimZeros(state.lon, 3))}</div>
<div class="meta-chip">${escapeHtml(info.label)}</div>
</div>
</div>
<div class="hero">
<div class="icon-badge" aria-hidden="true">${info.icon}</div>
<div class="condition">
<div class="condition-name">${escapeHtml(info.label)}</div>
<div class="condition-sub">${escapeHtml(info.sub)}</div>
</div>
</div>
</div>
<div class="temp-band">
<div class="metric">
<div class="metric-label">Maximum</div>
<div class="metric-value">${escapeHtml(fmtTemp(state.max, 1))}°C</div>
<div class="metric-note">Warmest point of the day</div>
</div>
<div class="metric">
<div class="metric-label">Minimum</div>
<div class="metric-value">${escapeHtml(fmtTemp(state.min, 1))}°C</div>
<div class="metric-note">Coolest point of the day</div>
</div>
<div class="metric">
<div class="metric-label">Daily range</div>
<div class="metric-value">${escapeHtml(fmtTemp(dailyRange, 1))}°C</div>
<div class="metric-note">Difference between high and low</div>
</div>
</div>
<div class="section-head">
<div class="section-title">Hourly temperatures</div>
<div class="section-note">${state.hours.length} hourly readings · Celsius</div>
</div>
<div class="hourly-wrap">
<div class="hourly" style="grid-template-columns: repeat(${Math.max(1, state.hours.length)}, minmax(0, 1fr));">
${hoursHtml}
</div>
</div>
</div>
`;
}
function renderError(name, date, detail) {
document.body.className = 'theme-clouds';
document.title = `${name} Weather — unavailable`;
card.innerHTML = `
<div class="card-inner">
<div class="status-state">
<div class="status-icon">⚠️</div>
<div class="status-title">Weather data could not be loaded</div>
<div class="status-text">
Unable to load weather for <strong>${escapeHtml(name)}</strong> on <strong>${escapeHtml(formatDateUTC(date))}</strong>.
${detail ? `<br><span style="opacity:.8">${escapeHtml(detail)}</span>` : ''}
</div>
</div>
</div>
`;
}
function conditionInfo(code) {
const c = Number(code);
if (c === 0) return { label: 'Clear sky', sub: 'Bright and open conditions', icon: '☀️', theme: 'clear' };
if (c === 1) return { label: 'Mainly clear', sub: 'Mostly sunny with light cloud', icon: '🌤️', theme: 'clear' };
if (c === 2) return { label: 'Partly cloudy', sub: 'A mix of sun and cloud', icon: '⛅', theme: 'clouds' };
if (c === 3) return { label: 'Overcast', sub: 'Cloud cover across the sky', icon: '☁️', theme: 'clouds' };
if ([45, 48].includes(c)) return { label: 'Fog', sub: 'Reduced visibility and mist', icon: '🌫️', theme: 'fog' };
if ([51, 53, 55, 56, 57].includes(c)) return { label: 'Drizzle', sub: 'Light persistent precipitation', icon: '🌦️', theme: 'rain' };
if ([61, 63, 65, 66, 67, 80, 81, 82].includes(c)) return { label: 'Rain', sub: 'Wet conditions through the day', icon: '🌧️', theme: 'rain' };
if ([71, 73, 75, 77, 85, 86].includes(c)) return { label: 'Snow', sub: 'Cold wintry precipitation', icon: '❄️', theme: 'snow' };
if ([95, 96, 99].includes(c)) return { label: 'Thunderstorm', sub: 'Unstable and stormy weather', icon: '⛈️', theme: 'storm' };
return { label: 'Weather', sub: 'Conditions unavailable', icon: '🌡️', theme: 'clouds' };
}
function normalizeDate(value, fallback) {
const v = String(value || '').trim();
if (!/^\d{4}-\d{2}-\d{2}$/.test(v)) return fallback;
const d = new Date(v + 'T00:00:00Z');
if (!Number.isFinite(d.getTime())) return fallback;
return d.toISOString().slice(0, 10) === v ? v : fallback;
}
function parseFinite(value, fallback) {
const n = Number(value);
return Number.isFinite(n) ? n : fallback;
}
function firstFinite(arr, fallback) {
if (!Array.isArray(arr) || !arr.length) return fallback;
const n = Number(arr[0]);
return Number.isFinite(n) ? n : fallback;
}
function fmtTemp(value, decimals) {
const n = Number(value);
if (!Number.isFinite(n)) return '–';
const fixed = n.toFixed(decimals);
return fixed.replace(/\.0+$/, '').replace(/(\.\d*[1-9])0+$/, '$1');
}
function cleanName(value) {
return String(value || '').trim();
}
function formatDateUTC(dateStr) {
const d = new Date(dateStr + 'T00:00:00Z');
return new Intl.DateTimeFormat('en-US', {
weekday: 'long',
year: 'numeric',
month: 'long',
day: 'numeric',
timeZone: 'UTC'
}).format(d);
}
function trimZeros(num, digits) {
return Number(num).toFixed(digits).replace(/\.?0+$/, '');
}
function clamp(v, min, max) {
return Math.max(min, Math.min(max, v));
}
function escapeHtml(value) {
return String(value).replace(/[&<>"']/g, function (ch) {
return ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' })[ch];
});
}
})();
</script>
</body>
</html>L1 —— 廉价的确定性描述量
| bytes 总计 | 22,525 | html / css / js | 688 / 11,315 / 10,522 |
|---|---|---|---|
| dom 节点 | 17 | dom 深度 | 6 |
| css 规则 | 62 | 含 js | 是 |
| brightness | 85.0 | contrast | 25.8 |
| colorfulness | 31.4 | 留白 | 53.8% |
该 slot 的 telemetry
| prompt tokens | 312 | completion tokens | 17,990 |
|---|---|---|---|
| total tokens | 18,302 | wall | 94.1 s |
| cost | — | request id | — |
config.json572 B
{
"N": 4,
"auth": {
"credential_ref": "WCB_OPENAI_OFFICIAL_KEY",
"method": "api-key"
},
"billing": "metered",
"config_id": "gpt-5.4-eff-medium--api--official--dev",
"effort": "medium",
"family": "gpt",
"m": {
"min": 4,
"q": 4
},
"model_id": "gpt-5.4",
"protocol": "api",
"served_model": "gpt-5.4-2026-03-05",
"telemetry": {
"completion_tokens": 102197,
"cost_usd": null,
"prompt_tokens": 2464,
"total_tokens": 104661,
"wall_ms": 607852
},
"transport": "openai-official-api",
"vendor_sanction_ref": null
}send-log4.6 KB
{
"N": 4,
"batch_id": "2026-07-18--official-gpt",
"config_id": "gpt-5.4-eff-medium--api--official--dev",
"positions": [
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-07-17T17:04:03.213854+00:00",
"http_status": 200,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-17T17:03:20.356141+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-17T17:05:40.535199+00:00",
"http_status": 200,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-17T17:04:06.412012+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-17T17:07:59.867451+00:00",
"http_status": 200,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-17T17:05:44.923882+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-17T17:08:56.767140+00:00",
"http_status": 200,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-17T17:08:03.969640+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-17T17:09:41.889266+00:00",
"http_status": 200,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-17T17:08:59.948009+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-17T17:11:19.260193+00:00",
"http_status": 200,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-17T17:09:45.313202+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-17T17:12:58.379872+00:00",
"http_status": 200,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-17T17:11:24.030337+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-17T17:13:55.555946+00:00",
"http_status": 200,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-17T17:13:02.651619+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
}
}
}