ADK 第四篇 Runner 執行器

智能體執行器 Runner,負責完成一次用戶需求的響應,是ADK中真正讓Agent運行起來的引擎,其核心功能和Agents SDK中的Runner類似,具體作用如下:

  • 會話管理:自動讀取/寫入 SessionService,維護歷史信息。

  • Agent調用:調用指定的Agent完成推理和工具調用

  • 輸入輸出流轉:把用戶輸入交給Agent,把Agent輸出返回。

  • 流程控制:支持多輪對話、子Agent委托、工具調用等。

  • 生命周期管理:處理每次對話流程的完整生命周期

Runner 是Agent的管理者,負責組織每次對話交互的完整生命周期。

Runner 類(Class)

class Runner:"""Runner 類用于運行智能體。Runner 類用于在會話中管理智能體的執行,負責處理消息、生成事件,并與各類服務進行交互。"""app_name: str"""The app name of the runner."""agent: BaseAgent"""The root agent to run."""artifact_service: Optional[BaseArtifactService] = None"""The artifact service for the runner."""session_service: BaseSessionService"""The session service for the runner."""memory_service: Optional[BaseMemoryService] = None"""The memory service for the runner."""def __init__(self,*,app_name: str,agent: BaseAgent,artifact_service: Optional[BaseArtifactService] = None,session_service: BaseSessionService,memory_service: Optional[BaseMemoryService] = None,):"""Initializes the Runner.Args:app_name: The application name of the runner.agent: The root agent to run.artifact_service: The artifact service for the runner.session_service: The session service for the runner.memory_service: The memory service for the runner."""self.app_name = app_nameself.agent = agentself.artifact_service = artifact_serviceself.session_service = session_serviceself.memory_service = memory_service

參數解析如下:

參數名參數類型含義說明
app_namestr應用名稱應用的名稱,用于標識不同的應用實例。
agentBaseAgent要運行的主Agent負責執行實際的任務和推理
artifact_serviceOptional[BaseArtifactService]文件存儲服務(可選)可選的文件存儲服務,用于處理生成的工件(如:文件)
session_serviceBaseSessionService會話服務用于管理和維護對話歷史。
memory_serviceOptional[BaseMemoryService]內存服務(可選)用于長期和短期記憶管理

創建Runner

# 創建智能體執行器
runner = Runner(agent=agent,app_name="app01",session_service=session_service
)

run_async(...)方法

  async def run_async(self,*,user_id: str,session_id: str,new_message: types.Content,run_config: RunConfig = RunConfig(),) -> AsyncGenerator[Event, None]:# ...

runner.run_async(...)方法是Runner類的核心方法之一,用于以異步的方式執行Agent的任務。這個方法接收用戶輸入的消息,并將其添加到會話中,然后啟動Agent來處理該消息,并生成一系列的事件(Event).

具體參數解析如下:

1、user_id (str)

  • 該參數表示用戶的唯一標識,用于標記當前會話是屬于哪個用戶的,每個用戶可以有多個會話實例。

2、session_id (str)

  • 該參數表示會話的唯一標識,用于區分不同用戶或同一個用戶的不同的會話,每次創建會話時都會為其分配一個唯一的session_id

3、new_message (types.Content)

  • 這是ADK中的一個核心對象,表示傳遞給Agent的新消息。types.Content 是一個包含具體消息內容的對象,通常它包含 role(角色)、text(消息文本) 等字段。

  • 例如:content: parts=[Part(video_metadata=None, thought=None, code_execution_result=None, executable_code=None, file_data=None, function_call=None, function_response=None, inline_data=None, text='寫一句心靈雞湯')] role='user'

4、run_config (RunConfig) 可選

  • 這是一個配置對象,用于定制執行時的參數設置,可以根據需求設置一些如語音配置、響應方式、模型最大調用次數等參數。其默認值為 RunConfig(),這是一個內置的默認配置類。

