deepseek-v4-pro-0812 @ low · api

apilow
config
deepseek-v4-pro-0812-eff-low--api--official--dev
batch
2026-07-19--unified
transport
deepseek-official-api
protocol
api · metered
served model
deepseek-v4-pro
采集于
2026年7月18日 11:54 · N=4
variant
live
slot 0 · P-q · sandboxed iframe
deepseek-v4-pro-0812 @low · api P-q slot 0 截图

输出带 markdown 围栏 — 模型把 HTML 包在代码围栏里返回,提取时已剥离;记录在此以便追溯。

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

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

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

  • namematch
  • conditionmatch
  • datematch
  • max tempambiguous展示值:17max-equals-min
  • min tempambiguous展示值:17max-equals-min
  • 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.0">
    <title>Weather Card</title>
    <style>
        :root {
            --bg-1: #0b1020;
            --bg-2: #121a30;
            --bg-3: #1a2540;
            --card-bg: rgba(255, 255, 255, 0.045);
            --card-border: rgba(255, 255, 255, 0.12);
            --card-shadow: 0 25px 60px rgba(0, 0, 0, 0.45), 0 0 120px rgba(50, 80, 160, 0.08);
            --text-primary: #f0f4fc;
            --text-secondary: #a8b5cc;
            --text-tertiary: #6e7f99;
            --accent-warm: #fbbf24;
            --accent-cool: #60a5fa;
            --divider: rgba(255, 255, 255, 0.08);
            --bar-min-height: 6px;
            --bar-max-height: 130px;
            --font: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
            --radius-card: 22px;
            --radius-bar: 4px;
        }

        *,
        *::before,
        *::after {
            box-sizing: border-box;
            margin: 0;
            padding: 0;
        }

        html,
        body {
            width: 100%;
            height: 100%;
            overflow: hidden;
        }

        body {
            font-family: var(--font);
            background:
                radial-gradient(ellipse 70% 55% at 50% -10%, #1e3a6d 0%, transparent 70%),
                radial-gradient(ellipse 45% 40% at 85% 110%, #1a2d55 0%, transparent 60%),
                radial-gradient(ellipse 50% 35% at 10% 100%, #162545 0%, transparent 55%),
                linear-gradient(165deg, var(--bg-1) 0%, var(--bg-2) 45%, var(--bg-3) 100%);
            display: flex;
            align-items: center;
            justify-content: center;
            -webkit-font-smoothing: antialiased;
            -moz-osx-font-smoothing: grayscale;
            user-select: none;
        }

        .container {
            display: flex;
            align-items: center;
            justify-content: center;
            width: 100%;
            height: 100%;
            padding: 40px;
            animation: fadeInPage 0.6s ease-out both;
        }

        @keyframes fadeInPage {
            0% {
                opacity: 0;
            }
            100% {
                opacity: 1;
            }
        }

        .card {
            background: var(--card-bg);
            backdrop-filter: blur(28px) saturate(1.4);
            -webkit-backdrop-filter: blur(28px) saturate(1.4);
            border: 1px solid var(--card-border);
            border-radius: var(--radius-card);
            box-shadow: var(--card-shadow);
            width: 100%;
            max-width: 760px;
            padding: 44px 48px 40px;
            position: relative;
            overflow: hidden;
            animation: cardAppear 0.7s cubic-bezier(0.22, 1, 0.36, 1) both;
            animation-delay: 0.08s;
        }

        @keyframes cardAppear {
            0% {
                opacity: 0;
                transform: translateY(24px) scale(0.97);
            }
            100% {
                opacity: 1;
                transform: translateY(0) scale(1);
            }
        }

        .card::before {
            content: '';
            position: absolute;
            top: 0;
            left: 0;
            right: 0;
            height: 3px;
            background: linear-gradient(90deg,
                    rgba(96, 165, 250, 0.5) 0%,
                    rgba(251, 191, 36, 0.6) 50%,
                    rgba(96, 165, 250, 0.5) 100%);
            border-radius: var(--radius-card) var(--radius-card) 0 0;
            opacity: 0.7;
        }

        .card::after {
            content: '';
            position: absolute;
            top: -60%;
            right: -25%;
            width: 300px;
            height: 300px;
            background: radial-gradient(circle, rgba(120, 160, 255, 0.07) 0%, transparent 70%);
            border-radius: 50%;
            pointer-events: none;
        }

        .header {
            display: flex;
            flex-direction: column;
            gap: 4px;
            margin-bottom: 30px;
            position: relative;
            z-index: 1;
        }

        .location-row {
            display: flex;
            align-items: center;
            gap: 10px;
        }

        .location-icon {
            font-size: 22px;
            line-height: 1;
            opacity: 0.8;
        }

        .location-name {
            font-size: 34px;
            font-weight: 700;
            letter-spacing: -0.02em;
            color: var(--text-primary);
            line-height: 1.15;
        }

        .date-text {
            font-size: 15px;
            font-weight: 400;
            letter-spacing: 0.01em;
            color: var(--text-secondary);
            margin-top: 2px;
        }

        .main-section {
            display: flex;
            align-items: center;
            gap: 28px;
            margin-bottom: 30px;
            position: relative;
            z-index: 1;
            flex-wrap: wrap;
        }

        .weather-icon-wrapper {
            flex-shrink: 0;
            width: 72px;
            height: 72px;
            display: flex;
            align-items: center;
            justify-content: center;
            background: rgba(255, 255, 255, 0.05);
            border-radius: 50%;
            border: 1px solid rgba(255, 255, 255, 0.1);
        }

        .weather-icon {
            font-size: 44px;
            line-height: 1;
        }

        .temps-block {
            display: flex;
            flex-direction: column;
            gap: 2px;
        }

        .temp-primary {
            display: flex;
            align-items: baseline;
            gap: 8px;
        }

        .max-temp {
            font-size: 56px;
            font-weight: 700;
            letter-spacing: -0.03em;
            color: var(--accent-warm);
            line-height: 1;
            text-shadow: 0 0 30px rgba(251, 191, 36, 0.25);
        }

        .min-temp {
            font-size: 28px;
            font-weight: 500;
            letter-spacing: -0.01em;
            color: var(--accent-cool);
            line-height: 1;
            text-shadow: 0 0 20px rgba(96, 165, 250, 0.2);
        }

        .temp-unit {
            font-size: 20px;
            font-weight: 500;
            color: var(--text-tertiary);
            letter-spacing: 0;
        }

        .condition-text {
            font-size: 16px;
            font-weight: 500;
            color: var(--text-secondary);
            letter-spacing: 0.02em;
            margin-top: 4px;
        }

        .temps-labels {
            display: flex;
            gap: 16px;
            margin-top: 6px;
        }

        .temp-label {
            font-size: 12px;
            font-weight: 500;
            letter-spacing: 0.08em;
            text-transform: uppercase;
            color: var(--text-tertiary);
        }

        .temp-label.warm {
            color: rgba(251, 191, 36, 0.7);
        }
        .temp-label.cool {
            color: rgba(96, 165, 250, 0.7);
        }

        .divider {
            height: 1px;
            background: var(--divider);
            margin: 0 0 24px 0;
            border: none;
            position: relative;
        }

        .divider::after {
            content: '';
            position: absolute;
            top: -1px;
            left: 50%;
            transform: translateX(-50%);
            width: 80px;
            height: 3px;
            background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.15), transparent);
            border-radius: 2px;
        }

        .hourly-section {
            position: relative;
            z-index: 1;
        }

        .hourly-title {
            font-size: 12px;
            font-weight: 600;
            letter-spacing: 0.1em;
            text-transform: uppercase;
            color: var(--text-tertiary);
            margin-bottom: 14px;
        }

        .hourly-chart {
            display: flex;
            align-items: flex-end;
            justify-content: space-between;
            gap: 3px;
            height: 200px;
            padding: 0 2px;
        }

        .hour-item {
            display: flex;
            flex-direction: column;
            align-items: center;
            gap: 5px;
            flex: 1;
            min-width: 0;
            cursor: default;
            transition: transform 0.2s ease;
        }

        .hour-item:hover {
            transform: translateY(-4px);
        }

        .hour-temp-value {
            font-size: 12px;
            font-weight: 600;
            color: var(--text-secondary);
            letter-spacing: -0.02em;
            opacity: 0.85;
            white-space: nowrap;
            transition: opacity 0.2s ease, color 0.2s ease;
        }

        .hour-item:hover .hour-temp-value {
            opacity: 1;
            color: var(--text-primary);
        }

        .bar-wrapper {
            display: flex;
            align-items: flex-end;
            justify-content: center;
            width: 100%;
            flex: 1;
            min-height: 0;
        }

        .bar {
            width: 70%;
            max-width: 22px;
            border-radius: var(--radius-bar) var(--radius-bar) 2px 2px;
            background: linear-gradient(180deg,
                    rgba(255, 255, 255, 0.5) 0%,
                    rgba(255, 255, 255, 0.12) 35%,
                    rgba(255, 255, 255, 0.03) 100%);
            background-blend-mode: overlay;
            box-shadow: 0 0 12px rgba(255, 255, 255, 0.08), inset 0 0 4px rgba(255, 255, 255, 0.05);
            transition: box-shadow 0.25s ease, filter 0.25s ease;
            min-height: var(--bar-min-height);
            position: relative;
        }

        .hour-item:hover .bar {
            box-shadow: 0 0 20px rgba(255, 255, 255, 0.18), 0 0 40px rgba(255, 255, 255, 0.05),
                inset 0 0 6px rgba(255, 255, 255, 0.1);
            filter: brightness(1.2) saturate(1.2);
        }

        .bar::after {
            content: '';
            position: absolute;
            top: 0;
            left: 15%;
            right: 15%;
            height: 3px;
            background: rgba(255, 255, 255, 0.35);
            border-radius: 3px;
            opacity: 0.7;
        }

        .hour-label {
            font-size: 10px;
            font-weight: 500;
            letter-spacing: 0.03em;
            color: var(--text-tertiary);
            white-space: nowrap;
            line-height: 1;
        }

        .error-state {
            display: none;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            padding: 40px 20px;
            text-align: center;
            gap: 12px;
            position: relative;
            z-index: 1;
        }

        .error-state.visible {
            display: flex;
            animation: fadeInPage 0.5s ease-out both;
        }

        .error-icon {
            font-size: 48px;
            opacity: 0.6;
        }

        .error-text {
            font-size: 18px;
            font-weight: 500;
            color: var(--text-secondary);
            letter-spacing: 0.01em;
        }

        .error-subtext {
            font-size: 14px;
            color: var(--text-tertiary);
            max-width: 380px;
            line-height: 1.5;
        }

        .card-content {
            position: relative;
            z-index: 1;
            transition: opacity 0.3s ease;
        }

        .card-content.hidden {
            opacity: 0;
            pointer-events: none;
        }

        @media (max-width: 820px) {
            .card {
                padding: 32px 28px 28px;
                max-width: 92vw;
            }
            .location-name {
                font-size: 28px;
            }
            .max-temp {
                font-size: 44px;
            }
            .min-temp {
                font-size: 22px;
            }
            .weather-icon-wrapper {
                width: 56px;
                height: 56px;
            }
            .weather-icon {
                font-size: 34px;
            }
            .hourly-chart {
                height: 160px;
            }
            .bar {
                max-width: 16px;
            }
            .hour-temp-value {
                font-size: 10px;
            }
            .hour-label {
                font-size: 8px;
            }
        }

        @media (max-width: 560px) {
            .container {
                padding: 16px;
            }
            .card {
                padding: 24px 16px 20px;
                border-radius: 16px;
            }
            .main-section {
                gap: 16px;
                flex-direction: column;
                align-items: flex-start;
            }
            .temps-block {
                gap: 0;
            }
            .max-temp {
                font-size: 38px;
            }
            .min-temp {
                font-size: 20px;
            }
            .hourly-chart {
                gap: 1px;
                height: 120px;
            }
            .bar {
                max-width: 10px;
                border-radius: 3px 3px 1px 1px;
            }
            .hour-temp-value {
                font-size: 8px;
            }
            .hour-label {
                font-size: 7px;
                letter-spacing: 0;
            }
            .location-name {
                font-size: 24px;
            }
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="card">
            <div class="card-content" id="cardContent">
                <div class="header">
                    <div class="location-row">
                        <span class="location-icon">📍</span>
                        <h1 class="location-name" id="locationName">Berlin</h1>
                    </div>
                    <p class="date-text" id="dateText">Loading date…</p>
                </div>
                <div class="main-section">
                    <div class="weather-icon-wrapper">
                        <span class="weather-icon" id="weatherIcon">⏳</span>
                    </div>
                    <div class="temps-block">
                        <div class="temp-primary">
                            <span class="max-temp" id="maxTemp">—</span>
                            <span class="temp-unit">°C</span>
                            <span class="min-temp" id="minTemp">—</span>
                        </div>
                        <div class="condition-text" id="conditionText">Loading…</div>
                        <div class="temps-labels">
                            <span class="temp-label warm">Max</span>
                            <span class="temp-label cool">Min</span>
                        </div>
                    </div>
                </div>
                <hr class="divider">
                <div class="hourly-section">
                    <div class="hourly-title">Hourly Temperatures</div>
                    <div class="hourly-chart" id="hourlyChart"></div>
                </div>
            </div>
            <div class="error-state" id="errorState">
                <span class="error-icon">🌧️</span>
                <div class="error-text">Unable to load weather data</div>
                <div class="error-subtext" id="errorSubtext">Please try again later or check your network connection.</div>
            </div>
        </div>
    </div>

    <script>
        (function() {
            'use strict';

            // ── Weather Code Mapping ───────────────────────────────────────────
            const WEATHER_CODES = {
                0: { desc: 'Clear Sky', icon: '☀️' },
                1: { desc: 'Mainly Clear', icon: '🌤️' },
                2: { desc: 'Partly Cloudy', icon: '⛅' },
                3: { desc: 'Overcast', icon: '☁️' },
                45: { desc: 'Foggy', icon: '🌫️' },
                48: { desc: 'Rime Fog', icon: '🌫️' },
                51: { desc: 'Light Drizzle', icon: '🌦️' },
                53: { desc: 'Drizzle', icon: '🌦️' },
                55: { desc: 'Heavy Drizzle', icon: '🌧️' },
                56: { desc: 'Freezing Drizzle', icon: '🌧️' },
                57: { desc: 'Freezing Drizzle', icon: '🌧️' },
                61: { desc: 'Light Rain', icon: '🌧️' },
                63: { desc: 'Rain', icon: '🌧️' },
                65: { desc: 'Heavy Rain', icon: '🌧️' },
                66: { desc: 'Freezing Rain', icon: '🌧️' },
                67: { desc: 'Freezing Rain', icon: '🌧️' },
                71: { desc: 'Light Snow', icon: '🌨️' },
                73: { desc: 'Snow', icon: '🌨️' },
                75: { desc: 'Heavy Snow', icon: '❄️' },
                77: { desc: 'Snow Grains', icon: '❄️' },
                80: { desc: 'Light Showers', icon: '🌦️' },
                81: { desc: 'Showers', icon: '🌧️' },
                82: { desc: 'Heavy Showers', icon: '🌧️' },
                85: { desc: 'Snow Showers', icon: '🌨️' },
                86: { desc: 'Snow Showers', icon: '🌨️' },
                95: { desc: 'Thunderstorm', icon: '⛈️' },
                96: { desc: 'Thunderstorm w/ Hail', icon: '⛈️' },
                99: { desc: 'Severe Thunderstorm', icon: '⛈️' }
            };

            function getWeatherInfo(code) {
                return WEATHER_CODES[code] || { desc: 'Unknown', icon: '❓' };
            }

            // ── Color Utilities ───────────────────────────────────────────────
            function tempToColor(tempC) {
                // Map temperature to a pleasing color: blue (cold) → teal → green → amber → red (hot)
                const t = Math.max(-15, Math.min(40, tempC));
                const normalized = (t + 15) / 55; // 0 at -15°C → 1 at 40°C
                // Use HSL interpolation: hue 220 (blue) → 0 (red)
                const hue = 220 - normalized * 220;
                const saturation = 75 + normalized * 15;
                const lightness = 48 + normalized * 10;
                return `hsl(${hue}, ${saturation}%, ${lightness}%)`;
            }

            // ── URL Parameter Parsing ─────────────────────────────────────────
            function getQueryParams() {
                const params = new URLSearchParams(window.location.search);
                return {
                    lat: parseFloat(params.get('lat')) || 52.52,
                    lon: parseFloat(params.get('lon')) || 13.405,
                    name: (params.get('name') || 'Berlin').trim() || 'Berlin',
                    date: params.get('date') || getTodayUTC()
                };
            }

            function getTodayUTC() {
                const now = new Date();
                const y = now.getUTCFullYear();
                const m = String(now.getUTCMonth() + 1).padStart(2, '0');
                const d = String(now.getUTCDate()).padStart(2, '0');
                return `${y}-${m}-${d}`;
            }

            function isPastDate(dateStr) {
                const today = getTodayUTC();
                return dateStr < today;
            }

            function formatDateDisplay(dateStr) {
                try {
                    const d = new Date(dateStr + 'T00:00:00Z');
                    return d.toLocaleDateString('en-US', {
                        weekday: 'long',
                        year: 'numeric',
                        month: 'long',
                        day: 'numeric',
                        timeZone: 'UTC'
                    });
                } catch {
                    return dateStr;
                }
            }

            function isValidDateStr(dateStr) {
                return /^\d{4}-\d{2}-\d{2}$/.test(dateStr) && !isNaN(new Date(dateStr + 'T00:00:00Z').getTime());
            }

            // ── API Fetching ──────────────────────────────────────────────────
            function buildApiUrl(basePath, lat, lon, dateStr) {
                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: dateStr,
                    end_date: dateStr
                });
                return `${basePath}?${params.toString()}`;
            }

            async function fetchWeatherData(params) {
                const isPast = isPastDate(params.date);
                const basePath = isPast ? '/api/om/archive' : '/api/om/forecast';
                const url = buildApiUrl(basePath, params.lat, params.lon, params.date);

                const response = await fetch(url, {
                    method: 'GET',
                    headers: {
                        'Accept': 'application/json'
                    },
                    signal: AbortSignal.timeout(20000)
                });

                if (!response.ok) {
                    throw new Error(`HTTP ${response.status}`);
                }

                const data = await response.json();
                return data;
            }

            // ── Data Processing ───────────────────────────────────────────────
            function processWeatherData(data, dateStr) {
                if (!data || !data.daily || !data.hourly) {
                    throw new Error('Incomplete data from API');
                }

                const dailyIndex = (data.daily.time || []).indexOf(dateStr);
                if (dailyIndex === -1) {
                    throw new Error('No daily data for the requested date');
                }

                const maxTemp = data.daily.temperature_2m_max?.[dailyIndex];
                const minTemp = data.daily.temperature_2m_min?.[dailyIndex];
                const weatherCode = data.daily.weather_code?.[dailyIndex];

                if (maxTemp === undefined || minTemp === undefined || weatherCode === undefined) {
                    throw new Error('Missing temperature or weather data');
                }

                // Filter hourly data for the requested date
                const hourlyTimes = data.hourly.time || [];
                const hourlyTemps = data.hourly.temperature_2m || [];
                const hourlyData = [];

                for (let i = 0; i < hourlyTimes.length; i++) {
                    const timeStr = hourlyTimes[i];
                    if (typeof timeStr !== 'string') continue;
                    const datePart = timeStr.split('T')[0];
                    if (datePart === dateStr) {
                        const hour = parseInt(timeStr.split('T')[1]?.split(':')[0] || '0', 10);
                        const temp = hourlyTemps[i];
                        if (typeof temp === 'number' && !isNaN(temp) && hour >= 0 && hour <= 23) {
                            hourlyData.push({ hour, temp });
                        }
                    }
                }

                hourlyData.sort((a, b) => a.hour - b.hour);

                return {
                    maxTemp,
                    minTemp,
                    weatherCode,
                    weatherInfo: getWeatherInfo(weatherCode),
                    hourlyData
                };
            }

            // ── Rendering ─────────────────────────────────────────────────────
            function renderWeather(params, processed) {
                const { name, date } = params;
                const { maxTemp, minTemp, weatherInfo, hourlyData } = processed;

                document.getElementById('locationName').textContent = name;
                document.getElementById('dateText').textContent = formatDateDisplay(date);
                document.getElementById('maxTemp').textContent = Math.round(maxTemp * 10) / 10;
                document.getElementById('minTemp').textContent = Math.round(minTemp * 10) / 10;
                document.getElementById('weatherIcon').textContent = weatherInfo.icon;
                document.getElementById('conditionText').textContent = weatherInfo.desc;

                renderHourlyChart(hourlyData);
            }

            function renderHourlyChart(hourlyData) {
                const chartEl = document.getElementById('hourlyChart');
                chartEl.innerHTML = '';

                if (!hourlyData.length) {
                    const emptyMsg = document.createElement('div');
                    emptyMsg.style.cssText = 'font-size:14px;color:var(--text-tertiary);text-align:center;width:100%;padding:20px 0;';
                    emptyMsg.textContent = 'No hourly data available for this date.';
                    chartEl.appendChild(emptyMsg);
                    return;
                }

                // Compute temperature range for bar scaling
                const temps = hourlyData.map(d => d.temp);
                const minTempVal = Math.min(...temps);
                const maxTempVal = Math.max(...temps);
                const range = maxTempVal - minTempVal || 10; // avoid division by zero
                const paddedMin = minTempVal - range * 0.15;
                const paddedMax = maxTempVal + range * 0.15;
                const totalRange = paddedMax - paddedMin;

                const maxBarHeight = 130;
                const minBarHeight = 6;

                hourlyData.forEach(item => {
                    const container = document.createElement('div');
                    container.className = 'hour-item';

                    const tempVal = document.createElement('span');
                    tempVal.className = 'hour-temp-value';
                    tempVal.textContent = `${Math.round(item.temp)}°`;
                    container.appendChild(tempVal);

                    const barWrapper = document.createElement('div');
                    barWrapper.className = 'bar-wrapper';

                    const bar = document.createElement('div');
                    bar.className = 'bar';
                    const normalized = (item.temp - paddedMin) / totalRange;
                    const barHeight = Math.max(minBarHeight, normalized * maxBarHeight);
                    bar.style.height = `${barHeight}px`;
                    bar.style.backgroundColor = tempToColor(item.temp);
                    barWrapper.appendChild(bar);
                    container.appendChild(barWrapper);

                    const hourLabel = document.createElement('span');
                    hourLabel.className = 'hour-label';
                    hourLabel.textContent = String(item.hour).padStart(2, '0') + ':00';
                    container.appendChild(hourLabel);

                    chartEl.appendChild(container);
                });
            }

            function showError(message) {
                const content = document.getElementById('cardContent');
                const errorEl = document.getElementById('errorState');
                const subtextEl = document.getElementById('errorSubtext');

                content.classList.add('hidden');
                errorEl.classList.add('visible');

                if (message) {
                    subtextEl.textContent = message;
                }
            }

            function hideError() {
                const content = document.getElementById('cardContent');
                const errorEl = document.getElementById('errorState');
                content.classList.remove('hidden');
                errorEl.classList.remove('visible');
            }

            // ── Main Flow ─────────────────────────────────────────────────────
            async function init() {
                const params = getQueryParams();

                if (!isValidDateStr(params.date)) {
                    showError('Invalid date format. Please use YYYY-MM-DD.');
                    return;
                }

                try {
                    const rawData = await fetchWeatherData(params);
                    const processed = processWeatherData(rawData, params.date);
                    hideError();
                    renderWeather(params, processed);
                } catch (err) {
                    console.error('Weather fetch error:', err);
                    let errorDetail = 'Please try again later or check your network connection.';
                    if (err.message.includes('HTTP 404')) {
                        errorDetail = 'No weather data available for this location and date.';
                    } else if (err.message.includes('HTTP 429')) {
                        errorDetail = 'Too many requests. Please wait a moment and try again.';
                    } else if (err.message.includes('AbortError') || err.name === 'TimeoutError') {
                        errorDetail = 'The request timed out. Please check your connection and try again.';
                    } else if (err.message.includes('Incomplete') || err.message.includes('Missing') || err.message.includes(
                            'No daily')) {
                        errorDetail = 'Weather data is incomplete for the requested date.';
                    }
                    showError(errorDetail);
                }
            }

            // ── Boot ──────────────────────────────────────────────────────────
            if (document.readyState === 'loading') {
                document.addEventListener('DOMContentLoaded', init);
            } else {
                init();
            }
        })();
    </script>
