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
返回資訊列表
99热个人在线| 九九色中文| 五月婷婷综合丁香视频| 丁香五月婷婷动漫| 丁香五月婷婷国产av| 久久偷拍综合五月天| 大香蕉天堂| 色狠狠综合| 日韩在线aaa| 日本三级中国三级99| 成人片在线播放| 五月花激情| 99热www.| 99er6| 色噜噜狠狠色综合网| 国精产品一区一区三区免费视频| 日日夜夜狠狠| 伊人久久婷婷| 五月天婷婷丁香| 99er热精品视频| tingting五月天亚洲| 综合五月丁香97| 丁香五月狠狠在线观看| 99视频综合| 欧美一级色| 日韩一本操| 日本色色色色色色色色一色二色| 99九无网码| 婷婷五月天影院| 五月丁香啪啪| 国产伦理精品高清在线观看网站一区二区 | 久9视频| 又大又粗九一在线| 蜜桃五月天| 91九色首页| 色婷婷小说网| 色婷婷国产精品综合在线观看| 欧美丁香五月天| 亚洲激情无码久久| 激情伊人六| 婷婷五月天综合激情| 丁香五月天激情四射网| 国产精品人妻在线网址| 大香蕉伊人久久| 丁香五月婷婷色偷偷| 激情亚洲婷婷六月| 婷婷.com| 五月丁香六月婷婷网| 深爱激情网五月天| 婷婷五月激情的图片| 五月丁香淫淫婷婷婷| 综合五月激情| AV性爱网| 色五月色五天色情网| 亚洲久久激情| www.久久久.com| 激情综合网址| 亚洲妇女熟BBW| 噼里啪啦完整版中文在线观看| 丁香五月激情网| 亚洲中文乱字字幕在线永久| 国产偷人爽久久久久久老妇APP| 五月天激情网图片| 超碰操日| 综合久久五月天| 色月九九| 激情五月综合六月丁香婷婷狠狠干| 天天干夜夜操A片| 五月婷婷五月天激情视频| 五月婷婷久久开心网| 99热网精品| 草草女人亚洲| 婷婷综合在线播放| 99高级会所久久| 色爱综合视频| 五月婷婷激情综合网| 五月天婷婷综合免费| 五月婷婷九| 欧美日韩123| 丁香五月天色婷婷| 丁香花综合永久入口| 五月天大香蕉AV| 97色天堂| 天天干天天干天天干天天干天天干天天| 色五月av伊人| WWW,五月| 婷婷五月天A V| 色色网91| 亚洲AV激情五月综合网| 婷婷久久精品| 色婷天天| 玖玖婷婷色五月| 八戒青柠影视剧在线观看| 国产做爰视频免费播放| 亚洲爱婷婷| 99久在线视频| www狠狠| 欧美 日韩 成人在线| 激情综合网址| 九九视频精品在线免费| 婷婷成人AV| 色色五月天激情| 亚洲无码影音| 亚洲婷婷五月天综合| 五月丁香六月婷综合成人综合| 婷婷久久色| 欧美内射AA| 人妻丰满精品一区二区A片| 丝雨一区二区| 五月婷婷开心激情六月蜜桃| 综合色五月天| 亚洲无码激情| 色综合网综合| 激情五月综合网| 97色综合视频| 逼逼AV| 色婷婷9| 欧美成人猛片AAAAAAA| 日本在线wwww| www激情网| 亚洲av成人在线| 影音先锋 萱萱| 91久久综合亚洲鲁鲁五月天| 婷婷婷婷婷开心无码播放| 超碰在线国产| 日本三级中国三级99| 丁香五月天av| 激情AV| 碰碰碰97免费精彩视频| 亚洲精品中文字幕成人片| 99成人网一区| 天天日天天干天天操| 精品一区二区三区免费毛片爱| 四射综合网| 第四色色六月色综合| 五月婷婷在线视频观看| 99热伊人综合| 五月天婷婷色播在线网| 丰满老熟妇BBBBB搡BBB| 天天做综合| 久久婷婷五月综合色丁香| 狠狠久久婷五月综合色| 甈你aaaaa| 91久久99久久91熟女精品| 玖玖热99| 激情五月天综合网| 丁香六月激情毛片| 天天做夜夜爽| 青青草Avb在线| 免费观看的AV| 337久久| 小视频在线亚洲| 亚洲综合九九| 九九Av| 99久久免费性爱视频`| 丁香五月婷久久| 人人艹艹艹| 区区久久妻| 伊人激情综合网| 99精品偷拍视频| 色久五月天| 国产AV一区二区三区最新精品 | 影音先锋一区| 久色欧美| WWW、99热| 色欲婷婷五月天丁香| 五月婷婷说| 91|疯狂丨高潮丨对白| 97色色色视屏| 日本人妻伦在线中文字幕| 天天做天天要天天爱| av九九| 久久综合干| 激情丁香五月| 久热九九| 人人摸人人干| 五月天婷婷高清无码| 婷婷五月丁香亚洲| 99热这里只有精| 国产4P视频精品五区| 思思热精品在线观看| 色99在线| 久热这里只精品| 婷婷五月天综合网| 婷婷丁香五月天在线| 日韩人妻白浆视频系列| 天天做天天爱天天综合| a九九热www| 91色吧网| WWW.激情| 伊人久久大香线蕉亚洲五月天,| 五月天精品综合| 亚洲天堂制| 99热这里全都是精品| 丁香六月色| 玖玖婷婷综合| 亚洲丁香五月天在线视频| 国产精产国品一二三在观看 | 日本超碰在线| 人人爱天天摸摸天天爱| 久久一级免费黄色片| 久久999久久999久久999久久| 激情性爱五月| 无遮挡国产高潮视频免费观看 | 丁香五月成人网| 色婷婷88| 成人.在线日韩| 婷婷婷婷婷开心无码播放| 超级碰碰碰碰视频| 国产69久久久欧美黑人A片 | 欧洲区自拍| 色婷婷五月在线| 这里只有精彩小视频视频网站| 91操人| 激情五月丁香六月婷婷| 99色综合网| 99热综合| 26uuu欧美| 99视频精品全部免费看| 亚洲成人在线观看网址| 婷婷六月色| 亚洲激情精品| www.激情在线| 人妻aV在线| 大地9中文在线观看免费高清| 色日本网| 久久99热这里只有精品23| av免费在线观看0| 91九色视频在线观看| 激情婷婷内射| 五月婷婷色综图片| 99久久国产综合精品五月天喷水\| 丁香六月激情综合| 这里只有免费的精品| 色五月婷婷1| AV中文在线| 六月丁香VA| 丁香色婷婷| 五月 婷 久| 丁香五月Av| 丁香五月另类小说| 97色伦另类图片小说视频| 涩 五月 婷婷 狠狠| 久久久中文| 996er热| 五月丁香六月婷婷,婷| 另类图片五月天婷婷| www五月| 伊人五月综合网| 色五月亚洲五月天| 桃色Av色哟哟| 丁香激情网| 激情综合文学| 国产精产国品一二三在观看| 99视频久久免费视频| 欧美日韩成人高清在线| 色色97丁香婷婷五月天| 无码成人播放器| 综合色图区| 26uuu亚洲欧美日本| 亚洲婷婷月丁香五月| 免费黄色AV| 加勒比久热| 少妇水多A片太爽了| 五月婷婷欧美| 激情久久肏屄视频| 91干视频| 久热 91| 婷婷深爱五月| 五月天激情久久| 久久99成人性爱高清视频| 熟女激情网| 人妻aV在线| 人人97操| 激情碰碰碰| 影音 五月 婷婷 久久| 青青青在线视频国产| 五月婷在线观看| 欧美日韩成人在线网| 色婷婷狠狠干芒果TV| 色久在| 婷婷成人网五月天| 99丁香五月婷| 99色看| 中文字幕簧片| 天天 青草 丝袜制服 在线| 99热国产国产| 五月中旬婷婷丁香六| 五月激情另类| WWW.开心五月天.COM| 五月天成人在线视频丁香| 久久视屏这里只有久久| 亚洲激情五月婷婷日日| 婷婷九月丁香久久| 99精色| 婷婷五月在线播放| 婷婷丁香五月综合| 这里只有精品久久| 91九色中文| 1024在线视频| 色色网站| 欧美色综合天天久久综合精品| 天天综合色| AAA久久| 欧美美女视频| 婷婷丁香大香蕉| 日日撸夜夜操| 67194成I人在线观看线路1| 久久狼人天堂| 欧美激情综合| 激情五月天.色网| 天天综合网色欲香| 久草五月婷婷| 99区视频| 这里只有精品免费 | 97色色婷婷五月天| 亚洲性爱干干| www激情五月天| 婷婷五月天开心激情网| 91超级碰| 丁香综合日产精品久久| 激情九九六月激情免费视频| 99精品在线播放| 五月婷婷亚洲天堂激情在线| 五月丁香狠狠| 色综合色五月| 婷婷五月丁香基| 新男人天堂人妻| 亚洲啪啪网| 色五月综合| 狠狠操天天操| 丁香婷婷影院| 亚洲色婷婷| 午夜激情四射影院| 国产AV一区二区三区日韩| 中文字幕有多少字| 激情中文在线| 停停色综合伊人| 丁香激激情网| AV在线资源| 性做久久久久久久免费看| WWW色色色COM| 99热综合在线| 五月婷婷六月丁香在线| 99精品久久| 九九九九热99超碰| 日韩色色网| 色噜噜婷婷| 色噜噜狠狠色综合网| 九九色精品| 91久久国产自产拍夜夜91久久精品文字>91麻豆精品国产 | 日韩精品呦呦va| 五月婷婷啪啪啪| 六月丁香深深爱| 97色色色| 一级AV片| 国产99热在线看| 亚州色色色| 亚洲精品大片| 91青娱乐青青草| 亚洲色情激情丁香五月| 人妻性爱| 99热在线观看| 《丁香激情综合久久伊人久久》影视在线观看 -高清预告手机免费播放 -三妹影院 | 禁片二区| 台湾佬天天日丁香婷婷五月天| 99久在线观看| 2016日日夜夜操| 六月丁香深深爱| 亚洲午夜电影| 九九九九九九九九九九九九九国产精品| 色婷婷电影| 99av视频| 97色五月婷婷在线| 色五月婷婷 成人| 五月丁香六月婷婷激情视频在线观看免费| 亚洲亚洲人成综合网络| 性爱综合网| 第五色色色婷婷| 热思思九九| 丁香五月婷婷啪啪啪| 日婷婷久久开心| 色五月情| 99色丁香婷婷综合网| 五月婷在线观看| 色综合久久88| www.99热| 狠狠综合久久| 久久香蕉福利| 久久伊人9| 久操大屁股女人av| 色五XX| 国产成人精品一区二三区熟女在线 | 九九热精品| 婷婷精品在线| 婷婷六月啪啪| 亚洲av成人在线| 五月婷婷丁香婷婷| 在线看黄色| 五月婷婷之美女图片| 久久综合五月天| 五月丁香美女视频| 99热这| 操逼毛片国语对白| 九九热av| 五月婷婷在线丁香| 色色无码| 婷婷成人在线| 爱爱网址9| 天天婷婷操| 成人看片网站| 岛国av网| 亚洲欧美综合7777色亭亭| 五月天久久婷婷婷| 日韩丁香涩| 狠狠色激情综合| 久久久精品色色色| 97碰操| 五月天网站亭亭| 五月丁香A∨在线| 激情五月天小说|五月天开心激情网|亚洲精品国产自在现线|黄色五月天 | 婷婷五月花| 5月婷婷6月丁香aV| 九月丁香八月婷婷加勒比| 99久久99热这里只有精品| 蜜桃五月天| 99热青青草原| 一区二区你懂的| 日韩三级高清无码| 欧美人人操| 伊人婷婷五月天| 色综合播放| 日逼影音先锋男人AV资源站| 日本婷婷色日| www.婷婷五月| www.夜夜| 这里只有精品视频在线| 日本综合久| 五月丁香成人网| 中文字幕簧片| 色色五月激情| 久久婷婷综合五月天| 激情丁香淫荡婷婷| 天天操精品| 99re这里只有精品国产99| 免费视频WWW在线观看网站| 99色视频在线观看| 97人操人免费视频| 五月综合视频| 九九久热| 人妻射精AV| 91 影音先锋| 色五月婷婷小说亚洲中文字幕组| 九九精品网站| www,99热在线观看| 在线另类| 天天操狠狠操| 久九色| 密着浓厚中出乚交尾GvG935| 六月婷婷色色色| 五月天国产成人| 万月丁香狠狠爱| 久久人妻视频| 婷婷五月精品在线| 色域五月婷婷丁香| 久9综合| 欧美三级欧美一级| 五月丁香六月情亚洲| 97超碰在线免费观看| 欧美日综合| 色婷婷AV久久久久久久| 丁香五月婷婷五月天在线| 中文AⅤ大全| 婷婷五月色播放| 五月丁香激情欧洲啪啪| 色婷婷五月影视| 五月刺激丁香月综合| 五月色亭丁香| 3p久久| 五月天电影网| 久久久18| www.激情五月| 五月激情综合深爱| 色9色| 五月婷婷深深爱| 99视频这里有精品| 激情色色| WWW.17C亚洲精品| 天天干天天操天天上| 99碰碰视频| 1级欧美日韩| 六月婷婷色| 九九热在线精品| 情情五月天色| WWW·天天操·视频?| 久久加勒比| 午夜伊人大香蕉| 亚洲色五月婷婷| 99色综合| 五月天六月婷婷| 少妇口诉沐足视频播放器网址| 日韩综合网络男女香蕉a片| 九九久久腿| 五月丁香亭亭| 欧美色五月| 丁香五月先锋| 五月久视频| 5月婷婷激情6月| 开心五月综合激情网| 四虎成人精品永久免费AV九九| 久久丁香| 91成人电影| 日韩av在线播放综合网| 日韩免费视频| 欧美日韩成人在线| 高清无码网址| 欧美99热| 色999五月色| 色色色色五月天| 天天做天天爽| 97操碰在线视频| 79色色| 激情色情五月天| 久久99热 这里有精品| 国产激情综合五月| 色色色在线免费视频| 激情综合五月| 久久狠狠高潮亚洲精品 天天摸夜夜摸夜夜狠狠摸 | www久久艹| 成人AV网站在线| www.九月婷婷丁香.com| 色婷婷啪啪| 欧美日韩一区二区三区四区| 91在线97视频| 一区二区三区XXXXXX| 五月婷婷丁香五月| 色婷成人狠干| 国产熟女一区二区三区五月婷| 182TV亚洲| 99热这里只有精品9| 欧美久久婷婷| 久久婷婷综合五月天| 综合网亚洲| 大香蕉av在线| 色香蕉精品五夜婷| 91国产精品视频播放| 97伦色婷婷| 中文字幕+中文在线| 18久久| 久9视频免费播放| 色私五月婷婷| 五月天激情综合网俺也去| 丁香五月精品视频| 五月综合777| 色五月天天| 五月天电影网| 日日干日日| 9久视频| 色优久久| 伊人天堂婷婷| 99在线视频精品| 日韩色色网| 色婷綜合网| 99热精地址| 五月丁香六月婷| 色情五月婷婷| 婷婷五月天综合亚洲| 9 1 A v久久久| 91ncm视频| 玖月婷婷爱丁香| 另类激情五月| 婷婷五月天社区| 99热思思| 午夜av网| 五月Huangsewang| 97伊人综合婷婷| 婷婷操逼| 色狠狠综合| 成人婷婷| 思思re最新视频| 在线超碰91| 人人澡天天色天天做| 激情婷婷六月| 国产 亚洲 在线| 精品一二三区久久AAA片| www.com在线操视频免费观看| 玖玖五月| WWW、日本色丁香、co m| 五月婷婷天天| 狠狠干综合| 色欧美日| 伊人干练久| 99视频网址| 国产精品久久欧美久久一区| 丁香五月综合久久综合| 天天上天天爽| 91九色中文字幕女在线观看| 九九视频在线观看视频6| 亚洲婷婷激情综合激情999精品| 日日噜狠狠色综| 日本色视| 伊人久久丁香狠狠婷婷综合香蕉| 久久婷婷啪啪视频| 99热这里只有精品2| 天天狠狠夜夜狠狠2023| 婷婷干六月综合旧址| 成年AAAA色情| 女同激情久久av久久| 激情五月婷婷综合秋霞| 久久久思思热| 色五月婷婷激情综合网| 第四色大香蕉| 97超级碰| 日本狠狠爽| 97人人操在线| 日本一级大片| 天堂AV在线看| 白人荫道BBWBBB大荫道| 久久er视频6| 激情五月天色播| 九九热狼人| 99热国内| 六月婷婷综合| 26uuu青青| 激情人妻综合| 色九九丁香九月色九九色| 九九九九九九九热| 亚洲精品无人区| 蜜桃婷婷五月| 99re在线观看| 五月丁香婷婷综合网| 超碰高清在线| 69精品人妻不卡视频| 这里只有精品在线免费视频| 尤物一区二区| 五月噜噜| 六月婷婷毛片| 久久99色色| 老师的粉嫩小又紧水又多A片视频 粉嫩AV久久一区二区三区 | 一区二区中文字幕| 日日操夜夜爽| 婷婷五月天中文字幕.| 国产91视频| 亚洲综合视频网| 六月婷婷久久| 久久多色| 大香蕉婷婷| 色香蕉影院| 激情五月天丁香| 97热视频| 天天插天天射| 日本www五月婷婷| 天天日天天插| 国产一级婬片毛片| 午夜微拍福利| 丁香五月天在线观看| 超级碰人人操人人干| 色情婷婷五月天| 丁香久久九九99| 五月婷婷五月天在线| 熟女啪啪视频| 免费黄色片子| 97丁香花五月天激情小说| 99热久久这里只有精品| 思思热热久久| 色婷婷色和| 99色色网| 亚洲综合九九| 免费看欧美成人A片无码| 五月丁香六月婷婷色| 99色热综合| 色五月综合在线| 丁香五月AV| 国产激情综合五月久久| 狠狠狠狠免费| 热99.com婷婷| 成人一级片| 婷婷五月天在线看| www.色五月| 天天久综合| 欧美在线操| 99久久网站| 久久人妻情侣| 婷婷五月天涩涩| 99精品视频偷拍| 中文字幕在线播放视频| 亚洲亚洲人成综合网络| 99热成人在线| av色婷婷| CHINESE熟女老女人HD视频| 色久综合天天做视频| 久久久九九九 99| 久久九九网| 色五月丁香五月激情五月激情| 成人亚洲精品久久久久| 天天天操天天天日| 亚洲欧洲国产精品| 天天做天天爱天天爽| 欧美va亚洲va在线播放| 婷婷五月色影视先锋| 综合激情站| 狠狠干伊人| 九九精品99久久久| 69精品人人人人| 色五月六月| 五月婷成人| 天天日天天肏天天奸| 成人电影在线免费试看| 电影《战争与艾拉》免费观看| www.第四色99| 婷婷九月激情| 思思热久久久在线| 色婷婷在线播放| 超碰人人在线| 日本五月婷| 丁香六月激情综合| 六月丁香啪| 激情五月婷婷| 婷婷五月天第三页| 另类色视频| 97热久久五月婷婷| 一本大道嫩草AV无码专区| 美国十月色婷婷在线观看| 色婷婷五月六月丁香综合视频| 精品国产a| 婷婷五月激情小说| 免费看成人747474九号视频在线观看| 久久人妻乱子伦| 99超碰在线观看| 国产FREESEXVIDEOS性中国| 天天xxxxxx天天日| 丁香五月性| 天天操天天插天天射| 欧美性爱五月天| 深爱五月天| 无码人妻一区二区三区免费九色| 91九色网| 99日精品视频| www.99操| 久久激情中文| 五月天激情影院| 五月天伊人综合| 婷婷五月色網站| AV天堂淫乩| 天天操加勒比| 丁香六月婷婷色播| 波多婷婷久久| 大战熟女丰满人妻AV| 超碰在线人妻| 欧美日比视频| 开心色五月天久久久久久久| 亚洲性图一区二区| 五月天六月丁香| 伊人久久艹| 99ri视频在线播放| 久久久九九九 99| 国产,欧美,学生妹,视频| 思思99热| 五月婷婷激情综合| 草一草avb| 久久怕怕视频| 欧美成人性爱网| 欧美va| www.十八禁不禁AV.com| 色色色综合视频| 激情深爱综合| 婷婷91| 亚洲九区| 日韩狠狠色| 亚洲综合视频网| 国产激情在线| 国产综合色婷婷精品久久| 五月丁了香蕉综合| 9 1在线视频| 人人97操| 日韩综合久| 六月婷婷最新网址| 婷婷丁香社区| 九月婷婷综合网| 91精品久久久久久久久 | 久久99这里只有精品视频| 婷婷四月 成人 狠狠干| 婷婷 久综合| 99国产小视频2013| 欧美激情Va| 色婷婷在线视频久| 激情婷婷另类| 久久婷婷丁香六月天| 婷婷五月天美女视频| 岛国av电影网站| 九九九九这里只有精品| 五月天婷婷婷| 狠狠99| 成人婷99最新| www.久久久久| 久久小视频| 九月激情婷婷丁香| 亚洲黄网在线| 国产免费av在线| 26.uuu丁香五月婷婷| 大香蕉啪啪啪| 人人澡天天色天天做| 手机激情网| 欧美99热| 天天操天天操天天操天天操天天操天天操| 五月开心啪啪| 色婷婷丁香五月| 激情99。| 久久久久九九九九视屏小说88| 丁香丁婷五月激情| 日韩野外 无套| avh片在线观看| 免费成人中文字幕| 丁香久久综合| 久久只有精品| 热成人网| 色综合色综合网| 色色综合网站| 曰本aaaaaa丈片| 热99免费在线| 亚洲一色色色色色色色色| 亚洲Av入口| 色综合天天综合成人网| 另类专区在线| 国产真实乱了老女人视频| 超碰成人影视| 久久婷婷视频| 久久久久久久久久8888| wwwC0maV五月花| 国产成人+亚洲+欧洲| 色99色| 五月天婷婷色色| 久久性都花花世界成人免费视频| 婷婷97碰碰| 五月天另类综合网| 99爱视频| 亚洲欧洲另类| 9久久网| 九月丁香婷婷综合激情| 亚洲视频99| www.minyis.com【JT】实力收量可预付QQ2101460746 | 一起草日本| 国产韩日亚洲美州欧亚综合在线| 九九操综合网| 成人AV在线电影| 逼特逼在线免费播放| 五月丁香成人| 亚洲国产婷婷色五月| ji'qi'luan'ren'lun| 久久色情| 日本在线视频看se99| 青青草a在线| 99热这里只有精品首页| 开心五月婷婷| 色播播婷婷| 五月天激情子轮| 九九香蕉网| www,99色| 69五月天视频| 欧美图片丁香五月天| www.成人婷婷综合| 99看片| 少妇高潮A片无套内谢麻豆传| 久超超碰| 97人凄人人操人人爽| 亚洲性色XXXXX| 午夜天堂啪啪| 综合www色| 丁香色情五月综合网站| 九九这里都是精品| 另类激情码| 婷婷丁香五月亚洲| 天天插天天射| 99热九九这里只有精品| 五月天婷久精视频| 9色资源在线| 色之综合网| 色婷久久| 久久婷婷激情四射五月天| 狠狠干青青草| 97高清国语自产拍| 亚洲激情AV| 超碰在线免费9| av操B网站| 丁香五月天av| 97色碰| 婷婷五月天最新综合你懂的| 激情综合网激情五月天| www网站在线观看| 狠狠狠狠狠操| 专区无日本视频高清8| 99er这里只有精品| 97操碰视频| 9热在线观看| 开心五月深爱婷婷| 国产特黄色精品一区二区三区精品无广告| 安息电影在线观看完整版| 伊人超碰| 九九热这里只有精品5| 美女激情综合| 在线天堂9| 九月丁香八月婷婷久久综合久97| 69er小视频| 日韩av手机在线观看| 五月天天丁香婷婷在线中| 丁香六月婷婷缴情欧美| 99操碰| 久9久9久9久9久9久9| 色色99| 欧洲精品爱爱| 青草激情综合| 激情五月天婷婷丁香| 欧美丁香婷婷五月| 国产免费av网站| 色五月天综合网| 操日本色| 色天堂在线| 五月综合丁| 99∨VTV| 久久久.COM| 久热一本| 轮奸综合网| 丁香五月六月综合激情| 色综合爽| 九九热123| 台湾佬天天日丁香婷婷五月天| 久久五月婷综合| 丁香综合网| 亚洲精品网址| www.91在线观看| 亚洲丁香花色| 国外亚洲成AV人片在线观看| 狠狠88综合久久久久噜噜噜| 老妇六区| 九九在线这里只有精品视频| 久久玖玖综合| 久操无码| 日本va网站| 激情婷婷激情在线不卡| 久久九九免费视频| w婷婷五月婷婷w| 九九av| 五月丁香婷婷婷婷综合网| 狠狠干.com| 丁香五月激情五月| 亚洲国产精品成人免费一区久久久在线观看AAAA | 色婷婷狠狠爱| 丁香五月综合久久八| 97亚洲视频在线| 就去涩涩丁香五月天| 99在线视频女女视频| 亚州操人在线视频| 色五月激情五月丁香五月婷婷啪啪综合| 欧美婷婷丁香社区在线播放| 深爱激情婷| 五月天色色网站| www.夜夜| 婷婷五月天啪啪| 色狠狠综合网| 专区无日本视频高清8| 亚洲亚洲永久无码777777| 五月婷婷激情性爱| 啪啪啪大香蕉| 六月色播| 99热欧美在线观看| 五月婷婷久草| 五月婷婷激情网| 丁香婷婷人妻综合网| 激情五月婷婷啪啪| 深爱激情五月天| 丁香五月六月婷婷殴美综合| www九九热| 成人超碰网| 91超碰在线观看| 开心五月激情五月丁香五月婷婷| 丁香六月婷婷开心婷婷网| 亚洲成人免费电影| 日韩在线aaa| 在线va网站| 色五月中文字幕| 婷婷丁香六月| 久青草影院| 99热这里只有在线播放| 嫩草视频观看| 超碰成人黄色网| 91丨九色丨熟女|老版| 九九久久这里只有精品XB| 婷婷九月在线| 最新无毒无码AV| 97人人干| 婷婷五月天激情五月天深爱五月天| 欧美日韩一a.无| 亚洲视频在线网| 日日爽夜夜爽| 91成人视频| 天天射夜夜骑| 无码一区二区三区四区五区| 丁香婷婷五月人体| 欧美精品在线观看| 九月丁香婷婷| 天天爽天天摸天天爱| 五月婷人妻| 99ri久久| 丁香玖玖视频大全| www.第四色99| 99热免费| 亚洲精品无码久久| 夜夜爽日日躁| 色五月婷婷中文字幕在线观看 | 91碰超| 久久9情免费| 风流少妇A片一区二区蜜桃| 色玖玖综合网| 欧美日本va| 久久99热精品a片在线观看| 五月天婷婷AV| 中文字幕日产A片在线看| 亚洲无线视频| 天天激情站| 婷婷五月天视频亚洲| 九九视频在线免费视频| 97久久超碰| 好看的国产精品| 99热全是精品| 天堂久久久久天堂网| 色婷婷成人做爰A片免费看网站| 99热在线精品观看| 超碰人人99| 思思热这里只有精品| 色综合网综合| 5月婷婷六月丁香| 五月丁香婷婷五月色| wwwss在线观看| 日韩另类| 色99在线视频| 五月天婷婷伊人| 视频一二区| 久久密臀婷婷| 色六月 婷婷| 婷婷丁香中文字幕| 男男野外做爰全过程69| 激情网五月天| 亚洲乱码日产精品BD| 99热思思| 中文字幕在线观看视频www| 天天弄天天操| 夜夜操天天干| 俺去也五月| 国产精品大香蕉| 亚洲中文乱字字幕在线永久| 99热综合网| 这里只有精品2| 桃色五月天| av中文在线| 色婷婷狠狠| 欧洲MV日韩MV国产| 激情亚洲五月| 久久人人添人人爽添人人片αV | 99热这里只有精品23| wwccc久久久| 色五月婷婷激情五月| 亚洲精品小视频| 国产资源91在线| 能直接看的av网站| 综合久久五月天| 天堂综合久久 | 超级碰人人操人人干| 午夜丁香 婷婷| 色婷婷综合影院| 啪啪激情网| 深爱丁香网| 欧美性丁香色色五月天综合爱爱| 深爱五月天 开心网| 婷婷五月天日日日干干干| 色五月丁香伊人| 婷婷五月在线视频| Av九九| 色五月首页| 婷婷五月欧美综合| 九九色黄色| 久久婷婷五月综合激情国产| 色婷婷久久| 亚洲精品操一操、噜一噜、摸一摸、爽| 777精品成人a v久久| 六月婷婷久久大全| 99精彩视频| 五月婷婷婷| 91无码色色| 久碰久| 91干| 思思热在线精品视频网站| 99热这里只有精品最新| 亚洲永远av在线播放| 激情综合五月婷婷六月丁香| 色色影院黄大片| 五月婷婷六月丁香| 1024欧美看片| 五月婷婷黄色毛片| 人妻综合网| 精品色色网| AV性爱在线| 五月丁香婷婷综合| 色九九中文字幕| 色婷婷AV在线| 五月婷婷啪啪啪啪| 丁香五月激情综合婷综| 91热久久| 婷婷五月天激情五月天网站| 欧美视频五区| 色综合久久久久| 丁香五月婷婷影院| 淫荡家庭AV| 天天舔天天摸天天透| 国产综合色婷婷精品久久| 欧美 日韩 人妻 高清 中文| 碰人人97| 成人va在线观看视频| 色五月激情婷婷| 99热欧美| 久久99草五月婷婷| 天天色综合天天| 久热只有这里有精品| 激情五月天小说|五月天开心激情网|亚洲精品国产自在现线|黄色五月天 | 操操天堂| 色网五月婷婷| 日本3级片偷拍网站| 色婷婷成人影片| 97干在线播放| 色色色色色色综合网| 黄色一级影片| 亚洲色色精品| 亚洲热视频在线| 无码AV免费精品一区二区三区| 丁香六月婷婷综合啪啪| 丁香五月天激情小说| 激情都市丁香婷婷| 免费无码毛片一区二区A片 | 婷婷久久18| 色天天综合色| 97人妻碰碰碰久久香蕉| 免费91久久精品| 天天五月香欧美| 日本婷婷色日| 久久9热好| 深爱五月月天| 五月天国产| 亚洲无码影音| 九九家庭影院| 久色欧美| AV片一区在线观看| 亚洲热手机在线观看| 大香蕉久久婷婷| 久久婷青青草原| 99超在线| 丁香六月婷婷久久综合| 5月丁香综合图区| 日本色频| 丁香 婷婷 亚洲 熟女| 99热亚洲| 亚洲婷婷丁香五月| 狠狠狠狠狠狠狠狠狠狠狠色宗合图片| 五月丁香久久| 99综合网| 视频一区二区在线| 九九热色视频| 五月天丁香成人| 无码免费人妻A片AAA毛片西瓜| 色玖玖导航| 色狠狠综合网| 久久九色| 欧美综合五月丁香六月婷| 无码区婷婷五月花开| 色碰97| 五月天激情图片| 精品99网站| 99综合网| 日本wwww在线| 五月色婷婷激情| 中国女人内射6XXXXX| 欧美在线视频99| 大香蕉九九| 操久久网| 99在线热视频| 激情久久久久久久久久| 9久热这里只有精品视频| 狠狠色综合网| 99re在线视频| 97人人搞| 久久激情五月天| 97色色色| 九九综舍久久| 色色五月天丁香婷婷| 成人免费在线电影| 五月天激情图片| 中日韩狠狠色| 五月婷婷|欧美| 九九99男女视频在线观看| 99精品热| 97九色视频| 亚洲AV网站| 99热这里| 九九热在线99| 日韩色色色99| 五月天开心网| 婷色成人| 婷婷丁香无码专区| 色综合色综合色综合| 婷婷五月综合基地| 丁香五月激情啪啪| 色婷成人狠干| 丁香激情久久| 久久婷婷色| www.超碰在线| 婷婷丁香一月| 五月丁香婷婷欧美色图视频五月丁香777电影| 米奇激情婷婷| 5Www色5夜| 看全色黄大色大片| 亚洲天堂啪啪| 六月天婷婷| 天天撸夜夜爽| 中文字幕在线人妻| 野战毛片三一3| www99久久| 五月天激情婷婷| aaaaa不卡| www.色婷婷.com| 亚洲VA在线| 碰人人操| 最新色色五月天| 麻豆科斗777| 9色资源在线| 日日日日日| 五月丁香婷婷基地| 欧美成人精品A片免费一区99| 天天舔天天摸天天透| 亚洲AV无码影院| 成人在线网| 啪啪干伊人婷婷| 人妻在线网站| 97色色婷婷| 午夜 外网 精品 在线| 中文字幕丰满乱孑伦无码专区| 天天肏天天肏天天肏| 日日噜狠狠色综| 91精品国产综合久久久不卡电影| 婷婷五月天视频亚洲| 亚洲小视频免费播放| 色五月婷婷在线观看第一页舔| 超碰1999| 激情综合五月婷| 久99久视频精品| 色婷| 激情内射人妻1区2区3区| 五月六月丁香激情| 丁香五月在线人妻| 亚洲成人电影在线免费观看| 开心激情网五月天| 婷婷五月色播网| 久久99久久99精品免视看婷婷| 日本性激情色播| 色五月成人| 五月刺激丁香月综合| 精品乱码久久久久| 日本熟女内射| 亭亭五月丁香综合欧美|