glm-5.3 · opencode

opencode
config
glm-5.3--cli--opencode--dev
batch
2026-07-19--unified
transport
opencode-cli-isolated-xdg-go-subscription
protocol
cli · plan
served model
glm-5.3
采集于
2026年7月18日 11:54 · N=2
variant
live
slot 1 · P-q · sandboxed iframe
glm-5.3 · opencode P-q slot 1 截图

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

similarity 邻居本 session 没有 similarity 数据 —— 这个 batch 没有计算 pairs。

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

  • namematch
  • conditionmatch
  • datematch
  • max tempmismatch展示值:9.3
  • min tempmismatch展示值:13.405
  • 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">
<title>Weather</title>
<style>
  :root{
    --accent:#7dd3fc;
    --accent-2:#bae6fd;
    --ink:#f2f6fc;
    --ink-2:rgba(242,246,252,.62);
    --ink-3:rgba(242,246,252,.42);
    --card-line:rgba(255,255,255,.14);
  }
  *{margin:0;padding:0;box-sizing:border-box}
  html,body{height:100%}
  body{
    font-family:"SF Pro Display",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
    color:var(--ink);
    background:#0a0f1e;
    overflow:hidden;
    -webkit-font-smoothing:antialiased;
  }
  .scene{
    position:relative;width:100vw;height:100vh;display:flex;align-items:center;justify-content:center;
    background:
      radial-gradient(1200px 700px at 12% -10%, color-mix(in srgb, var(--accent) 16%, transparent), transparent 60%),
      radial-gradient(1000px 700px at 105% 110%, color-mix(in srgb, var(--accent-2) 10%, transparent), transparent 60%),
      linear-gradient(160deg,#0b1122 0%,#0a0f1e 45%,#0b1424 100%);
    transition:background .8s ease;
  }
  .glow{position:absolute;border-radius:50%;filter:blur(90px);pointer-events:none;transition:background .8s ease}
  .g1{width:560px;height:560px;left:-140px;top:-160px;background:radial-gradient(circle,var(--accent) 0%,transparent 70%);opacity:.22}
  .g2{width:640px;height:640px;right:-180px;bottom:-220px;background:radial-gradient(circle,var(--accent-2) 0%,transparent 70%);opacity:.14}
  .card{
    position:relative;width:880px;max-width:94vw;border-radius:32px;padding:46px 52px 42px;
    background:linear-gradient(165deg,rgba(255,255,255,.09),rgba(255,255,255,.028) 55%);
    border:1px solid var(--card-line);
    backdrop-filter:blur(28px);-webkit-backdrop-filter:blur(28px);
    box-shadow:0 40px 90px rgba(2,6,20,.55),inset 0 1px 0 rgba(255,255,255,.09);
  }
  .hidden{display:none !important}
  .reveal{animation:rise .6s cubic-bezier(.2,.7,.2,1) both}
  @keyframes rise{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}

  header{display:flex;justify-content:space-between;align-items:flex-start;gap:24px}
  .loc{display:flex;gap:14px;align-items:flex-start}
  .loc .pin{width:22px;height:22px;margin-top:5px;color:var(--accent);flex:none}
  .loc h1{font-size:26px;font-weight:650;letter-spacing:-.01em;line-height:1.15}
  .coords{margin-top:5px;font-size:13px;color:var(--ink-3);letter-spacing:.02em;font-variant-numeric:tabular-nums}
  .date-block{text-align:right}
  .badge{
    display:inline-flex;align-items:center;gap:7px;font-size:11px;font-weight:650;letter-spacing:.14em;text-transform:uppercase;
    color:var(--accent);border:1px solid color-mix(in srgb, var(--accent) 45%, transparent);
    padding:5px 11px;border-radius:999px;background:color-mix(in srgb, var(--accent) 10%, transparent);
    margin-bottom:10px;
  }
  .badge .dot{width:6px;height:6px;border-radius:50%;background:var(--accent);box-shadow:0 0 8px var(--accent)}
  .date-str{font-size:16px;font-weight:550;color:var(--ink-2)}

  .hero{display:flex;align-items:center;gap:34px;margin:34px 0 8px}
  .hero-icon{width:104px;height:104px;flex:none;display:flex;align-items:center;justify-content:center}
  .hero-main{flex:1;min-width:0}
  .cond{font-size:30px;font-weight:680;letter-spacing:-.015em;line-height:1.1}
  .cond-sub{margin-top:7px;font-size:13.5px;color:var(--ink-3);font-variant-numeric:tabular-nums}
  .tiles{display:flex;gap:14px}
  .tile{
    min-width:132px;padding:15px 22px 13px;border-radius:20px;text-align:left;
    background:linear-gradient(180deg,rgba(255,255,255,.07),rgba(255,255,255,.03));
    border:1px solid rgba(255,255,255,.1);
  }
  .tile .lbl{display:flex;align-items:center;gap:6px;font-size:11px;font-weight:700;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-3)}
  .tile .lbl svg{width:13px;height:13px}
  .tile.hi .lbl svg{color:#f9a8a8}
  .tile.lo .lbl svg{color:#9cc8fa}
  .tile .val{display:block;margin-top:6px;font-size:44px;font-weight:250;letter-spacing:-.03em;line-height:1;font-variant-numeric:tabular-nums}
  .tile .val sup{font-size:18px;font-weight:400;color:var(--ink-3);letter-spacing:0}

  .divider{height:1px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.16),transparent);margin:30px 0 24px}

  .sec-head{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:14px}
  .sec-head h2{font-size:12px;font-weight:700;letter-spacing:.18em;text-transform:uppercase;color:var(--ink-3)}
  .sec-head span{font-size:12px;color:var(--ink-3);letter-spacing:.04em;font-variant-numeric:tabular-nums}

  .chart-wrap{position:relative;cursor:crosshair}
  .chart-wrap svg{display:block;overflow:visible}
  .tooltip{
    position:absolute;top:0;left:0;transform:translate(-50%,-130%);pointer-events:none;opacity:0;
    background:rgba(8,13,28,.92);border:1px solid rgba(255,255,255,.14);border-radius:11px;
    padding:7px 12px;font-size:12.5px;white-space:nowrap;transition:opacity .15s ease;
    box-shadow:0 10px 26px rgba(0,0,0,.45);font-variant-numeric:tabular-nums;
  }
  .tooltip b{color:var(--accent);font-weight:650}

  .loading{display:flex;flex-direction:column;align-items:center;gap:18px;padding:64px 0 48px}
  .loading p{color:var(--ink-3);font-size:14px;letter-spacing:.04em}
  .spin{
    width:34px;height:34px;border-radius:50%;
    border:3px solid rgba(255,255,255,.12);border-top-color:var(--accent);
    animation:spin 0.9s linear infinite;
  }
  @keyframes spin{to{transform:rotate(360deg)}}

  .error-box{
    margin-top:34px;padding:30px 32px;border-radius:20px;text-align:center;
    background:rgba(255,120,120,.06);border:1px solid rgba(255,140,140,.22);
  }
  .error-box .eicon{width:34px;height:34px;color:#fca5a5;margin:0 auto 14px;display:block}
  .error-box h3{font-size:19px;font-weight:650}
  .error-box p{margin-top:8px;font-size:13.5px;color:var(--ink-3);font-variant-numeric:tabular-nums}
  .retry{
    margin-top:18px;font:inherit;font-size:13.5px;font-weight:600;color:var(--ink);
    background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.18);border-radius:12px;
    padding:9px 22px;cursor:pointer;transition:background .2s ease;
  }
  .retry:hover{background:rgba(255,255,255,.15)}
