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
captured
Jul 18, 2026, 11:54 AM · N=4
variant
live
slot 0 · P-q · sandboxed iframe
gpt-5.4 @medium · api P-q slot 0 screenshot

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

within 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.3
  • 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" />
  <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 ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' })[ch];
        });
      }
    })();
  </script>
</body>
</html>

L1 — cheap deterministic descriptors

bytes total22,525html / css / js688 / 11,315 / 10,522
dom nodes17dom depth6
css rules62js presentyes
brightness85.0contrast25.8
colorfulness31.4whitespace53.8%

This slot's telemetry

prompt tokens312completion tokens17,990
total tokens18,302wall94.1 s
costrequest 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
    }
  }
}