gpt-5.6-sol @ none · codex-oauth

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

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

similarity 邻居

限于 session 2026-07-19--unified

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

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

  • namematch
  • conditionmatch
  • datematch
  • max tempambiguous展示值:17max-equals-min
  • min tempambiguous展示值:17max-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 {
      color-scheme: dark;
      font-family: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
      background: #09101f;
      color: #f7f9ff;
    }

    * {
      box-sizing: border-box;
    }

    html,
    body {
      width: 100%;
      height: 100%;
      margin: 0;
    }

    body {
      display: grid;
      place-items: center;
      overflow: hidden;
      background:
        radial-gradient(circle at 17% 22%, rgba(73, 157, 255, 0.31), transparent 31%),
        radial-gradient(circle at 84% 73%, rgba(138, 104, 255, 0.23), transparent 34%),
        linear-gradient(135deg, #07101e 0%, #101b35 52%, #101126 100%);
    }

    body::before,
    body::after {
      position: fixed;
      content: "";
      width: 420px;
      height: 420px;
      border: 1px solid rgba(255, 255, 255, 0.05);
      border-radius: 50%;
      pointer-events: none;
    }

    body::before {
      top: -230px;
      right: -90px;
    }

    body::after {
      bottom: -275px;
      left: -80px;
      width: 510px;
      height: 510px;
    }

    .card {
      position: relative;
      width: min(1080px, calc(100vw - 96px));
      min-height: 590px;
      padding: 48px 50px 40px;
      overflow: hidden;
      border: 1px solid rgba(255, 255, 255, 0.14);
      border-radius: 38px;
      background:
        linear-gradient(125deg, rgba(255, 255, 255, 0.13), rgba(255, 255, 255, 0.035)),
        rgba(13, 23, 46, 0.82);
      box-shadow:
        0 38px 90px rgba(0, 0, 0, 0.42),
        inset 0 1px 0 rgba(255, 255, 255, 0.17);
      backdrop-filter: blur(24px);
    }

    .card::after {
      position: absolute;
      top: -170px;
      right: -130px;
      width: 440px;
      height: 440px;
      content: "";
      border-radius: 50%;
      background: radial-gradient(circle, rgba(119, 186, 255, 0.22), transparent 67%);
      pointer-events: none;
    }

    .header,
    .summary,
    .hourly {
      position: relative;
      z-index: 1;
    }

    .header {
      display: flex;
      align-items: flex-start;
      justify-content: space-between;
      gap: 28px;
    }

    .eyebrow {
      margin-bottom: 10px;
      color: #91b7ee;
      font-size: 12px;
      font-weight: 750;
      letter-spacing: 0.2em;
      text-transform: uppercase;
    }

    h1 {
      max-width: 650px;
      margin: 0;
      overflow: hidden;
      color: white;
      font-size: clamp(42px, 5vw, 66px);
      font-weight: 680;
      letter-spacing: -0.055em;
      line-height: 1.02;
      text-overflow: ellipsis;
      white-space: nowrap;
    }

    .date {
      margin-top: 15px;
      color: #b6c3da;
      font-size: 16px;
      letter-spacing: 0.01em;
    }

    .status {
      display: flex;
      align-items: center;
      gap: 9px;
      margin-top: 5px;
      padding: 10px 15px;
      border: 1px solid rgba(160, 201, 255, 0.16);
      border-radius: 999px;
      background: rgba(98, 159, 236, 0.08);
      color: #b8d8ff;
      font-size: 12px;
      font-weight: 700;
      letter-spacing: 0.11em;
      text-transform: uppercase;
      white-space: nowrap;
    }

    .status-dot {
      width: 7px;
      height: 7px;
      border-radius: 50%;
      background: #71d5ff;
      box-shadow: 0 0 15px #71d5ff;
    }

    .summary {
      display: grid;
      grid-template-columns: minmax(250px, 1.15fr) 1fr;
      align-items: center;
      gap: 60px;
      min-height: 220px;
      margin-top: 22px;
    }

    .condition-wrap {
      display: flex;
      align-items: center;
      gap: 25px;
    }

    .weather-icon {
      display: grid;
      flex: 0 0 auto;
      width: 106px;
      height: 106px;
      place-items: center;
      border: 1px solid rgba(255, 255, 255, 0.13);
      border-radius: 31px;
      background: linear-gradient(145deg, rgba(130, 194, 255, 0.17), rgba(127, 102, 255, 0.07));
      box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 18px 38px rgba(0, 0, 0, 0.16);
      font-size: 57px;
      line-height: 1;
    }

    .condition-label {
      color: #a7b8d4;
      font-size: 13px;
      font-weight: 700;
      letter-spacing: 0.16em;
      text-transform: uppercase;
    }

    .condition {
      max-width: 250px;
      margin-top: 8px;
      color: #f9fbff;
      font-size: 29px;
      font-weight: 610;
      letter-spacing: -0.025em;
      line-height: 1.1;
    }

    .range {
      display: flex;
      align-items: flex-end;
      justify-content: flex-end;
      gap: 34px;
    }

    .temp-block {
      min-width: 130px;
    }

    .temp-label {
      margin-bottom: 8px;
      color: #8fa1bf;
      font-size: 12px;
      font-weight: 750;
      letter-spacing: 0.17em;
      text-transform: uppercase;
    }

    .temp-value {
      color: #fff;
      font-size: 70px;
      font-weight: 620;
      letter-spacing: -0.07em;
      line-height: 0.9;
    }

    .temp-value.low {
      color: #9ec9ff;
    }

    .degree {
      color: inherit;
      font-size: 0.48em;
      font-weight: 500;
      vertical-align: top;
    }

    .divider {
      width: 1px;
      height: 78px;
      background: linear-gradient(transparent, rgba(255, 255, 255, 0.21), transparent);
    }

    .hourly {
      padding-top: 26px;
      border-top: 1px solid rgba(255, 255, 255, 0.1);
    }

    .hourly-heading {
      display: flex;
      align-items: center;
      justify-content: space-between;
      margin-bottom: 19px;
    }

    .hourly-title {
      color: #eef4ff;
      font-size: 15px;
      font-weight: 690;
      letter-spacing: 0.02em;
    }

    .hourly-note {
      color: #7185a8;
      font-size: 11px;
      font-weight: 650;
      letter-spacing: 0.13em;
      text-transform: uppercase;
    }

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

    .hour {
      min-width: 0;
      padding: 15px 5px 14px;
      border: 1px solid rgba(255, 255, 255, 0.075);
      border-radius: 17px;
      background: rgba(255, 255, 255, 0.035);
      text-align: center;
    }

    .hour-time {
      overflow: hidden;
      color: #7f92b2;
      font-size: 10px;
      font-weight: 700;
      letter-spacing: 0.02em;
      text-overflow: ellipsis;
      white-space: nowrap;
    }

    .hour-temp {
      margin-top: 10px;
      color: #eef5ff;
      font-size: 17px;
      font-weight: 660;
      letter-spacing: -0.03em;
    }

    .loading,
    .error {
      display: grid;
      min-height: 390px;
      place-items: center;
      color: #b8c6dc;
      font-size: 18px;
      text-align: center;
    }

    .loader {
      width: 34px;
      height: 34px;
      margin: 0 auto 18px;
      border: 3px solid rgba(255, 255, 255, 0.12);
      border-top-color: #79c8ff;
      border-radius: 50%;
      animation: spin 0.8s linear infinite;
    }

    .error strong {
      display: block;
      margin-bottom: 8px;
      color: #fff;
      font-size: 25px;
    }

    @keyframes spin {
      to { transform: rotate(360deg); }
    }

    @media (max-width: 900px) {
      .card {
        width: calc(100vw - 40px);
        padding: 34px;
      }

      .summary {
        grid-template-columns: 1fr;
        gap: 28px;
      }

      .range {
        justify-content: flex-start;
      }

      .hourly-list {
        grid-template-columns: repeat(6, 1fr);
      }
    }
  </style>
</head>
<body>
  <main class="card" id="card">
    <div class="loading">
      <div>
        <div class="loader"></div>
        Loading weather…
      </div>
    </div>
  </main>

  <script>
    (() => {
      const params = new URLSearchParams(location.search);
      const latitude = finiteNumber(params.get("lat"), 52.52);
      const longitude = finiteNumber(params.get("lon"), 13.405);
      const locationName = (params.get("name") || "Berlin").trim() || "Berlin";
      const todayUTC = new Date().toISOString().slice(0, 10);
      const requestedDate = validDate(params.get("date")) ? params.get("date") : todayUTC;
      const endpoint = requestedDate < todayUTC ? "/api/om/archive" : "/api/om/forecast";
      const card = document.getElementById("card");

      function finiteNumber(value, fallback) {
        const number = Number(value);
        return Number.isFinite(number) ? number : fallback;
      }

      function validDate(value) {
        if (!/^\d{4}-\d{2}-\d{2}$/.test(value || "")) return false;
        const date = new Date(value + "T00:00:00Z");
        return !Number.isNaN(date.getTime()) && date.toISOString().slice(0, 10) === value;
      }

      function escapeHTML(value) {
        return String(value).replace(/[&<>"']/g, character => ({
          "&": "&amp;",
          "<": "&lt;",
          ">": "&gt;",
          '"': "&quot;",
          "'": "&#039;"
        })[character]);
      }

      function formatDate(value) {
        return new Intl.DateTimeFormat("en", {
          weekday: "long",
          day: "numeric",
          month: "long",
          year: "numeric",
          timeZone: "UTC"
        }).format(new Date(value + "T12:00:00Z"));
      }

      function weatherInfo(code) {
        const map = {
          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: ["Heavy freezing drizzle", "🌧"],
          61: ["Light rain", "🌦"],
          63: ["Rain", "🌧"],
          65: ["Heavy rain", "🌧"],
          66: ["Freezing rain", "🌧"],
          67: ["Heavy freezing rain", "🌧"],
          71: ["Light snow", "🌨"],
          73: ["Snow", "🌨"],
          75: ["Heavy snow", "❄"],
          77: ["Snow grains", "❄"],
          80: ["Light showers", "🌦"],
          81: ["Rain showers", "🌧"],
          82: ["Heavy showers", "🌧"],
          85: ["Snow showers", "🌨"],
          86: ["Heavy snow showers", "🌨"],
          95: ["Thunderstorm", "⛈"],
          96: ["Thunderstorm with hail", "⛈"],
          99: ["Severe thunderstorm", "⛈"]
        };
        return map[Number(code)] || ["Unknown conditions", "◌"];
      }

      function temperature(value) {
        return Number.isFinite(Number(value)) ? Math.round(Number(value)) : null;
      }

      function render(data) {
        const daily = data && data.daily;
        const hourly = data && data.hourly;
        const dayIndex = daily && Array.isArray(daily.time)
          ? daily.time.indexOf(requestedDate)
          : -1;

        if (
          dayIndex < 0 ||
          !hourly ||
          !Array.isArray(hourly.time) ||
          !Array.isArray(hourly.temperature_2m)
        ) {
          throw new Error("Incomplete weather data");
        }

        const high = temperature(daily.temperature_2m_max[dayIndex]);
        const low = temperature(daily.temperature_2m_min[dayIndex]);
        const [condition, icon] = weatherInfo(daily.weather_code[dayIndex]);

        if (high === null || low === null) {
          throw new Error("Missing temperature data");
        }

        const samples = hourly.time
          .map((time, index) => ({
            time,
            temperature: temperature(hourly.temperature_2m[index])
          }))
          .filter(item => item.time.startsWith(requestedDate) && item.temperature !== null);

        if (!samples.length) throw new Error("Missing hourly data");

        const displayed = samples.filter((_, index) => index % 2 === 0).slice(0, 12);
        const hourlyHTML = displayed.map(item => {
          const hour = item.time.includes("T") ? item.time.split("T")[1].slice(0, 5) : "";
          return `
            <div class="hour">
              <div class="hour-time">${escapeHTML(hour)}</div>
              <div class="hour-temp">${item.temperature}°</div>
            </div>
          `;
        }).join("");

        card.innerHTML = `
          <header class="header">
            <div>
              <div class="eyebrow">Weather overview</div>
              <h1 title="${escapeHTML(locationName)}">${escapeHTML(locationName)}</h1>
              <div class="date">${escapeHTML(formatDate(requestedDate))}</div>
            </div>
            <div class="status"><span class="status-dot"></span> UTC forecast</div>
          </header>

          <section class="summary">
            <div class="condition-wrap">
              <div class="weather-icon" aria-hidden="true">${icon}</div>
              <div>
                <div class="condition-label">Conditions</div>
                <div class="condition">${escapeHTML(condition)}</div>
              </div>
            </div>

            <div class="range">
              <div class="temp-block">
                <div class="temp-label">High</div>
                <div class="temp-value">${high}<span class="degree">°C</span></div>
              </div>
              <div class="divider"></div>
              <div class="temp-block">
                <div class="temp-label">Low</div>
                <div class="temp-value low">${low}<span class="degree">°C</span></div>
              </div>
            </div>
          </section>

          <section class="hourly">
            <div class="hourly-heading">
              <div class="hourly-title">Hourly temperature</div>
              <div class="hourly-note">Every two hours · UTC</div>
            </div>
            <div class="hourly-list">${hourlyHTML}</div>
          </section>
        `;
      }

      function renderError() {
        card.innerHTML = `
          <div class="error">
            <div>
              <strong>Weather unavailable</strong>
              The weather data could not be loaded. Please try again.
            </div>
          </div>
        `;
      }

      const query = new URLSearchParams({
        latitude: String(latitude),
        longitude: String(longitude),
        daily: "temperature_2m_max,temperature_2m_min,weather_code",
        hourly: "temperature_2m",
        timezone: "UTC",
        temperature_unit: "celsius",
        start_date: requestedDate,
        end_date: requestedDate
      });

      fetch(endpoint + "?" + query.toString(), { headers: { Accept: "application/json" } })
        .then(response => {
          if (!response.ok) throw new Error("Request failed");
          return response.json();
        })
        .then(render)
        .catch(renderError);
    })();
  </script>
