精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

FastAPI + Agno HITL = 實時交互式AI!我們用SSE和WebSocket做出了可對話的AI管家 原創

發布于 2025-11-18 08:44
瀏覽
0收藏

在AI Agent的實際應用中,完全自主的決策往往存在風險。特別是在涉及敏感操作、重要決策或關鍵業務流程時,人類的監督和干預顯得尤為重要。Agno框架作為一個高性能的多智能體開發框架,在1.5.4版本中引入了強大的Human-in-Loop(HITL)功能,讓開發者能夠優雅地實現人機協作的智能體系統。

本文將深入探討Agno框架的HITL實現機制、流式輸出架構,并提供生產級的代碼示例,幫助開發者快速構建可控、高效的智能體應用。

一、Agno框架概述

1.1 核心特性

Agno是一個輕量級、高性能的智能體框架,具有以下突出特點:

  • 極致性能:智能體實例化僅需~2μs,內存占用僅~3.75KiB,比LangGraph快10,000倍
  • 原生多模態:支持文本、圖像、音頻、視頻的輸入和輸出
  • 推理優先:內置三種推理方法(推理模型、推理工具、自定義思維鏈)
  • 團隊協作:支持多智能體團隊架構,實現專業化分工
  • 生產就緒:提供預構建的FastAPI路由,快速部署上線

1.2 架構設計理念

Agno采用模塊化、可組合的設計理念,每個組件都是即插即用的模塊:

# 簡潔的聲明式接口
from agno.agent import Agent
from agno.models.openai import OpenAIChat

agent = Agent(
    model=OpenAIChat(id="gpt-4o"),
    tools=[...],
    memory=True,
    reasoning=True
)

二、Human-in-Loop機制詳解

2.1 HITL的設計模式

Agno提供了四種主要的HITL控制流模式:

2.1.1 用戶確認流(User Confirmation Flow)

對于敏感操作,在執行前要求用戶確認:

from agno.tools import tool
from agno.agent import Agent
from agno.models.openai import OpenAIChat

@tool(requires_confirmation=True)
def delete_database(db_name: str) -> str:
    """刪除數據庫的敏感操作"""
    # 實際的刪除邏輯
    returnf"已成功刪除數據庫: {db_name}"

@tool(requires_confirmation=True)
def transfer_funds(amount: float, to_account: str) -> str:
    """轉賬操作,需要用戶確認"""
    # 轉賬邏輯
    returnf"已轉賬 ${amount} 到賬戶 {to_account}"

# 創建需要確認的智能體
agent = Agent(
    model=OpenAIChat(id="gpt-4o"),
    tools=[delete_database, transfer_funds],
    description="財務管理助手",
    markdown=True
)

# 執行需要確認的操作
response = agent.run("刪除test_db數據庫")

# 處理確認流程
if agent.is_paused:
    for tool in agent.run_response.tools_requiring_confirmation:
        print(f"工具 {tool.tool_name} 需要確認")
        print(f"參數: {tool.tool_args}")
        
        # 獲取用戶確認
        confirmed = input("確認執行?(y/n): ").lower() == "y"
        tool.confirmed = confirmed
    
    # 繼續執行
    response = agent.continue_run()
    print(response.content)

2.1.2 用戶輸入流(User Input Flow)

當需要收集額外信息時,暫停執行并等待用戶輸入:

from typing import List
from agno.tools import tool
from agno.tools.function import UserInputField

@tool(requires_user_input=True, user_input_fields=["to_address", "cc_addresses"])
asyncdef send_email(subject: str, body: str, to_address: str, cc_addresses: str = None) -> str:
    """
    發送郵件,需要用戶提供收件人地址
    
    Args:
        subject: 郵件主題
        body: 郵件正文
        to_address: 收件人地址(需要用戶輸入)
        cc_addresses: 抄送地址(可選)
    """
    cc_text = f",抄送給 {cc_addresses}"if cc_addresses else""
    returnf"已發送郵件到 {to_address}{cc_text},主題:{subject}"

# 異步執行智能體
import asyncio