RunConfig 核心字段解析:

  • speech_config: 用于配置語音識別和語音輸出的相關設置(例如:語音轉文本、語音輸出等),通常與語音助手相關。

  • response_modalities:配置響應的方式,例如返回文本、語音等。

  • save_input_blobs_as_artifacts: 是否將輸入的文件保存為工件(例如:將用戶上傳的圖片保存為文件以供后續處理),默認值為false

  • support_cfc: 是否支持CFC(Custom Function Calling),即是否允許Agent調用自定義函數。

  • streaming_mode:設置流模型(例如:是否開啟流式輸出),用于處理生成時響應時間較長的情況。

  • output_audio_transcription: 配置輸出的音頻轉錄設置(比如:支持語音輸出)。

  • max_llm_calls: 配置在一次會話中最大可以調用LLM次數的上限。默認值: 500

運行Agent

# 執行對話
async def call_agent_async(query: str, runner, user_id, session_id):"""向agent發送查詢并打印最終響應"""print(f"\n>>> 用戶: {query} \n")# 將用戶消息轉換為ADK格式content = types.Content(role='user', parts=[types.Part(text=query)])print("content:", content)final_response_text = "未生成最終響應。" # Default# Key Concept: run_async 會執行Agent邏輯并持續生成事件流(Events)。# 我們通過遍歷事件流來獲取最終答案。async for event in runner.run_async(user_id=user_id, session_id=session_id, new_message=content):# 您可以取消下面這行的注釋,以查看執行過程中的所有事件print(f"  [Event] Author: {event.author}, Type: {type(event).__name__}, Final: {event.is_final_response()}, Content: {event.content}")# Key Concept: is_final_response() 用于標記當前對話輪次(turn)的終結消息if event.is_final_response():if event.content and event.content.parts:# 假設響應文本位于首部分final_response_text = event.content.parts[0].textelif event.actions and event.actions.escalate: # Handle potential errors/escalationsfinal_response_text = f"Agent escalated: {event.error_message or 'No specific message.'}"# Add more checks here if needed (e.g., specific error codes)break # 找到最終響應后停止處理事件print(f"<<< Agent Response: {final_response_text}")if __name__ == '__main__':query = "寫一句心靈雞湯"asyncio.run(call_agent_async(query=query,runner=runner,user_id=USER_ID,session_id=SESSION_ID))

call_agent_async(...) 函數解析

🍂Part 1 導入依賴的模塊

from google.genai import types

這個types模塊是用于在ADK中創建消息內容的,它允許你定義消息的"角色"(例如:user 或 assistant),以及消息的內容部分。

🍂Part 2 定義 call_agent_async 函數

async def call_agent_async(query: str, runner, user_id, session_id):
  • query: 用戶輸入的查詢問題。

  • runner: 創建的Runner對象,負責啟動Agent并管理會話。

  • user_id 和 session_id: 用于標記特定用戶的會話,確保模型能夠維持會話上下文。

🍂Part 3 將用戶消息轉換為ADK格式

content = types.Content(role='user', parts=[types.Part(text=query)])

content中內容:

這里將用戶的查詢(query) 格式化為ADK的消息格式,并通過 types.Content 和 types.Part 封裝成可以傳遞給Agent的內容。 role="user" 表明消息是由用戶發送的。

🍂Part 4 準備獲取Agent最終回復

final_response_text = "未生成最終響應。" # Default

默認情況下 final_response_text 被初始化為一個錯誤信息字符串,表明Agent沒有最終響應,后續會被更新為最終真正的回答.

🍂Part 5 調用Agent并監聽事件

async for event in runner.run_async(user_id=user_id, session_id=session_id, new_message=content):# 您可以取消下面這行的注釋,以查看執行過程中的所有事件print(f"  [Event] Author: {event.author}, Type: {type(event).__name__}, Final: {event.is_final_response()}, Content: {event.content}")

runner.run_async(...) 是一個異步生成器,負責執行Agent推理并生成一系列事件 (Events),每個事件代表了交互中的一步操作(如用戶消息、模型回復、工具調用等)

你可以通過 async for...循環迭代所有的事件,并逐一檢查它們的內容。

Event 事件中的內容:

🍂Part 6 檢查是否是最終響應

if event.is_final_response():

event.is_final_response() 用來判斷當前事件是否是最終響應,這個判斷標志著Agent已經完成了對用戶問題的處理,可以停止進一步處理。

if event.content and event.content.parts:final_response_text = event.content.parts[0].text

如果事件 content 存在,并且包含了 parts(模型回復的文本內容) ,就將 最終回復 保存到 final_response_text 變量中。

