claude-opus-4-8 @ xhigh · kiro
kiroxhigh
- config
- claude-opus-4-8-eff-xhigh--cli--kiro--dev
- batch
- 2026-07-19--unified
- transport
- kiro-cli-isolated-home-github-social
- protocol
- cli · plan
- served model
- claude-opus-4.8
- 采集于
- 2026年7月18日 11:54 · N=2
variant
live
slot 0 · P-q · sandboxed iframe

截图是 similarity 通道测量时的原始像素。运行 live 会在 sandboxed iframe 中重新执行原始输出;渲染结果取决于你的浏览器和字体,不保证与测量像素一致。
similarity 邻居
最近
claude-opus-4-8 @low · kiro0.72claude-fable-5 @high · CC0.70claude-opus-4-8 @high · kiro0.70kimi-k3 @high · api0.70gpt-5.6-sol @xhigh · codex-oauth0.69最远
nemotron-3-ultra-free · api0.42deepseek-v4-flash · go0.44north-mini-code-free · api0.45minimax-m2.5 · kiro0.45grok-4.3 @medium · api0.45限于 session 2026-07-19--unified
similarity 衡量本 session 内的趋同程度 —— 不是质量。
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">
<title>Weather</title>
<style>
:root{
--card-w:1120px;
--card-h:720px;
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}
body{
font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
background:#0b0f14;
color:#fff;
display:flex;
align-items:center;
justify-content:center;
min-height:100vh;
-webkit-font-smoothing:antialiased;
text-rendering:optimizeLegibility;
}
.stage{
position:relative;
width:1280px;
height:800px;
overflow:hidden;
display:flex;
align-items:center;
justify-content:center;
--bg1:#243a4d;
--bg2:#4d6b82;
--accent:#7fc4ff;
background:
radial-gradient(120% 120% at 78% 12%, rgba(255,255,255,0.18), rgba(255,255,255,0) 42%),
linear-gradient(155deg, var(--bg1) 0%, var(--bg2) 100%);
transition:background 900ms ease;
}
/* soft decorative depth */
.blob{
position:absolute;
border-radius:50%;
filter:blur(60px);
opacity:.5;
pointer-events:none;
transition:background 900ms ease;
}
.blob.b1{
width:520px;height:520px;top:-160px;right:-120px;
background:radial-gradient(circle at 30% 30%, var(--accent), transparent 65%);
opacity:.35;
animation:float1 16s ease-in-out infinite;
}
.blob.b2{
width:460px;height:460px;bottom:-180px;left:-140px;
background:radial-gradient(circle at 60% 40%, #ffffff, transparent 62%);
opacity:.12;
animation:float2 20s ease-in-out infinite;
}
@keyframes float1{0%,100%{transform:translate(0,0)}50%{transform:translate(-26px,24px)}}
@keyframes float2{0%,100%{transform:translate(0,0)}50%{transform:translate(22px,-20px)}}
.card{
position:relative;
z-index:2;
width:var(--card-w);
height:var(--card-h);
padding:40px 48px 34px;
border-radius:34px;
background:rgba(255,255,255,0.10);
border:1px solid rgba(255,255,255,0.20);
box-shadow:
0 40px 90px rgba(0,0,0,0.38),
0 2px 0 rgba(255,255,255,0.08) inset,
0 1px 0 rgba(255,255,255,0.35) inset;
backdrop-filter:blur(22px) saturate(150%);
-webkit-backdrop-filter:blur(22px) saturate(150%);
display:flex;
flex-direction:column;
overflow:hidden;
}
/* ---------- Top bar ---------- */
.top{
display:flex;
align-items:flex-start;
justify-content:space-between;
gap:20px;
}
.loc{
display:flex;
align-items:center;
gap:12px;
min-width:0;
}
.loc .pin{
width:22px;height:22px;flex:none;opacity:.85;
}
.loc h1{
font-size:34px;
font-weight:650;
letter-spacing:-0.02em;
line-height:1.1;
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
}
.date{
text-align:right;
line-height:1.25;
flex:none;
}
.date .d-main{font-size:17px;font-weight:600;letter-spacing:.01em}
.date .d-sub{font-size:13px;color:rgba(255,255,255,0.62);margin-top:2px;letter-spacing:.04em;text-transform:uppercase}
/* ---------- Hero ---------- */
.hero{
margin-top:22px;
display:flex;
align-items:center;
gap:34px;
}
.wx-icon{width:150px;height:150px;flex:none;filter:drop-shadow(0 10px 22px rgba(0,0,0,0.28))}
.hero-mid{flex:1;min-width:0}
.cond{
font-size:46px;
font-weight:600;
letter-spacing:-0.02em;
line-height:1.05;
}
.cond-sub{
margin-top:12px;
font-size:16px;
color:rgba(255,255,255,0.72);
display:flex;
align-items:center;
gap:16px;
flex-wrap:wrap;
}
.chip{
display:inline-flex;
align-items:center;
gap:8px;
padding:7px 14px;
border-radius:999px;
background:rgba(255,255,255,0.12);
border:1px solid rgba(255,255,255,0.16);
font-size:14px;
font-weight:500;
color:#fff;
}
.chip .dot{width:9px;height:9px;border-radius:50%}
.temps{
flex:none;
text-align:right;
display:flex;
flex-direction:column;
align-items:flex-end;
}
.t-label{font-size:13px;letter-spacing:.16em;text-transform:uppercase;color:rgba(255,255,255,0.6)}
.t-hi{
display:flex;
align-items:flex-start;
line-height:0.9;
margin-top:2px;
}
.t-hi .val{font-size:104px;font-weight:300;letter-spacing:-0.04em}
.t-hi .deg{font-size:44px;font-weight:300;margin-top:8px;color:rgba(255,255,255,0.8)}
.t-lo{
margin-top:8px;
font-size:20px;
font-weight:500;
color:rgba(255,255,255,0.78);
}
.t-lo b{font-weight:600;color:#fff}
/* ---------- Chart ---------- */
.chart-head{
margin-top:20px;
display:flex;
align-items:baseline;
justify-content:space-between;
}
.chart-head h2{font-size:15px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:rgba(255,255,255,0.72)}
.chart-head .unit{font-size:13px;color:rgba(255,255,255,0.5)}
.chart-wrap{
flex:1;
margin-top:6px;
min-height:0;
display:flex;
}
.chart-wrap svg{width:100%;height:100%;display:block;overflow:visible}
.grid line{stroke:rgba(255,255,255,0.12)}
.grid text{fill:rgba(255,255,255,0.5);font-size:12px}
.axis text{fill:rgba(255,255,255,0.6);font-size:12px}
.line{fill:none;stroke:var(--accent);stroke-width:3;stroke-linecap:round;stroke-linejoin:round;
filter:drop-shadow(0 6px 10px rgba(0,0,0,0.22))}
.dot{fill:rgba(255,255,255,0.55)}
.mk{fill:var(--accent);stroke:#fff;stroke-width:2}
.vlabel{fill:rgba(255,255,255,0.75);font-size:12px;font-weight:500}
.vlabel.hi{fill:#fff;font-size:13px;font-weight:700}
.vlabel.lo{fill:rgba(255,255,255,0.82);font-size:13px;font-weight:700}
.now line{stroke:var(--accent);stroke-width:1.5;stroke-dasharray:4 4;opacity:.8}
.now text{fill:var(--accent);font-size:11px;font-weight:700;letter-spacing:.1em}
/* ---------- Footer ---------- */
.foot{
margin-top:14px;
display:flex;
align-items:center;
justify-content:space-between;
font-size:12.5px;
color:rgba(255,255,255,0.55);
letter-spacing:.02em;
}
.foot .src{display:flex;align-items:center;gap:8px}
/* ---------- States ---------- */
.center{
flex:1;
display:flex;
flex-direction:column;
align-items:center;
justify-content:center;
text-align:center;
gap:18px;
}
.spinner{
width:52px;height:52px;border-radius:50%;
border:4px solid rgba(255,255,255,0.22);
border-top-color:#fff;
animation:spin 0.9s linear infinite;
}
.center p{font-size:17px;color:rgba(255,255,255,0.82)}
.center .err-title{font-size:24px;font-weight:600}
.center .err-detail{font-size:14px;color:rgba(255,255,255,0.6);max-width:560px}
.err-icon{width:120px;height:120px;opacity:.9}
/* ---------- Icon animations ---------- */
@keyframes spin{to{transform:rotate(360deg)}}
.sun-rays{transform-origin:60px 60px;animation:spin 46s linear infinite}
.sun-core{transform-origin:60px 60px;animation:pulse 4.5s ease-in-out infinite}
@keyframes pulse{0%,100%{transform:scale(1)}50%{transform:scale(1.06)}}
.cloud{animation:drift 7s ease-in-out infinite}
@keyframes drift{0%,100%{transform:translateX(0)}50%{transform:translateX(4px)}}
.drop{animation:fall 1.5s linear infinite;transform-origin:center}
.drop:nth-child(2){animation-delay:.3s}
.drop:nth-child(3){animation-delay:.6s}
.drop:nth-child(4){animation-delay:.9s}
@keyframes fall{0%{transform:translateY(-4px);opacity:0}20%{opacity:1}100%{transform:translateY(16px);opacity:0}}
.flake{animation:flakefall 3s linear infinite}
.flake:nth-child(2){animation-delay:1s}
.flake:nth-child(3){animation-delay:2s}
@keyframes flakefall{0%{transform:translateY(-4px);opacity:0}25%{opacity:1}100%{transform:translateY(18px);opacity:0}}
.bolt{animation:flash 2.6s ease-in-out infinite}
@keyframes flash{0%,55%,100%{opacity:.35}60%,70%{opacity:1}}
.fogline{animation:fogmove 5s ease-in-out infinite}
.fogline:nth-child(2){animation-delay:.8s}
.fogline:nth-child(3){animation-delay:1.6s}
@keyframes fogmove{0%,100%{transform:translateX(-3px);opacity:.6}50%{transform:translateX(5px);opacity:1}}
</style>
</head>
<body>
<div class="stage" id="stage">
<div class="blob b1"></div>
<div class="blob b2"></div>
<div class="card" id="card">
<div class="center">
<div class="spinner"></div>
<p>Loading weather…</p>
</div>
</div>
</div>
<script>
(function(){
"use strict";
/* ---------- helpers ---------- */
function esc(s){
return String(s).replace(/[&<>"']/g,function(c){
return {'&':'&','<':'<','>':'>','"':'"',"'":'''}[c];
});
}
function num(v,d){ var n=parseFloat(v); return isFinite(n)?n:d; }
function r1(n){ return (Math.round(n*10)/10).toString(); }
/* ---------- read params ---------- */
var q = new URLSearchParams(location.search);
var lat = num(q.get('lat'), 52.52);
var lon = num(q.get('lon'), 13.405);
var name = ((q.get('name')||'Berlin').trim()) || 'Berlin';
var date = q.get('date') || '';
var todayUTC = new Date().toISOString().slice(0,10);
if(!/^\d{4}-\d{2}-\d{2}$/.test(date)){ date = todayUTC; }
var isPast = date < todayUTC;
var isToday = date === todayUTC;
/* ---------- weather code mapping ---------- */
function wmo(code){
var m = {
0:['Clear sky','clear'], 1:['Mainly clear','clear'],
2:['Partly cloudy','partly'], 3:['Overcast','cloudy'],
45:['Fog','fog'], 48:['Rime fog','fog'],
51:['Light drizzle','drizzle'], 53:['Drizzle','drizzle'], 55:['Dense drizzle','drizzle'],
56:['Freezing drizzle','drizzle'], 57:['Freezing drizzle','drizzle'],
61:['Slight rain','rain'], 63:['Rain','rain'], 65:['Heavy rain','rain'],
66:['Freezing rain','rain'], 67:['Freezing rain','rain'],
71:['Slight snow','snow'], 73:['Snow','snow'], 75:['Heavy snow','snow'], 77:['Snow grains','snow'],
80:['Rain showers','rain'], 81:['Rain showers','rain'], 82:['Violent showers','rain'],
85:['Snow showers','snow'], 86:['Snow showers','snow'],
95:['Thunderstorm','thunder'], 96:['Thunderstorm, hail','thunder'], 99:['Thunderstorm, hail','thunder']
};
return m[code] || ['Unknown','cloudy'];
}
/* ---------- themes ---------- */
var themes = {
clear: {bg1:'#2a72c9', bg2:'#8fc7f5', accent:'#ffd35e'},
partly: {bg1:'#4577b3', bg2:'#9cc0e6', accent:'#ffdf87'},
cloudy: {bg1:'#54606e', bg2:'#96a3b1', accent:'#dbe6f0'},
fog: {bg1:'#6a7580', bg2:'#aab4bd', accent:'#e6ecf1'},
drizzle:{bg1:'#3a5c7c', bg2:'#7ba0c0', accent:'#9fd6ff'},
rain: {bg1:'#213a52', bg2:'#4f7091', accent:'#7fc4ff'},
snow: {bg1:'#5f83a6', bg2:'#cbe2f3', accent:'#eaf6ff'},
thunder:{bg1:'#282142', bg2:'#544878', accent:'#c9a8ff'}
};
function applyTheme(cat){
var t = themes[cat] || themes.cloudy;
var s = document.getElementById('stage');
s.style.setProperty('--bg1', t.bg1);
s.style.setProperty('--bg2', t.bg2);
s.style.setProperty('--accent', t.accent);
return t;
}
/* ---------- icons ---------- */
function cloud(cls){
return '<g class="cloud '+(cls||'')+'">'
+ '<ellipse cx="42" cy="76" rx="21" ry="17"/>'
+ '<ellipse cx="66" cy="64" rx="25" ry="22"/>'
+ '<ellipse cx="88" cy="78" rx="16" ry="15"/>'
+ '<rect x="34" y="70" width="58" height="24" rx="12"/>'
+ '</g>';
}
function sun(cx,cy,rc,rr){
var rays='';
for(var i=0;i<12;i++){
var a=i*30*Math.PI/180;
var x1=cx+Math.cos(a)*(rc+6), y1=cy+Math.sin(a)*(rc+6);
var x2=cx+Math.cos(a)*(rc+rr), y2=cy+Math.sin(a)*(rc+rr);
rays+='<line x1="'+x1.toFixed(1)+'" y1="'+y1.toFixed(1)+'" x2="'+x2.toFixed(1)+'" y2="'+y2.toFixed(1)+'"/>';
}
return '<g class="sun" stroke="#ffd86b" stroke-width="5" stroke-linecap="round">'
+ '<g class="sun-rays">'+rays+'</g>'
+ '<circle class="sun-core" cx="'+cx+'" cy="'+cy+'" r="'+rc+'" fill="#ffd35e" stroke="none"/>'
+ '</g>';
}
function makeIcon(cat){
var open='<svg class="wx-icon" viewBox="0 0 120 120" aria-hidden="true">';
var close='</svg>';
var cloudFill='<g fill="#f2f6fb">';
switch(cat){
case 'clear':
return open + sun(60,60,26,16) + close;
case 'partly':
return open
+ sun(44,44,17,11)
+ cloudFill + cloud('') + '</g>'
+ close;
case 'cloudy':
return open + cloudFill + cloud('') + '</g>' + close;
case 'fog':
return open + cloudFill + cloud('') + '</g>'
+ '<g stroke="#dfe7ef" stroke-width="5" stroke-linecap="round">'
+ '<line class="fogline" x1="30" y1="102" x2="90" y2="102"/>'
+ '<line class="fogline" x1="40" y1="112" x2="98" y2="112"/>'
+ '<line class="fogline" x1="26" y1="112" x2="34" y2="112"/>'
+ '</g>' + close;
case 'drizzle':
return open + cloudFill + cloud('') + '</g>'
+ '<g fill="#9fd6ff">'
+ '<circle class="drop" cx="46" cy="100" r="3.2"/>'
+ '<circle class="drop" cx="64" cy="100" r="3.2"/>'
+ '<circle class="drop" cx="82" cy="100" r="3.2"/>'
+ '</g>' + close;
case 'rain':
return open + cloudFill + cloud('') + '</g>'
+ '<g fill="#7fc4ff">'
+ '<path class="drop" d="M46 98 q4 6 0 10 q-4 -4 0 -10z"/>'
+ '<path class="drop" d="M62 100 q4 6 0 10 q-4 -4 0 -10z"/>'
+ '<path class="drop" d="M78 98 q4 6 0 10 q-4 -4 0 -10z"/>'
+ '<path class="drop" d="M92 100 q4 6 0 10 q-4 -4 0 -10z"/>'
+ '</g>' + close;
case 'snow':
return open + cloudFill + cloud('') + '</g>'
+ '<g fill="#eaf6ff">'
+ '<circle class="flake" cx="48" cy="102" r="3.6"/>'
+ '<circle class="flake" cx="66" cy="102" r="3.6"/>'
+ '<circle class="flake" cx="84" cy="102" r="3.6"/>'
+ '</g>' + close;
case 'thunder':
return open + '<g fill="#c9c3d6">' + cloud('') + '</g>'
+ '<polygon class="bolt" points="60,92 74,92 62,106 72,106 52,124 58,108 48,108" fill="#ffd35e"/>'
+ close;
default:
return open + cloudFill + cloud('') + '</g>' + close;
}
}
/* ---------- date formatting ---------- */
function fmtDate(iso){
var p = iso.split('-');
var dt = new Date(Date.UTC(+p[0], (+p[1])-1, +p[2]));
var main = new Intl.DateTimeFormat('en-GB',
{weekday:'long', day:'numeric', month:'long', year:'numeric', timeZone:'UTC'}).format(dt);
return main;
}
function relLabel(){
if(isToday) return 'Today';
if(isPast) return 'Past · archive';
return 'Forecast';
}
/* ---------- chart ---------- */
function smoothPath(pts){
if(pts.length < 2) return '';
var d = 'M '+pts[0][0].toFixed(1)+' '+pts[0][1].toFixed(1);
for(var i=0;i<pts.length-1;i++){
var p0=pts[i-1]||pts[i], p1=pts[i], p2=pts[i+1], p3=pts[i+2]||p2;
var c1x=p1[0]+(p2[0]-p0[0])/6, c1y=p1[1]+(p2[1]-p0[1])/6;
var c2x=p2[0]-(p3[0]-p1[0])/6, c2y=p2[1]-(p3[1]-p1[1])/6;
d+=' C '+c1x.toFixed(1)+' '+c1y.toFixed(1)+' '+c2x.toFixed(1)+' '+c2y.toFixed(1)
+' '+p2[0].toFixed(1)+' '+p2[1].toFixed(1);
}
return d;
}
function buildChart(times, temps, accent){
var data = [];
for(var i=0;i<temps.length;i++){
var t = temps[i];
if(t===null || t===undefined || isNaN(t)) continue;
var hh = times[i] ? parseInt(times[i].slice(11,13),10) : i;
data.push({h:hh, t:+t});
}
if(data.length < 2){
return '<div style="color:rgba(255,255,255,.7);font-size:15px">Hourly temperatures are unavailable for this date.</div>';
}
var VW=1000, VH=300, padL=46, padR=26, padT=34, padB=34;
var plotW=VW-padL-padR, plotH=VH-padT-padB;
var tvals = data.map(function(d){return d.t;});
var dataMin=Math.min.apply(null,tvals), dataMax=Math.max.apply(null,tvals);
var span = dataMax-dataMin;
var pad = Math.max(1, span*0.18);
var lo=dataMin-pad, hi=dataMax+pad;
if(hi===lo){ hi=lo+1; }
var n=data.length;
function X(i){ return padL + (n===1?0:(i/(n-1))*plotW); }
function Y(t){ return padT + (1-(t-lo)/(hi-lo))*plotH; }
var baseY = padT+plotH;
var pts = data.map(function(d,i){ return [X(i), Y(d.t)]; });
// gridlines + y labels
var grid='<g class="grid">';
for(var k=0;k<=3;k++){
var gy=padT + (plotH*k/3);
var gv=hi-(hi-lo)*k/3;
grid+='<line x1="'+padL+'" y1="'+gy.toFixed(1)+'" x2="'+(padL+plotW)+'" y2="'+gy.toFixed(1)+'"/>';
grid+='<text x="'+(padL-10)+'" y="'+(gy+4).toFixed(1)+'" text-anchor="end">'+Math.round(gv)+'°</text>';
}
grid+='</g>';
// area + line
var line = smoothPath(pts);
var area = line + ' L '+pts[n-1][0].toFixed(1)+' '+baseY
+ ' L '+pts[0][0].toFixed(1)+' '+baseY + ' Z';
// find max/min index (first occurrence)
var iMax=0, iMin=0;
for(var j=1;j<data.length;j++){
if(data[j].t>data[iMax].t) iMax=j;
if(data[j].t<data[iMin].t) iMin=j;
}
// dots, markers, value labels, x-axis labels
var dots='', marks='', vlabels='', xaxis='<g class="axis">';
for(var m=0;m<data.length;m++){
var px=pts[m][0], py=pts[m][1], hour=data[m].h;
dots+='<circle class="dot" cx="'+px.toFixed(1)+'" cy="'+py.toFixed(1)+'" r="2.4"/>';
if(hour%3===0){
xaxis+='<text x="'+px.toFixed(1)+'" y="'+(baseY+22)+'" text-anchor="middle">'
+ (hour<10?'0'+hour:hour) + ':00</text>';
}
if(m===iMax){
marks+='<circle class="mk" cx="'+px.toFixed(1)+'" cy="'+py.toFixed(1)+'" r="5.5"/>';
vlabels+='<text class="vlabel hi" x="'+px.toFixed(1)+'" y="'+(py-14).toFixed(1)+'" text-anchor="middle">'+Math.round(data[m].t)+'°</text>';
} else if(m===iMin){
marks+='<circle class="mk" cx="'+px.toFixed(1)+'" cy="'+py.toFixed(1)+'" r="5.5"/>';
vlabels+='<text class="vlabel lo" x="'+px.toFixed(1)+'" y="'+(py+22).toFixed(1)+'" text-anchor="middle">'+Math.round(data[m].t)+'°</text>';
} else if(hour%3===0){
vlabels+='<text class="vlabel" x="'+px.toFixed(1)+'" y="'+(py-12).toFixed(1)+'" text-anchor="middle">'+Math.round(data[m].t)+'°</text>';
}
}
xaxis+='</g>';
// "now" marker (only for today, if hour within data)
var nowMark='';
if(isToday){
var nh = new Date().getUTCHours();
var idx=-1;
for(var z=0;z<data.length;z++){ if(data[z].h===nh){ idx=z; break; } }
if(idx>=0){
var nx=pts[idx][0];
nowMark='<g class="now"><line x1="'+nx.toFixed(1)+'" y1="'+padT+'" x2="'+nx.toFixed(1)+'" y2="'+baseY+'"/>'
+'<text x="'+nx.toFixed(1)+'" y="'+(padT-8)+'" text-anchor="middle">NOW</text></g>';
}
}
var svg='<svg viewBox="0 0 '+VW+' '+VH+'" preserveAspectRatio="none" role="img" aria-label="Hourly temperature chart">'
+ '<defs><linearGradient id="areaFill" x1="0" y1="0" x2="0" y2="1">'
+ '<stop offset="0%" stop-color="'+accent+'" stop-opacity="0.42"/>'
+ '<stop offset="100%" stop-color="'+accent+'" stop-opacity="0"/>'
+ '</linearGradient></defs>'
+ grid
+ '<path d="'+area+'" fill="url(#areaFill)"/>'
+ '<path class="line" d="'+line+'"/>'
+ dots + marks + nowMark + vlabels + xaxis
+ '</svg>';
return svg;
}
/* ---------- rendering ---------- */
var card = document.getElementById('card');
function renderError(title, detail){
applyTheme('cloudy');
card.innerHTML =
'<div class="center">'
+ makeIcon('cloudy')
+ '<div class="err-title">'+esc(title)+'</div>'
+ '<div class="err-detail">'+esc(detail)+'</div>'
+ '</div>';
}
function renderData(d){
var daily = d.daily || {};
var hourly = d.hourly || {};
var tmax = daily.temperature_2m_max && daily.temperature_2m_max[0];
var tmin = daily.temperature_2m_min && daily.temperature_2m_min[0];
var code = daily.weather_code && daily.weather_code[0];
if(tmax===null || tmax===undefined || tmin===null || tmin===undefined){
renderError('No data for this date',
'The weather service returned an empty result for '+name+' on '+date+'. '
+ 'Past dates may not yet be present in the archive.');
return;
}
var info = wmo(code);
var label = info[0], cat = info[1];
var theme = applyTheme(cat);
document.title = name + ' · ' + Math.round(tmax) + '° / ' + Math.round(tmin) + '°';
var chart = buildChart(hourly.time || [], hourly.temperature_2m || [], theme.accent);
card.innerHTML =
'<div class="top">'
+ '<div class="loc">'
+ '<svg class="pin" viewBox="0 0 24 24" fill="none" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 21s-7-6.4-7-11a7 7 0 0 1 14 0c0 4.6-7 11-7 11z"/><circle cx="12" cy="10" r="2.6"/></svg>'
+ '<h1>'+esc(name)+'</h1>'
+ '</div>'
+ '<div class="date">'
+ '<div class="d-main">'+esc(fmtDate(date))+'</div>'
+ '<div class="d-sub">'+esc(relLabel())+'</div>'
+ '</div>'
+ '</div>'
+ '<div class="hero">'
+ makeIcon(cat)
+ '<div class="hero-mid">'
+ '<div class="cond">'+esc(label)+'</div>'
+ '<div class="cond-sub">'
+ '<span class="chip"><span class="dot" style="background:'+theme.accent+'"></span>Daily range '+Math.round(tmin)+'° – '+Math.round(tmax)+'°</span>'
+ '</div>'
+ '</div>'
+ '<div class="temps">'
+ '<div class="t-label">High</div>'
+ '<div class="t-hi"><span class="val">'+Math.round(tmax)+'</span><span class="deg">°C</span></div>'
+ '<div class="t-lo">Low <b>'+Math.round(tmin)+'°C</b></div>'
+ '</div>'
+ '</div>'
+ '<div class="chart-head"><h2>Hourly temperature</h2><span class="unit">°C · UTC</span></div>'
+ '<div class="chart-wrap">'+chart+'</div>'
+ '<div class="foot">'
+ '<span class="src">'+lat.toFixed(3)+'°, '+lon.toFixed(3)+'° · times in UTC</span>'
+ '<span>Data: Open-Meteo compatible API</span>'
+ '</div>';
}
/* ---------- fetch ---------- */
function load(){
var 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: date,
end_date: date
});
var base = isPast ? '/api/om/archive' : '/api/om/forecast';
var url = base + '?' + params.toString();
var ctrl = new AbortController();
var timer = setTimeout(function(){ ctrl.abort(); }, 15000);
fetch(url, {signal: ctrl.signal, headers:{'Accept':'application/json'}})
.then(function(res){
clearTimeout(timer);
if(!res.ok){ throw new Error('HTTP '+res.status+' '+res.statusText); }
return res.json();
})
.then(function(data){
if(data && data.error){ throw new Error(data.reason || 'API error'); }
if(!data || !data.daily){ throw new Error('Malformed response'); }
renderData(data);
})
.catch(function(e){
clearTimeout(timer);
var reason = (e && e.name === 'AbortError')
? 'The request timed out.'
: (e && e.message ? e.message : 'Unknown error');
renderError('Weather data could not be loaded',
'Could not retrieve data for '+name+' ('+lat.toFixed(3)+', '+lon.toFixed(3)+') on '+date+'. '+reason);
});
}
load();
})();
</script>
</body>
</html>L1 —— 廉价的确定性描述量
| bytes 总计 | 23,624 | html / css / js | 455 / 7,991 / 15,178 |
|---|---|---|---|
| dom 节点 | 15 | dom 深度 | 6 |
| css 规则 | 96 | 含 js | 是 |
| brightness | 135.6 | contrast | 21.1 |
| colorfulness | 34.9 | 留白 | 38.7% |
该 slot 的 telemetry
| prompt tokens | 0 | completion tokens | 0 |
|---|---|---|---|
| total tokens | 0 | wall | 310.9 s |
| cost | — | request id | — |
config.json581 B
{
"N": 2,
"auth": {
"credential_ref": "WCB_NONE",
"method": "oauth-login"
},
"billing": "plan",
"config_id": "claude-opus-4-8-eff-xhigh--cli--kiro--dev",
"effort": "xhigh",
"family": "claude",
"m": {
"min": 2,
"q": 2
},
"model_id": "claude-opus-4-8",
"protocol": "cli",
"served_model": "claude-opus-4.8",
"telemetry": {
"completion_tokens": null,
"cost_usd": null,
"prompt_tokens": null,
"total_tokens": null,
"wall_ms": 885296
},
"transport": "kiro-cli-isolated-home-github-social",
"vendor_sanction_ref": null
}send-log2.5 KB
{
"N": 2,
"batch_id": "2026-07-18--kiro-cli",
"config_id": "claude-opus-4-8-eff-xhigh--cli--kiro--dev",
"positions": [
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-07-18T16:21:51.569421+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-18T16:20:49.003681+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-18T16:27:06.183027+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-18T16:21:55.147073+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-18T16:34:43.118505+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-18T16:27:10.123756+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-07-18T16:35:45.739406+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-18T16:34:46.831638+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
}
}
}