## 2026-10-09 — Studio 3 프롬프트 미리보기 오류 후속 수정
- 프롬프트 생성기 내부에서 선언되지 않은 `visualStyle`을 참조해 자동 갱신이 중단되던 문제를 수정했습니다. AI 기획 완료 후 프롬프트와 규격 배지를 즉시 갱신합니다.
- Preview `https://60154cb6.aichat34-hr-pe-kr.pages.dev`; production `https://592ee80b.aichat34-hr-pe-kr.pages.dev` / `https://hr.pe.kr/aichat34/`. 구문 검사 및 정적 자산 응답 확인, 유료 AI 호출 없음.

# AICHAT34 프로젝트 인수인계

## 2026-10-09 — 복구 초안 요금과 Studio 3 이미지 시트 업데이트
- 기획 응답이 형식 검증에 실패해도 원문을 본인 계정 복구 초안으로 저장하면 크레딧을 유지합니다. 원문 저장 실패 때만 환불합니다. 사용자 화면은 실제 상태를 표시하며 AI 재호출 없이 원문을 편집해 구제할 수 있습니다.
- Studio 3는 표정 6종(화남 추가) + 대표 장면 9컷을 사용합니다. 프롬프트, 3×5 512px 자르기, D1 초안, 게임 저장/불러오기, 대화 프롬프트, 장면 미리보기와 해금 기준을 함께 정렬했습니다.
- AI 기획의 선택형 그림체 6종(포토툰, 웹툰, 애니메이션, 픽셀, 유화, 수채화)을 추가했습니다. 선택하지 않아도 자동 선택됩니다. 기획 JSON과 이미지 생성 프롬프트가 값을 공유합니다.
- Preview `https://8072ad18.aichat34-hr-pe-kr.pages.dev`; A34 Worker release `68b48d4b-ab42-4536-a9c9-57db31e14a5e`; production `https://hr.pe.kr/aichat34/`. JS 구문 검사와 Wrangler dry-run 통과, preview 자산 200. 유료 AI 호출은 하지 않았습니다.


## 2026-10-08 — 실패 기획 응답 복구
- 형식 검증에서 탈락한 OpenRouter 응답은 최대 30,000자를 별도 계정 소유 복구 초안으로 저장합니다. 실패 화면에서 원문을 확인/복사할 수 있고 `내 기획 불러오기`로도 다시 엽니다. 원문은 텍스트로만 처리하며 재호출은 하지 않습니다.
- provider 응답 자체가 없으면 저장할 원문은 없습니다. 기존 사용자 크레딧 환불은 유지되나 공급자 원가는 이미 발생했을 수 있습니다. 정상 초안은 별도 ID로 보존합니다.
- Preview `https://10ce5f84.aichat34-hr-pe-kr.pages.dev`; Worker `ab580865-bac2-462b-8159-6ac27541091b`; production `https://hr.pe.kr/aichat34/`에 반영했습니다.

## 2026-10-08 — 재입장 시 추천답변 복원
- 게임/캐릭터별로 마지막 추천 3개를 localStorage에 저장하고 대화 재입장 때 복원하도록 했습니다. 새 응답이 오면 새 추천으로 교체됩니다.
- 서버·크레딧 로직 변경 없음.

## 2026-10-08 — UI 3 추천답변 중앙 정렬
- 추천답변 바를 입력창과 같은 920px 콘텐츠 폭에 맞춰 중앙 정렬하고, 모바일에서는 10px 여백과 가로 스크롤을 유지합니다.
- CSS-only change. Preview `https://72ec3170.aichat34-hr-pe-kr.pages.dev`, production `https://8a0e4ac8.aichat34-hr-pe-kr.pages.dev`; HTML/CSS 200 확인.

## 2026-10-08 — 수학 학습 토글을 수학 교사 게임으로 한정
- 키워드에 수학 단어가 있다는 이유로 토글이 노출되던 규칙을 교체했습니다. 정서연(`seoyeon`)과 수학 선생/교사/튜터/강사/교수/멘토임이 명시된 커스텀 게임만 대상입니다.
- 정서연 일반 채팅에서 토글과 그래프 옵션이 동작하도록 요청/저장/서버 경로를 연결했습니다. 기본값은 OFF이고 서버도 허용 대상을 검증합니다.
- `app.js`와 Worker 구문 검사 통과. Preview `https://a7108c5e.aichat34-hr-pe-kr.pages.dev`, Pages production `https://c7106923.aichat34-hr-pe-kr.pages.dev`, Worker `8c7a3369-1e1c-4313-a59d-c21781b8d6bc`. 운영 HTML/app.js 200, plan API JSON 401 확인. 유료 AI 응답은 테스트하지 않았습니다.

