# task-1152.1 완료 보고서: GLM 간단 호출 스크립트 구현

## SCQA

**S**: dev8-team이 GLM 모델을 호출하는 방식이 3가지(OpenClaw, MCP, 단순 스크립트) 중 MCP(task-1141.1)로 구현되어 있었다.

**C**: MCP 방식은 토큰 소비가 과하고 구조가 무거워, 가장 가벼운 2번 방식(단순 Python CLI 스크립트)으로 전환이 필요하다.

**Q**: requests 기반 단일 Python 스크립트로 MCP 서버 없이 z.ai API를 직접 호출할 수 있는가?

**A**: `glm-call.py` (346행) 구현 완료. requests 라이브러리로 OpenAI 호환 API를 직접 호출하며, 역할별 system prompt 5종, 모델 4종 선택, --task/--task-file 입력, --output 저장을 지원한다. pytest 51건 전체 통과(0.20s), pyright 에러 0건. GLM-WORKFLOW.md(v6)와 run-glm.sh(v2)도 glm-call.py 기반으로 업데이트.

## 생성/수정 파일

- **(신규)** `/home/jay/workspace/tools/glm-call.py` — 핵심 CLI 스크립트 (346행)
- **(신규)** `/home/jay/workspace/tools/tests/test_glm_call.py` — 유닛 테스트 51건
- **(수정)** `/home/jay/workspace/teams/dev8/GLM-WORKFLOW.md` — v5→v6: MCP→glm-call.py 전환
- **(수정)** `/home/jay/workspace/teams/dev8/run-glm.sh` — openclaw→glm-call.py 래퍼

## 구현 상세

| 기능 | 구현 |
|---|---|
| API 호출 | requests.post → z.ai OpenAI 호환 API |
| API Key | 환경변수 > .env.keys 직접 파싱 (export 접두어 처리) |
| 역할 | backend, frontend, uxui, tester, general (기본) |
| 모델 | glm-5(기본), glm-4.7, glm-4.7-flash, glm-4.7-flashx |
| 입력 | --task 인라인 / --task-file 파일 |
| 출력 | stdout + --output 파일 저장 |
| 재시도 | 최대 2회, 5초 간격 |
| 타임아웃 | 120초 |
| 에러 | exit code 1 + stderr 메시지 |

## 테스트 결과

- pytest: **51 passed** (0.20s)
- pyright: **0 errors, 0 warnings**
- 테스트 범위: _parse_env_keys_file(10), load_api_key(5), call_api(11), build_parser(14), main(11)
- API 실제 호출: z.ai 잔액 부족(HTTP 429 "Insufficient balance")으로 응답 수신 불가. 에러 처리/재시도 로직은 정상 동작 확인.

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **export 접두어 미처리** — .env.keys 파서에서 `export ` 접두어를 strip하는 로직 추가 (`glm-call.py:85-86`)
2. **Pyright Optional 접근 에러** — 테스트 파일에서 glm_call이 None일 수 있는 타입 이슈. `types.ModuleType("stub")` 패턴으로 해결 (`test_glm_call.py:42`)
3. **미사용 StringIO import** — 테스트 파일에서 제거

### 범위 외 미해결 (1건)
1. **z.ai API 잔액 부족** — 범위 외 사유: API 크레딧 충전은 외부 운영 이슈. 스크립트 기능은 모킹 테스트로 검증 완료.

## 셀프 QC 체크리스트
- [x] 1. 영향 파일: GLM-WORKFLOW.md, run-glm.sh (모두 업데이트 완료)
- [x] 2. 엣지 케이스: 빈 태스크, 파일 미존재, API 키 미설정, 타임아웃, 따옴표 파싱
- [x] 3. 작업 지시 일치: 10개 요구사항 전체 구현
- [x] 4. 에러 처리: exit(1) + stderr, 재시도 로직
- [x] 5. 테스트 커버리지: 51건 (5개 클래스)
- [x] 6. 이슈 자체 해결: 3건 해결, 1건 범위 외
- [x] 7. 아키텍처 원칙: 단일 파일, 외부 의존성 최소화(requests만)
- [x] 8. 인터페이스 변경: GLM-WORKFLOW.md v5→v6 문서 갱신 완료
