gpt-5.4-mini @ medium · codex-oauth
codex-oauthmedium
- config
- gpt-5.4-mini-eff-medium--cli--codex-oauth--dev
- batch
- 2026-07-19--unified
- transport
- codex-cli-oauth-chatgpt
- protocol
- cli · plan
- served model
- gpt-5.4-mini
- captured
- Jul 18, 2026, 11:54 AM · N=2
variant
live
slot 0 · P-q · sandboxed iframe

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
nearest
gpt-5.4 @none · api0.69gpt-5.4 @low · api0.67gpt-5.4-mini @high · codex-oauth0.67grok-4.5 @medium · grok-cli0.66qwen3.7-plus · go0.66farthest
gpt-5.5 @xhigh · codex-oauth0.38claude-haiku-4-5 @xhigh · CC0.41deepseek-v4-flash-free · api0.42claude-haiku-4-5 @high · CC0.42claude-opus-4-8 @xhigh · CC0.44within 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 tempmismatchshown: 16
- min tempmismatchshown: 25.3
- hourlymatchcoverage 24/24 · 24 match · 0 mismatch · 0 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 {
--bg0: #07111f;
--bg1: #0a1a2d;
--bg2: #102a4a;
--card: rgba(10, 18, 32, 0.72);
--card-strong: rgba(11, 20, 36, 0.92);
--stroke: rgba(255, 255, 255, 0.12);
--stroke-strong: rgba(255, 255, 255, 0.18);
--text: #eef4ff;
--muted: rgba(238, 244, 255, 0.72);
--dim: rgba(238, 244, 255, 0.52);
--accent: #7be7ff;
--accent2: #8b9cff;
--good: #89f0b1;
--warn: #ffd482;
--shadow: 0 24px 80px rgba(0, 0, 0, 0.42);
--radius-xl: 34px;
--radius-lg: 24px;
--radius-md: 18px;
--radius-sm: 14px;
--gap: 18px;
--font: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
}
html, body {
width: 100%;
height: 100%;
margin: 0;
overflow: hidden;
background:
radial-gradient(1200px 800px at 15% 15%, rgba(123, 231, 255, 0.20), transparent 58%),
radial-gradient(900px 700px at 85% 18%, rgba(139, 156, 255, 0.18), transparent 48%),
radial-gradient(900px 800px at 70% 100%, rgba(137, 240, 177, 0.10), transparent 48%),
linear-gradient(160deg, var(--bg0) 0%, var(--bg1) 42%, var(--bg2) 100%);
color: var(--text);
font-family: var(--font);
}
body::before {
content: "";
position: fixed;
inset: 0;
pointer-events: none;
background:
linear-gradient(rgba(255,255,255,0.03) 1px, transparent 1px),
linear-gradient(90deg, rgba(255,255,255,0.03) 1px, transparent 1px);
background-size: 42px 42px;
mask-image: radial-gradient(circle at center, black 38%, transparent 100%);
opacity: 0.22;
}
.frame {
width: 1280px;
height: 800px;
margin: 0 auto;
display: grid;
place-items: center;
position: relative;
}
.shell {
width: min(1120px, calc(100vw - 72px));
height: min(700px, calc(100vh - 56px));
display: grid;
grid-template-columns: 1.15fr 0.85fr;
gap: 22px;
align-items: stretch;
position: relative;
}
.panel {
position: relative;
border: 1px solid var(--stroke);
background: linear-gradient(180deg, rgba(17, 27, 44, 0.74), rgba(8, 14, 25, 0.82));
box-shadow: var(--shadow);
backdrop-filter: blur(24px);
-webkit-backdrop-filter: blur(24px);
overflow: hidden;
}
.panel::after {
content: "";
position: absolute;
inset: 0;
background:
radial-gradient(1000px 300px at 30% 0%, rgba(123, 231, 255, 0.12), transparent 50%),
linear-gradient(180deg, rgba(255,255,255,0.05), transparent 18%);
pointer-events: none;
}
.hero {
border-radius: var(--radius-xl);
padding: 28px 28px 24px;
display: flex;
flex-direction: column;
justify-content: space-between;
min-height: 0;
}
.topline {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 18px;
}
.location {
display: flex;
flex-direction: column;
gap: 10px;
min-width: 0;
}
.kicker {
display: inline-flex;
width: fit-content;
align-items: center;
gap: 10px;
padding: 8px 12px;
border-radius: 999px;
border: 1px solid rgba(123, 231, 255, 0.24);
background: rgba(123, 231, 255, 0.08);
color: var(--accent);
font-size: 12px;
letter-spacing: 0.16em;
text-transform: uppercase;
font-weight: 700;
}
.name {
font-size: clamp(36px, 4vw, 54px);
line-height: 0.96;
letter-spacing: -0.05em;
font-weight: 800;
margin: 0;
}
.date {
font-size: 18px;
color: var(--muted);
font-weight: 500;
margin-top: 2px;
}
.condition-row {
display: flex;
align-items: center;
gap: 18px;
margin-top: 24px;
}
.icon {
width: 96px;
height: 96px;
flex: 0 0 auto;
border-radius: 28px;
background:
radial-gradient(circle at 30% 30%, rgba(255,255,255,0.42), transparent 30%),
linear-gradient(145deg, rgba(123, 231, 255, 0.22), rgba(139, 156, 255, 0.08));
border: 1px solid rgba(255,255,255,0.12);
display: grid;
place-items: center;
box-shadow: inset 0 1px 0 rgba(255,255,255,0.12);
}
.icon svg {
width: 58px;
height: 58px;
filter: drop-shadow(0 10px 24px rgba(123, 231, 255, 0.18));
}
.condition {
display: flex;
flex-direction: column;
gap: 10px;
min-width: 0;
}
.condition-label {
font-size: clamp(24px, 2.3vw, 32px);
line-height: 1.05;
font-weight: 750;
letter-spacing: -0.03em;
}
.summary {
color: var(--muted);
font-size: 15px;
line-height: 1.6;
max-width: 56ch;
}
.stats {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 14px;
margin-top: 28px;
}
.stat {
padding: 18px 18px 16px;
border-radius: var(--radius-lg);
background: linear-gradient(180deg, rgba(255,255,255,0.05), rgba(255,255,255,0.02));
border: 1px solid rgba(255,255,255,0.09);
display: flex;
flex-direction: column;
gap: 8px;
}
.stat .label {
color: var(--dim);
font-size: 12px;
letter-spacing: 0.14em;
text-transform: uppercase;
font-weight: 700;
}
.stat .value {
font-size: 34px;
line-height: 1;
font-weight: 800;
letter-spacing: -0.05em;
}
.stat .unit {
font-size: 14px;
color: var(--muted);
font-weight: 600;
margin-left: 6px;
}
.footer-note {
margin-top: 20px;
display: flex;
justify-content: space-between;
gap: 12px;
align-items: center;
color: var(--dim);
font-size: 13px;
line-height: 1.5;
}
.right {
border-radius: var(--radius-xl);
padding: 24px 24px 20px;
display: flex;
flex-direction: column;
gap: 18px;
min-height: 0;
}
.section-title {
display: flex;
justify-content: space-between;
align-items: baseline;
gap: 14px;
}
.section-title h2 {
margin: 0;
font-size: 18px;
letter-spacing: -0.02em;
}
.section-title .meta {
color: var(--dim);
font-size: 12px;
letter-spacing: 0.14em;
text-transform: uppercase;
font-weight: 700;
}
.chart {
flex: 1 1 auto;
border-radius: 26px;
padding: 18px 14px 14px;
border: 1px solid rgba(255,255,255,0.09);
background:
linear-gradient(180deg, rgba(255,255,255,0.04), rgba(255,255,255,0.015)),
radial-gradient(900px 280px at 10% 0%, rgba(123, 231, 255, 0.14), transparent 50%);
display: flex;
flex-direction: column;
gap: 14px;
min-height: 0;
}
.bars {
position: relative;
flex: 1 1 auto;
display: grid;
grid-template-columns: repeat(24, minmax(0, 1fr));
align-items: end;
gap: 8px;
min-height: 0;
padding-top: 14px;
}
.bar-wrap {
display: flex;
flex-direction: column;
justify-content: flex-end;
align-items: center;
gap: 8px;
min-width: 0;
height: 100%;
}
.bar-value {
color: var(--text);
font-size: 11px;
font-weight: 700;
letter-spacing: 0.02em;
opacity: 0.9;
min-height: 14px;
}
.bar {
width: 100%;
min-height: 18px;
border-radius: 999px 999px 12px 12px;
background: linear-gradient(180deg, rgba(123, 231, 255, 0.96), rgba(139, 156, 255, 0.82));
box-shadow:
0 8px 18px rgba(123, 231, 255, 0.16),
inset 0 1px 0 rgba(255,255,255,0.22);
position: relative;
transform-origin: bottom center;
animation: grow 700ms cubic-bezier(.2,.9,.2,1) both;
}
.bar::after {
content: "";
position: absolute;
inset: 0;
border-radius: inherit;
background: linear-gradient(180deg, rgba(255,255,255,0.22), transparent 32%);
pointer-events: none;
}
.hour {
color: var(--dim);
font-size: 11px;
font-weight: 700;
letter-spacing: 0.03em;
writing-mode: vertical-rl;
transform: rotate(180deg);
height: 28px;
line-height: 1;
user-select: none;
}
.scale {
display: flex;
justify-content: space-between;
color: var(--dim);
font-size: 12px;
margin-top: -2px;
padding: 0 4px;
}
.loader, .error {
height: 100%;
display: grid;
place-items: center;
text-align: center;
padding: 24px;
color: var(--muted);
font-size: 18px;
line-height: 1.55;
}
.error strong {
display: block;
color: var(--text);
margin-bottom: 8px;
font-size: 24px;
letter-spacing: -0.03em;
}
.hidden {
display: none !important;
}
@keyframes grow {
from { transform: scaleY(0.08); opacity: 0; }
to { transform: scaleY(1); opacity: 1; }
}
@media (max-width: 1200px) {
.frame {
width: 100%;
height: 100%;
}
.shell {
width: calc(100vw - 40px);
height: calc(100vh - 40px);
}
}
</style>
</head>
<body>
<div class="frame">
<main class="shell" id="app">
<section class="panel hero" aria-live="polite">
<div>
<div class="topline">
<div class="location">
<div class="kicker">Weather Overview</div>
<h1 class="name" id="locationName">Loading...</h1>
<div class="date" id="dateLabel">Fetching data</div>
</div>
</div>
<div class="condition-row">
<div class="icon" id="weatherIcon" aria-hidden="true">
<svg viewBox="0 0 64 64" fill="none">
<circle cx="32" cy="32" r="13" stroke="rgba(238,244,255,0.92)" stroke-width="3"/>
<g stroke="rgba(238,244,255,0.92)" stroke-linecap="round" stroke-width="3">
<path d="M32 8v6"/>
<path d="M32 50v6"/>
<path d="M8 32h6"/>
<path d="M50 32h6"/>
<path d="M15 15l4 4"/>
<path d="M45 45l4 4"/>
<path d="M15 49l4-4"/>
<path d="M45 19l4-4"/>
</g>
</svg>
</div>
<div class="condition">
<div class="condition-label" id="conditionLabel">Loading weather</div>
<div class="summary" id="summaryLabel">
Preparing to load temperatures and daily conditions.
</div>
</div>
</div>
<div class="stats">
<div class="stat">
<div class="label">Maximum</div>
<div><span class="value" id="maxTemp">--</span><span class="unit">°C</span></div>
</div>
<div class="stat">
<div class="label">Minimum</div>
<div><span class="value" id="minTemp">--</span><span class="unit">°C</span></div>
</div>
</div>
</div>
<div class="footer-note">
<div id="endpointNote">Source: same-origin Open-Meteo compatible API</div>
<div id="metaNote"></div>
</div>
</section>
<section class="panel right" aria-live="polite">
<div class="section-title">
<h2>Hourly Temperatures</h2>
<div class="meta">UTC · 24 Hours</div>
</div>
<div class="chart">
<div class="scale" id="scaleLabel">
<span id="scaleMin">--°C</span>
<span id="scaleMax">--°C</span>
</div>
<div class="bars" id="bars">
<div class="loader">Loading hourly data...</div>
</div>
</div>
</section>
<div class="panel error hidden" id="errorPanel">
<div>
<strong>Weather data could not be loaded.</strong>
<div id="errorText">Please try again later.</div>
</div>
</div>
</main>
</div>
<script>
(function () {
const params = new URLSearchParams(window.location.search);
function todayUtcYmd() {
return new Date().toISOString().slice(0, 10);
}
function parseLatLon(value, fallback) {
const n = Number(value);
return Number.isFinite(n) ? n : fallback;
}
function formatDateLabel(ymd) {
const d = new Date(ymd + "T00:00:00Z");
return new Intl.DateTimeFormat("en", {
weekday: "long",
year: "numeric",
month: "long",
day: "numeric",
timeZone: "UTC"
}).format(d);
}
function capitalizeWords(str) {
return String(str || "")
.split(/\s+/)
.filter(Boolean)
.map(part => part[0].toUpperCase() + part.slice(1))
.join(" ");
}
function weatherCodeToCondition(code) {
const map = {
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 fall",
73: "Moderate snow fall",
75: "Heavy snow fall",
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"
};
return map[Number(code)] || "Unknown conditions";
}
function weatherIconSvg(code) {
const c = Number(code);
const isClear = c === 0 || c === 1;
const isPartly = c === 2;
const isCloudy = c === 3 || c === 45 || c === 48;
const isRain = [51,53,55,56,57,61,63,65,66,67,80,81,82].includes(c);
const isSnow = [71,73,75,77,85,86].includes(c);
const isStorm = [95,96,99].includes(c);
if (isClear) {
return `
<svg viewBox="0 0 64 64" fill="none" aria-hidden="true">
<circle cx="32" cy="32" r="13" stroke="rgba(238,244,255,0.92)" stroke-width="3"/>
<g stroke="rgba(238,244,255,0.92)" stroke-linecap="round" stroke-width="3">
<path d="M32 8v6"/>
<path d="M32 50v6"/>
<path d="M8 32h6"/>
<path d="M50 32h6"/>
<path d="M15 15l4 4"/>
<path d="M45 45l4 4"/>
<path d="M15 49l4-4"/>
<path d="M45 19l4-4"/>
</g>
</svg>`;
}
if (isPartly) {
return `
<svg viewBox="0 0 64 64" fill="none" aria-hidden="true">
<g>
<circle cx="24" cy="24" r="10" fill="rgba(255, 220, 122, 0.95)"/>
<path d="M18 44h26c5 0 9-4 9-9s-4-9-9-9c-1 0-2 0-3 .3C39.3 21.8 35.9 19 31.8 19c-5.1 0-9.3 3.7-10.1 8.5C15.8 28 12 31.7 12 36.4 12 40.6 15.4 44 19.6 44H18Z"
fill="rgba(238,244,255,0.92)" opacity="0.95"/>
</g>
</svg>`;
}
if (isCloudy) {
return `
<svg viewBox="0 0 64 64" fill="none" aria-hidden="true">
<path d="M18 44h29c5 0 9-4 9-9s-4-9-9-9c-1 0-2 0-3 .3C41.1 21.8 37.2 19 32.6 19c-5.6 0-10.2 4.1-11 9.4C16 29 12 32.8 12 37.4 12 41.6 15.4 45 19.6 45H18Z"
fill="rgba(238,244,255,0.9)"/>
<path d="M21 48h26" stroke="rgba(255,255,255,0.2)" stroke-width="2" stroke-linecap="round"/>
</svg>`;
}
if (isRain) {
return `
<svg viewBox="0 0 64 64" fill="none" aria-hidden="true">
<path d="M18 37h29c5 0 9-4 9-9s-4-9-9-9c-1 0-2 0-3 .3C41.1 14.8 37.2 12 32.6 12c-5.6 0-10.2 4.1-11 9.4C16 22 12 25.8 12 30.4 12 34.6 15.4 38 19.6 38H18Z"
fill="rgba(238,244,255,0.9)"/>
<g stroke="rgba(123,231,255,0.95)" stroke-linecap="round" stroke-width="3">
<path d="M22 43l-2 5"/>
<path d="M32 43l-2 5"/>
<path d="M42 43l-2 5"/>
</g>
</svg>`;
}
if (isSnow) {
return `
<svg viewBox="0 0 64 64" fill="none" aria-hidden="true">
<path d="M18 37h29c5 0 9-4 9-9s-4-9-9-9c-1 0-2 0-3 .3C41.1 14.8 37.2 12 32.6 12c-5.6 0-10.2 4.1-11 9.4C16 22 12 25.8 12 30.4 12 34.6 15.4 38 19.6 38H18Z"
fill="rgba(238,244,255,0.9)"/>
<g fill="rgba(167, 220, 255, 0.98)">
<circle cx="23" cy="45" r="2.2"/>
<circle cx="33" cy="47" r="2.2"/>
<circle cx="42" cy="44" r="2.2"/>
</g>
</svg>`;
}
if (isStorm) {
return `
<svg viewBox="0 0 64 64" fill="none" aria-hidden="true">
<path d="M18 37h29c5 0 9-4 9-9s-4-9-9-9c-1 0-2 0-3 .3C41.1 14.8 37.2 12 32.6 12c-5.6 0-10.2 4.1-11 9.4C16 22 12 25.8 12 30.4 12 34.6 15.4 38 19.6 38H18Z"
fill="rgba(238,244,255,0.9)"/>
<path d="M29 41l-4 8h6l-2 7 10-12h-6l4-9-8 6Z" fill="rgba(255, 212, 130, 0.98)"/>
</svg>`;
}
return `
<svg viewBox="0 0 64 64" fill="none" aria-hidden="true">
<circle cx="32" cy="32" r="13" stroke="rgba(238,244,255,0.92)" stroke-width="3"/>
</svg>`;
}
function pickEndpoint(dateStr) {
const today = todayUtcYmd();
return dateStr < today ? "/api/om/archive" : "/api/om/forecast";
}
function buildUrl(base, lat, lon, dateStr) {
const q = new URLSearchParams({
latitude: String(lat),
longitude: String(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 `${base}?${q.toString()}`;
}
function setError(message) {
document.getElementById("app").querySelectorAll(".panel").forEach(el => el.classList.add("hidden"));
const err = document.getElementById("errorPanel");
err.classList.remove("hidden");
document.getElementById("errorText").textContent = message;
}
function fmtTemp(v) {
const n = Number(v);
return Number.isFinite(n) ? n.toFixed(1) : "--";
}
async function main() {
const lat = parseLatLon(params.get("lat"), 52.52);
const lon = parseLatLon(params.get("lon"), 13.405);
const name = params.get("name") || "Berlin";
const date = params.get("date") || todayUtcYmd();
document.getElementById("locationName").textContent = capitalizeWords(name);
document.getElementById("dateLabel").textContent = formatDateLabel(date);
document.getElementById("metaNote").textContent = `lat ${lat.toFixed(3)} · lon ${lon.toFixed(3)} · UTC`;
document.getElementById("summaryLabel").textContent = "Loading weather data from the local Open-Meteo compatible API.";
const endpoint = pickEndpoint(date);
const url = buildUrl(endpoint, lat, lon, date);
let response;
try {
response = await fetch(url, { credentials: "same-origin" });
} catch (e) {
setError("The weather service could not be reached.");
return;
}
if (!response.ok) {
setError(`The weather service returned HTTP ${response.status}.`);
return;
}
let data;
try {
data = await response.json();
} catch (e) {
setError("The weather data response was not valid JSON.");
return;
}
const daily = data && data.daily;
const hourly = data && data.hourly;
const times = hourly && Array.isArray(hourly.time) ? hourly.time : [];
const hourlyTemps = hourly && Array.isArray(hourly.temperature_2m) ? hourly.temperature_2m : [];
const dailyTimes = daily && Array.isArray(daily.time) ? daily.time : [];
const idx = dailyTimes.findIndex(t => t === date);
const maxTemp = daily && Array.isArray(daily.temperature_2m_max) ? daily.temperature_2m_max[idx >= 0 ? idx : 0] : undefined;
const minTemp = daily && Array.isArray(daily.temperature_2m_min) ? daily.temperature_2m_min[idx >= 0 ? idx : 0] : undefined;
const codeArray = daily && (daily.weather_code || daily.weathercode || daily.weatherCodes);
const conditionCode = Array.isArray(codeArray) ? codeArray[idx >= 0 ? idx : 0] : undefined;
if (!Number.isFinite(Number(maxTemp)) || !Number.isFinite(Number(minTemp)) || !times.length || !hourlyTemps.length) {
setError("Weather data was loaded, but the expected temperature fields were missing.");
return;
}
const condition = weatherCodeToCondition(conditionCode);
document.getElementById("conditionLabel").textContent = condition;
document.getElementById("summaryLabel").textContent = `Daily condition for ${formatDateLabel(date)}.`;
document.getElementById("maxTemp").textContent = fmtTemp(maxTemp);
document.getElementById("minTemp").textContent = fmtTemp(minTemp);
document.getElementById("weatherIcon").innerHTML = weatherIconSvg(conditionCode);
document.getElementById("scaleMin").textContent = `${fmtTemp(Math.min(...hourlyTemps.filter(Number.isFinite)))}°C`;
document.getElementById("scaleMax").textContent = `${fmtTemp(Math.max(...hourlyTemps.filter(Number.isFinite)))}°C`;
const bars = document.getElementById("bars");
bars.innerHTML = "";
const validTemps = hourlyTemps.filter(v => Number.isFinite(Number(v)));
const min = Math.min(...validTemps);
const max = Math.max(...validTemps);
const range = Math.max(1, max - min);
const hoursForDate = times
.map((t, i) => ({ t, temp: Number(hourlyTemps[i]) }))
.filter(x => x.t.startsWith(date + "T"));
if (!hoursForDate.length) {
setError("The hourly data for the requested date was not available.");
return;
}
hoursForDate.forEach((item, i) => {
const hour = item.t.slice(11, 16);
const height = 14 + ((item.temp - min) / range) * 100;
const wrap = document.createElement("div");
wrap.className = "bar-wrap";
wrap.innerHTML = `
<div class="bar-value">${fmtTemp(item.temp)}°</div>
<div class="bar" style="height:${height.toFixed(1)}%; animation-delay:${(i * 18)}ms;"></div>
<div class="hour">${hour}</div>
`;
bars.appendChild(wrap);
});
document.getElementById("endpointNote").textContent = endpoint === "/api/om/archive"
? "Source: same-origin archive API"
: "Source: same-origin forecast API";
}
main().catch(() => {
setError("An unexpected error occurred while loading the weather data.");
});
})();
</script>
</body>
</html>L1 — cheap deterministic descriptors
| bytes total | 24,007 | html / css / js | 3,091 / 9,426 / 11,490 |
|---|---|---|---|
| dom nodes | 61 | dom depth | 10 |
| css rules | 46 | js present | yes |
| brightness | 43.5 | contrast | 30.8 |
| colorfulness | 24.7 | whitespace | 65.7% |
This slot's telemetry
| prompt tokens | 0 | completion tokens | 13,525 |
|---|---|---|---|
| total tokens | 0 | wall | 115.2 s |
| cost | — | request id | — |
config.json566 B
{
"N": 2,
"auth": {
"credential_ref": "WCB_NONE",
"method": "oauth-login"
},
"billing": "plan",
"config_id": "gpt-5.4-mini-eff-medium--cli--codex-oauth--dev",
"effort": "medium",
"family": "gpt",
"m": {
"min": 2,
"q": 2
},
"model_id": "gpt-5.4-mini",
"protocol": "cli",
"served_model": "gpt-5.4-mini",
"telemetry": {
"completion_tokens": 43629,
"cost_usd": null,
"prompt_tokens": null,
"total_tokens": null,
"wall_ms": 383585
},
"transport": "codex-cli-oauth-chatgpt",
"vendor_sanction_ref": null
}send-log2.5 KB
{
"N": 2,
"batch_id": "2026-07-17--dev-codex-oauth-gpt-5.4-mini",
"config_id": "gpt-5.4-mini-eff-medium--cli--codex-oauth--dev",
"positions": [
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-07-17T14:23:44.940878+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-17T14:21:49.789858+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-17T14:25:16.555995+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-17T14:23:48.910755+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-17T14:26:30.777693+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-17T14:25:20.065549+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-17T14:28:25.589759+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-17T14:26:35.515938+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
}
}
}