gpt-5-mini · cursor

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

截图是 similarity 通道测量时的原始像素。运行 live 会在 sandboxed iframe 中重新执行原始输出;渲染结果取决于你的浏览器和字体,不保证与测量像素一致。

similarity 邻居本 session 没有 similarity 数据 —— 这个 batch 没有计算 pairs。

Fidelity —— 卡片展示的数据对不对?

  • namematch
  • conditionmatch
  • datematch
  • max tempambiguousinsufficient-distinct-temperature-nodes
  • min tempambiguousinsufficient-distinct-temperature-nodes
  • 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,initial-scale=1" />
<title>Weather Card</title>
<style>
  :root{
    --bg1:#0f1724; --bg2:#071028;
    --card:#0b1220; --muted:#9aa7b3; --accent:#63b3ff;
    --glass: rgba(255,255,255,0.03);
    --soft-shadow: 0 10px 30px rgba(2,6,23,0.6);
    --radius:18px;
    --glass-border: rgba(255,255,255,0.04);
  }
  html,body{height:100%;margin:0;font-family:Inter, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial; background:linear-gradient(180deg,var(--bg1),var(--bg2)); color:#e6eef6;}
  .stage{width:1280px;height:800px;margin:28px auto;display:flex;align-items:center;justify-content:center}
  .card{
    width:1050px; max-width:95%; background:linear-gradient(180deg, rgba(255,255,255,0.02), rgba(255,255,255,0.01));
    border-radius:var(--radius); box-shadow:var(--soft-shadow); padding:28px; display:grid; grid-template-columns:360px 1fr; gap:28px; border:1px solid var(--glass-border);
    backdrop-filter: blur(6px) saturate(120%); position:relative; overflow:hidden;
  }
  .brand {
    position:absolute; right:18px; top:18px; font-size:12px; color:var(--muted);
    display:flex; gap:8px; align-items:center; opacity:0.9;
  }
  .left {
    display:flex; flex-direction:column; gap:20px; align-items:center; justify-content:flex-start; padding:10px 6px;
  }
  .place { text-align:center; }
  .place h1{margin:0;font-size:22px;letter-spacing:-0.2px}
  .place p{margin:6px 0 0;font-size:13px;color:var(--muted)}
  .big-temp{
    margin-top:6px; display:flex; align-items:center; gap:14px;
  }
  .icon-wrap{width:92px;height:92px;background:linear-gradient(180deg, rgba(255,255,255,0.02), rgba(255,255,255,0.01)); border-radius:16px; display:flex; align-items:center; justify-content:center; box-shadow:inset 0 -6px 18px rgba(0,0,0,0.35);}
  .temp-value{font-size:44px;font-weight:600}
  .minmax{display:flex; gap:12px; color:var(--muted); font-size:14px; margin-top:8px;}
  .condition { margin-top:6px; font-size:15px; color:#d8eefc; opacity:0.95}
  .sunline{height:1px;background:linear-gradient(90deg, transparent, rgba(255,255,255,0.03), transparent); width:100%; margin-top:12px; border-radius:2px}
  .right { display:flex; flex-direction:column; gap:16px; padding:6px 2px; }
  .meta-row{display:flex; align-items:center; justify-content:space-between; gap:12px}
  .date { font-weight:600; color:#dff2ff; letter-spacing:0.2px }
  .source { font-size:13px; color:var(--muted) }
  .chart-card{ background:linear-gradient(180deg, rgba(255,255,255,0.012), rgba(255,255,255,0.01)); border-radius:12px; padding:12px; display:flex; gap:10px; align-items:center; justify-content:flex-start; border:1px solid var(--glass-border);}
  .svg-wrap{flex:1; min-width:360px; height:190px; display:flex; align-items:center; justify-content:center; position:relative}
  .svg-wrap svg { width:100%; height:100%; overflow:visible; }
  .y-labels{width:52px; color:var(--muted); font-size:13px; display:flex; flex-direction:column; justify-content:space-between; align-items:flex-end; padding:6px 0;}
  .hour-list{display:flex; gap:8px; overflow:auto; padding:10px 6px 6px; scrollbar-width:none}
  .hour-item{min-width:88px;background:var(--glass); border-radius:10px; padding:8px; color:#cfe9ff; font-size:13px; display:flex; flex-direction:column; align-items:center; gap:6px; border:1px solid rgba(255,255,255,0.02);}
  .hour-item .hr{font-size:12px;color:var(--muted)}
  .hour-item .t{font-weight:600;font-size:16px}
  .empty { text-align:center; color:var(--muted); padding:40px 20px; font-size:15px }
  .spinner{width:46px;height:46px;border-radius:50%;border:4px solid rgba(255,255,255,0.06); border-top-color:var(--accent); animation:spin 1s linear infinite; margin:22px auto}
  @keyframes spin{to{transform:rotate(360deg)}}
  .error{background:linear-gradient(180deg, rgba(255,58,58,0.06), rgba(255,58,58,0.02)); color:#ffdede; padding:18px;border-radius:12px;border:1px solid rgba(255,58,58,0.12)}
  .footer{margin-top:auto; font-size:12px; color:var(--muted); display:flex; justify-content:space-between; gap:12px}
  /* responsive-ish for the fixed canvas */
  @media (max-width:1100px){
    .card{grid-template-columns:1fr; width:92%}
    .left{flex-direction:row; justify-content:space-between}
    .svg-wrap{height:170px}
  }
</style>
</head>
<body>
<div class="stage">
  <div class="card" role="region" aria-label="Weather card">
    <div class="brand">Weather • Local API</div>

    <section class="left" id="left">
      <div class="place">
        <h1 id="placeName">—</h1>
        <p id="placeCoords">lat — lon —</p>
      </div>

      <div class="big-temp" id="summary">
        <div class="icon-wrap" id="iconWrap" aria-hidden="true">
          <!-- svg icon inserted here -->
        </div>
        <div style="display:flex;flex-direction:column;align-items:flex-start;">
          <div class="temp-value" id="mainTemp">—°</div>
          <div class="condition" id="conditionLabel">—</div>
          <div class="minmax" id="minmax"> <span id="tmax">Max —°</span> <span id="tmin">Min —°</span> </div>
        </div>
      </div>

      <div class="sunline" aria-hidden="true"></div>

      <div style="width:100%; text-align:center;">
        <div id="loader" class="spinner" style="display:none" role="status" aria-label="loading"></div>
        <div id="errorMsg" class="error" style="display:none"></div>
      </div>
    </section>

    <section class="right" id="right">
      <div class="meta-row">
        <div>
          <div class="date" id="dateLabel">—</div>
          <div class="source" id="sourceLabel">Data source: /api/om/forecast</div>
        </div>
        <div style="text-align:right;">
          <div style="font-weight:700; color:var(--muted); font-size:13px;">Hourly overview</div>
          <div style="color:var(--muted); font-size:12px;">Temperatures (°C) — UTC</div>
        </div>
      </div>

      <div class="chart-card" id="chartCard" aria-hidden="false">
        <div class="y-labels" id="yLabels">
          <div id="yTop">—°</div>
          <div id="yMid">—°</div>
          <div id="yBot">—°</div>
        </div>
        <div class="svg-wrap" id="svgWrap" aria-hidden="false">
          <!-- SVG chart inserted here -->
        </div>
      </div>

      <div style="display:flex; flex-direction:column; gap:8px;">
        <div style="display:flex; justify-content:space-between; align-items:center;">
          <div style="font-weight:700">Hourly temperatures</div>
          <div style="color:var(--muted); font-size:13px" id="hoursCount">—</div>
        </div>
        <div class="hour-list" id="hourList" aria-live="polite">
          <!-- hour items -->
        </div>
      </div>

      <div class="footer">
        <div id="notice" style="color:var(--muted)">Showing weather for the chosen date</div>
        <div id="attribution" style="color:var(--muted)">Open-Meteo compatible</div>
      </div>
    </section>
  </div>
</div>

<script>
(() => {
  // Utilities
  const qs = new URLSearchParams(location.search);
  const toFloat = v => Number.parseFloat(v);
  const clamp = (v,min,max)=>Math.min(max,Math.max(min,v));

  // Defaults
  const defaultLat = 52.52, defaultLon = 13.405, defaultName = 'Berlin';
  function utcTodayString(){
    const d = new Date();
    const y = d.getUTCFullYear(), m = String(d.getUTCMonth()+1).padStart(2,'0'), day = String(d.getUTCDate()).padStart(2,'0');
    return `${y}-${m}-${day}`;
  }

  const lat = qs.get('lat') ?? qs.get('latitude') ?? defaultLat;
  const lon = qs.get('lon') ?? qs.get('longitude') ?? defaultLon;
  const name = qs.get('name') ?? defaultName;
  const dateParam = qs.get('date') ?? utcTodayString();
  const requestedDate = (() => { const s = dateParam; if(!/^\d{4}-\d{2}-\d{2}$/.test(s)) return utcTodayString(); return s; })();

  // elements
  const placeNameEl = document.getElementById('placeName');
  const placeCoordsEl = document.getElementById('placeCoords');
  const mainTempEl = document.getElementById('mainTemp');
  const tmaxEl = document.getElementById('tmax');
  const tminEl = document.getElementById('tmin');
  const conditionEl = document.getElementById('conditionLabel');
  const iconWrap = document.getElementById('iconWrap');
  const dateLabel = document.getElementById('dateLabel');
  const sourceLabel = document.getElementById('sourceLabel');
  const svgWrap = document.getElementById('svgWrap');
  const hourList = document.getElementById('hourList');
  const hoursCount = document.getElementById('hoursCount');
  const yTop = document.getElementById('yTop');
  const yMid = document.getElementById('yMid');
  const yBot = document.getElementById('yBot');
  const loader = document.getElementById('loader');
  const errorMsg = document.getElementById('errorMsg');

  // Weather code mapping (Open-Meteo)
  function weatherMap(code){
    // returns {label, iconSvg}
    if(code === 0) return {label:'Clear sky', icon:svgSun()};
    if(code === 1) return {label:'Mainly clear', icon:svgSunCloud()};
    if(code === 2) return {label:'Partly cloudy', icon:svgPartly()};
    if(code === 3) return {label:'Overcast', icon:svgCloud()};
    if(code === 45 || code === 48) return {label:'Fog', icon:svgFog()};
    if([51,53,55].includes(code)) return {label:'Drizzle', icon:svgRain()};
    if([61,63,65,66,67].includes(code)) return {label:'Rain', icon:svgRain()};
    if([71,73,75,77,85,86].includes(code)) return {label:'Snow', icon:svgSnow()};
    if([80,81,82].includes(code)) return {label:'Showers', icon:svgRain()};
    if([95,96,99].includes(code)) return {label:'Thunderstorm', icon:svgStorm()};
    return {label:'Unknown', icon:svgCloud()};
  }

  // SVG icon helpers
  function svgWrapRaw(inner){
    return `<svg viewBox="0 0 64 64" width="72" height="72" fill="none" xmlns="http://www.w3.org/2000/svg">${inner}</svg>`;
  }
  function svgSun(){
    return svgWrapRaw(`<circle cx="32" cy="28" r="10" fill="#FFD166" /><g stroke="#FFD166" stroke-width="2" stroke-linecap="round">${sunRays()}</g>`);
  }
  function sunRays(){
    const rays = [0,45,90,135,180,225,270,315].map(a=>{
      const r = Math.PI*a/180;
      const x1 = 32 + Math.cos(r)*18, y1 = 28 + Math.sin(r)*18;
      const x2 = 32 + Math.cos(r)*26, y2 = 28 + Math.sin(r)*26;
      return `<line x1="${x1}" y1="${y1}" x2="${x2}" y2="${y2}" />`;
    }).join('');
    return rays;
  }
  function svgCloud(){ return svgWrapRaw(`
    <g fill="#E6F3FF" opacity="0.95">
      <ellipse cx="40" cy="34" rx="16" ry="10"/>
      <ellipse cx="26" cy="34" rx="12" ry="8"/>
    </g>`); }
  function svgSunCloud(){ return svgWrapRaw(`
    <g><circle cx="18" cy="14" r="8" fill="#FFD166" opacity="0.95"/></g>
    <g fill="#E6F3FF" opacity="0.95"><ellipse cx="42" cy="36" rx="16" ry="10"/><ellipse cx="28" cy="36" rx="12" ry="8"/></g>`); }
  function svgPartly(){ return svgWrapRaw(`
    <g><circle cx="18" cy="14" r="6" fill="#FFD166" opacity="0.95"/></g>
    <g fill="#D9EEF9" opacity="0.95" transform="translate(8,8)"><ellipse cx="30" cy="22" rx="18" ry="11"/></g>`); }
  function svgRain(){ return svgWrapRaw(`
    <g fill="#E6F3FF"><ellipse cx="36" cy="28" rx="18" ry="10"/><ellipse cx="22" cy="28" rx="12" ry="8"/></g>
    <g fill="#9FD0FF"><path d="M22 40c0 2.8-3 5-3 5s-3-2.2-3-5c0-2.8 2.2-5 3-5s3 2.2 3 5zM32 40c0 2.8-3 5-3 5s-3-2.2-3-5c0-2.8 2.2-5 3-5s3 2.2 3 5zM42 40c0 2.8-3 5-3 5s-3-2.2-3-5c0-2.8 2.2-5 3-5s3 2.2 3 5z"/></g>`); }
  function svgSnow(){ return svgWrapRaw(`
    <g fill="#E6F3FF"><ellipse cx="36" cy="28" rx="18" ry="10"/><ellipse cx="22" cy="28" rx="12" ry="8"/></g>
    <g stroke="#BCE7FF" stroke-width="2" stroke-linecap="round"><line x1="22" y1="40" x2="22" y2="46"/><line x1="19" y1="43" x2="25" y2="43"/></g>`); }
  function svgStorm(){ return svgWrapRaw(`
    <g fill="#E6F3FF"><ellipse cx="34" cy="28" rx="18" ry="10"/><ellipse cx="20" cy="28" rx="12" ry="8"/></g>
    <path d="M30 36 L24 48 L34 44 L30 56" fill="#FFD166" stroke="#FFD166" stroke-linejoin="round"/>`); }
  function svgFog(){ return svgWrapRaw(`<g fill="#E6F3FF" opacity="0.85"><ellipse cx="32" cy="30" rx="20" ry="9"/></g><rect x="10" y="38" width="44" height="3" rx="1" fill="#CFE9FF" opacity="0.55"/><rect x="8" y="44" width="46" height="3" rx="1" fill="#CFE9FF" opacity="0.45"/>`); }

  // Chart rendering
  function drawChart(times, temps){
    // times: array of ISO strings, temps: numbers
    svgWrap.innerHTML = '';
    if(!temps.length) return svgWrap.innerHTML = '<div class="empty">No hourly data</div>';
    // compute bounds
    const min = Math.min(...temps), max = Math.max(...temps);
    const pad = Math.max(1, Math.round((max - min)*0.12));
    const top = max + pad, bot = min - pad;
    yTop.textContent = `${Math.round(top)}°`;
    yMid.textContent = `${Math.round((top+bot)/2)}°`;
    yBot.textContent = `${Math.round(bot)}°`;

    const w = svgWrap.clientWidth - 8, h = svgWrap.clientHeight - 10;
    const leftPad = 10, rightPad = 10, topPad = 10, bottomPad = 18;
    const innerW = Math.max(100, w - leftPad - rightPad), innerH = Math.max(60, h - topPad - bottomPad);

    // normalize points
    const n = temps.length;
    const stepX = innerW / Math.max(1, n-1);
    const points = temps.map((t,i)=>{
      const x = leftPad + (i*stepX);
      const y = topPad + ((top - t) / (top - bot)) * innerH;
      return {x,y,t,i};
    });

    // create svg
    const svgns = 'http://www.w3.org/2000/svg';
    const svg = document.createElementNS(svgns,'svg');
    svg.setAttribute('width','100%');
    svg.setAttribute('height','100%');
    svg.setAttribute('viewBox',`0 0 ${w} ${h}`);
    svg.setAttribute('preserveAspectRatio','none');

    // defs gradient
    const defs = document.createElementNS(svgns,'defs');
    defs.innerHTML = `
      <linearGradient id="g1" x1="0" y1="0" x2="0" y2="1">
        <stop offset="0%" stop-color="#63b3ff" stop-opacity="0.18"/>
        <stop offset="100%" stop-color="#63b3ff" stop-opacity="0.02"/>
      </linearGradient>
      <filter id="blurEdge" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur in="SourceGraphic" stdDeviation="6"/></filter>
    `;
    svg.appendChild(defs);

    // area path
    const areaD = [];
    points.forEach((p,i)=>{
      areaD.push((i===0?'M':'L') + p.x + ' ' + p.y);
    });
    const areaPath = document.createElementNS(svgns,'path');
    const last = points[points.length-1];
    areaPath.setAttribute('d', areaD.join(' ') + ` L ${last.x} ${topPad+innerH} L ${points[0].x} ${topPad+innerH} Z`);
    areaPath.setAttribute('fill','url(#g1)');
    svg.appendChild(areaPath);

    // line path
    const line = document.createElementNS(svgns,'path');
    line.setAttribute('d', points.map((p,i)=> (i===0?'M':'L') + p.x + ' ' + p.y).join(' '));
    line.setAttribute('stroke','#63b3ff');
    line.setAttribute('stroke-width','2.4');
    line.setAttribute('fill','none');
    line.setAttribute('stroke-linejoin','round');
    line.setAttribute('stroke-linecap','round');
    svg.appendChild(line);

    // area soft glow
    const glow = document.createElementNS(svgns,'path');
    glow.setAttribute('d', line.getAttribute('d'));
    glow.setAttribute('stroke','#63b3ff');
    glow.setAttribute('stroke-width','10');
    glow.setAttribute('stroke-opacity','0.08');
    glow.setAttribute('fill','none');
    glow.setAttribute('filter','url(#blurEdge)');
    svg.appendChild(glow);

    // point circles & interactive tooltip
    const tooltip = document.createElement('div');
    tooltip.style.position='absolute';
    tooltip.style.pointerEvents='none';
    tooltip.style.background='linear-gradient(180deg,#0b1726,#071122)';
    tooltip.style.border='1px solid rgba(255,255,255,0.04)';
    tooltip.style.padding='8px 10px';
    tooltip.style.borderRadius='8px';
    tooltip.style.color='#eaffff';
    tooltip.style.fontSize='13px';
    tooltip.style.display='none';
    tooltip.style.transform='translate(-50%, -120%)';
    tooltip.style.whiteSpace='nowrap';
    svgWrap.appendChild(tooltip);

    points.forEach(p=>{
      const c = document.createElementNS(svgns,'circle');
      c.setAttribute('cx',p.x);
      c.setAttribute('cy',p.y);
      c.setAttribute('r',3.6);
      c.setAttribute('fill','#eaffff');
      c.setAttribute('opacity',0.96);
      svg.appendChild(c);

      // invisible hit area
      const hit = document.createElementNS(svgns,'circle');
      hit.setAttribute('cx',p.x);
      hit.setAttribute('cy',p.y);
      hit.setAttribute('r',12);
      hit.setAttribute('fill','transparent');
      hit.style.cursor='pointer';
      hit.addEventListener('mouseenter', (ev)=>{
        const hour = new Date(times[p.i]).toISOString().slice(11,16);
        tooltip.innerHTML = `<strong>${Math.round(p.t)}°C</strong> — ${hour} UTC`;
        tooltip.style.left = (p.x / w * svgWrap.clientWidth) + 'px';
        tooltip.style.top = (p.y / h * svgWrap.clientHeight) + 'px';
        tooltip.style.display='block';
      });
      hit.addEventListener('mouseleave', ()=> tooltip.style.display='none');
      svg.appendChild(hit);
    });

    svgWrap.appendChild(svg);
  }

  // Fill hour list
  function populateHourList(times, temps){
    hourList.innerHTML = '';
    if(!times.length) { hourList.innerHTML = '<div class="empty">No hourly data for this date.</div>'; hoursCount.textContent = '0 hours'; return; }
    hoursCount.textContent = `${times.length} hour${times.length>1?'s':''}`;
    times.forEach((t,i)=>{
      const dt = new Date(t);
      const hh = dt.toISOString().slice(11,16);
      const item = document.createElement('div');
      item.className = 'hour-item';
      item.innerHTML = `<div class="hr">${hh}</div><div class="t">${Math.round(temps[i])}°</div><div style="font-size:12px;color:var(--muted)">${formatTrend(temps,i)}</div>`;
      hourList.appendChild(item);
    });
  }
  function formatTrend(temps,i){
    if(i===0) return '—';
    const d = Math.round(temps[i] - temps[i-1]);
    return d>0?`+${d}° vs prev`:`${d}° vs prev`;
  }

  // Orchestrator
  async function load(){
    placeNameEl.textContent = name;
    placeCoordsEl.textContent = `lat ${parseFloat(lat).toFixed(3)} · lon ${parseFloat(lon).toFixed(3)}`;
    dateLabel.textContent = (new Date(requestedDate + 'T00:00:00Z')).toISOString().slice(0,10);

    // choose endpoint (archive for past dates)
    const todayUTC = utcTodayString();
    const useArchive = requestedDate < todayUTC;
    const endpoint = useArchive ? '/api/om/archive' : '/api/om/forecast';
    sourceLabel.textContent = `Data source: ${endpoint}`;

    const params = new URLSearchParams({
      latitude: lat,
      longitude: lon,
      daily: 'temperature_2m_max,temperature_2m_min,weather_code',
      hourly: 'temperature_2m',
      timezone: 'UTC',
      temperature_unit: 'celsius',
      start_date: requestedDate,
      end_date: requestedDate
    });

    const url = `${endpoint}?${params.toString()}`;

    // show loader
    loader.style.display = 'block';
    errorMsg.style.display = 'none';

    try {
      const res = await fetch(url, {cache:'no-store'});
      if(!res.ok) throw new Error('Network error: ' + res.status + ' ' + res.statusText);
      const json = await res.json();

      // validate presence
      const d = json.daily;
      const h = json.hourly;
      if(!d || !h) throw new Error('Malformed API response');

      // daily arrays should be single element
      const tmax = Array.isArray(d.temperature_2m_max)? d.temperature_2m_max[0] : null;
      const tmin = Array.isArray(d.temperature_2m_min)? d.temperature_2m_min[0] : null;
      const wcode = Array.isArray(d.weather_code)? d.weather_code[0] : null;

      // hourly arrays: may include many times; filter those that start with requestedDate
      const times = Array.isArray(h.time)? h.time.filter(ts => ts.startsWith(requestedDate)) : [];
      const temps = Array.isArray(h.temperature_2m)? h.temperature_2m.filter((_,i)=> String(h.time[i]).startsWith(requestedDate)) : [];

      if(tmax==null || tmin==null || wcode==null || !times.length){
        // allow partial: if hourly missing but daily exists, still show daily
        if(tmax==null || tmin==null){
          throw new Error('Incomplete data for this date');
        }
      }

      // Update UI
      loader.style.display = 'none';
      mainTempEl.textContent = `${Math.round((tmax+tmin)/2)}°`;
      tmaxEl.textContent = `Max ${Math.round(tmax)}°`;
      tminEl.textContent = `Min ${Math.round(tmin)}°`;
      const wc = weatherMap(Number(wcode));
      conditionEl.textContent = wc.label;
      iconWrap.innerHTML = wc.icon;

      // Chart and list
      drawChart(times, temps);
      populateHourList(times, temps);
      errorMsg.style.display = 'none';
    } catch(err){
      loader.style.display = 'none';
      errorMsg.style.display = 'block';
      errorMsg.textContent = 'Could not load weather data — ' + (err.message || 'Unknown error');
      // clear main visual data
      mainTempEl.textContent = '—°';
      tmaxEl.textContent = `Max —°`;
      tminEl.textContent = `Min —°`;
      conditionEl.textContent = '—';
      iconWrap.innerHTML = svgCloud();
      svgWrap.innerHTML = '<div class="empty">Data unavailable</div>';
      hourList.innerHTML = '';
      yTop.textContent = '—°';
      yMid.textContent = '—°';
      yBot.textContent = '—°';
    }
  }

  // Kick off
  load();

})();
</script>
</body>
</html>

L1 —— 廉价的确定性描述量

bytes 总计21,484html / css / js2,889 / 4,207 / 14,388
dom 节点49dom 深度9
css 规则37含 js
brightness23.9contrast13.2
colorfulness12.7留白96.1%

该 slot 的 telemetry

prompt tokens16,848completion tokens7,153
total tokens24,001wall82.5 s
costrequest id
config.json549 B
{
  "N": 2,
  "auth": {
    "credential_ref": "WCB_NONE",
    "method": "oauth-login"
  },
  "billing": "plan",
  "config_id": "gpt-5-mini--cli--cursor--dev",
  "effort": null,
  "family": "gpt",
  "m": {
    "min": 2,
    "q": 2
  },
  "model_id": "gpt-5-mini",
  "protocol": "cli",
  "served_model": "gpt-5-mini",
  "telemetry": {
    "completion_tokens": 26336,
    "cost_usd": null,
    "prompt_tokens": 53561,
    "total_tokens": 79897,
    "wall_ms": 332203
  },
  "transport": "cursor-agent-cli-isolated-home",
  "vendor_sanction_ref": null
}
send-log2.5 KB
{
  "N": 2,
  "batch_id": "2026-08-13--cursor-s0",
  "config_id": "gpt-5-mini--cli--cursor--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-08-13T01:31:50.916805+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T01:30:28.424140+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-13T01:33:10.001965+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T01:31:53.704267+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-13T01:34:22.326514+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T01:33:15.603927+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-13T01:36:11.641461+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T01:34:24.949231+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
    }
  }
}