## 2026-10-08 — UI 3 기본값과 대화 표정 이미지 확대
- 첨부 화면은 UI 3이지만 표정 카드가 최대 190px라 작았습니다. UI 3에서는 데스크톱 최대 420px, 모바일 82vw(최대 360px)로 확대하고 원본 이미지 비율을 유지합니다.
- UI 설정 버전 마이그레이션으로 기존 저장 설정을 UI 3으로 한 번 변경합니다. 이후 UI 1/2 선택은 계속 가능합니다.
- `app.js` 구문 검사 통과. Preview `https://d2f02f78.aichat34-hr-pe-kr.pages.dev`, Pages production `https://e3b728e4.aichat34-hr-pe-kr.pages.dev` (`https://hr.pe.kr/aichat34/`). Production HTML/CSS/JS 200과 UI 3 확대 규칙 및 기본값 업데이트를 확인했습니다.

## 2026-10-08 — AI 기획의 플레이어 이름 임의 생성 방지
- Studio 2 AI 기획에 선택형 `플레이어 호칭`을 추가했습니다. 비우면 이름/별칭을 생성하거나 호칭하지 않고, 계정 닉네임은 가져오지 않습니다. 값을 입력하면 그 호칭만 가끔 그대로 사용합니다.
- planner 지침, 자동 생성 기획 저장 및 수동 임시저장/불러오기에 설정을 연결합니다. 기존 생성된 기획의 문구는 자동으로 소급 변경하지 않습니다.
- 프런트엔드/Worker 구문 검사 통과. Preview `https://70f6003e.aichat34-hr-pe-kr.pages.dev`, Pages production `https://728b7b70.aichat34-hr-pe-kr.pages.dev`, 전용 Worker `9d8ddee1-6f79-48a4-90e2-079ec9dfd3d0`. 운영 HTML/JS 200 및 비로그인 임시저장 API JSON 401 확인. AI 생성 호출은 하지 않았습니다.

## 2026-10-08 — Studio 3 시트 크기 유연화
- 15컷 업로드의 최소 크기를 768×1280px로 낮추고 3:5 비율을 확인하도록 바꿨습니다. 1536×2560 원본이 아닌 생성·다운로드 축소본도 쓸 수 있습니다.
- 3×5 분할 결과는 512×512px로 정규화하며 셀 가장자리를 1.2% 잘라 흰 칸막이가 남지 않도록 합니다. Studio 2 8컷은 영향 없습니다.
- 첨부된 이미지 972×1619px(비율 0.6004)이 새 조건을 통과합니다. Preview `https://370fb068.aichat34-hr-pe-kr.pages.dev` 및 운영 `https://hr.pe.kr/aichat34/`의 HTML/버전 스크립트 응답 200을 확인했습니다. Pages 배포 `https://28599466.aichat34-hr-pe-kr.pages.dev`; `cgame2.js?v=2.34-49`. 실제 업로드/저장은 실행하지 않았습니다.

## 2026-10-08 — AI 기획 장르 표시 및 비용 조정
- AI 기획 장르 체크는 프롬프트 조건, 게임 목록 대표 장르는 AI가 고른 결과/목록 분류로 UI 문구를 구분합니다. 자동 생성 또는 저장 기획 불러오기 후 대표 장르가 별도 결과로 표시됩니다.
- AI 기획 비용을 56C에서 46C로 낮췄습니다. 사용자 잔액 사전 확인, 버튼, Worker 서버 차감이 일치합니다.
- 최대 출력 상한을 4,000→3,200 토큰으로 줄이고 persona 목표를 900~1,500자로 조정했습니다. 최대 출력 원가 감소 폭은 20%이며 실제 평균 절감은 응답 길이에 따라 달라집니다.
- 프런트엔드/Worker JS 구문 검사 및 UI 프리뷰 확인 완료. 원격 D1의 10/6~10/7 기획 3건은 총 $0.017785, 평균 $0.005928/건(평균 입력 1,214·출력 2,226토큰)이었습니다. Preview `https://81ca4275.aichat34-hr-pe-kr.pages.dev`, production `https://hr.pe.kr/aichat34/`, Worker `3a0d4a75-17b2-42b2-8af8-690e9a2812c4`. 실제 AI 호출은 하지 않았습니다.

