免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

LangGraph斷點恢復(fù)與冪等執(zhí)行:生產(chǎn)級Agent穩(wěn)定性實踐

LangGraph斷點恢復(fù)與冪等執(zhí)行:生產(chǎn)級Agent穩(wěn)定性實踐 做完十幾個 Agent demo 之后你會發(fā)現(xiàn)一個殘酷的事實在 Jupyter Notebook 里跑得挺順的智能體一上生產(chǎn)就原形畢露。用戶刷新一下頁面任務(wù)重跑一遍錢扣了兩次凌晨三點模型調(diào)用超時整個流程從頭再來前面寫進(jìn)數(shù)據(jù)庫的狀態(tài)全得重建更頭疼的是人工審批環(huán)節(jié)——Agent 運行到一半要等領(lǐng)導(dǎo)點個按鈕結(jié)果進(jìn)程一重啟圖的狀態(tài)沒了。LangGraph 斷點恢復(fù)和冪等執(zhí)行就是專門治這三類毛病的。這篇文章我把這套東西從原理到落地一次講透代碼能直接抄。在正式動手之前有必要先說說 LangGraph 在整個技術(shù)棧里的位置?,F(xiàn)在搜 LangGraph 教程十個里有八個會糾結(jié)它和 LangChain 的區(qū)別。我的理解很簡單LangChain 是一把瑞士軍刀里面全是工具函數(shù)、模型封裝、Prompt 模板這些零件而 LangGraph 是裝刀的戰(zhàn)術(shù)背心它關(guān)心的是你身上這些裝備怎么按順序掏出來、掏到一半被打斷能不能塞回去、事后能不能從某個位置繼續(xù)掏。它通過狀態(tài)圖的方式組織 Agent 的執(zhí)行流讓每一步都有跡可循、可停可續(xù)而且把狀態(tài)和檢查點作為一等公民內(nèi)置進(jìn)了框架。本文會從斷點恢復(fù)的底層機(jī)制講起然后進(jìn)入冪等執(zhí)行這個工程化繞不開的命題最后用一個 FastAPI LangGraph 的實戰(zhàn)項目把它們串起來。這個方案適合正在把 Agent 從 Demo 推向生產(chǎn)的開發(fā)者也適合被AI 下地干活折磨得懷疑人生的后端工程師。1. 先搞清楚一個前提LangGraph 到底在解決什么問題1.1 LangGraph 和 LangChain 的本質(zhì)區(qū)別很多人問 LangChain 和 LangGraph 的面試題怎么答其實就是一行話的事LangChain 提供了與模型、工具、文檔交互的抽象能力LangGraph 則是把這些能力組織成一張可執(zhí)行、可暫停、可恢復(fù)的狀態(tài)圖。LangChain 的 Chain 也有順序執(zhí)行的邏輯但這種執(zhí)行是一把梭的——鏈一旦啟動要么跑完要么失敗重來中間不保留可以被外部干預(yù)的狀態(tài)。LangGraph 則把執(zhí)行過程建模成由節(jié)點Node和邊Edge構(gòu)成的有向圖每個節(jié)點就是一次計算或一個工具調(diào)用邊定義了流轉(zhuǎn)規(guī)則。關(guān)鍵差異在于LangGraph 里的圖在每次節(jié)點運行前后都會生成一個狀態(tài)快照也就是 checkpoint你可以通過它實現(xiàn)時間旅行、條件分支重放以及人工介入。這種差異帶來的直接感受是用 LangChain 寫 Agent像在流水線上干活從頭到尾一氣呵成用 LangGraph 寫 Agent像在玩有存檔的游戲任何時刻都能存一檔、讀一檔、改一檔再繼續(xù)玩。建議學(xué)習(xí)路徑也很直接先用pip install langgraph跑通官方手冊中文版里的 ReAct 示例理解節(jié)點、邊、狀態(tài)這三個核心概念再看本篇文章涉及的狀態(tài)持久化和中斷機(jī)制最后再上手真實業(yè)務(wù)改造。1.2 斷點恢復(fù)的本質(zhì)把圖執(zhí)行變成可中斷事務(wù)斷點恢復(fù)聽起來很高端本質(zhì)上就是數(shù)據(jù)庫事務(wù)里 Savepoint 和 Rollback 的思想搬到了 Agent 編排層。LangGraph 在執(zhí)行一個節(jié)點前會檢查是否有可恢復(fù)的 checkpoint如果有它不會從頭跑而是直接恢復(fù)到上次中斷后的節(jié)點繼續(xù)執(zhí)行。這里涉及三個核心概念thread_id、checkpointer、checkpoint_id。thread_id 是會話標(biāo)識LangGraph 用它區(qū)分不同的對話和任務(wù)同一個 thread 的多次執(zhí)行共享狀態(tài)checkpointer 是存儲后端決定 checkpoint 和狀態(tài)持久化到哪里比如內(nèi)存、SQLite、Postgrescheckpoint_id 則是每次圖執(zhí)行生成的狀態(tài)版本號相當(dāng)于游戲存檔的時間戳。你可以這樣理解thread_id 是游戲存檔的文件名checkpointer 是硬盤checkpoint_id 是存檔的時間點。一個 Agent 應(yīng)用對應(yīng)多個 thread_id每個 thread 有自己的一系列 checkpoint_id當(dāng)你用同一個 thread_id 再次調(diào)用圖時LangGraph 會找最新的 checkpoint 作為起點。這套機(jī)制天然適合 human-in-the-loop 場景Agent 執(zhí)行到需要人工審批的節(jié)點先暫停把狀態(tài)寫好存檔然后告訴外部我需要人來確認(rèn)人類做出決定后應(yīng)用再用同一個 thread_id 調(diào)用續(xù)跑接口LangGraph 會從斷點接著走而不是把之前的工作推倒重來。2. 斷點恢復(fù)的落地姿勢從圖級斷點到節(jié)點級中斷2.1 編譯期斷點 interrupt_before / interrupt_after用 LangGraph 實現(xiàn)斷點最直觀的方式是在編譯圖的時候指定斷點位置。interrupt_before表示進(jìn)入指定節(jié)點前暫停interrupt_after表示離開指定節(jié)點后暫停。這種方式適合流程固定的場景比如必須先審核、后下單。代碼層面非常簡單from langgraph.graph import StateGraph, START, END # 假設(shè)我們定義了一個簡單的 Agent 圖 graph StateGraph(MyState) graph.add_node(plan, plan_node) graph.add_node(execute, execute_node) graph.add_node(review, review_node) graph.add_edge(START, plan) graph.add_edge(plan, execute) graph.add_edge(execute, review) graph.add_edge(review, END) checkpointer SqliteSaver.from_conn_string(checkpoints.db) # 編譯時指定斷點 app graph.compile( checkpointercheckpointer, interrupt_before[review], # 進(jìn)入 review 前停住 interrupt_after[execute], # execute 完成且寫入狀態(tài)后停住 )這樣編譯完之后你調(diào)用app.invoke(input, config{configurable: {thread_id: order_001}})圖會一路執(zhí)行到 execute 節(jié)點然后停在進(jìn)入 review 之前。此時圖的狀態(tài)保存在 checkpoints.db 里進(jìn)程掛了也不怕。要恢復(fù)只需要再次調(diào)用同一個圖不需要重新傳完整輸入。很多人這里會踩坑以為恢復(fù)是重新調(diào)用一次原來的輸入其實 LangGraph 的邏輯是只要 thread_id 一致且該 thread 存在未完成的執(zhí)行調(diào)用就會嘗試從最近的 checkpoint 續(xù)跑??梢韵胂蟪梢粋€斷點續(xù)傳的過程恢復(fù)時只需要傳你需要注入的外部決定比如審批結(jié)果result app.invoke( None, # 或傳審批結(jié)果取決于業(yè)務(wù)邏輯 config{configurable: {thread_id: order_001}} )執(zhí)行會從interrupt_before指定的節(jié)點重新開始先執(zhí)行 review再繼續(xù)后續(xù)邊。編譯期斷點的缺點是死板一旦編譯就固定了如果業(yè)務(wù)流程是動態(tài)的這種方式就不夠靈活。2.2 節(jié)點內(nèi)中斷 interrupt() 與 Command(resume)LangGraph 提供了更靈活的動態(tài)中斷方式在節(jié)點內(nèi)部調(diào)用interrupt()函數(shù)。這個函數(shù)的作用相當(dāng)于在任意指定的執(zhí)行點舉手暫停它會把一個 payload 暴露給外部系統(tǒng)比如前端頁面等待外部通過Command(resume...)把決定塞回來。說一個真實業(yè)務(wù)Agent 在幫用戶下單前需要確認(rèn)價格是否可接受。你在確認(rèn)價格這個節(jié)點里寫from langgraph.types import interrupt, Command def confirm_price_node(state): # 準(zhǔn)備好給用戶看的報價信息 payload { order_id: state[order_id], total_price: state[total_price], items: state[items], } # 中斷把 payload 暴露出去等待用戶確認(rèn) decision interrupt(payload) if decision.get(approved): return {status: approved} else: return {status: rejected, reason: decision.get(reason)}interrupt()被調(diào)用后圖的執(zhí)行立刻暫停不會繼續(xù)往下走。此時如果你用app.get_state(config)查看狀態(tài)會發(fā)現(xiàn)圖處于中斷狀態(tài)且可以拿到interrupt里的 payload。外部應(yīng)用比如 FastAPI 接口把這個 payload 展示給用戶用戶點同意或拒絕應(yīng)用把決定作為參數(shù)傳回from langgraph.types import Command # 用戶點了“同意” app.invoke( Command(resume{approved: True}), config{configurable: {thread_id: order_001}} )Command(resume...)會喚醒中斷的圖把值傳給interrupt()的返回值。執(zhí)行會接著 confirm_price_node 往下走。這種方式實現(xiàn)了真正意義上的動態(tài)暫停和外部介入LangGraph 官方叫它 human-in-the-loop是斷點恢復(fù)最強(qiáng)的一個用法。2.3 狀態(tài)檢查、修改與跳過執(zhí)行除了暫停和恢復(fù)我們經(jīng)常需要在恢復(fù)前修改圖的狀態(tài)或者臨時跳過某個節(jié)點。LangGraph 提供了get_state和update_state兩個接口用途很像數(shù)據(jù)庫里的查詢和 UPDATE。config {configurable: {thread_id: order_001}} # 查看當(dāng)前 state 和 checkpoint snapshot app.get_state(config) print(snapshot.values) # 當(dāng)前狀態(tài)字段 print(snapshot.next) # 下一步會執(zhí)行哪些節(jié)點 # 手動修改 state app.update_state(config, {customer_name: 張三}, as_nodeplan)修改 state 的值會生成一個新的 checkpoint后續(xù)執(zhí)行基于新的狀態(tài)繼續(xù)。這里有個細(xì)節(jié)update_state時你可以通過as_node指定以哪個節(jié)點的名義寫入這會影響圖的狀態(tài)更新規(guī)則。如果你希望跳過某個節(jié)點可以在中斷后手動 update_state把該節(jié)點要寫入的狀態(tài)直接寫進(jìn)去再恢復(fù)執(zhí)行即可。日常開發(fā)里我通常把查看狀態(tài) 人工修改 恢復(fù)執(zhí)行三個動作做成三個獨立 API方便前端根據(jù)業(yè)務(wù)場景自由組合。從實踐來看這種設(shè)計比把所有邏輯都塞進(jìn)一次 invoke 調(diào)用更可靠。3. 冪等執(zhí)行讓 Agent 重復(fù)跑也不會出事3.1 為什么 LangGraph 不保證冪等斷點恢復(fù)解決了流程中斷的問題但引出了下一個問題既然執(zhí)行可以被暫停、恢復(fù)、甚至重放那么同一個節(jié)點被重復(fù)執(zhí)行怎么辦LangGraph 本身沒有內(nèi)置冪等機(jī)制。原因很直接框架層面無法判斷你的工具調(diào)用是不是冪等的。比如一個節(jié)點里調(diào)用了發(fā)送短信的接口這個接口天然不是冪等的但另一個節(jié)點里只是做一次本地計算重復(fù)執(zhí)行也沒關(guān)系??蚣懿恢肋@些所以它選擇把決定權(quán)交給你。但是 LangGraph 提供了實現(xiàn)冪等的關(guān)鍵信息。每次 invoke 都會生成一個 runtime run_id每次節(jié)點執(zhí)行后生成 checkpoint_id。你可以把它們當(dāng)作執(zhí)行某段邏輯的流水號結(jié)合業(yè)務(wù)側(cè)的冪等鍵就能判斷某段副作用是否已經(jīng)執(zhí)行過。這里強(qiáng)調(diào)一句config里傳入的thread_id是會話維度不是請求維度同一 session 里有多次 invokerun_id 每次都會變。所以不要拿 run_id 或 checkpoint_id 當(dāng)業(yè)務(wù)冪等鍵它們只適合做內(nèi)部調(diào)試和狀態(tài)追蹤。3.2 冪等設(shè)計三件套冪等鍵、副作用登記、唯一約束要讓 Agent 的執(zhí)行變得冪等我的實戰(zhàn)經(jīng)驗是用三件套入口生成冪等鍵、副作用處先登記后執(zhí)行、數(shù)據(jù)庫加唯一約束。第一步在 Agent 任務(wù)創(chuàng)建時生成全局唯一的冪等鍵這個鍵要貫穿整個執(zhí)行流通常叫run_id但注意是自己生成的業(yè)務(wù) run_id不是 LangGraph 內(nèi)部的 run。可以放在 state 最外層一路往下傳。第二步在節(jié)點執(zhí)行副作用發(fā)消息、扣積分、調(diào)用外部下單接口之前先往 operation_log 表插一條記錄字段包括 run_id、操作類型、操作參數(shù)、狀態(tài)。如果插入的時候拋唯一約束沖突說明同一 run 下這個操作已經(jīng)執(zhí)行過直接跳過副作用邏輯并復(fù)用上次的結(jié)果。第三步在數(shù)據(jù)庫里給(run_id, op_key)建立唯一索引。這里的 op_key 可以是通知用戶扣減庫存這樣的操作標(biāo)識也可以是 action 名稱加參數(shù)哈希。這樣即使代碼邏輯漏判了數(shù)據(jù)庫也會攔住第二次執(zhí)行。落地到 LangGraph 節(jié)點里基礎(chǔ)設(shè)施可以做成一個裝飾器def idempotent_node(op_key): def decorator(func): def wrapper(state): run_id state[run_id] log lookup_operation(run_id, op_key) if log: return log[result] # 已執(zhí)行過直接返回緩存結(jié)果 result func(state) # 首次執(zhí)行副作用 record_operation(run_id, op_key, result) # 寫執(zhí)行記錄 return result return wrapper return decorator idempotent_node(deduct_inventory) def deduct_inventory_node(state): # 真正的扣減邏輯 return {inventory_left: state[inventory] - 1}這套方案的巧妙之處在于它把冪等從框架層下沉到了業(yè)務(wù)層。無論 LangGraph 怎么重放節(jié)點、怎么斷點續(xù)跑只要 run_id 不變?nèi)魏胃弊饔枚紩粩?shù)據(jù)庫的唯一約束擋住。3.3 工具調(diào)用層的冪等LangGraph 里最常見的副作用集中在工具調(diào)用上。函數(shù)調(diào)用tool calling模型會給每個工具調(diào)用生成一個唯一的tool_call_id這個 ID 在單輪對話內(nèi)是唯一的。但問題是如果圖執(zhí)行重放同一個工具調(diào)用可能會被再次觸發(fā)LangGraph 自帶的 ToolNode 會再次執(zhí)行該工具。好在 LangGraph 的 ToolNode 有內(nèi)置的消息去重機(jī)制。當(dāng)你用langgraph.prebuilt.ToolNode時如果某個tool_call_id已經(jīng)出現(xiàn)在歷史消息里ToolNode 會直接使用歷史結(jié)果而不會再次執(zhí)行工具。這個行為依賴于 checkpointer 保存的消息列表。所以只要你的圖啟用了 checkpointer并且工具節(jié)點用的是官方 ToolNode一定程度上已經(jīng)具備按 tool_call_id 去重的能力。但如果你沒用 ToolNode而是自己寫節(jié)點處理工具調(diào)用那就必須自己實現(xiàn)冪等。我的做法是在工具執(zhí)行前檢查當(dāng)前 tool_call_id 是否已經(jīng)在狀態(tài)里的 tool_results 字段中出現(xiàn)過出現(xiàn)過就直接拿結(jié)果沒出現(xiàn)過才執(zhí)行真正的調(diào)用。def smart_tool_executor(state): messages state[messages] last_ai_msg messages[-1] results [] for tool_call in last_ai_msg.tool_calls: existed state[tool_results].get(tool_call[id]) if existed is not None: results.append(existed) # 復(fù)用歷史結(jié)果 continue result real_executor.invoke(tool_call) # 真正執(zhí)行 state[tool_results][tool_call[id]] result results.append(result) return {tool_results: state[tool_results], messages: results}這套邏輯在你需要給工具調(diào)用加緩存、加審計、加限流的場景下更實用官方 ToolNode 的自動去重就不夠用了。特別是當(dāng)你對接的資金、積分系統(tǒng)有自己一套冪等憑證體系時用 tool_call_id 做聯(lián)動往往比重新建一套更直接。4. 落地實戰(zhàn)FastAPI LangGraph 的生產(chǎn)級斷點恢復(fù)服務(wù)4.1 架構(gòu)與存儲選型從 SQLite 到 Postgres斷點恢復(fù)依賴于 checkpointer所以選什么存儲就決定了你能恢復(fù)到什么程度以及能扛多大并發(fā)。我把常用三個存儲后端放在一起對比根據(jù)部署規(guī)模直接挑存儲后端典型場景并發(fā)能力生產(chǎn)可用性備注MemorySaverDemo、本地調(diào)試單進(jìn)程單線程低進(jìn)程重啟狀態(tài)全丟慎用于生產(chǎn)SqliteSaver單機(jī)小規(guī)模服務(wù)受限于單機(jī)中注意線程鎖和文件鎖配套代碼簡單門檻低PostgresSaver多副本、高可用環(huán)境高高是生產(chǎn)推薦方案需要數(shù)據(jù)庫連接池和遷移腳本單機(jī)場景直接上 SQLite 就夠了連接字符串傳一個路徑即可。多副本部署、要做負(fù)載均衡的話建議直接上 Postgres。LangGraph 提供了 AsyncPostgresSaver異步接口配合 FastAPI 的 async 路由非常順滑。需要強(qiáng)調(diào)一點postgres_saver 使用前必須創(chuàng)建表結(jié)構(gòu)官方提供了checkpoint_ddl腳本不要用 SQLite 的表結(jié)構(gòu)去 Postgres 里跑字段類型和索引都對不上踩一次坑少說浪費半小時。4.2 核心代碼構(gòu)建帶審批的人類介入 Agent用 FastAPI LangChain LangGraph 組合做一個審批后通知的 Agent。業(yè)務(wù)路徑是創(chuàng)建任務(wù) - 模擬扣減積分 - 人工審批 - 審批通過后發(fā)通知。重點演示斷點恢復(fù)與冪等抑制。# app.py —— 完整示例骨架 import os from typing import TypedDict, Annotated from fastapi import FastAPI from langgraph.graph import StateGraph, START, END from langgraph.checkpoint.sqlite import SqliteSaver from langgraph.types import interrupt, Command import sqlite3 class AgentState(TypedDict): run_id: str user_id: str points_deducted: bool approval: str notified: bool conn sqlite3.connect(agent_state.db, check_same_threadFalse) conn.execute( CREATE TABLE IF NOT EXISTS operation_log ( run_id TEXT, op_key TEXT, result TEXT, PRIMARY KEY (run_id, op_key) ) ) conn.commit() checkpointer SqliteSaver(conn)注意連接池的check_same_threadFalse默認(rèn)的 SQLite 連接不能跨線程用FastAPI 是并發(fā)模型不關(guān)掉會各種報 thread error。下面定義三個節(jié)點。第一個節(jié)點扣積分有工程量第二個節(jié)點做人工審批中斷第三個節(jié)點發(fā)通知冪等保護(hù)。def deduct_points_node(state: AgentState): run_id state[run_id] # 冪等查操作日志 row conn.execute( SELECT result FROM operation_log WHERE run_id? AND op_key?, (run_id, deduct_points), ).fetchone() if row: return {points_deducted: True} # 已扣過不重復(fù)扣 # 真正扣減積分的代碼這里用 print 模擬 print(f真實扣減積分user{state[user_id]}) conn.execute( INSERT INTO operation_log (run_id, op_key, result) VALUES (?, ?, ?), (run_id, deduct_points, ok), ) conn.commit() return {points_deducted: True} def approval_node(state: AgentState): decision interrupt({ message: 是否允許扣減積分并發(fā)送通知, user_id: state[user_id], run_id: state[run_id], }) return {approval: decision.get(decision, denied)} def notify_node(state: AgentState): if state[approval] ! approved: return {notified: False} run_id state[run_id] row conn.execute( SELECT result FROM operation_log WHERE run_id? AND op_key?, (run_id, send_notify), ).fetchone() if row: return {notified: True} print(f真實發(fā)送通知user{state[user_id]}) conn.execute( INSERT INTO operation_log (run_id, op_key, result) VALUES (?, ?, ?), (run_id, send_notify, ok), ) conn.commit() return {notified: True}構(gòu)建圖并編譯builder StateGraph(AgentState) builder.add_node(deduct, deduct_points_node) builder.add_node(approval, approval_node) builder.add_node(notify, notify_node) builder.add_edge(START, deduct) builder.add_edge(deduct, approval) builder.add_edge(approval, notify) builder.add_edge(notify, END) app builder.compile(checkpointercheckpointer)FastAPI 路由部分提供三個接口from fastapi import FastAPI, HTTPException server FastAPI() server.post(/runs) def create_run(user_id: str): import uuid run_id str(uuid.uuid4()) # 啟動圖執(zhí)行運行到 approval 節(jié)點會自動中斷 app.invoke( {run_id: run_id, user_id: user_id}, config{configurable: {thread_id: run_id}}, ) return {run_id: run_id} server.get(/runs/{run_id}/state) def get_run_state(run_id: str): snap app.get_state({configurable: {thread_id: run_id}}) return { status: snap.next, values: snap.values, interrupts: [i.payload for i in snap.interrupts] if snap.interrupts else [], } server.post(/runs/{run_id}/resume) def resume_run(run_id: str, decision: str): snap app.get_state({configurable: {thread_id: run_id}}) if not snap.interrupts: raise HTTPException(status_code400, detail當(dāng)前狀態(tài)不可恢復(fù)) app.invoke( Command(resume{decision: decision}), config{configurable: {thread_id: run_id}}, ) return {status: resumed}這樣前后端就能完成創(chuàng)建任務(wù) - 查詢審批信息 - 審批 - 恢復(fù)執(zhí)行。整個生命周期里SQLite 里的 checkpoint 保存了每一步狀態(tài)operation_log 確保了扣減積分和發(fā)通知這兩個副作用不會被重復(fù)執(zhí)行。4.3 完整調(diào)用流程演示用 curl 走一遍完整流程你會很直觀看到斷點恢復(fù)和冪等是怎么協(xié)同的。創(chuàng)建一次任務(wù)圖會一路跑到 approval 節(jié)點然后自動暫停curl -X POST http://localhost:8000/runs?user_idu_100 # 返回 {run_id: abc-123}查詢狀態(tài)你會看到interrupts里有審批的 payloadnext指向 approval 之后要執(zhí)行的下一個節(jié)點curl http://localhost:8000/runs/abc-123/state人工審批通過恢復(fù)執(zhí)行curl -X POST http://localhost:8000/runs/abc-123/resume \ -H Content-Type: application/json \ -d {decision: approved}此刻的關(guān)鍵點來了如果你再次手動調(diào)用扣積分節(jié)點比如誤操作operation_log 里已經(jīng)存在(abc-123, deduct_points)這條記錄節(jié)點會直接返回{points_deducted: True}不會真的扣第二次積分。同理send_notify也不會重復(fù)發(fā)通知。這個就是業(yè)務(wù)層的冪等兜底。如果把整條鏈路里的每一步都記錄到數(shù)據(jù)庫你甚至可以做重放審計——某個 run 到底扣了多少次積分、哪一步是冪等跳過的、哪一步真實執(zhí)行了一查便知。5. 實戰(zhàn)中的坑與排查經(jīng)驗5.1 斷點恢復(fù)常見的報錯與解決辦法工程落地會遇到各種邊界情況我把自己常遇到的幾個問題整理成了速查表報錯/現(xiàn)象根因處理方式Checkpointer required圖里使用了 interrupt 但在 compile 時沒傳 checkpointercompile(checkpointer...)恢復(fù)調(diào)用不生效從頭開始執(zhí)行thread_id 不一致或使用了不同的 config key確認(rèn) token 不變檢查 config 拼寫Cannot update non-existent node...update_state 時 as_node 傳了一個圖里不存在的節(jié)點名查看圖節(jié)點列表確保 as_node 合法resume 后狀態(tài)不是預(yù)期值Command(resume) 傳參結(jié)構(gòu)不對檢查 interrupt() 返回值的接收語義SQLitedatabase is locked多線程并發(fā)寫同一個 SQLite 文件開啟 WAL 模式或改用 PostgresSaver恢復(fù)后節(jié)點重復(fù)執(zhí)行業(yè)務(wù)副作用沒有做冪等保護(hù)用 3.2 節(jié)的三件套去攔截SQLite 的鎖是最常見的坑尤其是 FastAPI 多 worker 部署時。建議在初始化連接后執(zhí)行PRAGMA journal_modeWAL;能明顯減少并發(fā)讀寫的鎖沖突。但說到底多 worker 部署就別用 SQLite 了上 PostgresSaver 是正道。5.2 冪等沒生效的幾個隱蔽原因冪等邏輯看著簡單實際有幾種隱蔽情況會導(dǎo)致失效。最常見的是冪等鍵沒有貫穿整個調(diào)用鏈。比如你的 run_id 在 create_run 接口生成了但某個工具節(jié)點內(nèi)部又自己 new 了一個 uuid那節(jié)點側(cè)查 operation_log 時主鍵永遠(yuǎn)對不上每次都會執(zhí)行真實副作用。建議把冪等鍵放到 state 的頂層字段節(jié)點里只管 read不許 write。第二個隱蔽原因是副作用執(zhí)行成功但記錄寫入失敗。比如真實扣減積分接口調(diào)用成功了但 operation_log 的 INSERT 因為某種異常沒提交此時 Agent 拋錯重試業(yè)務(wù)邏輯發(fā)現(xiàn)日志里沒有記錄又扣了一次。解決辦法是把副作用執(zhí)行和副作用登記放在同一個事務(wù)邊界里最好的方式是把扣減積分與記錄日志放到同一個數(shù)據(jù)庫事務(wù)要么都成功要么都失敗。第三個隱蔽原因是參數(shù)變化導(dǎo)致的冪等繞過。比如 op_key 只取了操作名但操作里包含了金額參數(shù)第一次扣 100第二次改成扣 50唯一約束認(rèn)為這是同一條記錄直接跳過了扣 50 的請求。這就要求 op_key 的設(shè)計要包含關(guān)鍵的參數(shù)指紋一般是用action hashlib.md5(sorted_params)。5.3 生產(chǎn)部署檢查清單最后給一份我每次上線 Agent 服務(wù)前都會過一遍的清單照著做能少走很多彎路生產(chǎn)環(huán)境 checkpointer 是否選擇了 PostgresSaver并創(chuàng)建了正確的 checkpoint 表所有有外部副作用的節(jié)點是否都經(jīng)過冪等裝飾器或等效邏輯保護(hù)operation_log表是否建了(run_id, op_key)唯一索引關(guān)鍵工具調(diào)用是否用 tool_call_id 做了去重或緩存恢復(fù)接口是否做了并發(fā)控制避免同一個 thread_id 被兩個人同時 resume是否對get_state、update_state做了操作審計方便排查人工干預(yù)的記錄是否有兜底超時機(jī)制比如 Agent 長期處于中斷狀態(tài)或恢復(fù)失敗時有守護(hù)任務(wù)負(fù)責(zé)清理或告警關(guān)于第 4 條里提到的并發(fā)控制簡單做法是在恢復(fù)接口層加一把 Redis 鎖鎖的 key 是resume:{thread_id}保證同一時刻只有一個 resume 請求真正驅(qū)動圖繼續(xù)執(zhí)行。否則兩個請求同時Command(resume...)狀態(tài)會亂成一鍋粥。6. 斷點狀態(tài)設(shè)計與冪等鍵命名的一些心得這里講一個容易被忽略的細(xì)節(jié)斷點恢復(fù)時interrupt()的返回值本質(zhì)上是從Command(resume)里透傳過來的它不會自動做校驗。如果你在審批節(jié)點里期望收到一個 dict但恢復(fù)端傳了字符串節(jié)點代碼可能直接報TypeError。所以我習(xí)慣在 interrupt 節(jié)點里加一層簡單的 schema 校驗比如用 Pydantic 解析解析失敗就拋一個自定義異常FastAPI 層捕獲后返回 400。這能避免生產(chǎn)環(huán)境出現(xiàn)匪夷所思的恢復(fù)錯誤。冪等鍵命名同樣有講究。業(yè)界慣例會區(qū)分request_id客戶端發(fā)起請求時生成的 ID用于端到端全鏈路追蹤。idempotency_key專門用于冪等控制的業(yè)務(wù)鍵同一業(yè)務(wù)動作多次重試時保持不變。run_idAgent 任務(wù)內(nèi)部流轉(zhuǎn)用的標(biāo)識可以就是idempotency_key但注意它不是 LangGraph 框架的 runtime run_id。我通常直接讓入口生成的 UUID 同時充當(dāng)request_id、idempotency_key和thread_id三合一減少概念數(shù)量降低溝通成本。你可以在日志里同時打印這個值和 LangGraph 內(nèi)部的 checkpoint_id方便追蹤狀態(tài)對應(yīng)關(guān)系。# 日志示例 [RUN abc-123] checkpoint 9f2e... 到達(dá)人工審批 [RUN abc-123] checkpoint 9f2e... 恢復(fù)執(zhí)行審批結(jié)果 approved [RUN abc-123] 冪等跳過 send_notify原因已執(zhí)行最后再分享一個我在實戰(zhàn)中堅持的習(xí)慣所有 LangGraph 節(jié)點都寫成純函數(shù)風(fēng)格不直接操作外部全局狀態(tài)只通過 state 的輸入輸出做數(shù)據(jù)流轉(zhuǎn)。副作用統(tǒng)一收斂到獨立的工具層或服務(wù)層節(jié)點只做編排。這樣做的好處是當(dāng)你要加斷點、加冪等、加審計時改動面非常小每個節(jié)點就像積木一樣可以自由插拔組合。這套理念配合 LangGraph 的 checkpointer基本能滿足絕大多數(shù)生產(chǎn)級 Agent 服務(wù)的需求。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
天天爱天天操| 巴基斯坦粉嫩无码视频| 五月天激情视频五月天| 91精品久| 99综合视频在线| www久久艹| 97碰人人操| 79精品视频| 久热视频97AV在线观看| 日本综合色色| 婷婷综合五月天激情| 欧美精品99久久久| 天天狠狠夜夜狠狠2023| 9久热| 久9久9热久热| 五月开心啪啪| 激情丁香九九五月综合网| 人人操AV| 五月婷伊人| 丁香婷婷婷五月综合色情| 成人丁香婷婷| 丁香综合伊人| 4438成人电影| 色五月情| 99爱爱| 激情丁香五月婷婷| 99热这里只有免费| 人妻狠狠操| 超pen个人视频97| 五月婷婷丁香综合| 热久久66| 99 热国产在| 久久久免费精彩视频| 91蜜桃婷婷狠狠久久综合9色| 99∨VTV| 婷婷天天日婷婷| 中文字幕av在线| 可以免费观看的AV| 色五月婷婷综合在线| 激情的五月| 热99视频精品在线| 丁香在线视频| 婷婷久久色| 久99| 色色操| 五月天久久网站| 97爱艹婷婷开心丁香激情综合| 婷婷五月骚厕所| 婷婷丁香射射| 五月综合在线婷婷图片| 久鲁鲁色网 | 丁香综合伊人AV| 日韩精品VIP| 操人妻AV| 国产午夜精品AV一区二区麻豆| 日韩成人av在线| 色婷婷精品视频| 欧美色骚婷婷五月天| 综合网色综合| 天天日夜夜帕| 天天想夜夜爽天天爽| 日韩黄色电影| 色就是色婷婷五月亚洲激情| 清色五月天| 国产精品国产| 我爱大香蕉| 九九精品9| 欧美成人va| 999婷婷综合| 天天综合五月天| 久久综合影院| 人人视频人人干人人做| 91肏| 亚洲精品久久久久AV无码| 成人在线综合| 欧亚成人A片一区二区| 97在线/亚洲| 亚洲激情网站| 久久丁香| 国产FREESEXVIDEOS性中国| 97婷婷色| 偷拍丁香九月激情| 综合精品啪啪| 成人电影AV在线观看| ww久久| 婷婷天堂综合| 草榴视频黄色网| 青青久在线视频免费观看| 99综合网| 99操逼视频| 丁香五月婷婷深爱综合激情| 五月香六月婷| 色综合五月| www.久久久久久久久久.com| 久久久久久xxxxx| 中文字幕 码精品视频网站| 婷香五月网在线| 欧美性爱5月天天天看| 国产婷婷五月中文字幕高清| 色五月婷婷网| 天天日夜夜| 久久久久人妻| 精品婷婷| 激情伊人网| 99热资源在线| 日日夜夜噜噜爽爽| 丁香五月激情网| 五月丁香网站| 97色久| 婷婷五月天手机版视频| 日本婷色| 综合五月婷婷| 婷婷性爱五月天丁香网| 伊人www22综合色| 婷婷丁香激情综合色情| 狠狠色婷婷六月激情网| 五月婷婷基地| 99综合97| 九九热这里只有精品一| 五月丁香色综合| 六月丁香激情| 激情五月天com| www久久久| 在线观看亚洲AV| 这里只有精品96| 九九99九九99偷拍视频免费看| 热久久精品视频网站| 天天日天天爽夜夜爽| 九九精品免费| 婷婷色中文字幕| 激情五月综合色婷婷| 五月天成人综合| 搡BBBB搡BBB搡18 | 色高清无码视频| 成功精品影院| 99人碰碰碰| 五月丁香黄色视频| 久久99jiu9| 手机激情网| 五月激情婷婷丁香| 亚洲区,视频区,视频区免费| 亚洲综合99| 99热99操| 伊人久久大香网| 久久激丁香| 色婷婷五月影院| 99热亚洲精品66| 成人精品视频99在线观看免费| 久热91| 九九99热久久精品66中文字幕| www99精品在线观看| 色婷婷视频| 亚洲va成人va成人va在线观看| 狠狠狠狠狠狠色| WWW.婷婷| 96精品久久久久久久久| 色色色色热| 五月婷婷综合网| 婷婷六月色开| 丁香五月六月婷婷自拍| 五月天久久小说| 99热99这里有免费的精品| 国产美女无遮挡裸体毛片A片| 久久综合99| 欧美丁香婷婷五月| 激情五月综亚网| 激情五月天色播| bbwcuckold精品熟妇| 中文av网站| 成人做爰A片免费看网站找不到了| 天天操B| 无码人妻激情| 在线视频区| 婷婷四月 成人 狠狠干| 婷婷丁香中文字幕| 夜色综合网| 大香蕉五月| 日本久久婷婷| 日本久久精品| 桃色成人网| 97婷婷五月| 色99无码| 久99热在线观看| 97香蕉久久超级碰碰高清版 | 国产精品久久..4399| 新伍月婷婷| 丁香五月婷婷少妇| 婷婷五月天综合在线| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 欧美经典片免费观看大全| 九九九九操逼| 久久99精品久久久久久三级| 天天看片日日夜夜| 丁香五月天啪啪激情综和网| 精品网站:999WWW| 超碰AAAAAAV| 亚洲综合色激情色五月| 久久视频这里有精品99| 六月婷婷在线| 激情视频综合| 免费无码毛片一区二区A片| 啪啪色激情五月天| 成人免费120分钟啪啪| 无码人妻一区二区三区免费九色| 久久婷婷亚洲| 五月天婷婷激情网| 国产99久| 九九热免费视频| 四月丁香五月婷婷久久| 五月天影院婷婷在线观看| 9久热在线精品| 丁香五月五月婷婷| 久久五月天激情| 婷婷五月天综合激情| 日韩精品VIP| 99热国产精品| 欧美狠狠色| 激情五月天婷婷久久久久久久久久久 | 日韩黄在免| 五月激情小说| 色婷婷丁香| 欧美性二区| 2005天天干天天1| 狠狠干综合| 狠狠色噜噜狠狠| 99色播| 99热在线观看精品| 热久久色| 操人91| 99热精品在线| 99热色精品| 插插五月天| 草草视频91| 狠干综合| 秋霞少妇AV网站| 啪啪91| 热99这里只有精品视频| 婷婷五月俺要去| 五月丁香综合| 五月天激情黄色小说在线观看| 99人人精品| 99热黄| 麻豆AV一区二区三区| 中文字幕精品在线观看| 亚洲综合在线丁香五月| 天天干天天干天天干天天干天天干天天 | 久9久9久9久9久9久9| 香蕉99网| 六月激情丁香一道本7777| 国产成人综合亚洲| 丁香五月婷婷国产av| 9色在线| 男人的天堂五月丁香| 人妻人人操| 综合玖玖偷拍| 日韩在线9| 亚洲成Av人片乱码色第1集| 成人婷婷色综合| 成人精品一区日本无码网| 思思热精品在线| 亚洲第一黄网| 六月丁香啪啪| 色色综合网www| 香蕉人妻AV久久久久天天| 97人人操人人爽| 狠狠久久婷五月| 五月停停999| 久久最新色| 日本欧美成人片AAAA| 天天干天天拍| 久久精彩视频| 超碰在线观看三级片| 免费无码毛片一区二区A片| 久久久99精品免费观看| 精品视频网| 疯狂做受XXXX高潮A片| 99热最新| 97碰碰叉| 狼友视频在线观看18| 超碰人人草| 26uuu色噜噜精品一区| 婷婷亚洲五| 天天上天天爽| 亚洲色网址| 国产婷婷综合| 能看的av| 人橾人| 99在线精品观看99| 色五月婷婷DVD| 怡红院一二三| 思思99热| 日韩无码性爱| 丁香五月网络网络| 五月婷婷五月天在线| www,久久久| 九九伊人网| 久久全意婷婷| 久99热| 色婷五月| 99自拍视频| 全部老头和老太XXXXX| 啪啪啪丁香五月| 五月丁香六月成人| 99热在线观看这里只有精品| 亚洲欧洲中文日韩久久AV乱码| 色热久| 双性美人被调教到喷水A片| 亚洲欧美综合7777色亭亭| 亚洲色色五月| 色五月五月丁香| 大婷婷色呦呦噜噜色呦呦噜噜| 激情五月天婷婷五月天| 国产激情在线观看| 丁香5月啪啪| 精品久热69| 久久视频在线视频| 丁香五月综合| 精品女人九九九| 色噜噜狠狠色综无码久久合欧美| 免费97碰碰| 日本三级韩三级99久久| 久久人妻乱| www.色婷婷| 久久天堂| 森林影视大全,最好看的2019年视频 | 色97综合婷婷天天色| 成人精品99| 五月婷婷激情| 操一区| 开心五月婷婷婷美女| 俺去也婷婷| 成人做爰A片免费看网站找不到了| 97国产精品女人碰碰| 婷婷色色综合激情| 色综合久久88色综合天天看| 一本到不卡高清DVD| 色情综合| 丁香婷婷啪啪| 久久久久久久五月| 色色色9| 99欧美| 综激情网| 久久99视频| 中文字幕人妻AV| 婷婷另类开心| 丁香五月成人| 五月天色婷婷小说| 逼特逼在线免费播放| 精品九九在线观看视频| www.久久99| 婷婷色啪| 亚洲AV网站| 亚洲天99| 亚洲色久| 秋霞黄色一级久久| 天天日天天爽| 伊人五月人妻精品| 超碰狠狠干99| 无码婷婷五月天| 久久久99精品免费观看| 极品人妻videosss人妻| 亚洲AV无码成人电影| 婷色五月| 激情六月婷婷| 欧美另类五月激情| 色综合网页| 久久96热| 97在线日本| 狠狠草在线观看| 亚洲第二AV| 久久免片| 成人短视频在线| 99ri精品视频在线观看| 色婷婷五月天中文字幕| 色久综合| 五月花综合视频| 婷婷国产五月天17c| 欧美va在线| 婷婷五月综合网激情| 99国产小视频| 99久久婷婷五月综合| 丁香 久久| 99热精品99| 啪啪综合网| 婷婷丁香五月激情综合站_久久五月丁香激情综合_开心五月综合激情综合五月_婷 | 婷婷六月亚洲综合| ww亚洲ww在线观看| 激情综合文学| 五月丁香好婷婷A片网| 欧美激情综合色综合啪啪五月| 伊人网大香| 婷婷五月激情的图片| 国产亚洲精品久久久久久牛牛| 亚洲丁香五月深爱五月| 9 1在线视频| 六月丁香啪啪啪| 丁香五月网络网络| 停停六月 综合| 另类视在线| 大香蕉精品视频| 密臀久久| 91久久精品无码一区二区三区| 九九色逼| 色永久| 久久久.COM| 五月天婷婷激情| 丁香六月激情综合啪啪| 99开心五月五月丁香激情| 综合色图婷婷| 97人人操在线| 婷婷五月激情在线视频| 天堂AV三级| 国产综合A片| 涩五月婷婷| 成人色色视频| 美女va| 色级婷婷| 国产一二区爆乳_1国产日韩一区二区三-成人AV | 色婷婷情片| 国产在这里只有精品| 人妻VideOssS人妻| 五月婷丁香花| 色欲色天天香综合| 冬月かえでAV无码播放| 日本视频久久| 色久综合| 99爱在线精品视频免费观看| 综合一区二区三区| 1024操逼| www.天天干| 六月激情婷婷| www,婷婷五月天,com| 九九久久五月天| 国产首页在线| 91|疯狂丨高潮丨对白| 丁香五月首页| 色婷婷精品视频| 九九热这里只有国产精品| 激情婷婷在线中文字幕| 人人综合91网| 97亚洲精品| 可以看的av| 123草逼网| 五月婷婷丁香网| 五月的婷婷六月丁香| 草一草avb| 9一精品视频观看| 国产特级毛片AAAAAAA高清| 五月丁香花视频| 婷婷草| 婷婷色色播五月天| 五月天小说激情| 99在线观看视频免费| 99精品热视频| 99久久精品色老| 蜜臀99久久精品久久久久| 久久九九激情五月天| 亚洲丁香花色| 九九热免费视频| 五月天色不卡| 中国女人做爰A片| 亚洲激情久久| 亚洲亚洲人成综合网络| 少妇高潮呻吟A片免费看软件| 五月天开心激情综合网| 亚洲综合激情五月久久| 九九aV| 婷婷成人视频| 激情五月综合网| 九九色影院| 日本丁香五月| 亚洲V国产V欧美V久久久久久| 狠狠狠狠狠狠| 婷婷最新地址| 欧美婷婷综合网| 婷婷五月天你懂的| 一级精品999WWW| 91精品久久久久久77777| 六月丁香av| www.99久| xx综合网| WWW,五月| 久婷婷| 91五月天| 日本色色影片| 成人在线视频一区| 色色五月天婷婷| 丁香五月激情宗合| 人妻尝试久久久久久久久久久久| 久久er99| 五月婷婷啪啪啪| 婷婷五月天久久久| 九九精品9| 国精产品一区二区三区| 97成人丁香婷婷| 天天做天天要天天爽| 婷婷六月伊人| 伊久久婷婷| 久久xx| 色激情网| 超碰九色| 严洲天天插| 99色在线视频| 疯狂做受XXXX高潮A片| 97人人干视频| 婷婷五月香蕉| 天天日日爽| 丁香五月综合激情性爱| 中字幕视频在线永久在线观看免费 | 婷婷五月天最新综合你懂的 | 久久久精品人妻| 伊人久久五月天| 成熟妇人A片免费看网站| 天天操天天国产三级片处女学生妹| 99碰| 99视频精品全部免费观看| 婷婷激情图片| 99热在线观看| 五月婷婷综合激情网| 五月色婷婷激情| 色噜噜狠狠色综合成人99| 性做久久久久久久免费看| 51精品国内探花| 丁香丁婷五月激情| 婷婷五月天av| 色九四色| 激情深爱婷婷网| 激情综合五月婷婷| www.9操| 成人在线精品| 色五月欧美| 丰满少妇猛烈A片免费看观看| 五月丁香色综合| 丁香五月婷婷姐| 日本久久婷婷| se99热久久一本| 婷婷五月丁香色情| 激情婷婷五月天| 色婷婷色九月| 日本色狠狠| 国产精品久久久久久久久久| 黄色99视频| 婷丁香五月天| 99视频在线啪| 亚洲天天| av超碰在线| 五月天自拍视频| 亚洲色啪| wwW天天干| 欧美日朝成人| 99在线视频播放| 女人天堂 AV| 免费观看欧美成人AA片爱我多深| 激情网五夜婷婷| 日韩操人| 97色婷婷| 激情綜合W W W,激情五月天| 久草 天堂| 精品爆操| 久久五月天视频| 色婷婷在线视频| 亚洲精品九九| 亚洲天天| 欧洲精品爱爱| 任你爽精品免费视频6| 大胆伊人久久| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 色六月丁香婷婷啪啪啪| 99久在线精品99re8热| 婷婷激情人妻| 日本久久天堂| 99综合网| 久/久精品99看9| 99高级会所久久| 狠狠色丁香| 狠狠干天天内射| 色优久久| 激情五月天小说视频| 久久91久久精品久久| 。久久久久久久久久久久久久人妻 | 99日本视频| 婷婷五月六| 亚洲成人AV在线| 99这里| 超碰93在线观看| 色综合中文| 五月丁香香蕉| 日产精品久久久久久久蜜臀| 天天擼久久擼在线| 综合爱久久| 欧美性猛交99久久久99| 97人人操人人爽| 激情九月婷婷| 亚洲精品操一操、噜一噜、摸一摸、爽 | 久人操| 97色永久免费视频| 99久久免费性爱视频`| 亚洲视频在线观看| 色亚洲欧洲| 婷婷丁香亚洲色综合91| 97操碰| 五月丁香AV在线| 欧美日韩五月婷婷| 能看的av| 婷婷激情五月色综合| 无码橾| 丁香六月激情综合| 热思思| 97干欧美| 大香蕉在九| 涩涩五月天| 五月天天天综合| 黄色激情网站在线观看| 欧美久久婷婷| 久久九九99亚洲国产久精综合| 免费在线a| 亚洲精品大片| 天天插插天天| 夜夜爽天天| 天天综合色99| 婷婷色网| 99狠狠色| 涩涩涩.com| 久久性爱视频| 色色色五月| 五月天激情视频| 天天摸天天做天天爱天天爽| 久久人妻爱爱| 肏屄色播伊人97婷婷| 成人做爰A片免费看网站找不到了| 婷婷五月天狠狠| 久久这里这里有精品免费视频| 日韩啪啪自拍| 国产亚洲精品久久久久久郑州| 99热这里有精品| 亚洲色欲欧美一区二区三区| 九九操操| 玖玖婷婷视频| 99久久超级| 99精品在线观看视频| 五月天亭亭俺也| 五月丁香婷婷激情在线| 色 免费网站视频| 91精品综合久久久久久五月天| 亚洲日韩一页精品发布| 国产99久久久| 人妻aV在线| www.久久av.com| 337p午夜影院| 激情综合网婷婷久久| 欧美在线操| 99人人干人人操| 99精品视频在线观看| 9久热| 99热1| 99热这里全都是精品| 99久久综合精品五月天| 丁香五月骚喷水视频| 思思久久网| 久久精品视频99| 97色在线观看视频| 日91高清无玛| 综合色色综合| 天堂网啪啪| 激情久久综合网| 综合精品啪啪| 99视频在线观看视频| 五月色情婷婷| 去色色五月天| 免费播放AV| 久久久日韩特色特黄AAAA| 五月婷婷黄色网址| 久久探花91swag| 五月婷婷 婷婷五月 一区二区 久久久| 久久婷婷亚洲| 婷婷五月天av| 亚洲 在线 另类| 超碰日韩人妻在线| 91九九九九九九| 激情精品久久| 91精品啪| 性视频久久| 激情四射五月天| 五月开心婷婷极品激情| 激情的五月婷婷蜜桃| 99热热九九| 五月的婷婷六月丁香| 五月丁香久久综合精品| 丁香婷婷成人在线播放| 这里只有精品在线视频在线观看| 欧美日本另类| 激情综合亚洲| 亚洲爆乳无码精品AAA片蜜桃 | 狠狠五月激情在线| 99精品在| www.婷婷五月| 成人片在线播放| 狠狠操综合| 91无码色色| 国产精品成人网站| 99色在线视频| 人妻肉射免费观看| 色婷五月天| www.五月.com| 久久婷婷青青| 五月丁香亭亭操逼| 都市激情五月婷婷综合| 色五月丁香网| 99色视频| 九九中文色色| 99色婷婷| 五月天激情啪啪| 久久久五月五丁香| 丁香五月综合| 久久大香免费| 久久五月天激情婷婷| 亭亭五月天成人| 成人AV免费观看| 色狠狠色噜噜AV天堂五区 | 日日狠狠久久偷偷四色综合免费 | 婷婷五月天天aV| 久婷久婷| 婷婷五月天A V| 影音先锋毛片网站| 六月婷婷亚洲| 日韩啊啊啊| 9在线9在线婷婷在线国产| 激情AV| 日日艹思思热| 日本一级一级一级一级| 中文字幕成人影视| 激情网开心网| 九九Av| 色都都狠狠色都都色综合色| 六月色婷婷色| 五月丁香在线| 免费视频1区| 18av天堂| 精品在线网站| 婷婷五月另类网站| 狠狠婷婷爱| 日韩999| 欧美日本99| 激情亚洲五月| 五月婷婷色播| 91人妻人人操人人爽| 99热在线观看这里只有精品| 丁香五月激情综合| AV网站免费在线| 色婷婷视频在线| 熟惀91九色在线| 女人露出p毛视频www网站| 无码色| 丁香婷婷影院| 五月开心婷婷| a久久| 婷婷丁香久久| 97色97干| 五月99久久| 日日爱激情| 六月丁花香啪啪激情欧美| 丁香婷婷六月婷婷六月婷婷六月婷婷| 97se视频在线| 日熟女| 日本成人噜噜噜| 在线播放 精品| 79色色免费| 丰满老熟妇BBBBB搡BBB| 美女亚洲五月丁香| 精品人妻伦一二三区久久| 99在线观看视频| 任你爽精品免费视频6| 9久9久| 79精品视频在线观看,| 九九爱精品网站| 99热这里只有精品无码| 99热国产在线| 色五狠狠| 色色色色色色色色色色色色色五月天| 开心五月天激情网站| 久久九九Com| 婷婷香五月| 婷婷丁香六月天激情四射网| 亚洲 五月 婷婷 成人| 久久六月婷婷| 伊人五月丁香| 99在线综合视频| 能看的av网站| 欧美啪啪9| 99久久婷婷| 99热九九这里只有精品| 99综合免费视频| 色久婷婷网| 99精品国产在热久久| 五月丁香久久久| 99干在线视频| 久久九九@| 大香蕉综合网| 成熟妇人A片免费看网站| 怡红院精品视频久久久久久久久| 人人操超碰| 五月婷婷综合在线| 久久婷婷视频| 国产精品久久久久久久久久免费| 色播丁香婷婷五月激情| 亚洲色五月婷婷| 另类视频综合| 天天网站天天爽| 婷婷五月丁香四射| 激情六月天婷婷| 激情五月天婷婷免费观看| 一本色道久久88加勒比| 综合激情站| 婷婷99视频精品| 中文字幕日产A片在线看| 色婷婷六月天在线| 天天综合五月| 五月激情小说| 色色日本| 国产欧美婷婷| 久久久久久9热不雅视频| 亚洲天堂啪啪| 狠狠狠狠狠狠狠狠狠狠狠色宗合图片| 五月黄色婷婷| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | 色九月婷婷| 另类图片 五月激情| 亚洲色图啪啪| 深爱激情五月网| 激情六月婷| 九月丁香| 91主播在线| 五月花免费视频| www.av骚货| 91狠狠综合久久久| 狠狠色婷| 五月婷婷六月激情| 偷拍五月丁香| 2023天天日夜夜爽| 婷婷射丁香| 99热国产在线| 丰满人妻一区二区三区| 婷香五月激情视频| 婷婷五月丁香基| 激情综合国产| 91久女| 可以免费观看的AV| 天天爽天天操| 欧洲亚洲激情五月天在线| 色婷婷网| 国产精品成人网站| 中国女人内射6XXXXX| 91人人网| 婷婷天天婷婷天天澡| 五月永久激情| 日韩中文欧美| 五月婷婷偷拍| 性爱网六月丁香| 久久婷婷五月丁香蜜桃网| 99这里有精品| 97丁香婷婷| 色综合伊人网| 日本va欧美va欧美va| 色婷婷丁香五月在线| 亚洲精品亚洲人成人网| 热久69| 久久性都花花世界成人免费视频| 日本天天操| 日本三级黄色大片| 丁香五月婷婷av| 丁香六月五月天| 婷婷丁香激情| 九九视频精品视频精品| 激情开心五月婷婷| 久热久色| 大香蕉久久| 六月丁香啪啪啪| 黄网在线免费播放| 欧美毛卡| 色色色色区| 亲子乱av一区二区三区的| 五月婷婷香蕉| 五月天福利影院导航| 午夜婷婷| 99这里只有精品| 99精品在线观看| 超碰免费人人| 久热无码| 国产成人精品亚洲线观看| 丁香色色网| 国产激情久久| 人人摸人人干| 国产AV一区二区三区日韩| 超碰v| 98国产精品综合一区二区三区| 色五月激情网| 五月激情在线| 国产精品色情AAAAA片软件| 国产人妻人伦精品一区二区| 伊人无码高清| 亚洲AV在线免费看| 97干资源在线观看| 亚洲欧洲一二| 久久久久久久久99精品| 久色网址| 在线VA视频| 成人色情五月天婷婷丁香| www.伊人天堂偷偷婷婷| 婷婷综合六月| 日本色爽| 涩五月婷婷| 高清一区二区三区日本久| 色伊人91在线视频| 久久99精品久| 五月婷婷偷拍| 做爱夜夜干天天操| 六月婷色六月| 激情五月天电影| 婷婷射图| 五月综合激情网| 激情综合网婷婷五夜| 91怕怕网| av色婷婷| 婷婷 激情 五月| 99re视频精品| www.婷婷五月天| 一级黄色影片| 九色综合五月天婷五月| 97黑人精品区| 天天做天天爱天天日| 五月久久亚洲| 日本婷婷在线| 国产毛片精品一区二区色欲黄A片| 亚洲综合五月天婷婷| 亚洲成人网站在线| 综合99在线| 丁香五月电影| 五月婷婷黄色视频| 婷婷五月天小说| 五月丁香婷婷啪啪| 免费观看高清无码| 综合狠狠伊人| 婷婷婷婷婷婷婷五月丁香| 草草视频91| 日韩不卡123| 国产精品久久久久久白浆色欲| 五月色婷婷AV| 激情伊人| ai97re99一本| 色五月婷色彩免播放器| 亚洲成人在线五月天| 色色五月天激情| 91无码色色| 五月丁香无码| 综合图区激情| 狠狠操狠狠操| 午夜丁香 婷婷| 亚洲五月婷婷在线| 婷婷五月天Av| 狠狠狠狠狠狠草| 狠狠操.com| 婷婷六月综合基地| 天天碰夜夜操| 久热九九| 丁香五月天综合| 在线观看免费视频| 国产熟女一区二区三区五月婷| 99这里只有精品在线观看| 综合激情五月丁香| xxxx五月天色色| 六月丁香激情最新更新| 日本久久天堂| www,色综合| 亚洲中文乱字字幕线在永久| 这里只有精品1| 亚洲99在线| 俺也高清无码高清视频| 99精品偷自拍| 五月婷婷综合激情| 97干在线观看视频| 日本情色一区二区| 丁香五月天激情AV| 9l视频自拍9l九色成人| 99操中文视频| 偷偷操99| 九月婷婷在线观看| 五月丁香六月花| 久久久国产精品黄毛片| 青青草性爱视频| 亚洲AV日韩无码| 伊人狠狠色婷婷综合丁香一区| 热99精品视频| 日韩在线观看网址| 伊人丁香五月| 色婷婷激情| 丁香五月天偷拍| 色欲色香综合网| 91vip在线观看| 热五月婷婷| 九九色之九九色之88| 亚洲va欧美va天堂v国产综合| www九九免费视频| 丁香五月天无码| 538在线精品| 丁香五月天殴美激情| 色五月综合| 女人天堂av| 国产亚洲精品AAAAAAA片 | 99九九视屏| 色婷婷丁香女女| 色五月综合婷婷| 99人人爽| 婷婷久久亚洲| 94干大香蕉| 亚洲va综合va国产va中文| 日本毛片内射| 97热精品| 日韩成人无码人妻| 四色五月婷婷| 伊人青草成人| 日本精品人妻无码77777| 五月婷婷之激情五月| 五月天婷婷狂暴白浆| 久久久精品色色色| 国产中文字幕在线视频免费观看 | 五月停停丁香| 6 9式性爱视频在线播放| 亚洲操b| WWW久| 日本久久综合| 五月丁香婷婷无码中文| 少妇性BBB搡BBB爽爽爽电影| 丁香五月激情澎湃一区| 精品九九久久| 五月婷婷导航| 色婷婷99| 草草女人亚洲| 激情五月天激情小说| 91久久九久久九久久九久久九久久| 性色婷婷| 国产永久一二一起草| 九九综合九| 狠狠操天天干| 激情婷婷丁香五月天小说| 午夜天堂一区人妻| 婷婷五月天激情免费在线观看| 免费97碰碰| www色婷婷| 性生活久久人妻| 一本久道综合99| 色综合色| SESE无码AV| 日本久久婷婷| 国产成人精品一区二三区熟女在线| 婷婷六月激情在线视频| 在线观看996精品| 大香蕉综合网| www.99视频| 99久久99视频只有精品| 天天插操| 欧美久久婷婷| 日本九九热| 97精品自拍| 婷婷五月天免费99| 五月丁香成人| 新激情五月开心五月婷婷五月丁香五月 | 婷婷丁香射射| a级毛片一区二区免费视频| 99熟女啪啪视频| 97色五月天| 99热亚洲精品| 97丨九色丨国产丨PORNY| 97干视频在线| 五月丁香六月情婷婷久久| 丁香婷婷色九月| 苗黎美女四级成人版一级二级毛片| 99色在线观看视频| 26UUU在线观看| 五月丁香婷中文| 丁香亭亭激情四射| 五月丁香综合网| 日本在线va| 天天爱天天做综合| 99黄色在线视频精品熟女| 国产av一区二区三区| 日本高清久久| 狠狠搞狠狠操| 成人欧美Va| 婷婷五月激情的图片| 五月婷婷导航| 99热草草| 嫩草AV久久伊人妇女超级A| 五月天伊人综合| 五月天久久丁香| 天天噜天天爱| 先锋五月婷婷丁香草草| 丁香五月婷婷久久久| 欧美丰满熟妇BBB久久久| 色狠狠综合| 婷婷激情图片| 婷婷色五月综合| 丁香五月激情六月综合| sesesesezonghe| 婷婷五月综合网| 超碰五月婷婷五月天| 国产熟妇乱子伦hd| 99操逼| av狠狠操| 99精品久久久久久久婷婷| 无套内射极品大美女| 天天精品视频在线观看视频| 蜜乳.comcom| 99色综合网| 日本久久精品| 久99视频在线观看| 99久久精品国产色欲| 伊人大香久久| 色综合网页| 天堂在线观看视频| 日韩一本操| 被强行糟蹋的女人A片| 国产67194| 99久视频| 婷婷五月激情图片| 久久综合五月| 五月婷婷天| 99色婷婷| 日本综合色图| 婷婷激情社区| 五月天激情国产综合婷婷| 婷婷激情五月综合| 99自拍视频在线| 九九热av| 成人日韩欧美| av九九| 看片视频在线免费日产在线看| 九九热在线99| 五月综合色| 亚洲成人在线播放| 欧美交换配乱吟粗大25P| 一本大道嫩草AV无码专区| 国产亚洲精品久久久久久郑州 | 在线18av | 婷婷综合中文| 五月婷婷综合色啪首页| 天天透天天干| 玖玖婷婷色五月| 任你日视频| www.激情.com.| 午夜 外网 精品 在线| 日日射天天射| 深爱1激情网| 婷婷爱五月| 久久激情综合| 91Chinese在线| 秋霞AV吧| 色婷亚洲| 日韩欧美一级大黄网站| 色五月婷婷天天干| 狠狠色无码| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | 久久性爱99国产| 3DAV亚洲香蕉久久 一区二区| 91玖玖| 亚洲操人| 激情综合五月婷婷| 天天色综网| 五月丁香A∨在线| 久久婷婷色情7777网站| 色婷婷电影| 欧洲综合视频在线观看。欧洲,亚洲综合食品在线观看。 | 91婷婷丁香五月| 五月网激情| m色激情网| 激情五月激情综合网| 天天色天天| 亚洲一区二区色图-亚洲精品国产精品乱码-成人AV | 激情五月婷婷网| 久久久宗合视频88| 丁香狠狠色婷婷| 丁香五月天人体| 成人丁香五月| 综合色播| 亚洲中文字幕在线电影| 生活片五区| 五月天中文网| 久操大| 激情操逼婷婷| 精典久久| 99性感视频| 婷婷亚洲影院| 黄色高清无码| 色婷婷丁香五月| 99久久精品视频女神1| 激情久久久久久| 日韩国产在线精品| 欧美日韩123| 日韩AAA| 性生活视频98791| 蜜乳av一级av| 亚洲精品99| 色婷婷AV久久久久久久| 人人爽天天爽| 五月天AV大香蕉| 开心四月婷婷在线色播播| 婷婷内射视频在线| 4438亚洲欧美| 色综合久久888| 色深爱五月| 熟女人妻一区二区三区免费看| 五月丁香激情综合啪啪| 深爱丁香激情| 久久九九免费视频| AV免费在线网站| 婷婷五月天少妇| 九月丁香| 激情五月婷黄版| 狠狠色狠狠色综合日日91| 99精在线| 百度4399有码精品V在线观看| 中文字幕日韩无码制服诱或| 色九网| 东京热免费视频网站| 亚洲另类久久| 久久久天堂国产精品女人| 97碰碰在线看视频免费| 天天色色天天| 丁香五月天天久久综合小说| 天天色月| 91超碰在线播放| 光棍影院日韩精品| 伊人深爱综合| AA片在线观看视频在线播放| 久久综合丁香五月| 99色热视频| 婷婷九九视频| WWW.婷婷| 99视频日韩| 色综合久久久久久久久五月| 99re在线播放| 丁香五月花婷婷开心| 91九色精品女同系列| 久激情| 五月色婷婷综合| 丁香深五月婷婷| 可以直接看的AV网站| 黄色视频网站在线播放| 婷婷丁香高潮了| 秋霞免费视频| 都市激情五月婷婷综合| 九九碰九九爱97超碰| 激情五月综合网| 99久久6| 婷婷五月天AV网| 色情成人五月天| 久久天天天| 日本久久精品| 综合激情开心五月| 亚洲综合另类| 啪啪五月天啪啪| 国产AV一区二区三区日韩| 激情婷婷丁香五月| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 夜夜骑日日夜夜| 婷婷五月天淫荡| 五月天 另类图片|