gpt-5.6-luna @ low · codex-oauth

codex-oauthlow
config
gpt-5.6-luna-eff-low--cli--codex-oauth--dev
batch
2026-07-19--unified
transport
codex-cli-oauth-chatgpt
protocol
cli · plan
served model
gpt-5.6-luna
采集于
2026年7月18日 11:54 · N=2
variant
live
slot 0 · P-q · sandboxed iframe
gpt-5.6-luna @low · codex-oauth P-q slot 0 截图

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

similarity 邻居

限于 session 2026-07-19--unified

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

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

  • namematch
  • conditionmatch
  • datematch
  • max tempnot-foundno-temperature-candidate
  • min tempnot-foundno-temperature-candidate
  • hourlynot-foundcoverage · 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 {
    --ink: #18324a;
    --muted: #6f8798;
    --line: rgba(24, 50, 74, .12);
    --sky: #eaf6ff;
    --card: rgba(255, 255, 255, .78);
    --accent: #ffb547;
    --accent-deep: #ee9140;
    --shadow: 0 24px 70px rgba(55, 103, 135, .18);
  }

  * { box-sizing: border-box; }

  body {
    margin: 0;
    min-width: 1100px;
    min-height: 800px;
    color: var(--ink);
    font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
    background:
      radial-gradient(circle at 12% 8%, rgba(255,255,255,.95) 0 10%, transparent 32%),
      radial-gradient(circle at 90% 15%, rgba(255,222,166,.42), transparent 27%),
      linear-gradient(135deg, #cfeeff 0%, #f7fbff 55%, #fff0d7 100%);
    overflow: hidden;
  }

  body::before,
  body::after {
    content: "";
    position: fixed;
    border-radius: 50%;
    pointer-events: none;
    filter: blur(2px);
  }

  body::before {
    width: 360px;
    height: 360px;
    left: -120px;
    bottom: -150px;
    background: rgba(151, 211, 244, .28);
  }

  body::after {
    width: 300px;
    height: 300px;
    right: -100px;
    bottom: -120px;
    background: rgba(255, 195, 103, .24);
  }

  .app {
    width: 1080px;
    margin: 56px auto 0;
    position: relative;
  }

  .weather-card {
    min-height: 652px;
    padding: 42px 46px 34px;
    border: 1px solid rgba(255,255,255,.78);
    border-radius: 34px;
    background: var(--card);
    box-shadow: var(--shadow);
    backdrop-filter: blur(18px);
  }

  .topbar {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    padding-bottom: 30px;
    border-bottom: 1px solid var(--line);
  }

  .eyebrow {
    margin: 0 0 9px;
    color: var(--muted);
    font-size: 12px;
    font-weight: 800;
    letter-spacing: .16em;
    text-transform: uppercase;
  }

  .location {
    display: flex;
    gap: 12px;
    align-items: center;
  }

  .pin {
    width: 32px;
    height: 32px;
    display: grid;
    place-items: center;
    border-radius: 11px;
    color: #fff;
    background: var(--ink);
    font-size: 16px;
  }

  h1 {
    margin: 0;
    font-size: 32px;
    letter-spacing: -.04em;
  }

  .date {
    margin: 7px 0 0;
    color: var(--muted);
    font-size: 15px;
    font-weight: 600;
  }

  .status {
    min-height: 26px;
    padding: 7px 13px;
    border-radius: 20px;
    color: #7b5a23;
    background: rgba(255, 214, 140, .34);
    font-size: 12px;
    font-weight: 800;
  }

  .status.error {
    color: #a74747;
    background: rgba(255, 180, 180, .35);
  }

  .summary {
    display: grid;
    grid-template-columns: 1.15fr .85fr;
    gap: 40px;
    align-items: center;
    padding: 34px 0 38px;
  }

  .condition-row {
    display: flex;
    align-items: center;
    gap: 24px;
  }

  .weather-icon {
    width: 116px;
    height: 116px;
    display: grid;
    place-items: center;
    border-radius: 32px;
    background: linear-gradient(145deg, #fff8dc, #ffe1a8);
    box-shadow: inset 0 1px 0 rgba(255,255,255,.85);
    font-size: 64px;
  }

  .condition {
    margin: 0 0 7px;
    font-size: 25px;
    font-weight: 800;
    letter-spacing: -.035em;
  }

  .temperature {
    display: flex;
    align-items: flex-start;
    line-height: .85;
    font-size: 94px;
    font-weight: 850;
    letter-spacing: -.09em;
  }

  .temperature small {
    margin: 7px 0 0 8px;
    color: var(--accent-deep);
    font-size: 34px;
    font-weight: 750;
    letter-spacing: -.05em;
  }

  .range {
    display: flex;
    gap: 18px;
    margin-top: 19px;
    color: var(--muted);
    font-size: 15px;
    font-weight: 750;
  }

  .range strong { color: var(--ink); }

  .range span + span {
    padding-left: 18px;
    border-left: 1px solid var(--line);
  }

  .chart-panel {
    padding: 22px 24px 18px;
    border: 1px solid rgba(255,255,255,.9);
    border-radius: 24px;
    background: rgba(242, 249, 253, .72);
  }

  .chart-heading {
    display: flex;
    justify-content: space-between;
    margin-bottom: 14px;
    color: var(--muted);
    font-size: 12px;
    font-weight: 800;
    letter-spacing: .1em;
    text-transform: uppercase;
  }

  .chart {
    position: relative;
    height: 106px;
  }

  .chart svg {
    width: 100%;
    height: 80px;
    overflow: visible;
  }

  .chart-line {
    fill: none;
    stroke: var(--accent-deep);
    stroke-width: 3;
    stroke-linecap: round;
    stroke-linejoin: round;
  }

  .chart-fill { fill: url(#fade); }

  .chart-labels {
    display: flex;
    justify-content: space-between;
    color: #90a4b1;
    font-size: 11px;
    font-weight: 700;
  }

  .hourly-section {
    padding-top: 27px;
    border-top: 1px solid var(--line);
  }

  .section-heading {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    margin-bottom: 17px;
  }

  h2 {
    margin: 0;
    font-size: 18px;
    letter-spacing: -.02em;
  }

  .unit-note {
    color: var(--muted);
    font-size: 12px;
    font-weight: 700;
  }

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

  .hour {
    min-width: 0;
    padding: 14px 5px 13px;
    border: 1px solid rgba(213, 228, 237, .72);
    border-radius: 16px;
    text-align: center;
    background: rgba(255,255,255,.62);
  }

  .hour:nth-child(4n) {
    background: rgba(255, 244, 221, .72);
    border-color: rgba(255, 213, 151, .68);
  }

  .hour-time {
    color: var(--muted);
    font-size: 11px;
    font-weight: 800;
  }

  .hour-temp {
    margin-top: 11px;
    font-size: 17px;
    font-weight: 850;
    letter-spacing: -.04em;
  }

  .hour-temp span {
    color: var(--accent-deep);
    font-size: 12px;
    font-weight: 750;
  }

  .loading {
    display: grid;
    place-items: center;
    height: 380px;
    color: var(--muted);
    font-size: 16px;
    font-weight: 700;
  }

  .hidden { display: none; }
</style>
</head>
<body>
<main class="app">
  <section class="weather-card">
    <div class="topbar">
      <div>
        <p class="eyebrow">Daily forecast</p>
        <div class="location">
          <div class="pin">⌖</div>
          <div>
            <h1 id="location">Berlin</h1>
            <p class="date" id="date">Loading date…</p>
          </div>
        </div>
      </div>
      <div class="status" id="status">Updating</div>
    </div>

    <div id="loading" class="loading">Loading weather data…</div>

    <div id="content" class="hidden">
      <div class="summary">
        <div class="condition-row">
          <div class="weather-icon" id="icon">☀️</div>
          <div>
            <div class="temperature"><span id="currentTemp">—</span><small>°C</small></div>
            <p class="condition" id="condition">—</p>
            <div class="range">
              <span>High <strong id="maxTemp">—</strong>°</span>
              <span>Low <strong id="minTemp">—</strong>°</span>
            </div>
          </div>
        </div>

        <div class="chart-panel">
          <div class="chart-heading">
            <span>Temperature trend</span>
            <span>UTC</span>
          </div>
          <div class="chart">
            <svg viewBox="0 0 500 80" preserveAspectRatio="none" aria-hidden="true">
              <defs>
                <linearGradient id="fade" x1="0" x2="0" y1="0" y2="1">
                  <stop offset="0" stop-color="#f4a64a" stop-opacity=".34"/>
                  <stop offset="1" stop-color="#f4a64a" stop-opacity="0"/>
                </linearGradient>
              </defs>
              <path id="chartFill" class="chart-fill"></path>
              <path id="chartLine" class="chart-line"></path>
            </svg>
            <div class="chart-labels"><span>00:00</span><span>06:00</span><span>12:00</span><span>18:00</span><span>23:00</span></div>
          </div>
        </div>
      </div>

      <div class="hourly-section">
        <div class="section-heading">
          <h2>Hourly temperatures</h2>
          <span class="unit-note">Degrees Celsius</span>
        </div>
        <div class="hourly" id="hourly"></div>
      </div>
    </div>
  </section>
</main>

<script>
(() => {
  const params = new URLSearchParams(location.search);
  const lat = Number(params.get("lat") || 52.52);
  const lon = Number(params.get("lon") || 13.405);
  const name = params.get("name") || "Berlin";
  const today = new Date().toISOString().slice(0, 10);
  const date = /^\d{4}-\d{2}-\d{2}$/.test(params.get("date") || "") ? params.get("date") : today;

  const $ = id => document.getElementById(id);
  $("location").textContent = name;
  $("date").textContent = new Date(date + "T12:00:00Z").toLocaleDateString("en-US", {
    weekday: "long", month: "long", day: "numeric", year: "numeric", timeZone: "UTC"
  });

  const conditions = {
    0:["Clear sky","☀️"], 1:["Mainly clear","🌤️"], 2:["Partly cloudy","⛅"], 3:["Overcast","☁️"],
    45:["Foggy","🌫️"], 48:["Rime fog","🌫️"], 51:["Light drizzle","🌦️"], 53:["Drizzle","🌦️"],
    55:["Heavy drizzle","🌧️"], 56:["Freezing drizzle","🌧️"], 57:["Freezing drizzle","🌧️"],
    61:["Light rain","🌦️"], 63:["Rain","🌧️"], 65:["Heavy rain","🌧️"], 66:["Freezing rain","🌧️"],
    67:["Freezing rain","🌧️"], 71:["Light snow","🌨️"], 73:["Snow","🌨️"], 75:["Heavy snow","❄️"],
    77:["Snow grains","❄️"], 80:["Rain showers","🌦️"], 81:["Rain showers","🌧️"], 82:["Heavy showers","⛈️"],
    85:["Snow showers","🌨️"], 86:["Snow showers","❄️"], 95:["Thunderstorm","⛈️"], 96:["Thunderstorm","⛈️"], 99:["Thunderstorm","⛈️"]
  };

  function drawChart(values) {
    const clean = values.filter(Number.isFinite);
    if (!clean.length) return;
    const min = Math.min(...clean), max = Math.max(...clean);
    const spread = Math.max(max - min, 1);
    const points = clean.map((v, i) => {
      const x = clean.length === 1 ? 250 : i * 500 / (clean.length - 1);
      const y = 68 - ((v - min) / spread) * 55;
      return [x, y];
    });
    const line = points.map((p, i) => `${i ? "L" : "M"} ${p[0].toFixed(1)} ${p[1].toFixed(1)}`).join(" ");
    $("chartLine").setAttribute("d", line);
    $("chartFill").setAttribute("d", line + ` L ${points[points.length-1][0]} 80 L ${points[0][0]} 80 Z`);
  }

  async function load() {
    try {
      if (!Number.isFinite(lat) || !Number.isFinite(lon)) throw new Error("Invalid location");
      const endpoint = date < today ? "/api/om/archive" : "/api/om/forecast";
      const query = new URLSearchParams({
        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
      });
      const response = await fetch(`${endpoint}?${query}`);
      if (!response.ok) throw new Error("Weather request failed");
      const data = await response.json();
      const daily = data.daily;
      const hourly = data.hourly;
      if (!daily || !hourly || !hourly.temperature_2m?.length) throw new Error("Incomplete weather data");

      const code = Number(daily.weather_code?.[0]);
      const info = conditions[code] || ["Mixed conditions","🌤️"];
      const values = hourly.temperature_2m.map(Number);
      const valid = values.filter(Number.isFinite);
      const current = values[0];
      $("currentTemp").textContent = Number.isFinite(current) ? Math.round(current) : "—";
      $("maxTemp").textContent = Math.round(Number(daily.temperature_2m_max[0]));
      $("minTemp").textContent = Math.round(Number(daily.temperature_2m_min[0]));
      $("condition").textContent = info[0];
      $("icon").textContent = info[1];
      $("hourly").innerHTML = values.slice(0, 24).map((temp, i) => `
        <div class="hour">
          <div class="hour-time">${String(i).padStart(2,"0")}:00</div>
          <div class="hour-temp">${Number.isFinite(temp) ? Math.round(temp) : "—"}<span>°</span></div>
        </div>
      `).join("");
      drawChart(valid);
      $("loading").classList.add("hidden");
      $("content").classList.remove("hidden");
      $("status").textContent = "Live data";
    } catch (error) {
      $("loading").textContent = "Weather data could not be loaded.";
      $("status").textContent = "Unavailable";
      $("status").classList.add("error");
    }
  }

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

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

bytes 总计12,613html / css / js2,448 / 5,881 / 4,284
dom 节点57dom 深度11
css 规则44含 js
brightness244.5contrast18.1
colorfulness17.2留白97.2%

该 slot 的 telemetry

prompt tokens0completion tokens9,733
total tokens0wall74 s
costrequest id
config.json560 B
{
  "N": 2,
  "auth": {
    "credential_ref": "WCB_NONE",
    "method": "oauth-login"
  },
  "billing": "plan",
  "config_id": "gpt-5.6-luna-eff-low--cli--codex-oauth--dev",
  "effort": "low",
  "family": "gpt",
  "m": {
    "min": 2,
    "q": 2
  },
  "model_id": "gpt-5.6-luna",
  "protocol": "cli",
  "served_model": "gpt-5.6-luna",
  "telemetry": {
    "completion_tokens": 32142,
    "cost_usd": null,
    "prompt_tokens": null,
    "total_tokens": null,
    "wall_ms": 273645
  },
  "transport": "codex-cli-oauth-chatgpt",
  "vendor_sanction_ref": null
}
send-log2.5 KB
{
  "N": 2,
  "batch_id": "2026-07-17--dev-codex-oauth-gpt-5.6-luna",
  "config_id": "gpt-5.6-luna-eff-low--cli--codex-oauth--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-07-17T13:52:58.151483+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T13:51:44.166458+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-17T13:53:58.737091+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T13:53:01.944572+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-17T13:55:10.796009+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T13:54:02.059698+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-17T13:56:28.107945+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T13:55:13.965746+00:00"
        }
      ],
      "block_index": 1,
      "model_reaching_attempt_index": 0,
      "slot_index": 1,
      "terminal_state": "valid",
      "variant": "P-q"
    }
  ],
  "retry_policy": {
    "max_unreachable_retries": 5,
    "rate_limit_backoff": {
      "max_attempts": 4,
      "max_total_ms": 60000
    }
  }
}