
    i@              	          U d Z ddlZddlZddlmZmZmZmZ ddlm	Z	m
Z
mZ ddlmZmZmZ ddlmZ ddlmZ ddlmZmZmZmZ dd	lmZmZmZmZmZ  ej>                  d
ej@                          ejB                  e"      Z#i Z$ee%eee&e&f      f   e'd<    e(       Z)ee%   e'd<   dZ*edg deddedg deddedg dedddZ+d&de%de&de&dz  de&fdZ,de&dee&   fdZ-de%de&de&fd Z.d!e&fd"Z/d# Z0d$ Z1e"d%k(  r e1        yy)'uT  다중 모델 통합 봇 (Party Bot)

Gemini, Codex, Claude 봇을 하나의 Python 프로세스에서 구동하며,
대화 기록(chat history)을 공유합니다.
봇들이 서로를 멘션하면(예: "코덱스야, 네 생각은 어때?"), 해당 봇이 자동으로 대화를 이어받아 토론(의견 조율)을 할 수 있습니다.
    N)AnyDictListSet)send_responseshould_respondsplit_message)call_claude
call_codexcall_gemini)Update)
ChatAction)ApplicationContextTypesMessageHandlerfilters)CLAUDE_BOT_TOKENCODEX_BOT_TOKENGEMINI_BOT_TOKENMAX_MESSAGE_LENGTHOWNER_USER_IDz4%(asctime)s - %(name)s - %(levelname)s - %(message)s)formatlevelchat_historyseen_message_ids
   u   잼민이(Gemini))u   잼민u   제미나이gemini   모두	   다같이	   너희들	   얘들아)tokennamekeywords	call_funcappu   코덱스(Codex))u	   코덱스codexr   r   r    r!   u   클로디(Claude))u	   클로드u	   클로디clauder   r   r    r!   )r   r'   r(   chat_idbot_namenew_user_textreturnc                 |   t         j                  | g       }d| dddg}|rM|j                  d       |t         d  D ]  }|j                  |d    d|d             |j                  d       |r|j                  d	| d
       n|j                  d       |j                  d| d       d
