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

截图是 similarity 通道测量时的原始像素。运行 live 会在 sandboxed iframe 中重新执行原始输出;渲染结果取决于你的浏览器和字体,不保证与测量像素一致。
similarity 邻居
最近
claude-opus-5 @high · cursor0.71claude-opus-5-thinking @xhigh · cursor0.70claude-opus-5-thinking @xhigh · cursor-xl0.70claude-opus-5-thinking @max · cursor0.70claude-opus-5-thinking @high · cursor-xl0.69最远
north-mini-code-free · api0.48qwen3.6-plus · go0.48grok-4.3 @low · api0.50grok-4.3 · api0.50claude-sonnet-4 · cursor0.50限于 session 2026-07-19--unified
similarity 衡量本 session 内的趋同程度 —— 不是质量。
Fidelity —— 卡片展示的数据对不对?
- namematch
- conditionmatch
- datematch
- max tempmatch展示值:25.3
- 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>
:root{
--sky-1:#101a2c; --sky-2:#1c3654; --sky-3:#2a5a86;
--accent:#9fd0ff; --accent-soft:rgba(159,208,255,.18);
--ink:#f4f8ff; --ink-dim:rgba(244,248,255,.66); --ink-faint:rgba(244,248,255,.42);
--glass:rgba(255,255,255,.07); --glass-2:rgba(255,255,255,.045);
--stroke:rgba(255,255,255,.14); --stroke-soft:rgba(255,255,255,.08);
--font:"Inter","SF Pro Display",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
--mono:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;
}
body[data-theme="clear"] {--sky-1:#06263f;--sky-2:#0f5089;--sky-3:#2f8ec9;--accent:#ffd486;--accent-soft:rgba(255,212,134,.2)}
body[data-theme="partly"] {--sky-1:#0b2740;--sky-2:#1a4f7d;--sky-3:#3d84b8;--accent:#ffe2ab;--accent-soft:rgba(255,226,171,.18)}
body[data-theme="cloudy"] {--sky-1:#1b222c;--sky-2:#333f4e;--sky-3:#55677d;--accent:#d6e2f0;--accent-soft:rgba(214,226,240,.16)}
body[data-theme="fog"] {--sky-1:#20242a;--sky-2:#3b4149;--sky-3:#646c78;--accent:#e2e6ec;--accent-soft:rgba(226,230,236,.16)}
body[data-theme="rain"] {--sky-1:#061f2e;--sky-2:#0f4359;--sky-3:#1d6d86;--accent:#8fdcff;--accent-soft:rgba(143,220,255,.18)}
body[data-theme="snow"] {--sky-1:#14283c;--sky-2:#2b567c;--sky-3:#5b90bd;--accent:#eaf7ff;--accent-soft:rgba(234,247,255,.2)}
body[data-theme="thunder"] {--sky-1:#151233;--sky-2:#2c265c;--sky-3:#4b3f92;--accent:#cbb8ff;--accent-soft:rgba(203,184,255,.2)}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}
body{
font-family:var(--font);
color:var(--ink);
background:var(--sky-1);
display:grid; place-items:center;
overflow:hidden;
-webkit-font-smoothing:antialiased;
transition:background .8s ease;
}
/* ---------- ambient background ---------- */
.bg{position:fixed;inset:0;z-index:0;overflow:hidden;
background:
radial-gradient(120% 90% at 12% -10%, var(--sky-3) 0%, transparent 58%),
radial-gradient(100% 80% at 92% 8%, var(--sky-2) 0%, transparent 62%),
linear-gradient(168deg, var(--sky-2) 0%, var(--sky-1) 72%);
transition:background .8s ease;
}
.orb{position:absolute;border-radius:50%;filter:blur(58px);opacity:.5;mix-blend-mode:screen;
animation:drift 26s ease-in-out infinite}
.orb--1{width:520px;height:520px;left:-90px;top:-150px;background:var(--accent);opacity:.26}
.orb--2{width:460px;height:460px;right:-110px;top:-90px;background:var(--sky-3);animation-delay:-9s}
.orb--3{width:620px;height:620px;left:40%;bottom:-360px;background:var(--sky-3);opacity:.35;animation-delay:-16s}
@keyframes drift{0%,100%{transform:translate3d(0,0,0) scale(1)}50%{transform:translate3d(26px,-22px,0) scale(1.07)}}
.glow{position:absolute;inset:0;opacity:0;transition:opacity .8s ease;pointer-events:none;
background:radial-gradient(closest-side at 84% 12%, rgba(255,225,160,.55), rgba(255,205,120,.14) 45%, transparent 72%);}
body[data-theme="clear"] .glow,body[data-theme="partly"] .glow{opacity:1}
.precip{position:absolute;inset:-10% -10% 0 -10%;opacity:0;pointer-events:none;transition:opacity .8s ease}
body[data-theme="rain"] .precip,body[data-theme="thunder"] .precip{
opacity:.5;
background-image:
radial-gradient(1.1px 9px at 50% 0, rgba(255,255,255,.55), transparent),
radial-gradient(1px 7px at 50% 0, rgba(255,255,255,.3), transparent);
background-size:52px 130px, 78px 190px;
animation:fall 1.05s linear infinite;
}
body[data-theme="snow"] .precip{
opacity:.6;
background-image:
radial-gradient(1.8px 1.8px at 50% 50%, rgba(255,255,255,.85), transparent),
radial-gradient(1.4px 1.4px at 50% 50%, rgba(255,255,255,.5), transparent);
background-size:88px 120px, 130px 170px;
animation:fall 7.5s linear infinite;
}
@keyframes fall{to{background-position:6px 190px, -10px 260px}}
.grain{position:absolute;inset:0;pointer-events:none;opacity:.22;mix-blend-mode:overlay;
background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='140' height='140'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3'/></filter><rect width='140' height='140' filter='url(%23n)' opacity='.5'/></svg>")}
/* ---------- card ---------- */
.card{
position:relative;z-index:1;
width:min(1184px, calc(100vw - 64px));
height:min(708px, calc(100vh - 72px));
display:grid;
grid-template-columns:394px 1fr;
border-radius:30px;
background:linear-gradient(150deg, rgba(255,255,255,.13), rgba(255,255,255,.045) 46%, rgba(255,255,255,.02));
border:1px solid var(--stroke);
box-shadow:0 46px 90px -30px rgba(3,10,22,.72), 0 2px 0 rgba(255,255,255,.09) inset;
backdrop-filter:blur(26px) saturate(135%);
overflow:hidden;
animation:rise .8s cubic-bezier(.2,.8,.2,1) both;
}
@keyframes rise{from{opacity:0;transform:translateY(16px) scale(.99)}to{opacity:1;transform:none}}
.pane{padding:36px 36px 32px;display:grid;min-width:0;min-height:0;overflow:hidden}
.pane--summary{grid-template-rows:auto auto 1fr;gap:22px;
background:linear-gradient(180deg, rgba(255,255,255,.05), rgba(255,255,255,0) 60%);
border-right:1px solid var(--stroke-soft)}
.pane--detail{grid-template-rows:auto minmax(0,1fr) auto;gap:16px;padding-left:32px}
.eyebrow{font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-faint);font-weight:600}
.loc__name{font-size:37px;line-height:1.06;font-weight:650;letter-spacing:-.022em;margin-top:9px;
overflow-wrap:anywhere;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;overflow:hidden}
.loc__coords{margin-top:10px;font-family:var(--mono);font-size:11.5px;color:var(--ink-faint);letter-spacing:.02em}
.date{padding:15px 0 0;border-top:1px solid var(--stroke-soft)}
.date__long{font-size:16.5px;font-weight:550;color:var(--ink-dim);letter-spacing:-.005em}
.date__iso{margin-top:6px;font-family:var(--mono);font-size:12px;color:var(--accent);letter-spacing:.06em}
.reading{align-self:end;display:flex;flex-direction:column;gap:13px;min-height:0}
.icon{width:68px;height:68px;color:var(--accent);filter:drop-shadow(0 10px 22px rgba(0,0,0,.34))}
.icon svg{width:100%;height:100%;display:block}
.temp{display:flex;align-items:flex-start;gap:6px;font-variant-numeric:tabular-nums}
.temp__num{font-size:90px;line-height:.9;font-weight:250;letter-spacing:-.055em;
background:linear-gradient(175deg,#fff 20%, rgba(255,255,255,.62));
-webkit-background-clip:text;background-clip:text;color:transparent}
.temp__unit{font-size:26px;font-weight:400;color:var(--ink-dim);margin-top:12px;letter-spacing:-.02em}
.cond{font-size:20px;font-weight:550;letter-spacing:-.012em}
.cond__code{font-family:var(--mono);font-size:11px;color:var(--ink-faint);margin-top:5px;letter-spacing:.04em}
.stats{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:6px}
.stat{padding:13px 15px;border-radius:15px;background:var(--glass);border:1px solid var(--stroke-soft)}
.stat__k{display:flex;align-items:center;gap:6px;font-size:10.5px;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-faint);font-weight:600}
.stat__v{display:block;margin-top:7px;font-size:24px;font-weight:450;letter-spacing:-.03em;font-variant-numeric:tabular-nums}
.stat--hi .stat__k{color:#ffc48a}
.stat--lo .stat__k{color:#a9d8ff}
.arrow{width:9px;height:9px}
/* ---------- detail pane ---------- */
.dhead{display:flex;align-items:baseline;justify-content:space-between;gap:12px}
.dhead h2{font-size:14.5px;font-weight:600;letter-spacing:-.008em}
.dhead .eyebrow{font-family:var(--mono);letter-spacing:.1em}
.chart{position:relative;min-height:0;overflow:hidden;border-radius:20px;
background:
linear-gradient(180deg, var(--accent-soft), transparent 62%),
linear-gradient(180deg, rgba(255,255,255,.06), rgba(255,255,255,.015));
border:1px solid var(--stroke-soft)}
.chart svg{position:absolute;top:9px;left:12px;display:block}
.chart p{position:absolute;inset:0;display:grid;place-items:center;padding:20px;text-align:center}
.grid-line{stroke:rgba(255,255,255,.09);stroke-width:1}
.grid-label{fill:var(--ink-faint);font-size:10px;font-family:var(--mono)}
.x-label{fill:var(--ink-faint);font-size:10px;font-family:var(--mono);text-anchor:middle}
.line{fill:none;stroke:var(--accent);stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round;
filter:drop-shadow(0 5px 12px rgba(0,0,0,.4))}
.area{animation:fadein .9s ease .8s both}
@keyframes fadein{from{opacity:0}to{opacity:1}}
.dot{fill:var(--sky-1);stroke:var(--accent);stroke-width:1.7}
.pin-bg{fill:rgba(8,16,28,.62);stroke:var(--stroke)}
.pin-t{fill:#fff;font-size:11px;font-weight:600;text-anchor:middle;font-variant-numeric:tabular-nums}
.nowline{stroke:#fff;stroke-width:1;stroke-dasharray:3 3;opacity:.45}
.nowlabel{fill:#fff;font-size:9.5px;font-family:var(--mono);text-anchor:middle;opacity:.7;letter-spacing:.08em}
.hours{display:grid;grid-template-columns:repeat(8,1fr);gap:7px}
.hour{position:relative;overflow:hidden;padding:9px 9px 11px;border-radius:12px;
background:var(--glass-2);border:1px solid var(--stroke-soft);
animation:pop .5s cubic-bezier(.2,.8,.2,1) both}
@keyframes pop{from{opacity:0;transform:translateY(7px)}to{opacity:1;transform:none}}
.hour::before{content:"";position:absolute;inset:0;background:var(--accent);
opacity:calc(.03 + var(--w) * .17)}
.hour.is-now{border-color:rgba(255,255,255,.44);background:rgba(255,255,255,.1)}
.hour__t{position:relative;display:block;font-family:var(--mono);font-size:10px;color:var(--ink-faint);letter-spacing:.03em}
.hour__v{position:relative;display:block;margin-top:4px;font-size:15px;font-weight:500;letter-spacing:-.02em;font-variant-numeric:tabular-nums}
.hour__bar{position:absolute;left:9px;right:9px;bottom:6px;height:2px;border-radius:2px;background:rgba(255,255,255,.13)}
.hour__bar::after{content:"";position:absolute;inset:0;border-radius:2px;background:var(--accent);
transform:scaleX(var(--w));transform-origin:left}
/* ---------- states ---------- */
.veil{position:absolute;inset:0;z-index:5;display:grid;place-items:center;text-align:center;
background:rgba(9,16,28,.62);backdrop-filter:blur(12px);padding:40px}
.veil[hidden]{display:none}
.veil__inner{max-width:440px;display:flex;flex-direction:column;align-items:center;gap:14px}
.spinner{width:34px;height:34px;border-radius:50%;border:2.5px solid rgba(255,255,255,.16);
border-top-color:var(--accent);animation:spin .85s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.veil h3{font-size:19px;font-weight:600;letter-spacing:-.015em}
.veil p{max-width:100%;font-size:13.5px;line-height:1.55;color:var(--ink-dim);overflow-wrap:anywhere}
.veil code{max-width:100%;padding:8px 12px;border-radius:9px;background:rgba(0,0,0,.28);
border:1px solid var(--stroke-soft);font-family:var(--mono);font-size:11px;line-height:1.5;
color:var(--ink-faint);overflow-wrap:anywhere}
.badge{width:46px;height:46px;border-radius:14px;display:grid;place-items:center;
background:rgba(255,120,120,.14);border:1px solid rgba(255,140,140,.3);color:#ffb1b1}
.badge svg{width:24px;height:24px}
.btn{margin-top:4px;padding:10px 20px;border-radius:11px;cursor:pointer;font:inherit;font-size:13px;font-weight:600;
color:var(--ink);background:rgba(255,255,255,.11);border:1px solid var(--stroke);transition:background .18s ease}
.btn:hover{background:rgba(255,255,255,.19)}
@media (prefers-reduced-motion:reduce){
*{animation:none !important;transition:none !important}
.line{stroke-dasharray:none !important;stroke-dashoffset:0 !important}
}
</style>
</head>
<body data-theme="cloudy">
<div class="bg" aria-hidden="true">
<div class="orb orb--1"></div><div class="orb orb--2"></div><div class="orb orb--3"></div>
<div class="glow"></div><div class="precip"></div><div class="grain"></div>
</div>
<main class="card" id="card" aria-live="polite">
<section class="pane pane--summary">
<div>
<div class="eyebrow">Location</div>
<h1 class="loc__name" id="locName">Berlin</h1>
<div class="loc__coords" id="coords">—</div>
</div>
<div class="date">
<div class="date__long" id="dateLong">—</div>
<div class="date__iso" id="dateIso">—</div>
</div>
<div class="reading">
<div class="icon" id="icon" aria-hidden="true"></div>
<div>
<div class="temp"><span class="temp__num" id="tBig">--</span><span class="temp__unit">°C</span></div>
</div>
<div>
<div class="cond" id="cond">Loading…</div>
<div class="cond__code" id="condCode"></div>
</div>
<div class="stats">
<div class="stat stat--hi">
<span class="stat__k">
<svg class="arrow" viewBox="0 0 10 10" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M5 8.5V1.5M1.8 4.7 5 1.5l3.2 3.2"/></svg>
Max
</span>
<span class="stat__v" id="tMax">--°C</span>
</div>
<div class="stat stat--lo">
<span class="stat__k">
<svg class="arrow" viewBox="0 0 10 10" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M5 1.5v7M1.8 5.3 5 8.5l3.2-3.2"/></svg>
Min
</span>
<span class="stat__v" id="tMin">--°C</span>
</div>
</div>
</div>
</section>
<section class="pane pane--detail">
<div class="dhead">
<h2>Hourly temperature</h2>
<span class="eyebrow" id="srcNote">°C · UTC</span>
</div>
<div class="chart" id="chart"></div>
<div class="hours" id="hours"></div>
</section>
<div class="veil" id="veil">
<div class="veil__inner" id="veilInner">
<div class="spinner"></div>
<h3>Loading weather…</h3>
<p id="veilMsg">Fetching data for the selected date.</p>
</div>
</div>
</main>
<script>
(function(){
"use strict";
var $ = function(id){ return document.getElementById(id); };
/* ------------ params ------------ */
var qp = new URLSearchParams(location.search);
function numParam(key, fallback){
var raw = qp.get(key);
if (raw === null || raw.trim() === "") return fallback;
var v = Number(raw);
return isFinite(v) ? v : fallback;
}
function todayUTC(){
var d = new Date();
return d.toISOString().slice(0,10);
}
function dateParam(){
var raw = (qp.get("date") || "").trim();
if (!/^\d{4}-\d{2}-\d{2}$/.test(raw)) return todayUTC();
var d = new Date(raw + "T00:00:00Z");
if (isNaN(d.getTime()) || d.toISOString().slice(0,10) !== raw) return todayUTC();
return raw;
}
var lat = numParam("lat", 52.52);
var lon = numParam("lon", 13.405);
var name = (qp.get("name") || "").trim() || "Berlin";
var date = dateParam();
/* ------------ weather codes ------------ */
var CODES = {
0:["Clear sky","clear"], 1:["Mainly clear","clear"], 2:["Partly cloudy","partly"], 3:["Overcast","cloudy"],
45:["Fog","fog"], 48:["Depositing rime fog","fog"],
51:["Light drizzle","drizzle"], 53:["Moderate drizzle","drizzle"], 55:["Dense drizzle","drizzle"],
56:["Light freezing drizzle","drizzle"], 57:["Dense freezing drizzle","drizzle"],
61:["Slight rain","rain"], 63:["Moderate rain","rain"], 65:["Heavy rain","rain"],
66:["Light freezing rain","rain"], 67:["Heavy freezing rain","rain"],
71:["Slight snowfall","snow"], 73:["Moderate snowfall","snow"], 75:["Heavy snowfall","snow"], 77:["Snow grains","snow"],
80:["Slight rain showers","rain"], 81:["Moderate rain showers","rain"], 82:["Violent rain showers","rain"],
85:["Slight snow showers","snow"], 86:["Heavy snow showers","snow"],
95:["Thunderstorm","thunder"], 96:["Thunderstorm with slight hail","thunder"], 99:["Thunderstorm with heavy hail","thunder"]
};
var S = 'stroke="currentColor" fill="none" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"';
var CLOUD_LOW = '<path d="M7.5 18.5h9.2a3.9 3.9 0 0 0 .5-7.77 5.6 5.6 0 0 0-10.75-.6A3.45 3.45 0 0 0 7.5 18.5Z"/>';
var CLOUD_HI = '<path d="M7.5 15.2h9.2a3.9 3.9 0 0 0 .5-7.77A5.6 5.6 0 0 0 6.45 6.83 3.45 3.45 0 0 0 7.5 15.2Z"/>';
var ICONS = {
clear: '<g '+S+'><circle cx="12" cy="12" r="4.3"/><path d="M12 2.6v2.3M12 19.1v2.3M2.6 12h2.3M19.1 12h2.3M5.4 5.4l1.6 1.6M17 17l1.6 1.6M18.6 5.4 17 7M7 17l-1.6 1.6"/></g>',
partly: '<g '+S+'><circle cx="15.6" cy="7.4" r="3"/><path d="M15.6 1.9v1.6M21.1 7.4h-1.6M19.5 3.5 18.4 4.6M19.5 11.3l-1.1-1.1"/>'+CLOUD_LOW+'</g>',
cloudy: '<g '+S+'>'+CLOUD_LOW+'<path d="M4.9 9.2A5.2 5.2 0 0 1 11.6 4.4" opacity=".5"/></g>',
fog: '<g '+S+'>'+CLOUD_HI+'<path d="M4.6 18.4h11.2M7.8 21.4h9.6"/></g>',
drizzle:'<g '+S+'>'+CLOUD_HI+'<path d="M9.2 18.4v1.5M12.6 18.9v2.1M16 18.4v1.5"/></g>',
rain: '<g '+S+'>'+CLOUD_HI+'<path d="M9.3 18.2 8.4 21.2M12.9 18.2l-.9 3M16.5 18.2l-.9 3"/></g>',
snow: '<g '+S+'><g stroke-width="2.4" stroke-linecap="round" stroke="currentColor"><path d="M9.2 19h.01M12.8 18.6h.01M16.4 19h.01M11 21.6h.01M14.6 21.6h.01"/></g>'+CLOUD_HI+'</g>',
thunder:'<g '+S+'>'+CLOUD_HI+'<path d="M13.9 16.6 10.2 20.7h2.9l-1.1 2.9"/></g>'
};
/* ------------ formatting ------------ */
function n1(v){ return Number(v).toFixed(1); }
function deg(v){ return v === null || v === undefined || !isFinite(v) ? "–" : n1(v) + "°C"; }
function coordText(v, pos, neg){
return String(Number(Math.abs(v).toFixed(5))) + "° " + (v < 0 ? neg : pos);
}
function longDate(iso){
try{
return new Intl.DateTimeFormat("en-GB",{weekday:"long",day:"numeric",month:"long",year:"numeric",timeZone:"UTC"})
.format(new Date(iso+"T12:00:00Z"));
}catch(e){ return iso; }
}
/* ------------ shell ------------ */
$("locName").textContent = name;
$("coords").textContent = coordText(lat,"N","S") + ", " + coordText(lon,"E","W");
$("dateLong").textContent = longDate(date);
$("dateIso").textContent = date;
document.title = "Weather · " + name + " · " + date;
function showError(detail, url){
var box = $("veilInner");
box.innerHTML = "";
var badge = document.createElement("div");
badge.className = "badge";
badge.innerHTML = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"><path d="M12 8.2v5.4M12 17h.01"/><circle cx="12" cy="12" r="9.2"/></svg>';
var h = document.createElement("h3");
h.textContent = "Weather data could not be loaded";
var p = document.createElement("p");
p.textContent = detail || "The weather service did not return usable data.";
box.appendChild(badge); box.appendChild(h); box.appendChild(p);
if (url){
var c = document.createElement("code");
c.textContent = url;
box.appendChild(c);
}
var b = document.createElement("button");
b.className = "btn"; b.type = "button"; b.textContent = "Try again";
b.addEventListener("click", function(){ location.reload(); });
box.appendChild(b);
$("veil").hidden = false;
$("cond").textContent = "Unavailable";
$("tBig").textContent = "--";
}
/* ------------ data ------------ */
function apiURL(path){
var p = 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
});
return path + "?" + p.toString();
}
function getJSON(url){
var path = url.split("?")[0];
return fetch(url, {headers:{Accept:"application/json"}}).then(function(r){
if (!r.ok) throw new Error("The request to " + path + " failed with status " + r.status + ".");
return r.json();
}).then(function(j){
if (j && j.error) throw new Error(j.reason || "API error");
return j;
});
}
function usable(j){
if (!j) return false;
var hourly = j.hourly && Array.isArray(j.hourly.time) && Array.isArray(j.hourly.temperature_2m);
var daily = j.daily && Array.isArray(j.daily.time);
return !!(hourly || daily);
}
var primary = date < todayUTC() ? "/api/om/archive" : "/api/om/forecast";
var fallback = primary === "/api/om/archive" ? "/api/om/forecast" : "/api/om/archive";
getJSON(apiURL(primary))
.then(function(j){
if (usable(j)) return j;
throw new Error("No data for " + date + " in the response.");
})
.catch(function(err){
return getJSON(apiURL(fallback)).then(function(j){
if (usable(j)) return j;
throw err;
}).catch(function(){ throw err; });
})
.then(render)
.catch(function(err){
var msg = String((err && err.message) || err || "");
if (!msg || /failed to fetch|load failed|networkerror|network error/i.test(msg)){
msg = "The weather service could not be reached.";
}
showError(msg, apiURL(primary));
});
/* ------------ render ------------ */
function render(data){
var idx = 0;
if (data.daily && Array.isArray(data.daily.time)){
var k = data.daily.time.indexOf(date);
if (k >= 0) idx = k;
}
var hours = [];
if (data.hourly && Array.isArray(data.hourly.time)){
var T = data.hourly.temperature_2m || [];
for (var i = 0; i < data.hourly.time.length; i++){
var stamp = String(data.hourly.time[i]);
if (stamp.slice(0,10) !== date) continue;
var v = T[i];
if (v === null || v === undefined || !isFinite(v)) continue;
hours.push({ h: Number(stamp.slice(11,13)), label: stamp.slice(11,16), t: Number(v) });
}
}
var d = data.daily || {};
var tmax = pick(d.temperature_2m_max, idx);
var tmin = pick(d.temperature_2m_min, idx);
var code = pick(d.weather_code, idx);
if (tmax === null && hours.length) tmax = Math.max.apply(null, hours.map(function(x){return x.t;}));
if (tmin === null && hours.length) tmin = Math.min.apply(null, hours.map(function(x){return x.t;}));
if (tmax === null && tmin === null && !hours.length){
showError("The response contained no temperatures for " + date + ".", apiURL(primary));
return;
}
var entry = (code !== null && CODES[code]) ? CODES[code] : null;
var label = entry ? entry[0] : (code === null ? "Condition unavailable" : "Weather code " + code);
var group = entry ? entry[1] : "cloudy";
var theme = group === "drizzle" ? "rain" : group;
document.body.setAttribute("data-theme", theme);
$("icon").innerHTML = '<svg viewBox="0 0 24 24">' + (ICONS[group] || ICONS.cloudy) + "</svg>";
$("cond").textContent = label;
$("condCode").textContent = code === null ? "" : "WMO weather code " + code;
$("tBig").textContent = tmax === null ? "--" : n1(tmax);
$("tMax").textContent = deg(tmax);
$("tMin").textContent = deg(tmin);
$("srcNote").textContent = "°C · UTC · " + (primary === "/api/om/archive" ? "archive" : "forecast");
drawHours(hours);
$("veil").hidden = true;
/* the chart is measured in pixels, so draw it once the rest of the grid has settled */
var draw = function(){ drawChart(hours, tmin, tmax); };
requestAnimationFrame(draw);
if (window.ResizeObserver){
var seen = {w:0, h:0};
new ResizeObserver(function(entries){
var r = entries[0].contentRect;
if (Math.abs(r.width - seen.w) < 2 && Math.abs(r.height - seen.h) < 2) return;
seen.w = r.width; seen.h = r.height;
draw();
}).observe($("chart"));
} else {
var t;
window.addEventListener("resize", function(){ clearTimeout(t); t = setTimeout(draw, 160); });
}
}
function pick(arr, i){
if (!Array.isArray(arr)) return null;
var v = arr[i];
return (v === null || v === undefined || !isFinite(v)) ? null : Number(v);
}
function nowHourFraction(){
if (date !== todayUTC()) return null;
var d = new Date();
return d.getUTCHours() + d.getUTCMinutes()/60;
}
function svgEl(tag, attrs){
var e = document.createElementNS("http://www.w3.org/2000/svg", tag);
for (var k in attrs) if (attrs[k] !== undefined && attrs[k] !== null) e.setAttribute(k, String(attrs[k]));
return e;
}
function drawChart(hours, dmin, dmax){
var host = $("chart");
host.innerHTML = "";
if (!hours.length){
var msg = document.createElement("p");
msg.style.cssText = "font-size:13.5px;color:var(--ink-dim)";
msg.textContent = "Hourly temperatures are not available for this date.";
host.appendChild(msg);
return;
}
var box = host.getBoundingClientRect();
var W = Math.max(420, Math.round(box.width) - 24);
var H = Math.max(170, Math.round(box.height) - 16);
var PL = 42, PR = 22, PT = 34, PB = 28;
var temps = hours.map(function(x){ return x.t; });
var lo = Math.min.apply(null, temps), hi = Math.max.apply(null, temps);
if (dmin !== null) lo = Math.min(lo, dmin);
if (dmax !== null) hi = Math.max(hi, dmax);
var pad = Math.max(1, (hi - lo) * 0.22);
var y0 = lo - pad, y1 = hi + pad;
var innerW = W - PL - PR, innerH = H - PT - PB;
var n = hours.length;
var X = function(i){ return PL + (n === 1 ? innerW/2 : innerW * i / (n - 1)); };
var Y = function(v){ return PT + innerH * (y1 - v) / (y1 - y0 || 1); };
var svg = svgEl("svg", {width:W, height:H, viewBox:"0 0 " + W + " " + H, role:"img"});
svg.setAttribute("aria-label", "Hourly temperature chart for " + date);
var defs = svgEl("defs");
var grad = svgEl("linearGradient", {id:"areaGrad", x1:0, y1:0, x2:0, y2:1});
grad.appendChild(svgEl("stop", {offset:"0%", "stop-color":"var(--accent)", "stop-opacity":".42"}));
grad.appendChild(svgEl("stop", {offset:"100%", "stop-color":"var(--accent)", "stop-opacity":"0"}));
defs.appendChild(grad);
svg.appendChild(defs);
/* gridlines */
for (var g = 0; g <= 3; g++){
var val = y0 + (y1 - y0) * g / 3;
var gy = Y(val);
svg.appendChild(svgEl("line", {class:"grid-line", x1:PL - 6, y1:gy, x2:W - PR, y2:gy}));
var lab = svgEl("text", {class:"grid-label", x:PL - 11, y:gy + 3.4, "text-anchor":"end"});
lab.textContent = Math.round(val) + "°";
svg.appendChild(lab);
}
var pts = hours.map(function(x, i){ return [X(i), Y(x.t)]; });
function curve(p){
var d = "M" + p[0][0].toFixed(2) + "," + p[0][1].toFixed(2);
for (var i = 0; i < p.length - 1; i++){
var p0 = p[i-1] || p[i], p1 = p[i], p2 = p[i+1], p3 = p[i+2] || p2, t = 0.2;
d += " C" + (p1[0] + (p2[0]-p0[0])*t).toFixed(2) + "," + (p1[1] + (p2[1]-p0[1])*t).toFixed(2) +
" " + (p2[0] - (p3[0]-p1[0])*t).toFixed(2) + "," + (p2[1] - (p3[1]-p1[1])*t).toFixed(2) +
" " + p2[0].toFixed(2) + "," + p2[1].toFixed(2);
}
return d;
}
var line = curve(pts);
svg.appendChild(svgEl("path", {class:"area", d: line + " L" + pts[n-1][0].toFixed(2) + "," + (H-PB) + " L" + pts[0][0].toFixed(2) + "," + (H-PB) + " Z", fill:"url(#areaGrad)"}));
var linePath = svgEl("path", {class:"line", d: line});
svg.appendChild(linePath);
/* now marker */
var nowF = nowHourFraction();
if (nowF !== null && n > 1){
var span = hours[n-1].h - hours[0].h;
if (span > 0){
var frac = (nowF - hours[0].h) / span;
if (frac >= 0 && frac <= 1){
var nx = PL + innerW * frac;
svg.appendChild(svgEl("line", {class:"nowline", x1:nx, y1:PT - 12, x2:nx, y2:H - PB}));
var nl = svgEl("text", {class:"nowlabel", x:nx, y:PT - 17});
nl.textContent = "NOW";
svg.appendChild(nl);
}
}
}
/* points + x labels */
var iMin = temps.indexOf(Math.min.apply(null, temps));
var iMax = temps.indexOf(Math.max.apply(null, temps));
hours.forEach(function(x, i){
svg.appendChild(svgEl("circle", {class:"dot", cx:pts[i][0], cy:pts[i][1], r: (i===iMin||i===iMax) ? 3.6 : 2.4}));
if (x.h % 3 === 0){
var xl = svgEl("text", {class:"x-label", x:pts[i][0], y:H - PB + 16});
xl.textContent = (x.h < 10 ? "0" + x.h : x.h) + ":00";
svg.appendChild(xl);
}
});
[[iMax,-1],[iMin,1]].forEach(function(pair){
var i = pair[0], dir = pair[1];
if (i < 0) return;
var txt = n1(temps[i]) + "°";
var w = 20 + txt.length * 6.4;
var cx = Math.min(Math.max(pts[i][0], PL + w/2), W - PR - w/2);
var cy = pts[i][1] + dir * 20;
if (cy > H - PB - 13) cy = pts[i][1] - 20;
if (cy < 13) cy = pts[i][1] + 20;
svg.appendChild(svgEl("rect", {class:"pin-bg", x:cx - w/2, y:cy - 10.5, width:w, height:21, rx:10.5}));
var t = svgEl("text", {class:"pin-t", x:cx, y:cy + 4});
t.textContent = txt;
svg.appendChild(t);
});
host.appendChild(svg);
var still = window.matchMedia && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
if (!still && linePath.getTotalLength){
var len = linePath.getTotalLength();
linePath.style.strokeDasharray = len + " " + len;
linePath.style.strokeDashoffset = len;
requestAnimationFrame(function(){
linePath.style.transition = "stroke-dashoffset 1.4s cubic-bezier(.35,.55,.15,1) .18s";
linePath.style.strokeDashoffset = "0";
});
}
}
function drawHours(hours){
var host = $("hours");
host.innerHTML = "";
if (!hours.length) return;
var temps = hours.map(function(x){ return x.t; });
var lo = Math.min.apply(null, temps), hi = Math.max.apply(null, temps);
var range = (hi - lo) || 1;
var nowH = date === todayUTC() ? new Date().getUTCHours() : -1;
hours.forEach(function(x, i){
var cell = document.createElement("div");
cell.className = "hour" + (x.h === nowH ? " is-now" : "");
cell.style.setProperty("--w", ((x.t - lo) / range).toFixed(3));
cell.style.animationDelay = (0.5 + i * 0.014).toFixed(3) + "s";
var t = document.createElement("span");
t.className = "hour__t";
t.textContent = x.label;
var v = document.createElement("span");
v.className = "hour__v";
v.textContent = n1(x.t) + "°";
var bar = document.createElement("span");
bar.className = "hour__bar";
cell.appendChild(t); cell.appendChild(v); cell.appendChild(bar);
cell.title = x.label + " UTC · " + n1(x.t) + " °C";
host.appendChild(cell);
});
}
})();
</script>
</body>
</html>L1 —— 廉价的确定性描述量
| bytes 总计 | 31,004 | html / css / js | 2,629 / 11,773 / 16,602 |
|---|---|---|---|
| dom 节点 | 55 | dom 深度 | 9 |
| css 规则 | 101 | 含 js | 是 |
| brightness | 72.0 | contrast | 29.4 |
| colorfulness | 44.9 | 留白 | 34.1% |
该 slot 的 telemetry
| prompt tokens | 6 | completion tokens | 15,383 |
|---|---|---|---|
| total tokens | 15,389 | wall | 1,349.6 s |
| cost | — | request id | — |
config.json602 B
{
"N": 2,
"auth": {
"credential_ref": "WCB_NONE",
"method": "oauth-login"
},
"billing": "plan",
"config_id": "claude-opus-5-thinking-eff-high--cli--cursor--dev",
"effort": "high",
"family": "claude",
"m": {
"min": 2,
"q": 2
},
"model_id": "claude-opus-5-thinking",
"protocol": "cli",
"served_model": "claude-opus-5-thinking-high",
"telemetry": {
"completion_tokens": 56538,
"cost_usd": null,
"prompt_tokens": 12,
"total_tokens": 56550,
"wall_ms": 1799628
},
"transport": "cursor-agent-cli-isolated-home",
"vendor_sanction_ref": null
}send-log2.5 KB
{
"N": 2,
"batch_id": "2026-08-13--cursor-s3",
"config_id": "claude-opus-5-thinking-eff-high--cli--cursor--dev",
"positions": [
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-08-12T17:03:01.931547+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-12T17:01:49.131660+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-12T17:25:35.008396+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-12T17:03:05.459794+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-12T17:29:59.586272+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-12T17:25:39.793672+00:00"
}
],
"block_index": 1,
"model_reaching_attempt_index": 0,
"slot_index": 1,
"terminal_state": "valid",
"variant": "P-q"
},
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-08-12T17:32:01.274234+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-12T17:30:03.812750+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
}
}
}