
    (<i(                        U d Z ddlZddlZddlmZ ddlmZ dZej                  j                  dd      Z
dZd	Zd
ZdddddZeeef   ed<    ee
ee      Z ed      Zdeeeef      dededefdZej/                         	 	 	 d&dededededef
d       Zej/                         	 	 	 d'dededededef
d       Zej/                         dedefd       Zej/                         dedefd        Zej/                         dedefd!       Zej/                         dedefd"       Zed#k(  rej?                  d$%       yy)(u/   GLM MCP Server - FastMCP 기반 GLM API 래퍼.    N)OpenAI)FastMCPz#https://api.z.ai/api/coding/paas/v4GLM_API_KEYz19bfe3868d21d4697a84787c614c4c607.TIN4HD6DKjr8QSkBx         u8  당신은 시니어 백엔드 개발자입니다.
전문 분야: 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 활용.
버그 리포트는 재현 단계, 예상 결과, 실제 결과를 명시하세요.)backendfrontenduxuitesterSYSTEM_PROMPTS)api_keybase_urltimeoutzglm-mcpmessagesmodel
max_tokensreturnc                    d}t        t        dz         D ][  }	 t        j                  j                  j                  || |      }|j                  d   j                  j                  }||c S dc S  t        dt        dz    d|       # t        $ r.}|}|t        k  rt        j                  t               Y d}~d}~ww xY w)u  GLM API를 호출하고 응답 텍스트를 반환합니다.

    재시도 로직을 포함하며, 최대 MAX_RETRIES 회 재시도합니다.

    Args:
        messages: OpenAI 형식의 메시지 리스트.
        model: 사용할 모델 이름.
        max_tokens: 최대 생성 토큰 수.

    Returns:
        모델이 생성한 텍스트.

    Raises:
        RuntimeError: 모든 재시도 실패 시.
    N   )r   r   r   r    u   API 호출 실패 (u   회 시도): )rangeMAX_RETRIESclientchatcompletionscreatechoicesmessagecontent	ExceptiontimesleepRETRY_INTERVALRuntimeError)r   r   r   
last_errorattemptresponser    excs           E/home/jay/workspace/.worktrees/task-2057-dev2/tools/glm-mcp/server.py	_call_apir+   K   s    ( $(Jq) +	+{{..55!% 6 H
 &&q)1199G%179r9+ ,[1_,=]:,W
XX  	+J$

>*	+s   AB.B	C$B==Cpromptsystem_promptc                     g }|r|j                  d|d       |j                  d| d       	 t        |||      S # t        $ r}d| cY d}~S d}~ww xY w)u>  GLM 모델로 텍스트를 생성합니다.

    Args:
        prompt: 생성에 사용할 사용자 프롬프트.
        model: 사용할 GLM 모델 이름.
        system_prompt: 시스템 프롬프트 (선택).
        max_tokens: 최대 생성 토큰 수.

    Returns:
        모델이 생성한 텍스트.
    systemroler    userr   r   r   u	   [오류] N)appendr+   r%   )r,   r   r-   r   r   r)   s         r*   glm_generater5   w   s_    $ &(HmDEOOV78!(%JOO !3%  !s   < 	AA	AAtaskr1   review_cyclesc           	         t        dt        d|            }t        j                  |t        d         }d|dd| dg}	 t	        ||d      }t        |      D ]K  }ddddd|dz    d| d| dg}		 t	        |	|d      }
d|dd| dd|ddd|
 dg}	 t	        ||d      }M |S # t
        $ r}d	| cY d
}~S d
}~ww xY w# t
        $ r}d|dz    d| d| cY d
}~c S d
}~ww xY w# t
        $ r}d|dz    d| d|
 cY d
}~c S d
}~ww xY w)uW  코드를 작성하고 자체 리뷰 사이클을 수행합니다.

    Args:
        task: 구현할 코드 작업 설명.
        role: 역할 (backend / frontend / uxui / tester).
        model: 사용할 GLM 모델 이름.
        review_cycles: 리뷰 반복 횟수 (0~3).

    Returns:
        최종 코드 또는 에러 메시지.
    r      r	   r/   r0   r2      r3   u   [오류] 코드 생성 실패: Nu   당신은 엄격한 시니어 코드 리뷰어입니다. 아래 코드를 검토하고, 버그·보안 취약점·코딩 표준 위반·개선 사항을 구체적으로 지적하세요. 피드백만 작성하고 수정된 코드는 작성하지 마세요.u7   다음 코드를 리뷰해 주세요 (리뷰 사이클 r   /z):

i   u   [오류] 리뷰 사이클 u	    실패: u   

현재까지의 코드:
	assistantuH   아래 리뷰 피드백을 반영하여 코드를 수정해 주세요:

u"   [오류] 코드 수정 (사이클 u
   ) 실패: u   

리뷰 피드백:
)maxminr   getr+   r%   r   )r6   r1   r   r7   r-   r   coder)   cyclereview_messagesreview_feedbackfix_messagess               r*   glm_coderE      s   $ 3q-01M"&&t^I-FGM m4D)&H
7(%DI
 }% # !} UV[^_V_U``aboappv{  {A  B1
	m'Z^_O -8- T2hixhyz	.
	l%DQDC#J KS  70667,  	m/	{)C5Hefjekll	m   	7	{*SEQlm|l}~~	sY   B( 2CC)(	C 1B;5C ;C 	C&C!C&!C&)	D2D?DDc                 ,    t        | dt        d         S )u   백엔드 개발자 관점에서 코드/답변을 생성합니다.

    Args:
        task: 백엔드 작업 설명.

    Returns:
        생성된 텍스트 또는 에러 메시지.
    glm-5r	   r,   r   r-   r5   r   r6   s    r*   glm_backendrK      s     $Y/     c                 ,    t        | dt        d         S )u   프론트엔드 개발자 관점에서 코드/답변을 생성합니다.

    Args:
        task: 프론트엔드 작업 설명.

    Returns:
        생성된 텍스트 또는 에러 메시지.
    rG   r
   rH   rI   rJ   s    r*   glm_frontendrN      s     $Z0 rL   c                 ,    t        | dt        d         S )u   UX/UI 설계자 관점에서 설계 문서/답변을 생성합니다.

    Args:
        task: UX/UI 작업 설명.

    Returns:
        생성된 텍스트 또는 에러 메시지.
    rG   r   rH   rI   rJ   s    r*   glm_uxuirP     s     $V, rL   c                 ,    t        | dt        d         S )u   QA 엔지니어 관점에서 테스트 코드/버그 리포트를 생성합니다.

    Args:
        task: 테스트 작업 설명.

    Returns:
        생성된 텍스트 또는 에러 메시지.
    rG   r   rH   rI   rJ   s    r*   
glm_testerrR   ,  s     $X. rL   __main__stdio)	transport)zglm-4.7-flashr   r:   )r	   rG   r   ) __doc__osr"   openair   mcp.server.fastmcpr   API_URLenvironr?   API_KEYTIMEOUTr   r$   r   dictstr__annotations__r   mcplistintr+   toolr5   rE   rK   rN   rP   rR   __name__run rL   r*   <module>rh      s;   5 	   & 0
**..7 	_	W	V	^)"S#X > 

 i$Y4S>"$Y$Y $Y 		$YX  !	!!! ! 	!
 	! !F  	F
F
F F 	F
 	F F\ c c  * s s  * 3 3  * S S  ( zGGgG rL   