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

截图是 similarity 通道测量时的原始像素。运行 live 会在 sandboxed iframe 中重新执行原始输出;渲染结果取决于你的浏览器和字体,不保证与测量像素一致。
similarity 邻居
最近
claude-sonnet-4-6 @max · kiro0.66claude-sonnet-4-6 @high · kiro0.64claude-opus-4-8 @low · kiro0.63claude-sonnet-4-6 @low · kiro0.63claude-sonnet-4-6 @medium · kiro0.63最远
gpt-5.6-sol @max · codex-oauth0.44minimax-m2.7 · go0.45kimi-k2.6 · go0.45gpt-5.6-luna @low · codex-oauth0.45claude-sonnet-5 @xhigh · CC0.45限于 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,739 | html / css / js | 2,604 / 8,198 / 10,937 |
|---|---|---|---|
| dom 节点 | 69 | dom 深度 | 10 |
| css 规则 | 69 | 含 js | 是 |
| brightness | 36.2 | contrast | 20.3 |
| colorfulness | 20.0 | 留白 | 91.4% |
该 slot 的 telemetry
| prompt tokens | 319 | completion tokens | 7,658 |
|---|---|---|---|
| total tokens | 7,977 | wall | 57.4 s |
| cost | — | request 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
}
}
}