deepseek-v4-pro-0812 @ none · api

apinone
config
deepseek-v4-pro-0812-eff-none--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 @none · api P-q slot 0 截图

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

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

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

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

  • namematch
  • conditionmatch
  • datematch
  • max tempambiguous展示值:25.3max-equals-min
  • min tempambiguous展示值:25.3max-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, user-scalable=yes">
    <title>Weather Card · Daily</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            background: linear-gradient(145deg, #0b1c2f 0%, #1b3b4f 100%);
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            font-family: 'Inter', 'Segoe UI', system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
            padding: 2rem;
            margin: 0;
        }

        .weather-card {
            width: 100%;
            max-width: 820px;
            background: rgba(255, 255, 255, 0.92);
            backdrop-filter: blur(16px);
            -webkit-backdrop-filter: blur(16px);
            border-radius: 3.5rem;
            box-shadow: 0 30px 60px rgba(0, 0, 0, 0.45), 0 12px 30px rgba(0, 0, 0, 0.3);
            padding: 2.5rem 2.8rem;
            transition: all 0.2s ease;
            border: 1px solid rgba(255, 255, 255, 0.4);
            color: #132c33;
        }

        .location-date {
            display: flex;
            justify-content: space-between;
            align-items: baseline;
            flex-wrap: wrap;
            gap: 0.8rem 1.5rem;
            margin-bottom: 2.2rem;
        }

        .location-name {
            font-weight: 700;
            font-size: 2.8rem;
            letter-spacing: -0.02em;
            line-height: 1.1;
            color: #0b2b36;
            text-shadow: 0 1px 2px rgba(255, 255, 255, 0.8);
            display: flex;
            align-items: center;
            gap: 0.5rem;
        }

        .location-name::before {
            content: "📍";
            font-size: 2.2rem;
            filter: drop-shadow(0 2px 4px rgba(0,0,0,0.2));
        }

        .date-display {
            font-weight: 500;
            font-size: 1.5rem;
            background: rgba(20, 45, 55, 0.08);
            padding: 0.4rem 1.4rem;
            border-radius: 40px;
            color: #1d454e;
            letter-spacing: 0.3px;
            backdrop-filter: blur(4px);
            white-space: nowrap;
        }

        .temp-summary {
            display: flex;
            align-items: center;
            justify-content: center;
            flex-wrap: wrap;
            gap: 1.8rem 2.8rem;
            margin: 1.5rem 0 2.2rem;
            background: rgba(220, 240, 245, 0.5);
            border-radius: 80px;
            padding: 1.6rem 2rem;
            box-shadow: inset 0 1px 4px rgba(255,255,255,0.8), 0 6px 14px rgba(0, 20, 30, 0.1);
        }

        .temp-main {
            display: flex;
            align-items: baseline;
            gap: 1.4rem;
        }

        .temp-high {
            font-size: 4.2rem;
            font-weight: 700;
            color: #b33a3a;
            line-height: 1;
            letter-spacing: -0.03em;
            text-shadow: 0 4px 8px rgba(160, 30, 30, 0.2);
        }

        .temp-low {
            font-size: 3rem;
            font-weight: 500;
            color: #2a5f6b;
            line-height: 1;
            opacity: 0.95;
        }

        .temp-unit {
            font-size: 1.8rem;
            font-weight: 500;
            color: #425e66;
            margin-left: 0.2rem;
        }

        .condition-badge {
            display: flex;
            align-items: center;
            gap: 0.7rem;
            background: #ffffffdd;
            padding: 0.6rem 1.7rem;
            border-radius: 60px;
            font-weight: 600;
            font-size: 1.5rem;
            color: #1c3a42;
            box-shadow: 0 4px 10px rgba(0,0,0,0.05);
            backdrop-filter: blur(8px);
            letter-spacing: -0.2px;
        }

        .weather-icon {
            font-size: 2.4rem;
            filter: drop-shadow(0 4px 6px rgba(0,0,0,0.15));
        }

        .hourly-section {
            margin-top: 1.8rem;
        }

        .hourly-title {
            font-size: 1.1rem;
            font-weight: 600;
            text-transform: uppercase;
            letter-spacing: 1.2px;
            color: #3d5b63;
            margin-bottom: 1rem;
            border-bottom: 2px dashed #b5cfd6;
            padding-bottom: 0.5rem;
        }

        .hourly-grid {
            display: flex;
            flex-wrap: wrap;
            gap: 0.6rem;
            justify-content: flex-start;
        }

        .hour-item {
            background: #f2f9fc;
            border-radius: 40px;
            padding: 0.55rem 0.8rem;
            min-width: 72px;
            display: flex;
            flex-direction: column;
            align-items: center;
            box-shadow: 0 2px 6px rgba(30, 60, 70, 0.06);
            border: 1px solid rgba(255, 255, 255, 0.7);
            transition: 0.15s;
            backdrop-filter: blur(2px);
            color: #17404b;
        }

        .hour-time {
            font-size: 0.8rem;
            font-weight: 600;
            color: #3f656f;
            letter-spacing: 0.3px;
        }

        .hour-temp {
            font-size: 1.3rem;
            font-weight: 650;
            margin-top: 2px;
            color: #122b33;
        }

        .error-message {
            background: #ffebee;
            color: #b71c1c;
            padding: 1.2rem 2rem;
            border-radius: 60px;
            font-weight: 600;
            text-align: center;
            font-size: 1.4rem;
            margin: 2rem 0;
            border: 1px solid #ffcdd2;
        }

        .loading-message {
            text-align: center;
            font-size: 1.6rem;
            font-weight: 500;
            color: #315c68;
            padding: 2rem;
        }

        @media (max-width: 700px) {
            .weather-card { padding: 1.6rem; }
            .temp-high { font-size: 3.2rem; }
            .location-name { font-size: 2.2rem; }
        }
    </style>
