qwen3.7-max · go

go
config
qwen3.7-max--opencode-go--dev
batch
2026-07-19--unified
transport
opencode-go-gateway
protocol
api · plan
served model
qwen3.7-max
采集于
2026年7月18日 11:54 · N=2
variant
live
slot 1 · P-q · sandboxed iframe
qwen3.7-max · go P-q slot 1 截图

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

similarity 邻居

限于 session 2026-07-19--unified

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

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

  • namematch
  • conditionmatch
  • datematch
  • max tempmatch展示值:25.3
  • min tempmatch展示值:16
  • hourlymismatchcoverage 2/24 · 2 命中 · 6 不符 · 16 未展示
  • request sidematch0 处违规

extractor fidelity-extractor-v1+Berlin-2026-07-15

源码 —— 原始模型输出,一字节未改

下载 card.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Weather Card</title>
<style>
  * { box-sizing: border-box; margin: 0; padding: 0; }
  html, body { width: 100%; height: 100%; }
  body {
    min-height: 100vh;
    font-family: -apple-system, BlinkMacSystemFont, "Inter", "Segoe UI", Roboto, sans-serif;
    background: radial-gradient(1200px 800px at 20% 10%, #2b5ea8 0%, #1a2a52 40%, #0c1430 100%);
    color: #f5f7fb;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 40px;
    overflow: hidden;
    position: relative;
  }
  body::before {
    content: "";
    position: absolute;
    inset: 0;
    background:
      radial-gradient(600px 400px at 85% 85%, rgba(120, 160, 255, 0.18), transparent 60%),
      radial-gradient(500px 500px at 10% 90%, rgba(255, 200, 120, 0.08), transparent 60%);
    pointer-events: none;
  }
  .card {
    position: relative;
    width: 100%;
    max-width: 1040px;
    background: linear-gradient(160deg, rgba(255,255,255,0.12), rgba(255,255,255,0.04));
    border: 1px solid rgba(255,255,255,0.18);
    border-radius: 28px;
    padding: 44px 48px 40px;
    backdrop-filter: blur(22px) saturate(160%);
    -webkit-backdrop-filter: blur(22px) saturate(160%);
    box-shadow:
      0 30px 60px -20px rgba(0,0,0,0.55),
      0 10px 30px -10px rgba(0,0,0,0.35),
      inset 0 1px 0 rgba(255,255,255,0.15);
    z-index: 1;
  }
  .header {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    margin-bottom: 28px;
  }
  .location {
    font-size: 32px;
    font-weight: 600;
    letter-spacing: -0.01em;
    color: #fff;
  }
  .sub {
    margin-top: 6px;
    font-size: 14px;
    color: rgba(245,247,251,0.65);
    letter-spacing: 0.04em;
    text-transform: uppercase;
  }
  .meta {
    text-align: right;
    font-size: 13px;
    color: rgba(245,247,251,0.6);
  }
  .meta .coord {
    font-variant-numeric: tabular-nums;
    margin-top: 4px;
  }
  .main {
    display: grid;
    grid-template-columns: 1.2fr 1fr;
    gap: 32px;
    align-items: center;
    margin-bottom: 40px;
  }
  .temp-block {
    display: flex;
    align-items: flex-start;
    gap: 20px;
  }
  .icon-wrap {
    width: 120px;
    height: 120px;
    display: flex;
    align-items: center;
    justify-content: center;
    background: radial-gradient(circle at 30% 30%, rgba(255,255,255,0.18), rgba(255,255,255,0.02));
    border-radius: 24px;
    border: 1px solid rgba(255,255,255,0.12);
    flex-shrink: 0;
  }
  .icon-wrap svg { width: 78px; height: 78px; }
  .temp-text .big {
    font-size: 96px;
    font-weight: 300;
    letter-spacing: -0.04em;
    line-height: 1;
    color: #fff;
    font-variant-numeric: tabular-nums;
  }
  .temp-text .big sup {
    font-size: 36px;
    font-weight: 400;
    vertical-align: top;
    margin-left: 4px;
    color: rgba(255,255,255,0.7);
  }
  .temp-text .cond {
    margin-top: 10px;
    font-size: 18px;
    font-weight: 500;
    color: rgba(255,255,255,0.92);
  }
  .hi-lo {
    display: flex;
    gap: 28px;
    margin-top: 18px;
  }
  .hi-lo .pill {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 10px 16px;
    background: rgba(255,255,255,0.08);
    border: 1px solid rgba(255,255,255,0.12);
    border-radius: 14px;
    font-size: 15px;
    color: #fff;
  }
  .pill .arrow {
    width: 14px;
    height: 14px;
  }
  .pill .label {
    color: rgba(245,247,251,0.6);
    margin-right: 4px;
  }
  .pill .value {
    font-variant-numeric: tabular-nums;
    font-weight: 500;
  }
  .right-panel {
    padding: 22px 24px;
    background: rgba(0,0,0,0.18);
    border: 1px solid rgba(255,255,255,0.08);
    border-radius: 20px;
  }
  .right-panel h3 {
    font-size: 12px;
    font-weight: 500;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: rgba(245,247,251,0.55);
    margin-bottom: 12px;
  }
  .stat-row {
    display: flex;
    justify-content: space-between;
    padding: 10px 0;
    border-bottom: 1px solid rgba(255,255,255,0.06);
    font-size: 14px;
  }
  .stat-row:last-child { border-bottom: none; }
  .stat-row .k { color: rgba(245,247,251,0.6); }
  .stat-row .v { color: #fff; font-variant-numeric: tabular-nums; font-weight: 500; }
  .hourly-wrap {
    position: relative;
  }
  .hourly-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: 14px;
  }
  .hourly-head h2 {
    font-size: 14px;
    font-weight: 500;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: rgba(245,247,251,0.65);
  }
  .chart {
    position: relative;
    height: 160px;
    background: rgba(0,0,0,0.15);
    border: 1px solid rgba(255,255,255,0.08);
    border-radius: 16px;
    padding: 8px 4px 28px;
    overflow: hidden;
  }
  .chart svg.line { width: 100%; height: 100%; display: block; }
  .ticks {
    position: absolute;
    left: 0; right: 0; bottom: 6px;
    display: flex;
    justify-content: space-between;
    padding: 0 18px;
    font-size: 10px;
    color: rgba(245,247,251,0.45);
    pointer-events: none;
  }
  .ticks span { width: 30px; text-align: center; font-variant-numeric: tabular-nums; }
  .hour-grid {
    margin-top: 14px;
    display: grid;
    grid-template-columns: repeat(24, 1fr);
    gap: 2px;
  }
  .hour-cell {
    text-align: center;
    padding: 8px 2px;
    border-radius: 8px;
    background: rgba(255,255,255,0.03);
    border: 1px solid transparent;
    transition: background 0.2s;
  }
  .hour-cell:hover { background: rgba(255,255,255,0.1); }
  .hour-cell .h {
    font-size: 10px;
    color: rgba(245,247,251,0.55);
    margin-bottom: 6px;
  }
  .hour-cell svg { width: 22px; height: 22px; }
  .hour-cell .t {
    margin-top: 6px;
    font-size: 12px;
    color: #fff;
    font-variant-numeric: tabular-nums;
    font-weight: 500;
  }
  .error {
    padding: 40px;
    text-align: center;
    background: rgba(200, 50, 70, 0.18);
    border: 1px solid rgba(255,120,140,0.4);
    border-radius: 20px;
    color: #ffd1d8;
    font-size: 16px;
  }
  .error .t { font-weight: 600; margin-bottom: 6px; }
  .error .m { font-size: 13px; opacity: 0.8; }
  .loader {
    display: inline-block;
    width: 14px;
    height: 14px;
    border: 2px solid rgba(255,255,255,0.3);
    border-top-color: #fff;
    border-radius: 50%;
    animation: spin 0.8s linear infinite;
    vertical-align: middle;
    margin-right: 8px;
  }
  @keyframes spin { to { transform: rotate(360deg); } }
  .footer-note {
    margin-top: 22px;
    font-size: 11px;
    color: rgba(245,247,251,0.4);
    text-align: right;
    letter-spacing: 0.04em;
  }
</style>
</head>
<body>
<div class="card" id="card">
  <div class="header">
    <div>
      <div class="location" id="loc">—</div>
      <div class="sub" id="dateLabel">—</div>
    </div>
    <div class="meta">
      <div id="source">—</div>
      <div class="coord" id="coord">—</div>
    </div>
  </div>
  <div id="content">
    <div class="loader"></div> Loading weather data…
  </div>
</div>

<script>
(function() {
  const WMO = {
    0:  { label: "Clear sky",         key: "sun" },
    1:  { label: "Mainly clear",      key: "sun" },
    2:  { label: "Partly cloudy",     key: "partly" },
    3:  { label: "Overcast",          key: "cloud" },
    45: { label: "Fog",               key: "fog" },
    48: { label: "Depositing rime fog", key: "fog" },
    51: { label: "Light drizzle",     key: "drizzle" },
    53: { label: "Moderate drizzle",  key: "drizzle" },
    55: { label: "Dense drizzle",     key: "drizzle" },
    56: { label: "Freezing drizzle",  key: "drizzle" },
    57: { label: "Dense freezing drizzle", key: "drizzle" },
    61: { label: "Slight rain",       key: "rain" },
    63: { label: "Moderate rain",     key: "rain" },
    65: { label: "Heavy rain",        key: "rain" },
    66: { label: "Freezing rain",     key: "rain" },
    67: { label: "Heavy freezing rain", key: "rain" },
    71: { label: "Slight snow",       key: "snow" },
    73: { label: "Moderate snow",     key: "snow" },
    75: { label: "Heavy snow",        key: "snow" },
    77: { label: "Snow grains",       key: "snow" },
    80: { label: "Rain showers",      key: "rain" },
    81: { label: "Moderate showers",  key: "rain" },
    82: { label: "Violent showers",   key: "rain" },
    85: { label: "Snow showers",      key: "snow" },
    86: { label: "Heavy snow showers", key: "snow" },
    95: { label: "Thunderstorm",      key: "storm" },
    96: { label: "Thunderstorm w/ hail", key: "storm" },
    99: { label: "Severe thunderstorm", key: "storm" }
  };

  const ICONS = {
    sun: `<svg viewBox="0 0 64 64" fill="none">
      <circle cx="32" cy="32" r="12" fill="#FFD76A"/>
      <g stroke="#FFD76A" stroke-width="3" stroke-linecap="round">
        <line x1="32" y1="4" x2="32" y2="12"/>
        <line x1="32" y1="52" x2="32" y2="60"/>
        <line x1="4" y1="32" x2="12" y2="32"/>
        <line x1="52" y1="32" x2="60" y2="32"/>
        <line x1="12" y1="12" x2="18" y2="18"/>
        <line x1="46" y1="46" x2="52" y2="52"/>
        <line x1="12" y1="52" x2="18" y2="46"/>
        <line x1="46" y1="18" x2="52" y2="12"/>
      </g>
    </svg>`,
    partly: `<svg viewBox="0 0 64 64" fill="none">
      <circle cx="22" cy="22" r="10" fill="#FFD76A"/>
      <g stroke="#FFD76A" stroke-width="2.5" stroke-linecap="round">
        <line x1="22" y1="4" x2="22" y2="9"/>
        <line x1="8" y1="22" x2="3" y2="22"/>
        <line x1="12" y1="12" x2="8" y2="8"/>
        <line x1="32" y1="12" x2="36" y2="8"/>
      </g>
      <path d="M22 46c-6 0-11-5-11-11 0-5.5 4-10 9.2-10.9C21.6 18.3 26.3 14 32 14c7 0 12.7 5.5 13 12.4C49.5 27.2 53 31 53 35.5 53 40.7 48.7 45 43.5 45H22z" fill="#E8EEF7" stroke="#B9C6D9" stroke-width="1.2"/>
    </svg>`,
    cloud: `<svg viewBox="0 0 64 64" fill="none">
      <path d="M18 44c-7 0-12-5.5-12-12 0-6 4.3-10.9 10-11.9C17.4 13.7 22.5 9 28.5 9 36 9 42 14.8 42.5 22 47.5 22.8 51.5 27 51.5 32.2 51.5 37.9 47 42.5 41 43H18z" fill="#D6DEE9" stroke="#A9B6C9" stroke-width="1.2"/>
    </svg>`,
    fog: `<svg viewBox="0 0 64 64" fill="none">
      <path d="M18 30c-5 0-9-4-9-9s4-9 9-9c1-5.5 5.8-10 11.5-10 6.5 0 11.8 5 12.3 11.4C46 14.2 49.5 17.8 49.5 22c0 4.8-3.7 8.5-8.3 8.8" fill="#D6DEE9" stroke="#A9B6C9" stroke-width="1.2"/>
      <g stroke="#B9C6D9" stroke-width="2.5" stroke-linecap="round">
        <line x1="8" y1="40" x2="56" y2="40"/>
        <line x1="12" y1="48" x2="52" y2="48"/>
        <line x1="10" y1="56" x2="54" y2="56"/>
      </g>
    </svg>`,
    drizzle: `<svg viewBox="0 0 64 64" fill="none">
      <path d="M18 32c-6 0-11-5-11-11 0-5.5 4-10 9.2-10.9C17.6 4.3 22.3 0 28 0c7 0 12.7 5.5 13 12.4C45.5 13.2 49 17 49 21.5 49 26.7 44.7 31 39.5 31H18z" fill="#C7D3E2" stroke="#8FA1BB" stroke-width="1.2" transform="translate(0,6)"/>
      <g stroke="#6CB8FF" stroke-width="2.5" stroke-linecap="round">
        <line x1="18" y1="48" x2="16" y2="54"/>
        <line x1="28" y1="50" x2="26" y2="56"/>
        <line x1="38" y1="48" x2="36" y2="54"/>
        <line x1="48" y1="50" x2="46" y2="56"/>
      </g>
    </svg>`,
    rain: `<svg viewBox="0 0 64 64" fill="none">
      <path d="M18 32c-6 0-11-5-11-11 0-5.5 4-10 9.2-10.9C17.6 4.3 22.3 0 28 0c7 0 12.7 5.5 13 12.4C45.5 13.2 49 17 49 21.5 49 26.7 44.7 31 39.5 31H18z" fill="#8FA5C2" stroke="#657997" stroke-width="1.2" transform="translate(0,4)"/>
      <g stroke="#3A9BFF" stroke-width="3" stroke-linecap="round">
        <line x1="16" y1="44" x2="12" y2="54"/>
        <line x1="26" y1="46" x2="22" y2="56"/>
        <line x1="36" y1="44" x2="32" y2="54"/>
        <line x1="46" y1="46" x2="42" y2="56"/>
      </g>
    </svg>`,
    snow: `<svg viewBox="0 0 64 64" fill="none">
      <path d="M18 32c-6 0-11-5-11-11 0-5.5 4-10 9.2-10.9C17.6 4.3 22.3 0 28 0c7 0 12.7 5.5 13 12.4C45.5 13.2 49 17 49 21.5 49 26.7 44.7 31 39.5 31H18z" fill="#C7D3E2" stroke="#8FA1BB" stroke-width="1.2" transform="translate(0,4)"/>
      <g fill="#E8F3FF">
        <circle cx="18" cy="48" r="3"/>
        <circle cx="30" cy="52" r="3"/>
        <circle cx="42" cy="48" r="3"/>
        <circle cx="24" cy="58" r="2.5"/>
        <circle cx="36" cy="58" r="2.5"/>
      </g>
    </svg>`,
    storm: `<svg viewBox="0 0 64 64" fill="none">
      <path d="M18 30c-6 0-11-5-11-11 0-5.5 4-10 9.2-10.9C17.6 2.3 22.3 -2 28 -2c7 0 12.7 5.5 13 12.4C45.5 11.2 49 15 49 19.5 49 24.7 44.7 29 39.5 29H18z" fill="#5A6B85" stroke="#3E4D66" stroke-width="1.2" transform="translate(0,6)"/>
      <path d="M30 36 L22 50 L28 50 L24 62 L38 46 L32 46 L36 36 Z" fill="#FFD76A" stroke="#D9A835" stroke-width="1" stroke-linejoin="round"/>
    </svg>`
  };

  const smallIcon = (key) => `<svg viewBox="0 0 64 64" fill="none">${ICONS[key].replace(/<svg[^>]*>|<\/svg>/g, '')}</svg>`;

  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 today = new Date().toISOString().slice(0, 10);
  const date = params.get("date") || today;

  document.getElementById("loc").textContent = name;
  document.getElementById("coord").textContent = `${lat.toFixed(3)}°, ${lon.toFixed(3)}°`;

  const dateObj = new Date(date + "T00:00:00Z");
  const todayObj = new Date(today + "T00:00:00Z");
  const isPast = dateObj.getTime() < todayObj.getTime();
  const endpoint = isPast ? "/api/om/archive" : "/api/om/forecast";

  const dateLabel = dateObj.toLocaleDateString(undefined, { weekday: "long", year: "numeric", month: "long", day: "numeric", timeZone: "UTC" });
  document.getElementById("dateLabel").textContent = dateLabel;
  document.getElementById("source").textContent = isPast ? "Archive" : "Forecast";

  function fmt(v) { return v === null || v === undefined || isNaN(v) ? "—" : v.toFixed(1); }
  function fmtInt(v) { return v === null || v === undefined || isNaN(v) ? "—" : Math.round(v); }

  async function load() {
    const url = `${endpoint}?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 res = await fetch(url);
    if (!res.ok) throw new Error(`HTTP ${res.status}`);
    const data = await res.json();
    return data;
  }

  function renderError(msg) {
    document.getElementById("content").innerHTML =
      `<div class="error"><div class="t">Unable to load weather data</div><div class="m">${escapeHtml(msg)}</div></div>`;
  }

  function escapeHtml(s) {
    return String(s).replace(/[&<>"']/g, c => ({ "&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;" }[c]));
  }

  function render(data) {
    const daily = data.daily || {};
    const hourly = data.hourly || {};
    const tmax = daily.temperature_2m_max?.[0];
    const tmin = daily.temperature_2m_min?.[0];
    const code = daily.weather_code?.[0];
    const hours = hourly.time || [];
    const hTemps = hourly.temperature_2m || [];
    const info = WMO[code] || { label: "Unknown", key: "cloud" };

    // Average as representative current temp
    const validTemps = hTemps.filter(t => t !== null && t !== undefined && !isNaN(t));
    const avgTemp = validTemps.length ? validTemps.reduce((a,b)=>a+b,0)/validTemps.length : (tmax!=null && tmin!=null ? (tmax+tmin)/2 : null);

    const upArrow = `<svg class="arrow" viewBox="0 0 14 14" fill="none"><path d="M7 2 L12 9 L2 9 Z" fill="#FF9B6A"/></svg>`;
    const downArrow = `<svg class="arrow" viewBox="0 0 14 14" fill="none"><path d="M7 12 L2 5 L12 5 Z" fill="#6CB8FF"/></svg>`;

    // Hourly chart SVG
    let chartSvg = "";
    if (hTemps.length === 24) {
      const vs = hTemps.map(t => (t === null || t === undefined || isNaN(t)) ? null : t);
      const vals = vs.filter(v => v !== null);
      const minV = Math.min(...vals);
      const maxV = Math.max(...vals);
      const range = Math.max(maxV - minV, 1);
      const w = 100;
      const h = 100;
      const pad = 4;
      const step = (w - pad*2) / (vs.length - 1);
      let pathD = "";
      let areaD = "";
      let first = null, lastX = 0;
      for (let i = 0; i < vs.length; i++) {
        if (vs[i] === null) continue;
        const x = pad + i * step;
        const y = pad + (1 - (vs[i] - minV) / range) * (h - pad*2);
        if (first === null) {
          first = { x, y };
          pathD += `M${x.toFixed(2)},${y.toFixed(2)}`;
          areaD += `M${x.toFixed(2)},${(h-pad).toFixed(2)} L${x.toFixed(2)},${y.toFixed(2)}`;
        } else {
          pathD += ` L${x.toFixed(2)},${y.toFixed(2)}`;
          areaD += ` L${x.toFixed(2)},${y.toFixed(2)}`;
        }
        lastX = x;
      }
      areaD += ` L${lastX.toFixed(2)},${(h-pad).toFixed(2)} Z`;
      chartSvg = `<svg class="line" viewBox="0 0 ${w} ${h}" preserveAspectRatio="none">
        <defs>
          <linearGradient id="g1" x1="0" x2="0" y1="0" y2="1">
            <stop offset="0%" stop-color="#6CB8FF" stop-opacity="0.45"/>
            <stop offset="100%" stop-color="#6CB8FF" stop-opacity="0"/>
          </linearGradient>
        </defs>
        <path d="${areaD}" fill="url(#g1)"/>
        <path d="${pathD}" fill="none" stroke="#A8D2FF" stroke-width="0.6" stroke-linejoin="round" stroke-linecap="round" vector-effect="non-scaling-stroke"/>
      </svg>`;
    }

    // Ticks
    const tickLabels = [0, 3, 6, 9, 12, 15, 18, 21];
    const ticksHtml = `<div class="ticks">${tickLabels.map(i => `<span>${String(i).padStart(2,"0")}:00</span>`).join("")}</div>`;

    // Hour grid
    const hourCells = [];
    for (let i = 0; i < 24; i++) {
      const t = hTemps[i];
      hourCells.push(`<div class="hour-cell">
        <div class="h">${String(i).padStart(2,"0")}</div>
        ${smallIcon(info.key)}
        <div class="t">${t === null || t === undefined || isNaN(t) ? "—" : Math.round(t)}°</div>
      </div>`);
    }

    const avgBlock = avgTemp !== null
      ? `<div class="temp-text">
           <div class="big">${fmt(avgTemp)}<sup>°C</sup></div>
           <div class="cond">${escapeHtml(info.label)}</div>
           <div class="hi-lo">
             <div class="pill">${upArrow}<span class="label">Hi</span><span class="value">${fmt(tmax)}°</span></div>
             <div class="pill">${downArrow}<span class="label">Lo</span><span class="value">${fmt(tmin)}°</span></div>
           </div>
         </div>`
      : `<div class="temp-text">
           <div class="big" style="font-size:40px">—<sup>°C</sup></div>
           <div class="cond">${escapeHtml(info.label)}</div>
           <div class="hi-lo">
             <div class="pill">${upArrow}<span class="label">Hi</span><span class="value">${fmt(tmax)}°</span></div>
             <div class="pill">${downArrow}<span class="label">Lo</span><span class="value">${fmt(tmin)}°</span></div>
           </div>
         </div>`;

    document.getElementById("content").innerHTML = `
      <div class="main">
        <div class="temp-block">
          <div class="icon-wrap">${ICONS[info.key]}</div>
          ${avgBlock}
        </div>
        <div class="right-panel">
          <h3>Daily summary</h3>
          <div class="stat-row"><span class="k">Maximum</span><span class="v">${fmt(tmax)} °C</span></div>
          <div class="stat-row"><span class="k">Minimum</span><span class="v">${fmt(tmin)} °C</span></div>
          <div class="stat-row"><span class="k">Average</span><span class="v">${fmt(avgTemp)} °C</span></div>
          <div class="stat-row"><span class="k">Range</span><span class="v">${(tmax!=null && tmin!=null) ? fmt(tmax-tmin) : "—"} °C</span></div>
          <div class="stat-row"><span class="k">Condition</span><span class="v">${escapeHtml(info.label)}</span></div>
        </div>
      </div>
      <div class="hourly-wrap">
        <div class="hourly-head">
          <h2>Hourly temperature</h2>
        </div>
        <div class="chart">
          ${chartSvg}
          ${ticksHtml}
        </div>
        <div class="hour-grid">${hourCells.join("")}</div>
      </div>
      <div class="footer-note">Source: Open-Meteo · ${isPast ? "historical archive" : "forecast"} · UTC</div>
    `;
  }

  load()
    .then(render)
    .catch(err => renderError(err.message || String(err)));
})();
</script>
</body>
</html>

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

bytes 总计20,289html / css / js538 / 6,514 / 13,237
dom 节点17dom 深度6
css 规则48含 js
brightness56.9contrast23.6
colorfulness45.1留白61.8%

该 slot 的 telemetry

prompt tokens337completion tokens9,044
total tokens9,381wall164.6 s
costrequest id
config.json542 B
{
  "N": 2,
  "auth": {
    "credential_ref": "WCB_OPENCODE_KEY",
    "method": "oauth"
  },
  "billing": "plan",
  "config_id": "qwen3.7-max--opencode-go--dev",
  "effort": null,
  "family": "qwen",
  "m": {
    "min": 2,
    "q": 1
  },
  "model_id": "qwen3.7-max",
  "protocol": "api",
  "served_model": "qwen3.7-max",
  "telemetry": {
    "completion_tokens": 16841,
    "cost_usd": null,
    "prompt_tokens": 993,
    "total_tokens": 17834,
    "wall_ms": 309273
  },
  "transport": "opencode-go-gateway",
  "vendor_sanction_ref": null
}
send-log2.5 KB
{
  "N": 2,
  "batch_id": "2026-07-19--go-requeue2",
  "config_id": "qwen3.7-max--opencode-go--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-07-18T21:07:58.710362+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-18T21:06:29.895055+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-18T21:09:42.733858+00:00",
          "http_status": 200,
          "outcome": "infra-failed",
          "reached_model": true,
          "reason": "mid-stream-death",
          "request_id": null,
          "started_at": "2026-07-18T21:08:02.320744+00:00"
        }
      ],
      "block_index": 0,
      "model_reaching_attempt_index": 0,
      "slot_index": 0,
      "terminal_state": "infra-failed",
      "variant": "P-q"
    },
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-07-18T21:12:27.376646+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-18T21:09:42.734593+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-18T21:13:27.300665+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-18T21:12:31.487823+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
    }
  }
}