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

100行代碼搞定多智能體?這個極簡AI框架PocketFlow有點東西 原創

發布于 2025-7-2 06:00
瀏覽
0收藏

現在各種工作流框架太多了,看不過來,也沒有什么精力去學習。最近無意中刷到一個微型框架:PocketFlow,這個框架非常小巧,看了下只有 100 行左右的代碼,很容易看懂。我非常喜歡,寫個教程介紹一下。

對比其他框架


 抽象

應用特定包裝器

供應商特定包裝器

代碼行數

大小

LangChain

Agent, Chain

很多 (例如,QA, 摘要)

很多 (例如,OpenAI, Pinecone等)

405K

+166MB

CrewAI

Agent, Chain

很多 (例如,FileReadTool, SerperDevTool)

很多 (例如,OpenAI, Anthropic, Pinecone等)

18K

+173MB

SmolAgent

Agent

一些 (例如,CodeAgent, VisitWebTool)

一些 (例如,DuckDuckGo, Hugging Face等)

8K

+198MB

LangGraph

Agent, Graph

一些 (例如,語義搜索)

一些 (例如,PostgresStore, SqliteSaver等)

37K

+51MB

AutoGen

Agent

一些 (例如,Tool Agent, Chat Agent)

很多 [可選] (例如,OpenAI, Pinecone等)

7K (僅核心)

+26MB (僅核心)

PocketFlow

Graph

100

+56KB

100行代碼搞定多智能體?這個極簡AI框架PocketFlow有點東西-AI.x社區

通過對比可以看到,PocketFlow 沒有很多融合的功能,只抽象出Graph,就能完成常見的RAG和Agent相關的功能了。

應用場景

PocketFlow 設計了多種應用場景的示例,從基礎的聊天機器人到復雜的多智能體系統。以下是一些基礎示例:

  1. 聊天:基礎聊天機器人,帶有對話歷史
  2. 結構化輸出:通過提示從簡歷中提取結構化數據
  3. 工作流:寫作工作流,包括大綱、內容編寫和樣式應用
  4. 智能體:可以搜索網絡并回答問題的研究智能體
  5. RAG:簡單的檢索增強生成過程
  6. 批處理:將 Markdown 內容翻譯成多種語言的批處理器

更復雜的應用包括:多智能體通信、監督流程、并行執行、思維鏈推理、短期和長期記憶聊天機器人等。

多智能體實戰

現在我們用PocketFlow實現一個AI版"你畫我猜"——Taboo游戲

為了直觀地展示PocketFlow的威力,我們來看一個用它實現的多智能體協作案例:Taboo(禁忌語)游戲

游戲規則:

*   提示者 (Hinter): 知道一個目標詞和幾個"禁忌詞"。它的任務是給出提示,引導猜詞者猜出目標詞,但提示中不能包含任何禁忌詞。

*   猜詞者 (Guesser): 根據提示者的提示,猜出目標詞。

在這個案例中,兩個LLM將分別扮演提示者和猜詞者,它們需要通過不斷的異步通信來協作完成游戲。

PocketFlow使用??AsyncNode???來定義異步任務。我們的兩個智能體??AsyncHinter???和??AsyncGuesser??都繼承自它。

提示者 ??AsyncHinter??

class AsyncHinter(AsyncNode):
    asyncdef prep_async(self, shared):
        # 1. 從隊列中等待猜詞者的消息
        guess = await shared["hinter_queue"].get()
        if guess == "GAME_OVER":
            returnNone
        # 2. 準備LLM的輸入
        return shared["target_word"], shared["forbidden_words"], shared.get("past_guesses", [])

    asyncdef exec_async(self, inputs):
        # ... (調用LLM生成提示)
        target, forbidden, past_guesses = inputs
        prompt = f"Generate hint for '{target}'\nForbidden words: {forbidden}"
        if past_guesses:
            prompt += f"\nPrevious wrong guesses: {past_guesses}\nMake hint more specific."
        hint = call_llm(prompt)
        print(f"\nHinter: Here's your hint - {hint}")
        return hint

    asyncdef post_async(self, shared, prep_res, exec_res):
        if exec_res isNone:
            return"end"
        # 3. 將生成的提示放入猜詞者的隊列
        await shared["guesser_queue"].put(exec_res)
        return"continue"# 返回Action,驅動流程繼續

猜詞者 ??AsyncGuesser??

