minimax-m2.5 · go

go
config
minimax-m2.5--opencode-go--dev
batch
2026-07-19--unified
transport
opencode-go-gateway
protocol
api · plan
served model
minimax-m2.5
captured
Jul 18, 2026, 11:54 AM · N=2
variant
live
slot 0 · P-q · sandboxed iframe
minimax-m2.5 · go P-q slot 0 screenshot

The screenshot is the exact frozen pixels the similarity channels measured. Run live re-executes the raw output in a sandboxed iframe; its rendering depends on your browser and fonts and is not guaranteed to match the measured pixels.

similarity neighbors

within session 2026-07-19--unified

similarity measures convergence within this session — not quality.

Fidelity — does the card show the right data?

  • namematch
  • conditionmatch
  • datematch
  • max tempmatchshown: 25
  • min tempmatchshown: 16
  • hourlyambiguouscoverage · 0 match · 0 mismatch · 24 not shown
  • request sidematch0 violation(s)

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

Source — raw model output, one byte unchanged

download 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 {
  --primary: #667eea;
  --secondary: #764ba2;
  --bg: #f0f2f5;
  --card-bg: #ffffff;
  --text-primary: #2d3748;
  --text-secondary: #718096;
  --max-color: #e53e3e;
  --min-color: #3182ce;
  --accent: #f56565;
}
*,*::before,*::after{box-sizing:border-box}
body{
  margin:0;
  padding:0;
  background:var(--bg);
  font-family:"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
  color:var(--text-primary);
  display:flex;
  justify-content:center;
  align-items:center;
  min-height:100vh;
}
.weather-card{
  background:var(--card-bg);
  border-radius:16px;
  box-shadow:0 10px 40px rgba(0,0,0,0.1);
  width:800px;
  max-width:100%;
  overflow:hidden;
}
.header{
  background:linear-gradient(135deg,var(--primary) 0%,var(--secondary) 100%);
  padding:32px;
  text-align:center;
  color:#fff;
}
.location-name{
  font-size:2.5rem;
  font-weight:700;
  margin-bottom:8px;
  line-height:1.1;
}
.date{
  font-size:1.25rem;
  opacity:0.9;
}
.content{
  padding:32px;
}
.loading,.error{
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:center;
  min-height:300px;
  font-size:1.25rem;
  color:var(--text-secondary);
}
.error{
  color:var(--accent);
  display:none;
}
.spinner{
  width:40px;
  height:40px;
  border:4px solid #e2e8f0;
  border-top-color:var(--primary);
  border-radius:50%;
  animation:spin 1s linear infinite;
  margin-bottom:16px;
}
@keyframes spin{to{transform:rotate(360deg);}}
.temperature-display{
  display:flex;
  justify-content:center;
  align-items:center;
  gap:32px;
  margin-bottom:24px;
}
.temp-box{
  display:flex;
  flex-direction:column;
  align-items:center;
}
.temp-label{
  font-size:0.875rem;
  text-transform:uppercase;
  letter-spacing:0.05em;
  color:var(--text-secondary);
  margin-bottom:4px;
}
.temp-value{
  font-size:4rem;
  font-weight:700;
  line-height:1;
}
.max-temp .temp-value{color:var(--max-color);}
.min-temp .temp-value{color:var(--min-color);}
.weather-condition{
  display:flex;
  align-items:center;
  justify-content:center;
  gap:12px;
  font-size:1.5rem;
  font-weight:600;
  color:var(--text-primary);
  margin-bottom:32px;
}
.weather-icon{
  width:48px;
  height:48px;
  color:var(--secondary);
}
.hourly-section{
  background:var(--bg);
  border-radius:12px;
  padding:24px;
}
.hourly-title{
  font-size:1.125rem;
  font-weight:600;
  margin-bottom:16px;
  color:var(--text-primary);
}
.hourly-chart{
  width:100%;
  height:200px;
  display:block;
}
</style>
</head>
<body>
<div class="weather-card">
  <div class="header">
    <div class="location-name" id="locationName">Loading...</div>
    <div class="date" id="dateDisplay"></div>
  </div>
  <div class="content">
    <div id="loading" class="loading">
      <div class="spinner"></div>
      <span>Loading weather data...</span>
    </div>
    <div id="error" class="error">Unable to load weather data.</div>
    <div id="content" style="display:none;">
      <div class="temperature-display">
        <div class="temp-box max-temp">
          <span class="temp-label">High</span>
          <span class="temp-value" id="maxTemp">--</span>
        </div>
        <div class="temp-box min-temp">
          <span class="temp-label">Low</span>
          <span class="temp-value" id="minTemp">--</span>
        </div>
      </div>
      <div class="weather-condition">
        <span class="weather-icon" id="weatherIcon"></span>
        <span id="weatherCondition">--</span>
      </div>
      <div class="hourly-section">
        <div class="hourly-title">Hourly Temperature</div>
        <canvas id="hourlyChart" class="hourly-chart"></canvas>
      </div>
    </div>
  </div>