j	                  |      S )Nu   너는 지금 텔레그램 그룹 채팅방에서 사용자 및 다른 AI들과 함께 대화하고 있어. 너의 이름(역할)은 'u   '야.u   자연스러운 말투로 대화에 참여하고, 필요한 경우 다른 AI(잼민이, 코덱스, 클로디)를 이름으로 불러서 의견을 물어보거나 조율할 수 있어. u   [이전 대화 기록]rolez: contentu   [현재 입력 - User]: 
uE   [시스템]: 위 대화 흐름에 이어서 네 의견을 말해줘.
u   자 이제 u   의 답변을 말해줘:)r   getappendMAX_HISTORYjoin)r)   r*   r+   historylinesmsgs         R/home/jay/workspace/.worktrees/task-2116-dev1/services/multimodel-bot/party_bot.pybuild_promptr:   7   s    w+G Q  RZ  Q[  [`  	a 	B
E -.K<=) 	=CLLCK=3y>*:;<	=R/bAB]^	LL;xj(@AB99U    textc                     g }| j                         t        j                         D ]B  \  }}|d   D cg c]	  }|dvs| }}t        fd|D              s2|j	                  |       D |S c c}w )Nr$   )r   r   r    r!   c              3   &   K   | ]  }|v  
 y wN .0kw
text_lowers     r9   	<genexpr>z!check_triggers.<locals>.<genexpr>T   s     5BrZ5   )lowerBOT_CONFIGSitemsanyr3   )r<   	triggeredbot_idconfigrC   
unique_kwsrD   s         @r9   check_triggersrO   O   sy    IJ%++- %#)*#5uRCt9tbu
u5*55V$%  vs
   	A/A/target_bot_idtrigger_textc                   K   t        j                  d       d {    t        |   }|d   }|sy t        j	                  d| d|         	 |j
                  j                  | t        j                         d {    t        | |d   d       } |d   |       d {   }| t        vr	g t        | <   t        |    j                  |d   |d	       t        |t              }|D ]'  }|j
                  j                  | |
       d {    ) t        |      }	|	D ](  }
|
|k7  s	t        j                   t#        | |
|             * y 7 -7 7 7 F# t$        $ r%}t        j'                  d| d|        Y d }~y d }~ww xY ww)N   r&   u   내부 트리거 발동: z	 in chat r)   actionr#   r+   r%   r/   r0   )r)   r<   u   내부 트리거 오류 (z): )asynciosleeprH   loggerinfobotsend_chat_actionr   TYPINGr:   r   r3   r	   r   send_messagerO   create_tasktrigger_bot_internally	Exceptionerror)r)   rP   rQ   rM   r&   promptresultchunkschunknext_targetsnext_ides               r9   ra   ra   Y   s    
--
'F
-C
KK+M?)G9MNHgg&&wz?P?P&QQQgvf~TJ*vk*622,&$&L!W$$fVn%PQv'9: 	DE''&&wU&CCC	D &f-# 	VG-'##$:7GV$TU	V+  	R2 D  H0s1#FGGHsv   FE0F.E ;E<#E E A(E E	E %"E FE E E 	E?E:5F:E??FrL   c                 D     dt         dt        j                  dd f fd}|S )Nupdatecontextr,   c                    K   | j                   r| j                   j                  sy | j                   j                  j                  t        k7  ry |j                  j
                  xs d}| j                  y | j                  j                  }| j                   j                  }| j                   j                  xs dj                         }|sy t           }d}|j                         | j                  j                  dk(  rd}n-t        | |t              rd}nt        fd|d   D              rd}|t        vrAt        j!                  |       |t"        vr	g t"        |<   t"        |   j%                  d|d       |sy 	 |j                  j'                  |t(        j*                  	       d {    t-        ||d
   |      } |d   |       d {   }	t"        |   j%                  |d
   |	d       t/        | ||	t0               d {    t3        |	      }
|
D ](  }|k7  s	t5        j6                  t9        |||	             * y 7 7 x7 A# t:        $ r$}t<        j?                   d|        Y d }~y d }~ww xY ww)Nr.   FprivateTc              3   &   K   | ]  }|v  
 y wr?   r@   rA   s     r9   rE   z2create_handler.<locals>.handler.<locals>.<genexpr>   s     C"R:%CrF   r$   UserrW   rT   r#   rV   r%   )max_lenu    handle_message 오류: ) message	from_useridr   r\   usernameeffective_chat
message_idr<   striprH   rG   typer   rJ   r   addr   r3   r]   r   r^   r:   r   r   rO   rX   r`   ra   rb   rZ   rc   )rl   rm   bot_usernamer)   msg_id	user_textrM   	is_calledrd   re   rh   ri   rj   rD   rL   s                @r9   handlerzcreate_handler.<locals>.handlerw   s=    ~~V^^%=%=>>##&&-7{{++1r  (''****^^((.B557	V$	__&
  %%2IflMB 	Cz0BCC 	))  (l*(*W%!((&Y)OP	A++..wzGXGX.YYY!'6&>SF.6+.v66F!((&.V)TUASTTT)&1L' Zf$''(>wQW(XYZ Z6 U  	ALLF8#;A3?@@	Asl   E:I>?.I -I.#I I
8I 
II %"I I>I 
I I 	I;I61I>6I;;I>)r   r   DEFAULT_TYPE)rL   r   s   ` r9   create_handlerr   v   s/    2Af 2A|/H/H 2AT 2Ah Nr;   c            	        K   g } t         j                         D ]  \  }}|d   st        j                  | d       $t	        j
                         j                  |d         j                         }|j                  t        t        j                  t        j                   z  t        |                   ||d<   | j                  |        | st        j                  d       y t        j!                  d       | D ]T  }|j#                          d {    |j%                          d {    |j&                  j)                          d {    V t        j!                  d       t+        j,                         }	 |j/                          d {    | D ]T  }|j&                  j3                          d {    |j3                          d {    |j5                          d {    V y 7 7 7 7 d# t0        $ r Y mw xY w7 N7 87 "# | D ]W  }|j&                  j3                          d {  7   |j3                          d {  7   |j5                          d {  7   Y w xY ww)Nr"   u)    토큰이 없습니다. 건너뜁니다.r&   u   실행할 봇이 없습니다.u&   다중 모델 통합 봇 시작 중...u+   모든 봇이 폴링을 시작했습니다.)rH   rI   rZ   warningr   builderr"   buildadd_handlerr   r   TEXTCOMMANDr   r3   rc   r[   
initializestartupdaterstart_pollingrX   EventwaitKeyboardInterruptstopshutdown)appsrL   rM   r&   
stop_events        r9   
main_asyncr      s    D%++- gNNfX%NOP!!#))&/:@@Bw||w6F'FW]H^_`uC 56
KK89 *nniikkk'')))*
 KK=>J!oo  	!C++""$$$((*,,.  	! 	) 	   %   	!C++""$$$((*,,.  	!s   DI-G/I-*G1+!I-G3/I-=G7 G5G7 "I-7H8I-HI-'H
(I-1I-3I-5G7 7	H H HH I-I-
I-#I*/H2
0I*I
	I*!I$
"I**I-c                  >    t        j                  t                      y r?   )rX   runr   r@   r;   r9   mainr      s    KK
r;   __main__r?   )2__doc__rX   loggingtypingr   r   r   r   	bot_utilsr   r   r	   engine_v2.bot_apir
   r   r   telegramr   telegram.constantsr   telegram.extr   r   r   r   rM   r   r   r   r   r   basicConfigINFO	getLogger__name__rZ   r   intstr__annotations__setr   r4   rH   r:   rO   ra   r   r   r   r@   r;   r9   <module>r      sl     ' ' B B B B  ) K K i i   A
,, 
		8	$02d3T#s(^,,- 2 U #c( " "#i  !"[ "#i 2#  S4Z SV 0 c H# Hc HQT H:53 5p !F zF r;   