class AsyncGuesser(AsyncNode):
    asyncdef prep_async(self, shared):
        # 1. 從隊列中等待提示者的提示
        hint = await shared["guesser_queue"].get()
        return hint, shared.get("past_guesses", [])

    asyncdef exec_async(self, inputs):
        # ... (調用LLM生成猜測)
        hint, past_guesses = inputs
        prompt = f"Given hint: {hint}, past wrong guesses: {past_guesses}, make a new guess."
        guess = call_llm(prompt)
        print(f"Guesser: I guess it's - {guess}")
        return guess

    asyncdef post_async(self, shared, prep_res, exec_res):
        # 2. 檢查答案
        if exec_res.lower() == shared["target_word"].lower():
            print("Game Over - Correct guess!")
            await shared["hinter_queue"].put("GAME_OVER")
            return"end"
        
        # 3. 如果猜錯,將錯誤答案發回給提示者,以便其給出更好的提示
        shared.setdefault("past_guesses", []).append(exec_res)
        await shared["hinter_queue"].put(exec_res)
        return"continue"

兩個智能體通過共享存儲??shared???中的兩個??asyncio.Queue???(??hinter_queue???和??guesser_queue??)進行異步通信,一個用于接收信息,一個用于發送信息,實現了完美的解耦。

async def main():
    # ... (初始化shared, 包括target_word, forbidden_words, 和兩個queue)

    # 創建節點和流
    hinter = AsyncHinter()
    guesser = AsyncGuesser()

    hinter_flow = AsyncFlow(start=hinter)
    guesser_flow = AsyncFlow(start=guesser)

    # 定義循環:當post返回"continue"時,節點會再次執行自己
    hinter - "continue" >> hinter
    guesser - "continue" >> guesser

    # 使用asyncio.gather并發運行兩個智能體流
    await asyncio.gather(
        hinter_flow.run_async(shared),
        guesser_flow.run_async(shared)
    )

每個智能體都被包裝在一個獨立的??AsyncFlow???中,并通過??"continue"??這個Action實現自我循環,不斷地接收、處理、發送消息。

核心理念

PocketFlow 把 LLM 工作流抽象為:

+-----------+
  Shared   |           |
  Store <--|   Node    |<-- Params(僅 Batch 用)
           +-----------+
                |
             Action
                v
           +-----------+
           |   Node    |
           +-----------+
  • Node:執行 prep → exec → post 三段式。
  • Action:post() 返回字符串,決定流向哪一個 successor。
  • Flow:負責“根據 Action 走圖”的調度器。
  • Shared Store:跨 Node 的全局數據約定。

核心源碼剖析 (pocketflow/__init__.py)

PocketFlow的強大之處在于其簡約的核心抽象。讓我們深入其僅有100行的源碼,逐一拆解其精妙設計。

BaseNode

??BaseNode??是所有節點的基石,它定義了節點最核心的兩個屬性和兩個方法:

*   ??self.successors???: 一個字典,形態為??{'action_name': next_node}???。這是PocketFlow流程控制的脈搏。??post???方法返回的??action??字符串就是在這個字典里查找下一個要執行的節點。

*   ??self.params??: 另一個字典,用于接收外部傳入的、節點級別的參數,在批處理場景(Batch)中尤其重要。

*   ??next(self, node, actinotallow="default")???: 這個方法負責填充??successors???字典。??node_a.next(node_b, "some_action")???就相當于??node_a.successors["some_action"] = node_b??。

*   ??_run(self, shared)???: 這是節點的生命周期方法,它嚴格按照??prep -> _exec -> post???的順序執行,并將??prep???的結果傳遞給??_exec???,再將兩者的結果傳遞給??post??。

class BaseNode:
    def __init__(self): self.params,self.successors={},{}
    def set_params(self,params): self.params=params
    def next(self,node,actinotallow="default"):
        if action in self.successors: warnings.warn(f"Overwriting successor for action '{action}'")
        self.successors[action]=node; return node
    def prep(self,shared): pass
    def exec(self,prep_res): pass
    def post(self,shared,prep_res,exec_res): pass
    def _exec(self,prep_res): return self.exec(prep_res)
    def _run(self,shared): p=self.prep(shared); e=self._exec(p); return self.post(shared,p,e)
    def run(self,shared): 
        if self.successors: warnings.warn("Node won't run successors. Use Flow.")  
        return self._run(shared)

DSL: >> 和 - 語法糖