## 2026-10-06 — 선택형 수학 학습 모드
- LaTeX 원문 노출을 막았습니다. 기존 대화의 `$t_0$` 표시는 새 버전에서 `t₀`처럼 변환되며, 이후 응답은 LaTeX 대신 일반 수식 문자를 쓰도록 안내합니다.
- 수학 관련 커스텀게임 채팅에 브라우저별 게임 설정 `수학 학습 OFF/ON`을 추가했습니다. 기본 OFF이며 켜면 실제 식·풀이와 단계별 연습/힌트 선택지를 캐릭터 서사 안에서 제공합니다.
- 모델과 크레딧 차감표, 응답 상한은 유지합니다. 수학 지침이 켜진 응답은 입력 토큰이 조금 더 사용될 수 있습니다. 수학 관련 제목·시놉시스·페르소나에만 토글이 노출됩니다.
- Preview `https://9c56eb1f.aichat34-hr-pe-kr.pages.dev`; Pages production `https://hr.pe.kr/aichat34/`; Worker `1d5d11c7-6655-4f9d-90b5-075832292f48`.

## 2026-10-06 — LaTeX 원문 수식 표시 보정
- `$t_0$`, `$x^2$`, `\\frac{1}{2}`를 `t₀`, `x²`, `(1)/(2)`로 읽기 쉽게 바꾸어 예전 대화까지 다시 표시합니다. 새 수학 응답은 LaTeX 코드 대신 일반 텍스트/유니코드 수식을 사용합니다.
- 화면 표시는 `app.js`에서 안전하게 처리하고 A34 Worker의 수학 모드 지침을 보강했습니다. 실제 외부 AI 요청 없이 확인했습니다.
- Worker release `1d5d11c7-6655-4f9d-90b5-075832292f48`.

## 2026-10-06 업데이트 — 대기 표시, 해금, 요청 크기 안정화
- Studio AI 기획 대기 상태는 실제 초 단위 시간과 30초 이후 지연 안내를 표시합니다. 카드 장면 일러스트는 1·4·8·14화에 순차 해금됩니다.
- 채팅은 전체 게임 데이터 대신 필요한 텍스트와 장면 캡션만 전송합니다. 이미지 Base64를 채팅 요청에서 제외하고, 기존 서버 예산(최대 18,000자에서 게임 설정과 입력을 뺀 대화 이력)을 사용하며 현재 입력은 history에서 중복 제거합니다. 답변 분량과 출력 한도는 그대로입니다.
- 응답의 타이핑 표시가 끝날 때까지 전송 잠금을 유지해 추천답변 연속 클릭과 응답 전 다음 턴 전송을 막습니다.
- OpenRouter 확인값: 계정 누적 사용 `$3.684961643 / $5`, 현재 키 사용 `$0.0585775`; A34 내부 10월 6일 AI 기획 1건 `$0.0072846`, 채팅 요청은 0건입니다. 이번 413은 차감 전 거부라 공급자 호출이 없습니다. 관리용 Activity API가 403이어서 과거 날짜/엔드포인트/모델별 사용량은 확인할 수 없습니다.

## 2026-10-06 — 첫 화면 커스텀 게임 목록 로딩 개선
- 초기에는 지아 카드만 보이다 클라우드 카탈로그가 늦게 교체되는 현상을 개선했습니다. 클라우드 목록을 받기 전에는 카드 스켈레톤을 보여주고, 목록 응답 후 전체 게임 카드를 한 번에 표시합니다.
- 목록 API `mode=cards`는 게임 제목/장르/소개/대표 이미지 1장 등 카드 정보만 반환합니다. 카드가 화면 가까이 오면 별도 미리보기 API에서 표정·장면 최대 3장을 가져오고, 누르면 크게 볼 수 있습니다. 편집이나 플레이 시 상세 API에서 전체 게임 데이터를 가져옵니다.
- 목록 응답은 395,309 bytes로 유지합니다. 화면에 가까워진 카드에 표정/장면 최대 3장을 별도로 요청하며, 검증 게임 응답은 158,095 bytes였습니다. 카드 썸네일 클릭 시 라이트박스로 확대됩니다. 미리보기는 AI 호출이나 OpenRouter 과금을 하지 않습니다. Preview branch `https://codex-card-previews.aichat34-hr-pe-kr.pages.dev`; Worker `a3fef813-e5c9-41c3-a34e-8dd70483055b`; 운영 Pages `https://hr.pe.kr/aichat34/`.