elif event.actions and event.actions.escalate: # Handle potential errors/escalationsfinal_response_text = f"Agent escalated: {event.error_message or 'No specific message.'}"

如果 event.actions.escalate為True , 表示有錯誤發生或需要升級,比如模型無法處理問題,或者需要人工干預,這時,會將相應的錯誤信息記錄在 final_response_text

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79534.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79534.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79534.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Tauri2】37——后端處理invoke

目錄 前言 正文 隨便看看 看看get 看看parse_invoke_request 看看message_handler 看看handle_ipc_message 看看webview的on_message方法 第一種情況的處理 第二種情況的處理 運行通信函數 返回的處理 整個流程 前言 【Tauri2】033 __TAURI_INTERNALS__和invoke-C…

kotlin 05flow -從 LiveData 遷移到 Kotlin Flow 完整教程

一 從 LiveData 遷移到 Kotlin Flow 完整教程 LiveData 長期以來是 Android 架構組件中狀態管理的核心&#xff0c;但隨著 Kotlin Flow 的成熟&#xff0c;Google 官方推薦將現有 LiveData 遷移到 Flow。本教程基于官方文章并擴展實踐細節&#xff0c;完成平滑遷移。 一、為什…

C++負載均衡遠程調用學習之獲取主機信息功能

目錄 01Lars-lbAgentV0.2-賦值均衡數據結構關系分析 02 Lars-lbAgent0.2-host_info-load_balance-route_lb數據結構的定義 03Lars-lbAgentV0.2-proto協議的定義 04 Lars-lbAgentV0.2-route_lb與UDP server的關聯 05 -Lars-lbAgentV0.2-route_lb與UDP server的關聯 06Lars…

2025系統架構師---論軟件的設計模式論文

2023 年,我所在的公司承擔了某部網絡靶場的研發任務。我作為公司的技 術總監,希望能打造基于網絡靶場的系列產品,參與到項目的設計中,以期開發 擴展性和可維護性良好的網絡靶場,為以后的產品開發打下基礎。網絡靶場是網 絡安全技術研究的基礎支撐平臺,它利用虛擬的和實物…

Kubernetes排錯(七)-節點排錯

1、節點 Crash 與 Vmcore 分析 kdump 介紹? 目前大多 Linux 發新版都會默認開啟 kdump 服務&#xff0c;以方便在內核崩潰的時候, 可以通過 kdump 服務提供的 kexec 機制快速的啟用保留在內存中的第二個內核來收集并轉儲內核崩潰的日志信息(vmcore 等文件), 這種機制需要服務…

【QT】QT中的軟鍵盤設計

QT的軟鍵盤設計 1.軟鍵盤制作步驟2.介紹有關函數的使用3.出現的編譯錯誤及解決辦法示例代碼1&#xff1a;按鍵事件實現軟鍵盤現象&#xff1a;示例代碼2&#xff1a;按鍵事件實現軟鍵盤&#xff08;加特殊按鍵&#xff09;現象&#xff1a; 軟鍵盤移植到新的工程的步驟&#xf…

【LaTeX+VSCode本地Win11編譯教程】

LaTeXVSCode本地編譯教程參考視頻&#xff1a; LaTeXVSCode本地編譯教程 下面提供一種Win11的Latex環境配置和設置方案&#xff0c;首先vscode安裝參考博客&#xff1a;【VscodeGit教程】&#xff0c;然后準備安裝Latex相關組件 在 https://miktex.org/download 下載 miktex 并…

2025五一杯數學建模ABC題賽題已出

2025五一杯數學建模ABC題賽題已出 A: B: C:

Springclound常用五大組件及其使用原理

注冊中心Eureka Eureka-Server&#xff1a;就是服務注冊中心&#xff08;可以是一個集群&#xff09;&#xff0c;對外暴露自己的地址。 提供者&#xff1a;啟動后向Eureka注冊自己信息&#xff08;地址&#xff0c;服務名稱等&#xff09;&#xff0c;并且定期進行服務續約 …

Docker —— 隔離的基本操作(2)

Docker —— 隔離的基本操作&#xff08;2&#xff09; unshareunshare 命令詳解基本語法常用選項常用示例實際應用場景注意事項與 Docker 的關系1. 執行命令2. 修改主機名3. 退出命名空間4. 驗證宿主機主機名關鍵原理類比 Docker 容器總結 實戰操作一&#xff08;PID 隔離&…