</head>
<body>
    <div class="weather-card" id="weatherCard">
        <div class="loading-message">⏳ Loading weather…</div>
    </div>

    <script>
        (function() {
            // ---------- Read URL query + defaults ----------
            const params = new URLSearchParams(window.location.search);
            const defaultLat = 52.52;
            const defaultLon = 13.405;
            const defaultName = "Berlin";
            
            // default date = today UTC (YYYY-MM-DD)
            const todayUTC = new Date();
            const defaultDateStr = todayUTC.toISOString().slice(0, 10);
            
            const lat = params.get('lat');
            const lon = params.get('lon');
            const nameParam = params.get('name');
            const dateParam = params.get('date');
            
            const latitude = lat ? lat : defaultLat;
            const longitude = lon ? lon : defaultLon;
            const locationName = nameParam ? nameParam.trim() : defaultName;
            const requestedDate = dateParam ? dateParam : defaultDateStr;
            
            // ---------- WMO weather code mapping ----------
            const weatherCodeMap = {
                0:  { condition: "Clear sky", icon: "☀️" },
                1:  { condition: "Mainly clear", icon: "🌤️" },
                2:  { condition: "Partly cloudy", icon: "⛅" },
                3:  { condition: "Overcast", icon: "☁️" },
                45: { condition: "Fog", icon: "🌫️" },
                48: { condition: "Depositing rime fog", icon: "🌁" },
                51: { condition: "Light drizzle", icon: "🌦️" },
                53: { condition: "Moderate drizzle", icon: "🌦️" },
                55: { condition: "Dense drizzle", icon: "🌧️" },
                56: { condition: "Freezing drizzle", icon: "🌧️❄️" },
                57: { condition: "Freezing drizzle", icon: "🌧️❄️" },
                61: { condition: "Light rain", icon: "🌧️" },
                63: { condition: "Moderate rain", icon: "🌧️" },
                65: { condition: "Heavy rain", icon: "🌧️💧" },
                66: { condition: "Freezing rain", icon: "🌧️❄️" },
                67: { condition: "Freezing rain", icon: "🌧️❄️" },
                71: { condition: "Light snow", icon: "🌨️" },
                73: { condition: "Moderate snow", icon: "🌨️❄️" },
                75: { condition: "Heavy snow", icon: "❄️🌨️" },
                77: { condition: "Snow grains", icon: "🌨️" },
                80: { condition: "Light showers", icon: "🌦️" },
                81: { condition: "Moderate showers", icon: "🌧️" },
                82: { condition: "Violent showers", icon: "⛈️" },
                85: { condition: "Snow showers", icon: "🌨️🌨️" },
                86: { condition: "Snow showers", icon: "🌨️🌨️" },
                95: { condition: "Thunderstorm", icon: "⛈️" },
                96: { condition: "Thunderstorm w/ hail", icon: "⛈️🌨️" },
                99: { condition: "Thunderstorm w/ hail", icon: "⛈️🌨️" }
            };

            function getWeatherInfo(code) {
                if (weatherCodeMap[code]) return weatherCodeMap[code];
                // fallback
                if (code >= 0 && code < 3) return { condition: "Clear/Partly cloudy", icon: "🌤️" };
                if (code >= 3 && code < 50) return { condition: "Cloudy", icon: "☁️" };
                if (code >= 50 && code < 70) return { condition: "Rain/Drizzle", icon: "🌧️" };
                if (code >= 70 && code < 80) return { condition: "Snow", icon: "🌨️" };
                if (code >= 80 && code < 90) return { condition: "Showers", icon: "🌦️" };
                return { condition: "Thunderstorm", icon: "⛈️" };
            }

            // ---------- Determine which API path to use (archive for past, forecast otherwise) ----------
            function isPastDate(dateStr) {
                const now = new Date();
                const todayStr = now.toISOString().slice(0, 10);
                return dateStr < todayStr;
            }

            function buildApiUrl() {
                const baseForecast = '/api/om/forecast';
                const baseArchive = '/api/om/archive';
                const useArchive = isPastDate(requestedDate);
                const base = useArchive ? baseArchive : baseForecast;
                
                const queryParams = new URLSearchParams({
                    latitude: latitude,
                    longitude: longitude,
                    daily: 'temperature_2m_max,temperature_2m_min,weather_code',
                    hourly: 'temperature_2m',
                    timezone: 'UTC',
                    temperature_unit: 'celsius',
                    start_date: requestedDate,
                    end_date: requestedDate
                });
                
                return `${base}?${queryParams.toString()}`;
            }

            function renderError(message = "Weather data could not be loaded.") {
                const card = document.getElementById('weatherCard');
                if (card) {
                    card.innerHTML = `<div class="error-message">🌩️ ${message}</div>`;
                }
            }

            function renderWeather(data) {
                const card = document.getElementById('weatherCard');
                if (!card) return;
                
                try {
                    // Extract daily data
                    const daily = data.daily;
                    const hourly = data.hourly;
                    
                    if (!daily || !hourly) {
                        renderError('Incomplete weather data.');
                        return;
                    }
                    
                    const dailyTime = daily.time ? daily.time[0] : requestedDate;
                    const maxTemp = daily.temperature_2m_max ? daily.temperature_2m_max[0] : '—';
                    const minTemp = daily.temperature_2m_min ? daily.temperature_2m_min[0] : '—';
                    const weatherCode = daily.weather_code ? daily.weather_code[0] : -1;
                    
                    const weatherMeta = getWeatherInfo(weatherCode);
                    
                    // Hourly temperatures for requested date (filter by time startswith date)
                    const hourlyTimes = hourly.time || [];
                    const hourlyTemps = hourly.temperature_2m || [];
                    
                    // Build hourly display items (only those matching the date)
                    const hourlyItems = [];
                    if (hourlyTimes.length === hourlyTemps.length) {
                        for (let i = 0; i < hourlyTimes.length; i++) {
                            const timeStr = hourlyTimes[i];
                            if (typeof timeStr === 'string' && timeStr.startsWith(requestedDate)) {
                                const hour = timeStr.slice(11, 16); // "HH:MM"
                                hourlyItems.push({
                                    hour: hour,
                                    temp: hourlyTemps[i]
                                });
                            }
                        }
                    }
                    
                    // Fallback if no hourly matches: use all hourly (shouldn't happen but safe)
                    if (hourlyItems.length === 0 && hourlyTimes.length > 0) {
                        for (let i = 0; i < hourlyTimes.length; i++) {
                            const timeStr = hourlyTimes[i];
                            const hour = timeStr.includes('T') ? timeStr.split('T')[1].slice(0,5) : timeStr.slice(11,16);
                            hourlyItems.push({
                                hour: hour,
                                temp: hourlyTemps[i] ?? '—'
                            });
                        }
                    }
                    
                    // Build hourly HTML
                    let hourlyHtml = '';
                    if (hourlyItems.length > 0) {
                        const hourCards = hourlyItems.map(item => {
                            const tempDisplay = (item.temp !== undefined && item.temp !== null) ? `${item.temp}°` : '—';
                            return `<div class="hour-item">
                                        <span class="hour-time">${item.hour}</span>
                                        <span class="hour-temp">${tempDisplay}</span>
                                    </div>`;
                        }).join('');
                        hourlyHtml = `
                            <div class="hourly-section">
                                <div class="hourly-title">⌛ Hourly temperatures</div>
                                <div class="hourly-grid">${hourCards}</div>
                            </div>
                        `;
                    } else {
                        hourlyHtml = `<div class="hourly-title" style="margin-top:1rem;">No hourly data available</div>`;
                    }
                    
                    // Format max/min for display (round to 1 decimal, but show as integer if .0)
                    const formatTemp = (val) => {
                        if (val === undefined || val === null || isNaN(val)) return '—';
                        return val % 1 === 0 ? `${val}°` : `${Number(val).toFixed(1)}°`;
                    };
                    
                    const maxDisplay = formatTemp(maxTemp).replace('°', '');
                    const minDisplay = formatTemp(minTemp).replace('°', '');
                    
                    const finalHtml = `
                        <div class="location-date">
                            <span class="location-name">${locationName}</span>
                            <span class="date-display">${requestedDate}</span>
                        </div>
                        
                        <div class="temp-summary">
                            <div class="temp-main">
                                <span class="temp-high">${maxDisplay}°</span>
                                <span style="font-size:2rem; color:#5b7a82;">/</span>
                                <span class="temp-low">${minDisplay}°</span>
                                <span class="temp-unit">C</span>
                            </div>
                            <div class="condition-badge">
                                <span class="weather-icon">${weatherMeta.icon}</span>
                                <span>${weatherMeta.condition}</span>
                            </div>
                        </div>
                        
                        ${hourlyHtml}
                    `;
                    
                    card.innerHTML = finalHtml;
                } catch (e) {
                    console.error('Rendering error:', e);
                    renderError('Failed to render weather data.');
                }
            }

            async function loadWeather() {
                const card = document.getElementById('weatherCard');
                if (card) card.innerHTML = `<div class="loading-message">⏳ Loading weather…</div>`;
                
                try {
                    const apiUrl = buildApiUrl();
                    const response = await fetch(apiUrl);
                    
                    if (!response.ok) {
                        throw new Error(`API responded with status ${response.status}`);
                    }
                    
                    const data = await response.json();
                    
                    // Basic validation
                    if (!data || !data.daily || !data.hourly) {
                        throw new Error('Missing required data fields');
                    }
                    
                    renderWeather(data);
                } catch (error) {
                    console.error('Fetch error:', error);
                    renderError('Weather data could not be loaded. Please check the connection or API.');
                }
            }

            // Start loading
            loadWeather();
        })();
    </script>