## 복구 기준과 범위
- 복구 기준: aichat31 Pages immutable deployment `56195235` (2026-10-01, 앱 31.10 / CSS 31.5).
- A34는 확인된 기준 파일을 복제해 경로·브라우저 저장 키·세션 쿠키·브랜딩을 A34 전용으로 바꾼 독립 복구본입니다. A31과 A33의 앱/배포는 수정하지 않습니다.

## 배포 및 Cloudflare 자원
- 앱: `https://hr.pe.kr/aichat34/`; 프로젝트 홈: `https://hr.pe.kr/aichat34/project/`.
- Pages: `aichat34-hr-pe-kr`; 전용 Worker: `aichat34-api`; 전용 D1: `aichat34-db` / `AICHAT34_DB`.
- 2026-10-06 삭제 요청: `코드명 예진`과 `코드명 유이` (IDs `dac863af-1e01-4ebb-ba36-2c487fa6cef9`, `09fe3987-c1ea-439c-a7ff-bb506b057ccd`)를 A34 원격 D1에서 삭제했습니다. stale local copies는 cgame2.js에서 제거하며 Worker `5aa79823-a9b9-4ad0-a19e-71c6ef90c3ad` 목록/저장에서도 제외합니다. Preview `https://a63d4bc8.aichat34-hr-pe-kr.pages.dev`; Pages production `https://c6da31a8.aichat34-hr-pe-kr.pages.dev`.
- 2026-10-06 광장/닉네임/카드 이미지 개선 배포: Pages preview `https://42f26a02.aichat34-hr-pe-kr.pages.dev`, Pages production `https://5459c2f3.aichat34-hr-pe-kr.pages.dev`, Worker release `4690d418-6b77-4827-a84f-2cfc6c40e326`; migrations `0011_lounge_posts.sql`, `0012_lounge_nicknames.sql` 적용 완료.
- 2026-10-06 기본 화면 변경: 커스텀게임 탭을 첫 번째로 배치하고 이름을 단순화했습니다. 진입 및 로고 클릭 시 커스텀게임 목록이 열립니다. Preview `https://b3e4b913.aichat34-hr-pe-kr.pages.dev`; Pages production `https://1da4b67b.aichat34-hr-pe-kr.pages.dev`; `https://hr.pe.kr/aichat34/` HTTP 200 확인.
- 2026-10-06 확장 장르 Preview: `https://d5372ad3.aichat34-hr-pe-kr.pages.dev` (branch `codex-genres-modern`); Pages production `https://afba5ddc.aichat34-hr-pe-kr.pages.dev`; A34 Worker release `dc0cb082-b1d7-451d-a45d-9610b32045e7`.
- Worker 라우트는 A34 경로만 처리하며 공유 `hr-z-posts-proxy`를 배포하지 않습니다.
- D1 migrations 0001–0010 적용. 공개 게임 카탈로그 시드만 복사했으며 A31 계정·잔액·결제·대화·개인 게임 데이터는 복사하지 않았습니다.
- 2026-10-06 모델/요금 변경: Preview `https://44b6e8b9.aichat34-hr-pe-kr.pages.dev`, Pages 운영 `https://hr.pe.kr/aichat34/`, 전용 Worker `a6bebb9e-576a-4e24-84b8-8710b3f7d5b9`. 페이지/JS 자산 및 JSON 목록 API 응답을 확인했습니다.