PocketFlow中最令人驚艷的莫過于其定義流程的方式,如 ??node_a - "action" >> node_b??。這其實是巧妙地利用了Python的魔法方法實現的:

*   ??__sub__(self, action)???: 當我們寫??node_a - "action"???時,Python會調用??node_a???的??__sub__???方法。這個方法并不做減法,而是返回一個臨時的??_ConditionalTransition???對象,這個對象保存了??node_a???和??"action"??。

*   ??__rshift__(self, other)???: 當我們寫??... >> node_b???時,Python會調用??__rshift__??方法。

*   如果直接是??node_a >> node_b???,??node_a???的??__rshift__???被調用,它等價于??node_a.next(node_b, "default")??。

*   如果是??_ConditionalTransition(...) >> node_b???,那么臨時對象的??__rshift__???被調用,它執行的是??source_node.next(node_b, "saved_action")??。

class BaseNode:
    ......
    def __rshift__(self,other): return self.next(other)
    def __sub__(self,action):
        if isinstance(action,str): return _ConditionalTransition(self,action)
        raise TypeError("Action must be a string")

class _ConditionalTransition:
    def __init__(self,src,action): self.src,self.actinotallow=src,action
    def __rshift__(self,tgt): return self.src.next(tgt,self.action)

通過這短短幾行代碼,PocketFlow就創造出了一種極具表現力的領域特定語言(DSL),讓流程定義變得像寫詩一樣自然。

Node

??Node???類在??BaseNode??的基礎上,增加了至關重要的容錯機制

class Node(BaseNode):
    def __init__(self,max_retries=1,wait=0): super().__init__(); self.max_retries,self.wait=max_retries,wait
    def exec_fallback(self,prep_res,exc): raise exc
    def _exec(self,prep_res):
        for self.cur_retry in range(self.max_retries):
            try: return self.exec(prep_res)
            except Exception as e:
                if self.cur_retry==self.max_retries-1: return self.exec_fallback(prep_res,e)
                if self.wait>0: time.sleep(self.wait)

這里的??_exec???方法覆蓋了??BaseNode???的版本。它不再是簡單地調用??self.exec???,而是用一個??for???循環包裹了??try...except??塊。

*   循環: ??max_retries??參數決定了循環次數。

*   ??try???: 嘗試執行開發者定義的??self.exec(prep_res)??。如果成功,直接返回結果。

*   ??except??: 如果捕獲到任何異常,它會檢查是否是最后一次重試。

*   如果是,則調用??exec_fallback??方法,讓開發者有機會進行優雅的失敗處理(默認是直接拋出異常)。

*   如果不是,則根據??wait??參數等待一段時間后,進入下一次循環重試。

Flow

??Flow???是整個工作流的驅動引擎,其核心是??_orch??(orchestrate,編排)方法。

class Flow(BaseNode):
    def __init__(self,start=None): super().__init__(); self.start_node=start
    # ...
    def get_next_node(self,curr,action):
        nxt=curr.successors.get(action or"default")
        ifnot nxt and curr.successors: warnings.warn(f"Flow ends: '{action}' not found in {list(curr.successors)}")
        return nxt
    def _orch(self,shared,params=None):
        curr,p,last_action =copy.copy(self.start_node),(params or {**self.params}),None
        while curr:
            curr.set_params(p)
            last_actinotallow=curr._run(shared)
            curr=copy.copy(self.get_next_node(curr,last_action))
        return last_action

??_orch??的邏輯非常清晰:

  1. 初始化:??curr???指針指向??start_node??。
  2. ??while??循環: 只要??curr???不為??None??,循環就繼續。
  3. 執行: 調用??curr._run(shared)???來執行當前節點的??prep->exec->post???生命周期,并將其??post???方法的返回值存為??last_action??。
  4. 尋路: 調用??get_next_node(curr, last_action)???,在當前節點的??successors???字典中尋找??last_action??對應的新節點。
  5. 前進: 將??curr???指針更新為找到的新節點。如果找不到,??get_next_node???返回??None??,循環將在下一次檢查時終止。
  6. ??copy.copy()??的使用確保了每個節點的實例在flow的單次運行中是獨立的,避免了狀態污染。

在我看來,PocketFlow的源碼展現了"少即是多"的原則。它沒有試圖成為一個包羅萬象的巨型框架,而是專注于提供一套最核心、最靈活的構建塊,將其他的一切(如工具調用、API封裝)都交由開發者在節點內部自由實現。

