grok-4.5 @ low · grok-cli

grok-clilow
config
grok-4.5-eff-low--cli--grok--dev
batch
2026-07-19--unified
transport
grok-cli-oauth-isolated-home
protocol
cli · plan
served model
grok-4.5
采集于
2026年7月18日 11:54 · N=2
variant
live
slot 0 · P-q · sandboxed iframe
grok-4.5 @low · grok-cli 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=1280, height=800">
<title>Weather Card</title>
<style>
  :root {
    --bg-deep: #0b1220;
    --bg-mid: #121a2e;
    --glass: rgba(255, 255, 255, 0.06);
    --glass-border: rgba(255, 255, 255, 0.12);
    --text: #f4f7fb;
    --text-muted: rgba(244, 247, 251, 0.62);
    --text-soft: rgba(244, 247, 251, 0.42);
    --accent: #7dd3fc;
    --accent-warm: #fbbf24;
    --max: #f87171;
    --min: #60a5fa;
    --shadow: 0 32px 80px rgba(0, 0, 0, 0.45);
    --radius: 28px;
  }

  * {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
  }

  html, body {
    width: 1280px;
    height: 800px;
    overflow: hidden;
    font-family: "Segoe UI", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", sans-serif;
    background: var(--bg-deep);
    color: var(--text);
    -webkit-font-smoothing: antialiased;
  }

  body {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
  }

  .sky {
    position: absolute;
    inset: 0;
    background:
      radial-gradient(ellipse 900px 500px at 18% 12%, rgba(56, 189, 248, 0.22), transparent 55%),
      radial-gradient(ellipse 700px 480px at 88% 18%, rgba(167, 139, 250, 0.18), transparent 50%),
      radial-gradient(ellipse 600px 400px at 70% 90%, rgba(251, 191, 36, 0.1), transparent 50%),
      linear-gradient(165deg, #0b1220 0%, #121a2e 45%, #0f172a 100%);
    z-index: 0;
  }

  .sky::after {
    content: "";
    position: absolute;
    inset: 0;
    background-image:
      radial-gradient(1.5px 1.5px at 10% 20%, rgba(255,255,255,0.35), transparent),
      radial-gradient(1px 1px at 25% 60%, rgba(255,255,255,0.25), transparent),
      radial-gradient(1.5px 1.5px at 40% 15%, rgba(255,255,255,0.3), transparent),
      radial-gradient(1px 1px at 55% 40%, rgba(255,255,255,0.2), transparent),
      radial-gradient(1.5px 1.5px at 70% 75%, rgba(255,255,255,0.28), transparent),
      radial-gradient(1px 1px at 85% 30%, rgba(255,255,255,0.22), transparent),
      radial-gradient(1px 1px at 92% 55%, rgba(255,255,255,0.18), transparent),
      radial-gradient(1.5px 1.5px at 15% 80%, rgba(255,255,255,0.2), transparent);
    opacity: 0.7;
    pointer-events: none;
  }

  .card {
    position: relative;
    z-index: 1;
    width: 1120px;
    height: 680px;
    border-radius: var(--radius);
    background: linear-gradient(145deg, rgba(255,255,255,0.09) 0%, rgba(255,255,255,0.03) 100%);
    border: 1px solid var(--glass-border);
    box-shadow: var(--shadow), inset 0 1px 0 rgba(255,255,255,0.1);
    backdrop-filter: blur(24px);
    -webkit-backdrop-filter: blur(24px);
    display: flex;
    flex-direction: column;
    padding: 40px 48px 36px;
    overflow: hidden;
  }

  .card::before {
    content: "";
    position: absolute;
    top: -40%;
    right: -15%;
    width: 480px;
    height: 480px;
    border-radius: 50%;
    background: radial-gradient(circle, rgba(125, 211, 252, 0.12), transparent 70%);
    pointer-events: none;
  }

  .header {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    margin-bottom: 28px;
    flex-shrink: 0;
  }

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

  .location-label {
    font-size: 12px;
    font-weight: 600;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--accent);
  }

  .location-name {
    font-size: 42px;
    font-weight: 700;
    letter-spacing: -0.03em;
    line-height: 1.1;
  }

  .date-line {
    font-size: 16px;
    color: var(--text-muted);
    font-weight: 500;
    letter-spacing: 0.02em;
  }

  .condition-badge {
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    gap: 10px;
    text-align: right;
  }

  .condition-icon {
    width: 88px;
    height: 88px;
    display: flex;
    align-items: center;
    justify-content: center;
  }

  .condition-icon svg {
    width: 88px;
    height: 88px;
    filter: drop-shadow(0 8px 20px rgba(0,0,0,0.25));
  }

  .condition-text {
    font-size: 18px;
    font-weight: 600;
    color: var(--text);
    letter-spacing: 0.01em;
  }

  .temps {
    display: flex;
    gap: 28px;
    margin-bottom: 36px;
    flex-shrink: 0;
  }

  .temp-pill {
    flex: 0 0 auto;
    min-width: 200px;
    padding: 22px 28px;
    border-radius: 20px;
    background: var(--glass);
    border: 1px solid var(--glass-border);
    display: flex;
    flex-direction: column;
    gap: 6px;
  }

  .temp-pill .label {
    font-size: 12px;
    font-weight: 600;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--text-soft);
  }

  .temp-pill .value {
    font-size: 48px;
    font-weight: 700;
    letter-spacing: -0.03em;
    line-height: 1;
  }

  .temp-pill.max .value { color: var(--max); }
  .temp-pill.min .value { color: var(--min); }

  .temp-pill .unit {
    font-size: 22px;
    font-weight: 500;
    opacity: 0.7;
    margin-left: 2px;
  }

  .hourly-section {
    flex: 1;
    display: flex;
    flex-direction: column;
    min-height: 0;
  }

  .hourly-header {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    margin-bottom: 16px;
  }

  .hourly-title {
    font-size: 13px;
    font-weight: 600;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--text-muted);
  }

  .hourly-hint {
    font-size: 13px;
    color: var(--text-soft);
  }

  .hourly-scroll {
    flex: 1;
    display: flex;
    align-items: stretch;
    gap: 10px;
    overflow: hidden;
    padding-bottom: 4px;
  }

  .hour-cell {
    flex: 1 1 0;
    min-width: 0;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: space-between;
    padding: 16px 4px 14px;
    border-radius: 16px;
    background: rgba(255,255,255,0.04);
    border: 1px solid rgba(255,255,255,0.06);
    transition: background 0.2s ease, border-color 0.2s ease;
  }

  .hour-cell.now {
    background: rgba(125, 211, 252, 0.12);
    border-color: rgba(125, 211, 252, 0.35);
  }

  .hour-label {
    font-size: 12px;
    font-weight: 600;
    color: var(--text-soft);
    letter-spacing: 0.04em;
  }

  .hour-cell.now .hour-label {
    color: var(--accent);
  }

  .hour-bar-wrap {
    flex: 1;
    width: 100%;
    display: flex;
    align-items: flex-end;
    justify-content: center;
    padding: 12px 0 8px;
    min-height: 100px;
  }

  .hour-bar {
    width: 10px;
    border-radius: 6px;
    background: linear-gradient(180deg, var(--accent) 0%, rgba(96, 165, 250, 0.5) 100%);
    min-height: 8px;
    transition: height 0.4s ease;
  }

  .hour-cell.now .hour-bar {
    background: linear-gradient(180deg, #bae6fd 0%, var(--accent) 100%);
    box-shadow: 0 0 12px rgba(125, 211, 252, 0.45);
  }

  .hour-temp {
    font-size: 14px;
    font-weight: 700;
    color: var(--text);
    letter-spacing: -0.02em;
  }

  .state {
    position: absolute;
    inset: 0;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 16px;
    background: rgba(11, 18, 32, 0.72);
    backdrop-filter: blur(12px);
    z-index: 10;
    border-radius: var(--radius);
  }

  .state.hidden {
    display: none;
  }

  .spinner {
    width: 44px;
    height: 44px;
    border: 3px solid rgba(255,255,255,0.12);
    border-top-color: var(--accent);
    border-radius: 50%;
    animation: spin 0.85s linear infinite;
  }

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

  .state-msg {
    font-size: 18px;
    font-weight: 500;
    color: var(--text-muted);
    text-align: center;
    max-width: 420px;
    line-height: 1.5;
  }

  .state.error .state-msg {
    color: #fca5a5;
  }

  .error-icon {
    width: 56px;
    height: 56px;
    border-radius: 50%;
    background: rgba(248, 113, 113, 0.15);
    border: 1px solid rgba(248, 113, 113, 0.35);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 28px;
    color: #fca5a5;
  }

  .footer {
    margin-top: 20px;
    padding-top: 16px;
    border-top: 1px solid rgba(255,255,255,0.06);
    display: flex;
    justify-content: space-between;
    align-items: center;
    flex-shrink: 0;
  }

  .footer-meta {
    font-size: 12px;
    color: var(--text-soft);
    letter-spacing: 0.04em;
  }

  .footer-meta span {
    color: var(--text-muted);
  }

  #content.hidden {
    visibility: hidden;
  }
