---
task_id: task-1936
type: context
scope: task
created: 2026-04-18
updated: 2026-04-18
status: in-progress
---

# 맥락 노트: task-1936

**task**: task-1936

---

## 결정 근거

### 기존 UI/백엔드 코드 재사용
- 프론트엔드(NaverBlogView.js:969-993)에 모델 선택 드롭다운이 이미 구현됨
- 백엔드(routes_post.py:1901-1912)에 VALID_MODELS 검증이 이미 구현됨
- blog_writer.py에 MODEL_MAP과 provider별 분기가 이미 구현됨
- 따라서 UI/API 수정 불필요, CLI 전환만 수행

### GPT provider CLI 전환 방식
- 기존: `openai.OpenAI()` SDK 직접 호출
- 전환: codex CLI의 `exec` 명령어로 통합 — GPT는 사실상 OpenAI의 모델이므로 codex CLI로 대체 가능
- 대안: gpt CLI 별도 설치 → 불필요한 의존성 추가, 기각

### GLM provider CLI 전환 방식
- 기존: `requests.post()` API 직접 호출
- 전환: `glm-call.py`를 subprocess로 호출, 프롬프트를 임시 파일로 전달
- run-glm.sh는 task 기반이라 부적합, glm-call.py가 실제 API 래퍼
- glm-call.py의 유효 모델: glm-5, glm-4.7, glm-4.7-flash, glm-4.7-flashx

### 3 Step Why
1st Why: "왜 API→CLI 전환이 필요한가?" → 절대 규칙에서 API 키 직접 사용을 금지, CLI 래퍼로 보안 중앙 관리
2nd Why: "왜 CLI 래핑이 최선인가?" → API 키가 CLI 도구 설정에 중앙 관리, 프로세스 격리로 메인 서버 안정성 확보
3rd Why: "왜 다른 대안보다 나은가?" → 각 모델의 CLI/스크립트가 이미 존재(claude, gemini, codex, glm-call.py), 추가 개발 비용 최소

## 참조 자료

- task 지시서: `/home/jay/workspace/memory/tasks/task-1936.md`
- blog_writer.py: `/home/jay/workspace/dashboard/blog_writer.py`
- NaverBlogView.js: `/home/jay/workspace/dashboard/components/NaverBlogView.js`
- routes_post.py: `/home/jay/workspace/dashboard/routes_post.py`
- glm-call.py: `/home/jay/workspace/tools/glm-call.py`
- E2E test: `/home/jay/projects/insuwiki/tests/test_e2e_blog_generate.py`

## 주의사항

- glm-call.py는 --task-file 방식이므로 프롬프트를 임시 파일로 저장 후 전달 필요
- GPT legacy 모델은 codex CLI exec으로 대체 (codex가 OpenAI 기반)
- import openai 제거 시 다른 코드에서 openai를 사용하지 않는지 확인 필요
