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

渲染不确定 — 同一份输入重复渲染会得到不同像素(随机/时间相关的内容),因此视觉通道对这张卡的读数不如其他卡稳定。
截图是 similarity 通道测量时的原始像素。运行 live 会在 sandboxed iframe 中重新执行原始输出;渲染结果取决于你的浏览器和字体,不保证与测量像素一致。
similarity 邻居本 session 没有 similarity 数据 —— 这个 batch 没有计算 pairs。
Fidelity —— 卡片展示的数据对不对?
- namematch
- conditionmatch
- datematch
- max tempmismatch展示值:52.52
- min tempmismatch展示值:13.405
- hourlymismatchcoverage 0/24 · 0 命中 · 2 不符 · 22 未展示
- request sidematch0 处违规
extractor fidelity-extractor-v1+Berlin-2026-07-15
源码 —— 原始模型输出,一字节未改
下载 card.html<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Weather Card</title>
<meta name="viewport" content="width=1280, height=800, initial-scale=1.0">
<style>
:root {
--bg: #050816;
--bg-elevated: rgba(19, 24, 46, 0.92);
--accent: #38bdf8;
--accent-soft: rgba(56, 189, 248, 0.18);
--accent-strong: #0ea5e9;
--accent-contrast: #f9fafb;
--text-main: #e5e7eb;
--text-muted: #9ca3af;
--text-soft: #6b7280;
--border-subtle: rgba(148, 163, 184, 0.16);
--shadow-strong: 0 32px 80px rgba(15, 23, 42, 0.9);
--shadow-soft: 0 18px 45px rgba(15, 23, 42, 0.65);
--radius-lg: 28px;
--radius-pill: 999px;
}
* {
box-sizing: border-box;
}
html, body {
margin: 0;
padding: 0;
width: 1280px;
height: 800px;
overflow: hidden;
font-family: system-ui, -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI", sans-serif;
background: radial-gradient(circle at top left, #1d283a 0, #020617 52%, #020617 100%);
color: var(--text-main);
}
body {
display: flex;
align-items: center;
justify-content: center;
padding: 32px 40px;
}
.page-shell {
width: 100%;
height: 100%;
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
.orbital {
position: absolute;
inset: 0;
pointer-events: none;
overflow: hidden;
filter: blur(40px);
opacity: 0.9;
}
.orbital::before,
.orbital::after {
content: "";
position: absolute;
border-radius: 999px;
mix-blend-mode: screen;
}
.orbital::before {
width: 520px;
height: 520px;
background: radial-gradient(circle at 30% 20%, rgba(56,189,248,0.65), transparent 60%);
top: -140px;
right: -90px;
}
.orbital::after {
width: 460px;
height: 460px;
background: radial-gradient(circle at 70% 80%, rgba(129,140,248,0.6), transparent 65%);
bottom: -160px;
left: -40px;
}
.card {
position: relative;
display: grid;
grid-template-columns: 1.25fr 1.75fr;
gap: 24px;
max-width: 1120px;
width: 100%;
max-height: 640px;
padding: 26px 26px 24px;
background: radial-gradient(circle at 8% 0%, rgba(56,189,248,0.18), transparent 45%),
linear-gradient(145deg, rgba(15,23,42,0.96), rgba(15,23,42,0.98));
border-radius: 30px;
border: 1px solid rgba(148,163,184,0.22);
backdrop-filter: blur(26px) saturate(130%);
box-shadow: var(--shadow-strong);
overflow: hidden;
}
.card::before {
content: "";
position: absolute;
inset: 0;
border-radius: inherit;
border: 1px solid rgba(148,163,184,0.18);
mask-image: radial-gradient(circle at top left, black 0%, transparent 55%);
opacity: 0.8;
pointer-events: none;
}
.card::after {
content: "";
position: absolute;
inset: 0;
border-radius: inherit;
background: radial-gradient(circle at top, rgba(255,255,255,0.16) 0, transparent 55%);
opacity: 0.08;
pointer-events: none;
}
.card-left,
.card-right {
position: relative;
z-index: 1;
min-width: 0;
}
.card-left {
border-radius: 24px;
background: radial-gradient(circle at 0% 0%, rgba(56,189,248,0.26), transparent 60%),
radial-gradient(circle at 110% 20%, rgba(96,165,250,0.3), transparent 55%),
linear-gradient(160deg, rgba(15,23,42,0.9), rgba(15,23,42,0.98));
padding: 20px 18px 18px;
display: flex;
flex-direction: column;
box-shadow: var(--shadow-soft);
border: 1px solid rgba(148,163,184,0.18);
}
.pill-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
margin-bottom: 16px;
}
.pill {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 6px 12px;
border-radius: var(--radius-pill);
background: linear-gradient(135deg, rgba(15,23,42,0.85), rgba(15,23,42,0.7));
border: 1px solid rgba(148,163,184,0.55);
box-shadow: 0 8px 22px rgba(15,23,42,0.6);
}
.pill-badge {
font-size: 11px;
font-weight: 600;
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--accent-contrast);
padding: 3px 8px;
border-radius: var(--radius-pill);
background: linear-gradient(135deg, var(--accent-strong), #6366f1);
}
.pill-label {
font-size: 12px;
color: var(--text-muted);
letter-spacing: 0.03em;
text-transform: uppercase;
}
.pill-dot {
width: 7px;
height: 7px;
border-radius: 999px;
background: radial-gradient(circle at 30% 20%, #e5faff, #22c55e);
box-shadow: 0 0 0 5px rgba(34,197,94,0.28);
}
.pill-status-text {
font-size: 12px;
color: var(--text-main);
opacity: 0.96;
}
.headline {
margin-bottom: 10px;
}
.location-name {
font-size: 24px;
font-weight: 650;
letter-spacing: 0.01em;
color: #f9fafb;
display: flex;
align-items: baseline;
gap: 8px;
}
.location-subtitle {
font-size: 13px;
color: var(--text-soft);
margin-top: 3px;
}
.date-row {
display: flex;
align-items: center;
gap: 6px;
margin-top: 8px;
font-size: 12px;
color: var(--text-muted);
}
.date-pill {
padding: 3px 9px;
border-radius: var(--radius-pill);
background: rgba(15,23,42,0.9);
border: 1px solid rgba(148,163,184,0.35);
color: var(--text-main);
}
.summary-main {
display: flex;
align-items: flex-end;
justify-content: space-between;
gap: 14px;
margin-top: 20px;
margin-bottom: 18px;
}
.temp-block {
display: flex;
flex-direction: column;
}
.temp-now {
display: flex;
align-items: baseline;
gap: 8px;
}
.temp-current {
font-size: 52px;
line-height: 1;
font-weight: 650;
letter-spacing: -0.04em;
color: #e5f2ff;
}
.temp-unit {
font-size: 20px;
color: var(--text-soft);
transform: translateY(-4px);
}
.temp-range {
margin-top: 6px;
font-size: 13px;
color: var(--text-muted);
}
.temp-range strong {
color: #fee2e2;
font-weight: 500;
}
.condition-block {
display: flex;
align-items: center;
gap: 10px;
}
.icon-orbit {
width: 80px;
height: 80px;
border-radius: 28px;
background: radial-gradient(circle at 30% 0%, rgba(248,250,252,0.3), transparent 60%),
radial-gradient(circle at 80% 80%, rgba(56,189,248,0.45), transparent 60%);
border: 1px solid rgba(148,163,184,0.35);
position: relative;
overflow: hidden;
box-shadow: 0 18px 50px rgba(15,23,42,0.85);
}
.icon-orbit svg {
width: 100%;
height: 100%;
}
.condition-text-main {
font-size: 16px;
font-weight: 500;
color: #e5f2ff;
}
.condition-text-sub {
margin-top: 3px;
font-size: 12px;
color: var(--text-soft);
}
.meta-row {
display: flex;
gap: 8px;
margin-top: auto;
}
.meta-chip {
flex: 1;
border-radius: 999px;
background: linear-gradient(135deg, rgba(15,23,42,0.94), rgba(15,23,42,0.92));
border: 1px solid rgba(148,163,184,0.28);
padding: 7px 10px;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 11px;
color: var(--text-muted);
}
.meta-chip span {
white-space: nowrap;
}
.meta-chip strong {
color: var(--accent-contrast);
font-weight: 500;
}
.coordinates {
font-variant-numeric: tabular-nums;
}
.card-right {
border-radius: 24px;
padding: 18px 18px 16px;
background: radial-gradient(circle at 5% 0%, rgba(56,189,248,0.32), transparent 45%),
radial-gradient(circle at 110% 0%, rgba(129,140,248,0.22), transparent 60%),
linear-gradient(160deg, rgba(15,23,42,0.96), rgba(15,23,42,0.98));
border: 1px solid rgba(148,163,184,0.18);
display: flex;
flex-direction: column;
box-shadow: var(--shadow-soft);
}
.panel-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
margin-bottom: 12px;
}
.panel-title {
font-size: 13px;
font-weight: 600;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--text-muted);
}
.panel-title strong {
color: var(--accent-contrast);
}
.panel-legend {
display: flex;
align-items: center;
gap: 12px;
font-size: 11px;
color: var(--text-soft);
}
.legend-item {
display: inline-flex;
align-items: center;
gap: 6px;
white-space: nowrap;
}
.legend-swatch {
width: 24px;
height: 4px;
border-radius: 999px;
background: linear-gradient(90deg, #22c55e, #facc15, #fb923c, #ef4444);
box-shadow: 0 0 0 1px rgba(15,23,42,0.8);
}
.legend-dot {
width: 7px;
height: 7px;
border-radius: 999px;
background: var(--accent-strong);
box-shadow: 0 0 0 3px rgba(56,189,248,0.35);
}
.scroll-shell {
position: relative;
flex: 1;
border-radius: 20px;
background: radial-gradient(circle at 50% -30%, rgba(248,250,252,0.04), transparent 65%),
linear-gradient(160deg, rgba(15,23,42,0.96), rgba(15,23,42,0.98));
border: 1px solid rgba(148,163,184,0.2);
overflow: hidden;
}
.scroll-inner {
position: relative;
height: 100%;
display: flex;
flex-direction: column;
}
.hourly-strip {
padding: 14px 16px 10px;
display: flex;
align-items: stretch;
gap: 10px;
overflow-x: auto;
overflow-y: hidden;
scrollbar-width: thin;
scrollbar-color: rgba(148,163,184,0.7) transparent;
}
.hourly-strip::-webkit-scrollbar {
height: 8px;
}
.hourly-strip::-webkit-scrollbar-track {
background: transparent;
}
.hourly-strip::-webkit-scrollbar-thumb {
background: linear-gradient(90deg, rgba(148,163,184,0.7), rgba(148,163,184,0.45));
border-radius: 999px;
}
.hour-card {
min-width: 64px;
max-width: 72px;
padding: 8px 8px 7px;
border-radius: 18px;
background: linear-gradient(160deg, rgba(15,23,42,0.98), rgba(17,24,39,0.94));
border: 1px solid rgba(148,163,184,0.35);
box-shadow: 0 10px 26px rgba(15,23,42,0.85);
display: flex;
flex-direction: column;
align-items: center;
gap: 6px;
font-size: 11px;
color: var(--text-muted);
transition: transform 150ms ease-out, box-shadow 150ms ease-out, border-color 150ms ease-out, background 150ms ease-out;
}
.hour-card.highlight {
border-color: rgba(56,189,248,0.9);
box-shadow: 0 16px 36px rgba(15,23,42,0.95);
background: linear-gradient(160deg, rgba(15,23,42,1), rgba(30,64,175,0.9));
}
.hour-time {
font-variant-numeric: tabular-nums;
font-size: 11px;
}
.hour-temp {
font-size: 15px;
font-weight: 500;
color: #e5f2ff;
}
.hour-temp span {
font-size: 11px;
color: var(--text-soft);
margin-left: 1px;
}
.hour-bar-shell {
width: 100%;
height: 44px;
border-radius: 14px;
background: radial-gradient(circle at 50% 0%, rgba(148,163,184,0.45), transparent 75%),
linear-gradient(180deg, rgba(15,23,42,1), rgba(15,23,42,0.96));
overflow: hidden;
display: flex;
align-items: flex-end;
justify-content: center;
padding: 4px 6px;
}
.hour-bar {
width: 14px;
border-radius: 999px;
background: linear-gradient(180deg, rgba(251,191,36,1), rgba(249,115,22,1), rgba(239,68,68,1));
box-shadow: 0 0 0 1px rgba(15,23,42,0.9), 0 10px 18px rgba(15,23,42,0.85);
transform-origin: bottom;
}
.hour-bar.cool {
background: linear-gradient(180deg, #22c55e, #0ea5e9, #0369a1);
}
.scroll-meta {
border-top: 1px solid rgba(30,64,175,0.6);
padding: 8px 14px 9px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
font-size: 11px;
color: var(--text-soft);
background: linear-gradient(180deg, rgba(15,23,42,0.96), rgba(15,23,42,0.98));
}
.scroll-meta span {
display: inline-flex;
align-items: center;
gap: 6px;
}
.tag {
padding: 3px 8px;
border-radius: 999px;
border: 1px solid rgba(148,163,184,0.32);
background: rgba(15,23,42,0.92);
color: var(--text-muted);
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.08em;
}
.error-banner,
.status-banner {
position: absolute;
inset-inline: 18px;
bottom: 16px;
border-radius: 999px;
padding: 7px 11px;
font-size: 11px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
}
.error-banner {
background: radial-gradient(circle at 0% 50%, rgba(248,113,113,0.3), transparent 75%),
rgba(30,41,59,0.96);
border: 1px solid rgba(248,113,113,0.85);
color: #fee2e2;
box-shadow: 0 14px 28px rgba(15,23,42,0.95);
}
.status-banner {
background: radial-gradient(circle at 0% 50%, rgba(56,189,248,0.26), transparent 65%),
rgba(30,41,59,0.96);
border: 1px solid rgba(56,189,248,0.7);
color: #e0f2fe;
box-shadow: 0 14px 30px rgba(15,23,42,0.95);
}
.error-banner strong,
.status-banner strong {
font-weight: 600;
}
.banner-pill {
padding: 2px 7px;
border-radius: 999px;
border: 1px solid currentColor;
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.08em;
}
.banner-icon {
width: 14px;
height: 14px;
border-radius: 999px;
display: inline-flex;
align-items: center;
justify-content: center;
font-size: 11px;
}
.banner-icon.error {
background: radial-gradient(circle at 30% 10%, #fee2e2, #ef4444);
box-shadow: 0 0 0 3px rgba(248,113,113,0.4);
}
.banner-icon.info {
background: radial-gradient(circle at 30% 10%, #e0f2fe, #0ea5e9);
box-shadow: 0 0 0 3px rgba(56,189,248,0.4);
}
.skeleton {
position: relative;
overflow: hidden;
background: linear-gradient(90deg, rgba(15,23,42,0.9), rgba(31,41,55,0.9));
}
.skeleton::after {
content: "";
position: absolute;
inset: 0;
background: linear-gradient(120deg, transparent 0%, rgba(148,163,184,0.25) 48%, transparent 100%);
transform: translateX(-100%);
animation: shimmer 1.4s ease-out infinite;
}
@keyframes shimmer {
0% { transform: translateX(-100%); }
60% { transform: translateX(60%); }
100% { transform: translateX(100%); }
}
.hidden {
display: none !important;
}
.subtle {
opacity: 0.9;
}
@media (max-width: 1200px) {
.card {
transform: scale(0.95);
transform-origin: center;
}
}
</style>
</head>
<body>
<div class="page-shell">
<div class="orbital"></div>
<div class="card" id="weather-card">
<div class="card-left">
<div class="pill-row">
<div class="pill">
<span class="pill-badge">Weather</span>
<span class="pill-label">Daily snapshot</span>
</div>
<div class="pill">
<span class="pill-dot" id="live-dot"></span>
<span class="pill-status-text" id="status-label">Loading data…</span>
</div>
</div>
<div class="headline">
<div class="location-name">
<span id="location-name">—</span>
</div>
<div class="location-subtitle" id="location-subtitle">
—
</div>
</div>
<div class="date-row">
<span class="date-pill" id="date-display">—</span>
<span id="date-context">UTC • daily overview</span>
</div>
<div class="summary-main">
<div class="temp-block">
<div class="temp-now">
<div class="temp-current skeleton" id="temp-current-shell">
<span id="temp-current">—</span>
</div>
<span class="temp-unit">°C</span>
</div>
<div class="temp-range">
<span>High <strong id="temp-max">—</strong>°C</span>
<span style="margin: 0 4px; color: var(--text-soft);">•</span>
<span>Low <strong id="temp-min">—</strong>°C</span>
</div>
</div>
<div class="condition-block">
<div class="icon-orbit" id="icon-orbit">
<svg viewBox="0 0 120 120" aria-hidden="true">
<defs>
<radialGradient id="sun-grad" cx="30%" cy="25%" r="70%">
<stop offset="0%" stop-color="#fef9c3"/>
<stop offset="40%" stop-color="#facc15"/>
<stop offset="100%" stop-color="#ea580c"/>
</radialGradient>
<radialGradient id="cloud-grad" cx="30%" cy="30%" r="80%">
<stop offset="0%" stop-color="#e5e7eb"/>
<stop offset="45%" stop-color="#cbd5f5"/>
<stop offset="100%" stop-color="#64748b"/>
</radialGradient>
</defs>
<circle cx="44" cy="40" r="22" fill="url(#sun-grad)" opacity="0.95"></circle>
<circle cx="36" cy="70" r="18" fill="url(#cloud-grad)" opacity="0.96"></circle>
<circle cx="60" cy="68" r="20" fill="url(#cloud-grad)" opacity="0.98"></circle>
<circle cx="80" cy="70" r="16" fill="url(#cloud-grad)" opacity="0.92"></circle>
<path d="M20 92 Q40 86 60 92 T100 92" fill="none" stroke="rgba(15,23,42,0.7)" stroke-width="6" stroke-linecap="round" opacity="0.9"></path>
</svg>
</div>
<div>
<div class="condition-text-main" id="condition-main">—</div>
<div class="condition-text-sub" id="condition-sub">Weather summary for the selected date.</div>
</div>
</div>
</div>
<div class="meta-row">
<div class="meta-chip">
<span>Coordinates</span>
<span class="coordinates" id="coords">—</span>
</div>
<div class="meta-chip">
<span>Dataset</span>
<span><strong id="dataset-label">—</strong></span>
</div>
</div>
</div>
<div class="card-right">
<div class="panel-header">
<div class="panel-title">
<strong>Hourly</strong> Temperature
</div>
<div class="panel-legend">
<span class="legend-item">
<span class="legend-swatch"></span>
<span>Relative to min / max</span>
</span>
<span class="legend-item">
<span class="legend-dot"></span>
<span>Local peak</span>
</span>
</div>
</div>
<div class="scroll-shell">
<div class="scroll-inner">
<div class="hourly-strip" id="hourly-strip">
<!-- Hourly cards injected here -->
</div>
<div class="scroll-meta">
<span>
<span class="tag">Timeline</span>
<span id="timeline-label">—</span>
</span>
<span id="range-label">—</span>
</div>
<div class="error-banner hidden" id="error-banner">
<span>
<span class="banner-icon error">!</span>
<strong>Unable to load weather data.</strong>
</span>
<span class="banner-pill">Check API response</span>
</div>
<div class="status-banner" id="status-banner">
<span>
<span class="banner-icon info">i</span>
<strong id="status-banner-text">Contacting weather service…</strong>
</span>
<span class="banner-pill" id="banner-pill">Fetching</span>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
(function() {
const qs = new URLSearchParams(window.location.search);
function getUtcTodayString() {
const now = new Date();
const year = now.getUTCFullYear();
const month = String(now.getUTCMonth() + 1).padStart(2, "0");
const day = String(now.getUTCDate()).padStart(2, "0");
return year + "-" + month + "-" + day;
}
const defaultLat = 52.52;
const defaultLon = 13.405;
const defaultName = "Berlin";
const defaultDate = getUtcTodayString();
function safeNumber(value, fallback) {
const n = Number(value);
return Number.isFinite(n) ? n : fallback;
}
function safeString(value, fallback) {
if (!value) return fallback;
const trimmed = String(value).trim();
return trimmed || fallback;
}
const lat = safeNumber(qs.get("lat"), defaultLat);
const lon = safeNumber(qs.get("lon"), defaultLon);
const name = safeString(qs.get("name"), defaultName);
const dateParam = safeString(qs.get("date"), defaultDate);
function normalizeDate(value) {
if (!/^\d{4}-\d{2}-\d{2}$/.test(value)) return defaultDate;
return value;
}
const dateStr = normalizeDate(dateParam);
const todayStr = defaultDate;
const isPast = dateStr < todayStr;
const datasetLabel = isPast ? "Archive" : "Forecast";
const endpoint = isPast ? "/api/om/archive" : "/api/om/forecast";
const els = {
statusLabel: document.getElementById("status-label"),
liveDot: document.getElementById("live-dot"),
locationName: document.getElementById("location-name"),
locationSubtitle: document.getElementById("location-subtitle"),
dateDisplay: document.getElementById("date-display"),
dateContext: document.getElementById("date-context"),
tempCurrentShell: document.getElementById("temp-current-shell"),
tempCurrent: document.getElementById("temp-current"),
tempMax: document.getElementById("temp-max"),
tempMin: document.getElementById("temp-min"),
conditionMain: document.getElementById("condition-main"),
conditionSub: document.getElementById("condition-sub"),
coords: document.getElementById("coords"),
datasetLabel: document.getElementById("dataset-label"),
hourlyStrip: document.getElementById("hourly-strip"),
timelineLabel: document.getElementById("timeline-label"),
rangeLabel: document.getElementById("range-label"),
errorBanner: document.getElementById("error-banner"),
statusBanner: document.getElementById("status-banner"),
statusBannerText: document.getElementById("status-banner-text"),
bannerPill: document.getElementById("banner-pill"),
iconOrbit: document.getElementById("icon-orbit")
};
function setText(el, value) {
if (el) el.textContent = value;
}
function setStatus(text) {
setText(els.statusLabel, text);
}
function showError(message) {
setText(els.statusLabel, "Unable to load");
setText(els.statusBannerText, message || "Unable to load weather data.");
setText(els.bannerPill, "Error");
els.statusBanner.classList.remove("hidden");
els.errorBanner.classList.remove("hidden");
els.liveDot.style.boxShadow = "0 0 0 3px rgba(248,113,113,0.4)";
els.liveDot.style.background = "radial-gradient(circle at 30% 20%, #fee2e2, #ef4444)";
}
function hideStatusBanner() {
els.statusBanner.classList.add("hidden");
}
const weekdayNames = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
const monthNames = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
function formatDateUTC(dateString) {
const [y, m, d] = dateString.split("-").map(Number);
const date = new Date(Date.UTC(y, m - 1, d));
const weekday = weekdayNames[date.getUTCDay()];
const monthName = monthNames[date.getUTCMonth()];
return weekday + ", " + monthName + " " + String(d).padStart(2, "0") + " " + y;
}
function formatHourUTC(isoString) {
const d = new Date(isoString);
const h = d.getUTCHours();
return String(h).padStart(2, "0") + ":00";
}
const weatherCodeMap = {
0: { label: "Clear sky", detail: "Cloudless and bright" },
1: { label: "Mainly clear", detail: "Almost cloudless" },
2: { label: "Partly cloudy", detail: "Mix of sun and cloud" },
3: { label: "Overcast", detail: "Thick cloud cover" },
45: { label: "Fog", detail: "Reduced visibility" },
48: { label: "Depositing rime fog", detail: "Cold, foggy, icy" },
51: { label: "Light drizzle", detail: "Fine misty rain" },
53: { label: "Drizzle", detail: "Steady light rain" },
55: { label: "Dense drizzle", detail: "Thicker drizzle" },
56: { label: "Freezing drizzle", detail: "Icy droplets" },
57: { label: "Dense freezing drizzle", detail: "Persistent icy drizzle" },
61: { label: "Light rain", detail: "Short showers possible" },
63: { label: "Rain", detail: "Moderate rainfall" },
65: { label: "Heavy rain", detail: "Intense, sustained rainfall" },
66: { label: "Freezing rain", detail: "Very slippery surfaces" },
67: { label: "Heavy freezing rain", detail: "Severe icy conditions" },
71: { label: "Light snow", detail: "Flurries or light snow" },
73: { label: "Snow", detail: "Steady snowfall" },
75: { label: "Heavy snow", detail: "Poor visibility, deep snow" },
77: { label: "Snow grains", detail: "Small, crunchy snow" },
80: { label: "Light showers", detail: "On and off rain" },
81: { label: "Showers", detail: "Frequent rain showers" },
82: { label: "Violent showers", detail: "Intense downpours" },
85: { label: "Snow showers", detail: "Bursts of snow" },
86: { label: "Heavy snow showers", detail: "Intense snow bursts" },
95: { label: "Thunderstorm", detail: "Thunder and lightning" },
96: { label: "Thunderstorm with hail", detail: "Hail showers likely" },
99: { label: "Severe thunderstorm", detail: "Heavy hail and thunder" }
};
function updateIconForCode(code) {
const orbit = els.iconOrbit;
if (!orbit) return;
orbit.style.background = "";
if (code === 0) {
orbit.style.background = "radial-gradient(circle at 35% 0%, rgba(254,249,195,0.55), transparent 60%), radial-gradient(circle at 80% 80%, rgba(248,113,113,0.45), transparent 60%)";
} else if (code >= 1 && code <= 3) {
orbit.style.background = "radial-gradient(circle at 15% 0%, rgba(254,249,195,0.4), transparent 65%), radial-gradient(circle at 95% 15%, rgba(148,163,184,0.55), transparent 65%)";
} else if (code >= 45 && code <= 48) {
orbit.style.background = "radial-gradient(circle at 10% 10%, rgba(148,163,184,0.55), transparent 60%), radial-gradient(circle at 100% 100%, rgba(30,64,175,0.7), transparent 65%)";
} else if ((code >= 51 && code <= 57) || (code >= 61 && code <= 67) || (code >= 80 && code <= 82)) {
orbit.style.background = "radial-gradient(circle at 10% 10%, rgba(191,219,254,0.4), transparent 55%), radial-gradient(circle at 100% 100%, rgba(96,165,250,0.6), transparent 60%)";
} else if ((code >= 71 && code <= 77) || (code >= 85 && code <= 86)) {
orbit.style.background = "radial-gradient(circle at 15% 0%, rgba(226,232,240,0.7), transparent 65%), radial-gradient(circle at 110% 110%, rgba(56,189,248,0.5), transparent 60%)";
} else if (code >= 95 && code <= 99) {
orbit.style.background = "radial-gradient(circle at 10% 0%, rgba(248,250,252,0.26), transparent 65%), radial-gradient(circle at 100% 100%, rgba(30,64,175,0.8), transparent 60%)";
} else {
orbit.style.background = "radial-gradient(circle at 0% 0%, rgba(56,189,248,0.26), transparent 60%), radial-gradient(circle at 110% 20%, rgba(96,165,250,0.3), transparent 55%)";
}
}
function buildRequestUrl() {
const params = new URLSearchParams();
params.set("latitude", String(lat));
params.set("longitude", String(lon));
params.set("daily", "temperature_2m_max,temperature_2m_min,weather_code");
params.set("hourly", "temperature_2m");
params.set("timezone", "UTC");
params.set("temperature_unit", "celsius");
params.set("start_date", dateStr);
params.set("end_date", dateStr);
return endpoint + "?" + params.toString();
}
function updateHeaderStatic() {
setText(els.locationName, name);
setText(els.locationSubtitle, "Daily weather profile");
setText(els.dateDisplay, formatDateUTC(dateStr));
setText(els.dateContext, dateStr === todayStr ? "Today in UTC • daily overview" : "Selected date in UTC • daily overview");
setText(els.coords, lat.toFixed(3) + "° N, " + lon.toFixed(3) + "° E");
setText(els.datasetLabel, datasetLabel);
}
function buildHourlyCards(times, temps, minVal, maxVal) {
const strip = els.hourlyStrip;
if (!strip) return;
strip.innerHTML = "";
if (!Array.isArray(times) || !Array.isArray(temps) || times.length === 0 || temps.length === 0) {
const empty = document.createElement("div");
empty.style.padding = "18px 18px 16px";
empty.style.fontSize = "12px";
empty.style.color = "#9ca3af";
empty.textContent = "No hourly data available for this date.";
strip.appendChild(empty);
return;
}
let globalMin = minVal;
let globalMax = maxVal;
if (!Number.isFinite(globalMin) || !Number.isFinite(globalMax)) {
globalMin = +Infinity;
globalMax = -Infinity;
for (let i = 0; i < temps.length; i++) {
const t = temps[i];
if (!Number.isFinite(t)) continue;
if (t < globalMin) globalMin = t;
if (t > globalMax) globalMax = t;
}
if (!Number.isFinite(globalMin) || !Number.isFinite(globalMax)) {
globalMin = 0;
globalMax = 20;
}
}
const range = Math.max(1, globalMax - globalMin);
let peakIndex = 0;
let peakTemp = -Infinity;
for (let i = 0; i < temps.length; i++) {
const t = temps[i];
if (Number.isFinite(t) && t > peakTemp) {
peakTemp = t;
peakIndex = i;
}
}
for (let i = 0; i < times.length; i++) {
const iso = times[i];
const t = temps[i];
const card = document.createElement("div");
card.className = "hour-card" + (i === peakIndex ? " highlight" : "");
const timeLabel = document.createElement("div");
timeLabel.className = "hour-time";
timeLabel.textContent = formatHourUTC(iso);
const barShell = document.createElement("div");
barShell.className = "hour-bar-shell";
const bar = document.createElement("div");
bar.className = "hour-bar";
const relative = Number.isFinite(t) ? (t - globalMin) / range : 0.2;
const heightPct = 18 + relative * 70;
bar.style.height = heightPct + "%";
if (t <= 10) {
bar.classList.add("cool");
}
barShell.appendChild(bar);
const tempLabel = document.createElement("div");
tempLabel.className = "hour-temp";
if (Number.isFinite(t)) {
tempLabel.innerHTML = Math.round(t) + "<span>°</span>";
} else {
tempLabel.innerHTML = "—<span>°</span>";
}
card.appendChild(timeLabel);
card.appendChild(barShell);
card.appendChild(tempLabel);
strip.appendChild(card);
}
const firstTime = times[0];
const lastTime = times[times.length - 1];
setText(els.timelineLabel, formatHourUTC(firstTime) + " – " + formatHourUTC(lastTime) + " UTC");
setText(els.rangeLabel, "Hourly range " + Math.round(globalMin) + "°C – " + Math.round(globalMax) + "°C");
}
async function fetchWeather() {
try {
updateHeaderStatic();
setStatus("Contacting " + datasetLabel.toLowerCase() + " API…");
const url = buildRequestUrl();
const res = await fetch(url);
if (!res.ok) {
showError("Weather service responded with " + res.status + ".");
return;
}
const data = await res.json();
if (!data || !data.daily || !Array.isArray(data.daily.time) || data.daily.time.length === 0) {
showError("Weather data for this date is unavailable.");
return;
}
const idx = 0;
const tMax = Array.isArray(data.daily.temperature_2m_max) ? data.daily.temperature_2m_max[idx] : null;
const tMin = Array.isArray(data.daily.temperature_2m_min) ? data.daily.temperature_2m_min[idx] : null;
const code = Array.isArray(data.daily.weather_code) ? data.daily.weather_code[idx] : null;
const times = data.hourly && Array.isArray(data.hourly.time) ? data.hourly.time : [];
const temps = data.hourly && Array.isArray(data.hourly.temperature_2m) ? data.hourly.temperature_2m : [];
const labelObj = weatherCodeMap.hasOwnProperty(code) ? weatherCodeMap[code] : { label: "Weather", detail: "Conditions for the selected date." };
setText(els.conditionMain, labelObj.label);
setText(els.conditionSub, labelObj.detail);
updateIconForCode(code);
if (Number.isFinite(tMax) || Number.isFinite(tMin)) {
const displayNow = Number.isFinite(tMax) ? tMax : (Number.isFinite(tMin) ? tMin : null);
if (displayNow !== null) {
els.tempCurrentShell.classList.remove("skeleton");
setText(els.tempCurrent, Math.round(displayNow));
} else {
setText(els.tempCurrent, "—");
}
} else {
setText(els.tempCurrent, "—");
}
setText(els.tempMax, Number.isFinite(tMax) ? Math.round(tMax) : "—");
setText(els.tempMin, Number.isFinite(tMin) ? Math.round(tMin) : "—");
buildHourlyCards(times, temps, tMin, tMax);
setStatus(dateStr === todayStr ? "Live for today (UTC)" : "Snapshot in UTC");
hideStatusBanner();
els.errorBanner.classList.add("hidden");
els.liveDot.style.boxShadow = "0 0 0 5px rgba(34,197,94,0.28)";
els.liveDot.style.background = "radial-gradient(circle at 30% 20%, #e5faff, #22c55e)";
} catch (err) {
showError("Unable to load weather data.");
console.error(err);
}
}
setText(els.statusBannerText, "Contacting weather service…");
setText(els.bannerPill, datasetLabel);
updateHeaderStatic();
fetchWeather();
})();
</script>
</body>
</html>L1 —— 廉价的确定性描述量
| bytes 总计 | 33,820 | html / css / js | 5,226 / 14,483 / 14,111 |
|---|---|---|---|
| dom 节点 | 95 | dom 深度 | 11 |
| css 规则 | 85 | 含 js | 是 |
| brightness | 26.6 | contrast | 18.1 |
| colorfulness | 22.5 | 留白 | 80.0% |
该 slot 的 telemetry
| prompt tokens | 17,632 | completion tokens | 10,485 |
|---|---|---|---|
| total tokens | 28,117 | wall | 122.2 s |
| cost | — | request id | — |
config.json553 B
{
"N": 2,
"auth": {
"credential_ref": "WCB_NONE",
"method": "oauth-login"
},
"billing": "plan",
"config_id": "gpt-5.1-eff-low--cli--cursor--dev",
"effort": "low",
"family": "gpt",
"m": {
"min": 2,
"q": 2
},
"model_id": "gpt-5.1",
"protocol": "cli",
"served_model": "gpt-5.1-low",
"telemetry": {
"completion_tokens": 46445,
"cost_usd": null,
"prompt_tokens": 53037,
"total_tokens": 99482,
"wall_ms": 502212
},
"transport": "cursor-agent-cli-isolated-home",
"vendor_sanction_ref": null
}send-log2.5 KB
{
"N": 2,
"batch_id": "2026-08-13--cursor-s0",
"config_id": "gpt-5.1-eff-low--cli--cursor--dev",
"positions": [
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-08-12T22:36:27.117120+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-12T22:33:44.659732+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-12T22:38:33.532514+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-12T22:36:31.294007+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-12T22:40:31.235409+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-12T22:38:37.337852+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-12T22:42:18.759188+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-12T22:40:35.131082+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
}
}
}