</style>
</head>
<body>
<div class="scene">
  <div class="glow g1"></div>
  <div class="glow g2"></div>
  <main class="card">
    <header>
      <div class="loc">
        <svg class="pin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M20 10c0 6-8 12-8 12s-8-6-8-12a8 8 0 0 1 16 0Z"/><circle cx="12" cy="10" r="3"/></svg>
        <div>
          <h1 id="locName">—</h1>
          <div class="coords" id="coords"></div>
        </div>
      </div>
      <div class="date-block">
        <span class="badge"><span class="dot"></span><span id="srcBadge">Loading</span></span>
        <div class="date-str" id="dateStr"></div>
      </div>
    </header>

    <div id="loading" class="loading">
      <div class="spin"></div>
      <p>Fetching weather…</p>
    </div>

    <section id="summary" class="hidden">
      <div class="hero">
        <div class="hero-icon" id="wxIcon"></div>
        <div class="hero-main">
          <div class="cond" id="condTxt"></div>
          <div class="cond-sub" id="condSub"></div>
        </div>
        <div class="tiles">
          <div class="tile hi">
            <span class="lbl"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M12 19V5M5 12l7-7 7 7"/></svg>High</span>
            <span class="val"><span id="tMax">—</span><sup>°C</sup></span>
          </div>
          <div class="tile lo">
            <span class="lbl"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M12 5v14M19 12l-7 7-7-7"/></svg>Low</span>
            <span class="val"><span id="tMin">—</span><sup>°C</sup></span>
          </div>
        </div>
      </div>
      <div class="divider"></div>
      <div class="sec-head">
        <h2>Hourly temperature</h2>
        <span id="chartMeta"></span>
      </div>
      <div class="chart-wrap" id="chartWrap">
        <div class="tooltip" id="tip"></div>
      </div>
    </section>

    <div id="errorBox" class="error-box hidden">
      <svg class="eicon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="m21.73 18-8-14a2 2 0 0 0-3.46 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"/><path d="M12 9v4M12 17h.01"/></svg>
      <h3>Weather data could not be loaded</h3>
      <p id="errDetail">Something went wrong.</p>
      <button class="retry" id="retryBtn">Try again</button>
    </div>
  </main>