## AI 모델·크레딧 비용
- 화면 티어와 A34 `/aichat34/api/chat` 활성 라우트 모델: 스피드 `google/gemini-3.1-flash-lite`, 스탠다드 `google/gemini-2.5-flash`, RP `meta-llama/llama-3.3-70b-instruct`, 울트라 `google/gemini-3.7-flash`. 저가 티어의 2.5 Flash Lite는 2026-10-20 종료 예정이라 교체했습니다.
- 일반 차감: speed 36C, standard 46C, rp 39C, ultra 66C. 장문 차감: 56C, 76C, 59C, 106C. Studio AI 기획은 46C. 화면/클라이언트의 사전 잔액 확인과 Worker의 서버 차감이 같은 값을 사용합니다.
- 장문은 `longFormMode` 요청 시 Worker가 2,000 max tokens를 허용하고 묘사 지침을 추가합니다. 일반 커스텀 게임은 기존 800 max tokens를 유지합니다. OpenRouter 실패 시 기존 서버 환불 경로를 유지합니다.
- 충전 보너스 표시: 4,000원→4,500C(12.5% 추가), 7,000원→8,500C(21.4% 추가). VIP 상품 단가로 36C의 최소 실결제 환산액은 약 29.65원입니다. 기존 잔액은 그대로이며 이후 사용분부터 조정 요금이 적용됩니다.
- OpenRouter 현행 단가는 공개 모델 페이지를 참고하고, 실제 원가는 입력/출력 토큰과 제공자 라우팅에 따라 달라집니다. 예상치는 비용 계획용이지 순이익 보장이 아닙니다. 결제 수수료·부가세·환불·운영비 제외 전에는 99.99% 마진을 약속할 수 없습니다.
- 2026-10-06 비용 보호: 서버 입력 크기·문맥 상한, OpenRouter 티어별 제공자 가격 상한 및 실제 비용 기록을 적용했습니다. 90일 보관 표 `ai_usage_costs`에는 대화 원문이 없습니다. Worker `bdb95b5d-2680-4384-a601-995916d03361`; Preview `https://dba639e1.aichat34-hr-pe-kr.pages.dev`; Pages 운영 `https://hr.pe.kr/aichat34/`. 내부 SQL 집계 예시는 저장소 루트 `PROJECT_CONTEXT.md`를 확인하세요.

## 대화 기록과 환불
- 회원이 대화 저장에 동의하면 일부 입력/응답을 최대 90일 저장합니다. 동의 철회 시 기존 기록도 삭제됩니다. 비동의 기록은 수집하지 않습니다.
- 세 관리자 Google 주체 ID만 서버에서 접근 권한을 확인합니다. 다른 Google 계정은 기록 조회와 크레딧 반환 API에서 거부됩니다.
- 운영자는 조회 화면에서 기록별 크레딧을 한 번 반환할 수 있습니다. 반환량은 기록된 사용량으로 제한하고, 중복 반환은 막으며 credit ledger와 관리자 접근 이력에 기록합니다.
- 사용자 저장 동의가 없는 기간의 과거 대화는 복구할 수 없습니다. 해당 계정은 설정에서 저장을 직접 켜야 새 기록부터 조회됩니다.
- 키 누락 시 차감 전에 중단합니다. 제공자 응답 실패나 같은 긴 응답 반복 시 reserved credits를 서버에서 돌려줍니다. 반복/오류 자동 환불 내역은 저장 동의한 계정에 한해 운영자 대화 기록에 표시합니다.

## Studio 2 기획 임시저장
- AI 기획 장르는 복수 선택 가능하며 선택하지 않으면 모델이 장르를 고릅니다. 복사형 8컷 이미지 프롬프트는 시놉시스, 페르소나, 챕터 제목, 선택 장르를 포함합니다.
- AI 기획과 게임 목록에서 로맨스, 현대극, 일상, 코미디, 판타지, SF, 학원, 성장, 액션, 모험, 무협, 스릴러, 미스터리(떡밥), 추리, 공포, 범죄, 역사, 생존, 재난, 포스트아포칼립스, 스포츠, 음악·예술, 정치·전쟁을 공통 장르로 사용합니다.
- 로그인 사용자가 작성하거나 생성한 텍스트 기획은 A34 계정별 D1 초안으로 자동 저장되며, Studio의 `내 기획 불러오기`에서 다른 기기에서도 이어 쓸 수 있습니다. 업로드 이미지는 초안에 포함하지 않습니다.
- 유효한 유료 AI 기획 결과는 API가 응답을 보내기 전에 작성자 계정 초안으로 먼저 저장합니다. 브라우저 연결이 응답 직후 끊겨도 `내 기획 불러오기`에서 찾을 수 있습니다.
- 작성자는 본인 초안만 조회·수정·삭제할 수 있습니다. 세 allowlist 관리자 Google 계정은 운영 지원을 위해 초안을 조회할 수 있으며, 조회는 `conversation_admin_access`에 기록됩니다.
- 사용자 안내문은 Studio 저장 패널에 표시합니다. 기존 채팅 감사 저장 동의와 별도의 기능입니다.

