
    (<i-                         d Z ddlZddlZddlZddlZddlZddlZddddddZd	Zd
Z	dZ
dZdZdZdZg dZdedefdZdefdZdedededededefdZdej,                  fdZddZedk(  r e        yy)uG   
glm-call.py - z.ai API (OpenAI 호환) 직접 호출 CLI 스크립트
    Nu8  당신은 시니어 백엔드 개발자입니다.
전문 분야: Python, FastAPI, 데이터 모델링, REST API 설계, 데이터베이스, 보안.
코딩 표준: black 포맷, isort 정렬, type hints 필수, docstring 작성.
항상 에러 처리를 포함하고, 테스트 가능한 코드를 작성하세요.u,  당신은 시니어 프론트엔드 개발자입니다.
전문 분야: React, TypeScript, Next.js, Tailwind CSS, 컴포넌트 설계, 상태 관리.
코딩 표준: ESLint 준수, 접근성(a11y) 고려, 반응형 디자인.
재사용 가능한 컴포넌트를 작성하고, 성능을 고려하세요.u?  당신은 시니어 UX/UI 설계자입니다.
전문 분야: 와이어프레임, 정보 아키텍처, 사용성 테스트, 디자인 시스템, 접근성.
사용자 중심 설계 원칙을 따르고, 명확한 설계 문서를 작성하세요.
시각적 일관성과 사용 편의성을 최우선으로 고려하세요.uO  당신은 시니어 QA 엔지니어입니다.
전문 분야: pytest, 단위 테스트, 통합 테스트, 엣지 케이스 분석, 테스트 커버리지.
코딩 표준: 테스트 함수명은 test_로 시작, arrange-act-assert 패턴, fixture 활용.
버그 리포트는 재현 단계, 예상 결과, 실제 결과를 명시하세요.u   당신은 범용 AI 어시스턴트입니다.
요청된 작업을 정확하고 효율적으로 수행하세요.
결과물은 명확하고 실용적이어야 합니다.)backendfrontenduxuitestergeneralz4https://api.z.ai/api/coding/paas/v4/chat/completionsz/home/jay/workspace/.env.keysglm-5i          x   )r   zglm-4.7zglm-4.7-flashzglm-4.7-flashxpathreturnc                 h   i }	 t        | dd      5 }|D ]  }|j                         }|r|j                  d      r'd|vr,|j                  d      r|dd }|j                  d      \  }}}|j                         }|j                         }|j                  d	      r|j	                  d	      s"|j                  d
      r|j	                  d
      r|dd }|||<    	 ddd       |S # 1 sw Y   |S xY w# t
        $ r Y |S t        $ r)}t        d| t        j                         Y d}~|S d}~ww xY w)u   
    .env 형식의 키 파일을 직접 파싱하여 dict 로 반환합니다.
    따옴표(작은/큰따옴표) 제거, 주석(#) 및 빈 줄 무시.
    rutf-8encoding#=zexport    N"'   u)   [경고] .env.keys 파일 읽기 오류: file)
openstrip
startswith	partitionendswithFileNotFoundErrorOSErrorprintsysstderr)r   resultflinekey_	raw_valueexcs           ?/home/jay/workspace/.worktrees/task-2057-dev2/tools/glm-call.py_parse_env_keys_filer.   G   sB   
 FR$g. 	(! (zz|ts3d???9-8D$(NN3$7!Q	iik%OO-	((-)2D2DS2I((-)2D2DS2I )!BI's#(	(. M/	(. M	   M  R9#?cjjQQMRs;   C4 C
C'C4 'C1,C4 1C4 4	D1 D1D,,D1c                  >   t         j                  j                  dd      j                         } | r| S t	        t
              }|j                  dd      j                         } | r| S t        dt
         dt        j                         t        j                  d       y)u\   
    GLM_API_KEY 를 로드합니다.
    우선순위: 환경변수 > .env.keys 파일
    GLM_API_KEY uc   [오류] GLM_API_KEY 를 찾을 수 없습니다.
  환경변수 GLM_API_KEY 를 설정하거나
  u:    파일에 GLM_API_KEY="..." 형식으로 추가하세요.r   r   N)
osenvirongetr   r.   ENV_KEYS_PATHr#   r$   r%   exit)api_keyenv_varss     r-   load_api_keyr9   h   s     jjnn]B/557G $M2Hll="-335G		OU	W ZZ	 HHQK    r7   modelsystem_promptuser_message
max_tokensc           
         d|  dd}|d|dd|dg|dd}d	}t        t        d
z         D ]  }|dkD  rFt        d| dt         dt         dt        j
                         t        j                  t               	 t        j                  t        ||t              }	|	j                          |	j                         }
|
j                  dg       }|st        d|
       |d   j                  di       j                  dd      }|d}|c S  t        d t         d!| t        j
                         t	        j4                  d
       y	# t        j                   j"                  $ r5}dt         d| }t        d| t        j
                         Y d	}~hd	}~wt        j                   j$                  $ r}|j&                  |j&                  j(                  nd}d}|j&                  '	 |j&                  j*                  }n# t,        $ r Y nw xY wd| d| d| }t        d| t        j
                         Y d	}~d	}~wt        j                   j.                  $ r.}d| }t        d| t        j
                         Y d	}~Yd	}~wt        t0        t        j2                  f$ r.}d| }t        d| t        j
                         Y d	}~d	}~ww xY w)"u   
    z.ai API 를 호출하고 assistant 응답 문자열을 반환합니다.
    최대 MAX_RETRIES 회 재시도하며, 실패 시 sys.exit(1).
    zBearer zapplication/json)AuthorizationzContent-Typesystem)rolecontentuserF)r;   messagesr>   streamNr   r   u   [재시도] /z ... u
   초 대기r   )headersjsontimeoutchoicesu$   응답에 choices 가 없습니다: messagerC   r1   u   요청 타임아웃 (zs): u	   [오류] ?zHTTP u	    오류: u   
  응답 본문: u   네트워크 오류: u   응답 파싱 오류: u!   [오류] 최대 재시도 횟수(u+   )를 초과했습니다. 마지막 오류: )rangeMAX_RETRIESr#   RETRY_DELAYr$   r%   timesleeprequestspostAPI_URLREQUEST_TIMEOUTraise_for_statusrI   r4   
