
    TiE                     b   d dl mZ d dlmZ ddlmZ ddlmZ d dlZd dlm	Z	 d dl
mZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZmZmZmZmZmZmZ d dlmZ  G d de      Zdeeeef      deeeef      fdZ 	 ddeeeef      dedededee   dee   ddfdZ!dedefdZ"de#deddfdZ$y)    )ToolInfoJson)
db_service   )StreamProcessor)AgentManagerN)
HttpClient)create_swarm)
ChatOpenAI)
ChatOllama)send_to_websocket)config_service)OptionalListDictAnycastSet	TypedDict)	ModelInfoc                   @    e Zd ZU dZeed<   eed<   eeee   f   ed<   y)ContextInfoz#Context information passed to tools	canvas_id
session_id
model_infoN)	__name__
__module____qualname____doc__str__annotations__r   r   r        b/home/jay/workspace/tools/ai-image-gen/jaaz-app/server/services/langgraph_service/agent_service.pyr   r      s#    -NOS$y/)**r"   r   messagesreturnc                    | s| S g }t               }| D ]N  }|j                  d      dk(  s|j                  d      s*|j                  d      }|s>|j                  |       P | D ]  }|j                  d      dk(  r|j                  d      rg }g }|j                  dg       D ]=  }|j                  d      }||v r|j                  |       *|s-|j                  |       ? |rt	        dt        |       d|        |r'|j                         }||d<   |j                  |       |j                  d	      s|j                         }|j                  dd
       |j                  |       |j                  |        |S )u   修复聊天历史中不完整的工具调用

    根据LangGraph文档建议，移除没有对应ToolMessage的tool_calls
    参考: https://langchain-ai.github.io/langgraph/troubleshooting/errors/INVALID_CHAT_HISTORY/
    roletooltool_call_id	assistant
tool_callsidu$   🔧 修复消息历史：移除了 u    个不完整的工具调用: contentN)setgetaddappendprintlencopypop)	r$   fixed_messagestool_call_idsmsgr)   valid_tool_callsremoved_calls	tool_callmsg_copys	            r#   _fix_chat_historyr=      s    +-N!eM  0776?f$)@77>2L!!,/	0  '776?k)cggl.C57')M WW\26 7	(}}T2=0$++I6!!((67 :3};M:NNlmzl{|~  88:)9&%%h/#88:\40%%h/ !!#&='@ r"   r   r   
text_model	tool_listsystem_promptc                   K   	 t        |       }t        |      }t        j                  |||xs d      }|D 	cg c]  }	|	j                   }
}	t        d|
       t        j                  ||
      }t        d|       t        ||r|n|
d         }|||d}t        |t        t              }|j                  |||       d{    yc c}	w 7 
# t        $ r}t        ||       d{  7   Y d}~yd}~ww xY ww)u  多智能体处理函数

    Args:
        messages: 消息历史
        canvas_id: 画布ID
        session_id: 会话ID
        text_model: 文本模型配置
        tool_list: 工具模型配置列表（图像或视频模型）
        system_prompt: 系统提示词
     u   👇agent_namesu   👇last_agentr   )agentsdefault_active_agent)r   r   r?   N)r=   _create_text_modelr   create_agentsnamer2   get_last_active_agentr	   r   r   r   process_stream	Exception_handle_error)r$   r   r   r>   r?   r@   r6   text_model_instancerC   agentagent_names
last_agentswarmcontext	processores                   r#   langgraph_multi_agentrT   N   s
    $'+*84 1< ++R

 066euzz66-!77K)
 	
+ /9{1~
 #$"
 $
$57	&&ungFFF/ 7. 	G +Az***+sX   C95C CA5C CC C9C 	C6C1&C)'C1,C91C66C9c           	      `   | j                  d      }| j                  d      }| j                  d      }t        j                  j                  |i       j                  dd      }|dk(  rt        ||      S t	        j
                         }t	        j                         }t        ||d|d	||
      S )u   创建语言模型实例modelproviderurlapi_keyrB   ollama)rV   base_urli,  r   )rV   rY   timeoutr[   temperaturehttp_clienthttp_async_client)r/   r   
app_configr   r   create_sync_clientcreate_async_clientr
   )r>   rV   rW   rX   rY   r^   r_   s          r#   rE   rE      s    NN7#E~~j)H
..
C''++"c)R(  8
 	
 !335&::<#/	
 		
r"   errorc           
      
  K   t        d|        t        j                         }t        d|        t        j                          t	        |t        t        t        t        f   dt        |       d             d{    y7 w)u   处理错误zError in langgraph_agentzFull traceback:
rc   )typerc   N)	r2   	traceback
format_exc	print_excr   r   r   r   r   )rc   r   tb_strs      r#   rK   rK      so     	
$e,!!#F	fX
&'
JT#s(^U> )   s   A9B;B<B)N)%models.tool_modelr   services.db_servicer   r   agent_managerr   rf   utils.http_clientr   langgraph_swarmr	   langchain_openair
   langchain_ollamar   services.websocket_servicer   services.config_servicer   typingr   r   r   r   r   r   r   models.config_modelr   r   r   r=   rT   rE   rJ   rK   r!   r"   r#   <module>ru      s    * * , '  ( ( ' ' 8 2 B B B )+) +4T#s(^ 4 4d38n9M 4z $(9+4S>"9+9+ 9+ 	9+
 L!9+ C=9+ 
9+x
9 
 
@
y 
c 
d 
r"   