claude-opus-5 @ medium · cursor-xl
cursor-xlmedium
- config
- claude-opus-5-eff-medium--cli--cursor-xl--dev
- batch
- 2026-07-19--unified
- transport
- cursor-agent-cli-isolated-home
- protocol
- cli · plan
- served model
- claude-opus-5-medium
- 采集于
- 2026年7月18日 11:54 · N=2
variant
live
slot 0 · P-q · sandboxed iframe

截图是 similarity 通道测量时的原始像素。运行 live 会在 sandboxed iframe 中重新执行原始输出;渲染结果取决于你的浏览器和字体,不保证与测量像素一致。
similarity 邻居
最近
claude-opus-5 @xhigh · CC0.68claude-opus-5-thinking @medium · cursor-xl0.68claude-opus-5 @medium · CC0.68claude-opus-5-thinking @low · cursor0.67claude-fable-5-thinking @high · cursor0.67最远
qwen3.6-plus · go0.50gemini-3.1-pro @low · agy0.53claude-sonnet-4-6-thinking @medium · cursor0.53claude-sonnet-4 · kiro0.53deepseek-v4-pro-0812 @high · api0.53限于 session 2026-07-19--unified
similarity 衡量本 session 内的趋同程度 —— 不是质量。
Fidelity —— 卡片展示的数据对不对?
- namematch
- conditionmatch
- datematch
- max tempmismatch展示值:21.2
- min tempmismatch展示值:9.3
- hourlymismatchcoverage 0/24 · 0 命中 · 8 不符 · 16 未展示
- 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>
:root{
--bg-a:#0b1220;
--bg-b:#131f38;
--accent:#7dd3fc;
--accent-2:#a78bfa;
--ink:#f4f8ff;
--muted:rgba(228,238,255,.62);
--faint:rgba(228,238,255,.34);
--line:rgba(255,255,255,.10);
--card:rgba(255,255,255,.055);
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}
body{
min-height:100vh;
display:flex;align-items:center;justify-content:center;
padding:40px;
font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Inter,Roboto,Helvetica,Arial,sans-serif;
color:var(--ink);
background:
radial-gradient(1100px 700px at 12% -10%, rgba(125,211,252,.20), transparent 60%),
radial-gradient(900px 620px at 92% 8%, rgba(167,139,250,.18), transparent 62%),
radial-gradient(800px 600px at 60% 120%, rgba(56,189,248,.12), transparent 60%),
linear-gradient(160deg,var(--bg-a),var(--bg-b) 55%,#0a1striped 100%),
linear-gradient(160deg,var(--bg-a),var(--bg-b));
-webkit-font-smoothing:antialiased;
}
body::after{
content:"";position:fixed;inset:0;pointer-events:none;
background-image:radial-gradient(rgba(255,255,255,.045) 1px, transparent 1px);
background-size:3px 3px;mix-blend-mode:overlay;
}
.card{
position:relative;
width:1160px;
border-radius:28px;
padding:38px 44px 34px;
background:linear-gradient(180deg, rgba(255,255,255,.085), rgba(255,255,255,.035));
border:1px solid var(--line);
box-shadow:
0 1px 0 rgba(255,255,255,.14) inset,
0 40px 90px -30px rgba(3,7,18,.85),
0 0 0 1px rgba(3,7,18,.35);
backdrop-filter:blur(18px) saturate(120%);
overflow:hidden;
}
.card::before{
content:"";position:absolute;inset:-1px;border-radius:inherit;pointer-events:none;
background:linear-gradient(115deg, rgba(255,255,255,.22), transparent 32%, transparent 70%, rgba(255,255,255,.09));
-webkit-mask:linear-gradient(#000,#000) content-box, linear-gradient(#000,#000);
-webkit-mask-composite:xor;mask-composite:exclude;padding:1px;
}
.glow{
position:absolute;width:520px;height:520px;border-radius:50%;
filter:blur(90px);opacity:.5;pointer-events:none;
background:radial-gradient(circle at center, var(--accent), transparent 65%);
top:-300px;right:-140px;
}
/* ---------- header ---------- */
header{display:flex;align-items:flex-start;justify-content:space-between;gap:24px;position:relative}
.eyebrow{
font-size:11px;letter-spacing:.20em;text-transform:uppercase;
color:var(--faint);font-weight:600;margin-bottom:10px;
display:flex;align-items:center;gap:9px;
}
.eyebrow .dot{width:6px;height:6px;border-radius:50%;background:var(--accent);box-shadow:0 0 10px var(--accent)}
h1{font-size:40px;line-height:1.05;font-weight:680;letter-spacing:-.022em}
.coords{margin-top:9px;font-size:12.5px;color:var(--faint);font-variant-numeric:tabular-nums;letter-spacing:.02em}
.datebox{text-align:right;flex:none}
.datebox .dow{font-size:13px;color:var(--muted);letter-spacing:.10em;text-transform:uppercase;font-weight:600}
.datebox .full{font-size:22px;font-weight:600;margin-top:6px;letter-spacing:-.01em}
.datebox .iso{font-size:12px;color:var(--faint);margin-top:6px;font-variant-numeric:tabular-nums}
/* ---------- hero ---------- */
.hero{
margin-top:32px;display:grid;grid-template-columns:auto 1fr auto;
align-items:center;gap:40px;
}
.icon-wrap{
width:150px;height:150px;flex:none;display:grid;place-items:center;
border-radius:32px;
background:linear-gradient(160deg, rgba(255,255,255,.11), rgba(255,255,255,.03));
border:1px solid var(--line);
box-shadow:0 20px 50px -24px rgba(0,0,0,.8), 0 1px 0 rgba(255,255,255,.12) inset;
}
.icon-wrap svg{width:96px;height:96px;overflow:visible}
.readout{min-width:0}
.temps{display:flex;align-items:flex-start;gap:34px}
.tblock .lab{
font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:var(--faint);font-weight:650;
}
.tblock .val{
display:flex;align-items:flex-start;
font-weight:300;letter-spacing:-.045em;line-height:.92;
font-variant-numeric:tabular-nums;margin-top:8px;
}
.tblock.max .val{font-size:104px;
background:linear-gradient(180deg,#ffffff,#bfe0ff 78%);
-webkit-background-clip:text;background-clip:text;color:transparent;}
.tblock.min .val{font-size:64px;color:rgba(228,238,255,.72)}
.unit{font-size:.34em;font-weight:500;letter-spacing:0;margin-top:.55em;margin-left:.10em;color:var(--muted)}
.tblock.max .unit{color:rgba(191,224,255,.8)}
.divider{width:1px;align-self:stretch;background:linear-gradient(180deg,transparent,var(--line) 22%,var(--line) 78%,transparent);margin:6px 0}
.condition{
margin-top:20px;display:inline-flex;align-items:center;gap:10px;
padding:9px 16px 9px 13px;border-radius:999px;
background:rgba(125,211,252,.11);border:1px solid rgba(125,211,252,.26);
font-size:16px;font-weight:560;letter-spacing:-.005em;
}
.condition .code{font-size:11px;color:var(--faint);font-weight:600;letter-spacing:.08em;padding-left:4px;border-left:1px solid rgba(255,255,255,.16);margin-left:4px}
.stats{display:flex;flex-direction:column;gap:14px;flex:none}
.stat{
min-width:150px;padding:14px 18px;border-radius:16px;
background:var(--card);border:1px solid var(--line);
}
.stat .k{font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--faint);font-weight:650}
.stat .v{margin-top:5px;font-size:22px;font-weight:560;font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.stat .v small{font-size:12px;color:var(--muted);font-weight:500;margin-left:5px;letter-spacing:0}
/* ---------- chart ---------- */
.chart-section{margin-top:34px;padding-top:26px;border-top:1px solid var(--line)}
.chart-head{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:6px}
.chart-title{font-size:12px;letter-spacing:.18em;text-transform:uppercase;color:var(--faint);font-weight:650}
.legend{font-size:11.5px;color:var(--faint);letter-spacing:.02em}
.chart{width:100%;height:250px;display:block;overflow:visible}
.chart text{font-family:inherit}
.gridline{stroke:rgba(255,255,255,.075);stroke-width:1}
.ylab,.xlab{fill:rgba(228,238,255,.42);font-size:11px;font-variant-numeric:tabular-nums}
.ylab{text-anchor:end}
.xlab{text-anchor:middle;letter-spacing:.04em}
.hover-line{stroke:rgba(255,255,255,.32);stroke-width:1;stroke-dasharray:3 3}
.hover-chip rect{fill:rgba(12,20,36,.94);stroke:rgba(255,255,255,.18)}
.hover-chip text{fill:#fff;font-size:12.5px;font-weight:600;text-anchor:middle;font-variant-numeric:tabular-nums}
.peak text{font-size:11.5px;font-weight:650;font-variant-numeric:tabular-nums}
.peak.hi text{fill:#ffd9a3}.peak.lo text{fill:#9fd7ff}
/* ---------- hourly strip ---------- */
.strip{margin-top:26px;display:grid;grid-template-columns:repeat(24,1fr);gap:5px}
.cell{
border-radius:11px;padding:11px 2px 10px;text-align:center;
background:rgba(255,255,255,.045);border:1px solid rgba(255,255,255,.07);
}
.cell .h{font-size:10px;color:var(--faint);font-variant-numeric:tabular-nums;letter-spacing:.02em}
.cell .t{margin-top:6px;font-size:14px;font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.cell .bar{height:3px;border-radius:2px;margin:8px auto 0;width:60%;background:rgba(255,255,255,.13)}
.cell .bar i{display:block;height:100%;border-radius:2px;background:linear-gradient(90deg,var(--accent),var(--accent-2))}
footer{
margin-top:26px;padding-top:16px;border-top:1px solid var(--line);
display:flex;justify-content:space-between;align-items:center;
font-size:11.5px;color:var(--faint);letter-spacing:.04em;
}
footer .src{display:flex;align-items:center;gap:8px}
/* ---------- states ---------- */
.state{padding:26px 0 10px;text-align:center}
.state .ring{
width:44px;height:44px;margin:0 auto 18px;border-radius:50%;
border:2px solid rgba(255,255,255,.14);border-top-color:var(--accent);
animation:spin .85s linear infinite;
}
@keyframes spin{to{transform:rotate(360deg)}}
.state h2{font-size:20px;font-weight:600;letter-spacing:-.01em}
.state p{margin-top:10px;font-size:14px;color:var(--muted);line-height:1.55}
.state .detail{
margin:18px auto 0;max-width:640px;font-size:12px;color:var(--faint);
background:rgba(0,0,0,.24);border:1px solid var(--line);border-radius:12px;padding:11px 14px;
word-break:break-word;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
}
.state.error .badge{
width:52px;height:52px;margin:0 auto 18px;border-radius:16px;display:grid;place-items:center;
background:rgba(248,113,113,.14);border:1px solid rgba(248,113,113,.34);
}
.state.error .badge svg{width:26px;height:26px;stroke:#fca5a5;fill:none;stroke-width:2;stroke-linecap:round}
.skeleton{opacity:.45}
.fade{animation:fade .5s ease both}
@keyframes fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
</style>
</head>
<body>
<main class="card" id="card">
<div class="glow"></div>
<div id="content">
<div class="state" id="loading">
<div class="ring"></div>
<h2>Loading weather…</h2>
<p id="loading-sub">Requesting forecast data</p>
</div>
</div>
</main>
<script>
(function(){
"use strict";
var WMO = {
0:["Clear sky","sun"],
1:["Mainly clear","sun-cloud"],2:["Partly cloudy","sun-cloud"],3:["Overcast","cloud"],
45:["Fog","fog"],48:["Depositing rime fog","fog"],
51:["Light drizzle","drizzle"],53:["Moderate drizzle","drizzle"],55:["Dense drizzle","drizzle"],
56:["Light freezing drizzle","sleet"],57:["Dense freezing drizzle","sleet"],
61:["Slight rain","rain"],63:["Moderate rain","rain"],65:["Heavy rain","rain"],
66:["Light freezing rain","sleet"],67:["Heavy freezing rain","sleet"],
71:["Slight snowfall","snow"],73:["Moderate snowfall","snow"],75:["Heavy snowfall","snow"],
77:["Snow grains","snow"],
80:["Slight rain showers","showers"],81:["Moderate rain showers","showers"],82:["Violent rain showers","showers"],
85:["Slight snow showers","snow"],86:["Heavy snow showers","snow"],
95:["Thunderstorm","storm"],96:["Thunderstorm with slight hail","storm"],99:["Thunderstorm with heavy hail","storm"]
};
var THEME = {
"sun": ["#ffd28a","#ff9e5e"],
"sun-cloud": ["#ffd9a0","#8fc3f5"],
"cloud": ["#cfd9e6","#8fa2bd"],
"fog": ["#c9d2dd","#8b97a6"],
"drizzle": ["#9fd8ff","#5f9fe0"],
"rain": ["#8fc9ff","#4a86d8"],
"showers": ["#93d1ff","#4f8fdd"],
"sleet": ["#c6e6ff","#7fa8d8"],
"snow": ["#e8f4ff","#a8c8e8"],
"storm": ["#b9a8ff","#6d63d8"]
};
function svgIcon(kind){
var c = THEME[kind] || THEME.cloud, a = c[0], b = c[1];
var defs = '<defs>'
+ '<linearGradient id="ig" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="'+a+'"/><stop offset="1" stop-color="'+b+'"/></linearGradient>'
+ '<filter id="igl" x="-60%" y="-60%" width="220%" height="220%"><feGaussianBlur stdDeviation="5" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge></filter>'
+ '</defs>';
var S = 'stroke="url(#ig)" fill="none" stroke-width="3.4" stroke-linecap="round" stroke-linejoin="round"';
var cloud = '<path d="M22 62h40a13 13 0 0 0 1-26 20 20 0 0 0-37-6 14 14 0 0 0-4 32z" '+S+'/>';
var sunCore = function(cx,cy,r){
var o = '<circle cx="'+cx+'" cy="'+cy+'" r="'+r+'" fill="url(#ig)" opacity=".95"/>';
for(var i=0;i<8;i++){
var ang = i*Math.PI/4;
var x1 = cx+Math.cos(ang)*(r+7), y1 = cy+Math.sin(ang)*(r+7);
var x2 = cx+Math.cos(ang)*(r+15), y2 = cy+Math.sin(ang)*(r+15);
o += '<line x1="'+x1.toFixed(1)+'" y1="'+y1.toFixed(1)+'" x2="'+x2.toFixed(1)+'" y2="'+y2.toFixed(1)+'" '+S+'/>';
}
return o;
};
var drops = function(n,dash){
var o='';
for(var i=0;i<n;i++){
var x = 30+i*13;
o += '<line x1="'+x+'" y1="70" x2="'+(x-4)+'" y2="'+(dash?80:84)+'" '+S+' stroke-dasharray="'+(dash?'6 7':'0')+'"/>';
}
return o;
};
var body;
switch(kind){
case "sun": body = sunCore(48,48,17); break;
case "sun-cloud": body = sunCore(60,30,12) + cloud; break;
case "cloud": body = cloud; break;
case "fog": body = cloud
+ '<line x1="20" y1="74" x2="62" y2="74" '+S+'/><line x1="30" y1="83" x2="72" y2="83" '+S+'/>'; break;
case "drizzle": body = cloud + drops(3,true); break;
case "rain": case "showers": body = cloud + drops(3,false); break;
case "sleet": body = cloud + drops(2,false)
+ '<path d="M62 72v12M56 78h12" '+S+'/>'; break;
case "snow": body = cloud
+ '<path d="M34 70v14M28 74l12 6M40 74l-12 6" '+S+'/>'
+ '<path d="M62 72v12M57 75l10 6M67 75l-10 6" '+S+'/>'; break;
case "storm": body = cloud
+ '<path d="M50 68l-9 14h10l-6 13" '+S+'/>'; break;
default: body = cloud;
}
return '<svg viewBox="0 0 96 96" aria-hidden="true">'+defs+'<g filter="url(#igl)">'+body+'</g></svg>';
}
function esc(s){
return String(s).replace(/[&<>"']/g,function(m){
return {"&":"&","<":"<",">":">",'"':""","'":"'"}[m];
});
}
function n1(v){ return (Math.round(v*10)/10).toFixed(1); }
function n0(v){ return String(Math.round(v)); }
function todayUTC(){ return new Date().toISOString().slice(0,10); }
var q = new URLSearchParams(location.search);
function num(key, dflt){
var raw = q.get(key);
if(raw === null || raw.trim() === "") return dflt;
var v = parseFloat(raw);
return isFinite(v) ? v : dflt;
}
var lat = num("lat", 52.52);
var lon = num("lon", 13.405);
var name = (q.get("name") || "").trim() || "Berlin";
var dateRaw = (q.get("date") || "").trim();
var date = /^\d{4}-\d{2}-\d{2}$/.test(dateRaw) ? dateRaw : todayUTC();
var today = todayUTC();
var isPast = date < today;
var endpoint = isPast ? "/api/om/archive" : "/api/om/forecast";
var params = 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
});
var url = endpoint + "?" + params.toString();
var content = document.getElementById("content");
var sub = document.getElementById("loading-sub");
if(sub) sub.textContent = (isPast ? "Requesting archive data for " : "Requesting forecast data for ") + name;
function fmtDate(iso){
var p = iso.split("-").map(Number);
var d = new Date(Date.UTC(p[0], p[1]-1, p[2]));
if(isNaN(d.getTime())) return {dow:"", full:iso};
var o = {timeZone:"UTC"};
function f(opts){
try{
return new Intl.DateTimeFormat("en-GB", Object.assign({}, o, opts)).format(d);
}catch(e){ return iso; }
}
return { dow: f({weekday:"long"}), full: f({day:"numeric", month:"long", year:"numeric"}) };
}
function coordLabel(){
var a = Math.abs(lat).toFixed(3) + "\u00B0 " + (lat >= 0 ? "N" : "S");
var b = Math.abs(lon).toFixed(3) + "\u00B0 " + (lon >= 0 ? "E" : "W");
return a + " \u00B7 " + b;
}
function showError(headline, detail){
content.innerHTML =
'<div class="state error fade">'
+ '<div class="badge"><svg viewBox="0 0 24 24"><path d="M12 8v5M12 16.5v.01"/><path d="M10.3 3.9 2.5 17.2A2 2 0 0 0 4.2 20h15.6a2 2 0 0 0 1.7-2.8L13.7 3.9a2 2 0 0 0-3.4 0z"/></svg></div>'
+ '<h2>Weather data could not be loaded</h2>'
+ '<p>' + esc(headline) + '<br>Showing no data for <strong>' + esc(name) + '</strong> on <strong>' + esc(date) + '</strong>.</p>'
+ (detail ? '<div class="detail">' + esc(detail) + '</div>' : '')
+ '</div>';
}
/* ------------------------- chart ------------------------- */
function buildChart(temps, times){
var W = 1072, H = 250;
var padL = 46, padR = 18, padT = 26, padB = 30;
var idx = [];
for(var i=0;i<temps.length;i++) if(typeof temps[i] === "number" && isFinite(temps[i])) idx.push(i);
if(!idx.length) return '<div class="state"><p>No hourly temperatures available for this date.</p></div>';
var vals = idx.map(function(i){ return temps[i]; });
var lo = Math.min.apply(null, vals), hi = Math.max.apply(null, vals);
var span = Math.max(hi - lo, 2);
var yMin = lo - span*0.28, yMax = hi + span*0.28;
var count = temps.length;
var x = function(i){ return padL + (count <= 1 ? 0 : (W - padL - padR) * (i/(count-1))); };
var y = function(v){ return padT + (H - padT - padB) * (1 - (v - yMin)/(yMax - yMin)); };
var pts = idx.map(function(i){ return {x:x(i), y:y(temps[i]), v:temps[i], i:i}; });
var d = "M " + pts[0].x.toFixed(1) + " " + pts[0].y.toFixed(1);
for(var k=0;k<pts.length-1;k++){
var p0 = pts[k-1] || pts[k], p1 = pts[k], p2 = pts[k+1], p3 = pts[k+2] || p2;
var t = 0.18;
var c1x = p1.x + (p2.x - p0.x)*t, c1y = p1.y + (p2.y - p0.y)*t;
var c2x = p2.x - (p3.x - p1.x)*t, c2y = p2.y - (p3.y - p1.y)*t;
d += " C " + c1x.toFixed(1) + " " + c1y.toFixed(1) + ", " + c2x.toFixed(1) + " " + c2y.toFixed(1)
+ ", " + p2.x.toFixed(1) + " " + p2.y.toFixed(1);
}
var base = H - padB;
var area = d + " L " + pts[pts.length-1].x.toFixed(1) + " " + base + " L " + pts[0].x.toFixed(1) + " " + base + " Z";
/* gridlines + y labels */
var ticks = 4, grid = "";
for(var g=0; g<=ticks; g++){
var vv = yMin + (yMax - yMin) * (g/ticks);
var yy = y(vv);
grid += '<line class="gridline" x1="'+padL+'" y1="'+yy.toFixed(1)+'" x2="'+(W-padR)+'" y2="'+yy.toFixed(1)+'"/>'
+ '<text class="ylab" x="'+(padL-11)+'" y="'+(yy+4).toFixed(1)+'">'+n0(vv)+'\u00B0</text>';
}
/* x labels every 3h */
var xlabs = "";
for(var h=0; h<count; h+=3){
xlabs += '<text class="xlab" x="'+x(h).toFixed(1)+'" y="'+(H-8)+'">'+(("0"+h).slice(-2))+':00</text>';
}
/* peak markers */
var hiP = pts[0], loP = pts[0];
pts.forEach(function(p){ if(p.v > hiP.v) hiP = p; if(p.v < loP.v) loP = p; });
function peak(p, cls, dy){
return '<g class="peak '+cls+'">'
+ '<circle cx="'+p.x.toFixed(1)+'" cy="'+p.y.toFixed(1)+'" r="4.5" fill="#0d1526" stroke="'+(cls==="hi"?"#ffd9a3":"#9fd7ff")+'" stroke-width="2.4"/>'
+ '<text x="'+p.x.toFixed(1)+'" y="'+(p.y+dy).toFixed(1)+'" text-anchor="middle">'+n1(p.v)+'\u00B0</text>'
+ '</g>';
}
/* dots + hover zones */
var dots = "", zones = "";
var zw = (W - padL - padR) / Math.max(count-1,1);
pts.forEach(function(p){
dots += '<circle cx="'+p.x.toFixed(1)+'" cy="'+p.y.toFixed(1)+'" r="2.6" fill="rgba(255,255,255,.75)"/>';
var label = (times[p.i] ? String(times[p.i]).slice(11,16) : (("0"+p.i).slice(-2)+":00")) + " " + n1(p.v) + "\u00B0C";
zones += '<rect x="'+(p.x - zw/2).toFixed(1)+'" y="'+padT+'" width="'+zw.toFixed(1)+'" height="'+(base-padT)+'"'
+ ' fill="transparent" data-x="'+p.x.toFixed(1)+'" data-y="'+p.y.toFixed(1)+'" data-label="'+esc(label)+'"/>';
});
return ''
+ '<svg class="chart" viewBox="0 0 '+W+' '+H+'" preserveAspectRatio="none" id="chart">'
+ '<defs>'
+ '<linearGradient id="stroke" x1="0" y1="0" x2="1" y2="0">'
+ '<stop offset="0" stop-color="#7dd3fc"/><stop offset=".5" stop-color="#c4b5fd"/><stop offset="1" stop-color="#fca5a5"/>'
+ '</linearGradient>'
+ '<linearGradient id="fill" x1="0" y1="0" x2="0" y2="1">'
+ '<stop offset="0" stop-color="#7dd3fc" stop-opacity=".38"/>'
+ '<stop offset="1" stop-color="#7dd3fc" stop-opacity="0"/>'
+ '</linearGradient>'
+ '</defs>'
+ grid
+ '<path d="'+area+'" fill="url(#fill)"/>'
+ '<path d="'+d+'" fill="none" stroke="url(#stroke)" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>'
+ dots
+ peak(hiP,"hi",-14) + peak(loP,"lo",22)
+ xlabs
+ '<g id="hover" style="display:none">'
+ '<line class="hover-line" y1="'+padT+'" y2="'+base+'"/>'
+ '<circle r="5.5" fill="#fff"/>'
+ '<g class="hover-chip"><rect rx="8" width="118" height="28"/><text dy="18.5"></text></g>'
+ '</g>'
+ '<g id="zones">'+zones+'</g>'
+ '</svg>';
}
function wireHover(){
var svg = document.getElementById("chart");
if(!svg) return;
var hover = document.getElementById("hover");
var line = hover.querySelector("line");
var dot = hover.querySelector("circle");
var chip = hover.querySelector(".hover-chip");
var chipRect = chip.querySelector("rect");
var chipText = chip.querySelector("text");
var zones = svg.querySelectorAll("#zones rect");
Array.prototype.forEach.call(zones, function(z){
z.addEventListener("mouseenter", function(){
var px = parseFloat(z.getAttribute("data-x")), py = parseFloat(z.getAttribute("data-y"));
line.setAttribute("x1", px); line.setAttribute("x2", px);
dot.setAttribute("cx", px); dot.setAttribute("cy", py);
chipText.textContent = z.getAttribute("data-label");
var w = 118, cx = Math.max(4, Math.min(1072 - w - 4, px - w/2));
chipRect.setAttribute("x", cx); chipRect.setAttribute("y", 0);
chipText.setAttribute("x", cx + w/2); chipText.setAttribute("y", 0);
hover.style.display = "";
});
});
svg.addEventListener("mouseleave", function(){ hover.style.display = "none"; });
}
/* ------------------------- render ------------------------- */
function render(data){
var daily = data && data.daily ? data.daily : null;
var hourly = data && data.hourly ? data.hourly : null;
var tmax = daily && daily.temperature_2m_max ? daily.temperature_2m_max[0] : null;
var tmin = daily && daily.temperature_2m_min ? daily.temperature_2m_min[0] : null;
var code = daily && daily.weather_code ? daily.weather_code[0] : null;
var temps = (hourly && Array.isArray(hourly.temperature_2m)) ? hourly.temperature_2m : [];
var times = (hourly && Array.isArray(hourly.time)) ? hourly.time : [];
var hasNum = temps.some(function(v){ return typeof v === "number" && isFinite(v); });
var haveMax = typeof tmax === "number" && isFinite(tmax);
var haveMin = typeof tmin === "number" && isFinite(tmin);
if(!haveMax && !haveMin && !hasNum){
showError("The API responded, but contained no temperature values for this date.", url);
return;
}
if(!haveMax && hasNum) tmax = Math.max.apply(null, temps.filter(function(v){return typeof v==="number"&&isFinite(v);}));
if(!haveMin && hasNum) tmin = Math.min.apply(null, temps.filter(function(v){return typeof v==="number"&&isFinite(v);}));
haveMax = typeof tmax === "number" && isFinite(tmax);
haveMin = typeof tmin === "number" && isFinite(tmin);
var meta = WMO[code] || ["Condition unavailable","cloud"];
var accent = THEME[meta[1]] || THEME.cloud;
document.documentElement.style.setProperty("--accent", accent[0]);
document.documentElement.style.setProperty("--accent-2", accent[1]);
var fd = fmtDate(date);
var validTemps = temps.filter(function(v){ return typeof v === "number" && isFinite(v); });
var mean = validTemps.length ? validTemps.reduce(function(a,b){return a+b;},0)/validTemps.length : null;
var swing = (haveMax && haveMin) ? (tmax - tmin) : null;
var lo = validTemps.length ? Math.min.apply(null, validTemps) : 0;
var hi = validTemps.length ? Math.max.apply(null, validTemps) : 1;
var rng = Math.max(hi - lo, 0.001);
var cells = "";
for(var h=0; h<24; h++){
var v = temps[h];
var ok = typeof v === "number" && isFinite(v);
var pct = ok ? Math.round(((v - lo)/rng)*100) : 0;
cells += '<div class="cell">'
+ '<div class="h">' + (("0"+h).slice(-2)) + '</div>'
+ '<div class="t">' + (ok ? n0(v) + "\u00B0" : "\u2013") + '</div>'
+ '<div class="bar"><i style="width:' + Math.max(pct,4) + '%"></i></div>'
+ '</div>';
}
content.innerHTML = ''
+ '<div class="fade">'
+ '<header>'
+ '<div>'
+ '<div class="eyebrow"><span class="dot"></span>' + (isPast ? "Historical observation" : "Daily forecast") + '</div>'
+ '<h1>' + esc(name) + '</h1>'
+ '<div class="coords">' + esc(coordLabel()) + '</div>'
+ '</div>'
+ '<div class="datebox">'
+ '<div class="dow">' + esc(fd.dow) + '</div>'
+ '<div class="full">' + esc(fd.full) + '</div>'
+ '<div class="iso">' + esc(date) + ' \u00B7 UTC</div>'
+ '</div>'
+ '</header>'
+ '<div class="hero">'
+ '<div class="icon-wrap">' + svgIcon(meta[1]) + '</div>'
+ '<div class="readout">'
+ '<div class="temps">'
+ '<div class="tblock max"><div class="lab">Maximum</div><div class="val">' + (haveMax ? n1(tmax) : "\u2013") + '<span class="unit">\u00B0C</span></div></div>'
+ '<div class="divider"></div>'
+ '<div class="tblock min"><div class="lab">Minimum</div><div class="val">' + (haveMin ? n1(tmin) : "\u2013") + '<span class="unit">\u00B0C</span></div></div>'
+ '</div>'
+ '<div class="condition">' + esc(meta[0])
+ (typeof code === "number" ? '<span class="code">WMO ' + esc(code) + '</span>' : '')
+ '</div>'
+ '</div>'
+ '<div class="stats">'
+ '<div class="stat"><div class="k">Daily mean</div><div class="v">' + (mean === null ? "\u2013" : n1(mean) + "\u00B0") + '<small>C</small></div></div>'
+ '<div class="stat"><div class="k">Range</div><div class="v">' + (swing === null ? "\u2013" : n1(swing) + "\u00B0") + '<small>C</small></div></div>'
+ '<div class="stat"><div class="k">Hours reported</div><div class="v">' + validTemps.length + '<small>/ 24</small></div></div>'
+ '</div>'
+ '</div>'
+ '<section class="chart-section">'
+ '<div class="chart-head">'
+ '<div class="chart-title">Hourly temperature \u00B7 \u00B0C</div>'
+ '<div class="legend">All times UTC \u00B7 hover the curve for exact values</div>'
+ '</div>'
+ buildChart(temps.slice(0,24), times.slice(0,24))
+ '<div class="strip">' + cells + '</div>'
+ '</section>'
+ '<footer>'
+ '<div class="src">Source: ' + (isPast ? "/api/om/archive" : "/api/om/forecast") + ' \u00B7 Open-Meteo compatible</div>'
+ '<div>Units: Celsius \u00B7 Timezone: UTC</div>'
+ '</footer>'
+ '</div>';
wireHover();
}
var timeout = setTimeout(function(){
if(document.getElementById("loading")) showError("The request timed out after 15 seconds.", url);
}, 15000);
fetch(url, {headers:{"Accept":"application/json"}})
.then(function(res){
if(!res.ok) throw new Error("API returned HTTP " + res.status + " " + (res.statusText || ""));
return res.json();
})
.then(function(data){
clearTimeout(timeout);
if(!data || typeof data !== "object") throw new Error("Malformed response body.");
if(data.error) throw new Error(data.reason || "The weather API reported an error.");
render(data);
})
.catch(function(err){
clearTimeout(timeout);
showError((err && err.message) ? err.message : "Unknown network error.", url);
});
})();
</script>
</body>
</html>L1 —— 廉价的确定性描述量
| bytes 总计 | 27,706 | html / css / js | 480 / 9,007 / 18,219 |
|---|---|---|---|
| dom 节点 | 15 | dom 深度 | 6 |
| css 规则 | 74 | 含 js | 是 |
| brightness | 250.5 | contrast | 9.4 |
| colorfulness | 8.3 | 留白 | 99.9% |
该 slot 的 telemetry
| prompt tokens | 2 | completion tokens | 14,634 |
|---|---|---|---|
| total tokens | 14,636 | wall | 154.7 s |
| cost | — | request id | — |
config.json583 B
{
"N": 2,
"auth": {
"credential_ref": "WCB_NONE",
"method": "oauth-login"
},
"billing": "plan",
"config_id": "claude-opus-5-eff-medium--cli--cursor-xl--dev",
"effort": "medium",
"family": "claude",
"m": {
"min": 2,
"q": 2
},
"model_id": "claude-opus-5",
"protocol": "cli",
"served_model": "claude-opus-5-medium",
"telemetry": {
"completion_tokens": 41418,
"cost_usd": null,
"prompt_tokens": 12,
"total_tokens": 41430,
"wall_ms": 471768
},
"transport": "cursor-agent-cli-isolated-home",
"vendor_sanction_ref": null
}send-log2.5 KB
{
"N": 2,
"batch_id": "2026-08-13--cursor-xl-s0",
"config_id": "claude-opus-5-eff-medium--cli--cursor-xl--dev",
"positions": [
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-08-13T10:29:56.923454+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-13T10:27:22.216194+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-08-13T10:30:47.975518+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-13T10:30:00.488936+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-13T10:32:24.147318+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-13T10:30:51.476454+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-08-13T10:35:24.117997+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-13T10:32:27.204085+00:00"
}
],
"block_index": 1,
"model_reaching_attempt_index": 0,
"slot_index": 1,
"terminal_state": "valid",
"variant": "P-q"
}
],
"retry_policy": {
"max_unreachable_retries": 5,
"rate_limit_backoff": {
"max_attempts": 4,
"max_total_ms": 60000
}
}
}