ValueError
exceptionsTimeout	HTTPErrorresponsestatus_codetext	ExceptionRequestExceptionKeyErrorJSONDecodeErrorr6   )r7   r;   r<   r=   r>   rH   payload
last_errorattemptr\   datarK   rC   r,   statusbodys                   r-   call_apiri      s    #7),*G
 -85
 !G Jq) 1=Q;wiqU;-zRZZ JJ{#)	=}}'	H %%'==?D hhy"-G #Gv!NOOajnnY377	2FGN51=h 

+K=8cdncopZZ HHQK9 ""** 	=00AcUKJIj\*<<"",, 		=141IS\\--sFD||'<<,,D   	#6I$PJIj\*<<""33 	=06JIj\*<<Hd&:&:; 	=1#7JIj\*<<	=sa   ;BEK$*F K42H<'G>=H<>	H
H<	H

,H<< K#J!K&#KKc            	         t        j                  ddt         j                  d      } | j                  d      }|j	                  ddd	
       |j	                  dddd       | j	                  dt        t        j                               dd       | j	                  dt        t        dt         d       | j	                  dt        t        ddt         d       | j	                  ddd
       | S )Nzglm-callu   z.ai GLM API 직접 호출 CLIu   예시:
  python3 glm-call.py --role backend --task "FastAPI 엔드포인트 구현"
  python3 glm-call.py --role backend --task-file /path/to/task.md --model glm-5 --output /path/to/output.md
  python3 glm-call.py --task "이 코드 리뷰해줘"
)progdescriptionformatter_classepilogT)requiredz--taskTEXTu   인라인 텍스트 입력)metavarhelpz--task-fileFILE	task_fileu   파일에서 태스크 읽기)rq   destrr   z--roler   u"   역할 선택 (기본값: general))rK   defaultrr   z--modelu   사용할 모델 (기본값: )z--max-tokensr>   u   최대 토큰 수 (기본값: )typerv   ru   rr   z--outputuE   결과를 저장할 파일 경로 (동시에 stdout 으로도 출력))argparseArgumentParserRawDescriptionHelpFormatteradd_mutually_exclusive_groupadd_argumentlistSYSTEM_PROMPTSkeysVALID_MODELSDEFAULT_MODELintDEFAULT_MAX_TOKENS)parserinput_groups     r-   build_parserr      s%   $$4 <<		F 55t5DK)  
 ,	   ^((*+1	   ,]O1=	   "-.@-AC   T   Mr:   c                  "   t               } | j                         }|j                  |j                  }n4|j                  }	 t	        |dd      5 }|j                         }d d d        j                         s0t        dt        j                         t        j                  d       t               }t        |j                     }t!        ||j"                  |||j$                  	      }t        j&                  j)                  |       |r0|j+                  d
      st        j&                  j)                  d
       t        j&                  j-                          |j.                  r	 t0        j2                  j5                  |j.                        }	|	rt1        j6                  |	d       t	        |j.                  dd      5 }|j)                  |       |r"|j+                  d
      s|j)                  d
       d d d        t        d|j.                   t        j                         y y # 1 sw Y   xY w# t        $ r7 t        d| t        j                         t        j                  d       Y t        $ r>}t        d| t        j                         t        j                  d       Y d }~Ld }~ww xY w# 1 sw Y   xY w# t        $ r=}t        d| t        j                         t        j                  d       Y d }~y d }~ww xY w)Nr   r   r   u,   [오류] 파일을 찾을 수 없습니다: r   r   u   [오류] 파일 읽기 실패: u1   [오류] 태스크 내용이 비어 있습니다.)r7   r;   r<   r=   r>   
T)exist_okwu	   [저장] u   [오류] 파일 저장 실패: )r   
parse_argstaskrt   r   readr!   r#   r$   r%   r6   r"   r   r9   r   rB   ri   r;   r>   stdoutwriter    flushoutputr2   r   dirnamemakedirs)
r   argsr=   	task_pathr'   r,   r7   r<   r&   
output_dirs
             r-   mainr   "  sD   ^FD yyyyNN		iw7 (1 vvx( A

S nG #499-M jj#!??F JJVfood+

JJ {{	5JJ6dkk39 "Q&//$"7GGDM" Idkk]+#**= I( (  	@LSVS]S]^HHQK 	3C59

KHHQKK	H" "
  	3C59

KHHQKK	sg   H4 H' H4 %AK ?6J<50K 'H1,H4 4<J93J9;3J44J9<KK 	L3L		L__main__)r   N)__doc__ry   rI   r2   r$   rQ   rS   r   rU   r5   r   r   rO   rP   rV   r   strdictr.   r9   r   ri   rz   r   r   __name__ r:   r-   <module>r      s     	 
  	_	W	V	^	B5H A/ Fs t Bc <RRR R 	R
 R 	Rt:h-- :D:z zF r:   