gpt-5.2 @ xhigh · cursor-xl
cursor-xlxhigh
- config
- gpt-5.2-eff-xhigh--cli--cursor-xl--dev
- batch
- 2026-07-19--unified
- transport
- cursor-agent-cli-isolated-home
- protocol
- cli · plan
- served model
- gpt-5.2-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=1280, height=800, initial-scale=1, viewport-fit=cover" />
<meta name="color-scheme" content="dark" />
<title>Weather Card</title>
<link rel="icon" href="data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A//www.w3.org/2000/svg%27%20viewBox%3D%270%200%20100%20100%27%3E%3Cdefs%3E%3CradialGradient%20id%3D%27g%27%20cx%3D%2730%25%27%20cy%3D%2730%25%27%3E%3Cstop%20offset%3D%270%27%20stop-color%3D%27%23FBBF24%27/%3E%3Cstop%20offset%3D%271%27%20stop-color%3D%27%2360A5FA%27/%3E%3C/radialGradient%3E%3C/defs%3E%3Crect%20width%3D%27100%27%20height%3D%27100%27%20rx%3D%2722%27%20fill%3D%27%23070a14%27/%3E%3Cpath%20d%3D%27M28%2054c3-10%2013-16%2024-15%2010%202%2017%2010%2018%2019%2010%201%2017%209%2017%2019%200%2011-9%2020-20%2020H32c-11%200-20-9-20-20%200-10%207-18%2016-20Z%27%20fill%3D%27none%27%20stroke%3D%27url(%23g)%27%20stroke-width%3D%2710%27%20stroke-linecap%3D%27round%27/%3E%3C/svg%3E" />
<style>
:root{
--accent:#60A5FA;
--accent2:#A78BFA;
--accent-rgb:96 165 250;
--accent2-rgb:167 139 250;
--text:rgba(255,255,255,.92);
--muted:rgba(255,255,255,.68);
--muted2:rgba(255,255,255,.52);
--card:rgba(255,255,255,.085);
--card2:rgba(255,255,255,.055);
--border:rgba(255,255,255,.14);
--radius:28px;
--radius2:20px;
--shadow:0 40px 120px rgba(0,0,0,.55);
}
*{ box-sizing:border-box; }
html,body{ height:100%; }
body{
margin:0;
font-family:ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, "Apple Color Emoji","Segoe UI Emoji";
color:var(--text);
background:
radial-gradient(1200px 720px at 18% 12%, rgba(96,165,250,.32), transparent 62%),
radial-gradient(980px 620px at 82% 10%, rgba(244,114,182,.24), transparent 60%),
radial-gradient(980px 700px at 55% 92%, rgba(34,211,238,.16), transparent 62%),
linear-gradient(180deg, #070913 0%, #040510 100%);
overflow:hidden;
}
body::before{
content:"";
position:fixed;
inset:0;
pointer-events:none;
opacity:.10;
mix-blend-mode:overlay;
background-image:
radial-gradient(rgba(255,255,255,.18) 1px, transparent 1px);
background-size:3px 3px;
filter:blur(.2px);
}
body::after{
content:"";
position:fixed;
inset:0;
pointer-events:none;
background:
radial-gradient(900px 520px at 50% 45%, transparent 30%, rgba(0,0,0,.36) 78%, rgba(0,0,0,.62) 100%);
opacity:.85;
}
.stage{
position:relative;
min-height:100vh;
display:flex;
align-items:center;
justify-content:center;
padding:56px;
z-index:1;
}
.card{
position:relative;
width:1040px;
height:680px;
border-radius:var(--radius);
padding:28px 28px 24px;
background:
linear-gradient(135deg, rgba(255,255,255,.11), rgba(255,255,255,.06));
border:1px solid rgba(255,255,255,.12);
box-shadow:var(--shadow);
backdrop-filter: blur(18px);
-webkit-backdrop-filter: blur(18px);
display:grid;
grid-template-rows:auto auto 1fr auto;
gap:18px;
overflow:hidden;
transform: translateZ(0);
}
.card::before{
content:"";
position:absolute;
inset:0;
border-radius:var(--radius);
pointer-events:none;
background:
linear-gradient(135deg,
rgba(255,255,255,.28),
rgba(255,255,255,.06) 35%,
rgba(255,255,255,.14) 70%,
rgba(255,255,255,.22));
opacity:.55;
mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
-webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
mask-composite: exclude;
-webkit-mask-composite: xor;
padding:1px;
}
.glow{
position:absolute;
inset:-1px;
border-radius:var(--radius);
background:
radial-gradient(980px 560px at 16% 18%, rgb(var(--accent-rgb) / .28), transparent 64%),
radial-gradient(860px 520px at 86% 16%, rgb(var(--accent2-rgb) / .22), transparent 62%),
radial-gradient(820px 620px at 60% 96%, rgb(var(--accent-rgb) / .11), transparent 62%);
opacity:.9;
pointer-events:none;
z-index:0;
filter:saturate(1.15);
}
.header, .summary, .hourly, .footer{
position:relative;
z-index:1;
}
.header{
display:flex;
align-items:flex-start;
justify-content:space-between;
gap:22px;
}
.kicker{
display:inline-flex;
align-items:center;
gap:10px;
font-size:12px;
letter-spacing:.18em;
text-transform:uppercase;
color:var(--muted2);
margin-bottom:6px;
}
h1{
margin:0;
font-size:46px;
line-height:1.05;
letter-spacing:-.03em;
font-weight:760;
background: linear-gradient(90deg, var(--accent2), var(--accent));
-webkit-background-clip:text;
background-clip:text;
color:transparent;
text-shadow: 0 22px 60px rgba(0,0,0,.35);
}
.subtitle{
margin-top:6px;
color:var(--muted);
font-size:14px;
letter-spacing:.02em;
}
.meta{
margin-top:8px;
color:var(--muted2);
font-size:13px;
}
.badges{
display:flex;
gap:10px;
align-items:center;
flex-wrap:wrap;
justify-content:flex-end;
padding-top:2px;
}
.badge{
display:inline-flex;
align-items:center;
height:30px;
padding:0 12px;
border-radius:999px;
background: rgba(0,0,0,.18);
border:1px solid rgba(255,255,255,.10);
color:rgba(255,255,255,.75);
font-size:12px;
letter-spacing:.08em;
text-transform:uppercase;
}
.summary{
display:grid;
grid-template-columns: 1.12fr 1fr;
gap:18px;
align-items:stretch;
}
.condition{
display:flex;
gap:18px;
align-items:center;
padding:18px 18px 18px 18px;
border-radius:var(--radius2);
background: rgba(0,0,0,.16);
border:1px solid rgba(255,255,255,.10);
overflow:hidden;
position:relative;
}
.condition::after{
content:"";
position:absolute;
inset:-2px;
pointer-events:none;
background:
radial-gradient(420px 280px at 18% 28%, rgb(var(--accent-rgb) / .14), transparent 62%),
radial-gradient(420px 280px at 80% 22%, rgb(var(--accent2-rgb) / .10), transparent 62%);
opacity:.9;
}
.iconShell{
width:146px;
height:146px;
border-radius:24px;
display:grid;
place-items:center;
background:
radial-gradient(110px 110px at 28% 28%, rgba(255,255,255,.14), rgba(255,255,255,.05) 60%, rgba(0,0,0,.08));
border:1px solid rgba(255,255,255,.14);
box-shadow: 0 28px 60px rgba(0,0,0,.35);
flex:0 0 auto;
position:relative;
z-index:1;
}
#wxIcon{
width:120px;
height:120px;
color: rgba(255,255,255,.92);
filter: drop-shadow(0 18px 30px rgba(0,0,0,.32));
}
.condText{
position:relative;
z-index:1;
min-width:0;
}
.condLabel{
font-size:30px;
font-weight:740;
letter-spacing:-.02em;
line-height:1.15;
color:rgba(255,255,255,.92);
margin-bottom:6px;
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
}
.condDetail{
color:rgba(255,255,255,.66);
font-size:14px;
letter-spacing:.02em;
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
}
.temps{
border-radius:var(--radius2);
background: rgba(0,0,0,.16);
border:1px solid rgba(255,255,255,.10);
padding:18px;
display:flex;
flex-direction:column;
justify-content:space-between;
gap:14px;
overflow:hidden;
position:relative;
}
.temps::after{
content:"";
position:absolute;
inset:-2px;
pointer-events:none;
background:
radial-gradient(520px 320px at 70% 12%, rgb(var(--accent-rgb) / .12), transparent 62%),
radial-gradient(520px 320px at 20% 88%, rgb(var(--accent2-rgb) / .10), transparent 62%);
opacity:.85;
}
.tempGrid{
display:grid;
grid-template-columns:1fr 1fr;
gap:14px;
position:relative;
z-index:1;
}
.tempBox{
border-radius:18px;
padding:14px 14px 16px;
background: rgba(255,255,255,.05);
border:1px solid rgba(255,255,255,.12);
min-height:120px;
display:flex;
flex-direction:column;
justify-content:space-between;
}
.cap{
font-size:12px;
letter-spacing:.18em;
text-transform:uppercase;
color:rgba(255,255,255,.58);
}
.num{
font-size:44px;
font-weight:800;
letter-spacing:-.03em;
color:rgba(255,255,255,.94);
line-height:1;
margin-top:8px;
background: linear-gradient(90deg, rgba(255,255,255,.96), rgba(255,255,255,.70));
-webkit-background-clip:text;
background-clip:text;
color:transparent;
}
.rangeWrap{
position:relative;
z-index:1;
border-radius:18px;
padding:12px 12px 10px;
background: rgba(255,255,255,.035);
border:1px solid rgba(255,255,255,.10);
}
.rangeBar{
height:12px;
border-radius:999px;
background: rgba(255,255,255,.08);
overflow:hidden;
border:1px solid rgba(255,255,255,.08);
}
.rangeFill{
height:100%;
width:0%;
transform:translateX(0%);
border-radius:999px;
background: linear-gradient(90deg, var(--accent2), var(--accent));
box-shadow: 0 10px 26px rgb(var(--accent-rgb) / .28);
transition: width .55s ease, transform .55s ease;
}
.rangeLabels{
margin-top:9px;
display:flex;
justify-content:space-between;
color:rgba(255,255,255,.60);
font-size:12px;
letter-spacing:.02em;
}
.hourly{
border-radius:var(--radius2);
background: rgba(0,0,0,.14);
border:1px solid rgba(255,255,255,.10);
padding:18px;
display:grid;
grid-template-rows:auto 1fr auto;
gap:14px;
overflow:hidden;
position:relative;
}
.hourly::after{
content:"";
position:absolute;
inset:-2px;
pointer-events:none;
background:
radial-gradient(640px 420px at 24% 18%, rgb(var(--accent-rgb) / .10), transparent 62%),
radial-gradient(640px 420px at 86% 22%, rgb(var(--accent2-rgb) / .08), transparent 62%);
opacity:.8;
}
.hourlyHead{
display:flex;
align-items:flex-start;
justify-content:space-between;
gap:14px;
position:relative;
z-index:1;
}
.hourlyTitle{
font-size:14px;
letter-spacing:.16em;
text-transform:uppercase;
color:rgba(255,255,255,.70);
margin-bottom:6px;
}
.hourlySub{
color:rgba(255,255,255,.56);
font-size:13px;
letter-spacing:.02em;
}
.unitPill{
height:32px;
padding:0 12px;
border-radius:999px;
background: rgba(0,0,0,.20);
border:1px solid rgba(255,255,255,.10);
display:inline-flex;
align-items:center;
justify-content:center;
color:rgba(255,255,255,.72);
font-size:12px;
letter-spacing:.14em;
text-transform:uppercase;
}
.chartCard{
position:relative;
z-index:1;
height:210px;
border-radius:18px;
background: rgba(255,255,255,.045);
border:1px solid rgba(255,255,255,.10);
overflow:hidden;
padding:10px 12px;
}
#chart{
width:100%;
height:100%;
display:block;
}
.axis{
position:absolute;
inset:0;
pointer-events:none;
}
.axisMin{
position:absolute;
left:14px;
bottom:12px;
font-size:12px;
color:rgba(255,255,255,.58);
letter-spacing:.02em;
}
.axisMax{
position:absolute;
right:14px;
top:10px;
font-size:12px;
color:rgba(255,255,255,.58);
letter-spacing:.02em;
}
.hourlyScroller{
position:relative;
z-index:1;
display:flex;
gap:10px;
overflow-x:auto;
padding:2px 2px 6px;
scroll-snap-type:x mandatory;
-webkit-overflow-scrolling:touch;
}
.hourItem{
flex:0 0 auto;
min-width:68px;
border-radius:16px;
padding:10px 10px 12px;
background: rgba(0,0,0,.18);
border:1px solid rgba(255,255,255,.10);
scroll-snap-align:start;
transition: transform .18s ease, border-color .18s ease, background .18s ease;
}
.hourItem:hover{
transform: translateY(-2px);
border-color: rgba(255,255,255,.18);
background: rgba(0,0,0,.22);
}
.hourItem.extrema{
border-color: rgb(var(--accent-rgb) / .55);
box-shadow: 0 18px 42px rgb(var(--accent-rgb) / .10);
}
.hour{
font-size:12px;
color:rgba(255,255,255,.62);
letter-spacing:.12em;
text-transform:uppercase;
}
.val{
margin-top:6px;
font-size:18px;
font-weight:760;
letter-spacing:-.02em;
color:rgba(255,255,255,.90);
}
.hourlyScroller::-webkit-scrollbar{ height:10px; }
.hourlyScroller::-webkit-scrollbar-track{
background: rgba(255,255,255,.05);
border-radius:999px;
}
.hourlyScroller::-webkit-scrollbar-thumb{
background: rgba(255,255,255,.14);
border-radius:999px;
border:2px solid rgba(0,0,0,0);
background-clip: padding-box;
}
.hourlyScroller::-webkit-scrollbar-thumb:hover{ background: rgba(255,255,255,.20); }
.footer{
display:flex;
align-items:center;
justify-content:space-between;
gap:14px;
padding-top:2px;
z-index:1;
}
.footLeft{
color:rgba(255,255,255,.52);
font-size:12px;
letter-spacing:.02em;
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
max-width:760px;
}
.ghostBtn, .primaryBtn{
border:1px solid rgba(255,255,255,.14);
background: rgba(255,255,255,.06);
color: rgba(255,255,255,.84);
border-radius:999px;
height:38px;
padding:0 14px;
font-size:13px;
letter-spacing:.08em;
text-transform:uppercase;
cursor:pointer;
transition: transform .15s ease, background .15s ease, border-color .15s ease;
user-select:none;
}
.ghostBtn:hover{
transform: translateY(-1px);
background: rgba(255,255,255,.08);
border-color: rgba(255,255,255,.20);
}
.primaryBtn{
background: linear-gradient(90deg, rgb(var(--accent2-rgb) / .28), rgb(var(--accent-rgb) / .28));
border-color: rgb(var(--accent-rgb) / .35);
}
.primaryBtn:hover{
transform: translateY(-1px);
background: linear-gradient(90deg, rgb(var(--accent2-rgb) / .34), rgb(var(--accent-rgb) / .34));
border-color: rgb(var(--accent-rgb) / .48);
}
button:focus-visible{
outline:3px solid rgb(var(--accent-rgb) / .45);
outline-offset:2px;
}
.overlay{
position:absolute;
inset:0;
border-radius:var(--radius);
display:flex;
align-items:center;
justify-content:center;
background:
linear-gradient(180deg, rgba(6,7,14,.72), rgba(6,7,14,.36));
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
z-index:3;
padding:28px;
}
.overlayInner{
width:min(520px, 100%);
border-radius:22px;
background: rgba(255,255,255,.07);
border:1px solid rgba(255,255,255,.12);
box-shadow: 0 40px 120px rgba(0,0,0,.55);
padding:20px 20px 18px;
text-align:center;
position:relative;
overflow:hidden;
}
.overlayInner::before{
content:"";
position:absolute;
inset:-2px;
pointer-events:none;
background:
radial-gradient(520px 320px at 30% 20%, rgb(var(--accent-rgb) / .18), transparent 64%),
radial-gradient(520px 320px at 78% 30%, rgb(var(--accent2-rgb) / .14), transparent 62%);
opacity:.85;
}
.overlayBadge{
position:relative;
z-index:1;
width:56px;
height:56px;
margin: 2px auto 12px;
border-radius:18px;
border:1px solid rgba(255,255,255,.12);
background: rgba(0,0,0,.18);
display:grid;
place-items:center;
box-shadow: 0 26px 60px rgba(0,0,0,.35);
}
.spinner{
width:26px;
height:26px;
border-radius:999px;
border:3px solid rgba(255,255,255,.20);
border-top-color: rgb(var(--accent-rgb) / .95);
animation: spin 1s linear infinite;
}
.errorMark{
display:none;
font-weight:900;
font-size:22px;
color: rgba(255,255,255,.90);
width:26px;
height:26px;
line-height:26px;
border-radius:999px;
background: linear-gradient(180deg, rgb(var(--accent2-rgb) / .34), rgb(var(--accent-rgb) / .26));
border:1px solid rgb(var(--accent-rgb) / .28);
}
.overlayTitle{
position:relative;
z-index:1;
font-size:18px;
font-weight:780;
letter-spacing:-.01em;
margin-bottom:6px;
color: rgba(255,255,255,.92);
}
.overlayText{
position:relative;
z-index:1;
color: rgba(255,255,255,.70);
font-size:14px;
letter-spacing:.02em;
line-height:1.45;
margin-bottom:10px;
}
.overlayMeta{
position:relative;
z-index:1;
color: rgba(255,255,255,.52);
font-size:12px;
letter-spacing:.02em;
padding:10px 12px;
border-radius:14px;
border:1px solid rgba(255,255,255,.10);
background: rgba(0,0,0,.16);
margin: 0 auto;
width:100%;
word-break:break-word;
}
.overlayActions{
position:relative;
z-index:1;
margin-top:14px;
display:none;
justify-content:center;
gap:10px;
}
.overlay[data-mode="error"] .overlayActions{ display:flex; }
.overlay[data-mode="error"] .spinner{ display:none; }
.overlay[data-mode="error"] .errorMark{ display:grid; place-items:center; }
.overlay[data-mode="loading"] .errorMark{ display:none; }
.card[data-state="ready"] .overlay{ display:none; }
@keyframes spin { to { transform: rotate(360deg); } }
@media (max-width: 1140px){
.card{ width: calc(100vw - 72px); }
.footLeft{ max-width: 62vw; }
}
@media (prefers-reduced-motion: reduce){
*{ animation-duration:0.01ms !important; animation-iteration-count:1 !important; transition-duration:0.01ms !important; }
.hourlyScroller{ scroll-behavior:auto; }
}
</style>
</head>
<body>
<div class="stage">
<main class="card" id="card" data-state="loading">
<div class="glow" aria-hidden="true"></div>
<header class="header">
<div class="titleBlock">
<div class="kicker">Weather</div>
<h1 id="locName">Berlin</h1>
<div class="subtitle" id="subtitle">—</div>
<div class="meta" id="metaLine">—</div>
</div>
<div class="badges" aria-label="Data context">
<span class="badge" id="badgeSource">—</span>
<span class="badge">UTC</span>
</div>
</header>
<section class="summary" aria-label="Daily summary">
<div class="condition">
<div class="iconShell" aria-hidden="true">
<svg id="wxIcon" viewBox="0 0 120 120" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M60 18c15.5 0 28 12.5 28 28S75.5 74 60 74 32 61.5 32 46s12.5-28 28-28Z" stroke="currentColor" stroke-width="8" opacity=".25"/>
</svg>
</div>
<div class="condText">
<div class="condLabel" id="conditionLabel">Loading…</div>
<div class="condDetail" id="conditionDetail">—</div>
</div>
</div>
<div class="temps">
<div class="tempGrid">
<div class="tempBox max">
<div class="cap">Max</div>
<div class="num" id="tempMax">—</div>
</div>
<div class="tempBox min">
<div class="cap">Min</div>
<div class="num" id="tempMin">—</div>
</div>
</div>
<div class="rangeWrap" aria-hidden="true">
<div class="rangeBar"><div class="rangeFill" id="rangeFill"></div></div>
<div class="rangeLabels">
<span id="rangeMin">—</span>
<span id="rangeMax">—</span>
</div>
</div>
</div>
</section>
<section class="hourly" aria-label="Hourly temperatures">
<div class="hourlyHead">
<div>
<div class="hourlyTitle">Hourly temperature</div>
<div class="hourlySub" id="hourlySub">—</div>
</div>
<div class="unitPill" aria-label="Temperature unit">°C</div>
</div>
<div class="chartCard">
<svg id="chart" viewBox="0 0 1000 200" preserveAspectRatio="none" role="img" aria-label="Hourly temperature chart">
<defs>
<linearGradient id="lineGrad" x1="0" y1="0" x2="1" y2="0">
<stop offset="0" stop-color="var(--accent2)"/>
<stop offset="0.55" stop-color="var(--accent)"/>
<stop offset="1" stop-color="var(--accent2)"/>
</linearGradient>
<linearGradient id="areaGrad" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="var(--accent)" stop-opacity=".35"/>
<stop offset="1" stop-color="var(--accent)" stop-opacity="0"/>
</linearGradient>
</defs>
<g id="grid"></g>
<path id="area" d="" fill="url(#areaGrad)"></path>
<path id="line" d="" fill="none" stroke="url(#lineGrad)" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"></path>
<g id="dots"></g>
</svg>
<div class="axis" aria-hidden="true">
<div class="axisMin" id="axisMin">—</div>
<div class="axisMax" id="axisMax">—</div>
</div>
</div>
<div class="hourlyScroller" id="hourlyScroller" aria-label="Hourly temperatures list"></div>
</section>
<footer class="footer" aria-label="Footer">
<div class="footLeft" id="footLeft">—</div>
<button class="ghostBtn" id="reloadBtn" type="button">Reload</button>
</footer>
<div class="overlay" id="overlay" role="status" aria-live="polite" data-mode="loading">
<div class="overlayInner">
<div class="overlayBadge" aria-hidden="true">
<div class="spinner"></div>
<div class="errorMark">!</div>
</div>
<div class="overlayTitle" id="overlayTitle">Loading weather…</div>
<div class="overlayText" id="overlayText">Fetching data for the requested date.</div>
<div class="overlayMeta" id="overlayMeta"></div>
<div class="overlayActions">
<button class="primaryBtn" id="retryBtn" type="button">Try again</button>
</div>
</div>
</div>
</main>
</div>
<script>
(() => {
'use strict';
const $ = (id) => document.getElementById(id);
const ui = {
card: $('card'),
overlay: $('overlay'),
overlayTitle: $('overlayTitle'),
overlayText: $('overlayText'),
overlayMeta: $('overlayMeta'),
retryBtn: $('retryBtn'),
locName: $('locName'),
subtitle: $('subtitle'),
metaLine: $('metaLine'),
badgeSource: $('badgeSource'),
wxIcon: $('wxIcon'),
conditionLabel: $('conditionLabel'),
conditionDetail: $('conditionDetail'),
tempMax: $('tempMax'),
tempMin: $('tempMin'),
rangeFill: $('rangeFill'),
rangeMin: $('rangeMin'),
rangeMax: $('rangeMax'),
hourlySub: $('hourlySub'),
axisMin: $('axisMin'),
axisMax: $('axisMax'),
chart: $('chart'),
grid: $('grid'),
area: $('area'),
line: $('line'),
dots: $('dots'),
hourlyScroller: $('hourlyScroller'),
footLeft: $('footLeft'),
reloadBtn: $('reloadBtn'),
};
const clamp = (n, min, max) => Math.min(max, Math.max(min, n));
const isFiniteNumber = (n) => typeof n === 'number' && Number.isFinite(n);
const safeText = (s, fallback) => {
const t = (s == null ? '' : String(s)).trim();
return t ? t.slice(0, 80) : fallback;
};
function parseNumber(v, fallback) {
const n = Number.parseFloat(v);
return Number.isFinite(n) ? n : fallback;
}
function utcTodayISO() {
return new Date().toISOString().slice(0, 10);
}
function isValidISODate(s) {
if (!/^\d{4}-\d{2}-\d{2}$/.test(s)) return false;
const d = new Date(s + 'T00:00:00Z');
if (Number.isNaN(d.getTime())) return false;
return d.toISOString().slice(0, 10) === s;
}
function formatDateLong(isoDate) {
const d = new Date(isoDate + 'T00:00:00Z');
const fmt = new Intl.DateTimeFormat('en-US', { weekday: 'long', year: 'numeric', month: 'short', day: '2-digit', timeZone: 'UTC' });
return fmt.format(d);
}
function formatDateShort(isoDate) {
const d = new Date(isoDate + 'T00:00:00Z');
const fmt = new Intl.DateTimeFormat('en-US', { weekday: 'short', month: 'short', day: '2-digit', timeZone: 'UTC' });
return fmt.format(d);
}
function formatTemp(v, opts = {}) {
const { withUnit = false, decimals = 0 } = opts;
if (!isFiniteNumber(v)) return '—';
const n = decimals === 0 ? Math.round(v) : (Math.round(v * 10) / 10);
const s = decimals === 0 ? String(n) : n.toFixed(1);
return withUnit ? `${s}°C` : `${s}°`;
}
function hexToRgbTriplet(hex) {
const h = String(hex || '').trim().replace('#','');
if (!/^[0-9a-fA-F]{6}$/.test(h)) return null;
const r = parseInt(h.slice(0,2), 16);
const g = parseInt(h.slice(2,4), 16);
const b = parseInt(h.slice(4,6), 16);
return `${r} ${g} ${b}`;
}
function weatherMeta(code) {
const map = new Map([
[0, ['Clear sky', 'Sunny']],
[1, ['Mainly clear', 'Mostly sunny']],
[2, ['Partly cloudy', 'Some clouds']],
[3, ['Overcast', 'Cloudy']],
[45, ['Fog', 'Low visibility']],
[48, ['Depositing rime fog', 'Icy fog']],
[51, ['Light drizzle', 'Drizzle']],
[53, ['Moderate drizzle', 'Drizzle']],
[55, ['Dense drizzle', 'Drizzle']],
[56, ['Light freezing drizzle', 'Freezing drizzle']],
[57, ['Dense freezing drizzle', 'Freezing drizzle']],
[61, ['Slight rain', 'Rain']],
[63, ['Moderate rain', 'Rain']],
[65, ['Heavy rain', 'Rain']],
[66, ['Light freezing rain', 'Freezing rain']],
[67, ['Heavy freezing rain', 'Freezing rain']],
[71, ['Slight snowfall', 'Snow']],
[73, ['Moderate snowfall', 'Snow']],
[75, ['Heavy snowfall', 'Snow']],
[77, ['Snow grains', 'Snow grains']],
[80, ['Slight rain showers', 'Showers']],
[81, ['Moderate rain showers', 'Showers']],
[82, ['Violent rain showers', 'Heavy showers']],
[85, ['Slight snow showers', 'Snow showers']],
[86, ['Heavy snow showers', 'Snow showers']],
[95, ['Thunderstorm', 'Thunder']],
[96, ['Thunderstorm with slight hail', 'Thunder + hail']],
[99, ['Thunderstorm with heavy hail', 'Thunder + hail']],
]);
const pair = map.get(code);
const label = pair ? pair[0] : 'Unknown conditions';
const detail = pair ? pair[1] : `Weather code ${String(code)}`;
let kind = 'cloud';
if (code === 0) kind = 'sun';
else if (code === 1 || code === 2) kind = 'partly';
else if (code === 3) kind = 'cloud';
else if (code === 45 || code === 48) kind = 'fog';
else if ((code >= 51 && code <= 67) || (code >= 80 && code <= 82)) kind = 'rain';
else if ((code >= 71 && code <= 77) || (code >= 85 && code <= 86)) kind = 'snow';
else if (code === 95) kind = 'thunder';
else if (code === 96 || code === 99) kind = 'hail';
const themeByKind = {
sun: { accent: '#FBBF24', accent2: '#F97316' },
partly: { accent: '#A78BFA', accent2: '#FBBF24' },
cloud: { accent: '#93C5FD', accent2: '#CBD5E1' },
fog: { accent: '#94A3B8', accent2: '#60A5FA' },
rain: { accent: '#60A5FA', accent2: '#22D3EE' },
snow: { accent: '#A5B4FC', accent2: '#E0E7FF' },
thunder: { accent: '#F472B6', accent2: '#A78BFA' },
hail: { accent: '#67E8F9', accent2: '#F472B6' },
};
const theme = themeByKind[kind] || themeByKind.cloud;
return { code, label, detail, kind, theme };
}
function iconSVG(kind) {
const common = 'stroke="currentColor" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"';
if (kind === 'sun') {
return `
<circle cx="60" cy="60" r="18" ${common} fill="none" opacity="0.95"/>
<path d="M60 18v10M60 92v10M18 60h10M92 60h10M30 30l7 7M83 83l7 7M90 30l-7 7M37 83l-7 7" ${common} opacity="0.75"/>
`;
}
if (kind === 'partly') {
return `
<path d="M38 30a16 16 0 1 1 22 19" ${common} opacity="0.85"/>
<path d="M32 52c3-11 14-18 25-16 10 2 18 10 19 20 10 1 18 9 18 20 0 12-10 22-22 22H40c-12 0-22-10-22-22 0-11 8-20 18-22Z" ${common} fill="none" opacity="0.95"/>
`;
}
if (kind === 'cloud') {
return `
<path d="M32 56c3-12 15-20 28-18 12 2 21 12 22 25 12 1 22 11 22 24 0 14-12 26-26 26H38c-14 0-26-12-26-26 0-13 9-24 20-27Z" ${common} fill="none" opacity="0.95"/>
`;
}
if (kind === 'fog') {
return `
<path d="M30 54c3-11 14-18 25-16 10 2 18 10 19 20 10 1 18 9 18 20 0 12-10 22-22 22H40c-12 0-22-10-22-22 0-11 8-20 18-22Z" ${common} fill="none" opacity="0.9"/>
<path d="M26 92h68M22 104h76" ${common} opacity="0.6"/>
`;
}
if (kind === 'rain') {
return `
<path d="M30 52c3-11 14-18 25-16 10 2 18 10 19 20 10 1 18 9 18 20 0 12-10 22-22 22H40c-12 0-22-10-22-22 0-11 8-20 18-22Z" ${common} fill="none" opacity="0.95"/>
<path d="M44 92l-6 12M62 92l-6 12M80 92l-6 12" ${common} opacity="0.85"/>
`;
}
if (kind === 'snow') {
return `
<path d="M30 52c3-11 14-18 25-16 10 2 18 10 19 20 10 1 18 9 18 20 0 12-10 22-22 22H40c-12 0-22-10-22-22 0-11 8-20 18-22Z" ${common} fill="none" opacity="0.95"/>
<path d="M45 94l6 10m0-10l-6 10M63 94l6 10m0-10l-6 10M81 94l6 10m0-10l-6 10" ${common} opacity="0.75"/>
`;
}
if (kind === 'thunder') {
return `
<path d="M30 52c3-11 14-18 25-16 10 2 18 10 19 20 10 1 18 9 18 20 0 12-10 22-22 22H40c-12 0-22-10-22-22 0-11 8-20 18-22Z" ${common} fill="none" opacity="0.95"/>
<path d="M64 82l-12 18h10l-6 16 22-26H68l8-14H64Z" fill="currentColor" opacity="0.9"/>
`;
}
if (kind === 'hail') {
return `
<path d="M30 52c3-11 14-18 25-16 10 2 18 10 19 20 10 1 18 9 18 20 0 12-10 22-22 22H40c-12 0-22-10-22-22 0-11 8-20 18-22Z" ${common} fill="none" opacity="0.95"/>
<path d="M48 92l-6 12M72 92l-6 12" ${common} opacity="0.85"/>
<circle cx="44" cy="108" r="4" fill="currentColor" opacity="0.75"/>
<circle cx="64" cy="108" r="4" fill="currentColor" opacity="0.75"/>
<circle cx="84" cy="108" r="4" fill="currentColor" opacity="0.75"/>
`;
}
return iconSVG('cloud');
}
function setTheme(meta) {
const a = meta?.theme?.accent || '#60A5FA';
const b = meta?.theme?.accent2 || '#A78BFA';
const aRgb = hexToRgbTriplet(a) || '96 165 250';
const bRgb = hexToRgbTriplet(b) || '167 139 250';
document.documentElement.style.setProperty('--accent', a);
document.documentElement.style.setProperty('--accent2', b);
document.documentElement.style.setProperty('--accent-rgb', aRgb);
document.documentElement.style.setProperty('--accent2-rgb', bRgb);
}
function setOverlay(mode, title, text, meta) {
ui.overlay.hidden = false;
ui.overlay.setAttribute('data-mode', mode);
ui.overlayTitle.textContent = title || '';
ui.overlayText.textContent = text || '';
ui.overlayMeta.textContent = meta || '';
ui.card.setAttribute('data-state', mode);
}
function hideOverlay() {
ui.overlay.hidden = true;
}
function endpointForDate(isoDate) {
const today = utcTodayISO();
return (isoDate < today) ? '/api/om/archive' : '/api/om/forecast';
}
function buildApiURL(endpoint, latitude, longitude, isoDate) {
const u = new URL(endpoint, window.location.origin);
u.searchParams.set('latitude', String(latitude));
u.searchParams.set('longitude', String(longitude));
u.searchParams.set('daily', 'temperature_2m_max,temperature_2m_min,weather_code');
u.searchParams.set('hourly', 'temperature_2m');
u.searchParams.set('timezone', 'UTC');
u.searchParams.set('temperature_unit', 'celsius');
u.searchParams.set('start_date', isoDate);
u.searchParams.set('end_date', isoDate);
return u.toString();
}
function hourFromTimeStr(t) {
const m = /T(\d{2}):/.exec(t);
return m ? m[1] : '??';
}
function renderHourlyScroller(hours) {
ui.hourlyScroller.innerHTML = '';
const frag = document.createDocumentFragment();
for (const h of hours) {
const item = document.createElement('div');
item.className = 'hourItem' + (h.isExtrema ? ' extrema' : '');
const t = document.createElement('div');
t.className = 'hour';
t.textContent = h.hour;
const v = document.createElement('div');
v.className = 'val';
v.textContent = formatTemp(h.temp, { withUnit: false, decimals: 0 });
item.appendChild(t);
item.appendChild(v);
frag.appendChild(item);
}
ui.hourlyScroller.appendChild(frag);
}
function renderChart(tempsRaw) {
const N = tempsRaw.length;
ui.grid.innerHTML = '';
ui.dots.innerHTML = '';
ui.area.setAttribute('d', '');
ui.line.setAttribute('d', '');
if (!N) return;
// Clean NaNs: forward fill, then backward fill.
const temps = tempsRaw.slice();
let last = NaN;
for (let i = 0; i < N; i++) {
const v = temps[i];
if (isFiniteNumber(v)) last = v;
else if (isFiniteNumber(last)) temps[i] = last;
}
let next = NaN;
for (let i = N - 1; i >= 0; i--) {
const v = temps[i];
if (isFiniteNumber(v)) next = v;
else if (isFiniteNumber(next)) temps[i] = next;
}
let tMin = Infinity, tMax = -Infinity;
for (const t of temps) {
if (isFiniteNumber(t)) {
tMin = Math.min(tMin, t);
tMax = Math.max(tMax, t);
}
}
if (!isFiniteNumber(tMin) || !isFiniteNumber(tMax)) return;
const padX = 24, padY = 24;
const W = 1000, H = 200;
const span = Math.max(1, tMax - tMin);
const scaleY = (H - padY * 2) / span;
const baseY = H - padY;
const pts = [];
for (let i = 0; i < N; i++) {
const x = padX + (i * (W - padX * 2)) / Math.max(1, N - 1);
const y = baseY - (temps[i] - tMin) * scaleY;
pts.push([x, y]);
}
let dLine = `M ${pts[0][0].toFixed(2)} ${pts[0][1].toFixed(2)}`;
for (let i = 1; i < pts.length; i++) dLine += ` L ${pts[i][0].toFixed(2)} ${pts[i][1].toFixed(2)}`;
ui.line.setAttribute('d', dLine);
const dArea = `${dLine} L ${pts[pts.length - 1][0].toFixed(2)} ${baseY.toFixed(2)} L ${pts[0][0].toFixed(2)} ${baseY.toFixed(2)} Z`;
ui.area.setAttribute('d', dArea);
const step = (N >= 24) ? 3 : Math.max(1, Math.round(N / 8));
const gridFrag = document.createDocumentFragment();
for (let i = 0; i < N; i += step) {
const x = padX + (i * (W - padX * 2)) / Math.max(1, N - 1);
const line = document.createElementNS('http://www.w3.org/2000/svg', 'line');
line.setAttribute('x1', x.toFixed(2));
line.setAttribute('x2', x.toFixed(2));
line.setAttribute('y1', String(padY));
line.setAttribute('y2', String(H - padY));
line.setAttribute('stroke', 'rgba(255,255,255,0.10)');
line.setAttribute('stroke-width', '2');
gridFrag.appendChild(line);
}
ui.grid.appendChild(gridFrag);
const dotsFrag = document.createDocumentFragment();
for (let i = 0; i < pts.length; i++) {
const c = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
c.setAttribute('cx', pts[i][0].toFixed(2));
c.setAttribute('cy', pts[i][1].toFixed(2));
c.setAttribute('r', (i % step === 0) ? '5' : '3.5');
c.setAttribute('fill', 'rgba(255,255,255,0.92)');
c.setAttribute('opacity', (i % step === 0) ? '0.55' : '0.25');
dotsFrag.appendChild(c);
}
ui.dots.appendChild(dotsFrag);
ui.axisMin.textContent = formatTemp(tMin, { withUnit: true, decimals: 0 });
ui.axisMax.textContent = formatTemp(tMax, { withUnit: true, decimals: 0 });
}
function updateRangeBar(dayMin, dayMax, hourMin, hourMax) {
if (!isFiniteNumber(dayMin) || !isFiniteNumber(dayMax) || !isFiniteNumber(hourMin) || !isFiniteNumber(hourMax)) {
ui.rangeFill.style.width = '0%';
ui.rangeFill.style.transform = 'translateX(0%)';
return;
}
const span = Math.max(1, hourMax - hourMin);
const left = ((dayMin - hourMin) / span) * 100;
const right = ((dayMax - hourMin) / span) * 100;
const w = clamp(right - left, 0, 100);
const x = clamp(left, 0, 100);
ui.rangeFill.style.width = `${w}%`;
ui.rangeFill.style.transform = `translateX(${x}%)`;
}
async function load() {
const params = new URLSearchParams(window.location.search);
const lat = clamp(parseNumber(params.get('lat'), 52.52), -90, 90);
const lon = clamp(parseNumber(params.get('lon'), 13.405), -180, 180);
const loc = safeText(params.get('name'), 'Berlin');
let date = safeText(params.get('date'), utcTodayISO());
if (!isValidISODate(date)) date = utcTodayISO();
const endpoint = endpointForDate(date);
const url = buildApiURL(endpoint, lat, lon, date);
ui.locName.textContent = loc;
ui.subtitle.textContent = `${formatDateLong(date)} · UTC`;
ui.metaLine.textContent = `Lat ${lat.toFixed(4)} · Lon ${lon.toFixed(4)}`;
ui.badgeSource.textContent = endpoint.endsWith('archive') ? 'Archive' : 'Forecast';
ui.footLeft.textContent = `${formatDateShort(date)} · ${loc} · ${lat.toFixed(2)}, ${lon.toFixed(2)}`;
setOverlay('loading', 'Loading weather…', 'Fetching data for the requested date.', `${date} · ${lat.toFixed(4)}, ${lon.toFixed(4)}`);
const ctrl = new AbortController();
const timeout = setTimeout(() => ctrl.abort(), 12000);
try {
const res = await fetch(url, { method: 'GET', headers: { 'accept': 'application/json' }, signal: ctrl.signal });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
const daily = data && data.daily;
const hourly = data && data.hourly;
if (!daily || !hourly) throw new Error('Malformed response');
const dailyTime = Array.isArray(daily.time) ? daily.time : [];
const idx = dailyTime.indexOf(date);
if (idx < 0) throw new Error('Daily data missing requested date');
const dayMax = Number(Array.isArray(daily.temperature_2m_max) ? daily.temperature_2m_max[idx] : NaN);
const dayMin = Number(Array.isArray(daily.temperature_2m_min) ? daily.temperature_2m_min[idx] : NaN);
const code = Number(Array.isArray(daily.weather_code) ? daily.weather_code[idx] : NaN);
if (!isFiniteNumber(dayMax) || !isFiniteNumber(dayMin)) throw new Error('Missing daily temperatures');
const meta = weatherMeta(code);
setTheme(meta);
ui.wxIcon.innerHTML = iconSVG(meta.kind);
ui.conditionLabel.textContent = meta.label;
ui.conditionDetail.textContent = meta.detail;
ui.tempMax.textContent = formatTemp(dayMax, { withUnit: true, decimals: 0 });
ui.tempMin.textContent = formatTemp(dayMin, { withUnit: true, decimals: 0 });
ui.rangeMin.textContent = `Min ${formatTemp(dayMin, { withUnit: true, decimals: 0 })}`;
ui.rangeMax.textContent = `Max ${formatTemp(dayMax, { withUnit: true, decimals: 0 })}`;
const times = Array.isArray(hourly.time) ? hourly.time : [];
const temps = Array.isArray(hourly.temperature_2m) ? hourly.temperature_2m : [];
const filtered = [];
for (let k = 0; k < Math.min(times.length, temps.length); k++) {
const t = times[k];
if (typeof t === 'string' && t.startsWith(date)) {
const tempVal = temps[k];
const temp = (tempVal == null) ? NaN : Number(tempVal);
filtered.push({ time: t, hour: hourFromTimeStr(t), temp });
}
}
if (!filtered.length) throw new Error('No hourly data for date');
let hMin = Infinity, hMax = -Infinity;
for (const h of filtered) {
if (isFiniteNumber(h.temp)) {
hMin = Math.min(hMin, h.temp);
hMax = Math.max(hMax, h.temp);
}
}
if (!isFiniteNumber(hMin) || !isFiniteNumber(hMax)) throw new Error('Hourly temperatures unavailable');
const hSpan = hMax - hMin;
const eps = Math.max(0.01, hSpan * 0.02);
for (const h of filtered) {
h.isExtrema = isFiniteNumber(h.temp) && (Math.abs(h.temp - hMin) <= eps || Math.abs(h.temp - hMax) <= eps);
}
ui.hourlySub.textContent = `${filtered.length} points · ${formatTemp(hMin, { withUnit: true, decimals: 0 })} to ${formatTemp(hMax, { withUnit: true, decimals: 0 })}`;
renderChart(filtered.map(x => x.temp));
renderHourlyScroller(filtered);
updateRangeBar(dayMin, dayMax, hMin, hMax);
hideOverlay();
ui.card.setAttribute('data-state', 'ready');
} catch (err) {
const msg = (err && err.name === 'AbortError')
? 'Request timed out.'
: (err && err.message ? err.message : 'Unknown error.');
setOverlay('error', "Weather data couldn't be loaded", 'Please check the parameters and try again.', msg);
ui.conditionLabel.textContent = "Weather data couldn't be loaded";
ui.conditionDetail.textContent = msg;
ui.tempMax.textContent = '—';
ui.tempMin.textContent = '—';
ui.rangeMin.textContent = '—';
ui.rangeMax.textContent = '—';
ui.hourlySub.textContent = '—';
ui.axisMin.textContent = '—';
ui.axisMax.textContent = '—';
ui.hourlyScroller.innerHTML = '';
ui.grid.innerHTML = '';
ui.dots.innerHTML = '';
ui.area.setAttribute('d', '');
ui.line.setAttribute('d', '');
ui.rangeFill.style.width = '0%';
ui.rangeFill.style.transform = 'translateX(0%)';
} finally {
clearTimeout(timeout);
}
}
ui.reloadBtn.addEventListener('click', () => window.location.reload());
ui.retryBtn.addEventListener('click', () => window.location.reload());
load();
})();
</script>
</body>
</html>L1 —— 廉价的确定性描述量
| bytes 总计 | 44,987 | html / css / js | 5,606 / 18,042 / 21,339 |
|---|---|---|---|
| dom 节点 | 81 | dom 深度 | 9 |
| css 规则 | 87 | 含 js | 是 |
| brightness | 44.2 | contrast | 27.3 |
| colorfulness | 27.2 | 留白 | 56.5% |
该 slot 的 telemetry
| prompt tokens | 14,177 | completion tokens | 36,869 |
|---|---|---|---|
| total tokens | 51,046 | wall | 525.8 s |
| cost | — | request id | — |
config.json565 B
{
"N": 2,
"auth": {
"credential_ref": "WCB_NONE",
"method": "oauth-login"
},
"billing": "plan",
"config_id": "gpt-5.2-eff-xhigh--cli--cursor-xl--dev",
"effort": "xhigh",
"family": "gpt",
"m": {
"min": 2,
"q": 2
},
"model_id": "gpt-5.2",
"protocol": "cli",
"served_model": "gpt-5.2-xhigh",
"telemetry": {
"completion_tokens": 104492,
"cost_usd": null,
"prompt_tokens": 48128,
"total_tokens": 152620,
"wall_ms": 2051890
},
"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.2-eff-xhigh--cli--cursor-xl--dev",
"positions": [
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-08-13T15:53:37.187489+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-13T15:44:51.402892+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-13T16:09:18.610882+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-13T15:53:42.092690+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-13T16:12:33.879859+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-13T16:09:22.523840+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-13T16:19:15.620390+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-13T16:12:37.427445+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
}
}
}