agent = Agent(
    model=OpenAIChat(id="gpt-4o-mini"),
    tools=[send_email],
    markdown=True,
    debug_mode=True
)

asyncdef handle_user_input():
    await agent.arun("發送會議通知郵件,主題是'季度總結會議'")
    
    if agent.is_paused:
        for tool in agent.run_response.tools_requiring_user_input:
            input_schema: List[UserInputField] = tool.user_input_schema
            
            for field in input_schema:
                print(f"\n需要輸入: {field.name}")
                print(f"類型: {field.field_type.__name__}")
                print(f"描述: {field.description}")
                
                if field.value isNone:
                    user_value = input(f"請輸入 {field.name}: ")
                    field.value = user_value
        
        # 提供用戶輸入后繼續執行
        response = await agent.acontinue_run()
        print(response.content)

# 運行異步函數
asyncio.run(handle_user_input())

2.1.3 外部工具執行流(External Tool Execution)

標記某些工具在智能體上下文之外執行:

@tool(external_execution=True)
def execute_shell_command(command: str) -> str:
    """
    執行shell命令(外部執行)
    注意:這個函數不會在智能體內部執行
    """
    pass# 實際執行邏輯在外部處理

agent = Agent(
    model=OpenAIChat(id="gpt-4o"),
    tools=[execute_shell_command],
    description="系統管理助手"
)

response = agent.run("列出當前目錄的所有文件")

if agent.is_paused:
    for tool in agent.run_response.tools_to_execute_externally:
        print(f"需要外部執行: {tool.tool_name}")
        print(f"參數: {tool.tool_args}")
        
        # 在外部環境執行
        import subprocess
        if tool.tool_name == "execute_shell_command":
            result = subprocess.run(
                tool.tool_args['command'], 
                shell=True, 
                capture_output=True, 
                text=True
            )
            tool.result = result.stdout
    
    # 將結果返回給智能體
    response = agent.continue_run()

2.1.4 動態用戶輸入(Dynamic User Input)

使用UserControlFlowTools讓智能體動態決定何時需要用戶輸入:

from agno.tools.user_control_flow import UserControlFlowTools

agent = Agent(
    model=OpenAIChat(id="gpt-4o"),
    tools=[UserControlFlowTools()],
    description="交互式助手",
    markdown=True
)

response = agent.run("幫我創建一個項目計劃")

while response.is_paused:
    if response.tools_requiring_user_input:
        for tool in response.tools_requiring_user_input:
            # 智能體決定需要什么信息
            print(f"智能體請求: {tool.description}")
            user_input = input("您的輸入: ")
            tool.value = user_input
    
    response = agent.continue_run()

2.2 工具級別的控制

Agno允許在工具包級別精細控制哪些工具需要確認:

from agno.tools.yfinance import YFinanceTools
from agno.tools.duckduckgo import DuckDuckGoTools

agent = Agent(
    model=OpenAIChat(id="gpt-4o"),
    tools=[
        # 只有股票價格查詢需要確認
        YFinanceTools(
            requires_confirmation_tools=["get_current_stock_price"],
            stock_price=True,
            analyst_recommendations=True
        ),
        # 網絡搜索不需要確認
        DuckDuckGoTools()
    ],
    description="金融分析助手"
)

三、流式輸出架構實現

3.1 基礎流式響應

Agno支持流式輸出,提供更好的用戶體驗:

from typing import Iterator
from agno.agent import Agent, RunResponse
from agno.models.openai import OpenAIChat

agent = Agent(
    model=OpenAIChat(id="gpt-4o"),
    markdown=True,
    show_tool_calls=True
)

# 方式1:使用print_response直接流式輸出
agent.print_response(
    "分析NVDA股票的投資價值",
    stream=True,
    show_full_reasoning=True,
    stream_intermediate_steps=True
)

# 方式2:獲取流式響應迭代器
run_response: Iterator[RunResponse] = agent.run(
    "生成季度財務報告",
    stream=True
)

for chunk in run_response:
    if chunk.content:
        print(chunk.content, end="", flush=True)