## 커스텀게임 연재와 대표 일러스트
- 8컷 시트의 하단 네 이미지는 작품 분위기를 상상하기 위한 대표 장면 참고 이미지이며, 회차 요약이나 4화 완결 플롯이 아닙니다. 장면 캡션에서 과거 저장된 `1화` 등의 접두어는 플레이 화면에서 숨깁니다.
- 연재 회차는 이미지 수와 독립적으로 계속 이어지며, 최종 결말은 사용자가 원하지 않는 한 내지 않습니다. 기획 페르소나에는 매번 고정 클리셰 대신 작품에 맞는 구체적인 복수 서사 갈래와 단계별 이정표를 작성합니다.
- 이미지 슬롯은 회차 1·4·8·14 무렵 순서대로 해금됩니다. 회차 4에 도달해도 나머지 이미지가 모두 해금되지 않습니다.
- 사용자 대화 이력은 브라우저에서 최근 20개 메시지를 보내고 Worker가 커스텀게임 요청에 최근 20개 메시지를 사용합니다.
- 2026-10-06 적용: Worker `ab9482b5-124f-49b7-965a-2d08582f66df`; Pages preview `https://7902692e.aichat34-hr-pe-kr.pages.dev`; Pages production `https://9555760d.aichat34-hr-pe-kr.pages.dev`.

## 프로젝트 탐색과 보안
- `/project/`에서 README, 소스 파일, 변경 기록과 공개 클라이언트/마이그레이션 묶음을 확인합니다.
- Worker 원본과 비밀값은 공개 다운로드에 넣지 않습니다. 백엔드 수정은 권한 있는 비공개 작업 사본에서 진행합니다.
- `OPENROUTER_API_KEY`가 A34에 없으면 AI 기능은 응답하지 않으며 크레딧도 차감하지 않습니다. 운영자가 Cloudflare Worker Secret으로 설정해야 합니다.
- 2026-10-06: 로컬 Codex 기록에서 찾은 유효 키를 `OPENROUTER_API_KEY`로 A34 전용 Worker Secret에 등록했습니다. 실제 모델 호출은 하지 않았습니다. OpenRouter `/credits` 당시 총 $5, 누적 사용 $3.675888943, 잔액 추정 $1.324111057; `/activity`는 이 키 권한으로 403이므로 세부 사용 내역은 조회할 수 없습니다.

## 광장과 카드 이미지
- 광장 피드는 공개이며 글/답글/좋아요/신고는 A34 로그인 세션을 확인합니다. 게시글은 280자, 15초 작성 간격, 사용자당 하루 40건 제한을 두고 작성자만 삭제할 수 있습니다. 별도 광장 닉네임을 저장해야 글을 게시할 수 있고 Google/service username은 공개되지 않습니다. 닉네임이 없던 계정은 계정 ID와 무관한 임의 `익명-XXXXXXXX` 이름을 발급받습니다. 신고 목록 및 숨김 처리는 기존 세 운영자 Google 주체 ID로 제한합니다.
- 광장 데이터 migration `0011_lounge_posts.sql`은 A34 D1에만 적용합니다. 공개 작성자명은 서비스 username이며 이메일은 조회/노출하지 않습니다.
- Studio 2 목록 카드는 실제 이미지가 있을 때 1화 장면과 등록 표정(미소/수줍음/눈물 등)에서 게임 ID에 따라 고정 대표 이미지를 고릅니다. 파일이 없으면 기존 표지를 사용합니다. 새로고침 때마다 이미지가 바뀌는 무작위 동작은 피합니다.
- 2026-10-06, A34 `a30soori` 계정의 기획 요청 차감 중 Worker 수정 전 2건(총 30C)을 실패 가능성이 높다고 확인해 D1 크레딧 원장에 환불했습니다. 수정 후 차감 1건은 성공 가능성이 있어 환불하지 않았습니다. 당시 로컬 OpenRouter 키는 401로 거부되어 제공자 청구액은 검증하지 못했습니다.
