gpt-5.4-mini @ low · api

apilow
config
gpt-5.4-mini-eff-low--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 @low · api P-q slot 0 截图

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

similarity 邻居

限于 session 2026-07-19--unified

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

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

  • namematch
  • conditionmatch
  • datematch
  • max tempambiguous展示值:25max-equals-min
  • min tempambiguous展示值:25max-equals-min
  • 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: #08111f;
      --bg2: #10233f;
      --card: rgba(12, 20, 35, 0.72);
      --card2: rgba(255, 255, 255, 0.06);
      --text: #eaf2ff;
      --muted: rgba(234, 242, 255, 0.72);
      --line: rgba(255, 255, 255, 0.12);
      --accent: #7dd3fc;
      --accent2: #a78bfa;
      --good: #86efac;
      --warn: #fbbf24;
      --shadow: 0 24px 80px rgba(0, 0, 0, 0.35);
    }

    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);
      background:
        radial-gradient(1200px 900px at 15% 15%, rgba(125, 211, 252, 0.20), transparent 55%),
        radial-gradient(1000px 800px at 85% 20%, rgba(167, 139, 250, 0.18), transparent 50%),
        radial-gradient(900px 700px at 55% 85%, rgba(56, 189, 248, 0.12), transparent 55%),
        linear-gradient(145deg, var(--bg1), var(--bg2));
      overflow: hidden;
    }

    .frame {
      width: 1280px;
      height: 800px;
      margin: 0 auto;
      display: grid;
      place-items: center;
      position: relative;
    }

    .glow {
      position: absolute;
      inset: 0;
      pointer-events: none;
      background:
        radial-gradient(600px 260px at 50% 0%, rgba(255,255,255,0.08), transparent 70%),
        radial-gradient(500px 500px at 50% 50%, rgba(255,255,255,0.03), transparent 65%);
      mix-blend-mode: screen;
    }

    .card {
      width: 940px;
      max-width: calc(100vw - 96px);
      border: 1px solid var(--line);
      background: linear-gradient(180deg, rgba(17, 26, 45, 0.84), rgba(8, 14, 26, 0.74));
      box-shadow: var(--shadow);
      border-radius: 32px;
      backdrop-filter: blur(18px);
      -webkit-backdrop-filter: blur(18px);
      overflow: hidden;
      position: relative;
    }

    .card::before {
      content: "";
      position: absolute;
      inset: 0;
      background: linear-gradient(135deg, rgba(255,255,255,0.10), transparent 28%, transparent 72%, rgba(255,255,255,0.04));
      pointer-events: none;
    }

    .top {
      display: grid;
      grid-template-columns: 1.3fr 0.9fr;
      gap: 0;
      padding: 34px 36px 28px;
      border-bottom: 1px solid var(--line);
      align-items: end;
    }

    .location {
      display: flex;
      flex-direction: column;
      gap: 10px;
    }

    .kicker {
      font-size: 13px;
      letter-spacing: 0.22em;
      text-transform: uppercase;
      color: var(--muted);
    }

    .name {
      font-size: 48px;
      line-height: 0.98;
      font-weight: 800;
      letter-spacing: -0.04em;
      margin: 0;
    }

    .date {
      font-size: 18px;
      color: var(--muted);
    }

    .summary {
      justify-self: end;
      text-align: right;
      display: flex;
      flex-direction: column;
      gap: 8px;
    }

    .temp-range {
      display: flex;
      align-items: baseline;
      justify-content: flex-end;
      gap: 16px;
      font-variant-numeric: tabular-nums;
    }

    .max {
      font-size: 78px;
      font-weight: 800;
      line-height: 0.9;
      letter-spacing: -0.05em;
      color: #ffffff;
      text-shadow: 0 0 24px rgba(125, 211, 252, 0.15);
    }

    .min {
      font-size: 28px;
      color: var(--muted);
      font-weight: 700;
    }

    .condition {
      display: inline-flex;
      align-items: center;
      justify-content: flex-end;
      gap: 12px;
      font-size: 18px;
      color: var(--text);
    }

    .badge {
      display: inline-flex;
      align-items: center;
      gap: 8px;
      background: rgba(255,255,255,0.07);
      border: 1px solid rgba(255,255,255,0.10);
      color: var(--muted);
      border-radius: 999px;
      padding: 10px 14px;
      font-size: 13px;
      width: fit-content;
    }

    .body {
      padding: 24px 28px 30px;
    }

    .section-title {
      display: flex;
      justify-content: space-between;
      align-items: end;
      margin-bottom: 14px;
    }

    .section-title h2 {
      margin: 0;
      font-size: 18px;
      letter-spacing: 0.02em;
      font-weight: 700;
      color: var(--text);
    }

    .section-title .hint {
      color: var(--muted);
      font-size: 13px;
    }

    .hourly {
      display: grid;
      grid-template-columns: repeat(8, minmax(0, 1fr));
      gap: 12px;
    }

    .hour {
      background: linear-gradient(180deg, rgba(255,255,255,0.08), rgba(255,255,255,0.04));
      border: 1px solid rgba(255,255,255,0.10);
      border-radius: 20px;
      padding: 14px 12px;
      text-align: center;
      min-height: 112px;
      display: flex;
      flex-direction: column;
      justify-content: space-between;
      box-shadow: inset 0 1px 0 rgba(255,255,255,0.05);
    }

    .hour-time {
      font-size: 13px;
      color: var(--muted);
      letter-spacing: 0.03em;
    }

    .hour-temp {
      font-size: 26px;
      font-weight: 800;
      letter-spacing: -0.04em;
      font-variant-numeric: tabular-nums;
    }

    .hour-pill {
      align-self: center;
      width: 100%;
      padding: 7px 0;
      border-radius: 999px;
      background: rgba(125, 211, 252, 0.10);
      color: #d8f3ff;
      font-size: 12px;
      border: 1px solid rgba(125, 211, 252, 0.16);
    }

    .error {
      width: 940px;
      max-width: calc(100vw - 96px);
      padding: 40px;
      border-radius: 28px;
      border: 1px solid rgba(248, 113, 113, 0.25);
      background: rgba(40, 14, 18, 0.72);
      box-shadow: var(--shadow);
      color: #ffe7e7;
      text-align: center;
      backdrop-filter: blur(18px);
    }

    .error h1 {
      margin: 0 0 12px;
      font-size: 34px;
    }

    .error p {
      margin: 0;
      color: rgba(255, 231, 231, 0.8);
      font-size: 16px;
    }

    .loading {
      color: var(--muted);
      font-size: 18px;
      letter-spacing: 0.02em;
    }

    @media (max-width: 1100px) {
      .frame { width: 100%; height: 100%; }
      .card { max-width: calc(100vw - 48px); }
      .hourly { grid-template-columns: repeat(4, 1fr); }
      .top { grid-template-columns: 1fr; gap: 18px; }
      .summary { justify-self: start; text-align: left; }
      .temp-range, .condition { justify-content: flex-start; }
    }
  </style>