3.2 與Web框架集成的流式輸出

3.2.1 FastAPI SSE(Server-Sent Events)實現

from fastapi import FastAPI
from fastapi.responses import StreamingResponse
from agno.agent import Agent
from agno.models.openai import OpenAIChat
import json
import asyncio

app = FastAPI()

# 創建全局智能體實例
agent = Agent(
    model=OpenAIChat(id="gpt-4o"),
    tools=[...],
    markdown=True
)

asyncdef generate_sse_response(query: str):
    """生成SSE格式的流式響應"""
    asyncfor chunk in agent.arun(query, stream=True):
        if chunk.content:
            # SSE格式:data: {json}\n\n
            yieldf"data: {json.dumps({'content': chunk.content})}\n\n"
        
        # 如果需要確認
        if chunk.is_paused:
            yieldf"data: {json.dumps({'type': 'confirmation_required', 'tools': [t.dict() for t in chunk.tools_requiring_confirmation]})}\n\n"
            
@app.post("/chat/stream")
asyncdef stream_chat(request: dict):
    """流式聊天接口"""
    query = request.get("query")
    
    return StreamingResponse(
        generate_sse_response(query),
        media_type="text/event-stream",
        headers={
            "Cache-Control": "no-cache",
            "Connection": "keep-alive",
            "X-Accel-Buffering": "no"# 禁用Nginx緩沖
        }
    )

@app.post("/chat/confirm")
asyncdef confirm_tool(request: dict):
    """確認工具執行"""
    tool_id = request.get("tool_id")
    confirmed = request.get("confirmed", False)
    
    # 處理確認邏輯
    if agent.is_paused:
        for tool in agent.run_response.tools_requiring_confirmation:
            if tool.id == tool_id:
                tool.confirmed = confirmed
        
        # 繼續執行并返回流式響應
        return StreamingResponse(
            generate_sse_response(None),  # 繼續之前的執行
            media_type="text/event-stream"
        )

3.2.2 WebSocket實現雙向通信

from fastapi import WebSocket, WebSocketDisconnect
import json

@app.websocket("/ws/agent")
asyncdef websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    
    try:
        whileTrue:
            # 接收客戶端消息
            data = await websocket.receive_text()
            message = json.loads(data)
            
            if message["type"] == "query":
                # 處理查詢請求
                asyncfor chunk in agent.arun(message["content"], stream=True):
                    if chunk.content:
                        await websocket.send_json({
                            "type": "content",
                            "data": chunk.content
                        })
                    
                    # 處理HITL
                    if chunk.is_paused:
                        await websocket.send_json({
                            "type": "confirmation_required",
                            "tools": [
                                {
                                    "id": tool.id,
                                    "name": tool.tool_name,
                                    "args": tool.tool_args
                                }
                                for tool in chunk.tools_requiring_confirmation
                            ]
                        })
                        
            elif message["type"] == "confirm":
                # 處理確認消息
                tool_id = message["tool_id"]
                confirmed = message["confirmed"]
                
                for tool in agent.run_response.tools_requiring_confirmation:
                    if tool.id == tool_id:
                        tool.confirmed = confirmed
                
                # 繼續執行
                asyncfor chunk in agent.acontinue_run(stream=True):
                    if chunk.content:
                        await websocket.send_json({
                            "type": "content",
                            "data": chunk.content
                        })
                        
    except WebSocketDisconnect:
        print("Client disconnected")


本文轉載自??AI 博物院?? 作者:longyunfeigu

