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

截图是 similarity 通道测量时的原始像素。运行 live 会在 sandboxed iframe 中重新执行原始输出;渲染结果取决于你的浏览器和字体,不保证与测量像素一致。
similarity 邻居
最近
gemini-3.6-flash @low · cursor-xl0.71grok-4.5 · go0.71claude-sonnet-4-6 @medium · kiro0.70gemini-3.6-flash @minimal · api0.70gemini-3.7-flash @medium · agy0.70最远
north-mini-code-free · api0.52gpt-6-astra · codex0.52grok-4.6 @medium · grok-cli0.53grok-4.6 @high · grok-cli0.53claude-sonnet-4 · cursor0.53限于 session 2026-07-19--unified
similarity 衡量本 session 内的趋同程度 —— 不是质量。
Fidelity —— 卡片展示的数据对不对?
- namematch
- conditionmismatchother-wmo-code
- datematch
- max tempmatch展示值:25
- min tempmismatch展示值:17
- 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">
<title>Weather Card</title>
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--bg: #0f172a;
--card-bg: rgba(255,255,255,0.04);
--card-border: rgba(255,255,255,0.08);
--text-primary: #f1f5f9;
--text-secondary: #94a3b8;
--text-muted: #64748b;
--accent: #38bdf8;
--accent-glow: rgba(56,189,248,0.2);
--warm: #fb923c;
--cold: #818cf8;
--grid: rgba(255,255,255,0.03);
}
html, body {
width: 1280px;
height: 800px;
overflow: hidden;
background: var(--bg);
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Inter', sans-serif;
color: var(--text-primary);
-webkit-font-smoothing: antialiased;
}
body {
display: flex;
align-items: center;
justify-content: center;
position: relative;
}
/* Background orbs */
.bg-orb {
position: fixed;
border-radius: 50%;
filter: blur(80px);
pointer-events: none;
z-index: 0;
}
.bg-orb-1 {
width: 600px; height: 600px;
top: -200px; left: -150px;
background: radial-gradient(circle, rgba(56,189,248,0.12) 0%, transparent 70%);
}
.bg-orb-2 {
width: 500px; height: 500px;
bottom: -150px; right: -100px;
background: radial-gradient(circle, rgba(129,140,248,0.1) 0%, transparent 70%);
}
.bg-orb-3 {
width: 400px; height: 400px;
top: 50%; left: 50%;
transform: translate(-50%, -50%);
background: radial-gradient(circle, rgba(251,146,60,0.05) 0%, transparent 70%);
}
/* Grid lines */
.bg-grid {
position: fixed;
inset: 0;
z-index: 0;
background-image:
linear-gradient(var(--grid) 1px, transparent 1px),
linear-gradient(90deg, var(--grid) 1px, transparent 1px);
background-size: 40px 40px;
}
.card-wrapper {
position: relative;
z-index: 1;
width: 1100px;
}
/* Error state */
.error-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 16px;
padding: 80px;
background: var(--card-bg);
border: 1px solid rgba(239,68,68,0.3);
border-radius: 24px;
backdrop-filter: blur(20px);
text-align: center;
}
.error-icon { font-size: 48px; line-height: 1; }
.error-title { font-size: 24px; font-weight: 600; color: #f87171; }
.error-msg { font-size: 15px; color: var(--text-secondary); max-width: 400px; line-height: 1.6; }
/* Loading state */
.loading-state {
display: flex;
flex-direction: column;
align-items: center;
gap: 20px;
padding: 80px;
}
.spinner {
width: 48px; height: 48px;
border: 3px solid rgba(56,189,248,0.2);
border-top-color: var(--accent);
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
@keyframes spin { to { transform: rotate(360deg); } }
.loading-text { color: var(--text-secondary); font-size: 15px; }
/* Main card layout */
.card {
background: var(--card-bg);
border: 1px solid var(--card-border);
border-radius: 28px;
backdrop-filter: blur(24px);
overflow: hidden;
display: grid;
grid-template-columns: 380px 1fr;
grid-template-rows: auto auto;
box-shadow:
0 0 0 1px rgba(255,255,255,0.03) inset,
0 32px 64px rgba(0,0,0,0.4),
0 0 80px rgba(56,189,248,0.04);
}
/* Left panel */
.panel-left {
grid-row: 1 / 3;
padding: 48px 44px;
border-right: 1px solid var(--card-border);
display: flex;
flex-direction: column;
gap: 32px;
background: linear-gradient(160deg, rgba(255,255,255,0.04) 0%, transparent 100%);
position: relative;
}
.location-row {
display: flex;
flex-direction: column;
gap: 6px;
}
.location-label {
display: flex;
align-items: center;
gap: 8px;
font-size: 13px;
font-weight: 500;
color: var(--accent);
letter-spacing: 0.08em;
text-transform: uppercase;
}
.location-dot {
width: 6px; height: 6px;
background: var(--accent);
border-radius: 50%;
box-shadow: 0 0 8px var(--accent);
animation: pulse-dot 2s ease-in-out infinite;
}
@keyframes pulse-dot {
0%, 100% { opacity: 1; box-shadow: 0 0 8px var(--accent); }
50% { opacity: 0.6; box-shadow: 0 0 16px var(--accent); }
}
.location-name {
font-size: 36px;
font-weight: 700;
color: var(--text-primary);
line-height: 1.1;
letter-spacing: -0.02em;
}
.location-coords {
font-size: 12px;
color: var(--text-muted);
font-variant-numeric: tabular-nums;
}
.date-block {
display: flex;
flex-direction: column;
gap: 4px;
}
.date-label {
font-size: 11px;
font-weight: 600;
color: var(--text-muted);
letter-spacing: 0.1em;
text-transform: uppercase;
}
.date-value {
font-size: 18px;
font-weight: 600;
color: var(--text-secondary);
}
.date-weekday {
font-size: 13px;
color: var(--text-muted);
}
.weather-hero {
flex: 1;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 16px;
}
.weather-icon-wrap {
width: 100px; height: 100px;
border-radius: 24px;
background: linear-gradient(135deg, rgba(56,189,248,0.12), rgba(129,140,248,0.08));
border: 1px solid rgba(56,189,248,0.15);
display: flex;
align-items: center;
justify-content: center;
font-size: 52px;
line-height: 1;
box-shadow: 0 8px 32px rgba(0,0,0,0.2), 0 0 0 1px rgba(255,255,255,0.04) inset;
}
.condition-label {
font-size: 15px;
color: var(--text-secondary);
font-weight: 400;
line-height: 1.4;
}
.temp-display {
display: flex;
align-items: flex-start;
gap: 0;
}
.temp-max {
font-size: 88px;
font-weight: 800;
line-height: 1;
letter-spacing: -0.04em;
background: linear-gradient(135deg, #fb923c, #fbbf24);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.temp-unit {
font-size: 32px;
font-weight: 400;
margin-top: 12px;
background: linear-gradient(135deg, #fb923c, #fbbf24);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
opacity: 0.8;
}
.temp-range {
display: flex;
align-items: center;
gap: 12px;
padding: 12px 16px;
background: rgba(255,255,255,0.03);
border: 1px solid var(--card-border);
border-radius: 12px;
}
.temp-range-item {
display: flex;
flex-direction: column;
gap: 2px;
}
.temp-range-lbl {
font-size: 10px;
font-weight: 600;
letter-spacing: 0.1em;
text-transform: uppercase;
}
.temp-range-lbl.hot { color: var(--warm); }
.temp-range-lbl.cold { color: var(--cold); }
.temp-range-val {
font-size: 18px;
font-weight: 700;
font-variant-numeric: tabular-nums;
}
.temp-range-val.hot { color: var(--warm); }
.temp-range-val.cold { color: var(--cold); }
.temp-range-divider {
width: 1px;
height: 32px;
background: var(--card-border);
margin: 0 4px;
}
/* Right panel top */
.panel-right-top {
padding: 36px 44px 24px;
border-bottom: 1px solid var(--card-border);
}
.section-label {
font-size: 11px;
font-weight: 600;
color: var(--text-muted);
letter-spacing: 0.12em;
text-transform: uppercase;
margin-bottom: 20px;
}
/* Chart */
.chart-container {
position: relative;
height: 180px;
}
.chart-svg {
width: 100%;
height: 100%;
overflow: visible;
}
/* Right panel bottom - hourly grid */
.panel-right-bottom {
padding: 24px 44px 36px;
}
.hourly-scroll {
display: grid;
grid-template-columns: repeat(12, 1fr);
gap: 6px;
}
.hour-pill {
display: flex;
flex-direction: column;
align-items: center;
gap: 6px;
padding: 12px 6px;
border-radius: 12px;
background: rgba(255,255,255,0.03);
border: 1px solid rgba(255,255,255,0.05);
transition: background 0.2s, border-color 0.2s;
cursor: default;
position: relative;
overflow: hidden;
}
.hour-pill:hover {
background: rgba(255,255,255,0.06);
border-color: rgba(255,255,255,0.1);
}
.hour-pill.current {
background: rgba(56,189,248,0.08);
border-color: rgba(56,189,248,0.25);
}
.hour-pill.current::before {
content: '';
position: absolute;
top: 0; left: 0; right: 0;
height: 2px;
background: linear-gradient(90deg, transparent, var(--accent), transparent);
}
.hour-time {
font-size: 10px;
font-weight: 600;
color: var(--text-muted);
letter-spacing: 0.04em;
}
.hour-pill.current .hour-time {
color: var(--accent);
}
.hour-temp {
font-size: 14px;
font-weight: 700;
font-variant-numeric: tabular-nums;
color: var(--text-primary);
}
.hour-bar-wrap {
width: 100%;
height: 3px;
background: rgba(255,255,255,0.06);
border-radius: 2px;
overflow: hidden;
}
.hour-bar {
height: 100%;
border-radius: 2px;
transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);
}
/* Tooltip */
.chart-tooltip {
position: absolute;
padding: 8px 12px;
background: rgba(15,23,42,0.95);
border: 1px solid var(--card-border);
border-radius: 10px;
font-size: 13px;
font-weight: 600;
color: var(--text-primary);
pointer-events: none;
opacity: 0;
transition: opacity 0.15s;
white-space: nowrap;
backdrop-filter: blur(8px);
transform: translate(-50%, -100%);
margin-top: -12px;
z-index: 10;
}
/* Animations */
.fade-in {
animation: fadeIn 0.6s ease both;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(12px); }
to { opacity: 1; transform: translateY(0); }
}
.fade-in-delay-1 { animation-delay: 0.1s; }
.fade-in-delay-2 { animation-delay: 0.2s; }
.fade-in-delay-3 { animation-delay: 0.3s; }
.hidden { display: none !important; }
</style>
</head>
<body>
<div class="bg-grid"></div>
<div class="bg-orb bg-orb-1"></div>
<div class="bg-orb bg-orb-2"></div>
<div class="bg-orb bg-orb-3"></div>
<div class="card-wrapper">
<div id="loading" class="loading-state">
<div class="spinner"></div>
<div class="loading-text">Fetching weather data…</div>
</div>
<div id="error" class="error-state hidden">
<div class="error-icon">⚠️</div>
<div class="error-title">Unable to load weather data</div>
<div class="error-msg" id="error-msg">The weather data could not be retrieved. Please check your connection and try again.</div>
</div>
<div id="card" class="card hidden">
<!-- Left panel -->
<div class="panel-left fade-in">
<div class="location-row">
<div class="location-label">
<span class="location-dot"></span>
Current Weather
</div>
<div class="location-name" id="loc-name">Berlin</div>
<div class="location-coords" id="loc-coords">52.52°N, 13.405°E</div>
</div>
<div class="date-block">
<div class="date-label">Date</div>
<div class="date-value" id="date-value">—</div>
<div class="date-weekday" id="date-weekday">—</div>
</div>
<div class="weather-hero">
<div class="weather-icon-wrap" id="weather-icon">🌤</div>
<div class="condition-label" id="condition-label">Partly Cloudy</div>
<div class="temp-display">
<div class="temp-max" id="temp-max">—</div>
<div class="temp-unit">°C</div>
</div>
<div class="temp-range">
<div class="temp-range-item">
<div class="temp-range-lbl hot">High</div>
<div class="temp-range-val hot" id="range-high">—°</div>
</div>
<div class="temp-range-divider"></div>
<div class="temp-range-item">
<div class="temp-range-lbl cold">Low</div>
<div class="temp-range-val cold" id="range-low">—°</div>
</div>
</div>
</div>
</div>
<!-- Right top: chart -->
<div class="panel-right-top fade-in fade-in-delay-1">
<div class="section-label">Hourly Temperature</div>
<div class="chart-container">
<svg class="chart-svg" id="chart-svg" viewBox="0 0 660 180" preserveAspectRatio="none"></svg>
<div class="chart-tooltip" id="chart-tooltip"></div>
</div>
</div>
<!-- Right bottom: hourly pills -->
<div class="panel-right-bottom fade-in fade-in-delay-2">
<div class="section-label">24-Hour Breakdown</div>
<div class="hourly-scroll" id="hourly-grid"></div>
</div>
</div>
</div>
<script>
(function () {
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';
const todayUTC = new Date().toISOString().slice(0, 10);
const date = params.get('date') ?? todayUTC;
const WMO = {
0: ['Clear Sky', '☀️'],
1: ['Mainly Clear', '🌤'],
2: ['Partly Cloudy', '⛅'],
3: ['Overcast', '☁️'],
45: ['Foggy', '🌫'],
48: ['Icy Fog', '🌫'],
51: ['Light Drizzle', '🌦'],
53: ['Drizzle', '🌧'],
55: ['Heavy Drizzle', '🌧'],
56: ['Freezing Drizzle', '🌨'],
57: ['Heavy Freezing Drizzle', '🌨'],
61: ['Light Rain', '🌧'],
63: ['Rain', '🌧'],
65: ['Heavy Rain', '🌧'],
66: ['Freezing Rain', '🌨'],
67: ['Heavy Freezing Rain', '🌨'],
71: ['Light Snow', '❄️'],
73: ['Snow', '❄️'],
75: ['Heavy Snow', '❄️'],
77: ['Snow Grains', '🌨'],
80: ['Light Showers', '🌦'],
81: ['Showers', '🌦'],
82: ['Heavy Showers', '⛈'],
85: ['Snow Showers', '🌨'],
86: ['Heavy Snow Showers', '🌨'],
95: ['Thunderstorm', '⛈'],
96: ['Thunderstorm w/ Hail', '⛈'],
99: ['Thunderstorm w/ Heavy Hail', '⛈'],
};
function wmoInfo(code) {
return WMO[code] ?? ['Unknown', '🌡'];
}
function formatDate(dateStr) {
const d = new Date(dateStr + 'T00:00:00Z');
const days = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
const months = ['January','February','March','April','May','June','July','August','September','October','November','December'];
return {
full: `${months[d.getUTCMonth()]} ${d.getUTCDate()}, ${d.getUTCFullYear()}`,
weekday: days[d.getUTCDay()],
};
}
function coordLabel(v, pos, neg) {
return v >= 0 ? `${Math.abs(v)}°${pos}` : `${Math.abs(v)}°${neg}`;
}
function showError(msg) {
document.getElementById('loading').classList.add('hidden');
document.getElementById('card').classList.add('hidden');
document.getElementById('error').classList.remove('hidden');
if (msg) document.getElementById('error-msg').textContent = msg;
}
function isArchive(dateStr) {
const d = new Date(dateStr + 'T00:00:00Z');
const now = new Date();
const yesterday = new Date(now);
yesterday.setUTCDate(yesterday.getUTCDate() - 1);
// archive for dates before yesterday
return d < new Date(yesterday.toISOString().slice(0, 10) + 'T00:00:00Z');
}
async function fetchWeather() {
const useArchive = isArchive(date);
const endpoint = useArchive ? '/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: date,
end_date: date,
});
const url = `${endpoint}?${qs}`;
const res = await fetch(url);
if (!res.ok) throw new Error(`HTTP ${res.status} from ${endpoint}`);
return res.json();
}
function buildChart(svg, temps, currentHour) {
const W = 660, H = 180;
const pad = { top: 24, right: 8, bottom: 32, left: 32 };
const iw = W - pad.left - pad.right;
const ih = H - pad.top - pad.bottom;
const min = Math.min(...temps) - 2;
const max = Math.max(...temps) + 2;
const xs = temps.map((_, i) => pad.left + (i / (temps.length - 1)) * iw);
const ys = temps.map(t => pad.top + ih - ((t - min) / (max - min)) * ih);
const areaPath = buildPath(xs, ys, H - pad.bottom, true);
const linePath = buildPath(xs, ys, null, false);
svg.innerHTML = '';
// Gradient defs
const defs = svgEl('defs');
const grad = svgEl('linearGradient', { id: 'tg', x1: '0', y1: '0', x2: '0', y2: '1' });
grad.innerHTML = `
<stop offset="0%" stop-color="rgba(56,189,248,0.3)"/>
<stop offset="100%" stop-color="rgba(56,189,248,0)"/>
`;
const lineGrad = svgEl('linearGradient', { id: 'lg', x1: '0', y1: '0', x2: '1', y2: '0' });
lineGrad.innerHTML = `
<stop offset="0%" stop-color="rgba(56,189,248,0.4)"/>
<stop offset="50%" stop-color="rgba(56,189,248,1)"/>
<stop offset="100%" stop-color="rgba(129,140,248,0.6)"/>
`;
defs.appendChild(grad);
defs.appendChild(lineGrad);
svg.appendChild(defs);
// Grid lines
const gridCount = 4;
for (let i = 0; i <= gridCount; i++) {
const y = pad.top + (i / gridCount) * ih;
const gridLine = svgEl('line', { x1: pad.left, y1: y, x2: W - pad.right, y2: y,
stroke: 'rgba(255,255,255,0.04)', 'stroke-width': '1' });
svg.appendChild(gridLine);
const temp = max - (i / gridCount) * (max - min);
const lbl = svgEl('text', { x: pad.left - 6, y: y + 4, 'text-anchor': 'end',
fill: 'rgba(148,163,184,0.6)', 'font-size': '10', 'font-family': 'system-ui' });
lbl.textContent = Math.round(temp) + '°';
svg.appendChild(lbl);
}
// Area fill
const area = svgEl('path', { d: areaPath, fill: 'url(#tg)' });
svg.appendChild(area);
// Line
const line = svgEl('path', { d: linePath, fill: 'none', stroke: 'url(#lg)',
'stroke-width': '2.5', 'stroke-linecap': 'round', 'stroke-linejoin': 'round' });
svg.appendChild(line);
// Hour labels (every 6)
for (let i = 0; i < temps.length; i++) {
if (i % 6 === 0) {
const lbl = svgEl('text', { x: xs[i], y: H - pad.bottom + 14, 'text-anchor': 'middle',
fill: 'rgba(148,163,184,0.5)', 'font-size': '10', 'font-family': 'system-ui' });
lbl.textContent = String(i).padStart(2, '0') + ':00';
svg.appendChild(lbl);
}
}
// Dots + interaction
const tooltip = document.getElementById('chart-tooltip');
const hitAreas = [];
for (let i = 0; i < temps.length; i++) {
const isCurrent = i === currentHour;
const dot = svgEl('circle', {
cx: xs[i], cy: ys[i], r: isCurrent ? '5' : '3.5',
fill: isCurrent ? '#38bdf8' : 'rgba(56,189,248,0.5)',
stroke: isCurrent ? 'rgba(56,189,248,0.4)' : 'none',
'stroke-width': '6',
});
svg.appendChild(dot);
// Hit rect
const hit = svgEl('rect', {
x: xs[i] - 12, y: pad.top, width: '24', height: ih + pad.bottom,
fill: 'transparent', style: 'cursor:crosshair',
});
hit.addEventListener('mouseenter', () => {
const rect = svg.closest('.chart-container').getBoundingClientRect();
const svgRect = svg.getBoundingClientRect();
const cx = svgRect.left + (xs[i] / W) * svgRect.width - rect.left;
const cy = svgRect.top + (ys[i] / H) * svgRect.height - rect.top;
tooltip.style.left = cx + 'px';
tooltip.style.top = cy + 'px';
tooltip.textContent = `${String(i).padStart(2,'0')}:00 ${temps[i].toFixed(1)}°C`;
tooltip.style.opacity = '1';
});
hit.addEventListener('mouseleave', () => { tooltip.style.opacity = '0'; });
svg.appendChild(hit);
}
}
function buildPath(xs, ys, closeY, close) {
let d = `M ${xs[0]} ${ys[0]}`;
for (let i = 1; i < xs.length; i++) {
const cpx = (xs[i - 1] + xs[i]) / 2;
d += ` C ${cpx} ${ys[i - 1]}, ${cpx} ${ys[i]}, ${xs[i]} ${ys[i]}`;
}
if (close) {
d += ` L ${xs[xs.length - 1]} ${closeY} L ${xs[0]} ${closeY} Z`;
}
return d;
}
function svgEl(tag, attrs = {}) {
const el = document.createElementNS('http://www.w3.org/2000/svg', tag);
Object.entries(attrs).forEach(([k, v]) => el.setAttribute(k, v));
return el;
}
function buildHourlyGrid(temps, currentHour) {
const grid = document.getElementById('hourly-grid');
grid.innerHTML = '';
const minT = Math.min(...temps);
const maxT = Math.max(...temps);
const range = maxT - minT || 1;
// Show every 2 hours for 12 columns
for (let h = 0; h < 24; h += 2) {
const t = temps[h];
const norm = (t - minT) / range;
const pill = document.createElement('div');
pill.className = 'hour-pill' + (h === Math.floor(currentHour / 2) * 2 ? ' current' : '');
const hot = norm > 0.5;
const color = hot
? `rgb(${Math.round(251 * norm + 129 * (1 - norm))}, ${Math.round(146 * norm + 140 * (1 - norm))}, ${Math.round(60 * norm + 248 * (1 - norm))})`
: `rgb(${Math.round(56 * norm + 129 * (1 - norm))}, ${Math.round(189 * norm + 140 * (1 - norm))}, ${Math.round(248 * norm + 248 * (1 - norm))})`;
const barColor = norm > 0.6 ? 'var(--warm)' : norm < 0.4 ? 'var(--cold)' : 'var(--accent)';
pill.innerHTML = `
<div class="hour-time">${String(h).padStart(2,'0')}:00</div>
<div class="hour-temp">${t > 0 ? '+' : ''}${t.toFixed(0)}°</div>
<div class="hour-bar-wrap">
<div class="hour-bar" style="width:${Math.round(norm * 100)}%; background:${barColor};"></div>
</div>
`;
grid.appendChild(pill);
}
}
async function main() {
try {
const data = await fetchWeather();
if (!data.daily || !data.hourly) {
showError('The API returned an unexpected response format.');
return;
}
const tmax = data.daily.temperature_2m_max?.[0];
const tmin = data.daily.temperature_2m_min?.[0];
const wcode = data.daily.weather_code?.[0];
if (tmax == null || tmin == null) {
showError('Temperature data is missing in the API response.');
return;
}
const hourTemps = data.hourly.temperature_2m ?? [];
if (hourTemps.length === 0) {
showError('Hourly temperature data is missing in the API response.');
return;
}
const [condLabel, condIcon] = wmoInfo(wcode);
const df = formatDate(date);
const nowH = new Date().getUTCHours();
// Populate
document.getElementById('loc-name').textContent = name;
document.getElementById('loc-coords').textContent =
`${coordLabel(lat, 'N', 'S')}, ${coordLabel(lon, 'E', 'W')}`;
document.getElementById('date-value').textContent = df.full;
document.getElementById('date-weekday').textContent = df.weekday;
document.getElementById('weather-icon').textContent = condIcon;
document.getElementById('condition-label').textContent = condLabel;
document.getElementById('temp-max').textContent = Math.round(tmax);
document.getElementById('range-high').textContent = `${Math.round(tmax)}°`;
document.getElementById('range-low').textContent = `${Math.round(tmin)}°`;
// Dynamic bg accent based on temperature
if (tmax > 28) {
document.documentElement.style.setProperty('--accent', '#fb923c');
document.documentElement.style.setProperty('--accent-glow', 'rgba(251,146,60,0.2)');
} else if (tmax < 5) {
document.documentElement.style.setProperty('--accent', '#818cf8');
document.documentElement.style.setProperty('--accent-glow', 'rgba(129,140,248,0.2)');
}
buildChart(document.getElementById('chart-svg'), hourTemps, nowH);
buildHourlyGrid(hourTemps, nowH);
document.getElementById('loading').classList.add('hidden');
document.getElementById('card').classList.remove('hidden');
} catch (e) {
showError(`Failed to load weather data: ${e.message}`);
}
}
main();
})();
</script>
</body>
</html>L1 —— 廉价的确定性描述量
| bytes 总计 | 24,211 | html / css / js | 2,852 / 9,896 / 11,463 |
|---|---|---|---|
| dom 节点 | 53 | dom 深度 | 9 |
| css 规则 | 72 | 含 js | 是 |
| brightness | 34.0 | contrast | 15.0 |
| colorfulness | 20.3 | 留白 | 88.6% |
该 slot 的 telemetry
| prompt tokens | 7 | completion tokens | 9,549 |
|---|---|---|---|
| total tokens | 9,556 | wall | 126.3 s |
| cost | — | request id | — |
config.json592 B
{
"N": 2,
"auth": {
"credential_ref": "WCB_NONE",
"method": "oauth-login"
},
"billing": "plan",
"config_id": "claude-sonnet-4-6-eff-medium--cli--cursor--dev",
"effort": "medium",
"family": "claude",
"m": {
"min": 2,
"q": 2
},
"model_id": "claude-sonnet-4-6",
"protocol": "cli",
"served_model": "claude-4.6-sonnet-medium",
"telemetry": {
"completion_tokens": 27056,
"cost_usd": null,
"prompt_tokens": 20,
"total_tokens": 27076,
"wall_ms": 347444
},
"transport": "cursor-agent-cli-isolated-home",
"vendor_sanction_ref": null
}send-log2.5 KB
{
"N": 2,
"batch_id": "2026-08-13--cursor-s2",
"config_id": "claude-4.6-sonnet-eff-medium--cli--cursor--dev",
"positions": [
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-08-12T20:52:44.492179+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-12T20:50:38.146866+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-12T20:53:53.088878+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-12T20:52:48.888950+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-12T20:54:56.816600+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-12T20:53:56.414680+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-12T20:56:36.485641+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-12T20:54:59.916253+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
}
}
}