claude-fable-5 @ max · CC

CCmax
config
claude-fable-5-eff-max--cli--claude-code--dev
batch
2026-07-19--unified
transport
claude-code-cli-headless
protocol
cli · plan
served model
claude-fable-5
采集于
2026年7月18日 11:54 · N=2
variant
live
slot 0 · P-q · sandboxed iframe
claude-fable-5 @max · CC P-q slot 0 截图

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

similarity 邻居

限于 session 2026-07-19--unified

similarity 衡量本 session 内的趋同程度 —— 不是质量。

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

  • namematch
  • conditionmatch
  • datematch
  • max tempmatch展示值:25.3
  • min tempmatch展示值:16
  • hourlyambiguouscoverage · 0 命中 · 0 不符 · 24 未展示
  • request sidematch0 处违规

extractor fidelity-extractor-v1+Berlin-2026-07-15

源码 —— 原始模型输出,一字节未改

下载 card.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Weather</title>
<style>
  *{margin:0;padding:0;box-sizing:border-box}
  [hidden]{display:none!important}
  :root{color-scheme:light}
  html,body{height:100%}
  body{
    --bg1:#8FB6DE; --bg2:#E6EEF6;
    --glow1:rgba(255,255,255,.55); --glow2:rgba(70,120,200,.28);
    --accent:#2E90FA; --accent-deep:#1B6ED6;
    --ink:#15243C; --muted:#5F7089; --muted-2:#8593A9;
    --hairline:rgba(22,44,80,.08);
    font-family:-apple-system,BlinkMacSystemFont,"SF Pro Display","Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
    color:var(--ink);
    background:linear-gradient(165deg,#8FB6DE,#E6EEF6);
    min-height:100vh; display:grid; place-items:center; padding:24px; overflow:auto;
    -webkit-font-smoothing:antialiased;
  }
  body[data-theme=clear]  {--bg1:#5BB2EE;--bg2:#FBE7B4;--accent:#F59E0B;--accent-deep:#B96F06;--glow1:rgba(255,235,170,.7);--glow2:rgba(255,180,70,.35)}
  body[data-theme=partly] {--bg1:#6FABE0;--bg2:#DDEAF6;--accent:#2E90FA;--accent-deep:#1B6ED6}
  body[data-theme=cloud]  {--bg1:#8C9FB8;--bg2:#E0E7EE;--accent:#5B7C9E;--accent-deep:#46617D;--glow2:rgba(90,120,160,.3)}
  body[data-theme=fog]    {--bg1:#A9B5C1;--bg2:#E9EDF1;--accent:#78899A;--accent-deep:#5A6B7C;--glow2:rgba(120,140,160,.3)}
  body[data-theme=rain]   {--bg1:#4E6E9E;--bg2:#A9C0DC;--accent:#2563EB;--accent-deep:#1D4FBF;--glow2:rgba(40,80,160,.35)}
  body[data-theme=snow]   {--bg1:#9FC2E4;--bg2:#F1F6FC;--accent:#4E9AD9;--accent-deep:#2F7CBF;--glow1:rgba(255,255,255,.8)}
  body[data-theme=thunder]{--bg1:#454273;--bg2:#9D90CC;--accent:#6D4AE0;--accent-deep:#5535C4;--glow2:rgba(90,60,180,.4)}

  #bgTheme{position:fixed;inset:0;z-index:-1;opacity:0;transition:opacity 1.1s ease;
    background:linear-gradient(165deg,var(--bg1) 0%,var(--bg2) 100%)}
  #bgTheme.on{opacity:1}
  #bgTheme::before,#bgTheme::after{content:"";position:absolute;border-radius:50%;filter:blur(14px)}
  #bgTheme::before{width:560px;height:560px;top:-170px;left:6%;background:radial-gradient(circle,var(--glow1),transparent 70%)}
  #bgTheme::after{width:640px;height:640px;bottom:-220px;right:4%;background:radial-gradient(circle,var(--glow2),transparent 70%)}

  .card{
    width:1128px; max-width:calc(100vw - 40px);
    background:rgba(255,255,255,.78);
    -webkit-backdrop-filter:blur(28px) saturate(1.35); backdrop-filter:blur(28px) saturate(1.35);
    border:1px solid rgba(255,255,255,.7);
    border-radius:30px;
    box-shadow:0 44px 90px -30px rgba(12,32,66,.4), 0 4px 18px rgba(12,32,66,.08);
    padding:30px 44px 22px;
    animation:rise .7s cubic-bezier(.2,.7,.3,1) both;
  }
  @keyframes rise{from{opacity:0;transform:translateY(16px) scale(.985)}to{opacity:1;transform:none}}

  /* ── header ─────────────────────────────── */
  .top{display:flex;align-items:flex-start;justify-content:space-between;gap:24px}
  .top h1{display:flex;align-items:center;gap:9px;font-size:29px;font-weight:700;letter-spacing:-.015em}
  .top h1 svg{flex:none;fill:var(--accent-deep)}
  #loc-text{display:block;max-width:540px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  #date-label{margin-top:5px;font-size:15px;color:var(--muted)}
  .chips{display:flex;gap:8px;padding-top:4px}
  .chip{background:rgba(255,255,255,.6);border:1px solid rgba(120,140,175,.28);border-radius:999px;
    padding:5px 13px;font-size:12px;font-weight:600;color:#4A5C77;white-space:nowrap;
    font-variant-numeric:tabular-nums}
  .chip.acc{background:color-mix(in srgb,var(--accent) 14%,white);border-color:transparent;color:var(--accent-deep)}

  /* ── hero ───────────────────────────────── */
  .hero{display:flex;align-items:center;gap:36px;padding:20px 0 20px;border-bottom:1px solid var(--hairline);margin-bottom:16px}
  .icon-wrap{width:132px;height:132px;flex:none}
  .icon-wrap svg{width:100%;height:100%;overflow:visible;filter:drop-shadow(0 16px 26px rgba(25,55,105,.22))}
  .kicker{font-size:11.5px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);margin-bottom:2px}
  .big{display:flex;align-items:flex-start;line-height:.95}
  #big-num{font-size:102px;font-weight:200;letter-spacing:-.035em;font-variant-numeric:tabular-nums}
  .deg{font-size:34px;font-weight:450;color:var(--accent-deep);margin-top:12px;margin-left:4px}
  .cond{font-size:19px;font-weight:650;color:var(--accent-deep);margin-top:6px}
  .range{margin-left:auto;border-left:1px solid rgba(18,38,70,.1);padding-left:36px;display:flex;flex-direction:column;gap:18px}
  .stat{display:flex;align-items:center;gap:13px}
  .badge{width:32px;height:32px;border-radius:50%;display:grid;place-items:center;flex:none}
  .badge.hi-b{background:rgba(226,96,58,.15)}
  .badge.lo-b{background:rgba(43,108,220,.14)}
  .slab{display:block;font-size:11px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--muted)}
  .sval{display:block;font-size:27px;font-weight:640;letter-spacing:-.01em;margin-top:1px;font-variant-numeric:tabular-nums;min-width:96px}

  /* ── chart ──────────────────────────────── */
  .chart-head{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:8px}
  .chart-head h2{font-size:13px;font-weight:700;letter-spacing:.11em;text-transform:uppercase;color:#42557400;color:#425574}
  .cap{font-size:12px;color:var(--muted-2)}
  .chart-wrap{position:relative;width:1040px;max-width:100%}
  .chart-wrap svg{display:block;user-select:none;-webkit-user-select:none}
  .ytick{font-size:11px;fill:#6B7A93;font-variant-numeric:tabular-nums}
  .now-lab{font-size:9.5px;font-weight:800;letter-spacing:.12em;fill:var(--accent-deep)}
  .tline{fill:none;stroke:var(--accent);stroke-width:2.6;stroke-linecap:round;stroke-linejoin:round;
    stroke-dasharray:1;stroke-dashoffset:1;animation:draw 1s cubic-bezier(.3,0,.2,1) .1s forwards}
  @keyframes draw{to{stroke-dashoffset:0}}
  .area{opacity:0;animation:fadein .8s ease .5s forwards}
  @keyframes fadein{to{opacity:1}}
  .pt{fill:#fff;stroke:var(--accent);stroke-width:2;opacity:0;transform-box:fill-box;transform-origin:50% 50%;
    animation:pop .3s ease forwards}
  @keyframes pop{from{opacity:0;transform:scale(.3)}to{opacity:1;transform:scale(1)}}
  .mk-hi{stroke:#D14B28;stroke-width:2.4}
  .mk-lo{stroke:#1D6FD8;stroke-width:2.4}
  .hl-lab{font-size:12.5px;font-weight:700;paint-order:stroke;stroke:#fff;stroke-width:4px;stroke-linejoin:round;font-variant-numeric:tabular-nums}
  .lab-hi{fill:#C2410C}
  .lab-lo{fill:#1D6FD8}
  #tip{position:absolute;left:0;top:0;opacity:0;pointer-events:none;background:rgba(13,26,45,.93);color:#fff;
    border-radius:11px;padding:8px 12px;font-size:13px;white-space:nowrap;transform:translate(-50%,-140%);
    transition:opacity .15s;box-shadow:0 12px 28px -8px rgba(8,22,48,.55);z-index:3}
  #tip.below{transform:translate(-50%,22px)}
  #tip.show{opacity:1}
  #tip b{font-size:14px;font-weight:650;margin-right:7px}
  #tip span{opacity:.72;font-size:12px}

  /* ── hourly readout strip ───────────────── */
  .readout{display:grid;grid-template-columns:repeat(24,1fr);margin:10px 14px 0 46px}
  .cell{text-align:center;padding:7px 0 6px;border-radius:9px;min-width:0;transition:background .15s}
  .cell .ch{display:block;font-size:10.5px;color:var(--muted-2);letter-spacing:.02em}
  .cell .cv{display:block;font-size:12.5px;font-weight:640;margin-top:3px;font-variant-numeric:tabular-nums}
  .cell .cv.nul{color:var(--muted-2);font-weight:400}
  .cell.hot{background:color-mix(in srgb,var(--accent) 12%,transparent)}
  .cell.hi .cv{color:#C2410C}
  .cell.lo .cv{color:#1D6FD8}

  .foot{display:flex;justify-content:space-between;font-size:11.5px;color:var(--muted-2);
    border-top:1px solid var(--hairline);margin-top:14px;padding-top:11px}

  /* ── skeleton ───────────────────────────── */
  .sk{background:linear-gradient(90deg,#E7EDF5 25%,#F6F9FC 37%,#E7EDF5 63%);background-size:400% 100%;
    animation:sh 1.4s ease infinite;border-radius:12px}
  @keyframes sh{0%{background-position:100% 0}100%{background-position:0 0}}
  #skel{padding-top:22px}
  .skrow{display:flex;gap:36px;align-items:center}
  .skc{width:132px;height:132px;border-radius:50%;flex:none}

  /* ── error ──────────────────────────────── */
  #err{padding:66px 0 74px;display:flex;flex-direction:column;align-items:center;gap:7px;text-align:center}
  #err h2{font-size:21px;font-weight:700;margin-top:10px}
  #err-msg{color:var(--muted);font-size:14.5px;max-width:560px;line-height:1.55}
  .hint{color:var(--muted-2);font-size:13px}
  .retry{margin-top:18px;background:var(--accent);color:#fff;border:none;border-radius:999px;padding:11px 28px;
    font-size:14.5px;font-weight:650;font-family:inherit;cursor:pointer;
    box-shadow:0 10px 22px -8px var(--accent);transition:filter .15s,transform .15s}
  .retry:hover{filter:brightness(.94)}
  .retry:active{transform:translateY(1px)}
  .retry:focus-visible{outline:2px solid var(--accent-deep);outline-offset:3px}

  #content{animation:fadeup .5s ease both}
  @keyframes fadeup{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}

  /* ── icon animations ────────────────────── */
  .a-spin{transform-box:fill-box;transform-origin:50% 50%;animation:spin 80s linear infinite}
  @keyframes spin{to{transform:rotate(360deg)}}
  .a-drift{animation:drift 7s ease-in-out infinite}
  .a-drift2{animation:drift 8s ease-in-out -4s infinite}
  @keyframes drift{0%,100%{transform:translateX(0)}50%{transform:translateX(3px)}}
  .a-fog{animation:fogx 3.4s ease-in-out infinite alternate}
  @keyframes fogx{from{transform:translateX(-3px)}to{transform:translateX(3px)}}
  .a-drop{animation:dropfall 1.6s ease-in infinite}
  @keyframes dropfall{0%{transform:translateY(0);opacity:0}18%{opacity:1}75%{opacity:1}100%{transform:translateY(13px);opacity:0}}
  .a-rain{animation:rainfall 1.1s linear infinite}
  @keyframes rainfall{0%{transform:translate(0,0);opacity:0}12%{opacity:1}80%{opacity:.9}100%{transform:translate(-4px,12px);opacity:0}}
  .a-snow{animation:snowfall 3s ease-in-out infinite}
  @keyframes snowfall{0%{transform:translateY(0) rotate(0deg);opacity:0}14%{opacity:1}82%{opacity:.9}100%{transform:translateY(12px) rotate(60deg);opacity:0}}
  .a-flash{animation:flash 6s ease infinite}
  @keyframes flash{0%,86%,94%,100%{opacity:1}90%{opacity:.25}}

  @media (prefers-reduced-motion:reduce){
    *{animation:none!important;transition:none!important}
    .tline{stroke-dasharray:none;stroke-dashoffset:0}
    .area,.pt,#content,.card{opacity:1}
  }
</style>
</head>
<body>
<div id="bgTheme" aria-hidden="true"></div>

<main class="card">
  <header class="top">
    <div>
      <h1>
        <svg width="17" height="17" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 2a7.4 7.4 0 0 0-7.4 7.4c0 5.1 6.3 11.6 6.9 12.2a.7.7 0 0 0 1 0c.6-.6 6.9-7.1 6.9-12.2A7.4 7.4 0 0 0 12 2Zm0 10.2a2.9 2.9 0 1 1 0-5.8 2.9 2.9 0 0 1 0 5.8Z"/></svg>
        <span id="loc-text">…</span>
      </h1>
      <p id="date-label">&nbsp;</p>
    </div>
    <div class="chips">
      <span class="chip acc" id="day-chip">—</span>
      <span class="chip" id="coords"></span>
      <span class="chip">UTC</span>
    </div>
  </header>

  <section id="skel" aria-hidden="true">
    <div class="skrow">
      <div class="sk skc"></div>
      <div>
        <div class="sk" style="width:250px;height:80px"></div>
        <div class="sk" style="width:150px;height:20px;margin-top:14px"></div>
      </div>
      <div class="sk" style="width:200px;height:100px;margin-left:auto"></div>
    </div>
    <div class="sk" style="height:290px;margin-top:28px"></div>
    <div class="sk" style="height:46px;margin-top:12px"></div>
  </section>

  <section id="err" hidden role="alert">
    <svg viewBox="0 0 96 96" width="78" height="78" aria-hidden="true">
      <g fill="#DCE4EF"><circle cx="34" cy="57" r="15"/><circle cx="54" cy="49" r="19"/><circle cx="69" cy="59" r="13"/><rect x="34" y="56" width="35" height="16" rx="8"/></g>
      <g fill="#E2703A"><rect x="50" y="40" width="7" height="21" rx="3.5"/><circle cx="53.5" cy="69.5" r="4"/></g>
    </svg>
    <h2>Couldn&rsquo;t load weather data</h2>
    <p id="err-msg"></p>
    <p class="hint">Check your connection or the URL parameters, then try again.</p>
    <button class="retry" onclick="location.reload()">Try again</button>
  </section>

  <section id="content" hidden>
    <div class="hero">
      <div class="icon-wrap" id="icon-wrap" aria-hidden="true"></div>
      <div>
        <div class="kicker" id="kicker"></div>
        <div class="big"><span id="big-num">–</span><span class="deg">°C</span></div>
        <div class="cond" id="cond"></div>
      </div>
      <div class="range">
        <div class="stat">
          <span class="badge hi-b"><svg width="13" height="13" viewBox="0 0 24 24"><path d="M12 5l7 10H5z" fill="#D14B28"/></svg></span>
          <div><span class="slab">High</span><span class="sval" id="hi-val">–</span></div>
        </div>
        <div class="stat">
          <span class="badge lo-b"><svg width="13" height="13" viewBox="0 0 24 24"><path d="M12 19L5 9h14z" fill="#1D6FD8"/></svg></span>
          <div><span class="slab">Low</span><span class="sval" id="lo-val">–</span></div>
        </div>
      </div>
    </div>

    <div class="chart-head">
      <h2>Hourly temperature</h2>
      <span class="cap">24 hours · °C · UTC</span>
    </div>
    <div class="chart-wrap">
      <svg id="chart" width="1040" height="292" role="img"></svg>
      <div id="tip"></div>
    </div>
    <div class="readout" id="readout" aria-label="Hourly temperatures in degrees Celsius"></div>

    <footer class="foot">
      <span>Source: Open-Meteo</span>
      <span>All times UTC · Temperatures in °C</span>
    </footer>
  </section>

  <noscript>
    <style>#skel{display:none}</style>
    <p style="padding:60px 0;text-align:center;color:#5F7089">This page needs JavaScript to load weather data.</p>
  </noscript>
</main>

<script>
(async function(){
  'use strict';
  var $ = function(s){ return document.querySelector(s); };
  var pad2 = function(n){ return String(n).padStart(2,'0'); };
  var f1 = function(v){ return String(Math.round(v*10)/10); };
  var R = function(n){ return Math.round(n*100)/100; };
  var R1 = function(n){ return Math.round(n*10)/10; };

  var WMO = {
    0:['Clear sky','sun'], 1:['Mainly clear','sun'], 2:['Partly cloudy','partly'], 3:['Overcast','cloud'],
    45:['Fog','fog'], 48:['Depositing rime fog','fog'],
    51:['Light drizzle','drizzle'], 53:['Moderate drizzle','drizzle'], 55:['Dense drizzle','drizzle'],
    56:['Light freezing drizzle','drizzle'], 57:['Dense freezing drizzle','drizzle'],
    61:['Light rain','rain'], 63:['Moderate rain','rain'], 65:['Heavy rain','rain'],
    66:['Light freezing rain','rain'], 67:['Heavy freezing rain','rain'],
    71:['Light snowfall','snow'], 73:['Moderate snowfall','snow'], 75:['Heavy snowfall','snow'],
    77:['Snow grains','snow'],
    80:['Light rain showers','rain'], 81:['Rain showers','rain'], 82:['Violent rain showers','rain'],
    85:['Light snow showers','snow'], 86:['Heavy snow showers','snow'],
    95:['Thunderstorm','thunder'], 96:['Thunderstorm with slight hail','thunder'], 99:['Thunderstorm with heavy hail','thunder']
  };
  var THEME = {sun:'clear', partly:'partly', cloud:'cloud', fog:'fog', drizzle:'rain', rain:'rain', snow:'snow', thunder:'thunder'};

  var CLOUD_GRAD = '<linearGradient id="gc" x1="0" y1="32" x2="0" y2="74" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#FFFFFF"/><stop offset="1" stop-color="#C7D3E4"/></linearGradient>';
  function cloudG(fill){
    return '<circle cx="34" cy="57" r="15" fill="'+fill+'"/><circle cx="54" cy="49" r="19" fill="'+fill+'"/>'+
           '<circle cx="69" cy="59" r="13" fill="'+fill+'"/><rect x="34" y="56" width="35" height="16" rx="8" fill="'+fill+'"/>';
  }
  function sunG(cx,cy,r,r1,r2,sw,spin){
    var rays='';
    for(var k=0;k<8;k++){
      var a=k*Math.PI/4, c=Math.cos(a), s2=Math.sin(a);
      rays+='<line x1="'+R1(cx+c*r1)+'" y1="'+R1(cy+s2*r1)+'" x2="'+R1(cx+c*r2)+'" y2="'+R1(cy+s2*r2)+'"/>';
    }
    return '<g class="'+(spin?'a-spin':'')+'" stroke="#FFB94D" stroke-width="'+sw+'" stroke-linecap="round">'+rays+'</g>'+
           '<circle cx="'+cx+'" cy="'+cy+'" r="'+r+'" fill="url(#gsun)"/>';
  }
  var SUN_GRAD = '<radialGradient id="gsun" cx="38%" cy="34%" r="80%"><stop offset="0" stop-color="#FFE9A8"/><stop offset="1" stop-color="#FFA726"/></radialGradient>';
  function flakeG(x,y,d){
    return '<g class="a-snow" style="animation-delay:'+d+'s"><g transform="translate('+x+' '+y+')" stroke="#79B4E8" stroke-width="2.4" stroke-linecap="round">'+
      '<line x1="-5" y1="0" x2="5" y2="0"/><line x1="-5" y1="0" x2="5" y2="0" transform="rotate(60)"/><line x1="-5" y1="0" x2="5" y2="0" transform="rotate(120)"/></g></g>';
  }
  var svgOpen = '<svg viewBox="0 0 96 96" aria-hidden="true">';
  var ICONS = {
    sun: function(){ return svgOpen+'<defs>'+SUN_GRAD+'</defs>'+sunG(48,48,22.5,30,39.5,5.5,true)+'</svg>'; },
    partly: function(){ return svgOpen+'<defs>'+SUN_GRAD+CLOUD_GRAD+'</defs>'+sunG(31,30,12,16.5,22.5,4.5,true)+
      '<g class="a-drift"><g transform="translate(4,6)">'+cloudG('url(#gc)')+'</g></g></svg>'; },
    cloud: function(){ return svgOpen+'<defs>'+CLOUD_GRAD+'</defs>'+
      '<g class="a-drift2"><g transform="translate(18,-7) scale(.72)">'+cloudG('#BBC8DB')+'</g></g>'+
      '<g class="a-drift">'+cloudG('url(#gc)')+'</g></svg>'; },
    fog: function(){ return svgOpen+'<defs>'+CLOUD_GRAD+'</defs>'+
      '<g transform="translate(0,-9)">'+cloudG('url(#gc)')+'</g>'+
      '<g stroke="#9FB2C6" stroke-width="5" stroke-linecap="round">'+
      '<line class="a-fog" x1="26" y1="74" x2="70" y2="74"/>'+
      '<line class="a-fog" style="animation-delay:-1.7s" x1="32" y1="84" x2="64" y2="84"/></g></svg>'; },
    drizzle: function(){ return svgOpen+'<defs>'+CLOUD_GRAD+'</defs>'+
      '<g transform="translate(0,-9)">'+cloudG('url(#gc)')+'</g>'+
      '<g fill="#4E9CE8"><circle class="a-drop" cx="36" cy="74" r="2.6"/>'+
      '<circle class="a-drop" style="animation-delay:.5s" cx="50" cy="74" r="2.6"/>'+
      '<circle class="a-drop" style="animation-delay:1s" cx="64" cy="74" r="2.6"/></g></svg>'; },
    rain: function(){ return svgOpen+'<defs>'+CLOUD_GRAD+'</defs>'+
      '<g transform="translate(0,-9)">'+cloudG('url(#gc)')+'</g>'+
      '<g stroke="#3D8FE0" stroke-width="4.5" stroke-linecap="round">'+
      '<line class="a-rain" x1="38" y1="72" x2="34" y2="82"/>'+
      '<line class="a-rain" style="animation-delay:.35s" x1="52" y1="72" x2="48" y2="82"/>'+
      '<line class="a-rain" style="animation-delay:.7s" x1="66" y1="72" x2="62" y2="82"/></g></svg>'; },
    snow: function(){ return svgOpen+'<defs>'+CLOUD_GRAD+'</defs>'+
      '<g transform="translate(0,-9)">'+cloudG('url(#gc)')+'</g>'+
      flakeG(37,76,0)+flakeG(51,72,1)+flakeG(65,76,2)+'</svg>'; },
    thunder: function(){ return svgOpen+
      '<defs><linearGradient id="gtc" x1="0" y1="32" x2="0" y2="74" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#F4F7FB"/><stop offset="1" stop-color="#93A7C4"/></linearGradient></defs>'+
      '<g transform="translate(0,-11)">'+cloudG('url(#gtc)')+'</g>'+
      '<path class="a-flash" d="M51 57 L40 77 L48 77 L44 92 L62 69 L52 69 L59 57 Z" fill="#FFC431" stroke="#E8A50A" stroke-width="1" stroke-linejoin="round"/></svg>'; }
  };

  function firstNum(a){ return (Array.isArray(a) && typeof a[0]==='number' && isFinite(a[0])) ? a[0] : null; }
  function ticks(lo,hi,n){
    var span=hi-lo; if(span<=0) return [lo];
    var s0=span/n, mag=Math.pow(10,Math.floor(Math.log10(s0))), nm=s0/mag;
    var st=(nm<1.5?1:nm<3?2:nm<7?5:10)*mag, out=[];
    for(var v=Math.ceil(lo/st)*st; v<=hi+1e-9; v+=st) out.push(v);
    return out;
  }
  function fmtTick(v){ return Math.abs(v-Math.round(v))<1e-6 ? String(Math.round(v)) : v.toFixed(1); }
  function mono(p){
    var n=p.length;
    if(n===2) return 'M '+R(p[0][0])+' '+R(p[0][1])+' L '+R(p[1][0])+' '+R(p[1][1]);
    var dx=[], m=[], i;
    for(i=0;i<n-1;i++){ dx.push(p[i+1][0]-p[i][0]); m.push((p[i+1][1]-p[i][1])/dx[i]); }
    var t=[m[0]];
    for(i=1;i<n-1;i++){
      if(m[i-1]*m[i]<=0) t.push(0);
      else { var w1=2*dx[i]+dx[i-1], w2=dx[i]+2*dx[i-1]; t.push((w1+w2)/(w1/m[i-1]+w2/m[i])); }
    }
    t.push(m[n-2]);
    var d='M '+R(p[0][0])+' '+R(p[0][1]);
    for(i=0;i<n-1;i++){
      var h=dx[i];
      d+=' C '+R(p[i][0]+h/3)+' '+R(p[i][1]+t[i]*h/3)+' '+R(p[i+1][0]-h/3)+' '+R(p[i+1][1]-t[i+1]*h/3)+' '+R(p[i+1][0])+' '+R(p[i+1][1]);
    }
    return d;
  }

  function buildChart(temps,tmax,tmin,iMax,iMin,isToday){
    var W=1040, Hh=292, PL=46, PR=14, PT=30, PB=16;
    var pw=W-PL-PR, ph=Hh-PT-PB, cw=pw/24;
    var X=function(i){ return PL+(i+.5)*cw; };
    var vals=temps.filter(function(v){ return v!=null; });
    var lo=Math.min(Math.min.apply(null,vals),tmin), hi=Math.max(Math.max.apply(null,vals),tmax);
    var pad=Math.max(.8,(hi-lo)*.18); if(hi===lo) pad=2;
    var dLo=lo-pad, dHi=hi+pad;
    var Y=function(v){ return PT+(dHi-v)/(dHi-dLo)*ph; };
    var base=PT+ph, s='', i;

    s+='<defs><linearGradient id="ga" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="var(--accent)" stop-opacity=".26"/><stop offset="1" stop-color="var(--accent)" stop-opacity="0"/></linearGradient></defs>';
    ticks(dLo,dHi,4).forEach(function(t){
      var y=R(Y(t));
      s+='<line x1="'+PL+'" x2="'+(W-PR)+'" y1="'+y+'" y2="'+y+'" stroke="rgba(22,44,80,.07)"/>'+
         '<text class="ytick" x="'+(PL-9)+'" y="'+(y+3.5)+'" text-anchor="end">'+fmtTick(t)+'°</text>';
    });
    [6,12,18].forEach(function(h){
      var x=R(PL+h*cw);
      s+='<line x1="'+x+'" x2="'+x+'" y1="'+PT+'" y2="'+base+'" stroke="rgba(22,44,80,.055)"/>';
    });
    s+='<line x1="'+PL+'" x2="'+(W-PR)+'" y1="'+base+'" y2="'+base+'" stroke="rgba(22,44,80,.14)"/>';

    var segs=[], cur=[];
    temps.forEach(function(v,i){
      if(v==null){ if(cur.length){ segs.push(cur); cur=[]; } }
      else cur.push([X(i),Y(v)]);
    });
    if(cur.length) segs.push(cur);

    segs.forEach(function(seg){
      if(seg.length<2) return;
      s+='<path class="area" d="'+mono(seg)+' L '+R(seg[seg.length-1][0])+' '+base+' L '+R(seg[0][0])+' '+base+' Z" fill="url(#ga)"/>';
    });
    if(isToday){
      var n=new Date(), tN=n.getUTCHours()+n.getUTCMinutes()/60;
      var xn=R(Math.min(PL+pw-1, PL+(tN+.5)*cw));
      s+='<line x1="'+xn+'" x2="'+xn+'" y1="'+(PT-2)+'" y2="'+base+'" stroke="var(--accent-deep)" stroke-opacity=".5" stroke-dasharray="3 4"/>'+
         '<text class="now-lab" x="'+xn+'" y="'+(PT-9)+'" text-anchor="middle">NOW</text>';
    }
    segs.forEach(function(seg){
      if(seg.length<2) return;
      s+='<path class="tline" pathLength="1" d="'+mono(seg)+'"/>';
    });
    temps.forEach(function(v,i){
      if(v==null) return;
      s+='<circle class="pt" style="animation-delay:'+(0.45+i*0.022).toFixed(2)+'s" cx="'+R(X(i))+'" cy="'+R(Y(v))+'" r="2.7"/>';
    });
    function mark(i,cls,above){
      var x=R(X(i)), y=R(Y(temps[i]));
      var lx=Math.min(W-PR-30, Math.max(PL+30, x));
      var ly=above ? y-13 : Math.min(Hh-5, y+22);
      s+='<circle cx="'+x+'" cy="'+y+'" r="4.8" fill="#fff" class="'+(cls==='lab-hi'?'mk-hi':'mk-lo')+'"/>'+
         '<text class="hl-lab '+cls+'" x="'+lx+'" y="'+ly+'" text-anchor="middle">'+f1(temps[i])+'°</text>';
    }
    mark(iMax,'lab-hi',true);
    mark(iMin,'lab-lo',false);

    s+='<g id="gd" opacity="0"><line id="gd-l" x1="0" x2="0" y1="'+PT+'" y2="'+base+'" stroke="rgba(20,40,80,.3)" stroke-dasharray="2 3"/>'+
       '<circle id="gd-c" r="5.6" fill="none" stroke="var(--accent)" stroke-width="2"/></g>';
    s+='<rect id="ov" x="'+PL+'" y="'+PT+'" width="'+pw+'" height="'+ph+'" fill="transparent" style="cursor:crosshair"/>';
    return {svg:s, X:X, Y:Y, PL:PL, cw:cw};
  }

  /* ── params & static header ── */
  var qs = new URLSearchParams(location.search);
  var todayStr = new Date().toISOString().slice(0,10);
  var num = function(s,d){ var n=parseFloat(s); return Number.isFinite(n)?n:d; };
  var lat = num(qs.get('lat'), 52.52);
  var lon = num(qs.get('lon'), 13.405);
  var name = (qs.get('name')||'').trim() || 'Berlin';
  var dateStr = (qs.get('date')||'').trim() || todayStr;
  var isToday = dateStr===todayStr;

  $('#loc-text').textContent = name;
  $('#loc-text').title = name;
  var dObj = new Date(dateStr+'T00:00:00Z');
  var dateLabel = isNaN(dObj) ? dateStr :
    dObj.toLocaleDateString('en-GB',{weekday:'long',day:'numeric',month:'long',year:'numeric',timeZone:'UTC'});
  $('#date-label').textContent = dateLabel;
  $('#coords').textContent = Math.abs(lat).toFixed(2)+'° '+(lat>=0?'N':'S')+', '+Math.abs(lon).toFixed(2)+'° '+(lon>=0?'E':'W');
  $('#day-chip').textContent = isToday ? 'Today' : (dateStr<todayStr ? 'Past' : 'Forecast');
  document.title = name+' — '+dateLabel;

  function fail(msg){
    $('#skel').hidden = true;
    $('#content').hidden = true;
    $('#err').hidden = false;
    $('#err-msg').textContent = msg;
  }

  if(!/^\d{4}-\d{2}-\d{2}$/.test(dateStr)){
    fail('"'+dateStr+'" is not a valid date. Expected format: YYYY-MM-DD.');
    return;
  }

  /* ── fetch ── */
  var data;
  try{
    var apiBase = dateStr<todayStr ? '/api/om/archive' : '/api/om/forecast';
    var p = 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:dateStr, end_date:dateStr
    });
    var res = await fetch(apiBase+'?'+p.toString());
    var body = null;
    try{ body = await res.json(); }catch(e){}
    if(!res.ok) throw new Error((body&&body.reason) || ('The weather service responded with HTTP '+res.status+'.'));
    if(!body || body.error) throw new Error((body&&body.reason) || 'The weather service returned an unexpected response.');
    data = body;
  }catch(err){
    fail((err&&err.message) ? err.message : 'The network request failed.');
    return;
  }

  /* ── render ── */
  try{
    var hy=data.hourly||{}, dy=data.daily||{};
    var times=Array.isArray(hy.time)?hy.time:[], hv=Array.isArray(hy.temperature_2m)?hy.temperature_2m:[];
    var temps=new Array(24).fill(null);
    times.forEach(function(t,i){
      if(typeof t==='string' && t.indexOf(dateStr)===0){
        var h=parseInt(t.slice(11,13),10), v=hv[i];
        if(h>=0 && h<24 && typeof v==='number' && isFinite(v)) temps[h]=v;
      }
    });
    var valid=temps.filter(function(v){ return v!=null; });
    if(!valid.length) throw new Error('no hourly temperatures are available for this date — it may be outside the range this data source covers');

    var tmax=firstNum(dy.temperature_2m_max); if(tmax==null) tmax=Math.max.apply(null,valid);
    var tmin=firstNum(dy.temperature_2m_min); if(tmin==null) tmin=Math.min.apply(null,valid);
    var wcode=firstNum(dy.weather_code);
    var cond = WMO[wcode] || (wcode==null ? ['Conditions unavailable','cloud'] : ['Weather code '+wcode,'cloud']);
    var condText=cond[0], group=cond[1];

    document.body.dataset.theme = THEME[group] || 'partly';
    $('#bgTheme').classList.add('on');
    $('#icon-wrap').innerHTML = ICONS[group]();

    var nowH=new Date().getUTCHours();
    var nowVal=isToday ? temps[nowH] : null;
    $('#kicker').textContent = nowVal!=null ? 'Now · '+pad2(nowH)+':00 UTC' : (dateStr>todayStr ? 'Forecast high' : 'Daily high');
    $('#big-num').textContent = String(Math.round(nowVal!=null?nowVal:tmax));
    $('#cond').textContent = condText;
    $('#hi-val').textContent = f1(tmax)+'°';
    $('#lo-val').textContent = f1(tmin)+'°';

    var iMax=temps.indexOf(Math.max.apply(null,valid));
    var iMin=temps.indexOf(Math.min.apply(null,valid));
    var ch=buildChart(temps,tmax,tmin,iMax,iMin,isToday);
    var svg=$('#chart');
    svg.innerHTML=ch.svg;
    svg.setAttribute('aria-label','Hourly temperature chart. High '+f1(tmax)+' degrees Celsius, low '+f1(tmin)+' degrees Celsius.');

    var ro=$('#readout');
    temps.forEach(function(v,i){
      var c=document.createElement('div');
      c.className='cell'+(i===iMax?' hi':'')+(i===iMin?' lo':'');
      var cv=v==null ? '<span class="cv nul">–</span>' : '<span class="cv">'+Math.round(v)+'°</span>';
      c.innerHTML='<span class="ch">'+pad2(i)+'</span>'+cv;
      c.addEventListener('pointerenter', function(){ setHot(i); });
      ro.appendChild(c);
    });
    ro.addEventListener('pointerleave', clearHot);

    var gd=svg.querySelector('#gd'), gl=svg.querySelector('#gd-l'), gc2=svg.querySelector('#gd-c'),
        ov=svg.querySelector('#ov'), tip=$('#tip'), cells=[].slice.call(ro.children);

    function setHot(i){
      if(i==null || temps[i]==null){ clearHot(); return; }
      var x=ch.X(i), y=ch.Y(temps[i]);
      gd.setAttribute('opacity','1');
      gl.setAttribute('x1',x); gl.setAttribute('x2',x);
      gc2.setAttribute('cx',x); gc2.setAttribute('cy',y);
      tip.innerHTML='<b>'+f1(temps[i])+'°C</b><span>'+pad2(i)+':00 UTC</span>';
      tip.style.left=Math.max(64,Math.min(1040-64,x))+'px';
      tip.style.top=y+'px';
      tip.classList.toggle('below', y<80);
      tip.classList.add('show');
      cells.forEach(function(c,k){ c.classList.toggle('hot',k===i); });
    }
    function clearHot(){
      gd.setAttribute('opacity','0');
      tip.classList.remove('show');
      cells.forEach(function(c){ c.classList.remove('hot'); });
    }
    ov.addEventListener('pointermove', function(e){
      var r=svg.getBoundingClientRect();
      var i=Math.floor((e.clientX-r.left-ch.PL)/ch.cw);
      i=Math.max(0,Math.min(23,i));
      if(temps[i]==null){
        var j=null;
        for(var d=1;d<24;d++){
          if(i-d>=0 && temps[i-d]!=null){ j=i-d; break; }
          if(i+d<24 && temps[i+d]!=null){ j=i+d; break; }
        }
        i=j;
      }
      setHot(i);
    });
    ov.addEventListener('pointerleave', clearHot);

    $('#skel').hidden=true;
    $('#content').hidden=false;
  }catch(err){
    fail('Could not read the weather data: '+((err&&err.message)?err.message:err)+'.');
  }
})();
</script>
</body>
</html>

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

bytes 总计30,655html / css / js3,617 / 10,820 / 16,218
dom 节点81dom 深度9
css 规则138含 js
brightness208.5contrast37.1
colorfulness26.1留白74.0%

该 slot 的 telemetry

prompt tokens8completion tokens58,965
total tokens58,973wall771.4 s
costrequest id
config.json572 B
{
  "N": 2,
  "auth": {
    "credential_ref": "WCB_NONE",
    "method": "oauth-login"
  },
  "billing": "plan",
  "config_id": "claude-fable-5-eff-max--cli--claude-code--dev",
  "effort": "max",
  "family": "claude",
  "m": {
    "min": 2,
    "q": 2
  },
  "model_id": "claude-fable-5",
  "protocol": "cli",
  "served_model": "claude-fable-5",
  "telemetry": {
    "completion_tokens": 214449,
    "cost_usd": null,
    "prompt_tokens": 51,
    "total_tokens": 214500,
    "wall_ms": 2679323
  },
  "transport": "claude-code-cli-headless",
  "vendor_sanction_ref": null
}
send-log2.5 KB
{
  "N": 2,
  "batch_id": "2026-07-17--dev-cc-fable5",
  "config_id": "claude-fable-5-eff-max--cli--claude-code--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-07-17T14:07:56.746435+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T13:55:05.343554+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-07-17T14:17:05.330464+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T14:08:00.525126+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-07-17T14:22:58.022132+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T14:17:08.358587+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-07-17T14:39:54.561975+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T14:23:01.107183+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
    }
  }
}