?著作權歸作者所有,如需轉載,請注明出處,否則將追究法律責任
已于2025-11-18 08:44:00修改
收藏
回復
舉報
回復
相關推薦
精品久久久久一区二区国产| 2023国产精品自拍| 九九精品视频在线观看| 中文字幕一二三| 女同一区二区免费aⅴ| 国产福利91精品一区二区三区| 欧美国产中文字幕| 国产成人精品无码片区在线| 欧美大片免费高清观看| 97se亚洲国产综合自在线不卡 | 色综合久久久888| 一区二区三区网址| 1stkiss在线漫画| 成人成人成人在线视频| 日本高清+成人网在线观看| 老司机福利在线观看| 欧美一区一区| 日韩欧美中文免费| 亚洲一区二区免费视频软件合集| av综合在线观看| 欧美专区18| 欧美精品生活片| 国产精品亚洲无码| 日韩电影精品| 欧美日韩国产一区中文午夜| 亚洲精品一区二区三区蜜桃久| 国产高清在线免费| 日韩电影在线观看一区| 欧美极品少妇xxxxⅹ裸体艺术| 免费人成又黄又爽又色| 亚洲成人高清| 亚洲国产综合色| 在线观看成人av电影| 天天综合天天综合| 国产精品亚洲专一区二区三区 | 欧美性xxxx图片| 在线视频成人| 欧美性猛xxx| 成人手机在线播放| 888av在线| 波多野结衣中文一区| 91精品视频在线看| 亚洲精品中文字幕乱码三区91| 一区二区三区四区日韩| 伊人伊成久久人综合网小说| 成人性生活免费看| 日本精品在线播放| 欧美美女一区二区三区| 9久久婷婷国产综合精品性色 | 高清日韩电视剧大全免费| 国产精品69久久| 日韩高清免费av| 中文字幕一区二区三区乱码图片 | 亚洲人成电影网站色…| 国产又粗又长又爽| www.神马久久| 日韩精品一区二区三区视频在线观看 | 日韩中文字幕综合| 国产成人在线观看| 91久久精品国产91久久性色tv| 亚洲一级片免费看| 免费在线一区观看| 国产精品第一区| 日韩成年人视频| 亚洲二区精品| 国内免费久久久久久久久久久 | 国产成人免费高清| 7777精品久久久大香线蕉小说| 91在线视频国产| 精品一区二区日韩| 91网站免费观看| 国产精品天天操| 国产一区三区三区| 91综合免费在线| 国产av无码专区亚洲a∨毛片| 精品一区二区在线视频| 91精品国产综合久久香蕉922| 中文字幕码精品视频网站| 日韩精品五月天| 国产精品久久久久久久久影视| 无码人妻精品一区二区三区蜜桃91| 亚洲欧美日韩国产一区| 欧日韩在线观看| 男女视频免费看| 日日夜夜精品视频免费| 国产精品入口免费视频一| 久久国产精品系列| 日韩经典一区二区| 国产日韩欧美日韩| 精品国产av一区二区三区| 国产不卡视频一区二区三区| 精品卡一卡二| 在线免费看av| 一区二区三区免费| www.中文字幕在线| 日韩av成人| 日本一区二区三区四区在线视频| 玖玖精品在线视频| 中文字幕在线免费观看视频| 欧美精品久久一区| 狠狠人妻久久久久久综合蜜桃| 久久美女精品| 97精品国产97久久久久久免费| 一区二区视频免费| hitomi一区二区三区精品| 亚洲图片在线观看| √8天堂资源地址中文在线| 色婷婷综合在线| 国产精品成人免费一区久久羞羞| 精品少妇av| 国模极品一区二区三区| 中文字幕日韩三级| 26uuu欧美| 亚洲理论电影在线观看| 91视频亚洲| 亚洲视频自拍偷拍| 日本一级一片免费视频| 国产一区二区三区四区五区入口| 麻豆成人在线播放| 超碰91在线观看| 日韩视频永久免费| 日本不卡一区视频| 日韩精品三区四区| 精品视频高清无人区区二区三区| av网站免费在线观看| 欧美视频在线一区二区三区 | 亚洲人成精品久久久 | 一级毛片精品毛片| 久久久精品视频成人| 中文字幕乱伦视频| 久久久久久免费网| 国产91在线视频观看| 风间由美中文字幕在线看视频国产欧美 | 国产精品福利视频| 肉体视频在线| 日韩精品中午字幕| 波多野结衣不卡视频| 久久97超碰国产精品超碰| 日韩精品久久一区| 无人区在线高清完整免费版 一区二 | 欧洲美女免费图片一区| 人妻偷人精品一区二区三区| 亚洲一区在线电影| 波多野结衣办公室双飞| 国产精品99一区二区| 999久久久| 秋霞在线午夜| 欧美精品一区二区久久久| 久久久久成人网站| 成人av在线播放网址| 日韩免费在线观看av| av成人资源网| 欧美亚洲国产视频小说| 青青免费在线视频| 欧美在线不卡一区| 日本伦理一区二区三区| 国产一区二区视频在线播放| 亚洲天堂第一区| 2020国产精品极品色在线观看| 高清欧美电影在线| 五月天婷婷在线播放| 91国产丝袜在线播放| youjizz亚洲女人| 国产资源在线一区| 高清欧美精品xxxxx| 欧美男人操女人视频| 欧美一区二区三区……| 福利视频在线看| 欧美一级欧美三级| 欧美bbbbbbbbbbbb精品| 国产日韩欧美一区二区三区乱码| www.日本一区| 欧美成人tv| 久久国产精品免费一区| www.精品国产| 欧美精品久久久久久久免费观看| 日韩porn| 欧美一区二区性放荡片| 亚洲精品www久久久久久| 国产日韩一级二级三级| gogogo高清免费观看在线视频| 综合久久精品| 久久影院理伦片| 亚洲精品乱码日韩| 久久久久久久91| 国产九色在线| 日韩视频免费观看高清在线视频| 日韩精品人妻中文字幕| 国产精品热久久久久夜色精品三区 | 97人人做人人爽香蕉精品| 欧美高清视频一区二区| 黄色软件在线观看| 日韩一区二区三区在线| 91video| 一区二区国产视频| 法国空姐电影在线观看| 丁香婷婷综合网| 亚洲欧美在线精品| 日韩视频一区| 欧美大片免费播放| 精品精品99| 国产亚洲情侣一区二区无| 欧美天堂一区| 欧美在线一级va免费观看| 91高清在线观看视频| 亚洲性无码av在线| 香蕉av在线播放| 欧美一卡2卡3卡4卡| 激情网站在线观看| 亚洲v中文字幕| 成人观看免费视频| 国产精品毛片大码女人| 男人天堂av电影| 99视频有精品| 26uuu国产| 国内精品国产三级国产a久久 | 黄色性视频网站| 欧美日韩91| 亚洲国产欧洲综合997久久| xxxx日韩| 亚洲在线一区二区| 国产情侣一区二区三区| 情事1991在线| 第一福利在线视频| 欧美国产第二页| 欧美成人三区| 国产亚洲精品高潮| 视频一区二区在线播放| 精品久久久影院| 国产成人毛毛毛片| 在线观看91av| 一级黄色片在线| 欧美日韩中文国产| 无码人妻丰满熟妇奶水区码| 欧美日韩国产综合视频在线观看中文| 久久久一二三区| 一区二区三区美女| 97成人资源站| ㊣最新国产の精品bt伙计久久| 一级在线观看视频| 国产农村妇女毛片精品久久麻豆 | 女优一区二区三区| 美乳视频一区二区| 免费毛片在线不卡| 日本在线播放一区| 国产一区三区在线播放| 日本福利一区二区三区| 国产亚洲欧美日韩在线观看一区二区| 欧美一区二区三区四区夜夜大片| 国产精品亚洲人成在99www| 欧美福利精品| 国产欧美一区二区三区精品观看 | 亚洲高清久久| 欧美视频在线观看网站| 亚洲伦伦在线| 免费成人在线视频网站| 久久综合导航| 日本a√在线观看| 久久99九九99精品| 色黄视频免费看| 成人一区二区视频| 中文文字幕文字幕高清| 久久―日本道色综合久久| 国产一二三四区在线| 国产精品久久久久久亚洲毛片| 极品魔鬼身材女神啪啪精品| 一区二区三区在线播放| 国产主播在线播放| 色猫猫国产区一区二在线视频| 免费看av在线| 91精品国产丝袜白色高跟鞋| 成人免费一级视频| 日韩精品亚洲元码| 亚洲s色大片| 欧美激情成人在线视频| 亚洲精品**中文毛片| 国产乱肥老妇国产一区二| 国产一区二区三区国产精品| 国产精品一区二区a| 天天躁日日躁成人字幕aⅴ| 日韩欧美视频一区二区| 综合久久99| 成人免费毛片网| 久久国产精品第一页| 精品人妻一区二区免费| 久久精品亚洲乱码伦伦中文| 国产日产精品一区二区三区的介绍| 一区2区3区在线看| 69国产精品视频免费观看| 欧美日韩小视频| 日韩在线观看视频网站| 伊人久久久久久久久久久| 亚洲婷婷噜噜| 国产成人在线视频| 日韩欧美激情电影| 日韩av电影免费播放| 一区在线视频观看| 91精品999| 91视频国产观看| 久久av高潮av无码av喷吹| 日本丶国产丶欧美色综合| 精品国产av一区二区| 一区二区三区亚洲| 蜜桃视频www网站在线观看| 成人做爽爽免费视频| 免费av一区二区三区四区| 激情五月六月婷婷| 免费欧美日韩国产三级电影| 老熟妇精品一区二区三区| 中文字幕在线一区| 在线观看污污网站| 亚洲成人a级网| av在线影院| 国产精品久久久久久久久影视 | 亚洲精品成人a8198a| 亚洲福利久久| 亚欧美一区二区三区| 国产精品视频看| 区一区二在线观看| 日韩网站在线看片你懂的| 9191在线| 国产精品欧美激情在线播放| 色天下一区二区三区| 999久久欧美人妻一区二区| 久久精品国产**网站演员| 熟女俱乐部一区二区视频在线| 午夜欧美2019年伦理| 精品黑人一区二区三区国语馆| 久久韩剧网电视剧| 国产极品嫩模在线观看91精品| 欧美一区二区三区四区夜夜大片 | 亚洲一区精品在线| 国产露脸无套对白在线播放| 中文字幕av日韩| 精品免费av一区二区三区| 蜜桃臀一区二区三区| 国产日韩欧美三级| 中文字幕在线免费看线人| 亚洲成人高清在线| 天天干,天天操,天天射| 国内精品久久久久影院优| 高清一区二区三区| 六月婷婷在线视频| 99re热这里只有精品视频| 日韩精品国产一区二区| 亚洲精品电影网| 在线视频cao| 美乳视频一区二区| 久久亚洲二区| 最新中文字幕av| 欧美日韩精品一二三区| 午夜激情视频在线观看| 国产一区二区丝袜高跟鞋图片| 不卡中文一二三区| 一女二男3p波多野结衣| 亚洲色图一区二区三区| 国产免费av电影| 色在人av网站天堂精品| 成人午夜三级| 成年网站在线免费观看| 亚洲国产精品高清| 国产精品怡红院| 色综合久久久久久中文网| 欧美日韩直播| 黄色片在线免费| 日韩一区在线免费观看| www.桃色av嫩草.com| 性色av一区二区咪爱| 在线视频亚洲专区| 在线观看国产一级片| 亚洲美女在线一区| 国产精品三级在线| 亚洲影视一区二区三区| 91精产国品一二三| 黄色精品在线看| av网页在线| 成人91视频| 久久久久99| 成人免费视频网站入口::| 精品va天堂亚洲国产| www.成人爱| 中文字幕中文字幕在线中一区高清 | 一区二区在线免费| 亚洲 欧美 自拍偷拍| 国产在线日韩在线| 日韩午夜电影| 永久av免费网站| 日韩成人在线免费观看| 激情久久一区二区| 青青青青草视频| 亚洲国产精品黑人久久久| 蜜臀久久久久久999| 国产脚交av在线一区二区| 影音先锋成人在线电影| 亚洲乱码国产乱码精品精大量| 欧美日韩日日摸| yellow字幕网在线| 久久99国产精品一区| 久久久五月婷婷| 亚洲精品一区二区三区四区 |