mmday-firebase/scripts/chat-tools-sheet.ts
윤정민 40dcb41d99 Add debug endpoints and scripts to evaluate chat tools and models.
특정 uid로 실제 도구·모델 루프를 돌려 호출된 도구·토큰·속도·캐시 히트를
보고하는 /debug/chatToolsSheet, /debug/chatProbe(Sheet) 엔드포인트를 추가한다
(요청별 model 오버라이드로 A/B 가능). prod에 같은 검증을 돌리는
scripts/chat-tools-sheet.ts도 추가한다.

무인증 + 임의 uid의 개인 데이터를 노출하는 검수용 임시 엔드포인트다.
2026-06-16 16:52:21 +09:00

65 lines
2.4 KiB
TypeScript

/**
* 채팅 도구(짹) 실호출 결과 시트 — standalone 실행기.
*
* Cloud Function(`/debug/chatToolsSheet`)과 동일한 로직(chatToolsSheetService)을
* 로컬에서 prod 데이터에 붙여 실행하고, 결과를 tmp/ 아래 Markdown/JSON으로 떨군다.
*
* ⚠️ 실제 prod 데이터를 읽고 KBO 캐시에 쓴다(유저 데이터는 read-only). 수동 실행용.
*
* 실행:
* gcloud auth application-default login # 또는 GOOGLE_APPLICATION_CREDENTIALS=<sa.json>
* npx tsx scripts/chat-tools-sheet.ts <uid>
*
* 옵션(env): FIREBASE_PROJECT(기본 mmday-panit), CHAT_TOOLS_PLAYER, CHAT_TOOLS_DATE
*/
// 반드시 src/* 보다 먼저 — prod 앱을 초기화한다(import 순서가 곧 실행 순서).
import { BOOTSTRAP_PROJECT } from "./_bootstrap";
import { mkdirSync, writeFileSync } from "node:fs";
import { join } from "node:path";
import {
runChatToolsSheet,
renderSheetMarkdown,
type SheetOptions,
} from "../src/services/chatToolsSheetService";
async function main(): Promise<void> {
const uid = (process.argv[2] ?? process.env.CHAT_TOOLS_UID ?? "").trim();
if (!uid) {
console.error("사용법: npx tsx scripts/chat-tools-sheet.ts <uid> (또는 CHAT_TOOLS_UID=<uid>)");
process.exit(1);
}
const opts: SheetOptions = {
player: process.env.CHAT_TOOLS_PLAYER?.trim() || undefined,
date: process.env.CHAT_TOOLS_DATE?.trim() || undefined,
};
console.log(`[chat-tools-sheet] project=${BOOTSTRAP_PROJECT} uid=${uid} — 도구 실호출 중…`);
const sheet = await runChatToolsSheet(uid, opts);
for (const r of sheet.results) {
console.log(` ${r.ok ? "✓" : "✗"} ${r.tool} [${r.label}] ${r.elapsedMs}ms`);
}
const md = renderSheetMarkdown(sheet);
const outDir = join(process.cwd(), "tmp");
mkdirSync(outDir, { recursive: true });
const stamp = sheet.meta.generatedAt.replace(/[:.]/g, "-");
const base = `chat-tools-sheet-${uid}-${stamp}`;
const mdPath = join(outDir, `${base}.md`);
const jsonPath = join(outDir, `${base}.json`);
writeFileSync(mdPath, md, "utf8");
writeFileSync(jsonPath, JSON.stringify(sheet, null, 2), "utf8");
const okCount = sheet.results.filter((r) => r.ok).length;
console.log(`\n[chat-tools-sheet] 완료: ${okCount}/${sheet.results.length} 성공`);
console.log(` • Markdown: ${mdPath}`);
console.log(` • JSON: ${jsonPath}`);
}
main().catch((err) => {
console.error("[chat-tools-sheet] 치명적 오류:", err);
process.exit(1);
});