</style>
</head>
<body>
  <div class="sky" aria-hidden="true"></div>
  <div class="card" id="card">
    <div class="state" id="loading">
      <div class="spinner"></div>
      <p class="state-msg">Loading weather data…</p>
    </div>
    <div class="state error hidden" id="error">
      <div class="error-icon">!</div>
      <p class="state-msg" id="error-msg">Weather data could not be loaded.</p>
    </div>
    <div id="content" class="hidden">
      <header class="header">
        <div class="location-block">
          <div class="location-label">Location</div>
          <h1 class="location-name" id="loc-name">—</h1>
          <p class="date-line" id="date-line">—</p>
        </div>
        <div class="condition-badge">
          <div class="condition-icon" id="condition-icon"></div>
          <div class="condition-text" id="condition-text">—</div>
        </div>
      </header>

      <div class="temps">
        <div class="temp-pill max">
          <span class="label">High</span>
          <div class="value"><span id="temp-max">—</span><span class="unit">°C</span></div>
        </div>
        <div class="temp-pill min">
          <span class="label">Low</span>
          <div class="value"><span id="temp-min">—</span><span class="unit">°C</span></div>
        </div>
      </div>

      <section class="hourly-section">
        <div class="hourly-header">
          <h2 class="hourly-title">Hourly temperature</h2>
          <span class="hourly-hint">UTC · 24 hours</span>
        </div>
        <div class="hourly-scroll" id="hourly"></div>
      </section>

      <footer class="footer">
        <div class="footer-meta">Source · <span>Open-Meteo compatible</span></div>
        <div class="footer-meta" id="coords">—</div>
      </footer>
    </div>
  </div>

