精品欧美一区二区三区在线观看 _久久久久国色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修改
收藏
回復
舉報
回復
相關推薦
亚洲欧美日韩小说| 最新精品国偷自产在线| 亚洲一区二区影院| 精品一区二区三区免费毛片| 欧美亚洲另类小说| 欧美特黄一级大片| 精品欧美黑人一区二区三区| 国产肥臀一区二区福利视频| a√资源在线| 国产精品自拍毛片| 日本最新高清不卡中文字幕| 成年人二级毛片| 小嫩嫩12欧美| 欧美一区二区三区四区视频| 哪个网站能看毛片| 中文在线字幕免费观看| 久久久精品日韩欧美| 亚洲xxxx3d| 午夜精品久久久久久久蜜桃| 国产一区激情| 色噜噜亚洲精品中文字幕| 久久久久久婷婷| av在线播放一区二区| 欧美日韩一区二区精品| 91麻豆天美传媒在线| 番号集在线观看| 97久久久精品综合88久久| 亚洲专区国产精品| 午夜一级黄色片| 国产日韩一区二区三区在线| 欧美裸身视频免费观看| 国产三级在线观看完整版| 同性恋视频一区| 精品免费国产一区二区三区四区| 日韩在线一区视频| 欧美天堂视频| 日韩欧美中文字幕在线观看 | 水莓100在线视频| 国产乱码精品一区二区三| 国产精品伦子伦免费视频| 亚洲影院在线播放| 日韩亚洲国产欧美| 久久久这里只有精品视频| 污软件在线观看| 91久久国产| 久久视频这里只有精品| 91禁男男在线观看| 久久婷婷蜜乳一本欲蜜臀| 在线观看欧美www| 性猛交ⅹxxx富婆video | 国产成人精品1024| 2022国产精品| 精品人妻一区二区三区麻豆91| 狠狠色伊人亚洲综合成人| 国产精品亚洲аv天堂网| 欧美特级黄色片| 日日夜夜一区二区| 国产精品久久久久久久久| 久久久999久久久| 美女视频免费一区| 国产乱人伦真实精品视频| 中文字幕免费在线看| 另类调教123区 | 久久精品国产亚洲5555| 精品福利av导航| 亚洲精品乱码久久久久久久| 日本午夜精品| 国产亚洲激情视频在线| 国产一区二区三区四区在线| 久久久国产精品| 欧美黑人又粗大| 黄网在线观看视频| 日韩综合在线视频| 国产女人精品视频| 国产成人精品一区二区无码呦 | 欧美日韩一区小说| 不用播放器的免费av| 久久影院一区二区三区| 亚洲成人999| 国产男男chinese网站| 欧美自拍偷拍| 欧美肥臀大乳一区二区免费视频| 国产午夜在线播放| 蜜桃久久久久久| 99精品欧美一区二区三区| 日韩一区二区三区在线观看视频| 久久综合99re88久久爱| 一区二区三区不卡在线| 美女精品导航| 欧洲一区二区av| 91av免费观看| 国产亚洲一卡2卡3卡4卡新区 | 忘忧草在线影院两性视频| 在线国产亚洲欧美| 91av免费观看| 欧洲杯什么时候开赛| 另类视频在线观看| 99精品在线播放| 国产综合久久久久影院| 精品国产一区二区三区麻豆小说| av男人的天堂在线| 亚洲乱码日产精品bd| 久久久999免费视频| 欧美一区=区三区| 日韩精品中文字幕在线| 亚洲精品卡一卡二| 久久香蕉精品| 国产精品一区二区三区在线观| 搞黄视频在线观看| 亚洲一区二区影院| 男人的天堂最新网址| 亚洲区小说区图片区qvod| 久久国产精品99国产精| 欧美日韩精品不卡| av手机天堂网| 波多野结衣在线aⅴ中文字幕不卡| 午夜精品电影在线观看| 97人澡人人添人人爽欧美| 欧美日韩不卡在线| 香蕉网在线播放| 亚洲成色精品| 91手机在线视频| 欧美猛烈性xbxbxbxb| 色婷婷狠狠综合| 色婷婷精品国产一区二区三区| 久热精品视频在线观看一区| 色婷婷久久久综合中文字幕| 欧美国产激情二区三区| 麻豆精品久久久| 亚洲激情女人| 欧美疯狂party性派对| 蜜桃一区av| 黄页在线观看免费| 久久蜜桃av一区二区天堂| 亚洲最新免费视频| 国产精品迅雷| 日韩电视剧在线观看免费网站| 国产综合精品久久久久成人av| 国产视频久久| 激情欧美一区二区三区中文字幕| 黄色污污视频在线观看| 欧美一区二区三区免费视频| 操她视频在线观看| 蜜桃视频一区二区三区| 午夜免费电影一区在线观看| 久久久成人av毛片免费观看| 亚洲欧美日韩一区在线| 成人午夜淫片100集| 91麻豆国产在线观看| 欧洲黄色一级视频| 日韩人体视频| 日韩av理论片| 成人全视频高清免费观看| 在线一区二区三区四区五区| 亚洲国产天堂av| 日韩黄色小视频| 亚洲不卡1区| 亚洲成人av观看| 日韩在线不卡视频| 国产精品无码天天爽视频| 亚洲人成网站在线| 久久久无码人妻精品无码| 红桃视频国产精品| 精品一区二区不卡| 亚洲淫成人影院| 影音先锋日韩有码| 91麻豆成人精品国产| 亚洲精品视频一区二区| www.555国产精品免费| 亚洲免费高清| 日本一区二区三区免费观看| 欧美激情福利| 欧美激情久久久久久| 婷婷亚洲一区二区三区| 在线观看国产91| 小泽玛利亚一区| www.亚洲色图| 香蕉视频网站入口| 中国精品18videos性欧美| 国产亚洲一区在线播放| 欧美精品高清| 欧美另类精品xxxx孕妇| 日本一卡二卡四卡精品| 在线播放国产精品二区一二区四区 | 天天操夜夜操视频| 国产精品丝袜一区| 精品1卡二卡三卡四卡老狼| 久久精品人人做人人爽电影蜜月| 伊人天天久久大香线蕉av色| 国产精品17p| 国产精品视频永久免费播放| 日韩三级免费| 一本色道久久88精品综合| 国产免费av电影| 欧美午夜美女看片| 看片网站在线观看| 国产午夜久久久久| 欧美丰满熟妇bbb久久久| 性xx色xx综合久久久xx| 亚洲精品少妇一区二区| 奇米狠狠一区二区三区| 成人欧美一区二区| av成人亚洲| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产视频第一区| 亚洲国产精品99| 国产男男gay网站| 在线看国产一区| 中文字幕亚洲高清| 亚洲精品亚洲人成人网| 亚洲色图 激情小说| 91在线观看高清| 精品无码av一区二区三区不卡| 日本vs亚洲vs韩国一区三区二区| 国产 日韩 欧美在线| 亚洲a在线视频| 色女人综合av| 国产成人调教视频在线观看| 国产日本一区二区三区| 麻豆精品久久| 成人妇女淫片aaaa视频| 日韩免费小视频| 2018日韩中文字幕| 俺来也官网欧美久久精品| 久久久久www| 日韩伦理在线电影| 国产亚洲精品日韩| 黄色大片在线免费观看| 亚洲高清久久久久久| 午夜精品久久久久久久96蜜桃| 在线不卡a资源高清| 中文字幕在线视频第一页| 色婷婷精品久久二区二区蜜臀av| 日韩精品在线观看免费| 午夜精品视频一区| 国产精品第108页| 亚洲综合一区二区三区| 久久国产在线视频| 亚洲精品国产无天堂网2021| 人妻人人澡人人添人人爽| 中文字幕在线不卡视频| 久久人妻无码aⅴ毛片a片app | 综合久久av| 成人福利在线视频| 国产精品亚洲欧美日韩一区在线| 成人激情视频在线| 高清国产一区二区三区四区五区| 国产一区欧美二区三区| 欧美黄色网络| 亚洲最大成人在线| 91精品国产自产在线丝袜啪| 电影午夜精品一区二区三区| 精品淫伦v久久水蜜桃| 好吊妞www.84com只有这里才有精品 | 宅男噜噜噜66一区二区| heyzo国产| 天堂久久久久va久久久久| 九热视频在线观看| 久久精品国产一区二区| www,av在线| 国产99久久精品| 国产精品边吃奶边做爽| 国产日韩精品久久久| 波多野结衣欲乱| 一区二区三区在线观看动漫| 免费看日韩毛片| 一本色道久久综合狠狠躁的推荐| 成人免费一级片| 欧美一区二区三区四区高清| 日韩一区二区三区在线观看视频| 亚洲视频欧美视频| 久久精品视频观看| 久久久久久网站| 制服诱惑亚洲| 亚洲精品免费网站| 麻豆一区二区| 亚洲精品久久区二区三区蜜桃臀 | 羞羞色国产精品| 3d性欧美动漫精品xxxx软件| 91美女福利视频高清| 国产精品美女在线观看直播| 日产国产精品精品a∨| 欧美在线黄色| 99久久国产宗和精品1上映| 蓝色福利精品导航| 私密视频在线观看| 国产精品国产自产拍在线| 国产精品成人国产乱| 欧美亚洲一区二区在线| 亚洲国产精品成人久久蜜臀| 亚洲欧美日韩久久久久久 | 亚洲免费av观看| 一级成人黄色片| 日韩欧美综合在线| 国产二区视频在线观看| 欧美激情一级精品国产| yiren22亚洲综合| 国产专区一区二区三区| 99成人在线视频| 国产二区视频在线播放| 黄一区二区三区| 伊人网伊人影院| 亚洲永久免费av| 在线观看毛片网站| 日韩成人中文电影| 直接在线观看的三级网址| 国产精品成人一区二区| 老司机精品在线| 伊人久久在线观看| 美女视频网站久久| 手机av免费看| 亚洲777理论| 精品久久久久成人码免费动漫| 有码中文亚洲精品| 在线女人免费视频| 国产精品jizz视频| 一区二区影院| 污污的视频免费| 欧美激情综合五月色丁香| 91在线视频在线观看| 亚洲丁香婷深爱综合| 色呦呦在线资源| 亚洲japanese制服美女| 欧美www视频在线观看| 少妇高清精品毛片在线视频| 99久久精品久久久久久清纯| 久久综合亚洲色hezyo国产| 91精品国产手机| 精精国产xxxx视频在线| 国产一区二区在线免费视频| 久久精品高清| 久久久久久蜜桃一区二区| 国产喷白浆一区二区三区| 五月婷婷视频在线| 日韩电影中文字幕| 美女av在线免费看| 久久本道综合色狠狠五月| 亚洲黄色一区| 野花社区视频在线观看| 欧美日韩精品在线视频| 天堂在线中文资源| 57pao成人国产永久免费| 香蕉人人精品| 麻豆av免费在线| 国产日韩欧美高清在线| 亚洲成人av网址| 最好看的2019年中文视频| 国产精品xxx| 一区二区三区四区国产| 韩国精品久久久| 欧美久久久久久久久久久久| 精品少妇一区二区三区日产乱码 | 日韩av电影院| 日韩在线激情| 一区二区三区国| 国产精品亚洲第一| 国产亚洲精久久久久久无码77777| 欧美一级欧美三级在线观看| 青青草原av在线| 国产伦精品一区二区三区高清版 | 国产精品a级| 色悠悠在线视频| 欧美色图在线视频| 国产黄在线观看免费观看不卡| 国产欧美一区二区三区久久| 天天久久综合| 影音先锋资源av| 福利一区福利二区微拍刺激| a中文在线播放| 91九色蝌蚪嫩草| 国产欧美91| 正在播放国产对白害羞| 88在线观看91蜜桃国自产| 七七成人影院| 欧美重口乱码一区二区| 久国产精品韩国三级视频| 免费一级肉体全黄毛片 | 色欧美激情视频在线| 91精品国产综合久久久久久丝袜| 国产精品久久久亚洲一区| 快灬快灬一下爽蜜桃在线观看| 日韩午夜中文字幕| 中文在线最新版地址| 在线看无码的免费网站| www.99精品| 伊人影院中文字幕| 欧美激情视频在线| 国产最新精品| 又黄又色的网站| 欧美日韩和欧美的一区二区| 另类视频在线| 亚洲精品国产精品久久| 99视频一区二区| 97人妻一区二区精品免费视频 | 最新精品在线| 北条麻妃av高潮尖叫在线观看| 亚洲男同1069视频| 韩国免费在线视频| 俄罗斯精品一区二区三区| 另类小说综合欧美亚洲|