gpt-5.4-mini @ none · api

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

截图是 similarity 通道测量时的原始像素。运行 live 会在 sandboxed iframe 中重新执行原始输出;渲染结果取决于你的浏览器和字体,不保证与测量像素一致。

similarity 邻居

限于 session 2026-07-19--unified

similarity 衡量本 session 内的趋同程度 —— 不是质量。

Fidelity —— 卡片展示的数据对不对?

  • namematch
  • conditionmatch
  • datematch
  • max tempambiguousinsufficient-distinct-temperature-nodes
  • min tempambiguousinsufficient-distinct-temperature-nodes
  • hourlyambiguouscoverage · 0 命中 · 0 不符 · 24 未展示
  • 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{
      --bg1:#0f172a;
      --bg2:#111827;
      --card:#0b1220cc;
      --card-border:#ffffff1a;
      --text:#e5eefc;
      --muted:#9fb0cc;
      --accent:#7dd3fc;
      --accent2:#a78bfa;
      --good:#34d399;
      --warn:#fbbf24;
      --shadow: 0 24px 60px rgba(0,0,0,.38);
    }
    *{box-sizing:border-box}
    html,body{width:100%;height:100%;margin:0}
    body{
      font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
      color:var(--text);
      overflow:hidden;
      background:
        radial-gradient(1200px 800px at 20% 20%, rgba(125,211,252,.18), transparent 45%),
        radial-gradient(900px 700px at 80% 30%, rgba(167,139,250,.18), transparent 42%),
        radial-gradient(700px 500px at 50% 90%, rgba(52,211,153,.10), transparent 40%),
        linear-gradient(160deg, var(--bg1), var(--bg2));
    }
    .wrap{
      width:100%;
      height:100%;
      display:flex;
      align-items:center;
      justify-content:center;
      padding:48px;
    }
    .card{
      width:min(1120px, 100%);
      min-height:540px;
      border:1px solid var(--card-border);
      background:linear-gradient(180deg, rgba(17,24,39,.72), rgba(11,18,32,.86));
      backdrop-filter: blur(18px);
      border-radius:32px;
      box-shadow:var(--shadow);
      position:relative;
      overflow:hidden;
      display:grid;
      grid-template-columns: 1.05fr .95fr;
    }
    .card::before{
      content:"";
      position:absolute;
      inset:-2px;
      background:
        radial-gradient(800px 400px at 15% 15%, rgba(125,211,252,.10), transparent 50%),
        radial-gradient(700px 380px at 85% 20%, rgba(167,139,250,.10), transparent 48%);
      pointer-events:none;
    }
    .left,.right{position:relative; z-index:1; padding:42px}
    .left{
      display:flex;
      flex-direction:column;
      justify-content:space-between;
      border-right:1px solid rgba(255,255,255,.08);
    }
    .eyebrow{
      display:inline-flex;
      align-items:center;
      gap:10px;
      color:var(--muted);
      font-size:14px;
      letter-spacing:.14em;
      text-transform:uppercase;
      margin-bottom:14px;
    }
    .dot{
      width:10px;height:10px;border-radius:50%;
      background:linear-gradient(135deg, var(--accent), var(--accent2));
      box-shadow:0 0 18px rgba(125,211,252,.65);
    }
    .location{
      font-size:56px;
      line-height:1;
      font-weight:800;
      letter-spacing:-.04em;
      margin:0 0 14px;
      text-wrap:balance;
    }
    .date{
      font-size:22px;
      color:var(--muted);
      margin:0 0 28px;
    }
    .hero{
      display:flex;
      align-items:end;
      gap:28px;
      margin:18px 0 0;
    }
    .tempBlock{
      display:flex;
      flex-direction:column;
      gap:10px;
    }
    .temps{
      display:flex;
      align-items:baseline;
      gap:18px;
      flex-wrap:wrap;
    }
    .max{
      font-size:94px;
      line-height:.9;
      font-weight:900;
      letter-spacing:-.06em;
    }
    .min{
      font-size:34px;
      color:#c7d2e6;
      opacity:.92;
      font-weight:700;
    }
    .meta{
      margin-top:22px;
      color:var(--muted);
      font-size:18px;
      line-height:1.5;
      max-width:520px;
    }
    .condition{
      margin-top:14px;
      display:inline-flex;
      align-items:center;
      gap:14px;
      font-size:24px;
      font-weight:700;
      color:var(--text);
    }
    .icon{
      width:56px;
      height:56px;
      border-radius:18px;
      display:grid;
      place-items:center;
      background:linear-gradient(135deg, rgba(125,211,252,.18), rgba(167,139,250,.14));
      border:1px solid rgba(255,255,255,.12);
      box-shadow:inset 0 1px 0 rgba(255,255,255,.1);
      font-size:30px;
    }
    .right{
      display:flex;
      flex-direction:column;
      gap:22px;
    }
    .panel{
      border:1px solid rgba(255,255,255,.08);
      background:rgba(255,255,255,.03);
      border-radius:24px;
      padding:22px;
    }
    .panel h2{
      margin:0 0 18px;
      font-size:16px;
      letter-spacing:.12em;
      text-transform:uppercase;
      color:var(--muted);
      font-weight:700;
    }
    .hourly{
      display:grid;
      grid-template-columns: repeat(4, minmax(0, 1fr));
      gap:12px;
    }
    .hour{
      padding:16px 14px;
      border-radius:18px;
      background:linear-gradient(180deg, rgba(255,255,255,.05), rgba(255,255,255,.02));
      border:1px solid rgba(255,255,255,.06);
      min-height:96px;
      display:flex;
      flex-direction:column;
      justify-content:space-between;
    }
    .time{font-size:14px;color:var(--muted)}
    .h-temp{font-size:28px;font-weight:800;letter-spacing:-.04em}
    .subtle{
      color:var(--muted);
      font-size:15px;
      line-height:1.55;
    }
    .status{
      position:absolute;
      inset:auto 42px 34px auto;
      color:#cbd5e1;
      font-size:14px;
      opacity:.85;
      z-index:2;
    }
    .error{
      width:min(900px,100%);
      padding:34px 36px;
      border-radius:28px;
      border:1px solid rgba(255,255,255,.10);
      background:rgba(11,18,32,.82);
      box-shadow:var(--shadow);
      text-align:center;
    }
    .error h1{margin:0 0 10px;font-size:36px}
    .error p{margin:0;color:var(--muted);font-size:18px}
    @media (max-width: 1100px){
      .card{grid-template-columns:1fr}
      .left{border-right:none;border-bottom:1px solid rgba(255,255,255,.08)}
      .location{font-size:46px}
      .max{font-size:76px}
      .hourly{grid-template-columns: repeat(2, minmax(0, 1fr))}
    }
  </style>