<script>
(function () {
  "use strict";

  var WMO = {
    0:  { label: "Clear sky", kind: "clear" },
    1:  { label: "Mainly clear", kind: "clear" },
    2:  { label: "Partly cloudy", kind: "partly" },
    3:  { label: "Overcast", kind: "cloud" },
    45: { label: "Fog", kind: "fog" },
    48: { label: "Depositing rime fog", kind: "fog" },
    51: { label: "Light drizzle", kind: "drizzle" },
    53: { label: "Moderate drizzle", kind: "drizzle" },
    55: { label: "Dense drizzle", kind: "drizzle" },
    56: { label: "Light freezing drizzle", kind: "drizzle" },
    57: { label: "Dense freezing drizzle", kind: "drizzle" },
    61: { label: "Slight rain", kind: "rain" },
    63: { label: "Moderate rain", kind: "rain" },
    65: { label: "Heavy rain", kind: "rain" },
    66: { label: "Light freezing rain", kind: "rain" },
    67: { label: "Heavy freezing rain", kind: "rain" },
    71: { label: "Slight snow", kind: "snow" },
    73: { label: "Moderate snow", kind: "snow" },
    75: { label: "Heavy snow", kind: "snow" },
    77: { label: "Snow grains", kind: "snow" },
    80: { label: "Slight rain showers", kind: "rain" },
    81: { label: "Moderate rain showers", kind: "rain" },
    82: { label: "Violent rain showers", kind: "rain" },
    85: { label: "Slight snow showers", kind: "snow" },
    86: { label: "Heavy snow showers", kind: "snow" },
    95: { label: "Thunderstorm", kind: "storm" },
    96: { label: "Thunderstorm with slight hail", kind: "storm" },
    99: { label: "Thunderstorm with heavy hail", kind: "storm" }
  };

  function icons(kind) {
    var svg = {
      clear:
        '<svg viewBox="0 0 88 88" fill="none" xmlns="http://www.w3.org/2000/svg">' +
        '<circle cx="44" cy="44" r="16" fill="#FBBF24"/>' +
        '<g stroke="#FBBF24" stroke-width="3.5" stroke-linecap="round">' +
        '<path d="M44 12v8M44 68v8M12 44h8M68 44h8M22.3 22.3l5.7 5.7M60 60l5.7 5.7M22.3 65.7l5.7-5.7M60 28l5.7-5.7"/>' +
        '</g></svg>',
      partly:
        '<svg viewBox="0 0 88 88" fill="none" xmlns="http://www.w3.org/2000/svg">' +
        '<circle cx="34" cy="34" r="12" fill="#FBBF24"/>' +
        '<g stroke="#FBBF24" stroke-width="2.5" stroke-linecap="round">' +
        '<path d="M34 14v5M14 34h5M20 20l3.5 3.5"/>' +
        '</g>' +
        '<path d="M30 58c0-8.8 7.2-16 16-16 6.5 0 12.1 3.9 14.6 9.5A12 12 0 0 1 72 64c0 6.6-5.4 12-12 12H34c-7.7 0-14-6.3-14-14 0-5.6 3.3-10.4 8-12.6.7 1.5 1.6 2.9 2.7 4.1A13.9 13.9 0 0 0 30 58z" fill="#E2E8F0"/>' +
        '</svg>',
      cloud:
        '<svg viewBox="0 0 88 88" fill="none" xmlns="http://www.w3.org/2000/svg">' +
        '<path d="M28 60c0-9.9 8.1-18 18-18 7.3 0 13.6 4.4 16.4 10.7A13.5 13.5 0 0 1 76 66c0 7.5-6 13.5-13.5 13.5H32C23.2 79.5 16 72.3 16 63.5 16 56.3 3.3-10.4 8-12.6.7 1.5 1.6 2.9 2.7 4.1A13.9 13.9 0 0 0 30 58z" fill="#CBD5E1"/>' +
        '</svg>',
      fog:
        '<svg viewBox="0 0 88 88" fill="none" xmlns="http://www.w3.org/2000/svg">' +
        '<path d="M28 48c0-9.9 8.1-18 18-18 7.3 0 13.6 4.4 16.4 10.7A13.5 13.5 0 0 1 76 54" stroke="#94A3B8" stroke-width="4" stroke-linecap="round" fill="none"/>' +
        '<g stroke="#94A3B8" stroke-width="3.5" stroke-linecap="round">' +
        '<path d="M18 62h52M22 70h44M26 78h36"/>' +
        '</g></svg>',
      drizzle:
        '<svg viewBox="0 0 88 88" fill="none" xmlns="http://www.w3.org/2000/svg">' +
        '<path d="M28 42c0-9.9 8.1-18 18-18 7.3 0 13.6 4.4 16.4 10.7A13.5 13.5 0 0 1 76 48c0 7.5-6 13.5-13.5 13.5H32C23.2 61.5 16 54.3 16 45.5 16 38.3 20.8 32.2 27 29.4c.5 1.9 1.3 3.7 2.3 5.3A16 16 0 0 0 28 42z" fill="#CBD5E1"/>' +
        '<g stroke="#38BDF8" stroke-width="3" stroke-linecap="round">' +
        '<path d="M32 70v6M44 68v8M56 70v6"/>' +
        '</g></svg>',
      rain:
        '<svg viewBox="0 0 88 88" fill="none" xmlns="http://www.w3.org/2000/svg">' +
        '<path d="M28 40c0-9.9 8.1-18 18-18 7.3 0 13.6 4.4 16.4 10.7A13.5 13.5 0 0 1 76 46c0 7.5-6 13.5-13.5 13.5H32C23.2 59.5 16 52.3 16 43.5 16 36.3 20.8 30.2 27 27.4c.5 1.9 1.3 3.7 2.3 5.3A16 16 0 0 0 28 40z" fill="#94A3B8"/>' +
        '<g stroke="#38BDF8" stroke-width="3.5" stroke-linecap="round">' +
        '<path d="M30 68l-3 10M44 66l-3 12M58 68l-3 10"/>' +
        '</g></svg>',
      snow:
        '<svg viewBox="0 0 88 88" fill="none" xmlns="http://www.w3.org/2000/svg">' +
        '<path d="M28 40c0-9.9 8.1-18 18-18 7.3 0 13.6 4.4 16.4 10.7A13.5 13.5 0 0 1 76 46c0 7.5-6 13.5-13.5 13.5H32C23.2 59.5 16 52.3 16 43.5 16 36.3 20.8 30.2 27 27.4c.5 1.9 1.3 3.7 2.3 5.3A16 16 0 0 0 28 40z" fill="#E2E8F0"/>' +
        '<g fill="#BAE6FD">' +
        '<circle cx="32" cy="70" r="3"/><circle cx="44" cy="74" r="3"/><circle cx="56" cy="70" r="3"/><circle cx="38" cy="80" r="2.5"/><circle cx="50" cy="80" r="2.5"/>' +
        '</g></svg>',
      storm:
        '<svg viewBox="0 0 88 88" fill="none" xmlns="http://www.w3.org/2000/svg">' +
        '<path d="M28 38c0-9.9 8.1-18 18-18 7.3 0 13.6 4.4 16.4 10.7A13.5 13.5 0 0 1 76 44c0 7.5-6 13.5-13.5 13.5H32C23.2 57.5 16 50.3 16 41.5 16 34.3 20.8 28.2 27 25.4c.5 1.9 1.3 3.7 2.3 5.3A16 16 0 0 0 28 38z" fill="#64748B"/>' +
        '<path d="M46 56l-10 16h10l-4 14 16-20H48l-2-10z" fill="#FBBF24"/>' +
        '</svg>'
    };
    return svg[kind] || svg.cloud;
  }

  function pad(n) {
    return n < 10 ? "0" + n : String(n);
  }

  function todayUTC() {
    var d = new Date();
    return d.getUTCFullYear() + "-" + pad(d.getUTCMonth() + 1) + "-" + pad(d.getUTCDate());
  }

  function parseParams() {
    var q = new URLSearchParams(window.location.search);
    var lat = parseFloat(q.get("lat"));
    var lon = parseFloat(q.get("lon"));
    if (isNaN(lat)) lat = 52.52;
    if (isNaN(lon)) lon = 13.405;
    var name = q.get("name");
    if (name === null || name === "") name = "Berlin";
    var date = q.get("date");
    if (!date || !/^\d{4}-\d{2}-\d{2}$/.test(date)) date = todayUTC();
    return { lat: lat, lon: lon, name: name, date: date };
  }

  function isPastDate(dateStr) {
    return dateStr < todayUTC();
  }

  function formatDisplayDate(dateStr) {
    var parts = dateStr.split("-");
    var d = new Date(Date.UTC(+parts[0], +parts[1] - 1, +parts[2]));
    var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
    var months = ["January", "February", "March", "April", "May", "June",
      "July", "August", "September", "October", "November", "December"];
    return days[d.getUTCDay()] + ", " + months[d.getUTCMonth()] + " " + d.getUTCDate() + ", " + d.getUTCFullYear();
  }

  function showError(msg) {
    document.getElementById("loading").classList.add("hidden");
    document.getElementById("content").classList.add("hidden");
    var err = document.getElementById("error");
    err.classList.remove("hidden");
    document.getElementById("error-msg").textContent = msg || "Weather data could not be loaded.";
  }

  function showContent() {
    document.getElementById("loading").classList.add("hidden");
    document.getElementById("error").classList.add("hidden");
    document.getElementById("content").classList.remove("hidden");
  }

  function buildQuery(params) {
    var sp = new URLSearchParams();
    sp.set("latitude", String(params.lat));
    sp.set("longitude", String(params.lon));
    sp.set("daily", "temperature_2m_max,temperature_2m_min,weather_code");
    sp.set("hourly", "temperature_2m");
    sp.set("timezone", "UTC");
    sp.set("temperature_unit", "celsius");
    sp.set("start_date", params.date);
    sp.set("end_date", params.date);
    return sp.toString();
  }

  function findDateIndex(times, dateStr) {
    if (!times || !times.length) return -1;
    for (var i = 0; i < times.length; i++) {
      if (times[i] === dateStr || String(times[i]).indexOf(dateStr) === 0) return i;
    }
    return 0;
  }

  function hourlyForDate(times, temps, dateStr) {
    var out = [];
    if (!times || !temps) return out;
    for (var i = 0; i < times.length; i++) {
      if (String(times[i]).indexOf(dateStr) === 0) {
        out.push({ time: times[i], temp: temps[i] });
      }
    }
    return out;
  }

  function render(params, data) {
    var daily = data.daily || {};
    var idx = findDateIndex(daily.time, params.date);
    var tMax = daily.temperature_2m_max && daily.temperature_2m_max[idx];
    var tMin = daily.temperature_2m_min && daily.temperature_2m_min[idx];
    var code = daily.weather_code && daily.weather_code[idx];

    if (tMax === undefined || tMax === null || tMin === undefined || tMin === null) {
      showError("Weather data could not be loaded.");
      return;
    }

    var meta = WMO[code] || { label: "Weather code " + code, kind: "cloud" };
    document.getElementById("loc-name").textContent = params.name;
    document.getElementById("date-line").textContent = formatDisplayDate(params.date);
    document.getElementById("temp-max").textContent = Math.round(tMax);
    document.getElementById("temp-min").textContent = Math.round(tMin);
    document.getElementById("condition-text").textContent = meta.label;
    document.getElementById("condition-icon").innerHTML = icons(meta.kind);
    document.getElementById("coords").textContent =
      params.lat.toFixed(2) + "°, " + params.lon.toFixed(2) + "° · " + params.date;

    var hours = hourlyForDate(
      (data.hourly && data.hourly.time) || [],
      (data.hourly && data.hourly.temperature_2m) || [],
      params.date
    );

    var container = document.getElementById("hourly");
    container.innerHTML = "";

    if (!hours.length) {
      container.innerHTML = '<p class="state-msg" style="padding:24px">No hourly data available.</p>';
      showContent();
      return;
    }

    var tempsOnly = hours.map(function (h) { return h.temp; }).filter(function (t) {
      return t !== null && t !== undefined && !isNaN(t);
    });
    var minH = Math.min.apply(null, tempsOnly);
    var maxH = Math.max.apply(null, tempsOnly);
    var range = maxH - minH || 1;

    var now = new Date();
    var nowHour = now.getUTCFullYear() + "-" + pad(now.getUTCMonth() + 1) + "-" +
      pad(now.getUTCDate()) + "T" + pad(now.getUTCHours());

    var display = hours;
    if (hours.length > 24) {
      display = [];
      for (var s = 0; s < 24; s++) {
        display.push(hours[Math.round(s * (hours.length - 1) / 23)]);
      }
    }

    for (var i = 0; i < display.length; i++) {
      var h = display[i];
      var t = h.temp;
      var cell = document.createElement("div");
      var isNow = String(h.time).indexOf(nowHour) === 0;
      cell.className = "hour-cell" + (isNow ? " now" : "");

      var hourLabel = "—";
      if (h.time && h.time.length >= 13) {
        hourLabel = h.time.slice(11, 13);
      }

      var barH = 8;
      if (t !== null && t !== undefined && !isNaN(t)) {
        barH = 8 + Math.round(((t - minH) / range) * 92);
      }

      var tempStr = (t !== null && t !== undefined && !isNaN(t)) ? Math.round(t) + "°" : "—";

      cell.innerHTML =
        '<div class="hour-label">' + hourLabel + '</div>' +
        '<div class="hour-bar-wrap"><div class="hour-bar" style="height:' + barH + 'px"></div></div>' +
        '<div class="hour-temp">' + tempStr + '</div>';
      container.appendChild(cell);
    }

    showContent();
  }

  function load() {
    var params = parseParams();
    var endpoint = isPastDate(params.date) ? "/api/om/archive" : "/api/om/forecast";
    var url = endpoint + "?" + buildQuery(params);

    fetch(url)
      .then(function (res) {
        if (!res.ok) throw new Error("HTTP " + res.status);
        return res.json();
      })
      .then(function (data) {
        if (!data || data.error) {
          showError("Weather data could not be loaded.");
          return;
        }
        render(params, data);
      })
      .catch(function () {
        showError("Weather data could not be loaded.");
      });
  }

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

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

bytes 总计22,148html / css / js1,991 / 8,293 / 11,864
dom 节点45dom 深度8
css 规则49含 js
brightness43.9contrast19.3
colorfulness19.3留白64.0%

该 slot 的 telemetry

prompt tokens0completion tokens0
total tokens0wall107.2 s
costrequest id
config.json546 B
{
  "N": 2,
  "auth": {
    "credential_ref": "WCB_NONE",
    "method": "oauth-login"
  },
  "billing": "plan",
  "config_id": "grok-4.5-eff-low--cli--grok--dev",
  "effort": "low",
  "family": "grok",
  "m": {
    "min": 2,
    "q": 2
  },
  "model_id": "grok-4.5",
  "protocol": "cli",
  "served_model": "grok-4.5",
  "telemetry": {
    "completion_tokens": null,
    "cost_usd": null,
    "prompt_tokens": null,
    "total_tokens": null,
    "wall_ms": 300601
  },
  "transport": "grok-cli-oauth-isolated-home",
  "vendor_sanction_ref": null
}
send-log2.5 KB
{
  "N": 2,
  "batch_id": "2026-07-17--dev-grok-cli",
  "config_id": "grok-4.5-eff-low--cli--grok--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-07-17T13:51:39.321314+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T13:49:52.077816+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:52:35.975175+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T13:51:42.902524+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:53:27.305581+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T13:52:42.715630+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:55:06.216339+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T13:53:30.508452+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
    }
  }
}