glm-5 · go

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

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

similarity 邻居

限于 session 2026-07-19--unified

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

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

  • namematch
  • conditionmatch
  • datematch
  • max tempmatch展示值:25
  • min tempmatch展示值:16
  • hourlymatchcoverage 2/24 · 2 命中 · 0 不符 · 22 未展示
  • 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>
  :root{
    --bg:#0e1419;
    --bg2:#161e26;
    --card:#1a232e;
    --card2:#22303f;
    --ink:#f4ede0;
    --ink-dim:#a9b4c0;
    --ink-faint:#6b7480;
    --accent:#ffb14e;
    --accent2:#ff7a59;
    --cool:#7fd0e0;
    --line:rgba(255,255,255,0.08);
  }
  *{box-sizing:border-box;margin:0;padding:0}
  html,body{height:100%;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Inter,system-ui,sans-serif;color:var(--ink);background:var(--bg);overflow:hidden}
  body{
    display:flex;align-items:center;justify-content:center;
    background:
      radial-gradient(1200px 600px at 15% -10%, rgba(255,177,78,0.10), transparent 60%),
      radial-gradient(900px 500px at 110% 120%, rgba(127,208,224,0.08), transparent 60%),
      linear-gradient(135deg,#0e1419 0%,#0a1014 100%);
  }
  .stage{width:1280px;height:800px;padding:32px;display:flex;align-items:center;justify-content:center;position:relative}
  /* ambient noise */
  .stage::before{
    content:"";position:absolute;inset:0;pointer-events:none;
    background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='160'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 1  0 0 0 0 1  0 0 0 0 1  0 0 0 0.18 0'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>");
    opacity:0.5;mix-blend-mode:overlay;
  }

  .card{
    width:1180px;height:736px;
    background:linear-gradient(160deg,#1d2731 0%,#172029 60%,#141c24 100%);
    border-radius:28px;
    box-shadow:0 40px 90px -30px rgba(0,0,0,0.8),inset 0 1px 0 rgba(255,255,255,0.06);
    border:1px solid rgba(255,255,255,0.05);
    position:relative;overflow:hidden;
    display:grid;grid-template-rows:auto 1fr auto;
    padding:48px 56px 40px;
  }
  .card::before{
    content:"";position:absolute;top:-200px;right:-200px;width:520px;height:520px;border-radius:50%;
    background:radial-gradient(circle,rgba(255,177,78,0.18),transparent 60%);
    filter:blur(20px);
  }
  .card::after{
    content:"";position:absolute;bottom:-180px;left:-160px;width:480px;height:480px;border-radius:50%;
    background:radial-gradient(circle,rgba(127,208,224,0.14),transparent 60%);
    filter:blur(20px);
  }

  /* header */
  .head{position:relative;z-index:2;display:flex;justify-content:space-between;align-items:flex-start;gap:32px}
  .loc{display:flex;flex-direction:column;gap:10px}
  .eyebrow{font-size:12px;letter-spacing:0.34em;color:var(--ink-faint);text-transform:uppercase;display:flex;align-items:center;gap:10px}
  .eyebrow .dot{width:6px;height:6px;border-radius:50%;background:var(--accent);box-shadow:0 0 12px var(--accent);display:inline-block}
  .name{font-size:54px;line-height:1.02;font-weight:200;letter-spacing:-0.02em}
  .name b{font-weight:700}
  .date{font-size:14px;color:var(--ink-dim);letter-spacing:0.06em;display:flex;gap:14px;align-items:center}
  .date span{padding:4px 10px;background:rgba(255,255,255,0.04);border:1px solid var(--line);border-radius:999px}

  .cond{display:flex;align-items:center;gap:22px;text-align:right}
  .cond .glyph{width:78px;height:78px;display:flex;align-items:center;justify-content:center;color:var(--accent)}
  .cond .glyph svg{width:78px;height:78px;filter:drop-shadow(0 4px 20px rgba(255,177,78,0.35))}
  .cond .text{display:flex;flex-direction:column;gap:4px}
  .cond .label{font-size:22px;font-weight:500}
  .cond .sub{font-size:12px;color:var(--ink-faint);letter-spacing:0.22em;text-transform:uppercase}

  /* main */
  .body{position:relative;z-index:2;display:grid;grid-template-columns:380px 1fr;gap:48px;margin-top:42px}
  .tempblock{display:flex;flex-direction:column;justify-content:center;gap:8px;position:relative}
  .big{
    font-size:208px;line-height:0.86;font-weight:200;letter-spacing:-0.06em;
    background:linear-gradient(180deg,#fff5e6 0%,#ffb14e 70%,#ff7a59 100%);
    -webkit-background-clip:text;background-clip:text;color:transparent;
    position:relative;
  }
  .big .deg{font-size:84px;vertical-align:top;font-weight:300;color:var(--accent);-webkit-text-fill-color:var(--accent)}
  .minmax{display:flex;gap:24px;margin-top:18px}
  .pill{position:relative;padding:14px 22px;background:rgba(255,255,255,0.03);border:1px solid var(--line);border-radius:14px;min-width:130px}
  .pill .k{font-size:11px;letter-spacing:0.22em;text-transform:uppercase;color:var(--ink-faint)}
  .pill .v{font-size:30px;font-weight:300;margin-top:4px}
  .pill.max .v{color:var(--accent2)}
  .pill.min .v{color:var(--cool)}
  .pill::before{content:"";position:absolute;left:0;top:14px;bottom:14px;width:3px;border-radius:3px}
  .pill.max::before{background:linear-gradient(180deg,var(--accent2),transparent)}
  .pill.min::before{background:linear-gradient(180deg,var(--cool),transparent)}

  .chartwrap{display:flex;flex-direction:column;gap:18px;min-width:0}
  .chartTitle{display:flex;justify-content:space-between;align-items:baseline}
  .chartTitle h3{font-size:13px;letter-spacing:0.28em;text-transform:uppercase;color:var(--ink-faint);font-weight:500}
  .chartTitle .legend{display:flex;gap:18px;font-size:11px;color:var(--ink-dim);letter-spacing:0.1em}
  .legend i{display:inline-block;width:18px;height:2px;vertical-align:middle;margin-right:6px;border-radius:2px}
  .legend .l1 i{background:linear-gradient(90deg,var(--cool),var(--accent),var(--accent2))}
  .chart{flex:1;position:relative;background:rgba(0,0,0,0.15);border:1px solid var(--line);border-radius:18px;overflow:hidden}
  svg{display:block;width:100%;height:100%}

  .tooltip{
    position:absolute;pointer-events:none;padding:10px 14px;border-radius:10px;
    background:rgba(20,28,36,0.95);border:1px solid var(--line);
    font-size:12px;color:var(--ink);transform:translate(-50%,-130%);opacity:0;transition:opacity .15s;
    backdrop-filter:blur(6px);box-shadow:0 8px 28px rgba(0,0,0,0.6);white-space:nowrap;
  }
  .tooltip .t{color:var(--ink-faint);font-size:10px;letter-spacing:0.12em;text-transform:uppercase}
  .tooltip .v{font-size:18px;font-weight:500;color:var(--accent);margin-top:2px}

  /* footer / hours strip */
  .foot{position:relative;z-index:2;display:flex;justify-content:space-between;align-items:center;margin-top:28px;padding-top:22px;border-top:1px solid var(--line)}
  .stats{display:flex;gap:36px}
  .stat .k{font-size:10px;letter-spacing:0.24em;text-transform:uppercase;color:var(--ink-faint)}
  .stat .v{font-size:16px;margin-top:2px;color:var(--ink)}
  .stat .v b{color:var(--accent);font-weight:600}
  .sig{font-size:11px;color:var(--ink-faint);letter-spacing:0.2em;text-transform:uppercase;display:flex;align-items:center;gap:10px}
  .sig .pulse{width:8px;height:8px;border-radius:50%;background:var(--cool);box-shadow:0 0 10px var(--cool);animation:pulse 2s infinite}
  @keyframes pulse{0%,100%{opacity:1}50%{opacity:0.3}}

  /* error */
  .error{position:absolute;inset:0;display:none;align-items:center;justify-content:center;flex-direction:column;gap:14px;z-index:10;background:var(--bg2)}
  .error.show{display:flex}
  .error .icon{width:64px;height:64px;border-radius:50%;border:2px solid var(--accent2);display:flex;align-items:center;justify-content:center;color:var(--accent2);font-size:32px;font-weight:300}
  .error .t{font-size:24px;font-weight:300;letter-spacing:0.02em}
  .error .s{font-size:13px;color:var(--ink-faint);letter-spacing:0.16em;text-transform:uppercase}
  .error .retry{margin-top:18px;padding:10px 22px;background:var(--accent);color:#1a1410;border:none;border-radius:999px;font-weight:600;letter-spacing:0.1em;text-transform:uppercase;font-size:11px;cursor:pointer}

  /* loading */
  .loader{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;flex-direction:column;gap:20px;z-index:9;background:linear-gradient(160deg,#1d2731 0%,#172029 60%,#141c24 100%);border-radius:28px}
  .loader.hide{display:none}
  .spinner{width:54px;height:54px;border-radius:50%;border:2px solid rgba(255,255,255,0.1);border-top-color:var(--accent);animation:spin 0.9s linear infinite}
  @keyframes spin{to{transform:rotate(360deg)}}
  .loader .l{font-size:11px;letter-spacing:0.3em;color:var(--ink-faint);text-transform:uppercase}
</style>
</head>
<body>
<div class="stage">
  <div class="card">
    <div class="loader" id="loader">
      <div class="spinner"></div>
      <div class="l">Fetching atmosphere</div>
    </div>

    <div class="error" id="errorBox">
      <div class="icon">!</div>
      <div class="t">Weather data unavailable</div>
      <div class="s" id="errorMsg">We couldn't load forecast data</div>
      <button class="retry" onclick="location.reload()">Retry</button>
    </div>

    <div class="head">
      <div class="loc">
        <div class="eyebrow"><span class="dot"></span> Daily Atmosphere · Open-Meteo</div>
        <div class="name" id="name">Berlin</div>
        <div class="date" id="dateChip">
          <span id="dateText">—</span>
          <span id="tzText">UTC</span>
        </div>
      </div>
      <div class="cond">
        <div class="text">
          <div class="sub">Condition</div>
          <div class="label" id="condText">—</div>
        </div>
        <div class="glyph" id="condGlyph"></div>
      </div>
    </div>

    <div class="body">
      <div class="tempblock">
        <div class="big"><span id="avgTemp">—</span><span class="deg">°</span></div>
        <div class="minmax">
          <div class="pill max"><div class="k">High</div><div class="v" id="maxTemp">—</div></div>
          <div class="pill min"><div class="k">Low</div><div class="v" id="minTemp">—</div></div>
        </div>
      </div>

      <div class="chartwrap">
        <div class="chartTitle">
          <h3>Hourly Temperature · 24h</h3>
          <div class="legend"><span class="l1"><i></i>Celsius</span></div>
        </div>
        <div class="chart" id="chart">
          <svg id="svg" viewBox="0 0 700 280" preserveAspectRatio="none"></svg>
          <div class="tooltip" id="tooltip"><div class="t"></div><div class="v"></div></div>
        </div>
      </div>
    </div>

    <div class="foot">
      <div class="stats">
        <div class="stat"><div class="k">Coordinates</div><div class="v" id="coords">—</div></div>
        <div class="stat"><div class="k">Warmest Hour</div><div class="v" id="warmHr">—</div></div>
        <div class="stat"><div class="k">Coolest Hour</div><div class="v" id="coolHr">—</div></div>
        <div class="stat"><div class="k">Daily Range</div><div class="v" id="range">—</div></div>
      </div>
      <div class="sig"><span class="pulse"></span> Live atmospheric readout</div>
    </div>
  </div>
</div>

<script>
const WMO = {
  0:["Clear sky","sun"], 1:["Mainly clear","sun-cloud"], 2:["Partly cloudy","sun-cloud"], 3:["Overcast","cloud"],
  45:["Fog","fog"], 48:["Rime fog","fog"],
  51:["Light drizzle","drizzle"], 53:["Drizzle","drizzle"], 55:["Heavy drizzle","drizzle"],
  56:["Freezing drizzle","drizzle"], 57:["Freezing drizzle","drizzle"],
  61:["Slight rain","rain"], 63:["Rain","rain"], 65:["Heavy rain","rain"],
  66:["Freezing rain","rain"], 67:["Freezing rain","rain"],
  71:["Slight snow","snow"], 73:["Snow","snow"], 75:["Heavy snow","snow"], 77:["Snow grains","snow"],
  80:["Rain showers","rain"], 81:["Rain showers","rain"], 82:["Violent showers","rain"],
  85:["Snow showers","snow"], 86:["Snow showers","snow"],
  95:["Thunderstorm","storm"], 96:["Storm with hail","storm"], 99:["Storm with hail","storm"]
};

function glyph(type){
  const svgs = {
    sun:`<svg viewBox="0 0 64 64" fill="none" stroke="currentColor" stroke-width="2"><circle cx="32" cy="32" r="14"/><g stroke-linecap="round"><path d="M32 6v8M32 50v8M6 32h8M50 32h8M14 14l5 5M45 45l5 5M50 14l-5 5M19 45l-5 5"/></g></svg>`,
    "sun-cloud":`<svg viewBox="0 0 64 64" fill="none" stroke="currentColor" stroke-width="2"><circle cx="22" cy="22" r="9"/><g stroke-linecap="round"><path d="M22 6v4M22 36v4M6 22h4M34 22h4M10 10l3 3M31 31l3 3M34 10l-3 3M13 31l-3 3"/></g><path d="M20 44a9 9 0 0 1 9-9 9 9 0 0 1 8.7 7 6 6 0 0 1 .3 12H20a6 6 0 0 1 0-12z" fill="rgba(255,177,78,0.12)"/></svg>`,
    cloud:`<svg viewBox="0 0 64 64" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 44a9 9 0 0 1 9-9 9 9 0 0 1 8.7 7 6 6 0 0 1 .3 12H20a6 6 0 0 1 0-12z" fill="rgba(255,177,78,0.08)"/></svg>`,
    fog:`<svg viewBox="0 0 64 64" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M10 22h32M14 30h40M8 38h44M16 46h34M22 54h22"/></svg>`,
    drizzle:`<svg viewBox="0 0 64 64" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 32a9 9 0 0 1 9-9 9 9 0 0 1 8.7 7 6 6 0 0 1 .3 12H20a6 6 0 0 1 0-12z" fill="rgba(127,208,224,0.12)"/><g stroke-linecap="round"><path d="M22 48v4M30 48v4M38 48v4"/></g></svg>`,
    rain:`<svg viewBox="0 0 64 64" fill="none" stroke="currentColor" stroke-width="2"><path d="M16 30a9 9 0 0 1 9-9 9 9 0 0 1 8.7 7 6 6 0 0 1 .3 12H16a6 6 0 0 1 0-12z" fill="rgba(127,208,224,0.18)"/><g stroke-linecap="round"><path d="M22 46v6M30 46v6M38 46v6M46 46v6"/></g></svg>`,
    snow:`<svg viewBox="0 0 64 64" fill="none" stroke="currentColor" stroke-width="2"><path d="M16 28a9 9 0 0 1 9-9 9 9 0 0 1 8.7 7 6 6 0 0 1 .3 12H16a6 6 0 0 1 0-12z" fill="rgba(255,255,255,0.16)"/><g stroke-linecap="round"><path d="M22 48l2 4M30 46l2 6M38 48l2 4"/></g></svg>`,
    storm:`<svg viewBox="0 0 64 64" fill="none" stroke="currentColor" stroke-width="2"><path d="M16 26a9 9 0 0 1 9-9 9 9 0 0 1 8.7 7 6 6 0 0 1 .3 12H16a6 6 0 0 1 0-12z" fill="rgba(255,177,78,0.16)"/><path d="M30 38l-6 10h6l-4 8 10-12h-6l4-6z" fill="currentColor" stroke="none"/></svg>`
  };
  return svgs[type] || svgs.cloud;
}

function fmtDate(d){
  const months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
  const days=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
  return `${days[d.getUTCDay()]}, ${d.getUTCDate()} ${months[d.getUTCMonth()]} ${d.getUTCFullYear()}`;
}
function fmtHr(h){ const t=(h%24).toString().padStart(2,"0"); return `${t}:00 UTC`; }

const params = new URLSearchParams(location.search);
const lat = parseFloat(params.get("lat")) || 52.52;
const lon = parseFloat(params.get("lon")) || 13.405;
const name = params.get("name") || "Berlin";
let dateStr = params.get("date");
if(!dateStr){
  const t=new Date();
  dateStr = `${t.getUTCFullYear()}-${String(t.getUTCMonth()+1).padStart(2,"0")}-${String(t.getUTCDate()).padStart(2,"0")}`;
}
const today = new Date();
const reqDate = new Date(dateStr + "T00:00:00Z");
const isPast = reqDate.getTime() < Date.now() - 24*3600*1000;

document.getElementById("name").textContent = name;
document.getElementById("dateText").textContent = fmtDate(reqDate);
document.getElementById("coords").textContent = `${lat.toFixed(3)}°, ${lon.toFixed(3)}°`;

const endpoint = isPast ? "/api/om/archive" : "/api/om/forecast";
const qs = new URLSearchParams({
  latitude: lat, longitude: lon,
  daily: "temperature_2m_max,temperature_2m_min,weather_code",
  hourly: "temperature_2m",
  timezone: "UTC",
  temperature_unit: "celsius",
  start_date: dateStr, end_date: dateStr
});

fetch(`${endpoint}?${qs.toString()}`)
  .then(r=>{
    if(!r.ok) throw new Error(`HTTP ${r.status}`);
    return r.json();
  })
  .then(data=>{
    if(!data.daily || !data.daily.time || !data.daily.time.length)
      throw new Error("No data for this date");

    const tmax = data.daily.temperature_2m_max[0];
    const tmin = data.daily.temperature_2m_min[0];
    const wcode = data.daily.weather_code[0];
    const [condLabel, glyphType] = WMO[wcode] || ["Unknown","cloud"];

    const hours = data.hourly.time;
    const temps = data.hourly.temperature_2m;
    if(!hours || !temps || !hours.length) throw new Error("Missing hourly series");

    // fill DOM
    document.getElementById("maxTemp").textContent = `${Math.round(tmax)}°`;
    document.getElementById("minTemp").textContent = `${Math.round(tmin)}°`;
    document.getElementById("condText").textContent = condLabel;
    document.getElementById("condGlyph").innerHTML = glyph(glyphType);

    const avg = temps.reduce((a,b)=>a+b,0)/temps.length;
    document.getElementById("avgTemp").textContent = Math.round(avg);

    let warmIdx=0, coolIdx=0;
    temps.forEach((t,i)=>{ if(t>temps[warmIdx]) warmIdx=i; if(t<temps[coolIdx]) coolIdx=i; });
    document.getElementById("warmHr").innerHTML = `<b>${temps[warmIdx].toFixed(1)}°</b> · ${fmtHr(warmIdx)}`;
    document.getElementById("coolHr").innerHTML = `<b>${temps[coolIdx].toFixed(1)}°</b> · ${fmtHr(coolIdx)}`;
    document.getElementById("range").innerHTML = `<b>${(tmax-tmin).toFixed(1)}°</b> swing`;

    renderChart(temps, hours);

    document.getElementById("loader").classList.add("hide");
  })
  .catch(err=>{
    document.getElementById("loader").classList.add("hide");
    document.getElementById("errorMsg").textContent = err.message || "Unknown error";
    document.getElementById("errorBox").classList.add("show");
  });

function renderChart(temps, hours){
  const W=700, H=280, padX=24, padTop=24, padBot=36;
  const min=Math.min(...temps), max=Math.max(...temps);
  const span = Math.max(0.1, max-min);
  const xStep = (W-padX*2)/(temps.length-1);
  const y = t => padTop + (1-(t-min)/span) * (H-padTop-padBot);
  const x = i => padX + i*xStep;

  // smooth path (catmull-rom to bezier)
  const pts = temps.map((t,i)=>[x(i),y(t)]);
  function smoothPath(points){
    if(points.length<2) return `M${points[0][0]},${points[0][1]}`;
    let d=`M${points[0][0]},${points[0][1]}`;
    for(let i=0;i<points.length-1;i++){
      const p0=points[i-1]||points[i];
      const p1=points[i];
      const p2=points[i+1];
      const p3=points[i+2]||p2;
      const c1x=p1[0]+(p2[0]-p0[0])/6, c1y=p1[1]+(p2[1]-p0[1])/6;
      const c2x=p2[0]-(p3[0]-p1[0])/6, c2y=p2[1]-(p3[1]-p1[1])/6;
      d+=` C${c1x},${c1y} ${c2x},${c2y} ${p2[0]},${p2[1]}`;
    }
    return d;
  }
  const linePath = smoothPath(pts);
  const areaPath = linePath + ` L${pts[pts.length-1][0]},${H-padBot} L${pts[0][0]},${H-padBot} Z`;

  // horizontal gridlines
  let grid="";
  for(let g=0; g<=4; g++){
    const gy = padTop + (g/4)*(H-padTop-padBot);
    grid += `<line x1="${padX}" y1="${gy}" x2="${W-padX}" y2="${gy}" stroke="rgba(255,255,255,0.06)" stroke-width="1"/>`;
    const val = (max - (g/4)*span).toFixed(1);
    grid += `<text x="${padX-8}" y="${gy+4}" text-anchor="end" font-size="10" fill="rgba(255,255,255,0.28)">${val}°</text>`;
    grid += `<text x="${W-padX+8}" y="${gy+4}" text-anchor="start" font-size="10" fill="rgba(255,255,255,0.18)">${val}°</text>`;
  }
  // x-axis labels every 3 hours
  let xlabels="";
  for(let i=0;i<temps.length;i+=3){
    const hr = parseInt(hours[i].split("T")[1].slice(0,2),10);
    xlabels += `<text x="${x(i)}" y="${H-padBot+18}" text-anchor="middle" font-size="10" fill="rgba(255,255,255,0.35)" letter-spacing="1">${hr.toString().padStart(2,"0")}</text>`;
  }

  // gradient defs
  const svg = document.getElementById("svg");
  svg.setAttribute("viewBox",`0 0 ${W} ${H}`);
  svg.innerHTML = `
    <defs>
      <linearGradient id="areaGrad" x1="0" y1="0" x2="0" y2="1">
        <stop offset="0%" stop-color="#ff7a59" stop-opacity="0.55"/>
        <stop offset="50%" stop-color="#ffb14e" stop-opacity="0.25"/>
        <stop offset="100%" stop-color="#7fd0e0" stop-opacity="0.05"/>
      </linearGradient>
      <linearGradient id="lineGrad" x1="0" y1="0" x2="1" y2="0">
        <stop offset="0%" stop-color="#7fd0e0"/>
        <stop offset="50%" stop-color="#ffb14e"/>
        <stop offset="100%" stop-color="#ff7a59"/>
      </linearGradient>
      <filter id="glow"><feGaussianBlur stdDeviation="3" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge></filter>
    </defs>
    ${grid}
    ${xlabels}
    <path d="${areaPath}" fill="url(#areaGrad)"/>
    <path d="${linePath}" fill="none" stroke="url(#lineGrad)" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" filter="url(#glow)"/>
    <g id="dots"></g>
    <g id="cursor"></g>
  `;
  const dotsG = svg.querySelector("#dots");
  pts.forEach((p,i)=>{
    const c=document.createElementNS("http://www.w3.org/2000/svg","circle");
    c.setAttribute("cx",p[0]); c.setAttribute("cy",p[1]); c.setAttribute("r","3");
    c.setAttribute("fill","#1a232e"); c.setAttribute("stroke","#ffb14e"); c.setAttribute("stroke-width","1.5");
    dotsG.appendChild(c);
  });

  // interaction
  const chart=document.getElementById("chart");
  const tooltip=document.getElementById("tooltip");
  const cursor=svg.querySelector("#cursor");
  chart.addEventListener("mousemove",e=>{
    const rect=svg.getBoundingClientRect();
    const mx = (e.clientX-rect.left)/rect.width*W;
    const mf = (e.clientX-rect.left)/rect.width*W;
    let idx = Math.round((mf-padX)/xStep);
    idx = Math.max(0,Math.min(temps.length-1,idx));
    const px=x(idx), py=y(temps[idx]);
    cursor.innerHTML = `
      <line x1="${px}" y1="${padTop}" x2="${px}" y2="${H-padBot}" stroke="rgba(255,177,78,0.4)" stroke-width="1" stroke-dasharray="3 3"/>
      <circle cx="${px}" cy="${py}" r="5" fill="#ffb14e" stroke="#1a232e" stroke-width="2"/>
    `;
    const cx = (px/W)*rect.width;
    const cyPct = (py/H)*rect.height;
    tooltip.style.left = cx+"px";
    tooltip.style.top = cyPct+"px";
    tooltip.querySelector(".t").textContent = fmtHr(idx);
    tooltip.querySelector(".v").textContent = `${temps[idx].toFixed(1)}°C`;
    tooltip.style.opacity=1;
  });
  chart.addEventListener("mouseleave",()=>{
    cursor.innerHTML="";
    tooltip.style.opacity=0;
  });
}
</script>
</body>
</html>

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

bytes 总计21,739html / css / js2,604 / 8,198 / 10,937
dom 节点69dom 深度10
css 规则69含 js
brightness36.2contrast20.3
colorfulness20.0留白91.4%

该 slot 的 telemetry

prompt tokens319completion tokens7,658
total tokens7,977wall57.4 s
costrequest id
config.json530 B
{
  "N": 2,
  "auth": {
    "credential_ref": "WCB_OPENCODE_KEY",
    "method": "oauth-login"
  },
  "billing": "plan",
  "config_id": "glm-5--opencode-go--dev",
  "effort": null,
  "family": "glm",
  "m": {
    "min": 2,
    "q": 2
  },
  "model_id": "glm-5",
  "protocol": "api",
  "served_model": "glm-5",
  "telemetry": {
    "completion_tokens": 20497,
    "cost_usd": null,
    "prompt_tokens": 1260,
    "total_tokens": 21757,
    "wall_ms": 126248
  },
  "transport": "opencode-go-gateway",
  "vendor_sanction_ref": null
}
send-log2.4 KB
{
  "N": 2,
  "batch_id": "2026-07-18--dev-go-extra",
  "config_id": "glm-5--opencode-go--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-07-18T00:08:37.674925+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-18T00:08:10.008432+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-18T00:09:40.688262+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-18T00:08:43.296682+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-18T00:10:03.472533+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-18T00:09:44.320466+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-18T00:10:29.290923+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-18T00:10:07.249360+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
    }
  }
}