gpt-5.4-mini @ low · codex-oauth
codex-oauthlow
- config
- gpt-5.4-mini-eff-low--cli--codex-oauth--dev
- batch
- 2026-07-19--unified
- transport
- codex-cli-oauth-chatgpt
- protocol
- cli · plan
- served model
- gpt-5.4-mini
- 采集于
- 2026年7月18日 11:54 · N=2
variant
live
slot 0 · P-q · sandboxed iframe

截图是 similarity 通道测量时的原始像素。运行 live 会在 sandboxed iframe 中重新执行原始输出;渲染结果取决于你的浏览器和字体,不保证与测量像素一致。
similarity 邻居
最近
gpt-5.6-sol @xhigh · codex-oauth0.67gpt-5.4 @low · api0.66gpt-5.4-mini @medium · codex-oauth0.64gpt-5.6-luna @max · kiro0.64gpt-5.6-terra @high · codex-oauth0.64最远
gpt-5.6-luna @medium · codex-oauth0.42gpt-5.6-luna @high · kiro0.42gpt-5.5 @low · codex-oauth0.42claude-haiku-4-5 @xhigh · CC0.42north-mini-code-free · api0.44限于 session 2026-07-19--unified
similarity 衡量本 session 内的趋同程度 —— 不是质量。
Fidelity —— 卡片展示的数据对不对?
- namematch
- conditionmatch
- datematch
- max tempambiguousinsufficient-distinct-temperature-nodes
- min tempambiguousinsufficient-distinct-temperature-nodes
- hourlyambiguouscoverage · 0 命中 · 0 不符 · 24 未展示
- request sidematch0 处违规
extractor fidelity-extractor-v1+Berlin-2026-07-15
源码 —— 原始模型输出,一字节未改
下载 card.html<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Weather Card</title>
<style>
:root {
--bg-a: #07111f;
--bg-b: #0d2238;
--bg-c: #16304f;
--card: rgba(8, 16, 31, 0.62);
--card-2: rgba(255, 255, 255, 0.06);
--stroke: rgba(255, 255, 255, 0.12);
--text: #eef4ff;
--muted: rgba(238, 244, 255, 0.72);
--muted-2: rgba(238, 244, 255, 0.52);
--accent: #8de1ff;
--accent-2: #ffd06b;
--danger: #ff8b8b;
--shadow: 0 24px 80px rgba(0, 0, 0, 0.45);
}
html, body {
width: 100%;
height: 100%;
margin: 0;
overflow: hidden;
background:
radial-gradient(1200px 900px at 20% 20%, rgba(104, 176, 255, 0.20), transparent 56%),
radial-gradient(900px 700px at 80% 10%, rgba(255, 208, 107, 0.16), transparent 52%),
radial-gradient(800px 800px at 70% 85%, rgba(77, 226, 180, 0.12), transparent 46%),
linear-gradient(145deg, var(--bg-a) 0%, var(--bg-b) 42%, var(--bg-c) 100%);
font-family: Inter, "Segoe UI", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
color: var(--text);
}
body::before {
content: "";
position: fixed;
inset: 0;
background-image:
linear-gradient(rgba(255,255,255,0.04) 1px, transparent 1px),
linear-gradient(90deg, rgba(255,255,255,0.04) 1px, transparent 1px);
background-size: 72px 72px;
opacity: 0.12;
mask-image: radial-gradient(circle at center, black, transparent 80%);
pointer-events: none;
}
.frame {
width: 100%;
height: 100%;
display: grid;
place-items: center;
padding: 40px;
box-sizing: border-box;
}
.card {
position: relative;
width: min(1120px, calc(100vw - 80px));
min-height: 620px;
border-radius: 34px;
overflow: hidden;
background:
linear-gradient(180deg, rgba(255,255,255,0.12), rgba(255,255,255,0.05)),
linear-gradient(145deg, rgba(9, 16, 31, 0.80), rgba(10, 20, 37, 0.56));
border: 1px solid var(--stroke);
box-shadow: var(--shadow);
backdrop-filter: blur(22px);
-webkit-backdrop-filter: blur(22px);
}
.card::before {
content: "";
position: absolute;
inset: -2px;
background:
radial-gradient(900px 500px at 10% 0%, rgba(141, 225, 255, 0.16), transparent 50%),
radial-gradient(700px 420px at 90% 10%, rgba(255, 208, 107, 0.14), transparent 48%),
radial-gradient(800px 520px at 100% 100%, rgba(74, 226, 180, 0.10), transparent 50%);
pointer-events: none;
}
.inner {
position: relative;
z-index: 1;
height: 100%;
display: grid;
grid-template-rows: auto 1fr auto;
padding: 34px 38px 30px;
box-sizing: border-box;
}
.topbar {
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: 24px;
margin-bottom: 26px;
}
.location {
display: grid;
gap: 8px;
}
.label {
font-size: 16px;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--muted-2);
}
h1 {
margin: 0;
font-size: clamp(42px, 5vw, 72px);
line-height: 0.96;
letter-spacing: -0.05em;
font-weight: 760;
}
.date {
display: inline-flex;
align-items: center;
gap: 10px;
width: fit-content;
padding: 10px 14px;
border-radius: 999px;
background: rgba(255,255,255,0.08);
border: 1px solid rgba(255,255,255,0.10);
color: var(--muted);
font-size: 15px;
letter-spacing: 0.02em;
}
.meta {
display: grid;
justify-items: end;
gap: 14px;
text-align: right;
}
.status {
display: inline-flex;
align-items: center;
gap: 10px;
padding: 10px 14px;
border-radius: 999px;
background: rgba(255,255,255,0.07);
border: 1px solid rgba(255,255,255,0.10);
color: var(--muted);
font-size: 14px;
}
.status-dot {
width: 10px;
height: 10px;
border-radius: 50%;
background: linear-gradient(180deg, var(--accent), #5fb7ff);
box-shadow: 0 0 18px rgba(141, 225, 255, 0.55);
}
.status.loading .status-dot {
animation: pulse 1.4s ease-in-out infinite;
}
.hero {
display: grid;
grid-template-columns: 1.1fr 0.9fr;
gap: 26px;
align-items: stretch;
}
.panel {
border-radius: 28px;
background: linear-gradient(180deg, rgba(255,255,255,0.08), rgba(255,255,255,0.04));
border: 1px solid rgba(255,255,255,0.10);
box-shadow: inset 0 1px 0 rgba(255,255,255,0.05);
}
.summary {
padding: 28px;
display: grid;
align-content: space-between;
min-height: 360px;
}
.temp-block {
display: flex;
align-items: baseline;
gap: 16px;
flex-wrap: wrap;
margin-top: 6px;
}
.big-temp {
font-size: clamp(74px, 9vw, 122px);
line-height: 0.88;
font-weight: 780;
letter-spacing: -0.08em;
}
.temp-range {
display: grid;
gap: 10px;
align-self: center;
padding-bottom: 10px;
color: var(--muted);
font-size: 18px;
}
.condition {
margin-top: 10px;
font-size: clamp(20px, 2.4vw, 30px);
line-height: 1.1;
font-weight: 650;
letter-spacing: -0.03em;
color: var(--text);
}
.support {
display: grid;
gap: 14px;
}
.support-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 14px;
}
.metric {
padding: 18px 18px 16px;
border-radius: 22px;
background: rgba(6, 11, 23, 0.26);
border: 1px solid rgba(255,255,255,0.08);
}
.metric .k {
display: block;
font-size: 12px;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--muted-2);
margin-bottom: 10px;
}
.metric .v {
font-size: 24px;
font-weight: 700;
letter-spacing: -0.04em;
}
.hours {
padding: 24px 24px 22px;
display: grid;
gap: 16px;
min-height: 360px;
}
.section-title {
display: flex;
justify-content: space-between;
align-items: baseline;
gap: 12px;
}
.section-title h2 {
margin: 0;
font-size: 18px;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--muted-2);
font-weight: 700;
}
.section-title .sub {
color: var(--muted);
font-size: 14px;
}
.hour-track {
display: grid;
grid-template-columns: repeat(6, minmax(0, 1fr));
gap: 12px;
align-content: start;
}
.hour {
position: relative;
padding: 16px 14px 14px;
border-radius: 20px;
background:
linear-gradient(180deg, rgba(255,255,255,0.08), rgba(255,255,255,0.03));
border: 1px solid rgba(255,255,255,0.08);
min-height: 108px;
overflow: hidden;
}
.hour::before {
content: "";
position: absolute;
inset: auto 12px 12px 12px;
height: 2px;
border-radius: 999px;
background: linear-gradient(90deg, rgba(141,225,255,0.1), rgba(141,225,255,0.9), rgba(255,208,107,0.85));
opacity: 0.65;
}
.hour .t {
color: var(--muted-2);
font-size: 12px;
text-transform: uppercase;
letter-spacing: 0.12em;
margin-bottom: 14px;
}
.hour .temp {
font-size: 24px;
line-height: 1;
font-weight: 750;
letter-spacing: -0.05em;
}
.hour .note {
margin-top: 10px;
color: var(--muted);
font-size: 13px;
}
.footer {
margin-top: 18px;
display: flex;
justify-content: space-between;
gap: 16px;
align-items: center;
color: var(--muted-2);
font-size: 13px;
}
.source {
padding: 8px 12px;
border-radius: 999px;
background: rgba(255,255,255,0.06);
border: 1px solid rgba(255,255,255,0.08);
}
.error {
display: none;
padding: 22px 24px;
border-radius: 24px;
background: rgba(255, 139, 139, 0.10);
border: 1px solid rgba(255, 139, 139, 0.28);
color: #ffd9d9;
font-size: 18px;
line-height: 1.45;
}
.loading-shimmer {
position: relative;
overflow: hidden;
}
.loading-shimmer::after {
content: "";
position: absolute;
inset: 0;
transform: translateX(-100%);
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.12), transparent);
animation: shimmer 1.35s infinite;
}
@keyframes shimmer {
100% { transform: translateX(100%); }
}
@keyframes pulse {
0%, 100% { transform: scale(0.95); opacity: 0.75; }
50% { transform: scale(1.18); opacity: 1; }
}
@media (max-width: 1024px) {
html, body {
overflow: auto;
}
.frame {
padding: 18px;
}
.card {
width: 100%;
min-height: auto;
}
.hero {
grid-template-columns: 1fr;
}
.hour-track {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.topbar {
flex-direction: column;
}
.meta {
justify-items: start;
text-align: left;
}
}
</style>
</head>
<body>
<div class="frame">
<div class="card">
<div class="inner">
<div class="topbar">
<div class="location">
<div class="label">Weather Snapshot</div>
<h1 id="location">Berlin</h1>
<div class="date" id="dateLabel">Loading date...</div>
</div>
<div class="meta">
<div class="status loading" id="status">
<span class="status-dot"></span>
<span id="statusText">Fetching weather data</span>
</div>
</div>
</div>
<div id="errorBox" class="error"></div>
<div class="hero" id="content">
<section class="panel summary">
<div>
<div class="label">Daily Conditions</div>
<div class="temp-block">
<div class="big-temp loading-shimmer" id="maxTemp">--</div>
<div class="temp-range">
<div><strong>Max:</strong> <span id="maxTempText">--</span></div>
<div><strong>Min:</strong> <span id="minTempText">--</span></div>
</div>
</div>
<div class="condition" id="condition">Loading condition...</div>
</div>
<div class="support">
<div class="support-grid">
<div class="metric">
<span class="k">Location</span>
<span class="v" id="locationMetric">Berlin</span>
</div>
<div class="metric">
<span class="k">Date</span>
<span class="v" id="dateMetric">--</span>
</div>
</div>
</div>
</section>
<section class="panel hours">
<div class="section-title">
<h2>Hourly Temperatures</h2>
<div class="sub">UTC time for selected date</div>
</div>
<div class="hour-track" id="hourTrack"></div>
</section>
</div>
<div class="footer">
<div>Open-Meteo compatible same-origin API</div>
<div class="source" id="sourceLabel">/api/om/forecast</div>
</div>
</div>
</div>
</div>
<script>
(function () {
const params = new URLSearchParams(window.location.search);
function pad(n) {
return String(n).padStart(2, "0");
}
function utcToday() {
const d = new Date();
return d.toISOString().slice(0, 10);
}
function parseDateISO(value) {
if (!/^\d{4}-\d{2}-\d{2}$/.test(value)) return null;
const d = new Date(value + "T00:00:00Z");
return Number.isNaN(d.getTime()) ? null : d;
}
function formatDateLabel(iso) {
const d = new Date(iso + "T00:00:00Z");
return new Intl.DateTimeFormat("en-US", {
weekday: "long",
year: "numeric",
month: "long",
day: "numeric",
timeZone: "UTC"
}).format(d);
}
function weatherDescription(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[code] || "Unknown conditions";
}
function chooseEndpoint(dateISO) {
const today = utcToday();
return dateISO < today ? "/api/om/archive" : "/api/om/forecast";
}
function buildUrl(endpoint, lat, lon, dateISO) {
const url = new URL(endpoint, window.location.origin);
url.searchParams.set("latitude", String(lat));
url.searchParams.set("longitude", String(lon));
url.searchParams.set("daily", "temperature_2m_max,temperature_2m_min,weather_code");
url.searchParams.set("hourly", "temperature_2m");
url.searchParams.set("timezone", "UTC");
url.searchParams.set("temperature_unit", "celsius");
url.searchParams.set("start_date", dateISO);
url.searchParams.set("end_date", dateISO);
return url.toString();
}
function setLoading(isLoading, text) {
const status = document.getElementById("status");
const statusText = document.getElementById("statusText");
status.classList.toggle("loading", isLoading);
statusText.textContent = text;
}
function setError(message) {
const errorBox = document.getElementById("errorBox");
errorBox.style.display = "block";
errorBox.textContent = message;
}
function setText(id, value) {
document.getElementById(id).textContent = value;
}
const lat = parseFloat(params.get("lat") || "52.52");
const lon = parseFloat(params.get("lon") || "13.405");
const name = params.get("name") || "Berlin";
const requestedDate = parseDateISO(params.get("date") || utcToday()) ? (params.get("date") || utcToday()) : utcToday();
document.getElementById("location").textContent = name;
document.getElementById("locationMetric").textContent = name;
document.getElementById("dateLabel").textContent = formatDateLabel(requestedDate);
document.getElementById("dateMetric").textContent = requestedDate;
document.getElementById("sourceLabel").textContent = chooseEndpoint(requestedDate);
const endpoint = chooseEndpoint(requestedDate);
const url = buildUrl(endpoint, lat, lon, requestedDate);
const hourTrack = document.getElementById("hourTrack");
hourTrack.innerHTML = Array.from({ length: 6 }, (_, i) => {
const hour = pad(i * 4);
return '<div class="hour loading-shimmer"><div class="t">' + hour + ':00</div><div class="temp">--°C</div><div class="note">Loading</div></div>';
}).join("");
(async function loadWeather() {
try {
setLoading(true, "Fetching weather data");
const response = await fetch(url, { credentials: "same-origin" });
if (!response.ok) {
throw new Error("HTTP " + response.status);
}
const data = await response.json();
const daily = data && data.daily;
const hourly = data && data.hourly;
if (!daily || !hourly || !Array.isArray(daily.time) || !Array.isArray(hourly.time)) {
throw new Error("Unexpected API response");
}
const dayIndex = daily.time.indexOf(requestedDate);
if (dayIndex === -1) {
throw new Error("Requested date not found in response");
}
const maxTemp = daily.temperature_2m_max && daily.temperature_2m_max[dayIndex];
const minTemp = daily.temperature_2m_min && daily.temperature_2m_min[dayIndex];
const code = daily.weather_code && daily.weather_code[dayIndex];
if (maxTemp == null || minTemp == null) {
throw new Error("Missing daily temperatures");
}
setText("maxTemp", Math.round(maxTemp) + "°");
setText("maxTempText", maxTemp.toFixed(1) + " °C");
setText("minTempText", minTemp.toFixed(1) + " °C");
setText("condition", weatherDescription(code));
const hourlyTemps = [];
for (let i = 0; i < hourly.time.length; i++) {
if (String(hourly.time[i]).slice(0, 10) === requestedDate) {
hourlyTemps.push({
time: String(hourly.time[i]).slice(11, 16),
temp: hourly.temperature_2m[i]
});
}
}
if (!hourlyTemps.length) {
throw new Error("No hourly data for the requested date");
}
hourTrack.innerHTML = hourlyTemps.map((entry) => {
return '<div class="hour"><div class="t">' + entry.time + '</div><div class="temp">' + Number(entry.temp).toFixed(1) + '°C</div><div class="note">UTC</div></div>';
}).join("");
setLoading(false, "Weather loaded");
} catch (err) {
setLoading(false, "Unable to load weather");
setError("The weather data could not be loaded.");
document.getElementById("content").style.opacity = "0.75";
hourTrack.innerHTML = "";
setText("condition", "No data available");
setText("maxTemp", "--");
setText("maxTempText", "--");
setText("minTempText", "--");
}
})();
})();
</script>
</body>
</html>L1 —— 廉价的确定性描述量
| bytes 总计 | 18,796 | html / css / js | 2,460 / 9,374 / 6,962 |
|---|---|---|---|
| dom 节点 | 51 | dom 深度 | 12 |
| css 规则 | 56 | 含 js | 是 |
| brightness | 60.7 | contrast | 26.1 |
| colorfulness | 14.6 | 留白 | 49.5% |
该 slot 的 telemetry
| prompt tokens | 0 | completion tokens | 11,223 |
|---|---|---|---|
| total tokens | 0 | wall | 79.7 s |
| cost | — | request id | — |
config.json560 B
{
"N": 2,
"auth": {
"credential_ref": "WCB_NONE",
"method": "oauth-login"
},
"billing": "plan",
"config_id": "gpt-5.4-mini-eff-low--cli--codex-oauth--dev",
"effort": "low",
"family": "gpt",
"m": {
"min": 2,
"q": 2
},
"model_id": "gpt-5.4-mini",
"protocol": "cli",
"served_model": "gpt-5.4-mini",
"telemetry": {
"completion_tokens": 44469,
"cost_usd": null,
"prompt_tokens": null,
"total_tokens": null,
"wall_ms": 315086
},
"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-low--cli--codex-oauth--dev",
"positions": [
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-07-17T14:17:42.608165+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-17T14:16:19.935280+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:19:06.290231+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-17T14:17:46.569366+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:20:32.314599+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-17T14:19:09.996612+00:00"
}
],
"block_index": 1,
"model_reaching_attempt_index": 0,
"slot_index": 1,
"terminal_state": "valid",
"variant": "P-q"
},
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-07-17T14:21:46.506424+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-17T14:20:36.129927+00:00"
}
],
"block_index": 1,
"model_reaching_attempt_index": 0,
"slot_index": 1,
"terminal_state": "valid",
"variant": "P-min"
}
],
"retry_policy": {
"max_unreachable_retries": 5,
"rate_limit_backoff": {
"max_attempts": 4,
"max_total_ms": 60000
}
}
}