總結

說實話,PocketFlow目前的易用性還有待提升,不如許多框架那樣開箱即用。但正是這種精簡設計賦予了它更大的靈活性,開發者可以根據自己的需求進行DIY(詳細實現方案可參考官方Cookbook:https://github.com/The-Pocket/PocketFlow/tree/main/cookbook)


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

?著作權歸作者所有,如需轉載,請注明出處,否則將追究法律責任
已于2025-7-2 06:00:54修改
收藏
回復
舉報
回復
相關推薦
草草在线观看| 天堂а在线中文在线无限看推荐| 婷婷亚洲综合| 精品美女在线播放| 久久久久久久久久久福利| 欧美精品a∨在线观看不卡| 免费看黄色91| 国内成人精品视频| 岛国片在线免费观看| 亚洲乱码一区| 欧洲精品视频在线观看| 久久久久久久久久久综合| 视频一区二区三区在线看免费看| 美女尤物国产一区| 国模视频一区二区| 日韩一区二区三区四区视频| eeuss鲁片一区二区三区| 欧美性猛交xxxx黑人猛交| 黄瓜视频免费观看在线观看www| 隣の若妻さん波多野结衣| 免费看欧美女人艹b| 97色在线观看| 欧美精品久久久久性色| 国产精品日韩精品中文字幕| 日韩欧美久久一区| jizzzz日本| 芒果视频成人app| 亚洲五码中文字幕| 精品国产无码在线| 97视频在线观看网站| 99久久精品国产导航| 成人综合网网址| 日韩国产成人在线| 国产亚洲激情| 国内精品视频久久| 日韩三级在线观看视频| 日韩高清欧美| 国产一区二区三区在线| 日本黄色免费观看| 中文字幕区一区二区三| 91精品国产综合久久精品| 丝袜制服一区二区三区| 中文在线免费视频| 婷婷夜色潮精品综合在线| 毛片av在线播放| 麻豆视频在线| 一区精品在线播放| 一区二区三区四区| 888av在线| 国产精品全国免费观看高清 | 久久久久久亚洲综合| 国产精品jizz视频| 日韩一级中文字幕| 99久久精品一区二区| 国产精品一区二区免费看| 午夜精品在线播放| 国产99久久久精品| 国产精品久久波多野结衣| 成人h动漫精品一区二区无码| 国产一区在线视频| 92看片淫黄大片欧美看国产片| 夜夜狠狠擅视频| 久久er精品视频| 91精品中文在线| 精品人妻无码一区二区三区蜜桃一| 精品一区二区三区在线播放 | 欧美激情国产精品| 国产无遮挡又黄又爽又色| 欧美视频成人| 97avcom| 亚洲精品中文字幕乱码三区91| 久久精品欧洲| 国产综合视频在线观看| 国产婷婷一区二区三区久久| 国产福利一区二区三区视频在线| 岛国视频一区免费观看| 四虎永久在线精品免费网址| www一区二区| 亚洲国产欧美不卡在线观看| 久操视频在线观看| 亚洲综合在线五月| 国产精品久久中文字幕| 日韩高清成人| 欧美一卡二卡在线观看| 不卡的一区二区| 日韩影视高清在线观看| 中文字幕亚洲在线| 黄色在线观看免费| 性色av一区二区怡红| 国产精品视频成人| 国产一区二区在线播放视频| 国产乱人伦精品一区二区在线观看| 国产一区二区不卡视频| 国自产拍在线网站网址视频| 国产精品国产三级国产aⅴ中文| 欧美大片免费播放| 最新欧美色图| 日韩欧美高清在线| 欧美18—19性高清hd4k| 午夜精品电影| 国产不卡在线观看| 成人久久久精品国产乱码一区二区| 久久久无码精品亚洲日韩按摩| 中文字幕欧美日韩一区二区| 日韩激情电影免费看| 欧美日韩国产一级| 亚洲va男人天堂| 欧美 日韩 中文字幕| 亚洲国产高清aⅴ视频| 欧美a级免费视频| 另类中文字幕国产精品| 精品久久五月天| 婷婷丁香综合网| 国产日韩欧美一区二区三区在线观看| 国产日韩在线免费| 青青九九免费视频在线| 亚洲精品中文在线观看| 韩国中文字幕av| 任你躁在线精品免费| 欧美成人午夜视频| 中文字幕日日夜夜| 久久精品一区四区| 国产二区视频在线| 永久免费精品视频| 久久在线精品视频| 一级成人免费视频| 久久精品夜色噜噜亚洲a∨| 免费看欧美黑人毛片| 高清不卡一区| 91麻豆精品91久久久久同性| 欧美成人午夜精品免费| 伊人久久亚洲热| 444亚洲人体| 欧美一区二区三区| 欧美日韩日日夜夜| 国产黄色大片免费看| 亚洲女人av| 久久青青草原一区二区| av免费不卡| 精品国产伦理网| 久久久久久久福利| 国产精品性做久久久久久| 男女爱爱视频网站| 精品中文视频| 蜜臀久久99精品久久久无需会员| 一区二区视频免费| 国产精品激情偷乱一区二区∴| 波多野结衣作品集| 成人一区而且| 国产精品久久久久久影视| 成人高清免费观看mv| 欧美性猛交xxxx黑人交| 免费观看a级片| 欧美a一区二区| 亚洲精品日韩成人| 亚洲免费一区| 久久的精品视频| aaa一区二区| 亚洲图片欧美视频| 喷水视频在线观看| 美女精品网站| 色综合久久久久久久久五月| 肉色欧美久久久久久久免费看| 亚洲视频精品在线| 亚洲天堂男人网| 一区二区在线观看不卡| 国产精品果冻传媒| 亚洲精品乱码| 日本精品视频一区| 香蕉久久久久久| 欧美大片第1页| 日本天堂在线| 欧美日韩国产免费一区二区| 在线观看亚洲网站| 成人精品gif动图一区| 116极品美女午夜一级| 日本一区二区高清不卡| 亚洲一区美女视频在线观看免费| 不卡av免费观看| 亚洲剧情一区二区| 一区二区 亚洲| 亚洲一区二区三区中文字幕在线| 久久精品女同亚洲女同13| 麻豆精品91| 黄色网址在线免费看| 盗摄系列偷拍视频精品tp| 日本精品免费一区二区三区| 精品黄色免费中文电影在线播放| 欧美成人一区二区| 日韩欧美在线观看免费| 成人免费视频在线观看| 国产精品久久久久久在线观看| 久久激情婷婷| 最近免费观看高清韩国日本大全| 国产精品调教视频| 国产精品亚洲激情| 6699嫩草久久久精品影院| 亚洲视频在线视频| 后进极品白嫩翘臀在线视频| 色哟哟在线观看一区二区三区| 日韩福利小视频| 久久久综合视频| 国内自拍第二页| 欧美中文日韩| 日韩精品一区二区免费| 成人午夜av| 国产丝袜不卡| 免费欧美网站| 国产精品香蕉国产| free性m.freesex欧美| 日韩在线观看高清| 日本一级在线观看| 亚洲成**性毛茸茸| 国产模特av私拍大尺度| 色视频一区二区| 日韩免费观看一区二区| 亚洲日本在线视频观看| 中文字幕第20页| 99视频精品免费视频| 免费黄色av网址| 精久久久久久久久久久| av观看免费在线| 亚洲国产影院| 国产精品无码电影在线观看| 欧美激情偷拍自拍| 日韩电影大全在线观看| 日韩中出av| 国产精品区一区二区三在线播放| 国产 日韩 欧美| 91精品久久久久久久久久久| 欧美电影h版| 日韩av手机在线看| 在线能看的av网址| 午夜精品国产精品大乳美女| 黄网页在线观看| 中文字幕日韩欧美| 1pondo在线播放免费| 亚洲网站在线播放| 美国成人毛片| 夜夜嗨av一区二区三区免费区| 男人天堂网在线| 亚洲精品一区二三区不卡| 天天综合网在线观看| 精品日韩一区二区三区| 性一交一乱一乱一视频| 日韩亚洲欧美高清| 亚洲春色一区二区三区| 日韩欧美一级在线播放| 国产a级免费视频| 日韩视频一区二区三区| www.久久伊人| 亚洲成人精品久久久| 色窝窝无码一区二区三区成人网站 | 一区二区欧美久久| 成人好色电影| www国产精品视频| 欧美jizzhd欧美| 久久精品91久久香蕉加勒比 | 久久久人成影片一区二区三区观看| 高清免费电影在线观看| 九九热精品视频| 精精国产xxxx视频在线野外| 91a在线视频| 亚洲成人人体| 国产一区在线播放| 日韩精品视频一区二区三区| 成人在线观看91| 欧美黑白配在线| 日本精品一区| 欧美在线首页| 国内自拍在线观看| 免费精品视频最新在线| 国产在线视频三区| www.日韩av| 天堂在线中文视频| 亚洲精品乱码久久久久久| 国产午夜小视频| 色88888久久久久久影院按摩| 亚洲天天综合网| 欧美刺激午夜性久久久久久久| 无码精品一区二区三区在线| 亚洲三级av在线| 国产成人无吗| 欧美伊久线香蕉线新在线| 成人高清一区| 91精品国自产在线观看| 日韩高清在线免费观看| 日韩精品欧美专区| 黄色成人av网站| 一级黄色香蕉视频| 国产高清不卡一区| 国产激情av在线| 午夜精品福利久久久| 久久这里只有精品9| 日韩欧美成人一区| 国产大学生校花援交在线播放| 久久久精品久久久| 欧美三级网站| 亚洲综合日韩在线| 国产欧美日韩视频在线| 青青草综合在线| 日韩国产欧美在线观看| 黑森林av导航| 中文字幕在线观看不卡| 日日夜夜综合网| 日韩女优av电影| jizz在线免费观看| 91成人免费观看网站| **爰片久久毛片| 亚洲图片在线观看| 免费看的黄色欧美网站| 潘金莲一级淫片aaaaa| 中文字幕av不卡| 亚洲免费黄色网址| 亚洲第一区第一页| 在线三级电影| 成人a在线视频| 国产一区二区三区电影在线观看 | 欧美精品久久久久性色| 欧美日韩一本到| 黄色视屏网站在线免费观看| 欧美极品在线播放| 91成人福利社区| 在线播放豆国产99亚洲| 老牛影视一区二区三区| 人妻丰满熟妇av无码久久洗澡| 亚洲免费观看在线视频| 中文字幕在线观看国产| 亚洲人成77777在线观看网| www.九色在线| 国产私拍一区| 99在线精品免费视频九九视| 极品白嫩的小少妇| 亚洲女女做受ⅹxx高潮| 国产美女永久免费| 成年无码av片在线| 久久av偷拍| 国产欧美综合一区| 国产成人在线观看| 男人操女人的视频网站| 3d动漫精品啪啪一区二区竹菊 | 欧美激情视频一区二区| 亚洲精品三区| 无码毛片aaa在线| 国产成人精品1024| 国产真实的和子乱拍在线观看| 日韩精品一区二区三区视频在线观看| 影音先锋在线视频| 国产99视频精品免费视频36| 国产精品www994| 亚洲av无码一区东京热久久| 亚洲高清久久久| 婷婷久久久久久| 欧美专区在线视频| 免费成人高清在线视频theav| 六月激情综合网| 国产精品污网站| 国产又粗又猛又爽| 久久99久国产精品黄毛片入口| 日韩欧美中文字幕一区二区三区| 日韩人妻一区二区三区蜜桃视频| 国产一区二区网址| 久久亚洲成人av| 亚洲精品国产精品自产a区红杏吧 亚洲精品国产精品乱码不99按摩 亚洲精品国产精品久久清纯直播 亚洲精品国产精品国自产在线 | 加勒比中文字幕精品| 欧美 国产 综合| 日本一区免费视频| av无码精品一区二区三区宅噜噜| 九九热精品视频在线播放| 欧美a一欧美| 三级在线视频观看| 亚洲三级电影网站| 姝姝窝人体www聚色窝| 国产精国产精品| 小小影院久久| 亚洲视频在线播放免费| 色88888久久久久久影院野外| 色影院视频在线| 99国产盗摄| 老司机精品视频网站| 黑鬼狂亚洲人videos| 亚洲国产成人精品久久| 日本欧美韩国| 国产尤物av一区二区三区| 久久久综合视频| 亚洲av无码专区在线| 国产ts一区二区| 欧美人成在线| 无码人妻aⅴ一区二区三区69岛| 日韩亚洲欧美一区| 欧美日韩国产网站| 免费在线黄网站| 国产精品每日更新| 少妇荡乳情欲办公室456视频| 国产精品久久久久久久久久99| 中文字幕一区二区三区欧美日韩| 中文字幕一区二区久久人妻网站| 在线不卡中文字幕播放| 性爽视频在线| 国产91视频一区|