</head>
<body>
  <div class="frame">
    <div class="glow"></div>
    <div id="app" class="loading">Loading weather…</div>
  </div>

  <script>
    (function () {
      const params = new URLSearchParams(window.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 dateParam = params.get("date") || new Date().toISOString().slice(0, 10);

      const requestedDate = new Date(dateParam + "T00:00:00Z");
      const todayUTC = new Date();
      const todayStr = todayUTC.toISOString().slice(0, 10);

      const isPast = dateParam < todayStr;
      const apiPath = isPast ? "/api/om/archive" : "/api/om/forecast";

      const dailyParams = "temperature_2m_max,temperature_2m_min,weather_code";
      const hourlyParams = "temperature_2m";
      const qs = new URLSearchParams({
        latitude: String(lat),
        longitude: String(lon),
        daily: dailyParams,
        hourly: hourlyParams,
        timezone: "UTC",
        temperature_unit: "celsius",
        start_date: dateParam,
        end_date: dateParam
      });

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

      function weatherDescription(code) {
        const map = {
          0: "Clear sky",
          1: "Mainly clear",
          2: "Partly cloudy",
          3: "Overcast",
          45: "Fog",
          48: "Depositing rime fog",
          51: "Light drizzle",
          53: "Moderate drizzle",
          55: "Dense drizzle",
          56: "Light freezing drizzle",
          57: "Dense freezing drizzle",
          61: "Slight rain",
          63: "Moderate rain",
          65: "Heavy rain",
          66: "Light freezing rain",
          67: "Heavy freezing rain",
          71: "Slight snow fall",
          73: "Moderate snow fall",
          75: "Heavy snow fall",
          77: "Snow grains",
          80: "Slight rain showers",
          81: "Moderate 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 weather";
      }

      function formatDateLabel(iso) {
        const d = new Date(iso + "T00:00:00Z");
        return new Intl.DateTimeFormat(undefined, {
          weekday: "long",
          year: "numeric",
          month: "long",
          day: "numeric",
          timeZone: "UTC"
        }).format(d);
      }

      function formatHourLabel(iso) {
        const d = new Date(iso);
        return new Intl.DateTimeFormat(undefined, {
          hour: "numeric",
          hour12: false,
          timeZone: "UTC"
        }).format(d).replace(/^24$/, "00") + ":00";
      }

      function renderError(message) {
        app.outerHTML = `
          <div class="error">
            <h1>Weather data unavailable</h1>
            <p>${message}</p>
          </div>
        `;
      }

      async function load() {
        try {
          const res = await fetch(`${apiPath}?${qs.toString()}`, { method: "GET" });
          if (!res.ok) throw new Error(`Request failed (${res.status})`);
          const data = await res.json();

          const daily = data && data.daily;
          const hourly = data && data.hourly;

          if (!daily || !hourly || !Array.isArray(daily.time) || !Array.isArray(hourly.time)) {
            throw new Error("Unexpected response format");
          }

          const idxDaily = daily.time.indexOf(dateParam);
          if (idxDaily < 0) throw new Error("Requested day missing in daily data");

          const hourlyItems = [];
          for (let i = 0; i < hourly.time.length; i++) {
            if (hourly.time[i].startsWith(dateParam)) {
              hourlyItems.push({
                time: hourly.time[i],
                temp: hourly.temperature_2m[i]
              });
            }
          }

          const maxTemp = daily.temperature_2m_max[idxDaily];
          const minTemp = daily.temperature_2m_min[idxDaily];
          const code = daily.weather_code[idxDaily];
          const desc = weatherDescription(code);

          const hoursHtml = hourlyItems.map(item => `
            <div class="hour">
              <div class="hour-time">${formatHourLabel(item.time)}</div>
              <div class="hour-temp">${Math.round(item.temp)}°</div>
              <div class="hour-pill">${item.temp.toFixed(1)} °C</div>
            </div>
          `).join("");

          app.outerHTML = `
            <div class="card">
              <div class="top">
                <div class="location">
                  <div class="kicker">Weather card</div>
                  <h1 class="name">${escapeHtml(name)}</h1>
                  <div class="date">${formatDateLabel(dateParam)} · UTC</div>
                </div>
                <div class="summary">
                  <div class="temp-range">
                    <div class="max">${Math.round(maxTemp)}°</div>
                    <div class="min">${Math.round(minTemp)}°</div>
                  </div>
                  <div class="condition">
                    <span class="badge">Condition</span>
                    <span>${escapeHtml(desc)}</span>
                  </div>
                </div>
              </div>
              <div class="body">
                <div class="section-title">
                  <h2>Hourly temperatures</h2>
                  <div class="hint">${hourlyItems.length} readings for ${dateParam}</div>
                </div>
                <div class="hourly">
                  ${hoursHtml || '<div class="loading">No hourly data available for this date.</div>'}
                </div>
              </div>
            </div>
          `;
        } catch (err) {
          renderError("The weather information could not be loaded. Please try again later.");
        }
      }

      function escapeHtml(str) {
        return String(str)
          .replaceAll("&", "&amp;")
          .replaceAll("<", "&lt;")
          .replaceAll(">", "&gt;")
          .replaceAll('"', "&quot;")
          .replaceAll("'", "&#39;");
      }

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

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

bytes 总计12,750html / css / js360 / 6,251 / 6,139
dom 节点11dom 深度4
css 规则38含 js
brightness39.2contrast23.1
colorfulness15.1留白72.7%

该 slot 的 telemetry

prompt tokens312completion tokens3,754
total tokens4,066wall22.6 s
costrequest id
config.json579 B
{
  "N": 4,
  "auth": {
    "credential_ref": "WCB_OPENAI_OFFICIAL_KEY",
    "method": "api-key"
  },
  "billing": "metered",
  "config_id": "gpt-5.4-mini-eff-low--api--official--dev",
  "effort": "low",
  "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": 35687,
    "cost_usd": null,
    "prompt_tokens": 2464,
    "total_tokens": 38151,
    "wall_ms": 257025
  },
  "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-low--api--official--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-07-17T19:50:58.197554+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T19:50:36.861468+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-17T19:51:23.979552+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T19:51:01.413048+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-17T19:52:10.117124+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T19:51:27.953286+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-17T19:52:46.238741+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T19:52:14.202793+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-17T19:53:21.387448+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T19:52:49.599865+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-17T19:54:07.271730+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T19:53:24.707248+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-17T19:54:33.169391+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T19:54:11.492459+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-17T19:55:20.316367+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T19:54:37.364893+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
    }
  }
}