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

截图是 similarity 通道测量时的原始像素。运行 live 会在 sandboxed iframe 中重新执行原始输出;渲染结果取决于你的浏览器和字体,不保证与测量像素一致。
similarity 邻居本 session 没有 similarity 数据 —— 这个 batch 没有计算 pairs。
Fidelity —— 卡片展示的数据对不对?
- namematch
- conditionmatch
- datematch
- max tempmatch展示值:25
- min tempmatch展示值:16
- hourlyambiguouscoverage · 0 命中 · 0 不符 · 24 未展示
- request sidematch0 处违规
extractor fidelity-extractor-v1+Berlin-2026-07-15
源码 —— 原始模型输出,一字节未改
下载 card.html<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" href="data:,">
<title>Weather</title>
<style>
*{margin:0;padding:0;box-sizing:border-box}
html,body{height:100%}
:root{
--bg1:#28527f; --bg2:#4f7ba3; --bg3:#7fa0ba;
--orb1:rgba(255,215,130,.45); --orb2:rgba(140,190,235,.5); --orb3:rgba(220,235,250,.35);
--accent:#ffd98a; --halo:rgba(255,217,138,.28);
}
body{
font-family:-apple-system,BlinkMacSystemFont,"SF Pro Display","Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
color:#fff;
background:linear-gradient(168deg,var(--bg1) 0%,var(--bg2) 52%,var(--bg3) 100%);
min-height:100vh;display:flex;align-items:center;justify-content:center;
overflow:hidden;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
}
::selection{background:rgba(255,255,255,.25)}
body::before{
content:"";position:fixed;inset:0;z-index:1;pointer-events:none;
background:radial-gradient(130% 100% at 50% 0%,rgba(255,255,255,.07) 0%,rgba(255,255,255,0) 42%),
radial-gradient(120% 120% at 50% 100%,rgba(6,16,30,.38),transparent 55%);
}
body::after{
content:"";position:fixed;inset:0;z-index:1;pointer-events:none;opacity:.05;
background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='260' height='260'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='260' height='260' filter='url(%23n)' opacity='0.55'/%3E%3C/svg%3E");
}
.orb{position:fixed;border-radius:50%;filter:blur(90px);pointer-events:none;z-index:0}
.orb1{width:540px;height:540px;background:var(--orb1);top:-170px;left:-130px;opacity:.55;animation:drift1 26s ease-in-out infinite alternate}
.orb2{width:640px;height:640px;background:var(--orb2);bottom:-240px;right:-170px;opacity:.5;animation:drift2 32s ease-in-out infinite alternate}
.orb3{width:340px;height:340px;background:var(--orb3);top:38%;left:57%;opacity:.32;animation:drift3 22s ease-in-out infinite alternate}
@keyframes drift1{to{transform:translate(70px,44px) scale(1.08)}}
@keyframes drift2{to{transform:translate(-60px,-40px) scale(1.06)}}
@keyframes drift3{to{transform:translate(-46px,30px)}}
#app{position:relative;z-index:2;width:100%;display:flex;align-items:center;justify-content:center;padding:24px}
.load{display:flex;flex-direction:column;align-items:center;gap:18px;color:rgba(255,255,255,.85);font-size:15px;letter-spacing:.03em;animation:rise .5s ease-out both}
.ring{width:44px;height:44px;border-radius:50%;border:3px solid rgba(255,255,255,.25);border-top-color:#fff;animation:spin .9s linear infinite}
.card{
position:relative;width:980px;max-width:calc(100vw - 48px);
background:linear-gradient(155deg,rgba(255,255,255,.15),rgba(255,255,255,.07) 58%,rgba(255,255,255,.11));
border:1px solid rgba(255,255,255,.22);border-radius:30px;
padding:44px 48px 38px;
backdrop-filter:blur(28px) saturate(1.35);-webkit-backdrop-filter:blur(28px) saturate(1.35);
box-shadow:0 40px 80px -24px rgba(8,20,40,.5),inset 0 1px 0 rgba(255,255,255,.28);
}
.card::before{content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;
background:radial-gradient(90% 60% at 18% 0%,rgba(255,255,255,.14),transparent 60%)}
.tophead{display:flex;justify-content:space-between;align-items:flex-start;gap:24px}
.locrow{display:flex;align-items:center;gap:9px}
.locrow .pin{flex-shrink:0;opacity:.9}
h1.loc{font-size:31px;font-weight:650;letter-spacing:-.01em;line-height:1.1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:470px}
.date{margin-top:8px;font-size:15.5px;color:rgba(255,255,255,.74);letter-spacing:.01em}
.chips{display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end;max-width:400px;padding-top:4px}
.chip{display:inline-flex;align-items:center;gap:6px;padding:5px 12px;border-radius:999px;
background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.18);
font-size:12px;font-weight:600;letter-spacing:.05em;color:rgba(255,255,255,.85);white-space:nowrap}
.chip-acc{border-color:var(--accent);color:#fff;box-shadow:0 0 14px -3px var(--halo)}
.hero{display:flex;align-items:center;margin-top:32px}
.iconwrap{position:relative;display:flex;flex-direction:column;align-items:center;gap:8px;animation:float 6s ease-in-out infinite}
.iconwrap::before{content:"";position:absolute;top:-4px;left:50%;transform:translateX(-50%);width:160px;height:150px;border-radius:50%;
background:radial-gradient(circle,var(--halo),transparent 70%);z-index:-1}
.wicon{width:118px;height:118px;filter:drop-shadow(0 14px 28px rgba(10,25,50,.35))}
.rays{animation:spin 42s linear infinite;transform-box:view-box}
.cond{font-size:17px;font-weight:600;text-align:center;max-width:190px;line-height:1.3;color:rgba(255,255,255,.95)}
.sp{flex:1}
.temps{display:flex;align-items:center;gap:42px;padding-right:8px}
.tempblock .lab{font-size:12px;font-weight:700;letter-spacing:.2em;text-transform:uppercase;color:rgba(255,255,255,.6);margin-bottom:6px}
.tempblock .val{font-size:92px;font-weight:200;line-height:1;letter-spacing:-.02em;font-variant-numeric:tabular-nums;color:#fff}
.tempblock.low .val{color:rgba(255,255,255,.55)}
@supports (-webkit-background-clip:text){
.tempblock .val{background:linear-gradient(180deg,#ffffff 18%,rgba(255,255,255,.72));-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
.tempblock.low .val{background:linear-gradient(180deg,rgba(255,255,255,.62) 18%,rgba(255,255,255,.38));-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
}
.vdiv{width:1px;height:78px;background:linear-gradient(rgba(255,255,255,0),rgba(255,255,255,.35),rgba(255,255,255,0))}
.section{margin-top:38px}
.sechead{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:14px}
.sechead h2{font-size:13px;font-weight:700;letter-spacing:.16em;text-transform:uppercase;color:rgba(255,255,255,.65)}
.sechead .met{font-size:12px;color:rgba(255,255,255,.5);letter-spacing:.04em}
.chartwrap{position:relative}
.nodata{color:rgba(255,255,255,.65);font-size:14px;padding:26px 0 12px}
.tip{position:absolute;top:0;left:0;pointer-events:none;opacity:0;transition:opacity .12s ease;
transform:translate(-50%,-100%);background:rgba(14,28,48,.88);border:1px solid rgba(255,255,255,.25);
color:#fff;font-size:12.5px;padding:6px 11px;border-radius:9px;white-space:nowrap;
box-shadow:0 8px 20px rgba(0,0,0,.3);backdrop-filter:blur(6px)}
.tip b{font-weight:700}
.strip{display:grid;margin-top:8px}
.hcell{display:flex;flex-direction:column;align-items:center;gap:3px;padding:7px 0 6px;border-radius:10px;transition:background .15s ease;cursor:default}
.hcell .hh{font-size:10.5px;font-weight:600;color:rgba(255,255,255,.5);letter-spacing:.02em}
.hcell .ht{font-size:12.5px;font-weight:600;font-variant-numeric:tabular-nums;color:rgba(255,255,255,.92)}
.hcell.on{background:rgba(255,255,255,.16)}
.hcell.on .ht{color:#fff}
.line{stroke-dasharray:1;stroke-dashoffset:1;animation:dash 1.4s cubic-bezier(.45,.05,.35,1) .3s forwards}
.area{opacity:0;animation:fadein .9s ease .9s forwards}
.dot{opacity:0;animation:dotin .5s ease forwards}
.mark{opacity:0;animation:fadein .7s ease 1.25s forwards}
.drops{animation:fall 1.4s linear infinite}
.flakes{animation:fall 2.9s linear infinite}
.fogl{animation:fogdrift 5s ease-in-out infinite}
.bolt{animation:boltp 2.6s ease-in-out infinite}
.ecard{width:560px;text-align:center;padding:54px 52px 48px}
.etitle{font-size:25px;font-weight:650;margin-top:20px;letter-spacing:-.01em}
.emsg{margin-top:10px;font-size:15.5px;line-height:1.55;color:rgba(255,255,255,.78)}
.edetail{margin-top:12px;font-size:12.5px;color:rgba(255,255,255,.52);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;word-break:break-word}
.retry{margin-top:28px;padding:12px 32px;border-radius:999px;border:1px solid rgba(255,255,255,.35);
background:rgba(255,255,255,.14);color:#fff;font-size:14.5px;font-weight:600;font-family:inherit;cursor:pointer;
transition:background .2s ease,transform .2s ease;backdrop-filter:blur(6px)}
.retry:hover{background:rgba(255,255,255,.26);transform:translateY(-1px)}
.retry:active{transform:translateY(0)}
.reveal{opacity:0;animation:rise .65s cubic-bezier(.22,.7,.3,1) forwards}
@keyframes rise{from{opacity:0;transform:translateY(18px)}to{opacity:1;transform:none}}
@keyframes spin{to{transform:rotate(360deg)}}
@keyframes float{0%,100%{transform:translateY(0)}50%{transform:translateY(-7px)}}
@keyframes fall{0%{transform:translateY(-2px);opacity:0}25%{opacity:1}80%{opacity:1}100%{transform:translateY(5px);opacity:0}}
@keyframes fogdrift{0%,100%{transform:translateX(-2.5px)}50%{transform:translateX(2.5px)}}
@keyframes boltp{0%,100%{opacity:1}50%{opacity:.72}}
@keyframes dash{to{stroke-dashoffset:0}}
@keyframes fadein{to{opacity:1}}
@keyframes dotin{to{opacity:.9}}
@media (prefers-reduced-motion:reduce){
*,*::before,*::after{animation:none !important;transition:none !important}
.reveal,.area,.dot,.mark{opacity:1 !important;transform:none !important}
.line{stroke-dasharray:none !important;stroke-dashoffset:0 !important}
}
</style>
</head>
<body>
<div class="orb orb1"></div>
<div class="orb orb2"></div>
<div class="orb orb3"></div>
<div id="app">
<div class="load"><div class="ring"></div><p>Loading weather…</p></div>
</div>
<noscript><div style="position:fixed;inset:0;display:flex;align-items:center;justify-content:center;color:#fff;z-index:9">This page requires JavaScript to load weather data.</div></noscript>
<script>
(function(){
'use strict';
var app=document.getElementById('app');
function esc(s){return String(s).replace(/[&<>"']/g,function(c){return{'&':'&','<':'<','>':'>','"':'"',"'":'''}[c];});}
function num(v){return (typeof v==='number'&&isFinite(v))?v:null;}
function rgba(hex,a){var h=hex.replace('#','');if(h.length===3){h=h[0]+h[0]+h[1]+h[1]+h[2]+h[2];}var n=parseInt(h,16);return 'rgba('+(n>>16&255)+','+(n>>8&255)+','+(n&255)+','+a+')';}
function deg(v,dec){return (dec?v.toFixed(1):String(Math.round(v))).replace('-','\u2212');}
var THEMES={
clear: {bg:['#0f4c8f','#2f7cc4','#67a7d8'],orb1:'rgba(255,205,100,.55)',orb2:'rgba(120,200,255,.5)', orb3:'rgba(255,240,200,.4)', accent:'#ffd166',accent2:'#fff3c4',glow:'rgba(255,209,102,.3)'},
partly: {bg:['#28527f','#4f7ba3','#7fa0ba'],orb1:'rgba(255,215,130,.45)',orb2:'rgba(140,190,235,.5)', orb3:'rgba(220,235,250,.35)',accent:'#ffd98a',accent2:'#ffffff',glow:'rgba(255,217,138,.28)'},
cloudy: {bg:['#37475a','#566a7f','#7c8ea1'],orb1:'rgba(170,195,220,.4)', orb2:'rgba(120,145,175,.45)',orb3:'rgba(200,215,235,.3)', accent:'#aac6e2',accent2:'#eef5fc',glow:'rgba(170,198,226,.28)'},
fog: {bg:['#414c58','#626e7a','#8894a0'],orb1:'rgba(190,205,220,.35)',orb2:'rgba(140,155,170,.4)', orb3:'rgba(210,220,230,.3)', accent:'#c9d6e0',accent2:'#f2f7fa',glow:'rgba(201,214,224,.25)'},
drizzle:{bg:['#27435f','#436787','#6889a6'],orb1:'rgba(130,190,235,.4)', orb2:'rgba(100,150,200,.45)',orb3:'rgba(180,220,250,.3)', accent:'#8fd0f0',accent2:'#e6f7ff',glow:'rgba(143,208,240,.3)'},
rain: {bg:['#16304d','#2b5278','#47739c'],orb1:'rgba(90,160,220,.45)', orb2:'rgba(60,120,180,.5)', orb3:'rgba(140,200,245,.3)', accent:'#66c2f0',accent2:'#d6f0ff',glow:'rgba(102,194,240,.32)'},
snow: {bg:['#3a5a7c','#5f83a6','#8cadc9'],orb1:'rgba(230,245,255,.5)', orb2:'rgba(160,200,235,.45)',orb3:'rgba(255,255,255,.35)',accent:'#e8f6ff',accent2:'#ffffff',glow:'rgba(232,246,255,.34)'},
thunder:{bg:['#221d47','#3a3169','#5a4d8c'],orb1:'rgba(255,200,110,.4)', orb2:'rgba(140,110,220,.5)', orb3:'rgba(200,170,255,.3)', accent:'#ffcf6e',accent2:'#e8ddff',glow:'rgba(255,207,110,.3)'}
};
var WMO={
0:['Clear sky','clear'],1:['Mainly clear','clear'],2:['Partly cloudy','partly'],3:['Overcast','cloudy'],
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:['Slight rain','rain'],63:['Moderate rain','rain'],65:['Heavy rain','rain'],
66:['Light freezing rain','rain'],67:['Heavy freezing rain','rain'],
71:['Slight snowfall','snow'],73:['Moderate snowfall','snow'],75:['Heavy snowfall','snow'],77:['Snow grains','snow'],
80:['Slight rain showers','rain'],81:['Moderate rain showers','rain'],82:['Violent rain showers','rain'],
85:['Slight snow showers','snow'],86:['Heavy snow showers','snow'],
95:['Thunderstorm','thunder'],96:['Thunderstorm with slight hail','thunder'],99:['Thunderstorm with heavy hail','thunder']
};
var CLOUD='M18 46C12 46 8 41 8 36C8 31 12 27 17 27C18 19 25 14 32 14C39 14 45 19 47 26C52 26 56 30 56 36C56 41 52 46 46 46Z';
var SUN_GRAD='<radialGradient id="sg" cx="0.5" cy="0.42" r="0.65"><stop offset="0" stop-color="#fff6cf"/><stop offset="0.55" stop-color="#ffd76e"/><stop offset="1" stop-color="#f7a92d"/></radialGradient>';
var CLOUD_GRAD='<linearGradient id="cg" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#ffffff"/><stop offset="1" stop-color="#ccd9ea"/></linearGradient>';
var CLOUD_GRAD2='<linearGradient id="cg2" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#d3dfee"/><stop offset="1" stop-color="#9fb4cc"/></linearGradient>';
function rays(cx,cy,r1,r2,w){
var s='';
for(var a=0;a<8;a++){
var t=a*Math.PI/4;
s+='<line x1="'+(cx+Math.cos(t)*r1).toFixed(1)+'" y1="'+(cy+Math.sin(t)*r1).toFixed(1)+'" x2="'+(cx+Math.cos(t)*r2).toFixed(1)+'" y2="'+(cy+Math.sin(t)*r2).toFixed(1)+'"/>';
}
return '<g class="rays" style="transform-origin:'+cx+'px '+cy+'px" stroke="#ffd76e" stroke-width="'+w+'" stroke-linecap="round">'+s+'</g>';
}
function cloud(tf,fill){return '<g transform="'+tf+'"><path d="'+CLOUD+'" fill="'+(fill||'url(#cg)')+'"/></g>';}
function flake(cx,cy,r){
var s='';[0,60,120].forEach(function(a){s+='<line x1="'+(cx-r)+'" y1="'+cy+'" x2="'+(cx+r)+'" y2="'+cy+'" transform="rotate('+a+' '+cx+' '+cy+')"/>';});
return s;
}
function icon(kind){
var open='<svg class="wicon" viewBox="0 0 64 64" aria-hidden="true">',close='</svg>';
if(kind==='clear')return open+'<defs>'+SUN_GRAD+'</defs>'+rays(32,32,19.5,25.5,3.6)+'<circle cx="32" cy="32" r="12.5" fill="url(#sg)"/>'+close;
if(kind==='partly')return open+'<defs>'+SUN_GRAD+CLOUD_GRAD+'</defs>'+rays(21,19,11,15.5,3)+'<circle cx="21" cy="19" r="8" fill="url(#sg)"/>'+cloud('translate(3,9) scale(0.92)')+close;
if(kind==='cloudy')return open+'<defs>'+CLOUD_GRAD+CLOUD_GRAD2+'</defs>'+cloud('translate(15,0) scale(0.6)','url(#cg2)')+cloud('translate(-1,7) scale(0.98)')+close;
if(kind==='fog')return open+'<defs>'+CLOUD_GRAD+'</defs>'+cloud('translate(2,-4) scale(0.9)')+'<g class="fogl" stroke="rgba(255,255,255,.8)" stroke-width="3.4" stroke-linecap="round"><line x1="13" y1="45" x2="47" y2="45"/><line x1="21" y1="52.5" x2="53" y2="52.5"/><line x1="16" y1="60" x2="42" y2="60"/></g>'+close;
if(kind==='drizzle')return open+'<defs>'+CLOUD_GRAD+'</defs>'+cloud('translate(1,-5) scale(0.94)')+'<g class="drops" fill="#bfe3ff"><circle cx="21" cy="47" r="2"/><circle cx="31" cy="47" r="2"/><circle cx="41" cy="47" r="2"/><circle cx="26" cy="55" r="2"/><circle cx="36" cy="55" r="2"/><circle cx="46" cy="55" r="2"/></g>'+close;
if(kind==='rain')return open+'<defs>'+CLOUD_GRAD+'</defs>'+cloud('translate(1,-5) scale(0.94)')+'<g class="drops" stroke="#a9d8ff" stroke-width="3.2" stroke-linecap="round"><line x1="21" y1="46" x2="18.5" y2="55"/><line x1="31" y1="46" x2="28.5" y2="58"/><line x1="41" y1="46" x2="38.5" y2="55"/><line x1="49" y1="46" x2="47" y2="52"/></g>'+close;
if(kind==='snow')return open+'<defs>'+CLOUD_GRAD+'</defs>'+cloud('translate(1,-5) scale(0.94)')+'<g class="flakes" stroke="#eef8ff" stroke-width="2.2" stroke-linecap="round">'+flake(21,49,4)+flake(33,56,4.5)+flake(44,48,3.6)+'</g>'+close;
if(kind==='thunder')return open+'<defs>'+CLOUD_GRAD+'<linearGradient id="bg" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#ffe18d"/><stop offset="1" stop-color="#f5a623"/></linearGradient></defs>'+cloud('translate(1,-7) scale(0.92)')+'<path class="bolt" d="M31 38 L43 38 L36.5 48 L44 48 L26.5 62 L32.5 50.5 L25 50.5 Z" fill="url(#bg)"/>'+close;
return icon('cloudy');
}
var PIN='<svg class="pin" viewBox="0 0 24 24" width="20" height="20" fill="none" stroke="rgba(255,255,255,.85)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 10c0 6-8 12-8 12S4 16 4 10a8 8 0 1 1 16 0Z"/><circle cx="12" cy="10" r="3"/></svg>';
var q=new URLSearchParams(location.search);
var todayStr=new Date().toISOString().slice(0,10);
var lat=parseFloat(q.get('lat'));if(!isFinite(lat))lat=52.52;
var lon=parseFloat(q.get('lon'));if(!isFinite(lon))lon=13.405;
var name=(q.get('name')||'').trim()||'Berlin';
var date=(q.get('date')||'').trim();
if(!/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/.test(date))date=todayStr;
var isPast=date<todayStr;
function applyTheme(t){
var s=document.documentElement.style;
s.setProperty('--bg1',t.bg[0]);s.setProperty('--bg2',t.bg[1]);s.setProperty('--bg3',t.bg[2]);
s.setProperty('--orb1',t.orb1);s.setProperty('--orb2',t.orb2);s.setProperty('--orb3',t.orb3);
s.setProperty('--accent',t.accent);s.setProperty('--halo',t.glow);
}
function fmtTemp(v){return v==null?'\u2014':deg(v)+'\u00b0';}
function renderError(msg){
applyTheme(THEMES.cloudy);
document.title='Weather unavailable';
app.innerHTML=
'<main class="card ecard reveal">'+
'<svg viewBox="0 0 64 64" width="86" height="86" aria-hidden="true" style="filter:drop-shadow(0 10px 22px rgba(10,25,50,.35))">'+
'<defs><linearGradient id="ecg" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#e7eef7"/><stop offset="1" stop-color="#aebfd2"/></linearGradient></defs>'+
'<g transform="translate(1,-2) scale(0.95)"><path d="'+CLOUD+'" fill="url(#ecg)"/></g>'+
'<circle cx="46" cy="46" r="11" fill="#ffd166"/>'+
'<rect x="44.6" y="39.5" width="2.8" height="8.5" rx="1.4" fill="#4a3608"/>'+
'<circle cx="46" cy="51.5" r="1.9" fill="#4a3608"/>'+
'</svg>'+
'<h1 class="etitle">Weather unavailable</h1>'+
'<p class="emsg">We couldn\u2019t load the weather data for this request. Please check your connection or try again.</p>'+
'<p class="edetail">'+esc(msg)+'</p>'+
'<button class="retry" id="retry" type="button">Try again</button>'+
'</main>';
document.getElementById('retry').addEventListener('click',function(){location.reload();});
}
function buildChart(pts,theme){
var W=884,H=190,top=36,bot=14,n=pts.length;
function xs(i){return (i+0.5)*W/n;}
var lo=Infinity,hi=-Infinity;
pts.forEach(function(p){if(p.v<lo)lo=p.v;if(p.v>hi)hi=p.v;});
if(hi-lo<1.5){var m=(hi+lo)/2;hi=m+0.75;lo=m-0.75;}
var pad=(hi-lo)*0.14,hiP=hi+pad+0.3,loP=lo-pad-0.3;
function yv(v){return top+(hiP-v)/(hiP-loP)*(H-top-bot);}
var P=pts.map(function(p,i){return [ +xs(i).toFixed(1), +yv(p.v).toFixed(1) ];});
var d='M'+P[0][0]+' '+P[0][1];
for(var i=0;i<P.length-1;i++){
var p0=P[i>0?i-1:0],p1=P[i],p2=P[i+1],p3=P[i+2<P.length?i+2:P.length-1];
d+='C'+(p1[0]+(p2[0]-p0[0])/6).toFixed(1)+' '+(p1[1]+(p2[1]-p0[1])/6).toFixed(1)+' '+
(p2[0]-(p3[0]-p1[0])/6).toFixed(1)+' '+(p2[1]-(p3[1]-p1[1])/6).toFixed(1)+' '+p2[0]+' '+p2[1];
}
var base=H-bot;
var dArea=d+'L'+P[n-1][0]+' '+base+'L'+P[0][0]+' '+base+'Z';
var grid='';
for(var k=1;k<=3;k++){
var gy=(top+k*(H-top-bot)/4).toFixed(1);
grid+='<line x1="8" x2="'+(W-8)+'" y1="'+gy+'" y2="'+gy+'" stroke="rgba(255,255,255,.09)" stroke-width="1" stroke-dasharray="1 7" stroke-linecap="round"/>';
}
var dots='';
P.forEach(function(pt,i){dots+='<circle class="dot" cx="'+pt[0]+'" cy="'+pt[1]+'" r="2.3" fill="rgba(255,255,255,.9)" style="animation-delay:'+(0.55+i*0.028).toFixed(2)+'s"/>';});
var iMax=0,iMin=0;
pts.forEach(function(p,i){if(p.v>pts[iMax].v)iMax=i;if(p.v<pts[iMin].v)iMin=i;});
function clampX(x){return Math.max(22,Math.min(W-22,x));}
var marks=
'<g class="mark"><circle cx="'+P[iMax][0]+'" cy="'+P[iMax][1]+'" r="8" fill="'+rgba(theme.accent,0.2)+'"/><circle cx="'+P[iMax][0]+'" cy="'+P[iMax][1]+'" r="3.8" fill="'+theme.accent+'"/>'+
'<text x="'+clampX(P[iMax][0])+'" y="'+(P[iMax][1]-13).toFixed(1)+'" text-anchor="middle" font-size="12.5" font-weight="700" fill="'+theme.accent+'">'+deg(pts[iMax].v,1)+'\u00b0</text></g>'+
'<g class="mark"><circle cx="'+P[iMin][0]+'" cy="'+P[iMin][1]+'" r="8" fill="rgba(255,255,255,.14)"/><circle cx="'+P[iMin][0]+'" cy="'+P[iMin][1]+'" r="3.4" fill="rgba(255,255,255,.95)"/>'+
'<text x="'+clampX(P[iMin][0])+'" y="'+(P[iMin][1]+23).toFixed(1)+'" text-anchor="middle" font-size="12.5" font-weight="700" fill="rgba(255,255,255,.85)">'+deg(pts[iMin].v,1)+'\u00b0</text></g>';
var svg=
'<svg id="chartsvg" viewBox="0 0 '+W+' '+H+'" width="'+W+'" height="'+H+'" style="display:block;width:100%;height:auto" aria-hidden="true">'+
'<defs>'+
'<linearGradient id="ag" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="'+rgba(theme.accent,0.3)+'"/><stop offset="1" stop-color="'+rgba(theme.accent,0)+'"/></linearGradient>'+
'<linearGradient id="lg" x1="0" y1="0" x2="1" y2="0"><stop offset="0" stop-color="'+theme.accent2+'"/><stop offset="1" stop-color="'+theme.accent+'"/></linearGradient>'+
'</defs>'+
grid+
'<path class="area" d="'+dArea+'" fill="url(#ag)"/>'+
'<path class="line" d="'+d+'" fill="none" stroke="'+theme.glow+'" stroke-width="6" stroke-linecap="round" stroke-linejoin="round" pathLength="1"/>'+
'<path class="line" d="'+d+'" fill="none" stroke="url(#lg)" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" pathLength="1"/>'+
dots+marks+
'<line id="cx" x1="0" x2="0" y1="'+top+'" y2="'+base+'" stroke="rgba(255,255,255,.4)" stroke-width="1" opacity="0"/>'+
'<circle id="adot" r="4.6" fill="#fff" stroke="'+theme.accent+'" stroke-width="2.5" opacity="0"/>'+
'<rect id="ovl" x="0" y="0" width="'+W+'" height="'+H+'" fill="rgba(0,0,0,0)"/>'+
'</svg><div class="tip" id="tip"></div>';
var strip='<div class="strip" style="grid-template-columns:repeat('+n+',1fr)">'+
pts.map(function(p,i){return '<div class="hcell" data-i="'+i+'"><span class="hh">'+p.h+'</span><span class="ht">'+deg(p.v)+'\u00b0</span></div>';}).join('')+
'</div>';
return {html:'<div class="chartwrap">'+svg+'</div>'+strip,geom:{W:W,n:n,xs:xs,yv:yv}};
}
function wireChart(pts,geom){
var svg=document.getElementById('chartsvg');if(!svg)return;
var ovl=document.getElementById('ovl'),tip=document.getElementById('tip'),
cxl=document.getElementById('cx'),adot=document.getElementById('adot');
var cells=Array.prototype.slice.call(document.querySelectorAll('.hcell'));
function setActive(i){
if(i==null){
tip.style.opacity='0';cxl.setAttribute('opacity','0');adot.setAttribute('opacity','0');
cells.forEach(function(c){c.classList.remove('on');});return;
}
var x=geom.xs(i),y=geom.yv(pts[i].v);
cxl.setAttribute('x1',x);cxl.setAttribute('x2',x);cxl.setAttribute('opacity','0.45');
adot.setAttribute('cx',x);adot.setAttribute('cy',y);adot.setAttribute('opacity','1');
var r=svg.getBoundingClientRect(),s=r.width/geom.W;
tip.innerHTML='<b>'+pts[i].h+':00</b> '+deg(pts[i].v,1)+'\u2009\u00b0C';
tip.style.left=Math.max(52,Math.min(r.width-52,x*s))+'px';
tip.style.top=(y*s-13)+'px';
tip.style.opacity='1';
cells.forEach(function(c,j){c.classList.toggle('on',j===i);});
}
ovl.addEventListener('mousemove',function(e){
var r=svg.getBoundingClientRect();
var mx=(e.clientX-r.left)/r.width*geom.W;
var i=Math.round(mx/geom.W*geom.n-0.5);
setActive(Math.max(0,Math.min(geom.n-1,i)));
});
ovl.addEventListener('mouseleave',function(){setActive(null);});
cells.forEach(function(c){
c.addEventListener('mouseenter',function(){setActive(+c.getAttribute('data-i'));});
c.addEventListener('mouseleave',function(){setActive(null);});
});
}
function render(data){
var daily=(data&&data.daily)||{};
var tmax=num(daily.temperature_2m_max&&daily.temperature_2m_max[0]);
var tmin=num(daily.temperature_2m_min&&daily.temperature_2m_min[0]);
var wc=(daily.weather_code&&daily.weather_code.length)?daily.weather_code[0]:null;
var hourly=(data&&data.hourly)||{};
var times=hourly.time||[],hts=hourly.temperature_2m||[];
var pts=[];
for(var i=0;i<times.length;i++){
var v=hts[i];
if(typeof times[i]==='string'&×[i].indexOf(date)===0&&typeof v==='number'&&isFinite(v))
pts.push({h:times[i].slice(11,13),v:v});
}
if(tmax==null&&tmin==null&&pts.length===0){renderError('The weather service returned no usable data for this date.');return;}
var meta=WMO[wc]||[(wc==null?'Condition unavailable':'Weather code '+wc),'cloudy'];
var condText=meta[0],kind=meta[1];
var theme=THEMES[kind]||THEMES.partly;
applyTheme(theme);
var dObj=new Date(date+'T00:00:00Z');
var dateLabel=isNaN(dObj)?date:dObj.toLocaleDateString('en-GB',{weekday:'long',day:'numeric',month:'long',year:'numeric',timeZone:'UTC'});
var dd=Math.round((dObj-new Date(todayStr+'T00:00:00Z'))/864e5);
var rel=dd===0?'Today':(dd===1?'Tomorrow':(dd===-1?'Yesterday':null));
var coords=Math.abs(lat).toFixed(2)+'\u00b0'+(lat>=0?'N':'S')+' '+Math.abs(lon).toFixed(2)+'\u00b0'+(lon>=0?'E':'W');
var chart={html:'<p class="nodata">Hourly temperatures are unavailable for this date.</p>',geom:null};
if(pts.length>=2)chart=buildChart(pts,theme);
else if(pts.length===1)chart={html:'<p class="nodata">Only one hourly reading available: '+pts[0].h+':00 \u00b7 '+deg(pts[0].v,1)+'\u2009\u00b0C</p>',geom:null};
document.title=name+' \u00b7 '+dateLabel;
app.innerHTML=
'<main class="card reveal">'+
'<div class="tophead reveal" style="animation-delay:.08s">'+
'<div>'+
'<div class="locrow">'+PIN+'<h1 class="loc">'+esc(name)+'</h1></div>'+
'<p class="date">'+dateLabel+'</p>'+
'</div>'+
'<div class="chips">'+
(rel?'<span class="chip chip-acc">'+rel+'</span>':'')+
'<span class="chip">'+(isPast?'Archive':'Forecast')+'</span>'+
'<span class="chip">UTC</span>'+
'<span class="chip">'+coords+'</span>'+
'</div>'+
'</div>'+
'<div class="hero reveal" style="animation-delay:.18s">'+
'<div class="iconwrap">'+icon(kind)+'<div class="cond">'+esc(condText)+'</div></div>'+
'<div class="sp"></div>'+
'<div class="temps">'+
'<div class="tempblock"><div class="lab">High</div><div class="val">'+fmtTemp(tmax)+'</div></div>'+
'<div class="vdiv"></div>'+
'<div class="tempblock low"><div class="lab">Low</div><div class="val">'+fmtTemp(tmin)+'</div></div>'+
'</div>'+
'</div>'+
'<section class="section reveal" style="animation-delay:.3s">'+
'<div class="sechead"><h2>Hourly temperature</h2><span class="met">'+pts.length+' readings \u00b7 \u00b0C \u00b7 UTC</span></div>'+
chart.html+
'</section>'+
'</main>';
if(chart.geom)wireChart(pts,chart.geom);
}
var endpoint=isPast?'/api/om/archive':'/api/om/forecast';
var qs='latitude='+encodeURIComponent(lat)+'&longitude='+encodeURIComponent(lon)+
'&daily=temperature_2m_max,temperature_2m_min,weather_code&hourly=temperature_2m'+
'&timezone=UTC&temperature_unit=celsius&start_date='+date+'&end_date='+date;
fetch(endpoint+'?'+qs)
.then(function(res){
if(!res.ok)throw new Error('The weather service responded with status '+res.status+'.');
return res.json();
})
.then(function(data){
if(data&&data.error)throw new Error(data.reason||'The weather service returned an error.');
try{render(data);}catch(e){renderError(e&&e.message?e.message:'Unexpected rendering error.');}
})
.catch(function(e){
renderError(e&&e.message?e.message:'Unknown network error.');
});
})();
</script>
</body>
</html>L1 —— 廉价的确定性描述量
| bytes 总计 | 28,380 | html / css / js | 627 / 9,321 / 18,432 |
|---|---|---|---|
| dom 节点 | 18 | dom 深度 | 5 |
| css 规则 | 104 | 含 js | 是 |
| brightness | 104.9 | contrast | 16.8 |
| colorfulness | 27.7 | 留白 | 67.3% |
该 slot 的 telemetry
| prompt tokens | 2 | completion tokens | 63,245 |
|---|---|---|---|
| total tokens | 63,247 | wall | 809.6 s |
| cost | — | request id | — |
config.json577 B
{
"N": 2,
"auth": {
"credential_ref": "WCB_NONE",
"method": "oauth-login"
},
"billing": "plan",
"config_id": "claude-fable-5-eff-max--cli--cursor--dev",
"effort": "max",
"family": "claude",
"m": {
"min": 2,
"q": 2
},
"model_id": "claude-fable-5",
"protocol": "cli",
"served_model": "claude-fable-5-max",
"telemetry": {
"completion_tokens": 220327,
"cost_usd": null,
"prompt_tokens": 16,
"total_tokens": 220343,
"wall_ms": 2737596
},
"transport": "cursor-agent-cli-isolated-home",
"vendor_sanction_ref": null
}send-log2.5 KB
{
"N": 2,
"batch_id": "2026-08-13--cursor-s1",
"config_id": "claude-fable-5-eff-max--cli--cursor--dev",
"positions": [
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-08-12T18:26:02.070385+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-12T18:14:01.196818+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-12T18:39:35.332601+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-12T18:26:05.727592+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-12T18:51:17.464920+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-12T18:39:39.582819+00:00"
}
],
"block_index": 1,
"model_reaching_attempt_index": 0,
"slot_index": 1,
"terminal_state": "valid",
"variant": "P-q"
},
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-08-12T18:59:50.047963+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-12T18:51:20.790497+00:00"
}
],
"block_index": 1,
"model_reaching_attempt_index": 0,
"slot_index": 1,
"terminal_state": "valid",
"variant": "P-min"
}
],
"retry_policy": {
"max_unreachable_retries": 5,
"rate_limit_backoff": {
"max_attempts": 4,
"max_total_ms": 60000
}
}
}