</div>
<script>
(function(){
  const weatherConditions={
    0:'Clear sky',1:'Mainly clear',2:'Partly cloudy',3:'Overcast',
    45:'Fog',48:'Depositing rime fog',
    51:'Light drizzle',53:'Moderate drizzle',55:'Dense drizzle',
    56:'Light freezing drizzle',57:'Dense freezing drizzle',
    61:'Slight rain',63:'Moderate rain',65:'Heavy rain',
    66:'Light freezing rain',67:'Heavy freezing rain',
    71:'Slight snow',73:'Moderate snow',75:'Heavy snow',77:'Snow grains',
    80:'Slight rain showers',81:'Moderate rain showers',82:'Violent rain showers',
    85:'Slight snow showers',86:'Heavy snow showers',
    95:'Thunderstorm',96:'Thunderstorm with slight hail',99:'Thunderstorm with heavy hail'
  };
  const weatherIcons={
    0:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="5"/><line x1="12" y1="1" x2="12" y2="3"/><line x1="12" y1="21" x2="12" y2="23"/><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/><line x1="1" y1="12" x2="3" y2="12"/><line x1="21" y1="12" x2="23" y2="12"/><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/></svg>',
    1:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/><circle cx="12" cy="12" r="4"/></svg>',
    2:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 10h-1.26A8 8 0 1 0 9 20h9a5 5 0 0 0 0-10z"/></svg>',
    3:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 10h-1.26A8 8 0 1 0 9 20h9a5 5 0 0 0 0-10z"/></svg>',
    45:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242"/><path d="M16 17H8M12 13v8"/></svg>',
    48:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242"/><path d="M16 17H8M12 13v8"/></svg>',
    51:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M16 13V21M8 13V21M12 15V23M20 16.5A5 5 0 0 0 18 7h-1.26A8 8 0 1 0 6 16h2"/></svg>',
    53:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M16 13V21M8 13V21M12 15V23M20 16.5A5 5 0 0 0 18 7h-1.26A8 8 0 1 0 6 16h2"/></svg>',
    55:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M16 13V21M8 13V21M12 15V23M20 16.5A5 5 0 0 0 18 7h-1.26A8 8 0 1 0 6 16h2"/></svg>',
    61:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M16 13V21M8 13V21M12 15V23M20 16.5A5 5 0 0 0 18 7h-1.26A8 8 0 1 0 6 16h2"/></svg>',
    63:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M16 13V21M8 13V21M12 15V23M20 16.5A5 5 0 0 0 18 7h-1.26A8 8 0 1 0 6 16h2"/></svg>',
    65:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M16 13V21M8 13V21M12 15V23M20 16.5A5 5 0 0 0 18 7h-1.26A8 8 0 1 0 6 16h2"/></svg>',
    71:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 17.58A5 5 0 0 0 18 8h-1.26A8 8 0 1 0 6 16.18"/><path d="M16 11l-4 4l-4-4"/></svg>',
    73:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 17.58A5 5 0 0 0 18 8h-1.26A8 8 0 1 0 6 16.18"/><path d="M16 11l-4 4l-4-4"/></svg>',
    75:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 17.58A5 5 0 0 0 18 8h-1.26A8 8 0 1 0 6 16.18"/><path d="M16 11l-4 4l-4-4"/></svg>',
    77:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 17.58A5 5 0 0 0 18 8h-1.26A8 8 0 1 0 6 16.18"/><path d="M16 11l-4 4l-4-4"/></svg>',
    80:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M16 13V21M8 13V21M12 15V23M20 16.5A5 5 0 0 0 18 7h-1.26A8 8 0 1 0 6 16h2"/></svg>',
    81:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M16 13V21M8 13V21M12 15V23M20 16.5A5 5 0 0 0 18 7h-1.26A8 8 0 1 0 6 16h2"/></svg>',
    82:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M16 13V21M8 13V21M12 15V23M20 16.5A5 5 0 0 0 18 7h-1.26A8 8 0 1 0 6 16h2"/></svg>',
    85:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 17.58A5 5 0 0 0 18 8h-1.26A8 8 0 1 0 6 16.18"/><path d="M16 11l-4 4l-4-4"/></svg>',
    86:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 17.58A5 5 0 0 0 18 8h-1.26A8 8 0 1 0 6 16.18"/><path d="M16 11l-4 4l-4-4"/></svg>',
    95:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z"/></svg>',
    96:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z"/></svg>',
    99:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z"/></svg>'
  };
  function getCondition(code){
    return weatherConditions[code]||'Unknown';
  }
  function getIcon(code){
    return weatherIcons[code]||weatherIcons[3];
  }
  function formatDate(dateStr){
    const d=new Date(dateStr+'T00:00:00Z');
    return d.toLocaleDateString('en-US',{weekday:'long',year:'numeric',month:'long',day:'numeric',timeZone:'UTC'});
  }
  function drawChart(canvas,hours,temps){
    const ctx=canvas.getContext('2d');
    const dpr=window.devicePixelRatio||1;
    const width=canvas.offsetWidth;
    const height=200;
    canvas.width=width*dpr;
    canvas.height=height*dpr;
    ctx.scale(dpr,dpr);
    const padding={top:20,right:20,bottom:40,left:40};
    const chartWidth=width-padding.left-padding.right;
    const chartHeight=height-padding.top-padding.bottom;
    const minTemp=Math.min(...temps);
    const maxTemp=Math.max(...temps);
    const range=maxTemp-minTemp||1;
    const xStep=chartWidth/(temps.length-1);
    const yScale=(t)=>padding.top+chartHeight-((t-minTemp)/range)*chartHeight;
    // grid
    ctx.strokeStyle='#e2e8f0';
    ctx.lineWidth=1;
    const yTicks=5;
    for(let i=0;i<=yTicks;i++){
      const y=padding.top+(chartHeight/yTicks)*i;
      ctx.beginPath();
      ctx.moveTo(padding.left,y);
      ctx.lineTo(width-padding.right,y);
      ctx.stroke();
      const label=Math.round(maxTemp-(maxTemp-minTemp)*(i/yTicks));
      ctx.fillStyle='#718096';
      ctx.font='12px sans-serif';
      ctx.textAlign='right';
      ctx.fillText(label+'°',padding.left-5,y+4);
    }
    // line
    ctx.beginPath();
    ctx.strokeStyle='#667eea';
    ctx.lineWidth=2;
    for(let i=0;i<temps.length;i++){
      const x=padding.left+i*xStep;
      const y=yScale(temps[i]);
      if(i===0)ctx.moveTo(x,y);
      else ctx.lineTo(x,y);
    }
    ctx.stroke();
    // fill
    const gradient=ctx.createLinearGradient(0,padding.top,0,height-padding.bottom);
    gradient.addColorStop(0,'rgba(102,126,234,0.3)');
    gradient.addColorStop(1,'rgba(102,126,234,0)');
    ctx.fillStyle=gradient;
    ctx.beginPath();
    for(let i=0;i<temps.length;i++){
      const x=padding.left+i*xStep;
      const y=yScale(temps[i]);
      if(i===0)ctx.moveTo(x,y);
      else ctx.lineTo(x,y);
    }
    ctx.lineTo(padding.left+(temps.length-1)*xStep,height-padding.bottom);
    ctx.lineTo(padding.left,height-padding.bottom);
    ctx.closePath();
    ctx.fill();
    // points
    ctx.fillStyle='#667eea';
    for(let i=0;i<temps.length;i++){
      const x=padding.left+i*xStep;
      const y=yScale(temps[i]);
      ctx.beginPath();
      ctx.arc(x,y,3,0,Math.PI*2);
      ctx.fill();
    }
    // x labels
    ctx.fillStyle='#718096';
    ctx.font='11px sans-serif';
    ctx.textAlign='center';
    for(let i=0;i<temps.length;i++){
      if(i%3===0){
        const x=padding.left+i*xStep;
        const h=new Date(hours[i]).getUTCHours();
        ctx.fillText(h+':00',x,height-padding.bottom+20);
      }
    }
  }
  async function init(){
    const loading=document.getElementById('loading');
    const errorEl=document.getElementById('error');
    const content=document.getElementById('content');
    const locationNameEl=document.getElementById('locationName');
    const dateDisplayEl=document.getElementById('dateDisplay');
    const maxTempEl=document.getElementById('maxTemp');
    const minTempEl=document.getElementById('minTemp');
    const weatherConditionEl=document.getElementById('weatherCondition');
    const weatherIconEl=document.getElementById('weatherIcon');
    const chartCanvas=document.getElementById('hourlyChart');
    try{
      const params=new URLSearchParams(window.location.search);
      const lat=parseFloat(params.get('lat'))||52.52;
      const lon=parseFloat(params.get('lon'))||13.405;
      const name=params.get('name')||'Berlin';
      let dateStr=params.get('date');
      if(!dateStr){
        dateStr=new Date().toISOString().split('T')[0];
      }
      const today=new Date().toISOString().split('T')[0];
      const baseURL=dateStr<=today?'/api/om/archive':'/api/om/forecast';
      const url=`${baseURL}?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}`;
      const response=await fetch(url);
      if(!response.ok) throw new Error('API error');
      const data=await response.json();
      const daily=data.daily;
      const dailyIndex=daily.time.indexOf(dateStr);
      if(dailyIndex===-1) throw new Error('Daily data not found');
      const maxTemp=parseFloat(daily.temperature_2m_max[dailyIndex]);
      const minTemp=parseFloat(daily.temperature_2m_min[dailyIndex]);
      const weatherCode=parseInt(daily.weather_code[dailyIndex],10);
      const hourly=data.hourly;
      const hourlyTimes=hourly.time;
      const hourlyTemps=hourly.temperature_2m;
      const dayHours=[],dayTemps=[];
      for(let i=0;i<hourlyTimes.length;i++){
        if(hourlyTimes[i].startsWith(dateStr)){
          dayHours.push(hourlyTimes[i]);
          dayTemps.push(parseFloat(hourlyTemps[i]));
        }
      }
      locationNameEl.textContent=name;
      dateDisplayEl.textContent=formatDate(dateStr);
      maxTempEl.textContent=Math.round(maxTemp)+'°';
      minTempEl.textContent=Math.round(minTemp)+'°';
      weatherConditionEl.textContent=getCondition(weatherCode);
      weatherIconEl.innerHTML=getIcon(weatherCode);
      loading.style.display='none';
      content.style.display='block';
      drawChart(chartCanvas,dayHours,dayTemps);
    }catch(e){
      loading.style.display='none';
      errorEl.style.display='flex';
      console.error(e);
    }
  }
  document.addEventListener('DOMContentLoaded',init);
})();
</script>
</body>
</html>