</head>
<body>
  <div class="wrap">
    <div id="app"></div>
  </div>

  <script>
    (function(){
      const params = new URLSearchParams(location.search);
      const lat = parseFloat(params.get('lat') || '52.52');
      const lon = parseFloat(params.get('lon') || '13.405');
      const name = params.get('name') || 'Berlin';
      const date = params.get('date') || new Date().toISOString().slice(0,10);

      const app = document.getElementById('app');

      function safe(v){ return String(v == null ? '' : v); }

      function conditionFromCode(code){
        const map = {
          0: ['Clear sky','☀️'],
          1: ['Mainly clear','🌤️'],
          2: ['Partly cloudy','⛅'],
          3: ['Overcast','☁️'],
          45: ['Fog','🌫️'],
          48: ['Depositing rime fog','🌫️'],
          51: ['Light drizzle','🌦️'],
          53: ['Drizzle','🌦️'],
          55: ['Dense drizzle','🌧️'],
          56: ['Freezing drizzle','🌧️'],
          57: ['Dense freezing drizzle','🌧️'],
          61: ['Slight rain','🌦️'],
          63: ['Rain','🌧️'],
          65: ['Heavy rain','🌧️'],
          66: ['Freezing rain','🌧️'],
          67: ['Heavy freezing rain','🌧️'],
          71: ['Slight snow fall','🌨️'],
          73: ['Snow fall','🌨️'],
          75: ['Heavy snow fall','🌨️'],
          77: ['Snow grains','🌨️'],
          80: ['Slight rain showers','🌦️'],
          81: ['Rain showers','🌧️'],
          82: ['Violent rain showers','⛈️'],
          85: ['Slight snow showers','🌨️'],
          86: ['Heavy snow showers','🌨️'],
          95: ['Thunderstorm','⛈️'],
          96: ['Thunderstorm with slight hail','⛈️'],
          99: ['Thunderstorm with heavy hail','⛈️']
        };
        return map[code] || ['Unknown', '❔'];
      }

      function fmtHour(iso){
        const d = new Date(iso);
        return d.toLocaleTimeString('en-GB', { hour:'2-digit', minute:'2-digit', hour12:false, timeZone:'UTC' }) + ' UTC';
      }

      function fmtDate(d){
        return new Date(d + 'T00:00:00Z').toLocaleDateString('en-GB', {
          weekday:'long', year:'numeric', month:'long', day:'numeric', timeZone:'UTC'
        });
      }

      function renderError(){
        app.innerHTML = '<div class="error"><h1>Weather data could not be loaded</h1><p>Please check the location parameters and try again.</p></div>';
      }

      async function load(){
        const endpoint = new Date(date + 'T00:00:00Z') < new Date(Date.UTC(new Date().getUTCFullYear(), new Date().getUTCMonth(), new Date().getUTCDate()))
          ? '/api/om/archive'
          : '/api/om/forecast';

        const url = new URL(endpoint, location.origin);
        url.searchParams.set('latitude', lat);
        url.searchParams.set('longitude', lon);
        url.searchParams.set('daily', 'temperature_2m_max,temperature_2m_min,weather_code');
        url.searchParams.set('hourly', 'temperature_2m');
        url.searchParams.set('timezone', 'UTC');
        url.searchParams.set('temperature_unit', 'celsius');
        url.searchParams.set('start_date', date);
        url.searchParams.set('end_date', date);

        try{
          const res = await fetch(url.toString(), { credentials:'same-origin' });
          if(!res.ok) throw new Error('HTTP ' + res.status);
          const data = await res.json();

          const d = data.daily || {};
          const h = data.hourly || {};
          const max = Array.isArray(d.temperature_2m_max) ? d.temperature_2m_max[0] : null;
          const min = Array.isArray(d.temperature_2m_min) ? d.temperature_2m_min[0] : null;
          const code = Array.isArray(d.weather_code) ? d.weather_code[0] : null;
          const [condText, condIcon] = conditionFromCode(code);

          const times = Array.isArray(h.time) ? h.time : [];
          const temps = Array.isArray(h.temperature_2m) ? h.temperature_2m : [];
          const hourlyHtml = times.slice(0, 24).map((t, i) => `
            <div class="hour">
              <div class="time">${safe(fmtHour(t))}</div>
              <div class="h-temp">${typeof temps[i] === 'number' ? Math.round(temps[i]) : '—'}°C</div>
            </div>
          `).join('');

          app.innerHTML = `
            <section class="card">
              <div class="left">
                <div>
                  <div class="eyebrow"><span class="dot"></span>Weather overview</div>
                  <h1 class="location">${safe(name)}</h1>
                  <div class="date">${safe(fmtDate(date))}</div>
                  <div class="hero">
                    <div class="icon" aria-hidden="true">${condIcon}</div>
                    <div class="tempBlock">
                      <div class="temps">
                        <div class="max">${max == null ? '—' : Math.round(max)}°C</div>
                        <div class="min">${min == null ? '—' : Math.round(min)}°C</div>
                      </div>
                      <div class="condition">${safe(condText)}</div>
                    </div>
                  </div>
                  <div class="meta">
                    A clean daily summary with hourly temperatures for the selected date, using UTC for consistent comparison.
                  </div>
                </div>
                <div class="subtle">Latitude ${lat.toFixed(3)} · Longitude ${lon.toFixed(3)}</div>
              </div>
              <div class="right">
                <div class="panel">
                  <h2>Hourly temperatures</h2>
                  <div class="hourly">${hourlyHtml || '<div class="subtle">No hourly data available.</div>'}</div>
                </div>
                <div class="panel">
                  <h2>Daily range</h2>
                  <div class="subtle">
                    Maximum: <strong style="color:var(--text)">${max == null ? '—' : Math.round(max) + '°C'}</strong><br>
                    Minimum: <strong style="color:var(--text)">${min == null ? '—' : Math.round(min) + '°C'}</strong><br>
                    Condition: <strong style="color:var(--text)">${safe(condText)}</strong>
                  </div>
                </div>
              </div>
              <div class="status">Data source: Open-Meteo compatible same-origin API</div>
            </section>
          `;
        }catch(e){
          renderError();
        }
      }

      load();
    })();
  </script>
