Show prediction basis (datetime + model versions) next to "AI 예측 대결"

- "AI의 예측 대결" 우측에 예측 기준(생성 시각) + 실제 모델 버전 표기
  - 라벨 "예측 기준 / As of" + 2026.06.10 00:00 KST (매일 0시 갱신 기준)
  - gpt-5.5 · claude-opus-4-8 · gemini-3.5-flash (MODEL_VERSIONS)
- 가운데 정렬, 가시성↑(11px), 본문 폰트 통일

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
main
Haewon Kam 2026-06-10 10:06:38 +09:00
parent f29dbd0454
commit 9de27dafd8
3 changed files with 21 additions and 3 deletions

View File

@ -1,7 +1,7 @@
"use client";
import { useEffect, useMemo, useState } from "react";
import { DEMO_FORCE_OPEN } from "@/lib/mockData";
import { DEMO_FORCE_OPEN, MODEL_VERSIONS } from "@/lib/mockData";
import { outcomeLabel, pct, kickoffDisplay, winProb } from "@/lib/format";
import { type Lang, dict, teamShort } from "@/lib/i18n";
import type {
@ -41,6 +41,8 @@ export default function Arena({
const t = dict(lang);
const aShort = teamShort(match.teamA, lang);
const bShort = teamShort(match.teamB, lang);
const genDate = (predictions[0]?.generatedAt ?? "").replace(/-/g, ".");
const modelVersions = predictions.map((p) => MODEL_VERSIONS[p.model]).join(" · ");
const [outcome, setOutcome] = useState<Outcome | null>(null);
const [scoreA, setScoreA] = useState(2);
const [scoreB, setScoreB] = useState(1);
@ -142,8 +144,14 @@ export default function Arena({
{/* ===== 레이어드 화이트 시트 (002) ===== */}
<section className="sheet mt-4 p-5 text-[var(--ink)]">
<div className="mb-3">
<h2 className="text-[22px] font-extrabold">{t.aiBattle}</h2>
<div className="mb-3 flex items-end justify-between gap-2">
<h2 className="shrink-0 text-[22px] font-extrabold">{t.aiBattle}</h2>
<div className="flex-1 pb-1 text-center text-[11px] leading-snug">
<div className="font-bold text-[var(--ink)]">
{t.genLabel} · {genDate} 00:00 KST
</div>
<div className="text-[var(--ink-muted)]">{modelVersions}</div>
</div>
</div>
<div className="flex flex-col gap-3">

View File

@ -91,6 +91,7 @@ type Dict = {
ado2Tagline: string;
ado2Sub: string;
ado2Cta: string;
genLabel: string;
};
export const DICT: Record<Lang, Dict> = {
@ -146,6 +147,7 @@ export const DICT: Record<Lang, Dict> = {
footerDisc2: "스포츠 분석·엔터테인먼트 목적의 예측 게임이며 베팅·도박을 권유하지 않습니다. AI 예측은 실제 결과를 보장하지 않습니다.",
footerDisc3: "100만 원 이벤트는 무료 참여형 챌린지입니다. 지급·동점 처리 조건은 별도 약관에 따릅니다. 이메일은 결과·이벤트 알림 목적으로만 사용됩니다.",
hook: (a, b) => `${a} vs ${b}, AI의 선택은 갈렸다`,
genLabel: "예측 기준",
adLabel: "광고",
ado2Tagline: "AI 마케팅 자동화 플랫폼",
ado2Sub: "AI Marketing Automation Platform →",
@ -203,6 +205,7 @@ export const DICT: Record<Lang, Dict> = {
footerDisc2: "A sports-analysis & entertainment prediction game. No betting or gambling. AI predictions do not guarantee real outcomes.",
footerDisc3: "The ₩1,000,000 event is a free-to-enter challenge. Payout & tie-break terms follow separate rules. Email is used only for result & event alerts.",
hook: (a, b) => `AI is split on ${a} vs ${b}`,
genLabel: "As of",
adLabel: "AD",
ado2Tagline: "AI Marketing Automation Platform",
ado2Sub: "Visit ado2.o2osolution.ai →",

View File

@ -74,6 +74,13 @@ function hash(s: string): number {
const MODELS: ModelName[] = ["GPT", "Claude", "Gemini"];
// 예측에 사용한 실제 모델 버전 (UI 투명성 표기용). 갱신 시 .env·AI-PREDICTIONS.md와 함께 변경.
export const MODEL_VERSIONS: Record<ModelName, string> = {
GPT: "gpt-5.5",
Claude: "claude-opus-4-8",
Gemini: "gemini-3.5-flash",
};
// AI 셋이 갈리도록 만든 결과 조합 (홈/원정 균형)
const OUTCOME_SETS: Outcome[][] = [
["TEAM_A_WIN", "DRAW", "TEAM_B_WIN"],