</body>
</html>

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

bytes 总计14,763html / css / js403 / 7,344 / 7,016
dom 节点12dom 深度6
css 规则46含 js
brightness42.2contrast22.2
colorfulness17.0留白52.9%

该 slot 的 telemetry

prompt tokens0completion tokens10,411
total tokens0wall77.9 s
costrequest id
config.json559 B
{
  "N": 2,
  "auth": {
    "credential_ref": "WCB_NONE",
    "method": "oauth-login"
  },
  "billing": "plan",
  "config_id": "gpt-5.6-sol-eff-none--cli--codex-oauth--dev",
  "effort": "none",
  "family": "gpt",
  "m": {
    "min": 2,
    "q": 2
  },
  "model_id": "gpt-5.6-sol",
  "protocol": "cli",
  "served_model": "gpt-5.6-sol",
  "telemetry": {
    "completion_tokens": 41453,
    "cost_usd": null,
    "prompt_tokens": null,
    "total_tokens": null,
    "wall_ms": 309945
  },
  "transport": "codex-cli-oauth-chatgpt",
  "vendor_sanction_ref": null
}
send-log2.5 KB
{
  "N": 2,
  "batch_id": "2026-07-19--codex-oauth-extra",
  "config_id": "gpt-5.6-sol-eff-none--cli--codex-oauth--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-07-18T22:04:37.802316+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-18T22:03:27.685013+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-18T22:05:59.383328+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-18T22:04:41.474418+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-18T22:07:31.867977+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-18T22:06:03.038838+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-18T22:08:48.601814+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-18T22:07:35.505584+00:00"
        }
      ],
      "block_index": 1,
      "model_reaching_attempt_index": 0,
      "slot_index": 1,
      "terminal_state": "valid",
      "variant": "P-min"
    }
  ],
  "retry_policy": {
    "max_unreachable_retries": 5,
    "rate_limit_backoff": {
      "max_attempts": 4,
      "max_total_ms": 60000
    }
  }
}