</body>
</html>

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

bytes 总计18,449html / css / js400 / 5,820 / 12,229
dom 节点10dom 深度4
css 规则26含 js
brightness126.2contrast97.7
colorfulness25.6留白41.1%

该 slot 的 telemetry

prompt tokens321completion tokens4,262
total tokens4,583wall36.6 s
costrequest id
config.json589 B
{
  "N": 4,
  "auth": {
    "credential_ref": "WCB_DEEPSEEK_KEY",
    "method": "api-key"
  },
  "billing": "metered",
  "config_id": "deepseek-v4-pro-0812-eff-none--api--official--dev",
  "effort": "none",
  "family": "deepseek",
  "m": {
    "min": 4,
    "q": 4
  },
  "model_id": "deepseek-v4-pro-0812",
  "protocol": "api",
  "served_model": "deepseek-v4-pro",
  "telemetry": {
    "completion_tokens": 33121,
    "cost_usd": null,
    "prompt_tokens": 2536,
    "total_tokens": 35657,
    "wall_ms": 314638
  },
  "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-none--api--official--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-08-13T05:34:42.535319+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T05:34:05.738996+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-13T05:35:24.320534+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T05:34:47.723245+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-13T05:36:01.204932+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T05:35:27.742770+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-13T05:36:53.578086+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T05:36:04.631299+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-13T05:37:36.730862+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T05:36:56.483651+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-13T05:38:23.734346+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T05:37:40.378379+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-13T05:39:08.202782+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T05:38:26.910313+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-13T05:39:45.491855+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T05:39:11.546705+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
    }
  }
}