99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

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国产| 色999五月色| 91激情五月开心| 99爱视频精品| 99精品高潮| 人妻久久久久久| 欧美毛片www| 九九热91| 婷婷9月天| 另类图片婷婷五月天| 一二线视频 另类| 五月天婷婷婷| 深爱五月天 开心网| 葵花AV在线| 综合色色婷婷| 丁香五月婷婷偷拍| 巴基斯坦粉嫩无码视频| 99视频这里只有免费精品| 2050人人操免费工开爱| 97干97色| 色五月欧美| 97久久视频| 国产成人精品亚洲线观看| 国产26uuu| 美女亚洲五月丁香| 香焦网五月天| 热日韩欧美| 综合久久影院| 操逼巨乳91| 丁香婷婷射| 97人人操人人爽| 五月丁香色停停啪啪啪| 99免费超碰在线| 91干| 91黄操| 亚州操人在线视频| 色青青五月| 六月激情网| 丁香六月欧美| 丁香月六月| 欧美va亚洲va| 久久视这里只有精品| 丁香婷婷综合色五月激情国产基地| 夜夜干天天操| 婷婷丁香六月| 91久久1118| 无月播播激情在线观看视频| 伊人色综在线| 五月天婷婷在线播放| 激情婷婷| 丁香婷婷网| 日亚二欧美| 97超级碰人人| 色婷婷性爱网| 婷婷基地成人五月天| 9l视频自拍9l九色成人| 丁香色色网| 婷婷深爱五月| 六月丁香av| 天天爱天天狠天天透| 丁香五月天婷婷中文| 丁香五月婷婷色综合基地| 亚洲色精彩| 九九99久久| 操操操91| 久综合网| 天天cha成人综合网| 五月欧美色色五月| 六月丁丁香| 99免费| 天天日日爽| 99精品在线下载| 丁香色色网| 超碰93在线观看| 九九99九九99| 九九黄色网| 色噜噜狠狠色综合日日| 9l视频自拍九色9l黑人| 久久9视频欧美| 99免费综合网| 日日日日操| 亚洲色在线观看| 色婷婷五月在线| 六月婷婷亚洲| 婷婷综合精品| 色www久视频| 久9综合| 91精品国产色猫| 欧美啪啪五月天| caop在线| 思思久久99热只有频精品66| 亚洲1区| 99热最新网址| 超碰人人99| 丁香九色不卡aaa| 99精品超在线播放| 亚洲99手机免费看视频| 丁香五月婷婷啪啪啪| 色五月激情五月开心五月| 五月天成人小说| 人人爱操| 亚洲AV综合网| 久久国产色| 天天色丁香| 五月色网| 五月丁香自拍| 狠狠色噜噜色狠狠狠综合久久成人波| 91疯狂操操操操| 九九99在线观看视频| 我爱va亚洲va52| 99热这里只有精品4| 久热九九| 久久性操| 免费观看大片视频 丁香婷婷 六月欧美| 99操| 五月天婷婷爱| 欧洲日韩一区二区三区| 可以免费观看的AV| 激情五婷网| 狠狠狠激情网| 五月天激情综合网| 影音先锋91男人资源在线播放| 99久re热视频精品98| 国产成人在线不卡AV| 国产在线视频1234| 天天射色五月天| 久久99婷婷| 久草婷妨| 丁香五月中文字幕久色| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 青青日韩| 日本操逼九九九九58日本操逼| 五月丁香六月激情综合| 金品在线视频99| 婷婷深爱色五月| 伊人激情综合网| 一本到不卡高清DVD| 综合五月草| 女人天堂AV| 狠狠干五月| 婷婷丁香五月天中文字幕| 丁香五月先锋| 婷婷色色色| 思思热思在线精品视频| 99热这里只有精品55| 97自拍99| 美国十月色婷婷在线观看| 婷婷黄色五月天在线视频| 五月婷婷丁香啪啪| 久久66er久久| 九九AV在线| 日韩精品一品二区三区的使用体验| 久久久久99精品成人片| 九九热9| 五月天婷婷自拍图片在线观看| 99这里有精品| 婷婷五月免费观看| 日韩性爱AV| 色A网| 大香蕉五月天| 精品人人操| 五月婷婷免费视频| 五月婷婷丁香91| 九月丁香婷婷综合激情| 国产FREESEXVIDEOS性中国| 成人五月天丁香| 色五月婷婷操逼| 人人搡人人| 婷婷开心激情| 另类图片天天影视在线观看| 色色色999| 亭亭五月丁香综合欧美| 久久久天堂国产精品女人| 久久ER视频com| 激情五月丁香婷婷| 99热这里只是精品| 亚洲第一av| 99九九在线视频| 色呦呦美女| 人人干女人| 91操在线视频| 精品久久99| 色婷婷色五月丁香| 五月丁香婷婷啪啪综合| www色色com| 嫩草综合网| 婷婷9月天| 国产精产国品一二三在观看| 色七七色九九| 久久婷婷激情五月天一区二区| 丁香五月影院| 五月色影院| 琪琪色热色色| 91 九色大美女| 99成人免费热视频| 婷婷五月天激情四射五月天激情| 中文婷婷狠狠| 狠狠操狠狠操AV| 亚洲欧洲自拍图片专区五月天| 久久涩视频| 五月天婷婷丁香导航| 人妻精品在线| 国产av网| 国产精品18久久久| 欧亚洲在线高清视频| www超碰| 99精品久久| 五月丁香久久精品在线观看 | 婷婷综合一二三| 97碰| 3DAV亚洲香蕉久久 一区二区| 午夜婷婷久久 | 久热欧美| www,99热| 99自拍视频| 色天天久婷婷| 97操碰人人| 丁香五月天之婷婷影院| 99激情| 国产精品VA在线| 丁香五月六月久久综合| 97操碰在线视频| 国产无套精品一区二区| 欧美视频五区| 综合图片色色| 婷婷精品综合| 天天天天天天天操| 五月婷婷之激情五月| 成人国产网| 亚洲a色| 99久久6| 五月丁香六月婷婷中文版| 91大神在线免费看视频全集男男一起操| 开心五月激情网| 色五月婷婷丁香五月| 1024人妻| 久久久婷婷| 3DAV亚洲香蕉久久 一区二区| a久久| 五月天婷婷色色网| 99热手机在线精品| 久久久久久人妻久久久久久久久久人妻久久久 | 天久综合91综合首页| 婷婷丁香激情综合色情| 丁香六月情| 婷婷视频网| 亚洲无aV在线中文字幕| 天天综合91入口| 婷婷在线网| 色婷久久| 777精品久无码人妻蜜桃| 亚洲无aV在线中文字幕 | www.色99| 丁香六月婷婷开心| 综合婷婷| 国产成人综合网| 超pen个人视频97| 丁香色五月天| 色婷婷影视| 激情丁香五月婷婷| 中文字幕无码人妻少妇免费视频| 日本人妻伦在线中文字幕| 久久婷婷综合五月天| 9久久久久| 天天日天天摸| 九九在线精点品| 伊人天天色| 久久99热免费| 婷婷五月丁香久久| 狠狠插狠狠插| 亚洲欧洲国产精品| 99热精品在这里| 国产67194| 丁香婷婷性爱| 国产亚洲精品AAAA片APP| 黄网在线播放| 国产精女同一区二区三区久| www一起操在线观看| 一区中文字幕电影| 色欲色天天香综合| 国产亚洲色婷婷久久99精品91| 色播婷婷大香蕉| 色播综合| 九九热视频免费的| 91人人操人人爱| 欧美视频五区| 国产真实乱了老女人视频| 国产在线aaa片一区二区99| 日产精品久久久久久久蜜臀| 久久久色情| 五月停停色| 日韩另类| 这里只有精品免费视频在线观看| 综合久久综合久久| 亚洲无AV在线中文字幕| 五月丁香偷拍| 婷婷久久五月天亚洲欧美国产日韩在线观看 | 三年高清大片免费观看国语| 超级碰 久久9| 丁香六月啪| 五月天婷亚洲天综合网综合| 99热在线精品观看| 日本欧美成人片AAAA| 性生生活大片又黄又| 真实熟女-91九色| 麻豆雪千夏| 区区久久妻| 婷婷五月天激情视频| 丁香五月av| 欧美色频| 人人插9| 国产免费一区二区在线A片视频| 大香蕉婷婷色| 六月丁香影院| 丁香激情五月天| 久久精品国产精品| 99热这里都是精品| 六月综合婷婷开心伊人| 精品无码久久久久久久久| 欧美色必爱| 亚洲成人免费在线| 久久性爱视频久久性爱视频| 婷婷五月天福利| 99热黄| 六月99天天婷婷激情综合| 思思热国产| 久久xx| 久热九九| 色综合久久888| 婷婷色爱| 69凹凸成人综合网| 狠狠操狠狠操| 色激情五月| 丁香婷婷五色月| 啪啪激情网| 狠狠色综合久久久久| 26UUU一区二区| 五月天狠狠| 久草热8精品视频在线观看| 五月天伊人综合| 狠狠色婷婷六月激情网| av九九| 久久久五月天婷婷成人网| 久热这里只有精品性色AV| 天天日本夜夜谢| 在线看片h站| 亚洲激情亚洲激情| 婷婷丁香五月亚洲17cao| 亚洲无AV在线中文字幕| 婷婷五月丁香高清无码| 开心五月激情网| 99 热国产在| 婷婷婷久久久| 日韩一级A片黄色| 综合激情视频| 就去色色五月丁香婷婷久久久| 天天干,天天舔| 操操自拍| 亚洲AV人人操| 亚洲操b| 激情另类综合| 天天弄天天操| 蜜乳.comcom| 直接看的av| 天天摸天天肏| 六月婷婷色综合| 91色久| 丁香五月欧美激情| 婷婷色情网| 99日视频在线| 深爱婷婷网| 婷婷五月色花丁香社区| 无人精品在线视频| 中文字幕在线不卡| 婷婷狠狠18禁久久| 97操操| 丁香五月社区| 五月WWW| 香港九九六区八区99| 淫荡综合网| 五月婷狠狠| 开心五月天激情网站| 超碰成人公开| 天天干天天插| 妇激情基地| 日韩色色视频| 九九免费在线视频| 国产高清视频91九九九久久久| 99re视频精品| 色综合九九| 日韩999| 中文网AV| 九九九激情网| 五月天婷婷网站888| 久热人妻| 久久综合26p| 婷婷五月天在线一区| 精品女人九九九| 来吧亚洲综合网| 熟女五月天久久综合| 不卡成人免费| 久热黄色| WWW激情五月天| 91久女| 五月婷婷六月丁香综合在线| 久久婷婷五月天| 99精品国产在热久久| 九九热这里只有精品9| 91pornav在线| 婷婷丁香五月激情综合站_久久五月丁香激情综合_开心五月综合激情综合五月_婷 | 97操碰视频| 婷婷五月天最新综合你懂的| 五月激情久久| 天天做天天爽| 99热这里只有精品9| 超碰京东热av男人的天堂| 色五月色五天色情网| 丁香婷婷偷拍| www.精品99| 精品少妇人妻AV无码专区偷人| 综合婷婷五月丁香在线观看| 六月丁香激情综合网| 五月天综合网| 久久婷婷综合网| 丁香五月成人在线| 这里只有精品在线视频精品| 97久久五月丁香婷婷| 五月天色色网站| 五月丁香 啪啪啪| 91九色无码内射| 欧美日韩aaa| 五月婷婷在线播放| 高清无码一区二区三区四区| 色婷婷丁香五月天| 99精品国产在热久久婷婷| A片试看50分钟做受视频| 91人妻视频| 五月婷网| 99热精品99| 97人人干视频| 97在线99| 国产熟妇的荡欲午夜视频| 九月婷婷激情| 日韩五月丁香| 丁香五月开心婷婷| 美女100%露全身无挡网站| 亚洲情色一区| 97五月久久丁香婷婷| 色.五月综合网| 99久久97久久欧美综合网| 婷婷五月天综合网| 99这里都是精品6| 日欧大屏操| 婷婷五月六月激情| 亚洲九九在线| 国产一区男女| 九九综合视频在线观看| 九九aV| 久久久久久久久久久月丁| 蜜桃婷婷丁香综合久久开心亚洲| 99精品偷自拍| 国产精品人成A片一区二区| 精品久久久人妻| 婷婷五月综合网| 天天干,夜夜爽| 热思思| 天天看夜夜看| www.色婷婷。com| 丁香五月天欧美成人| 五月丁香六月婷| 成人中文字幕在线| 欧美婷婷丁香五月社区| 欧美激情综合| 青青草a在线| 97色色色色| 色青五月天| 狠狠色丁香婷婷| 五月天开心色色网| 五月天综合色| 99热精品99| 丁香五月先锋| 九月激情网| 九九性视频| 久久久久婷婷五月热综合| 婷婷五月天视| 五月六月丁香激情视频| 九九这里有精品视频| 日韩抽插操逼| 六月丁香社区| 国产在线黄色| 99热免费精品| 婷婷和五月天| 激情欧美婷五月| 亚洲成人乱码av网站| 天天爽夜夜爽天天爽夜夜爽| 99热碰碰| 婷婷五月丁香超碰| www.色五月| 亚洲V国产V欧美V久久久久久| 久久综合五月天激情小说网站| 狠狠爱丁香婷| 色婷婷丁香综合中文字幕| 色情五月丁香| 69午夜成人影片| 在线可以看的av网址| 五月婷在线观看| 色碰碰视频| 成 人片 黄 色 大 片| 91干99| 五月婷婷综合久久| 婷婷五月久久| 久久香蕉影院| 男女啪啪视频久 9| 丁香六月婷婷| 久久久久久性爱视频| 激情小说视频图片网| 激情五月婷| 操99| 玖玖色资源| 9l视频自拍9l九色9l成人| 99精品视频免费在线播放| 蜜桃婷婷丁香| 色色性爱视频| 九色PORNY在线精品酒店| 欧美日韩91| www.久久爱| 丁香六月激情综合网| 五月婷婷激情网| av免费在线看不卡无毒| 亚洲小电影在线观看黄999| 激情婷婷五六月天| 丁香六月狠狠干| 91在线操逼视频| 亚洲成人网站在线| 国产亚洲精品久久久久久郑州| 欧美性生交XXXXX无码小说| 七月激情六月婷婷综合在线播放| 色青青视频| 99碰网站| 91九色PORNY中文啦| 色色亚洲无码| 综合啪啪| www.婷婷激情网.com| 天天色天天搡| www.minyis.com【JT】实力收量可预付QQ2101460746 | 丁香五月激情五月| 色色综合日韩| 亭亭玉月丁香| 无码人妻激情| 欧美99视频| 超碰2021| 99热视精品| 色播播五月天| 亚洲区,视频区,视频区免费| 九九热最新| 五月丁香在线观看国产| 九九亚洲小视频| 九九视频在线观看| 久操热| 91色情播放| 成人无码精品1区2区3区免费看| 国产ava| 五月天综合在线观看视频| 亚洲精品a成人在线播放| 九九综合视频在线观看| 色色色999| 九九热99免费视频| 999激情视频| 丁香六月激情综合网| 婷婷五月天BBw| 亚洲欧洲中文日韩久久AV乱码| 亚洲人成网亚洲欧洲无码久久| 伊人久久大香蕉网| 97碰| 天天狠天天叉| 日韩精品一品二区三区的使用体验 | 激情六月丁香| 色五月五月天色婷婷色五月| 999久久久国产精品| 色婷婷AV五月天| 国产亚洲精品AAAAAAA片| 激情五月黄色小说| 超碰v| 深爱激情九九五月天| JAPANRCEP老熟妇乱子伦视频 | 国产又黄又爽又色的免费| 青青草a在线| 国产做爰视频免费播放| 国产一级婬片毛片| 欧洲综合一区| 五月婷激情| 激情文学 综合 九月| AV人人操| 成人网址在线观看| 中文字幕日产A片在线看| 激情综合网五月天天| 久久婷婷五月综合| 五月丁香六月婷婷婷婷| 99人人操| 日韩成人AV在线播放| 影音先锋一区二区三区| 夜夜穞天天穞狠狠穞AV美女按摩| 天天草天天日| 天天综合网~91| 狠狠摸狠狠摸| 六月99天天婷婷激情综合| 99热66| w婷婷五月婷婷w| 国产精品 的国产| 中文字幕不卡+婷婷五月| site:901-07.com| 久久久久这里只有精品| 。久久久久久久久久久久久久人妻| 婷婷五月综合免费在线| 色情婷婷| 激情久久综合网| 五月天停停日日| 99热一区| 内射丰满人妻| 大香蕉婷婷五月| 少妇人妻人伦A片| 色亚洲欧洲| 99自拍视频在线| 狠狠色综合777| 99re资源在线视频导航| 大香蕉五月丁香| 99久久久免费| 国产精产国品一二三在观看| 亚洲男女激情| 婷婷五月天综合蜜桃| 欧美日韩国产日本精品四虎网网站物| 亚洲综合五月| 丁香狠狠| AA久久| 色五月色综合| 丁香五月成人社区| 丁香五月天AV| 四虎婷婷五月天| 伊人热在线大香蕉| 人人爽天天爽| 久热超碰91| 五月丁六月婷| 色色色综合视频| 玖玖午夜视频| 五月丁香婷婷激情爱爱| av九九| www.五月.com| 丁香婷婷五月六月天| 婷婷丁香黄色| 激情婷婷六月天| 婷婷五月丁香六月| 夜夜做夜夜愛| 桃色激情婷婷伊人网| 内射 无码 伊人| 丁香激情网| 深爱综合网| 5月丁香六月婷婷| 天天摸天天爽| 六月丁香成人| 色色日韩| 99超碰人人| 校花娇喘呻吟校长陈若雪视频| 小视频久久久aaa| 五月激情开心婷婷| 亚洲激情综合| 玖玖综合网| 综合色七七| 无码AV免费精品一区二区三区 | 五月天激情四射| 成人视频在线免费播放| 色久丁香五| 日日色综合| 狠狠干.com| 开心五月婷婷激情| 五月婷婷六月丁香| 极品人妻VIDEOSSS人妻| 久久99国产综合精品免费| 婷婷亚洲综合| 任你艹| 久操大香蕉| 久操无码| 婷婷网五月天| 亚洲色综合| www.婷婷五月天.com| 丁香五月激情啪| 精品久久9| 97碰久久| 天堂久久精品| 狠狠插狠狠插| 北京熟妇搡BBBB搡BBBB| 午夜不卡久久精品无码免费| 激情婷婷六月天| 五月婷婷六月丁香| 超碰人人摸人人操| 伦乱人妻| 精品九九久久| 欧美色97| 激情网战码亚洲A| 久久女人天堂| 亚洲电影中文字幕| 色综合久久无码| 99噜噜噜| 噜噜噜狠狠色综合| 狼人久草| 色婷婷五月天堂资源| 婷婷五月另类网站| 综合大香蕉| 天堂久久精品| 成 人片 黄 色 大 片| 色无婷婷| 黄色一级影片| 午夜理论片最新午夜理论剧| 激情九九这里只有精品| 丁香五月成人| 色99在线观看| 日本不卡高字幕在线2019| 久久日婷婷| 棕合影院色色| 久久五月网| www,天天干| 久久婷婷视频| 久久婷婷老| 9九色首页| 色五月丁香五月激情五月激情| 玖玖国产视频一区| 丁香激情婷婷网| 91丨九色丨国产在线| 色五月综合激情| www开心激情网| 97人人操在线| 丁香操逼| 亚洲AV中文在线| 激情综合网亚洲色图| 99国产精品久久久久久久久久久 | 综合AV网| 久热久操久热久草国产91| 9九热视频| 亚洲激情五月| 亚洲亚洲人成综合网络| 丁香婷婷色九月| 色五月天网| 狠狠色婷婷7777久| 99人妻碰碰久久久禁片| 丁香六月激情国产| 五月天开心成人网| 五月天激情啪啪| 五月丁香激情综合网| 五月丁香婷婷99| 亚洲激情高潮| 99只有精品| 亚洲成人网站在线| 五月丁香六月花| 开心五月网 | 婷婷五月丁香激情色情| 九九热免费| 9久操| 天堂婷婷丁香六月网| 色婷婷小说网| 国产一级片| 六月丁香啪啪啪| 亚韩精品视频1区| 九九热在视频| 五月丁香在线观看| 1024婷婷综合久久五月天| 丁香六月色婷婷| 黄色中文字目| 好吊丝aV| 香蕉国产2013| 91婷色| 99在线精品视频| 91在线看片| 人妻无码精品一区| 97人人妻人人艹| 26UUU亚洲欧美| 婷婷色色网| www.狠狠操.co m| 六月激情婷婷| 玖热精品综合视频| 五月丁香六月婷| 日本色频| www色五月| 91操操| 日韩黄色网络| 久久婷狠狠色| 成人综合视频在线| 99视频精品| 亚洲AV人人操| 婷婷五月天堂| 婷婷久久欧美| www久视频com| 99色爱| 综合在线观看99| 亚洲aV写真天天综合网久久| 夜色.cnm| 五月综合六月婷婷| 丁香五月婷婷影视先锋| www激情| 色婷婷伊人| 丁香五月电影| 五月婷婷 欧美| 亚洲色碰| 99激| 影音先锋男人站,影音先锋男人色资源网,影音先锋AV最新资源站,影音先锋AV资源 | 久久丁香五月天| 亚洲一色色色色色色色色| 色色99| 九九视频在线免费视频| 99碰在线视频| 五月婷婷六月丁香综合| 色婷婷基地在线| 色色99| 婷婷丁香五月亚洲| 色爽九九| 色婷婷六月天| 激情五月综合网最新| 丁香综合久久| 六月激情婷婷| 九九久久五月天综合伊人| 禁片二区| AV在线资源| 777久久综合视频| 久久亭亭电影| 久久xxxx| 五月丁香婷在线| 9久热在线视频精品| 99热都是精品| 日日狠狠久久偷偷四色综合免费| www.五月天色色.com| 97色干| 婷婷五月色網站| 五月婷婷另类| 狠狠色婷婷综合开心影视| 五月天婷婷网站888| www.五月婷婷.com| 日韩二区搞逼插逼毛片| 天天综合五月天| 安息电影在线观看完整版| 99精品偷拍视频| 国产精品色色| 色欧洲| 丁香五月婷婷亚洲综合精品在线| 天天肏天天肏| 国产亚洲在线| 久久九九激情五月天 | 日本五月婷婷| 五月丁香中文| 丁香婷婷丁香五月欧美人| 欧美精品久| www久久久久久久久久久| 色五月激情综合| 天天摸日日舔狠狠添婷婷婷| a在线观看| 色色色色色九九九九九| 色播五月天激情| 操九色| 婷婷十月丁香| 色五月婷婷狠狠撸| 婷婷97碰碰| 婷婷丁香五月天之开心少妇| 思思热精品在线视频| 精品九九视频| 激情五月综合视频| 色情五月婷| 久久加勤综合| 亚洲色无码A片一区二区麻豆| 五月丁香欧美综合| 婷婷色五月综合| 五月婷婷精品视频| 超碰三级秋霞| 日韩久久色| 991精品在线视频| 国产av第一专区| 国产亚洲色婷婷久久99精品91| 丁香九九九九| 五月婷婷啪啪| 日日夜夜狠狠干| 丁香网五月网| 色色色色色色色综合| 99综合久久| 欧美在线97| 91日韩美女被插视频| 日本在线观看aaa 99| 久久婷婷原创视频| 成人在线观看精品| 第九色区av天堂| 成人精品视频99在线观看免费| 9久视频| 丁香六月婷婷色播| 99热精品观看| 综合伊人久久| 精品99视频| 91色操| 在线观看av网站| 日日干日日| 色吧五月婷婷| 99日本黄站| 无码区婷婷五月花开| 婷婷久热| 九九精品热| 91精品综合久久久久久五月丁香| 丁香五月手机在线| 五月丁香五月婷婷| 五月天婷婷色色| 老妇六区| 99热在线极品极品| 97人人操人人拍| 丁香婷婷五月人体| 超碰AV成人| 日本3级片一区2区| 97啪啪| 91viP在线看| 久久婷五月婷| 午夜成人片400| 色呦精品| 一起操最新网址| 中文字幕av亚洲| 成人欧美日韩| 26UUU| 婷婷五月激情片| 亚洲情a| 俺去也在线官网| 玖玖婷婷五月天| 亚州操操| 97人人干| 亚洲欧洲美女在线观| 日日噜噜久久婷婷五月天| 激情久久肏屄视频| 天天日天天干天天爱| 思思热精品免费视频| 五月丁香成人视频| 综合久久97| 五月丁香大香蕉| 91综合网| 91精品婷婷国产综合久久| 五月婷婷激情四季| 亚洲欧美999| 久久免费操| 狠狠狠狠狠狠| 天天综合网~91| 亚洲综合另类| 激情丁香婷婷五月天| 五月丁香777| 婷婷色五月天在线观看| 久久久久人妻网址| 99精品丰满| 99热播放| 懂色AⅤ| 久热91| 久99婷婷色综合| 久久作爱| 欧美婷婷五月| 99热偷拍| 色色综合五月| 亚洲精品色色| 天天色综合网吨吧| 久久女婷| 亚洲一二三网| 久久性爱视频免费| 丁香婷婷社区| 免费观看全黄做爰的视频| 思思99久久| 天天日夜夜操五月| 婷婷色五月丁香六月欧美啪| 99色视频| 最新日韩久热免费视频看看| 一根材五月婷成人| 九九综合色综合| 热热色色五月天婷婷| 五月婷婷色播视频| 深爱五月婷婷| BBWCUCKOLD精品熟妇| 九九热av| 夜夜夜夜夜操| 久久久久久久11111111111| 夜夜大香蕉婷婷丁香| 亚洲色色色色| 思思热在线视频精品| 欧洲S级在线观看| 欧美婷婷五月天综合| 我爱大香蕉| 99热精品观看| 天天草天天摸| 夜夜嗨一区二区三区直播内容 | 九九在线热九九在线热99热| 成久综合视频| 99久久www| 中文字幕成人日韩| 伊人午夜综合色啪| 久久九色| 婷婷的99视频网站| 丁香六月婷婷久久综合| 色婷婷91激情小说| 996热re视频精品视频这里| 9久精品| 99人人干| 狠狠色婷婷| 97在线刺激| 日本激情91| 2013AV天堂| 婷婷开心久久| 日比视频91| 婷婷丁香视频| 性欧美大战久久久久久久83| 国产伊人五月天| 激情综合网五月激情| 91超级碰碰碰| 色三级色三级| 综合色99| 激情小说五月天| 天天色图| 亚洲色五月婷婷| 成人在线视频网| 这里只有精品免费| 大香蕉五月天婷婷| 一本久道综合色婷婷五月| 午夜成人AV在线| 玖玖爱伊人| 91中文在线| 99视频久久| 99色在线视频观看| 综合五月天| 夜夜爽日日躁| 伊人天堂婷婷| 夜夜干夜夜操| 丁香玖玖视频大全| 五月丁香亭亭操逼| 亚洲国产成人综合| 爱射综合| 综合性视频99| 91碰碰| av在线色五月丁香婷区久| 九九丁香社区欧美激情| 天天色综网| www.99精品视频| 狠狠穞A片一區二區三區| 色吊丝永久访问网址| 超碰九九热| 婷婷久久五月| 久久综合66| 色欲午夜无码久久久久久张津瑜| 一区二区乱码视频| 激情五月婷婷五月| 五月四色婷婷| 色色婷婷婷丁香五月天| 91热在线| 99热国内| 久久久久久婷| 99久久婷婷五月综合| 天天做天天要天天爱| 不卡在线超碰| 狠狠色丁香| 五月婷婷高清| 五月婷三级片| 亚洲av日韩无码| site:hcxsz888.com| www,奇米影视| 99热天堂| 再次出发二| 综合日本婷婷| 五月亭亭六月天| 婷婷五月六月激情| 激情床戏| 任你躁XXXXX麻豆精品| 丁香五月天成人网站| 玖玖综合色| 岛国AAAV| 日本99久久| 色欲天天综合| 日韩黄黄| 97操资源婷婷| 日韩色色视频| 26uuu另类亚洲欧美日本一| 五月婷在线观看| 婷婷的五月天另类视频| 色综合久| 日本五月天一页| 99这里有精品久久97| 久在线综合69| 人人干人人看| 丁香五月婷婷基地| 色天天狠狠干| 婷婷五月丁香六月| 99热 日韩| 99热在线观看免费精品| 自拍盗摄 另类| 五月色 亚洲| 8区视频在线| 久久久婷丁香五月| 婷婷91| 婷婷爱五月| www.av骚货| 国产婷婷色五月| 九九热re99re6在线精品| 夜夜嗨一区二区三区直播内容 | 欧美激情综合五月色丁香| 色色色色色色色色五月先| 精品久久久久久久人妻| 天天色天天搡| 大香蕉伊人99| 99色免费在线观看| 婷婷五月色播天| 五月丁香色婷婷| 欧美三级欧美一级| 亚洲激情免费视频观看| 色五月开心开心五月激情五月| 99色热视频| 五月丁香婷婷色播无码| 九色综合网| 中文字幕在线观看视频www| 久久性操| 激情五月天偷拍综合网| 九九视频这里只有精彩| 五月丁香六月婷婷综合免| 天天爽在线视频| 亚洲小电影在线观看黄999| 欧美三级级99久久| 欧美一级a| 亚洲爆乳无码精品AAA片蜜桃 | 操操操91| 31色区视频免费看| 五月婷婷六月激情| 日本操B视频| 无码人妻少妇色欲AV一区二区| 六月丁香五月天| 成片免费观看视频大全| 五月丁香婷婷久久| 97干视频在线| 成人综合视频在线| 天天天天操| 99er在线观看| 99热精品9| 亚洲小说欧美激情| SS丁香五月婷婷| 久热这里只有精品99re,久热这里只有精品7 | 97超碰免费超级在线观看| 99综合网| 久热婷婷综合| 国产肥白大熟妇BBBB视频| A片试看120分钟做受图片| 欧美电影在线观看| 婷婷中文字幕网站| 色色综合网www| 97 天堂| 五月美女婷婷风骚| 亚洲精品国产熟女久久久| 夜精品无码A片一区二区蜜桃| 日本啪啪网| www.minyis.com【JT】实力收量可预付QQ2101460746 | A久网| 婷婷丁香五月亚洲| 天天日天天操天天干| 五月玖玖| 97色色-99久久| 丁香六月天婷婷在线| 夜夜操少妇| 亚洲激情综合五月婷婷啪啪| 新精品99| 婷婷网五月天| 色五月综合激情| 亚洲激情婷婷| 国产精产国品一二三在观看| 国产欧美精品AAAAAA片| 丁香八月综合激情| 91xxxx九色| 色丁香久久| 天天拍夜夜撸| 婷婷色成人| 日本熟妇乱妇熟色A片蜜桃 | 亚洲黄色网址| 日韩无码AV电影网站| 丁香五月激情网| 操操操Av| 五月婷婷欧美| 欧美激情VA永久在线播放| 国产成人精品一区二三区熟女在线| 综合激情婷婷| 91干婷婷| 日本操片| 久色视频首页| www,婷婷| 六月婷婷五月天| 国产伦亲子伦亲子视频观看| 激情五月婷黄版| 91精品久久久久久77777| 天天摸日日舔狠狠添婷婷婷| 开心网五月色婷婷| 色五月婷婷色| 禁片二区| 26uuu国自产精品| 婷婷丁香五月欧美人| 久久五月网| 三人荫蒂添的好舒服A片| 综合一区二区三区| 五月天成人在线视频丁香| 五月丁香激情综合| 日日日日日| 五月天婷婷涩涩| 激情综合网丁香| 天天爽,夜夜爽| 欧美成人精品A片免费一区99| 91精品刘玥| 99热综合| 99综合色| 超碰人人在线| 久久久久久久久久久97| 思思热在线视频99| 九九热自拍| 色都都狠狠色都都色综合色| 99 r热| 51国精产品自偷自偷综合| 婷婷97| 伊人久久五月天| 美女妹子后射视频网站在线观看| 婷婷五月激情图片| 99热 在线播放| 久香草视频在线观看| 99这里有精品视频| 大香人妻| 6080av| 天天做天天爽| 欧美大片免费观看| 99re热精品视频国| 亚洲区视频| 密视AV综合在线| 青青草六月丁香| 五月天综合视频| 成人 视频免费观看网站| 九九久久视频| 色一情一乱一乱一区91| 国产亚洲精品久久久久久久久动漫| 91网站黄| 婷婷中文字幕网| www,setingting| 五月婷婷综合色啪首页| 老司机日日夜夜青草| 97视频91| 青青草成人网| 久操大屁股女人av| 特黄三级片| 丁香五月婷婷亚洲综合精品| 激情图片99| 五月天国产婷婷精品视频在线| 成人丁香婷婷| 99热在线免费观看精品| 色婷婷狠狠18禁| 色婷婷大香蕉| www.久久久久久久| 波多婷婷久久| 丁香五月av在线| 9九九久久精品无码专区| 国产成人VA| 国产SUV精品一区二区6| 99久久66| 五月婷婷影院| 综合激情啪啪| 六月丁香婷| 五月天婷婷久色| 亚洲日韩一页精品发布| 色 丁香婷婷| 97精品人人A片免费看| 五月噜噜|