L1 — cheap deterministic descriptors

bytes total14,774html / css / js1,389 / 2,444 / 10,941
dom nodes31dom depth8
css rules24js presentyes
brightness228.5contrast40.1
colorfulness33.5whitespace88.1%

This slot's telemetry

prompt tokens346completion tokens14,872
total tokens15,218wall181.8 s
costrequest id
config.json555 B
{
  "N": 2,
  "auth": {
    "credential_ref": "WCB_OPENCODE_KEY",
    "method": "oauth-login"
  },
  "billing": "plan",
  "config_id": "minimax-m2.5--opencode-go--dev",
  "effort": null,
  "family": "minimax",
  "m": {
    "min": 2,
    "q": 2
  },
  "model_id": "minimax-m2.5",
  "protocol": "api",
  "served_model": "minimax-m2.5",
  "telemetry": {
    "completion_tokens": 32851,
    "cost_usd": null,
    "prompt_tokens": 1368,
    "total_tokens": 34219,
    "wall_ms": 408847
  },
  "transport": "opencode-go-gateway",
  "vendor_sanction_ref": null
}
send-log2.5 KB
{
  "N": 2,
  "batch_id": "2026-07-18--dev-go-extra",
  "config_id": "minimax-m2.5--opencode-go--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-07-18T00:19:31.790370+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-18T00:16:29.947170+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-18T00:20:52.600867+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-18T00:19:34.559643+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-18T00:21:45.132226+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-18T00:20:55.372814+00:00"
        }
      ],
      "block_index": 1,
      "model_reaching_attempt_index": 0,
      "slot_index": 1,
      "terminal_state": "valid",
      "variant": "P-min"
    },
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-07-18T00:23:27.098699+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-18T00:21:47.888902+00:00"
        }
      ],
      "block_index": 1,
      "model_reaching_attempt_index": 0,
      "slot_index": 1,
      "terminal_state": "valid",
      "variant": "P-q"
    }
  ],
  "retry_policy": {
    "max_unreachable_retries": 5,
    "rate_limit_backoff": {
      "max_attempts": 4,
      "max_total_ms": 60000
    }
  }
}