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

截图是 similarity 通道测量时的原始像素。运行 live 会在 sandboxed iframe 中重新执行原始输出;渲染结果取决于你的浏览器和字体,不保证与测量像素一致。
similarity 邻居
最近
claude-opus-4-6 @max · kiro0.77claude-opus-4-6 @low · kiro0.73claude-opus-4-8 @high · kiro0.70claude-opus-4-8 @low · kiro0.70gemini-3.1-pro-preview @high · api0.70最远
gpt-5.6-luna @low · codex-oauth0.41gpt-5.6-luna @high · kiro0.42claude-haiku-4-5 @medium · CC0.42qwen3.5-plus · go0.44minimax-m2.5 · go0.44限于 session 2026-07-19--unified
similarity 衡量本 session 内的趋同程度 —— 不是质量。
Fidelity —— 卡片展示的数据对不对?
- namematch
- conditionmatch
- datematch
- max tempambiguousno-remaining-candidate
- min tempmatch展示值:16
- hourlyambiguouscoverage · 0 命中 · 0 不符 · 24 未展示
- request sidematch0 处违规
extractor fidelity-extractor-v1+Berlin-2026-07-15
源码 —— 原始模型输出,一字节未改
下载 card.html<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=1280, initial-scale=1">
<title>Weather Card</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
html, body {
width: 1280px;
height: 800px;
overflow: hidden;
font-family: -apple-system, BlinkMacSystemFont, "SF Pro Display", "Segoe UI", "Helvetica Neue", Arial, sans-serif;
background: #0f172a;
color: #e2e8f0;
-webkit-font-smoothing: antialiased;
}
.stage {
width: 1280px;
height: 800px;
display: flex;
align-items: center;
justify-content: center;
background:
radial-gradient(1200px 600px at 20% 0%, rgba(99,102,241,0.25), transparent 60%),
radial-gradient(900px 500px at 100% 100%, rgba(56,189,248,0.18), transparent 60%),
linear-gradient(160deg, #0b1224 0%, #131a2e 50%, #0f172a 100%);
}
.card {
width: 1180px;
height: 700px;
border-radius: 28px;
background: linear-gradient(160deg, rgba(30,41,59,0.85) 0%, rgba(15,23,42,0.85) 100%);
border: 1px solid rgba(148,163,184,0.15);
box-shadow: 0 30px 80px -20px rgba(0,0,0,0.7), inset 0 1px 0 rgba(255,255,255,0.05);
display: grid;
grid-template-rows: auto 1fr auto;
padding: 40px 48px 32px;
position: relative;
overflow: hidden;
}
.card::before {
content: "";
position: absolute;
inset: 0;
background: radial-gradient(800px 400px at 85% -10%, rgba(99,102,241,0.18), transparent 60%);
pointer-events: none;
}
.header {
display: flex;
justify-content: space-between;
align-items: flex-start;
position: relative;
z-index: 1;
}
.loc-name {
font-size: 34px;
font-weight: 700;
letter-spacing: -0.02em;
background: linear-gradient(180deg, #fff, #cbd5e1);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
.loc-date {
margin-top: 6px;
font-size: 15px;
color: #94a3b8;
letter-spacing: 0.03em;
}
.condition-badge {
display: flex;
align-items: center;
gap: 14px;
padding: 12px 20px;
border-radius: 999px;
background: rgba(30,41,59,0.6);
border: 1px solid rgba(148,163,184,0.2);
backdrop-filter: blur(8px);
}
.icon {
width: 44px;
height: 44px;
flex: 0 0 44px;
}
.condition-text {
font-size: 18px;
font-weight: 600;
color: #e2e8f0;
}
.body {
display: grid;
grid-template-columns: 1fr 1.15fr;
gap: 40px;
padding: 28px 0 10px;
position: relative;
z-index: 1;
}
.left {
display: flex;
flex-direction: column;
justify-content: center;
}
.temps {
display: flex;
align-items: baseline;
gap: 28px;
}
.t-max {
font-size: 128px;
font-weight: 200;
line-height: 1;
background: linear-gradient(180deg, #fef3c7, #fbbf24);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
letter-spacing: -0.05em;
}
.t-max .deg {
font-size: 64px;
font-weight: 300;
vertical-align: super;
margin-left: 4px;
}
.t-min {
font-size: 40px;
font-weight: 300;
color: #7dd3fc;
letter-spacing: -0.02em;
}
.t-min .lbl {
font-size: 14px;
color: #94a3b8;
display: block;
margin-bottom: 4px;
letter-spacing: 0.08em;
text-transform: uppercase;
font-weight: 500;
}
.right {
display: flex;
flex-direction: column;
}
.panel-title {
font-size: 13px;
text-transform: uppercase;
letter-spacing: 0.12em;
color: #94a3b8;
font-weight: 600;
margin-bottom: 16px;
}
.chart-wrap {
flex: 1;
position: relative;
min-height: 0;
}
.footer {
display: flex;
justify-content: space-between;
align-items: center;
padding-top: 18px;
border-top: 1px solid rgba(148,163,184,0.12);
position: relative;
z-index: 1;
}
.footer .meta {
font-size: 12px;
color: #64748b;
letter-spacing: 0.06em;
}
.err {
text-align: center;
color: #fca5a5;
font-size: 20px;
font-weight: 500;
padding: 60px;
}
.err small {
display: block;
margin-top: 10px;
font-size: 14px;
color: #94a3b8;
font-weight: 400;
}
.skeleton {
background: linear-gradient(90deg, rgba(148,163,184,0.06), rgba(148,163,184,0.16), rgba(148,163,184,0.06));
background-size: 200% 100%;
animation: shimmer 1.4s infinite;
border-radius: 8px;
}
@keyframes shimmer {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
</style>
</head>
<body>
<div class="stage">
<div class="card" id="card">
<div id="content"></div>
</div>
</div>
<script>
(function () {
"use strict";
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 date = params.get("date");
if (!date) {
const d = new Date();
date = d.toISOString().slice(0, 10);
}
const root = document.getElementById("content");
const card = document.getElementById("card");
renderSkeleton();
const isPast = date < todayUTC();
const endpoint = (isPast ? "/api/om/archive" : "/api/om/forecast");
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
});
fetch(`${endpoint}?${qs.toString()}`)
.then(r => {
if (!r.ok) throw new Error("HTTP " + r.status);
return r.json();
})
.then(d => render(d, name, date))
.catch(err => renderError(err));
function todayUTC() {
const d = new Date();
return d.toISOString().slice(0, 10);
}
function renderSkeleton() {
card.innerHTML = `
<div class="header">
<div>
<div class="skeleton" style="width:260px;height:36px"></div>
<div class="skeleton" style="width:140px;height:18px;margin-top:10px"></div>
</div>
<div class="skeleton" style="width:200px;height:68px;border-radius:999px"></div>
</div>
<div class="body">
<div class="left">
<div class="skeleton" style="width:320px;height:128px"></div>
<div class="skeleton" style="width:180px;height:48px;margin-top:24px"></div>
</div>
<div class="right">
<div class="skeleton" style="width:160px;height:16px;margin-bottom:18px"></div>
<div class="skeleton" style="flex:1"></div>
</div>
</div>
<div class="footer">
<div class="skeleton" style="width:240px;height:14px"></div>
<div class="skeleton" style="width:120px;height:14px"></div>
</div>`;
}
function renderError(err) {
card.innerHTML = `
<div class="err">
Unable to load weather data
<small>${escapeHtml(String(err && err.message ? err.message : err))}</small>
</div>`;
}
function render(d, name, date) {
if (!d || !d.daily || !d.hourly) {
renderError(new Error("Malformed API response"));
return;
}
const tMax = d.daily.temperature_2m_max && d.daily.temperature_2m_max[0];
const tMin = d.daily.temperature_2m_min && d.daily.temperature_2m_min[0];
const code = d.daily.weather_code && d.daily.weather_code[0];
const hours = d.hourly.time || [];
const temps = d.hourly.temperature_2m || [];
if (tMax == null || tMin == null || code == null) {
renderError(new Error("Missing daily data for requested date"));
return;
}
const cond = weatherLabel(code);
const condIcon = weatherIcon(code);
const pairs = [];
for (let i = 0; i < hours.length; i++) {
if (hours[i] && hours[i].slice(0, 10) === date) {
pairs.push({ h: Number(hours[i].slice(11, 13)), t: temps[i] });
}
}
if (pairs.length === 0) {
renderError(new Error("No hourly data for requested date"));
return;
}
card.innerHTML = `
<div class="header">
<div>
<div class="loc-name">${escapeHtml(name)}</div>
<div class="loc-date">${escapeHtml(formatDate(date))}</div>
</div>
<div class="condition-badge">
${condIcon}
<div class="condition-text">${escapeHtml(cond)}</div>
</div>
</div>
<div class="body">
<div class="left">
<div class="temps">
<div class="t-max">${formatTemp(tMax)}<span class="deg">°</span></div>
<div class="t-min">
<span class="lbl">Low</span>
${formatTemp(tMin)}°
</div>
</div>
</div>
<div class="right">
<div class="panel-title">Hourly temperature · °C</div>
<div class="chart-wrap">
<canvas id="hourly"></canvas>
</div>
</div>
</div>
<div class="footer">
<div class="meta">${pairs.length} hourly readings · UTC</div>
<div class="meta">${isPast ? "Archive API" : "Forecast API"} · Open-Meteo</div>
</div>`;
drawChart(document.getElementById("hourly"), pairs);
}
function drawChart(canvas, pairs) {
const wrap = canvas.parentElement;
const W = wrap.clientWidth;
const H = wrap.clientHeight;
const dpr = window.devicePixelRatio || 1;
canvas.width = W * dpr;
canvas.height = H * dpr;
canvas.style.width = W + "px";
canvas.style.height = H + "px";
const ctx = canvas.getContext("2d");
ctx.scale(dpr, dpr);
const padL = 32, padR = 14, padT = 18, padB = 28;
const cw = W - padL - padR;
const ch = H - padT - padB;
const xs = pairs.map(p => p.h);
const ys = pairs.map(p => p.t);
const ymin = Math.min(...ys);
const ymax = Math.max(...ys);
const range = (ymax - ymin) || 1;
const pad = range * 0.18;
const lo = ymin - pad;
const hi = ymax + pad;
const span = hi - lo;
const X = h => padL + ((h - xs[0]) / 23) * cw;
const Y = t => padT + (1 - (t - lo) / span) * ch;
// gridlines
ctx.strokeStyle = "rgba(148,163,184,0.12)";
ctx.lineWidth = 1;
ctx.font = "11px -apple-system, sans-serif";
ctx.fillStyle = "#64748b";
ctx.textBaseline = "middle";
const steps = 4;
for (let i = 0; i <= steps; i++) {
const t = lo + (span * i) / steps;
const y = Y(t);
ctx.beginPath();
ctx.moveTo(padL, y);
ctx.lineTo(W - padR, y);
ctx.stroke();
ctx.textAlign = "right";
ctx.fillText(Math.round(t) + "°", padL - 8, y);
}
// x labels (0, 6, 12, 18, 23)
ctx.textAlign = "center";
ctx.textBaseline = "top";
[0, 6, 12, 18, 23].forEach(h => {
const x = X(h);
ctx.fillText(String(h).padStart(2, "0"), x, padT + ch + 8);
});
// smooth area
const pts = pairs.map(p => ({ x: X(p.h), y: Y(p.t) }));
const grad = ctx.createLinearGradient(0, padT, 0, padT + ch);
grad.addColorStop(0, "rgba(251,191,36,0.45)");
grad.addColorStop(1, "rgba(251,191,36,0.02)");
ctx.beginPath();
ctx.moveTo(pts[0].x, padT + ch);
ctx.lineTo(pts[0].x, pts[0].y);
for (let i = 1; i < pts.length; i++) {
const p0 = pts[i - 1], p1 = pts[i];
const cx = (p0.x + p1.x) / 2;
ctx.bezierCurveTo(cx, p0.y, cx, p1.y, p1.x, p1.y);
}
ctx.lineTo(pts[pts.length - 1].x, padT + ch);
ctx.closePath();
ctx.fillStyle = grad;
ctx.fill();
// line
ctx.beginPath();
ctx.moveTo(pts[0].x, pts[0].y);
for (let i = 1; i < pts.length; i++) {
const p0 = pts[i - 1], p1 = pts[i];
const cx = (p0.x + p1.x) / 2;
ctx.bezierCurveTo(cx, p0.y, cx, p1.y, p1.x, p1.y);
}
ctx.strokeStyle = "#fbbf24";
ctx.lineWidth = 2.5;
ctx.lineJoin = "round";
ctx.lineCap = "round";
ctx.shadowColor = "rgba(251,191,36,0.4)";
ctx.shadowBlur = 10;
ctx.stroke();
ctx.shadowBlur = 0;
// peak marker
let maxIdx = 0, minIdx = 0;
ys.forEach((y, i) => { if (y > ys[maxIdx]) maxIdx = i; if (y < ys[minIdx]) minIdx = i; });
drawDot(ctx, pts[maxIdx], ys[maxIdx], "#fde68a");
drawDot(ctx, pts[minIdx], ys[minIdx], "#7dd3fc");
}
function drawDot(ctx, p, val, color) {
ctx.beginPath();
ctx.arc(p.x, p.y, 4, 0, Math.PI * 2);
ctx.fillStyle = color;
ctx.fill();
ctx.strokeStyle = "rgba(15,23,42,0.8)";
ctx.lineWidth = 2;
ctx.stroke();
ctx.fillStyle = "#e2e8f0";
ctx.font = "600 11px -apple-system, sans-serif";
ctx.textAlign = "center";
ctx.textBaseline = "bottom";
ctx.fillText(Math.round(val) + "°", p.x, p.y - 8);
}
function formatTemp(v) {
return Math.round(v).toString();
}
function formatDate(yyyymmdd) {
const d = new Date(yyyymmdd + "T00:00:00Z");
return d.toLocaleDateString("en-US", {
weekday: "long", year: "numeric", month: "long", day: "numeric", timeZone: "UTC"
});
}
function escapeHtml(s) {
return String(s).replace(/[&<>"']/g, c => ({
"&": "&", "<": "<", ">": ">", '"': """, "'": "'"
}[c]));
}
function weatherLabel(code) {
if (code === 0) return "Clear sky";
if (code === 1) return "Mainly clear";
if (code === 2) return "Partly cloudy";
if (code === 3) return "Overcast";
if (code === 45 || code === 48) return "Fog";
if (code >= 51 && code <= 57) return "Drizzle";
if (code >= 61 && code <= 67) return "Rain";
if (code >= 71 && code <= 77) return "Snow";
if (code >= 80 && code <= 82) return "Rain showers";
if (code >= 85 && code <= 86) return "Snow showers";
if (code === 95) return "Thunderstorm";
if (code >= 96) return "Thunderstorm with hail";
return "Unknown";
}
function weatherIcon(code) {
const stroke = "#e2e8f0";
if (code === 0) return svgSun(stroke);
if (code <= 2) return svgSunCloud(stroke);
if (code === 3) return svgCloud(stroke);
if (code === 45 || code === 48) return svgFog(stroke);
if (code >= 51 && code <= 67) return svgRain(stroke);
if (code >= 71 && code <= 77) return svgSnow(stroke);
if (code >= 80 && code <= 86) return svgRain(stroke);
if (code >= 95) return svgStorm(stroke);
return svgCloud(stroke);
}
function svgSun(c) {
return `<svg class="icon" viewBox="0 0 48 48" fill="none" stroke="${c}" stroke-width="2.4" stroke-linecap="round">
<circle cx="24" cy="24" r="9" fill="rgba(251,191,36,0.25)" stroke="#fbbf24"/>
<g stroke="#fbbf24">
<line x1="24" y1="6" x2="24" y2="11"/><line x1="24" y1="37" x2="24" y2="42"/>
<line x1="6" y1="24" x2="11" y2="24"/><line x1="37" y1="24" x2="42" y2="24"/>
<line x1="11.3" y1="11.3" x2="14.8" y2="14.8"/><line x1="33.2" y1="33.2" x2="36.7" y2="36.7"/>
<line x1="36.7" y1="11.3" x2="33.2" y2="14.8"/><line x1="14.8" y1="33.2" x2="11.3" y2="36.7"/>
</g></svg>`;
}
function svgCloud(c) {
return `<svg class="icon" viewBox="0 0 48 48" fill="none" stroke="#cbd5e1" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round">
<path d="M14 33h22a8 8 0 0 0 0-16 11 11 0 0 0-21-3 7 7 0 0 0-1 19z" fill="rgba(148,163,184,0.25)"/></svg>`;
}
function svgSunCloud(c) {
return `<svg class="icon" viewBox="0 0 48 48" fill="none" stroke="#cbd5e1" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="17" cy="17" r="6" fill="rgba(251,191,36,0.25)" stroke="#fbbf24"/>
<g stroke="#fbbf24"><line x1="17" y1="5" x2="17" y2="8"/><line x1="5" y1="17" x2="8" y2="17"/><line x1="8.5" y1="8.5" x2="10.6" y2="10.6"/><line x1="25.5" y1="8.5" x2="23.4" y2="10.6"/></g>
<path d="M18 38h16a7 7 0 0 0 0-14 10 10 0 0 0-19 2 6 6 0 0 0-3 12z" fill="rgba(148,163,184,0.25)"/></svg>`;
}
function svgFog(c) { return `<svg class="icon" viewBox="0 0 48 48" fill="none" stroke="#cbd5e1" stroke-width="2.4" stroke-linecap="round">
<path d="M14 28h22a7 7 0 0 0 0-14 11 11 0 0 0-21-3 7 7 0 0 0-1 17z" fill="rgba(148,163,184,0.22)"/>
<line x1="10" y1="34" x2="38" y2="34"/><line x1="14" y1="40" x2="34" y2="40"/></svg>`; }
function svgRain(c) { return `<svg class="icon" viewBox="0 0 48 48" fill="none" stroke="#7dd3fc" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round">
<path d="M14 26h22a8 8 0 0 0 0-16 11 11 0 0 0-21-3 7 7 0 0 0-1 19z" fill="rgba(148,163,184,0.25)" stroke="#cbd5e1"/>
<line x1="16" y1="33" x2="13" y2="40"/><line x1="24" y1="33" x2="21" y2="40"/><line x1="32" y1="33" x2="29" y2="40"/></svg>`; }
function svgSnow(c) { return `<svg class="icon" viewBox="0 0 48 48" fill="none" stroke="#e0f2fe" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round">
<path d="M14 26h22a8 8 0 0 0 0-16 11 11 0 0 0-21-3 7 7 0 0 0-1 19z" fill="rgba(148,163,184,0.25)" stroke="#cbd5e1"/>
<circle cx="16" cy="37" r="1.5" fill="#e0f2fe"/><circle cx="24" cy="39" r="1.5" fill="#e0f2fe"/><circle cx="32" cy="37" r="1.5" fill="#e0f2fe"/></svg>`; }
function svgStorm(c) { return `<svg class="icon" viewBox="0 0 48 48" fill="none" stroke="#c4b5fd" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round">
<path d="M14 26h22a8 8 0 0 0 0-16 11 11 0 0 0-21-3 7 7 0 0 0-1 19z" fill="rgba(148,163,184,0.25)" stroke="#cbd5e1"/>
<path d="M24 30l-5 9h5l-2 7 7-11h-5l2-5z" fill="rgba(251,191,36,0.5)" stroke="#fbbf24" stroke-width="1.4"/></svg>`; }
})();
</script>
</body>
</html>L1 —— 廉价的确定性描述量
| bytes 总计 | 17,551 | html / css / js | 312 / 4,444 / 12,795 |
|---|---|---|---|
| dom 节点 | 11 | dom 深度 | 5 |
| css 规则 | 29 | 含 js | 是 |
| brightness | 34.9 | contrast | 14.8 |
| colorfulness | 23.5 | 留白 | 86.0% |
该 slot 的 telemetry
| prompt tokens | 0 | completion tokens | 0 |
|---|---|---|---|
| total tokens | 0 | wall | 122.3 s |
| cost | — | request id | — |
config.json558 B
{
"N": 2,
"auth": {
"credential_ref": "WCB_OPENCODE_KEY",
"method": "oauth-login"
},
"billing": "plan",
"config_id": "glm-5.1--cli--opencode--dev",
"effort": null,
"family": "glm",
"m": {
"min": 2,
"q": 1
},
"model_id": "glm-5.1",
"protocol": "cli",
"served_model": "glm-5.1",
"telemetry": {
"completion_tokens": null,
"cost_usd": null,
"prompt_tokens": null,
"total_tokens": null,
"wall_ms": 334026
},
"transport": "opencode-cli-isolated-xdg-go-subscription",
"vendor_sanction_ref": null
}send-log2.5 KB
{
"N": 2,
"batch_id": "2026-07-18--dev-opencode-cli",
"config_id": "glm-5.1--cli--opencode--dev",
"positions": [
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-07-17T14:39:56.326135+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-17T14:37:54.040140+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-17T14:41:51.584565+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-17T14:40:00.165352+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-17T14:43:35.609011+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-17T14:41:55.284413+00:00"
}
],
"block_index": 1,
"model_reaching_attempt_index": 0,
"slot_index": 1,
"terminal_state": "valid",
"variant": "P-min"
},
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-07-17T14:45:20.231360+00:00",
"http_status": null,
"outcome": "infra-failed",
"reached_model": true,
"reason": "mid-stream-death",
"request_id": null,
"started_at": "2026-07-17T14:43:39.389606+00:00"
}
],
"block_index": 1,
"model_reaching_attempt_index": 0,
"slot_index": 1,
"terminal_state": "infra-failed",
"variant": "P-q"
}
],
"retry_policy": {
"max_unreachable_retries": 5,
"rate_limit_backoff": {
"max_attempts": 4,
"max_total_ms": 60000
}
}
}