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
parent
f29dbd0454
commit
9de27dafd8
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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 →",
|
||||
|
|
|
|||
|
|
@ -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"],
|
||||
|
|
|
|||
Loading…
Reference in New Issue