특정 uid로 실제 도구·모델 루프를 돌려 호출된 도구·토큰·속도·캐시 히트를 보고하는 /debug/chatToolsSheet, /debug/chatProbe(Sheet) 엔드포인트를 추가한다 (요청별 model 오버라이드로 A/B 가능). prod에 같은 검증을 돌리는 scripts/chat-tools-sheet.ts도 추가한다. 무인증 + 임의 uid의 개인 데이터를 노출하는 검수용 임시 엔드포인트다.
65 lines
2.4 KiB
TypeScript
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);
|
|
});
|