gpt-5.4 @ xhigh · cursor-xl
cursor-xlxhigh
- config
- gpt-5.4-eff-xhigh--cli--cursor-xl--dev
- batch
- 2026-07-19--unified
- transport
- cursor-agent-cli-isolated-home
- protocol
- cli · plan
- served model
- gpt-5.4-xhigh
- 采集于
- 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 tempmatch展示值:25
- 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=device-width, initial-scale=1.0" />
<meta name="color-scheme" content="dark" />
<title>Weather Card</title>
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Crect width='64' height='64' rx='16' fill='%2309121f'/%3E%3Ccircle cx='24' cy='24' r='12' fill='%23ffd36a'/%3E%3Cpath d='M18 41c0-5 4-9 9-9 3 0 5 1 7 3 1-4 4-6 9-6 6 0 11 5 11 11 0 7-5 12-12 12H27c-5 0-9-4-9-11z' fill='%23dce8ff'/%3E%3C/svg%3E" />
<style>
:root {
--bg-1: #07111f;
--bg-2: #16253f;
--surface-1: rgba(10, 18, 32, 0.78);
--surface-2: rgba(255, 255, 255, 0.06);
--surface-3: rgba(255, 255, 255, 0.03);
--border-1: rgba(255, 255, 255, 0.12);
--border-2: rgba(255, 255, 255, 0.08);
--text-1: #eef4ff;
--text-2: #b9c8ea;
--text-3: #7e8cae;
--accent-1: #7fdcff;
--accent-2: #7a84ff;
--accent-3: #ffc86d;
--shadow-1: 0 34px 90px rgba(0, 0, 0, 0.42);
--shadow-2: 0 18px 36px rgba(0, 0, 0, 0.22);
}
* {
box-sizing: border-box;
}
html,
body {
width: 100%;
height: 100%;
margin: 0;
background:
radial-gradient(circle at 18% 18%, rgba(255, 255, 255, 0.06), transparent 28%),
radial-gradient(circle at 82% 24%, rgba(255, 255, 255, 0.04), transparent 30%),
linear-gradient(135deg, var(--bg-1), var(--bg-2));
color: var(--text-1);
font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
transition: background 700ms ease;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
}
body {
min-width: 1280px;
min-height: 800px;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
position: relative;
padding: 24px;
}
body::before,
body::after {
content: "";
position: fixed;
border-radius: 999px;
filter: blur(20px);
opacity: 0.68;
pointer-events: none;
animation: drift 18s ease-in-out infinite alternate;
}
body::before {
width: 560px;
height: 560px;
left: -120px;
bottom: -120px;
background: radial-gradient(circle, var(--accent-1) 0%, transparent 62%);
}
body::after {
width: 640px;
height: 640px;
top: -180px;
right: -140px;
background: radial-gradient(circle, var(--accent-2) 0%, transparent 62%);
animation-duration: 22s;
}
@keyframes drift {
0% {
transform: translate3d(0, 0, 0) scale(1);
}
100% {
transform: translate3d(18px, -14px, 0) scale(1.06);
}
}
@keyframes floaty {
0%,
100% {
transform: translateY(0);
}
50% {
transform: translateY(-6px);
}
}
.app {
width: min(1180px, calc(100vw - 48px));
height: min(720px, calc(100vh - 48px));
display: grid;
grid-template-columns: 360px minmax(0, 1fr);
gap: 24px;
padding: 24px;
position: relative;
border-radius: 36px;
overflow: hidden;
background:
linear-gradient(180deg, rgba(9, 17, 31, 0.78), rgba(13, 22, 40, 0.64)),
linear-gradient(135deg, rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0.01));
border: 1px solid rgba(255, 255, 255, 0.12);
box-shadow: var(--shadow-1);
backdrop-filter: blur(18px) saturate(140%);
-webkit-backdrop-filter: blur(18px) saturate(140%);
isolation: isolate;
}
.app::before {
content: "";
position: absolute;
inset: 0;
pointer-events: none;
background:
radial-gradient(circle at 12% 14%, rgba(255, 255, 255, 0.07), transparent 20%),
radial-gradient(circle at 88% 12%, rgba(255, 255, 255, 0.05), transparent 18%),
linear-gradient(130deg, rgba(255, 255, 255, 0.07), transparent 32%),
linear-gradient(180deg, transparent, rgba(255, 255, 255, 0.015));
opacity: 0.9;
}
.panel {
position: relative;
border-radius: 30px;
background:
linear-gradient(180deg, var(--surface-2), var(--surface-3)),
rgba(255, 255, 255, 0.02);
border: 1px solid var(--border-1);
box-shadow: var(--shadow-2), inset 0 1px 0 rgba(255, 255, 255, 0.06);
overflow: hidden;
}
.summary {
padding: 28px;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.summary::after,
.chart-panel::after,
.hourly-panel::after {
content: "";
position: absolute;
inset: 0;
pointer-events: none;
background: linear-gradient(180deg, rgba(255, 255, 255, 0.045), transparent 28%);
opacity: 0.75;
}
.content {
min-width: 0;
display: flex;
flex-direction: column;
gap: 20px;
}
.badge-row {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 18px;
}
.chip {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 10px 14px;
border-radius: 999px;
border: 1px solid var(--border-1);
background: rgba(255, 255, 255, 0.05);
color: var(--text-2);
font-size: 12px;
font-weight: 700;
line-height: 1;
letter-spacing: 0.12em;
text-transform: uppercase;
white-space: nowrap;
}
.chip.primary {
color: var(--text-1);
background: linear-gradient(90deg, rgba(255, 255, 255, 0.07), rgba(255, 255, 255, 0.03));
}
.eyebrow {
margin: 0 0 12px;
color: var(--text-3);
font-size: 13px;
font-weight: 700;
letter-spacing: 0.18em;
text-transform: uppercase;
}
.location {
margin: 0;
font-size: clamp(40px, 4vw, 54px);
line-height: 0.94;
letter-spacing: -0.05em;
word-break: break-word;
}
.date {
margin-top: 14px;
color: var(--text-2);
font-size: 18px;
line-height: 1.4;
max-width: 18ch;
}
.hero-art {
height: 196px;
margin: 26px 0 20px;
border-radius: 26px;
display: flex;
align-items: center;
justify-content: center;
background:
radial-gradient(circle at 50% 38%, rgba(255, 255, 255, 0.06), transparent 46%),
linear-gradient(180deg, rgba(255, 255, 255, 0.055), rgba(255, 255, 255, 0.02));
border: 1px solid var(--border-2);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06);
overflow: hidden;
}
.hero-art svg {
width: 100%;
height: 100%;
display: block;
filter: drop-shadow(0 20px 30px rgba(0, 0, 0, 0.18));
animation: floaty 6s ease-in-out infinite;
}
.condition {
margin: 0;
font-size: 31px;
font-weight: 800;
line-height: 1.05;
letter-spacing: -0.04em;
}
.range {
margin-top: 10px;
color: var(--text-2);
font-size: 17px;
line-height: 1.4;
}
.summary-footer {
margin-top: 26px;
}
.stats {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 14px;
}
.stat {
padding: 18px 18px 16px;
border-radius: 22px;
background: linear-gradient(180deg, rgba(255, 255, 255, 0.055), rgba(255, 255, 255, 0.022));
border: 1px solid var(--border-2);
min-width: 0;
}
.stat-label {
display: block;
margin-bottom: 8px;
color: var(--text-3);
font-size: 12px;
font-weight: 700;
letter-spacing: 0.16em;
text-transform: uppercase;
}
.stat-value {
display: block;
font-size: 32px;
font-weight: 800;
line-height: 1;
letter-spacing: -0.05em;
font-variant-numeric: tabular-nums;
}
.coord-row {
display: flex;
gap: 10px;
margin-top: 16px;
flex-wrap: wrap;
}
.coord-pill {
display: inline-flex;
align-items: center;
padding: 10px 14px;
border-radius: 999px;
background: rgba(255, 255, 255, 0.04);
border: 1px solid var(--border-2);
color: var(--text-2);
font-size: 13px;
font-weight: 600;
letter-spacing: 0.01em;
}
.status-text {
margin: 16px 0 0;
color: var(--text-2);
font-size: 14px;
line-height: 1.5;
min-height: 42px;
}
.chart-panel,
.hourly-panel {
padding: 22px 24px;
}
.chart-panel {
flex: 0 0 292px;
display: flex;
flex-direction: column;
}
.hourly-panel {
flex: 1;
min-height: 0;
display: flex;
flex-direction: column;
}
.section-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 16px;
margin-bottom: 18px;
}
.section-title {
min-width: 0;
}
.section-title h2 {
margin: 0;
font-size: 22px;
font-weight: 800;
line-height: 1.1;
letter-spacing: -0.04em;
}
.section-title p {
margin: 8px 0 0;
color: var(--text-2);
font-size: 14px;
line-height: 1.45;
}
.summary-pill {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 122px;
padding: 11px 14px;
border-radius: 18px;
border: 1px solid var(--border-1);
background: linear-gradient(180deg, rgba(255, 255, 255, 0.07), rgba(255, 255, 255, 0.03));
color: var(--text-1);
font-size: 14px;
font-weight: 700;
letter-spacing: -0.01em;
text-align: center;
white-space: nowrap;
}
.chart-wrap {
position: relative;
flex: 1;
border-radius: 24px;
overflow: hidden;
border: 1px solid var(--border-2);
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0.012)),
radial-gradient(circle at 16% 12%, rgba(255, 255, 255, 0.04), transparent 28%);
}
.chart-wrap svg {
width: 100%;
height: 100%;
display: block;
}
.chart-message,
.empty-card {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
color: var(--text-2);
font-size: 16px;
line-height: 1.5;
padding: 28px;
}
.hourly-grid {
flex: 1;
min-height: 0;
display: grid;
grid-template-columns: repeat(6, minmax(0, 1fr));
gap: 12px;
align-content: stretch;
}
.hour-card {
min-width: 0;
padding: 14px 14px 12px;
border-radius: 20px;
border: 1px solid var(--border-2);
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.06), rgba(255, 255, 255, 0.022)),
rgba(255, 255, 255, 0.015);
display: flex;
flex-direction: column;
justify-content: space-between;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05);
}
.hour-time {
display: block;
color: var(--text-2);
font-size: 13px;
font-weight: 600;
letter-spacing: 0.01em;
}
.hour-temp {
margin: 10px 0 0;
font-size: 26px;
font-weight: 800;
line-height: 1;
letter-spacing: -0.05em;
font-variant-numeric: tabular-nums;
}
.hour-bar {
margin-top: 14px;
height: 9px;
border-radius: 999px;
background: rgba(255, 255, 255, 0.065);
overflow: hidden;
position: relative;
}
.hour-bar span {
display: block;
height: 100%;
border-radius: inherit;
background: linear-gradient(90deg, var(--accent-1), var(--accent-2));
box-shadow: 0 0 18px rgba(255, 255, 255, 0.12);
}
.empty-card {
grid-column: 1 / -1;
border-radius: 24px;
border: 1px dashed rgba(255, 255, 255, 0.16);
background: linear-gradient(180deg, rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0.02));
}
</style>
</head>
<body>
<main class="app">
<section class="summary panel">
<div>
<div class="badge-row">
<div class="chip primary">UTC</div>
<div class="chip" id="endpointChip">Forecast API</div>
</div>
<p class="eyebrow">Weather Card</p>
<h1 class="location" id="locationName">Berlin</h1>
<div class="date" id="prettyDate">Loading date...</div>
<div class="hero-art" id="weatherArt" aria-hidden="true"></div>
<h2 class="condition" id="condition">Loading weather...</h2>
<div class="range" id="temperatureRange">Fetching daily temperatures.</div>
</div>
<div class="summary-footer">
<div class="stats">
<div class="stat">
<span class="stat-label">High</span>
<span class="stat-value" id="maxTemp">--°C</span>
</div>
<div class="stat">
<span class="stat-label">Low</span>
<span class="stat-value" id="minTemp">--°C</span>
</div>
</div>
<div class="coord-row">
<div class="coord-pill" id="coordLat">52.52° N</div>
<div class="coord-pill" id="coordLon">13.41° E</div>
</div>
<p class="status-text" id="statusText" aria-live="polite">Loading weather data for the requested date.</p>
</div>
</section>
<section class="content">
<section class="chart-panel panel">
<div class="section-head">
<div class="section-title">
<h2>Hourly Temperature</h2>
<p>Requested date only, using UTC and Celsius.</p>
</div>
<div class="summary-pill" id="summaryPill">Loading</div>
</div>
<div class="chart-wrap" id="chartWrap">
<div class="chart-message">Fetching hourly temperatures...</div>
</div>
</section>
<section class="hourly-panel panel">
<div class="section-head">
<div class="section-title">
<h2>Hourly Readings</h2>
<p id="hourlyCaption">Loading hourly data...</p>
</div>
</div>
<div class="hourly-grid" id="hourlyGrid">
<div class="empty-card">Fetching hourly temperatures...</div>
</div>
</section>
</section>
</main>
<script>
(() => {
const DEFAULTS = {
lat: 52.52,
lon: 13.405,
name: "Berlin"
};
const WEATHER_CODES = {
0: { label: "Clear sky", category: "clear" },
1: { label: "Mainly clear", category: "clear" },
2: { label: "Partly cloudy", category: "cloudy" },
3: { label: "Overcast", category: "cloudy" },
45: { label: "Fog", category: "fog" },
48: { label: "Rime fog", category: "fog" },
51: { label: "Light drizzle", category: "rain" },
53: { label: "Drizzle", category: "rain" },
55: { label: "Dense drizzle", category: "rain" },
56: { label: "Light freezing drizzle", category: "rain" },
57: { label: "Dense freezing drizzle", category: "rain" },
61: { label: "Slight rain", category: "rain" },
63: { label: "Rain", category: "rain" },
65: { label: "Heavy rain", category: "rain" },
66: { label: "Light freezing rain", category: "rain" },
67: { label: "Heavy freezing rain", category: "rain" },
71: { label: "Light snow", category: "snow" },
73: { label: "Snow", category: "snow" },
75: { label: "Heavy snow", category: "snow" },
77: { label: "Snow grains", category: "snow" },
80: { label: "Rain showers", category: "rain" },
81: { label: "Rain showers", category: "rain" },
82: { label: "Violent rain showers", category: "rain" },
85: { label: "Snow showers", category: "snow" },
86: { label: "Heavy snow showers", category: "snow" },
95: { label: "Thunderstorm", category: "thunder" },
96: { label: "Thunderstorm with hail", category: "thunder" },
99: { label: "Severe thunderstorm with hail", category: "thunder" }
};
const THEMES = {
clear: {
bg1: "#07111f",
bg2: "#17263f",
accent1: "#6edbff",
accent2: "#7b82ff",
accent3: "#ffc769"
},
cloudy: {
bg1: "#0b1220",
bg2: "#202d49",
accent1: "#a7bbd8",
accent2: "#70adff",
accent3: "#b4c4de"
},
rain: {
bg1: "#061322",
bg2: "#132948",
accent1: "#78d6ff",
accent2: "#317eff",
accent3: "#67e0d4"
},
snow: {
bg1: "#0a1324",
bg2: "#1a2640",
accent1: "#d8efff",
accent2: "#93bcff",
accent3: "#bfc7ff"
},
thunder: {
bg1: "#0b1020",
bg2: "#221f44",
accent1: "#ffd66c",
accent2: "#9d7aff",
accent3: "#5dd3ff"
},
fog: {
bg1: "#101722",
bg2: "#29384b",
accent1: "#dae6f2",
accent2: "#96add0",
accent3: "#c9d7e8"
},
default: {
bg1: "#07111f",
bg2: "#16253f",
accent1: "#7fdcff",
accent2: "#7a84ff",
accent3: "#ffc86d"
}
};
const params = new URLSearchParams(window.location.search);
const lat = parseBoundedNumber(params.get("lat"), DEFAULTS.lat, -90, 90);
const lon = parseBoundedNumber(params.get("lon"), DEFAULTS.lon, -180, 180);
const name = normalizeName(params.get("name"), DEFAULTS.name);
const date = normalizeDate(params.get("date"));
const todayUTC = getTodayUTC();
const endpoint = date < todayUTC ? "/api/om/archive" : "/api/om/forecast";
const apiLabel = endpoint === "/api/om/archive" ? "Archive API" : "Forecast API";
const els = {
endpointChip: document.getElementById("endpointChip"),
locationName: document.getElementById("locationName"),
prettyDate: document.getElementById("prettyDate"),
weatherArt: document.getElementById("weatherArt"),
condition: document.getElementById("condition"),
temperatureRange: document.getElementById("temperatureRange"),
maxTemp: document.getElementById("maxTemp"),
minTemp: document.getElementById("minTemp"),
coordLat: document.getElementById("coordLat"),
coordLon: document.getElementById("coordLon"),
statusText: document.getElementById("statusText"),
summaryPill: document.getElementById("summaryPill"),
chartWrap: document.getElementById("chartWrap"),
hourlyCaption: document.getElementById("hourlyCaption"),
hourlyGrid: document.getElementById("hourlyGrid")
};
setText(els.endpointChip, apiLabel);
setText(els.locationName, name);
setText(els.prettyDate, formatLongDate(date));
setText(els.coordLat, formatCoord(lat, "N", "S"));
setText(els.coordLon, formatCoord(lon, "E", "W"));
setText(els.hourlyCaption, "Loading hourly data...");
els.weatherArt.innerHTML = getWeatherArt("default");
loadWeather().catch(() => {
renderError();
});
async function loadWeather() {
const query = 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
});
const response = await fetch(`${endpoint}?${query.toString()}`, {
headers: { Accept: "application/json" }
});
if (!response.ok) {
throw new Error("Request failed");
}
const data = await response.json();
renderWeather(data);
}
function renderWeather(data) {
const daily = data && typeof data === "object" ? data.daily : null;
const hourly = data && typeof data === "object" ? data.hourly : null;
const max = daily && Array.isArray(daily.temperature_2m_max) ? Number(daily.temperature_2m_max[0]) : NaN;
const min = daily && Array.isArray(daily.temperature_2m_min) ? Number(daily.temperature_2m_min[0]) : NaN;
const weatherCode = daily && Array.isArray(daily.weather_code) ? Number(daily.weather_code[0]) : NaN;
const rawTimes = hourly && Array.isArray(hourly.time) ? hourly.time : [];
const rawTemps = hourly && Array.isArray(hourly.temperature_2m) ? hourly.temperature_2m : [];
if (!Number.isFinite(max) || !Number.isFinite(min) || rawTimes.length === 0 || rawTemps.length === 0) {
renderError();
return;
}
const entryCount = Math.min(rawTimes.length, rawTemps.length);
const entries = [];
for (let i = 0; i < entryCount; i += 1) {
const temp = Number(rawTemps[i]);
if (!Number.isFinite(temp)) {
continue;
}
entries.push({
time: String(rawTimes[i] || ""),
temp
});
}
if (entries.length === 0) {
renderError();
return;
}
const weather = WEATHER_CODES[weatherCode] || {
label: "Unspecified conditions",
category: "default"
};
applyTheme(weather.category);
els.weatherArt.innerHTML = getWeatherArt(weather.category);
setText(els.condition, weather.label);
setText(els.temperatureRange, `High ${formatTemp(max)} • Low ${formatTemp(min)}`);
setText(els.maxTemp, formatTemp(max));
setText(els.minTemp, formatTemp(min));
setText(els.summaryPill, `${entries.length} readings`);
setText(els.hourlyCaption, `All ${entries.length} hourly temperatures in UTC.`);
setText(els.statusText, `Loaded from ${apiLabel.toLowerCase()} for ${date}.`);
els.chartWrap.innerHTML = buildChart(entries);
els.hourlyGrid.innerHTML = buildHourlyGrid(entries);
}
function renderError() {
applyTheme("default");
els.weatherArt.innerHTML = getWeatherArt("default");
setText(els.condition, "Data unavailable");
setText(els.temperatureRange, "Weather data could not be loaded for the selected date.");
setText(els.maxTemp, "--°C");
setText(els.minTemp, "--°C");
setText(els.summaryPill, "Unavailable");
setText(els.hourlyCaption, "No hourly readings available.");
setText(els.statusText, "Weather data could not be loaded.");
els.chartWrap.innerHTML = '<div class="chart-message">Weather data could not be loaded.</div>';
els.hourlyGrid.innerHTML = '<div class="empty-card">Weather data could not be loaded.</div>';
}
function buildChart(entries) {
const width = 760;
const height = 220;
const padTop = 18;
const padRight = 18;
const padBottom = 28;
const padLeft = 46;
const temps = entries.map((entry) => entry.temp);
const min = Math.min(...temps);
const max = Math.max(...temps);
const range = Math.max(1, max - min);
const innerWidth = width - padLeft - padRight;
const innerHeight = height - padTop - padBottom;
const points = entries.map((entry, index) => {
const x = padLeft + (entries.length === 1 ? innerWidth / 2 : (index * innerWidth) / (entries.length - 1));
const y = padTop + ((max - entry.temp) / range) * innerHeight;
return { x, y, temp: entry.temp, time: entry.time };
});
const linePath = points
.map((point, index) => `${index === 0 ? "M" : "L"} ${point.x.toFixed(2)} ${point.y.toFixed(2)}`)
.join(" ");
const areaPath = `${linePath} L ${points[points.length - 1].x.toFixed(2)} ${(height - padBottom).toFixed(2)} L ${points[0].x.toFixed(2)} ${(height - padBottom).toFixed(2)} Z`;
const yTicks = 5;
let gridLines = "";
for (let i = 0; i < yTicks; i += 1) {
const progress = i / (yTicks - 1);
const y = padTop + progress * innerHeight;
const value = max - progress * range;
gridLines += `
<line x1="${padLeft}" y1="${y.toFixed(2)}" x2="${(width - padRight).toFixed(2)}" y2="${y.toFixed(2)}" stroke="rgba(255,255,255,0.08)" stroke-width="1" />
<text x="${(padLeft - 10).toFixed(2)}" y="${(y + 4).toFixed(2)}" text-anchor="end" style="fill: var(--text-3); font-size: 11px;">${formatTempCompact(value)}</text>
`;
}
const labelIndices = pickIndices(entries.length, 6);
const xLabels = labelIndices
.map((index) => {
const point = points[index];
return `<text x="${point.x.toFixed(2)}" y="${(height - 8).toFixed(2)}" text-anchor="middle" style="fill: var(--text-3); font-size: 11px;">${formatHour(entries[index].time)}</text>`;
})
.join("");
const dots = points
.map(
(point) => `
<circle cx="${point.x.toFixed(2)}" cy="${point.y.toFixed(2)}" r="3.1" fill="rgba(9,17,31,0.92)" stroke="rgba(255,255,255,0.82)" stroke-width="1.4" />
`
)
.join("");
const maxIndex = temps.indexOf(max);
const minIndex = temps.indexOf(min);
const highlightSet = Array.from(new Set([maxIndex, minIndex]));
const highlights = highlightSet
.map((index) => {
const point = points[index];
const label = maxIndex === minIndex ? "Flat" : index === maxIndex ? "Max" : "Min";
const anchor = point.x < padLeft + 38 ? "start" : point.x > width - padRight - 38 ? "end" : "middle";
const labelX = anchor === "start" ? point.x + 6 : anchor === "end" ? point.x - 6 : point.x;
const rawY = index === minIndex && maxIndex !== minIndex ? point.y + 22 : point.y - 16;
const labelY = clamp(rawY, 16, height - 16);
return `
<circle cx="${point.x.toFixed(2)}" cy="${point.y.toFixed(2)}" r="7.5" fill="rgba(255,255,255,0.16)" />
<circle cx="${point.x.toFixed(2)}" cy="${point.y.toFixed(2)}" r="4.8" style="fill: var(--accent-3);" stroke="rgba(9,17,31,0.9)" stroke-width="2" />
<text x="${labelX.toFixed(2)}" y="${labelY.toFixed(2)}" text-anchor="${anchor}" style="fill: var(--text-1); font-size: 11px; font-weight: 700;">${label} ${formatTempCompact(point.temp)}</text>
`;
})
.join("");
return `
<svg viewBox="0 0 ${width} ${height}" xmlns="http://www.w3.org/2000/svg" aria-label="Hourly temperatures chart" role="img" style="font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">
<defs>
<linearGradient id="areaGradient" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" style="stop-color: var(--accent-1); stop-opacity: 0.38;" />
<stop offset="100%" style="stop-color: var(--accent-2); stop-opacity: 0.03;" />
</linearGradient>
<linearGradient id="lineGradient" x1="0" y1="0" x2="1" y2="0">
<stop offset="0%" style="stop-color: var(--accent-1);" />
<stop offset="100%" style="stop-color: var(--accent-2);" />
</linearGradient>
</defs>
${gridLines}
<path d="${areaPath}" fill="url(#areaGradient)" />
<path d="${linePath}" fill="none" stroke="url(#lineGradient)" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" />
${dots}
${highlights}
${xLabels}
</svg>
`;
}
function buildHourlyGrid(entries) {
const temps = entries.map((entry) => entry.temp);
const min = Math.min(...temps);
const max = Math.max(...temps);
const range = Math.max(1, max - min);
return entries
.map((entry) => {
const fill = 28 + ((entry.temp - min) / range) * 72;
return `
<article class="hour-card" aria-label="${formatHour(entry.time)} ${formatTemp(entry.temp)}">
<span class="hour-time">${formatHour(entry.time)}</span>
<strong class="hour-temp">${formatTempCompact(entry.temp)}</strong>
<div class="hour-bar"><span style="width: ${fill.toFixed(1)}%;"></span></div>
</article>
`;
})
.join("");
}
function getWeatherArt(category) {
switch (category) {
case "clear":
return `
<svg viewBox="0 0 260 180" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<circle cx="130" cy="90" r="68" style="fill: var(--accent-3); opacity: 0.14;" />
<circle cx="130" cy="90" r="40" style="fill: var(--accent-3);" />
<g style="stroke: rgba(255,255,255,0.92); stroke-width: 6; stroke-linecap: round;">
<line x1="130" y1="22" x2="130" y2="4" />
<line x1="130" y1="176" x2="130" y2="158" />
<line x1="62" y1="90" x2="44" y2="90" />
<line x1="216" y1="90" x2="198" y2="90" />
<line x1="81" y1="41" x2="68" y2="28" />
<line x1="192" y1="152" x2="179" y2="139" />
<line x1="81" y1="139" x2="68" y2="152" />
<line x1="192" y1="28" x2="179" y2="41" />
</g>
<circle cx="80" cy="62" r="4" fill="white" opacity="0.82" />
<circle cx="184" cy="56" r="3.5" fill="white" opacity="0.78" />
<circle cx="170" cy="130" r="4" fill="white" opacity="0.7" />
</svg>
`;
case "cloudy":
return `
<svg viewBox="0 0 260 180" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<circle cx="182" cy="54" r="32" style="fill: var(--accent-3); opacity: 0.32;" />
<circle cx="182" cy="54" r="22" style="fill: var(--accent-3); opacity: 0.88;" />
<circle cx="102" cy="100" r="28" fill="rgba(255,255,255,0.96)" />
<circle cx="138" cy="88" r="36" fill="rgba(255,255,255,0.98)" />
<circle cx="176" cy="102" r="30" fill="rgba(255,255,255,0.93)" />
<rect x="80" y="100" width="122" height="36" rx="18" fill="rgba(255,255,255,0.96)" />
<ellipse cx="130" cy="146" rx="66" ry="12" fill="rgba(255,255,255,0.08)" />
</svg>
`;
case "rain":
return `
<svg viewBox="0 0 260 180" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<circle cx="102" cy="88" r="28" fill="rgba(255,255,255,0.95)" />
<circle cx="138" cy="76" r="36" fill="rgba(255,255,255,0.98)" />
<circle cx="176" cy="90" r="30" fill="rgba(255,255,255,0.93)" />
<rect x="80" y="88" width="122" height="38" rx="19" fill="rgba(255,255,255,0.96)" />
<g style="stroke: var(--accent-1); stroke-width: 7; stroke-linecap: round; opacity: 0.95;">
<line x1="102" y1="132" x2="94" y2="152" />
<line x1="132" y1="132" x2="124" y2="154" />
<line x1="162" y1="132" x2="154" y2="152" />
<line x1="192" y1="132" x2="184" y2="154" />
</g>
<ellipse cx="140" cy="164" rx="70" ry="10" fill="rgba(255,255,255,0.06)" />
</svg>
`;
case "snow":
return `
<svg viewBox="0 0 260 180" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<circle cx="102" cy="88" r="28" fill="rgba(255,255,255,0.95)" />
<circle cx="138" cy="76" r="36" fill="rgba(255,255,255,0.98)" />
<circle cx="176" cy="90" r="30" fill="rgba(255,255,255,0.93)" />
<rect x="80" y="88" width="122" height="38" rx="19" fill="rgba(255,255,255,0.96)" />
<g style="stroke: var(--accent-1); stroke-width: 4; stroke-linecap: round;">
<g transform="translate(104 145)">
<line x1="-8" y1="0" x2="8" y2="0" />
<line x1="0" y1="-8" x2="0" y2="8" />
<line x1="-6" y1="-6" x2="6" y2="6" />
<line x1="-6" y1="6" x2="6" y2="-6" />
</g>
<g transform="translate(136 150)">
<line x1="-8" y1="0" x2="8" y2="0" />
<line x1="0" y1="-8" x2="0" y2="8" />
<line x1="-6" y1="-6" x2="6" y2="6" />
<line x1="-6" y1="6" x2="6" y2="-6" />
</g>
<g transform="translate(170 145)">
<line x1="-8" y1="0" x2="8" y2="0" />
<line x1="0" y1="-8" x2="0" y2="8" />
<line x1="-6" y1="-6" x2="6" y2="6" />
<line x1="-6" y1="6" x2="6" y2="-6" />
</g>
</g>
<ellipse cx="140" cy="164" rx="70" ry="10" fill="rgba(255,255,255,0.06)" />
</svg>
`;
case "thunder":
return `
<svg viewBox="0 0 260 180" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<circle cx="102" cy="86" r="28" fill="rgba(255,255,255,0.92)" />
<circle cx="138" cy="74" r="36" fill="rgba(255,255,255,0.96)" />
<circle cx="176" cy="88" r="30" fill="rgba(255,255,255,0.9)" />
<rect x="80" y="86" width="122" height="38" rx="19" fill="rgba(255,255,255,0.94)" />
<polygon points="138,126 120,158 140,158 128,178 172,138 148,138 160,126" style="fill: var(--accent-3);" />
<ellipse cx="142" cy="166" rx="70" ry="10" fill="rgba(255,255,255,0.06)" />
</svg>
`;
case "fog":
return `
<svg viewBox="0 0 260 180" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<circle cx="170" cy="56" r="22" style="fill: var(--accent-3); opacity: 0.48;" />
<circle cx="102" cy="92" r="28" fill="rgba(255,255,255,0.95)" />
<circle cx="138" cy="80" r="36" fill="rgba(255,255,255,0.98)" />
<circle cx="176" cy="94" r="30" fill="rgba(255,255,255,0.93)" />
<rect x="80" y="92" width="122" height="36" rx="18" fill="rgba(255,255,255,0.96)" />
<g style="stroke: rgba(255,255,255,0.7); stroke-width: 6; stroke-linecap: round;">
<line x1="72" y1="140" x2="200" y2="140" />
<line x1="82" y1="154" x2="214" y2="154" />
<line x1="64" y1="168" x2="188" y2="168" />
</g>
</svg>
`;
default:
return `
<svg viewBox="0 0 260 180" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<circle cx="180" cy="56" r="32" style="fill: var(--accent-3); opacity: 0.28;" />
<circle cx="180" cy="56" r="22" style="fill: var(--accent-3); opacity: 0.88;" />
<circle cx="102" cy="98" r="28" fill="rgba(255,255,255,0.96)" />
<circle cx="138" cy="86" r="36" fill="rgba(255,255,255,0.98)" />
<circle cx="176" cy="100" r="30" fill="rgba(255,255,255,0.93)" />
<rect x="80" y="98" width="122" height="36" rx="18" fill="rgba(255,255,255,0.96)" />
<ellipse cx="132" cy="148" rx="66" ry="12" fill="rgba(255,255,255,0.08)" />
</svg>
`;
}
}
function applyTheme(category) {
const theme = THEMES[category] || THEMES.default;
const root = document.documentElement;
root.style.setProperty("--bg-1", theme.bg1);
root.style.setProperty("--bg-2", theme.bg2);
root.style.setProperty("--accent-1", theme.accent1);
root.style.setProperty("--accent-2", theme.accent2);
root.style.setProperty("--accent-3", theme.accent3);
}
function parseBoundedNumber(value, fallback, min, max) {
const num = Number.parseFloat(value);
if (!Number.isFinite(num) || num < min || num > max) {
return fallback;
}
return num;
}
function normalizeName(value, fallback) {
const text = typeof value === "string" ? value.trim() : "";
return text || fallback;
}
function normalizeDate(value) {
const today = getTodayUTC();
if (typeof value !== "string" || !/^\d{4}-\d{2}-\d{2}$/.test(value)) {
return today;
}
const parsed = new Date(`${value}T00:00:00Z`);
if (Number.isNaN(parsed.getTime()) || parsed.toISOString().slice(0, 10) !== value) {
return today;
}
return value;
}
function getTodayUTC() {
return new Date().toISOString().slice(0, 10);
}
function formatLongDate(dateString) {
const dateObj = new Date(`${dateString}T00:00:00Z`);
return new Intl.DateTimeFormat("en-US", {
weekday: "long",
month: "long",
day: "numeric",
year: "numeric",
timeZone: "UTC"
}).format(dateObj);
}
function formatCoord(value, positive, negative) {
const direction = value >= 0 ? positive : negative;
return `${Math.abs(value).toFixed(2)}° ${direction}`;
}
function formatHour(value) {
if (typeof value === "string" && value.length >= 16) {
return value.slice(11, 16);
}
return "--:--";
}
function formatTemp(value) {
return `${cleanRounded(value)}°C`;
}
function formatTempCompact(value) {
return `${cleanRounded(value)}°`;
}
function cleanRounded(value) {
const rounded = Math.round(value);
return Object.is(rounded, -0) ? 0 : rounded;
}
function pickIndices(length, desired) {
if (length <= 1) {
return [0];
}
const set = new Set([0, length - 1]);
for (let i = 1; i < desired - 1; i += 1) {
set.add(Math.round((i * (length - 1)) / (desired - 1)));
}
return Array.from(set).sort((a, b) => a - b);
}
function clamp(value, min, max) {
return Math.max(min, Math.min(max, value));
}
function setText(el, value) {
el.textContent = value;
}
})();
</script>
</body>
</html>L1 —— 廉价的确定性描述量
| bytes 总计 | 38,863 | html / css / js | 2,923 / 11,533 / 24,407 |
|---|---|---|---|
| dom 节点 | 50 | dom 深度 | 8 |
| css 规则 | 55 | 含 js | 是 |
| brightness | 54.6 | contrast | 29.9 |
| colorfulness | 32.7 | 留白 | 46.3% |
该 slot 的 telemetry
| prompt tokens | 16,079 | completion tokens | 30,704 |
|---|---|---|---|
| total tokens | 46,783 | wall | 269 s |
| cost | — | request id | — |
config.json565 B
{
"N": 2,
"auth": {
"credential_ref": "WCB_NONE",
"method": "oauth-login"
},
"billing": "plan",
"config_id": "gpt-5.4-eff-xhigh--cli--cursor-xl--dev",
"effort": "xhigh",
"family": "gpt",
"m": {
"min": 2,
"q": 2
},
"model_id": "gpt-5.4",
"protocol": "cli",
"served_model": "gpt-5.4-xhigh",
"telemetry": {
"completion_tokens": 127885,
"cost_usd": null,
"prompt_tokens": 36643,
"total_tokens": 164528,
"wall_ms": 1047325
},
"transport": "cursor-agent-cli-isolated-home",
"vendor_sanction_ref": null
}send-log2.5 KB
{
"N": 2,
"batch_id": "2026-08-13--cursor-xl-s2",
"config_id": "gpt-5.4-eff-xhigh--cli--cursor-xl--dev",
"positions": [
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-08-13T15:22:29.008399+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-13T15:18:52.344146+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-13T15:27:01.914769+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-13T15:22:32.909898+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-13T15:32:43.504200+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-13T15:27:06.016585+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-13T15:36:31.935802+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-13T15:32:47.758688+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
}
}
}