</body>
</html>

L1 —— 廉价的确定性描述量

bytes 总计12,271html / css / js296 / 5,592 / 6,383
dom 节点10dom 深度4
css 规则39含 js
brightness36.4contrast29.3
colorfulness10.6留白84.0%

该 slot 的 telemetry

prompt tokens312completion tokens3,427
total tokens3,739wall21.8 s
costrequest id
config.json581 B
{
  "N": 4,
  "auth": {
    "credential_ref": "WCB_OPENAI_OFFICIAL_KEY",
    "method": "api-key"
  },
  "billing": "metered",
  "config_id": "gpt-5.4-mini-eff-none--api--official--dev",
  "effort": "none",
  "family": "gpt",
  "m": {
    "min": 4,
    "q": 4
  },
  "model_id": "gpt-5.4-mini",
  "protocol": "api",
  "served_model": "gpt-5.4-mini-2026-03-17",
  "telemetry": {
    "completion_tokens": 33428,
    "cost_usd": null,
    "prompt_tokens": 2464,
    "total_tokens": 35892,
    "wall_ms": 224731
  },
  "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-mini-eff-none--api--official--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-07-17T20:09:22.167591+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T20:09:00.618972+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-17T20:09:47.363606+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T20:09:25.599868+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-17T20:10:13.515146+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T20:09:51.106446+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-17T20:11:09.792257+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T20:10:16.989457+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-17T20:11:45.291100+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T20:11:13.569290+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-17T20:12:10.289954+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T20:11:48.836246+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-17T20:12:45.561579+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T20:12:13.887038+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-17T20:13:10.758932+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T20:12:49.394735+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
    }
  }
}