当前位置: 首页 > news >正文

福州网站建设方案咨询免费观看电视剧软件

福州网站建设方案咨询,免费观看电视剧软件,重庆做营销网站建设,北京交通管制信息网站这个函数是整个架构的核心,也是理解起来最难的地方,下面详细分析一下它的流程。啥也不说,先列代码(后面分析)async def _process_workflow(workflow: CompiledWorkflow, initial_state: dict[str, Any] ) -> AsyncG…

这个函数是整个架构的核心,也是理解起来最难的地方,下面详细分析一下它的流程。

啥也不说,先列代码(后面分析)

async def _process_workflow(workflow: CompiledWorkflow, initial_state: dict[str, Any]
) -> AsyncGenerator[dict[str, Any], None]:"""处理自定义工作流的事件流"""current_node = Noneworkflow_id = initial_state["workflow_id"]yield { # start_of_workflow 时的返回值"event": "start_of_workflow","data": {"workflow_id": workflow_id, "input": initial_state["messages"]},}try:current_node = workflow.start_nodestate = State(**initial_state)while current_node != "__end__":agent_name = current_nodelogger.info(f"Started node: {agent_name}")yield {"event": "start_of_agent","data": {"agent_name": agent_name,"agent_id": f"{workflow_id}_{agent_name}_1",},}node_func = workflow.nodes[current_node]command = await node_func(state)if hasattr(command, "update") and command.update:for key, value in command.update.items():if key != "messages":state[key] = valueif key == "messages" and isinstance(value, list) and value:# State ignores coordinator messages, which not only lacks contextual benefits# but may also cause other unpredictable effects.if agent_name != "coordinator":state["messages"] += valuelast_message = value[-1]if "content" in last_message:if agent_name == "coordinator":content = last_message["content"]if content.startswith("handover"):# mark handoff, do not send maesagesglobal is_handoff_caseis_handoff_case = Truecontinueif agent_name in ["planner", "coordinator", "agent_proxy"]:content = last_message["content"]chunk_size = 10  # send 10 words for each chunkfor i in range(0, len(content), chunk_size):chunk = content[i : i + chunk_size]if "processing_agent_name" in state:agent_name = state["processing_agent_name"]yield {"event": "messages","agent_name": agent_name,"data": {"message_id": f"{workflow_id}_{agent_name}_msg_{i}","delta": {"content": chunk},},}await asyncio.sleep(0.01)if agent_name == "agent_factory" and key == "new_agent_name":yield {"event": "new_agent_created","agent_name": value,"data": {"new_agent_name": value,"agent_obj": agent_manager.available_agents[value],},}yield {"event": "end_of_agent","data": {"agent_name": agent_name,"agent_id": f"{workflow_id}_{agent_name}_1",},}next_node = command.gotocurrent_node = next_nodeyield {"event": "end_of_workflow","data": {"workflow_id": workflow_id,"messages": [{"role": "user", "content": "workflow completed"}],},}cache.dump(workflow_id, initial_state["workflow_mode"])except Exception as e:import tracebacktraceback.print_exc()logger.error("Error in Agent workflow: %s", str(e))yield {"event": "error","data": {"workflow_id": workflow_id,"error": str(e),},}

_process_workflow 函数返回一个字典到 run_agent_workflow ,这个返回值共有 7 中类型,分别在7个 yeild 处。

下面分别说明这 7 个 yeild 返回时的 event 类型:

其中有一个 while 循环,其循环依次代表一个智能体的从开始到结束,在while循环的外面:循环上面有一个yeild,下面有一个yeild,它们返回时的event分别表示start_of_workflow 和 end_of_workflow,进入while循环,第一个 yeild 返回时表示此时的event为 start_of_agent ,第二个返回时表示此时的 event 是 messages ,第三个返回时表示此时的 event 是 new_agent_created(比较特殊),第四个返回时表示此时的 event 是 end_of_agent,最后一个是 error 时的返回。

下面分析每次yeild返回前所执行的事情:

第一个:

    current_node = Noneworkflow_id = initial_state["workflow_id"]yield { # start_of_workflow 时的返回值"event": "start_of_workflow","data": {"workflow_id": workflow_id, "input": initial_state["messages"]},}

给节点赋值为none,因为此时还没开始第一个智能体的执行。


第二个:

try:current_node = workflow.start_nodestate = State(**initial_state)while current_node != "__end__":agent_name = current_nodelogger.info(f"Started node: {agent_name}")yield {"event": "start_of_agent","data": {"agent_name": agent_name,"agent_id": f"{workflow_id}_{agent_name}_1",},}

上面代码中显示的是第一次给节点更新值(后面可能是在这个while循环结尾给节点更新值,不会再执行while循环上面的两句了),状态更新


第三、四、五个:

            node_func = workflow.nodes[current_node]command = await node_func(state)if hasattr(command, "update") and command.update:for key, value in command.update.items():if key != "messages":state[key] = valueif key == "messages" and isinstance(value, list) and value:# State ignores coordinator messages, which not only lacks contextual benefits# but may also cause other unpredictable effects.if agent_name != "coordinator":state["messages"] += valuelast_message = value[-1]if "content" in last_message:if agent_name == "coordinator":content = last_message["content"]if content.startswith("handover"):# mark handoff, do not send maesagesglobal is_handoff_caseis_handoff_case = Truecontinueif agent_name in ["planner", "coordinator", "agent_proxy"]:content = last_message["content"]chunk_size = 10  # send 10 words for each chunkfor i in range(0, len(content), chunk_size):chunk = content[i : i + chunk_size]if "processing_agent_name" in state:agent_name = state["processing_agent_name"]yield {"event": "messages","agent_name": agent_name,"data": {"message_id": f"{workflow_id}_{agent_name}_msg_{i}","delta": {"content": chunk},},}await asyncio.sleep(0.01)if agent_name == "agent_factory" and key == "new_agent_name":yield {"event": "new_agent_created","agent_name": value,"data": {"new_agent_name": value,"agent_obj": agent_manager.available_agents[value],},}yield {"event": "end_of_agent","data": {"agent_name": agent_name,"agent_id": f"{workflow_id}_{agent_name}_1",},}

调用大模型获得其推理结果,随后的event也是不定的,不同的智能体阶段可能不同。

如果是messages,会一点一点地输出。(第三个yeild)

如果 agent_name == "agent_factory" and key == "new_agent_name",则返回第四个yeild

如果是end_of_agent,会直接到end_of_agent地yeild返回。(第五个yeild)


第六个:

            next_node = command.gotocurrent_node = next_nodeyield {"event": "end_of_workflow","data": {"workflow_id": workflow_id,"messages": [{"role": "user", "content": "workflow completed"}],},}

current_node = "__end__"时,while循环结束,执行一下节点更新,然后返回yeild


第七个:

第七个是发生错误时的 yeild 返回值。

http://www.dtcms.com/a/609143.html

相关文章:

  • 虚拟机网站建设与管理wordpress前台修改密码
  • 福州绿光网站建设工作室合肥那个公司做网站优化好
  • Java基础——方法
  • 设计模式实战篇(二):业务逻辑“随时切换招式”——策略模式(Strategy Pattern)解析
  • 从“能说会道”到“自主思考”:一文读懂AI的过去、现在与未来
  • Python语言编译器 | Python语言编译器的使用与原理解析
  • 【JAVA 进阶】Spring Boot 注解体系与工程实践
  • Effective Python 第51条:优先考虑通过类修饰器来提供可组合的扩充功能,不要使用元类
  • Rust时序数据库实现:从压缩算法到并发优化的实战之旅
  • SpringCloud-Consul服务注册与发现
  • 网站建设原因分析wordpress 页面分页
  • SSH级知识管理:通过CPolar暴露Obsidian vault构建你的知识API服务,实现跨设备无缝同步
  • 《Linux系统编程之进程基础》【进程入门】
  • Hello-agents TASK03 第四章节 智能体经典范式构建
  • C++ 二叉搜索树(BST)完全指南:从概念原理、核心操作到底层实现
  • 电子电气架构 --- 哨兵模式初入门
  • 桌面开发,在线%考试管理%系统,基于eclipse,java,swing,mysql数据库。
  • 超融合架构的核心组件与协同机制深度解析
  • 桌面开发,在线%图书管理%系统,基于eclipse,jdk,java,swing,sqlserver数据库
  • 快速学会做网站网站建设公司怎么推广
  • 无需 iTunes 备份与恢复 iPhone 的 2 种方法
  • 【Linux】Ubuntu图形界面崩溃(无法进入)的解决方法汇总
  • Lidar调试记录Ⅳ之Ubuntu22.04+ROS2+Livox_SDK2环境下编译Livox ROS Driver 2
  • 网站收录查询网摘抄一则新闻
  • 做电影网站违法么深圳网站建设10强
  • 荆州北京网站建设如何自己做网页链接
  • 网站建设开发教程视频网站如何建设目录
  • 为企业为什么做网站数据分析师是干嘛的
  • 叶县建设局网站网站快速建设视频
  • 保定 网站制作门户网站如何建设