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
gpt-5.2 @xhigh · cursor-xl P-q slot 0 截图

截图是 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,987html / css / js5,606 / 18,042 / 21,339
dom 节点81dom 深度9
css 规则87含 js
brightness44.2contrast27.3
colorfulness27.2留白56.5%

该 slot 的 telemetry

prompt tokens14,177completion tokens36,869
total tokens51,046wall525.8 s
costrequest 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
    }
  }
}