CoOp:Anything
Search any game and see how much of it you can play with friends: every co-op mod, its stage, quality and community rating.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗"내 플레이가 현재 메타와 얼마나 맞았을까? 대깨였을까, 빈집 유연 운영이었을까?"
롤체지지(LOLCHESS) / OP.GG 스타일의 실시간 전적 및 로비 8명 순위 조회와 함께, DeepSeek V4.1 Flash AI가 현재 정석 메타 적합도와 결정적인 개선 포인트를 정밀 코칭해주는 웹앱입니다.
소환사 프로필 헤더 (LOLCHESS 스타일)
Lv), 최근 전적 기준 평균 등수, 1등 승률, 순방률(TOP 4) 실시간 집계실시간 18시즌 실전 매치 히스토리
★★★), 코스트별(1~5코) 테두리 컬러로비 8인 전체 순위표 아코디언
[로비 8명 전체 순위 보기 ▼] 클릭 시, 1등부터 8등까지 전체 유저의 덱과 레벨, 시너지 랭킹 한눈에 열람로비 기물 경합 기반 대깨 vs 유연성(피봇) 진단
경합 N명) 실시간 계산AI 전력분석관의 4단계 정밀 코칭 리포트
Meta Score 0~100점) & 티어 등급What to Improve)Action Plan)실측 메타 조합 대시보드 (메인 화면)
BIS 탭에서 기물별 BIS 아이템 3종 세트 확인TOP 3 메타 덱 포디움, 코스트·티어·최소표본 필터 + 평균등수/표본/TOP4/코스트 정렬# 덱 데이터 갱신 (롤체지지 메타 페이지 파싱 + 우리 통계 매칭)
# - 개발 서버가 켜져 있어야 기물 통계 매칭률이 높습니다(없으면 통계 없이 생성)
npm run collect:decks
기존 리포트가 "로비 경합" 한 축에 몰리는 문제를 구조적으로 해결했습니다.
lib/coaching.ts 가 경기 데이터에서 6개 축을 0~100점으로 계산합니다.
| 축 | 계산 근거 |
|---|---|
| 경제 운영 | 탈락 스테이지 기준 대비 보드 가치(쓴 골드가 보드로 얼마나 전환됐나) + 표준 레벨 대비 격차 + 이른 탈락 (잔여 골드는 보지 않음 — 탈락 전엔 다 쓰므로) |
| 아이템 설계 | 캐리 3칸 완성도(55%) + 보드 총 장착 수(45%) |
| 템포(레벨/리롤) | 표준형: 스테이지별 표준 레벨(3-2=6, 4-1=7, 5-1=8)과의 격차 · 리롤형: 3성 완성도 + 캐리 3성 여부 |
| 보드 완성도 | 2성+ 비율 + 3성 보너스 |
| 시너지 설계 | 활성 시너지 개수(이상 3개) + 최대 겹침 깊이 |
| 로비 수렴도 | 경합 여부 × 순방 여부 |
경합 축은 다른 축보다 10점 이상 낮을 때만 주제로 채택 → 더 이상 모든 리포트가 경합으로 쏠리지 않습니다.리롤 성과 강의 — 3성 완성과 캐리 3성으로 바뀝니다. 판정 기준은 lib/axisConfig.json의 deckType에 있습니다.concept(원리) → why(왜 이기는가) → evidence(내 데이터 근거, 수치 2개 이상) → alternative(그 순간의 더 나은 선택 + 타이밍) → drill(다음 3판 연습 과제) → checklist(실전 체크리스트 3~5개)
npm run eval:reports -- --runs 2 # 성공률 100% · 폴백 0% · grounding 100% · 점수 고정
prefers-color-scheme)을 따르고, 선택은 localStorage('tft-theme')에 유지app/globals.css의 CSS 변수(--app-bg, --panel, --ink, --muted, --line …)와
Tailwind 토큰(bg-app, bg-panel, text-ink, text-muted, border-line …)으로 관리됩니다.# 의존성 설치
npm install
# 로컬 개발 서버 실행
npm run dev
브라우저에서 http://localhost:3000 접속!
.env.local)# Riot Developer Portal (https://developer.riotgames.com/)
RIOT_API_KEY=RGAPI-xxxx
RIOT_REGION=asia
# DeepSeek API (https://platform.deepseek.com/)
DEEPSEEK_API_KEY=sk-xxxx
# Google Gemini API (선택사항 - Fallback용)
GEMINI_API_KEY=
https://github.com/yashiro0504/tft-ai.git)에 push된 프로젝트를 확인합니다.Add New Project에서 tft-ai 저장소를 Import합니다.RIOT_API_KEY와 DEEPSEEK_API_KEY를 등록합니다.Deploy를 클릭하면 즉시 전 세계에 서비스되는 웹앱으로 배포됩니다!| 엔드포인트 | 역할 | LLM 호출 |
|---|---|---|
POST /api/tft/search | 소환사 프로필 + 최근 매치 리스트 | ❌ |
POST /api/tft/match | 특정 경기(matchId) 1개 정밀 분석 (matchId 캐시) | ✅ |
POST /api/tft/overview | 로드된 여러 경기 종합 분석 | ✅ |
lib/contest.ts), 증강 메타 대조(lib/meta.ts)는 코드가 수치로 산출합니다.lib/grounding.ts): LLM 리포트의 수치 주장(등/명/%/G/라운드, 3.44 같은 소수, 62/100)을 프롬프트에 제공된 실측 데이터와 코드로 대조합니다.
→ 응답/UI에 grounding { score, supported, total, unsupported[] } 로 표시 (낮을수록 창작·환각 가능성).[메타 실측 통계] 블록(기물 12 · 시너지 10 · 아이템 10 · BIS 8, n≥10만) 외의 수치는 인용 금지로 프롬프트에 명시.provenance { patch, source, generatedAt, sample } 를 리포트에 함께 반환해 패치·표본·수집일을 화면에 노출.lib/scoring.ts): metaScore/metaTier 는 LLM이 아니라 코드가 계산합니다.
scoreBreakdown { total, tier, components[], matches, perMatch, version } 포함 → UI에 구성요소별 기여도 바 표시temperature 0.2 + JSON 모드(response_format: json_object), 실패 시 규칙 기반 폴백(isFallback: true)으로 표시.기물 weight = 코스트 × 성급민감도(1성1.4/2성1.0/3성0.5) × (1 + (상대수-1)×0.3)
시너지 weight = 활성단계 × 그 시너지 상대 수
contestScore = 100 × raw / (raw + 25) → 등급: 빈집/보통/경합/심각
Riot 공식 API는 집계 통계(증강 승률/평균등수)를 제공하지 않습니다. 따라서 자체 집계합니다.
lib/metaStats.jsonsample: true(검증 전)일 때만 UI에 샘플 표시, LLM도 "단정 금지" 처리# (권장) 래더 전체 표본 자동 수집 — 특정 소환사에 의존하지 않음
# 챌린저·그랜드마스터·마스터 래더에서 표본 선수를 뽑아 최근 매치를 대량 집계
npm run collect:ladder
# 소환사 시드 기반 수집 (특정 고수 표본)
npm run seeds:pick # 챌린저 랭킹에서 시드 자동 추출 → .env.local SEEDS
npm run collect:meta # SEEDS 기반 수집
→ lib/metaStats.json 을 sample: false + source: "riot-ladder" | "riot-sample" 로 덮어씁니다.
→ 실행 시 UI/LLM이 실측 통계를 인용하게 됩니다.PLAYERS(기본 60), MATCHES_PER_PLAYER(8), MAX_MATCHES(400), RIOT_MIN_INTERVAL_MS(350)lib/summarize.ts 의 cleanName() 결과와 일치해야 합니다(스크립트가 동일 규칙 사용).📖 실측 데이터 수집·튜닝 상세 가이드 → docs/DATA_PIPELINE.md (
.env.local자동 로드,npm run collect:check키 점검, PowerShell/CMD 사용법 포함)
# 1) 골든셋 캡처 — 실제 경기 N개를 고정 입력으로 저장 (data/evalMatches.json)
npm run eval:capture -- "닉네임#KR1" 3
# 2) 반복 평가 — 캐시 우회로 매 실행 실제 LLM 호출 측정 (기본 2회)
npm run eval:reports
# node scripts/evalReports.js --runs 3 --api http://localhost:3000
측정 지표
metaScore === scoreBreakdown.total) 및 실행 간 점수 변동출력: 콘솔 요약 + data/evalReport.json (생성물, gitignore)
CI 게이트: 아래 중 하나라도 실패하면 exit 1
성공률 < 100% · 폴백 발생 · grounding < 85% · 점수-코드 불일치 · 실행 간 점수 변동
| 파일 | 트리거 | 내용 |
|---|---|---|
.github/workflows/ci.yml | push(main, upgrade/**) · PR | Lint → Typecheck → 데이터 점검(meta:check) → Build, 이어서 AI 신뢰성 평가 게이트(성공률 100% · 폴백 0 · grounding ≥85% · 점수 고정 검증) |
.github/workflows/collect-ladder.yml | 매일 21:00 UTC(= 06:00 KST) · 수동 실행 | 래더 표본 수집 → 데이터 검증 → 순위 변동 요약 → lib/metaStats.json 자동 커밋/푸시 |
| 이름 | 필수 여부 | 설명 |
|---|---|---|
RIOT_API_KEY | 래더 수집 필수 | Riot 개발 키는 24시간마다 만료됩니다. 예약 수집을 상시 운영하려면 Personal/Production 키를 사용하거나 주기적으로 Secret 을 갱신하세요. |
DEEPSEEK_API_KEY | AI 평가 필수 | 미설정 시 eval 잡은 안내 메시지를 남기고 건너뜁니다(빌드는 계속 검증됨). |
설정 위치: 저장소 → Settings → Secrets and variables → Actions → New repository secret
# GitHub CLI
gh workflow run collect-ladder.yml -f players=80 -f max_matches=600
gh workflow run collect-ladder.yml -f dry_run=true # 수집만 하고 커밋 안 함
# 로컬 동일 파이프라인
npm run collect:ladder
npm run meta:check # 데이터 무결성 (기물/특성/아이템/조합 최소치)
npm run meta:summary # 직전 수집 대비 순위 변동 ▲▼ 요약
npm run ci # lint + typecheck + meta:check + build
lib/metaStats.json 커밋을 차단합니다(표본 붕괴 방지).lib/metaStats.json 하나이며, data/metaHistory/(로컬 아카이브)·data/evalReport.json 은 .gitignore 로 제외됩니다.lib/metaStats.json 과 비교해 자동 계산되고, Job Summary 에 상승/하락 항목이 표시됩니다.concurrency 로 중복 실행을 막고, 수집 잡은 timeout-minutes: 40 으로 제한합니다.eval 잡 산출물(data/evalReport.json, 서버 로그)은 Actions Artifact 로 업로드됩니다.수집할 때마다 이전 lib/metaStats.json 과 비교해 기물/시너지/아이템의 순위·평균등수 변동을 계산합니다.
rankDelta > 0 = 순위 상승 (예: 5위 → 3위 = ▲2), avgDelta > 0 = 평균등수 개선prevRank, rankDelta, avgDelta, 루트에 prevGeneratedAt변동 기준 날짜data/metaHistory/YYYY-MM-DD.json 로 자동 아카이브 (gitignore)# 수집 시 자동 계산됨
npm run collect:ladder
# 이미 수집된 파일 기준으로 변동만 재계산 (미리보기 / 저장)
npm run meta:deltas
node scripts/attachMetaDeltas.js --prev data/metaHistory/2026-10-17.json --write
md 미만): 기물 / 특성 / 아이템 / BIS 조합 / AI 코치 — 탭 전환 시 랭킹 상단으로 스크롤, 안전 영역(safe-area-inset) 대응viewport-fit=cover 로 iOS 노치/홈 인디케이터 영역 침범 방지/ 검색 포커스, Esc 검색 초기화 (상세 드로어 닫기 포함)lib/constants.ts의 세트18 코스트 표(65종)를 사용합니다. (수집 데이터에 코스트가 포함되면 우선 사용하도록 확장 가능)경합 분석의 모든 파라미터는 lib/contestConfig.json 한 곳에서 관리됩니다 (앱·스크립트 공용).
{
"starSensitivity": { "1": 1.4, "2": 1.0, "3": 0.5 },
"frequencyStep": 0.3,
"traitTierWeight": 1.0,
"saturationK": 25,
"thresholds": { "binzip": 15, "boTong": 40, "gyeonghap": 65 }
}
# 1) 표본 수집 (참가자별 경합 특징 + 등수)
RIOT_API_KEY=RGAPI-xxxx node scripts/collectContestSamples.js "닉네임#KR1" "닉네임2#KR1" ...
# 2) 그리드서치로 가중치/임계값 재산출 (미리보기)
node scripts/tuneContest.js data/contestSamples.json
# 3) 결과 반영 (실측 데이터일 때만)
node scripts/tuneContest.js data/contestSamples.json --write
saturationK: 중앙 raw → score≈50 이 되도록 자동 산출sample:true(검증 전/합성) 데이터로는 --write 가 거부됩니다. 강제하려면 --force.node scripts/genSyntheticSamples.js → data/contestSamples.sample.json