Java List分頁工具

PageUtil.java import com.google.common.collect.Lists; import com.jd.platform.hotkey.dashboard.common.domain.Page; import org.springframework.util.CollectionUtils;import java.util.ArrayList; import java.util.List;public class PageUtil {/*** 通用分頁工具類*…

中陽策略:如何從K線行為中提取交易邏輯信號?

中陽策略&#xff1a;如何從K線行為中提取交易邏輯信號&#xff1f; 在量化趨勢研究中&#xff0c;中陽形態常被視作市場動能變化的重要標志。它不僅代表價格的強勢上行&#xff0c;更隱含著主力資金換手與情緒轉換的信號。將“中陽”這一結構元素抽象為模型中的“強動能突破”…

Java SE(8)——繼承

1.繼承的概念&作用 在Java中&#xff0c;繼承是面向對象編程的三大基本特性之一&#xff08;還有封裝和多態&#xff09;&#xff0c;允許一個類&#xff08;子類/繼承類&#xff09;繼承另一個類&#xff08;父類/基類&#xff09;的屬性和方法 繼承的核心目的是&#xf…

Python爬蟲(18)反爬攻防戰:動態IP池構建與代理IP實戰指南(突破95%反爬封禁率)

目錄 引言一、背景&#xff1a;為什么代理IP是爬蟲的“第二生命”&#xff1f;1.1 反爬系統的IP檢測三把刀1.2 代理IP的核心價值 二、基礎實戰&#xff1a;快速搭建代理IP系統2.1 免費代理IP的獲取與篩選2.2 代理IP的智能容錯機制 三、高階攻防&#xff1a;突破企業級反爬封鎖3…

LFU算法解析

文章目錄 LFU緩存中關鍵變量的訪問與更新機制1. min_freq - 最小頻率訪問時機更新時機更新示例 2. capacity - 緩存容量訪問時機更新時機訪問示例 3. key_to_node - 鍵到節點的映射訪問時機更新時機更新示例 4. freq_to_dummy - 頻率到鏈表啞節點的映射訪問時機更新時機更新示例…

ByteArrayInputStream 類詳解

ByteArrayInputStream 類詳解 ByteArrayInputStream 是 Java 中用于從字節數組讀取數據的輸入流&#xff0c;位于 java.io 包。它允許將內存中的字節數組當作輸入流來讀取&#xff0c;是處理內存數據的常用工具。 1. 核心特性 內存數據源&#xff1a;從字節數組&#xff08;b…

rvalue引用()

一、先確定基礎:左值(Lvalue)和右值(Rvalue) 理解Rvalue引用,首先得搞清楚左值和右值的概念。 左值(Lvalue):有明確內存地址的表達式,可以取地址。比如變量名、引用等。 復制代碼 int a = 10; // a是左值 int& ref = a; // ref也是左值右值(Rval…

吳恩達深度學習作業 RNN模型——字母級語言模型

一. 簡單復習一下RNN RNN RNN適用于處理序列數據&#xff0c;令是序列的第i個元素&#xff0c;那么就是一個長度為的序列&#xff0c;NLP中最常見的元素是單詞&#xff0c;對應的序列是句子。 RNN使用同一個神經網絡處理序列中的每一個元素。同時&#xff0c;為了表示序列的…

基于python的哈希查表搜索特定文件

Python有hashlib庫&#xff0c;支持多種哈希算法&#xff0c;比如MD5、SHA1、SHA256等。通常SHA256比較安全&#xff0c;但MD5更快&#xff0c;但可能存在碰撞風險&#xff0c;得根據自己需求決定。下面以SHA256做例。 import hashlib import os from typing import Dict, Lis…

idea創建springboot項目無法創建jdk8原因及多種解決方案

idea創建springboot項目無法創建jdk8原因及多種解決方案 提示&#xff1a;幫幫志會陸續更新非常多的IT技術知識&#xff0c;希望分享的內容對您有用。本章分享的是springboot的使用。前后每一小節的內容是存在的有&#xff1a;學習and理解的關聯性。【幫幫志系列文章】&#x…