
    Ti                     l    d dl Z d dlmZmZmZmZmZmZ d dlm	Z	m
Z
mZmZ d dlmZ d dlZ G d d      Zy)    N)OptionalListDictAnyCallable	Awaitable)AIMessageChunkToolCallconvert_to_openai_messagesToolMessage)
StateGraphc            
           e Zd ZdZdededeeeeef   ged   f   fdZ	de
deeeef      d	eeef   d
dfdZded
dfdZdeeef   d
dfdZded
dfdZdee   d
dfdZdee   d
dfdZy)StreamProcessoru6   流式处理器 - 负责处理智能体的流式输出
session_id
db_servicewebsocket_serviceNc                 X    || _         || _        || _        g | _        d| _        d | _        y )Nr   )r   r   r   
tool_callslast_saved_message_indexlast_streaming_tool_call_id)selfr   r   r   s       d/home/jay/workspace/tools/ai-image-gen/jaaz-app/server/services/langgraph_service/StreamProcessor.py__init__zStreamProcessor.__init__   s/    $$!2*,()%:>(    swarmmessagescontextreturnc                    K   t        |      dz
  | _        |j                         }|j                  d|i|g d      2 3 d{   }| j	                  |       d{    #7 7 6 | j                  | j                  ddi       d{  7   yw)u   处理整个流式响应

        Args:
            swarm: 智能体群组
            messages: 消息列表
            context: 上下文信息
           r   )r   customvalues)configstream_modeNtypedone)lenr   compileastream_handle_chunkr   r   )r   r   r   r   compiled_swarmchunks         r   process_streamzStreamProcessor.process_stream   s      ),H(9%)11"8 2 
 	, 	,%
 $$U+++	,
 ,
 $$T__F7
  	 	sF   <BA%A!A%BA#B!A%#B%"BB
Br,   c                    K   |d   }|dk(  r| j                  |d          d{    y| j                  |d   d          d{    y7 %7 w)u   处理单个chunkr   r"   r    N)_handle_values_chunk_handle_message_chunk)r   r,   
chunk_types      r   r*   zStreamProcessor._handle_chunk,   sV      1X
!++E!H555,,U1Xa[999 69s!   "AA
AAAA
chunk_datac                   K   |j                  dg       }t        |      }t        |t              s|r|gng }| j	                  | j
                  d|d       d{    t        | j                  dz   t        |            D ]n  }||   }t        |      dkD  rR| j                  j                  | j
                  |j                  dd      t        j                  |             d{    || _        p y7 7 w)	u   处理 values 类型的 chunkr   all_messages)r%   r   Nr    r   roleuser)getr   
isinstancelistr   r   ranger   r'   r   create_messagejsondumps)r   r2   r4   oai_messagesinew_messages         r   r/   z$StreamProcessor._handle_values_chunk6   s     !~~j"51,?,--9L>rL $$T__"$7
  	 	 t44q8#l:KL 	.A&q/K< 1$oo44OOOOFF3JJ{+  
 -.D)	.	s%   AC6C2B	C6#C4$C64C6ai_message_chunkc                   K   	 |j                   }t        |t              rNt        |g      d   }t	        d|       | j                  | j                  d|j                  |d       d{    n|r(| j                  | j                  d|d       d{    nYt        |d      rM|j                  rA|j                  d   j                  d	      r#| j                  |j                         d{    t        |d
      r$| j                  |j                         d{    yy7 7 7 97 # t        $ r*}t	        d|       t        j                           Y d}~yd}~ww xY ww)u   处理消息类型的 chunkr   u   👇toolcall res oai_messagetool_call_result)r%   idmessageNdelta)r%   textr   nametool_call_chunksu	   🟠error)contentr8   r   r   printr   r   tool_call_idhasattrr   r7   _handle_tool_calls_handle_tool_call_chunksrI   	Exception	tracebackprint_stack)r   rA   rJ   oai_messagees        r   r0   z%StreamProcessor._handle_message_chunkO   sb    	$&..G*K88:J9KLQO4kB,,T__.*77*?   
 ,,T__##?    )<8=M=X=X]m]x]xyz]{]]  AG  ^H--.>.I.IJJJ ');<334D4U4UVVV =! K W 	$+q!!!##	$sx   E A$D* (D"))D* D$AD* ,D&-.D* D(D*  E "D* $D* &D* (D* *	E3 EE EE r   c           	      b  K   |D cg c]  }|j                  d      s| c}| _        t        d|       dh}| j                  D ]_  }|j                  d      }||v rt        d| d       (| j                  | j                  d|j                  d      |dd	       d
{    a y
c c}w 7 w)u   处理工具调用rH   u   😘tool_call event generate_video_by_veo3_fast_jaazu
   🔄 Tool z6 requires confirmation, skipping StreamProcessor event	tool_callrD   z{})r%   rD   rH   	argumentsN)r7   r   rK   r   r   )r   r   tcTOOLS_REQUIRING_CONFIRMATIONrW   	tool_names         r   rN   z"StreamProcessor._handle_tool_callso   s     (2E"bffVn2E#Z0 /(
$  	I!f-I 88 +abd,,T__'#---%!%	?   	 F0s!   B/B(B(A>B/ B-!B/rI   c           	      "  K   |D ]  }|j                  d      r|j                  d      | _        +| j                  rB| j                  | j                  d| j                  |j                  d      d       d{    yt	        d|        y7 w)u   处理工具调用参数流rD   tool_call_argumentsargs)r%   rD   rG   Nu"   🟠no last_streaming_tool_call_id)r7   r   r   r   rK   )r   rI   tool_call_chunks      r   rO   z(StreamProcessor._handle_tool_call_chunks   s     / 	QO""4(3B3F3Ft3L03300 5">> / 3 3F ;C    >P	Qs   A6B8B9B)__name__
__module____qualname____doc__strr   r   r   r   r   r   r   r-   r*   r/   r	   r0   r
   rN   rO    r   r   r   r   	   s    @?3 ?C ?HVY[_`ceh`h[iUjluvzl{U{L| ?* T#s(^@T _cdgildl_m rv 0: : :.T#s(^ . .2$N $t $@4> d BQtCy QT Qr   r   )rQ   typingr   r   r   r   r   r   langchain_core.messagesr	   r
   r   r   langgraph.graphr   r<   r   re   r   r   <module>ri      s(     A A e e & UQ UQr   