</body>
</html>

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

bytes 总计30,679html / css / js2,233 / 13,466 / 14,980
dom 节点36dom 深度9
css 规则76含 js
brightness38.5contrast28.6
colorfulness39.6留白75.7%

该 slot 的 telemetry

prompt tokens321completion tokens13,159
total tokens13,480wall165.5 s
costrequest id
config.json587 B
{
  "N": 4,
  "auth": {
    "credential_ref": "WCB_DEEPSEEK_KEY",
    "method": "api-key"
  },
  "billing": "metered",
  "config_id": "deepseek-v4-pro-0812-eff-low--api--official--dev",
  "effort": "low",
  "family": "deepseek",
  "m": {
    "min": 4,
    "q": 4
  },
  "model_id": "deepseek-v4-pro-0812",
  "protocol": "api",
  "served_model": "deepseek-v4-pro",
  "telemetry": {
    "completion_tokens": 94704,
    "cost_usd": null,
    "prompt_tokens": 2536,
    "total_tokens": 97240,
    "wall_ms": 957095
  },
  "transport": "deepseek-official-api",
  "vendor_sanction_ref": null
}
send-log4.7 KB
{
  "N": 4,
  "batch_id": "2026-08-13--ds-pro-ga",
  "config_id": "deepseek-v4-pro-0812-eff-low--api--official--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-08-13T06:07:57.681523+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T06:06:16.108246+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-13T06:10:46.521187+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T06:08:01.028661+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-13T06:13:03.944344+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T06:10:50.268549+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-13T06:15:07.322516+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T06:13:07.124282+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-13T06:17:05.014694+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T06:15:11.385404+00:00"
        }
      ],
      "block_index": 2,
      "model_reaching_attempt_index": 0,
      "slot_index": 2,
      "terminal_state": "valid",
      "variant": "P-min"
    },
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-08-13T06:18:40.050905+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T06:17:08.092527+00:00"
        }
      ],
      "block_index": 2,
      "model_reaching_attempt_index": 0,
      "slot_index": 2,
      "terminal_state": "valid",
      "variant": "P-q"
    },
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-08-13T06:20:35.382343+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T06:18:43.430798+00:00"
        }
      ],
      "block_index": 3,
      "model_reaching_attempt_index": 0,
      "slot_index": 3,
      "terminal_state": "valid",
      "variant": "P-q"
    },
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-08-13T06:22:37.516373+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T06:20:38.950421+00:00"
        }
      ],
      "block_index": 3,
      "model_reaching_attempt_index": 0,
      "slot_index": 3,
      "terminal_state": "valid",
      "variant": "P-min"
    }
  ],
  "retry_policy": {
    "max_unreachable_retries": 5,
    "rate_limit_backoff": {
      "max_attempts": 4,
      "max_total_ms": 60000
    }
  }
}