</div>

<script>
(function(){
  const $ = id => document.getElementById(id);
  const params = new URLSearchParams(location.search);
  const num = (v,d) => { const n = parseFloat(v); return Number.isFinite(n) ? n : d; };
  const lat = num(params.get('lat'), 52.52);
  const lon = num(params.get('lon'), 13.405);
  const name = params.get('name') || 'Berlin';
  const today = new Date().toISOString().slice(0,10);
  let date = params.get('date');
  if(!/^\d{4}-\d{2}-\d{2}$/.test(date || '')) date = today;
  const isPast = date < today;

  $('locName').textContent = name;
  document.title = name + ' · ' + date + ' — Weather';
  $('coords').textContent =
    Math.abs(lat).toFixed(3) + '° ' + (lat >= 0 ? 'N' : 'S') + ',  ' +
    Math.abs(lon).toFixed(3) + '° ' + (lon >= 0 ? 'E' : 'W');
  $('dateStr').textContent = new Date(date + 'T00:00:00Z')
    .toLocaleDateString('en-GB', {weekday:'long', day:'numeric', month:'long', year:'numeric', timeZone:'UTC'});

  const WX = {
    0:['Clear sky','clear'], 1:['Mainly clear','clear'], 2:['Partly cloudy','partly'], 3:['Overcast','cloud'],
    45:['Fog','fog'], 48:['Rime fog','fog'],
    51:['Light drizzle','drizzle'], 53:['Drizzle','drizzle'], 55:['Dense drizzle','drizzle'],
    56:['Freezing drizzle','drizzle'], 57:['Freezing drizzle','drizzle'],
    61:['Light rain','rain'], 63:['Rain','rain'], 65:['Heavy rain','rain'],
    66:['Freezing rain','rain'], 67:['Freezing rain','rain'],
    71:['Light snowfall','snow'], 73:['Snowfall','snow'], 75:['Heavy snowfall','snow'], 77:['Snow grains','snow'],
    80:['Light showers','rain'], 81:['Rain showers','rain'], 82:['Violent showers','rain'],
    85:['Snow showers','snow'], 86:['Snow showers','snow'],
    95:['Thunderstorm','storm'], 96:['Thunderstorm, hail','storm'], 99:['Thunderstorm, hail','storm']
  };
  const THEME = {
    clear:{a:'#fbbf24',b:'#fde68a'}, partly:{a:'#fcd34d',b:'#fef3c7'}, cloud:{a:'#94a3b8',b:'#cbd5e1'},
    fog:{a:'#9aa7bd',b:'#cbd5e1'}, drizzle:{a:'#38bdf8',b:'#7dd3fc'}, rain:{a:'#3b82f6',b:'#60a5fa'},
    snow:{a:'#a5f3fc',b:'#e0f2fe'}, storm:{a:'#a78bfa',b:'#c4b5fd'}
  };
  const CLOUD_CLOSED = 'M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z';
  const CLOUD_OPEN = 'M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242';
  const W = '#e9eff9';
  function icon(group, a){
    const open = (inner) =>
      `<svg viewBox="0 0 24 24" fill="none" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round">` +
      `<path stroke="${W}" d="${CLOUD_OPEN}"/>` + inner + `</svg>`;
    const rays = `<path stroke="${a}" d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/>`;
    switch(group){
      case 'clear': return `<svg viewBox="0 0 24 24" fill="none" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="4" stroke="${a}"/>${rays}</svg>`;
      case 'partly': return `<svg viewBox="0 0 24 24" fill="none" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path stroke="${a}" d="M12 2v2M4.93 4.93l1.41 1.41M20 12h2M19.07 4.93l-1.41 1.41"/><path stroke="${a}" d="M15.95 12.65a4 4 0 0 0-5.93-4.13"/><path stroke="${W}" d="M13 22H7a5 5 0 1 1 4.9-6H13a3 3 0 0 1 0 6Z"/></svg>`;
      case 'cloud': return `<svg viewBox="0 0 24 24" fill="none" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><g transform="translate(5 -4) scale(.5)"><path stroke="#b9c6da" d="${CLOUD_CLOSED}"/></g><path stroke="${W}" d="${CLOUD_CLOSED}"/></svg>`;
      case 'fog': return `<svg viewBox="0 0 24 24" fill="none" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path stroke="${W}" d="${CLOUD_CLOSED}" transform="translate(0 -2.5)"/><path stroke="${a}" d="M5 19.5h14M8 22.5h8"/></svg>`;
      case 'drizzle': return open(`<path stroke="${a}" d="M8 19v1M8 14v1M16 19v1M16 14v1M12 21v1M12 16v1"/>`);
      case 'rain': return open(`<path stroke="${a}" d="M16 14v6M8 14v6M12 16v6"/>`);
      case 'snow': return open(`<path stroke="${a}" stroke-width="2.6" d="M8 15h.01M8 19h.01M12 17h.01M12 21h.01M16 15h.01M16 19h.01"/>`);
      case 'storm': return `<svg viewBox="0 0 24 24" fill="none" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path stroke="${W}" d="${CLOUD_CLOSED}" transform="translate(0 -2)"/><path stroke="${a}" d="M13 11.5 9 17.5h5l-3.5 5.5"/></svg>`;
    }
    return open('');
  }

  function setTheme(group){
    const t = THEME[group] || THEME.cloud;
    document.documentElement.style.setProperty('--accent', t.a);
    document.documentElement.style.setProperty('--accent-2', t.b);
  }

  const state = {times:[], temps:[]};
  let hoverBind = null;

  function buildChart(times, temps){
    const wrap = $('chartWrap');
    const old = wrap.querySelector('svg');
    if(old) old.remove();
    const Wp = Math.max(wrap.clientWidth, 320), H = 250;
    const padL = 10, padR = 10, padT = 38, padB = 36;
    const vals = temps.filter(v => v != null);
    if(!vals.length) return;
    const lo = Math.min(...vals), hi = Math.max(...vals);
    const span = Math.max(hi - lo, 4);
    const y0 = lo - span * .2, y1 = hi + span * .2;
    const X = i => padL + (Wp - padL - padR) * (times.length > 1 ? i / (times.length - 1) : 0);
    const Y = v => padT + (H - padT - padB) * (1 - (v - y0) / (y1 - y0));
    const pts = [];
    temps.forEach((v,i) => { if(v != null) pts.push({x:X(i), y:Y(v), v, h:times[i].slice(11,16)}); });

    const t = THEME[curGroup] || THEME.cloud;
    let line = '';
    if(pts.length > 1){
      line = `M ${pts[0].x.toFixed(1)} ${pts[0].y.toFixed(1)}`;
      for(let i = 0; i < pts.length - 1; i++){
        const p0 = pts[Math.max(0, i-1)], p1 = pts[i], p2 = pts[i+1], p3 = pts[Math.min(pts.length-1, i+2)];
        const c1x = p1.x + (p2.x - p0.x)/6, c1y = p1.y + (p2.y - p0.y)/6;
        const c2x = p2.x - (p3.x - p1.x)/6, c2y = p2.y - (p3.y - p1.y)/6;
        line += ` C ${c1x.toFixed(1)} ${c1y.toFixed(1)} ${c2x.toFixed(1)} ${c2y.toFixed(1)} ${p2.x.toFixed(1)} ${p2.y.toFixed(1)}`;
      }
    }
    const area = line
      ? line + ` L ${pts[pts.length-1].x.toFixed(1)} ${H-padB+4} L ${pts[0].x.toFixed(1)} ${H-padB+4} Z`
      : '';

    let s = `<svg width="${Wp}" height="${H}" viewBox="0 0 ${Wp} ${H}">`;
    s += `<defs>
      <linearGradient id="lg" x1="0" y1="0" x2="1" y2="0"><stop offset="0" stop-color="${t.a}"/><stop offset="1" stop-color="${t.b}"/></linearGradient>
      <linearGradient id="ag" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="${t.a}" stop-opacity=".30"/><stop offset="1" stop-color="${t.a}" stop-opacity="0"/></linearGradient>
    </defs>`;
    for(let g = 0; g <= 4; g++){
      const gy = padT + (H - padT - padB) * g / 4;
      s += `<line x1="${padL}" x2="${Wp-padR}" y1="${gy.toFixed(1)}" y2="${gy.toFixed(1)}" stroke="rgba(255,255,255,.07)"/>`;
    }
    if(area) s += `<path d="${area}" fill="url(#ag)"/>`;
    if(line) s += `<path d="${line}" fill="none" stroke="url(#lg)" stroke-width="2.6" stroke-linecap="round" style="filter:drop-shadow(0 6px 10px ${t.a}44)"/>`;
    temps.forEach((v,i) => {
      if(v == null) return;
      if(i % 3 === 0) s += `<text x="${X(i).toFixed(1)}" y="${(Y(v)-13).toFixed(1)}" text-anchor="middle" font-size="11.5" font-weight="650" fill="rgba(255,255,255,.92)" font-family="inherit">${Math.round(v)}°</text>`;
      if(i % 3 === 0) s += `<text x="${X(i).toFixed(1)}" y="${H-9}" text-anchor="middle" font-size="11" fill="rgba(255,255,255,.42)" font-family="inherit">${times[i].slice(11,13)}</text>`;
    });
    pts.forEach(p => { s += `<circle cx="${p.x.toFixed(1)}" cy="${p.y.toFixed(1)}" r="2.2" fill="rgba(255,255,255,.88)"/>`; });
    s += `<g id="guide" visibility="hidden"><line id="gLine" y1="${padT-14}" y2="${H-padB+6}" stroke="rgba(255,255,255,.28)" stroke-dasharray="3 4"/><circle id="gDot" r="4.6" fill="${t.a}" stroke="#fff" stroke-width="2"/></g>`;
    s += `</svg>`;
    wrap.insertAdjacentHTML('beforeend', s);

    const svg = wrap.querySelector('svg');
    const guide = svg.querySelector('#guide'), gLine = svg.querySelector('#gLine'), gDot = svg.querySelector('#gDot');
    const tip = $('tip');
    svg.addEventListener('mousemove', e => {
      const r = svg.getBoundingClientRect();
      const x = e.clientX - r.left;
      let best = 0, bd = Infinity;
      pts.forEach((p,i) => { const d = Math.abs(p.x - x); if(d < bd){ bd = d; best = i; } });
      const p = pts[best];
      guide.setAttribute('visibility','visible');
      gLine.setAttribute('x1', p.x); gLine.setAttribute('x2', p.x);
      gDot.setAttribute('cx', p.x); gDot.setAttribute('cy', p.y);
      tip.innerHTML = p.h + ' UTC — <b>' + p.v.toFixed(1) + '°C</b>';
      tip.style.left = Math.min(Math.max(p.x, 52), Wp - 52) + 'px';
      tip.style.top = Math.max(p.y, 40) + 'px';
      tip.style.opacity = 1;
    });
    svg.addEventListener('mouseleave', () => {
      guide.setAttribute('visibility','hidden');
      tip.style.opacity = 0;
    });
    $('chartMeta').textContent = 'min ' + lo.toFixed(1) + '° · max ' + hi.toFixed(1) + '° · times in UTC';
  }

  let curGroup = 'cloud';
  async function load(){
    $('loading').classList.remove('hidden');
    $('summary').classList.add('hidden');
    $('errorBox').classList.add('hidden');
    $('srcBadge').textContent = 'Loading';
    try{
      const qs = new URLSearchParams({
        latitude: String(lat),
        longitude: String(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 endpoint = isPast ? '/api/om/archive' : '/api/om/forecast';
      const res = await fetch(endpoint + '?' + qs.toString());
      if(!res.ok) throw new Error('The ' + (isPast ? 'archive' : 'forecast') + ' API answered HTTP ' + res.status + ' for ' + date + '.');
      const data = await res.json();
      const d = data.daily || {}, h = data.hourly || {};
      const max = d.temperature_2m_max && d.temperature_2m_max[0];
      const min = d.temperature_2m_min && d.temperature_2m_min[0];
      const code = d.weather_code && d.weather_code[0];
      if(max == null || min == null || !Array.isArray(h.temperature_2m) || !h.time || !h.time.length){
        throw new Error('The API response did not contain complete data for this date.');
      }
      const wx = WX[code] || ['Unknown condition','cloud'];
      curGroup = wx[1];
      setTheme(curGroup);
      $('srcBadge').textContent = isPast ? 'Historical · Archive' : (date === today ? 'Forecast · Today' : 'Forecast');
      $('wxIcon').innerHTML = icon(curGroup, (THEME[curGroup] || THEME.cloud).a);
      $('wxIcon').querySelectorAll('svg').forEach(s => { s.setAttribute('width','104'); s.setAttribute('height','104'); });
      $('condTxt').textContent = wx[0];
      const spread = Math.round((max - min) * 10) / 10;
      $('condSub').textContent = 'WMO code ' + code + ' · daily range ' + spread + '° · ' + h.time.length + ' hourly values';
      $('tMax').textContent = Math.round(max);
      $('tMin').textContent = Math.round(min);
      $('loading').classList.add('hidden');
      $('summary').classList.remove('hidden');
      $('summary').classList.remove('reveal'); void $('summary').offsetWidth;
      $('summary').classList.add('reveal');
      state.times = h.time; state.temps = h.temperature_2m;
      buildChart(state.times, state.temps);
    }catch(err){
      $('loading').classList.add('hidden');
      $('summary').classList.add('hidden');
      $('errDetail').textContent = (err && err.message ? err.message : 'Unknown error.') + ' Endpoint: ' + (isPast ? '/api/om/archive' : '/api/om/forecast') + ' · ' + date;
      $('errorBox').classList.remove('hidden');
      $('errorBox').classList.remove('reveal'); void $('errorBox').offsetWidth;
      $('errorBox').classList.add('reveal');
      $('srcBadge').textContent = 'Error';
      setTheme('rain');
    }
  }

  $('retryBtn').addEventListener('click', load);
  let rto;
  window.addEventListener('resize', () => {
    clearTimeout(rto);
    rto = setTimeout(() => { if(state.times.length) buildChart(state.times, state.temps); }, 120);
  });
  load();
})();
</script>
</body>
</html>

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

bytes 总计21,095html / css / js2,735 / 6,111 / 12,249
dom 节点61dom 深度10
css 规则55含 js
brightness29.1contrast15.3
colorfulness18.4留白84.4%

该 slot 的 telemetry

prompt tokens0completion tokens0
total tokens0wall257.7 s
costrequest id
config.json559 B
{
  "N": 2,
  "auth": {
    "credential_ref": "WCB_OPENCODE_KEY",
    "method": "oauth-login"
  },
  "billing": "plan",
  "config_id": "glm-5.3--cli--opencode--dev",
  "effort": null,
  "family": "glm",
  "m": {
    "min": 2,
    "q": 1
  },
  "model_id": "glm-5.3",
  "protocol": "cli",
  "served_model": "glm-5.3",
  "telemetry": {
    "completion_tokens": null,
    "cost_usd": null,
    "prompt_tokens": null,
    "total_tokens": null,
    "wall_ms": 1083214
  },
  "transport": "opencode-cli-isolated-xdg-go-subscription",
  "vendor_sanction_ref": null
}
send-log2.5 KB
{
  "N": 2,
  "batch_id": "2026-08-22--opencode-cli-new",
  "config_id": "glm-5.3--cli--opencode--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-08-21T14:23:35.481185+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-21T14:17:53.335049+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-08-21T14:25:35.509340+00:00",
          "http_status": null,
          "outcome": "infra-failed",
          "reached_model": true,
          "reason": "mid-stream-death",
          "request_id": null,
          "started_at": "2026-08-21T14:23:41.022446+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-08-21T14:29:53.183506+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-21T14:25:35.510183+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-08-21T14:38:00.130096+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-21T14:29:56.725644+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
    }
  }
}