欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,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
返回資訊列表
欧美精品啪啪| 色噜噜丁香| wuyuedingxiang| 678五月丁香亚洲综合| 99精品视频在线观看| 99热主页日本| 五月天婷婷小说| 噜色精品| 99ri精品在线观看| 丁香五月婷婷AV| 欧美在线97| 黄网免费观看| 五月天久久婷婷婷| 亚洲精品444久久久久久| 五月婷婷综合久久| 91人妻人人操人人爽| 色射影院| 99热这里精| av在线婷婷| 激情丁香图片| 丁香五月自拍| 婷婷丁香五月天激情四射| 激情五月深爱婷婷| 99re免费精品视频| 婷婷99狠狠| 婷婷色五月噜噜| 日本天天色| 五月天停停基地| 17.c黄色| 婷婷伊人75| 欧美久久婷婷| 伊人丁香五月| 成人网页在线观看| 国产成人+综合亚洲+天堂| 色99在线观看| 精品香蕉99久久久久网站| 日韩99色99| 五月婷婷激情网| 婷婷五月色丁香在线看| 激情五月天婷婷色色色色色色色色色色色| 婷香五月激情视频| 婷婷五月天第三页| 色五月首页| 日韩综合成人| 久99热| 国产看真人毛片爱做A片| 人人爱国产| 91黄址| www.狠狠操| 激情丁香淫荡婷婷| www99久久| 99热久| 久香草视频在线观看| 久久久亚洲成人无码A片| 婷婷丁香五月综合| 国产伊人五月天| 五月丁香色停停啪啪啪| 人人操AV| 国产性爱一级| 开心五月色婷婷综合开心网| 亚洲中文丁香| 色欲AVV| 日韩欧美颜射| rr天天操| 亚洲五月天综合| 日韩AV中文字幕在线| 婷婷色网站| wwccc久久久| 99色日本| 极骚大香蕉伊人| 婷婷五月大香蕉| 五月天综合缴情网网站0| 先锋影音男人的天堂AV| 国产毛片欧美毛片久久久| 日本噜噜色网| 美女五月激情| 亚洲第一成人无码A片| 激情玖玖sh| 日韩999| 狠狠草综合网| 91九色视频| 欧美色激情四射| 五月婷婷色色| 91seav| 五月婷婷婷婷婷| 亚洲天堂久久| 麻豆精品| 狠狠五月婷婷| 思思热视频在线观看| 五月天天爱| 丁香狠狠| 欧美色播综合在线观看| 另类在线| 一区二区免费看| 色六月 婷婷| www.天天日| 久久综合五月天| hd五月婷婷在线| 婷婷五月天激情小说| 99久久高清视频| 亚洲第一成人无码A片| 婷婷综合在线| 99天堂网| 9久精品| 午夜精品777| 久久五月婷婷电影| 久久狠狠欧美| 色婷婷手机在线| 超碰在线观看9| 五月丁香A片| 国产AV一区二区三区日韩| 婷香五月| 亚洲激情五月天| AVDV久久| 色婷婷五月天偷拍| 99这里有精品| 成人丁香婷婷| 综合色播| 无码动漫av| 丁香五月婷老师| 中文网av| 色五月激情五月天| 婷婷色婷婷| 一级二级香港秋霞欧美欧美秋霞| 99精品免费欧美小视频| 夜夜躁爽日日| 久热超碰91| 色五月亚洲| 色婷婷狠狠18| 思思热在线| 婷婷伊人五月天| 亚洲色A| 五月丁香激情欧洲啪啪| 国产五月天欧美色| 日日夜夜天天综合| 97欧美在线| 色婷婷九月综合| 五月丁香六月婷婷综合网| 五月天婷婷在线观看精品男人| 淫视馆aV二区一区| 婷婷人人操| 91九色 婷婷| 久久全色| 色五月综合在线| 婷婷欧美激情综合| 思思热久久阴99| 99色6爱9热| 思思久久99热| 五月丁香视频在线观看| 欧美色色色色色色色| 日韩在线五月天婷婷| 热99精品视频| 五月天婷婷久色| 亚洲 小说 欧美 激情 另类| 啪到高潮激情丁香五月| 91ncm视频| 99精品无码| 欧美久久网| 91Chinese在线| 伦乱天堂| 香蕉久久国产AV一区二区| 欧美日本日韩| 超碰国产AV| 丁香婷色| 免费视频舔| 丁香婷婷五月天校园春色| 国产夫妻操逼内射视频| 六月婷婷亚洲| 中文AV网站| AAA久久久| 天天综合精品| 亚洲视频在线观看区| 色色色五月婷| 狠狠色婷婷丁香六月| 99热99热| 色五月综合激情| 99久热| 欧美日韩婷婷五月天| 日本一级大片| 最新午夜理论片| www.五月天社区| 丁香五月综合激情性爱| 午夜精品人妻无码一区二区三区| 免费成人网在线观看| 丁香五月性| 综合在线丁香五月| 97干网站| yw国产AV| 五月天色婷婷激情综合| 婷婷天天色| 五月天成人综合| 91精品刘玥| 婷婷五月天AV在线| 九九色热视频| 丁香五月婷婷AV| 日韩啪啪网| YW无码| 91seav| 日韩AV色色色| 婷婷色在线| 亚洲色99综合天堂| 97超碰免费超级在线观看| 中文字幕1区2区。| 色色婷婷丁香| 91午夜激情| www.色99| 99狠狠| 色狠狠伊人久久五月丁香| 六月婷婷中文字幕| 国产婷婷婷| 九月婷婷色色| 亚洲aV写真天天综合网久久| 专区无日本视频高清8| 99热99| www天天干| 五月天丁香久久| 中字幕视频在线永久在线观看免费 | 这里只有久久精99| 人人噜天天上| 91欧美| 亚洲XX网| 婷婷婷婷婷婷婷五月丁香| 激情五月色婷婷| 日本视频欧美观看免费| 97久久香草精品视频| 91九色|疯狂|高潮|对白|| 91人人人人人| 五月激情婷婷色| 超碰人人艹| 国产免费av网站| 亚洲视频在线观看99| 国产精品视频免费看| 9热超碰| 久久丁香五月婷婷激情综合网| 日韩在线观看亚洲| 99 福利 导航| 逼逼AV| 99九无网码| 天天日P天天射P| 五月 丁香 欧美| 久热九九| 丁香伊人网| 婷婷五月天播播| 国产黄大片在线观看画质优化| 亚洲AV免费在线| 国产激情综合五月久久| 开心久久网婷婷| 六月色色婷婷| 中文字幕有多少字| 色婷五月天网站| 激情小说五月天| 丁香五月色| 精品99在线| 国产永久一黄| www.99热在线| WWW.99视频| 色婷婷五月天堂资源| 九九热最新| 婷婷久久综合久| 在线看片av| 激情亭亭五月| 日韩成人电影在线播放| 午夜婷婷久久| 91色在线/日韩| 婷婷网影院| 99色色视频| 丁香六月激情毛片| 丁香久久综合| 久久精品婷婷| www狠狠| 婷婷王月天影院| 亚洲色99| 婷婷五月天丁香社区| 成人超碰Av| 色五月婷色彩免播放器| 色色婷婷丁香| 国产99美少妇| 成人AV在线网站| 加勒比色色| 美女婷婷六月色| 五月丁香拍拍激情综合| 综合激情深爱| 九九视频在线| 色啪影院| 亚洲综合激情五月久久| 免费黄网不卡AV| 五月丁香啪啪| 99在线视频操999| jiujiuxiangjiaowang| 亚洲天堂色| 久久婷婷五月丁香网| 丁香五月欧美成人| 五月天色综合| 教师性爱毛片| 热99精品视频| 99久久免费性爱视频`| 天天操夜夜啊 | 色啦啦视频| 色色欧美。| 国精产品一区一区三区免费视频 | 思思热久久爱| 五月激情综合网| 久久婷婷色色| 综合久久99| 超碰91在线| 六月婷婷综合| 熟女少妇内射日韩亚洲| 婷婷日本色| 亚洲热热视频| 中文字幕日产A片在线看| 伊人99久久| www:99热视频| 九九热99re8热免费观看| 99在线视频精品| 99视频在线精品免费观看2| 99色精品| 无码激情AAAAA片-区区| 狠干综合| 免费的日逼视频| 婷婷五月色亚洲| 色婷婷六月天| 欧美人与性动交CCOO| www.色欲丁香婷婷| 色999五月色| 天天插夜夜爽| 色七七九九| 色99视频| 都市激情亚洲| 五月丁香va| 久久99激情丁香婷婷小说网| 久久婷婷热| 色婷婷亚洲综合网站| 99在线免费视频| 99久久99久久综合| 啪啪亚洲综合| 国产毛片精品一区二区色欲黄A片| 欧美激情综合| 婷婷色在线播放| 日本女va| 五月婷婷五月| 欧美性生交A片免费看| avv在线| 色婷婷XXXXX| 久久婷婷五月草视频| 91日日日| 欧美性做爰大片免费看办公室| 九色视频入口91| 九九色精品| 99久久99热这里只有精品| 五月婷婷视频| 99热精品在线| 91人人网| 丁香五月激情啪啪| 香蕉久久国产AV一区二区| 69精品人妻不卡视频| 婷婷五月成人有| 五月婷亚洲精品| 色久综合| 丁香花婷婷五月天| 夜夜天天久久婷婷| 91九色在线视频| 久久黄色片| 色色色婷婷五月天| 五月天综合视频| 婷婷综合五月天| 婷婷久久爱| 996er在线观看| 六月丁香网| 亚洲精品V天堂中文字幕| 欧美激情中文字幕| 婷婷成人五月天成人文学小说| 99ri在线视频| 综合网色综合| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 超碰在线91| 欧美激情中文字幕| 丁香五月综合在线视频| 中文字幕日产A片在线看| 影视av久久久噜噜噜噜噜三级| 激情婷婷五月天在线观看| a网站免费观看| 狠狠综合区| 久久一二三视频| 人妻啪啪啪| 婷婷的色色五月天| 日操夜撸| 五月天天丁香婷婷| 国产精品-91JQ就要激情网91JQ6.91JQ27.CASA:16888 | 狠狠色官网| 亚洲天堂爱爱| 99热这里有精品首页10| 色婷婷视频综合| 最近韩国日本免费高清观看| 亚洲免费99| 五月天婷婷激情小说电影| 日日操夜夜擼| 天天做天天爰天天爽天天无遮挡| 丁香五月AV| 久久综合丁香| 99热这里只有精品86| 大色鬼综合| 丁香五月六月久久综合 | 99久久国产成人精品| 啪啪激情网| 97日本在线| 啪啪六月婷婷| 六月婷婷天堂| 五月天久久网站| 69凹凸成人综合网| 俺也去综合| 精品色色| 丁香六月婷婷开心| 五月色丁香| 99re思思| 激情五月天网| 五月丁香激情婷婷综合字幕| 国产精品99久久久久久久女警| 丁香五月婷婷婷婷欧美综合| 天天艹夜夜艹| 久久婷婷激情五月天一区二区| 另类在线| 五月丁香激情综合啪| 狠狠色噜噜狠狠狠狠综合| 色婷婷久久综合| www婷婷| 激情综合在线观看| 婷婷久久综合久| 午夜免费试看| 色狠狠综合| 丁香五月综合久久八| 婷婷激情视频| 婷婷色婷婷| XX色综合| ww久久| 久久丁香五月婷婷| 丁香婷婷人妻| 粉嫩AV久久一区二区三区| 五月天激情站| 操一区| 99热这是里只有精品| 99色在线| 伊人久久五月天| 99在线看视频| 婷婷五月天社区| 97亚洲婷婷| 九九99九九99偷拍视频免费看| 第四色五月婷婷| 婷婷丁香花五月天| 婷婷成人网五月天| 99在线精品视频| 99在线观看精彩视频| 日日夜夜天天| 情婷婷五月天| 久久久婷婷五月亚洲97号色| 激情五月小说婷婷| 色青青视频| 欧美日韩婷婷五月天| 亚洲第79页| 婷婷 伊人 久久| 婷婷五月色惰| 视频这里只有精品| 激情综合五月婷婷| 热99精品视频| 五月天激情四射网站| 丁香色五月天| 99色一| 色九综合| 九九这里都是精品| 深爱五月综合网| 又大又粗九一在线| 五月丁香激情六月| 九九re精品视频在线观看| 婷婷五月激情图片| 久色国产| 综合久久影院| 色婷婷成人做爰A片免费看网站| 婷激情五月| 九九综舍久久| 国产成人网站在线观看| 国产激情综合五月| 99色在线观看视频者| 91成人性爱视频| 久久性爱视频| 色五月婷婷成人| 99色在线| 五月丁香网站在线播放| 黄色AAAAAAA| 亚洲永久四色| 国精产品一区二区三区| 九色PORNY自拍成人精彩视频| 色婷婷久久| 亚洲综合丁香五月天| 另类综合激情| 69天堂99| 婷婷狠狠操| 亭亭五月天成人| 婷婷五月亚洲综合| 成人AV片播放| 五月天综合| www,婷婷五月天777me,com| 久人操| 欧美成人A片AAA片在线播放 | aaaaaa片| 色五月大香蕉婷婷| 丁香五月花| 五月婷婷丁香| www,婷婷五月天,com| 激情国产综合| 色五月情| 操操啪| 噜噜噜噜噜日本视频| 1234操逼网| 中文字幕按摩做爰| 五月丁香啪啪综合| 中文字幕乱轮| 天天日夜夜高潮| 国产黄色一级片| 蜜桃五月天| 91九色中文字幕女在线观看| 另类图片婷婷五月天| 热99精品视频五月| 日韩欧美性爱| 香蕉久久国产AV一区二区| 五月宗合激情网| 九九视频网| 五月婷婷日| 国产午夜成人免费看片无遮挡| 97碰碰人人| 婷婷五月激情在线视频| 丁香六月激情综合网| 草草影院爱爱| 狠狠色综合无线观看| 97色婷| 97在线/亚洲| 三十路磁力链接| 91久久99久久91熟女精品| 欧美超碰亚洲| 五月婷婷电影院| 99精品热视频| 99热只有| 日本色色视频| 精品99只有。| 色婷婷丁香五月高清在线| 久色网址| 日本欧美国产| 色婷婷激情五月天| αV电影| 婷婷香草网| 97久久久| 尔尔AV一区| 成人免费在线电影| 五月天激情丁香| 丁香五月天BBw| 激情五月图| www.zbzhongsen.com| 日本毛片内射| 午夜av网| 丁香五月色色婷| 99视频在线9| 国产小精品| 久久婷丁香五月| 99热这里只有精品50| 五月花成人网| 丁香五月瑟瑟| 五月激情网五月综合网| 激情综合网五月天天| 久久九区| 婷婷五月天久久| 超碰93在线观看| 99热99| 超碰在线观看caop| 永久天堂日本| 91大神在线免费看视频全集男男一起操| 亚洲狠狠色丁香婷婷综合久久| 丰满少妇猛烈A片免费看观看| 色婷婷九月| 五月激情综合网| 色情五月综合婷婷| 亚洲人妻AV| 色色色综合| 天天爽夜夜操| 超碰在线99| 久操婷婷| 被强行糟蹋的女人A片| 九九在线精品| AA片在线观看视频在线播放 | 丰满少妇猛烈A片免费看观看| 激情四射五月天| 99精品在线观看| 97色婷| 国产这里只有精品| 国产精品色情AAAAA片软件| 五月丁香六月综合激情| av九九| 99网| 天天色2017| 色五月激情图片| 99人人看| 亚洲激情综| 最新日韩久热免费视频看看| 碰97久久| 欧美情月伍月天| 五月丁香久久综合| 森林影视大全,最好看的2019年视频 | 思思热在线精品视频| 久热九九| 婷婷五月天免费99| 婷婷五月六月丁香| 台湾无码A片一区二区| 91久久久久久久久18| 五月婷婷色播视频| 婷婷婷五月天最新综合你懂的| 国产精品A片| 99热这里只有精品搜| 99久视频| 九九性视频| 激情五月天视频| 久久综合99| 无码免费人妻A片AAA毛片西瓜| 久久五月婷天天干| 色99婷婷五月天| 开心五月综合激情网| 99国产er热视频| 99精品视频在线| 亚洲XX日本| 色播五月婷婷五月| 欧洲毛片基地c区| 1024日韩| 91久久九| 91精品人妻少妇无码影院| 五月激情网站| 色天天狠狠干| 丁香五月婷婷在线观看| 99九九精品| 国产肥白大熟妇BBBB视频| 99热亚洲综合| 丁香蜜臀黄色婷婷五月天| 激情综合网络插| 激情五月丁香六月婷婷| www.99婷婷| 激情五月天综合网| 超碰人人在线观看| 亚洲、欧美、国产另类笫二区| 99热日韩这里只有精品| 婷婷婷婷婷婷婷五月丁香| 超碰在线99| 婷婷伊人五月天| 97超碰在线免费观看| 99无码免费视频| 99热国产这里只有精品| 大香蕉婷婷久久| 202丰满熟女妇大| 激情婷婷网| 人人操91| 激情五月天色爱| 99毛片| 欧美大片免费观看| 婷婷97碰碰| 密乳视频| 337p大胆噜噜噜噜噜91Av| 69凹凸成人综合网| 91色久| 五月天俺去也| 五月丁香久久| 99超级超级超级碰| 日日操夜夜爽白洁| 色色无码| 天天色天天| 变态另类9| 婷色天堂| 婷婷色女| 五月婷婷激情四月| 婷婷射丁香| www,99热在线观看| 婷婷丁香六月五月天| 婷婷五月六月| 国产又爽又猛又粗的视频A片| 免费色婷婷| 九九激情网| 99色 | 91窝窝| 久久五月天婷婷视频| 久久这里只有精品热在99| 丁香婷婷基地| 激情丁香久久| 天天干天天干天天干天天干天天干天天干天天 | 日本色婷婷久久99精品91| 久99久精品| 国内自拍97在线| 99色色爰| 激情六月日韩| 777米奇影视第四色| 婷婷丁香97| 日日干天天爽| 色婷婷性爱网| 九九99免费视频| 日本色狠狠| 婷婷激情五月呦呦| 5月婷婷综合| 黄色AV日韩| 美欧成人视频| 日日.c| 思思9久久| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 亚洲激情免费视频观看| 国产精品久久久久久喷浆| 五月丁香久久| 97操操操| 久青操| 五月天婷婷激情综合| 青青草大香| 五月丁香六月激情综合啪啪| 色欲丁香| 99久热在线精品| 伊人玖玖网| 五月天婷婷丁香人人操91| 99热这里只是精品| 国产3p露脸普通话对白| 丁香五月天色综合| 色婷婷香蕉| 99re在线视频精品,这里只有精品18,| 第四色五月天| 激情碰碰碰| 五月婷婷我| 五月丁香六月片| 清色五月天| 午夜少妇在线观看视频| 99视频久久免费视频| 天天日天天舔| site:901-07.com| 丁香色婷婷| 另类图片色五月| 99操久久| 色啪综合| AA丁香综合激情| 大香蕉综合在线| 色色五月婷| 五月色婷| 激情五月五月婷婷| 天堂AV三级| 婷婷五月天成人| 九九热只有这里精品| 久久五月天婷婷| 亚洲精品乱码久久久久久按摩观| 婷婷五月丁香香蕉| 草综合网| 青青草五月天| 亚色网站小视频| 国产小精品| 五月婷在线色视频| 丁香五月婷婷色综合| 色婷婷丁香五月综合| 影音先锋男士资源网一区| se99视频| 日本精品干| 久久久久激情| 99色色爰| 天堂无码人妻精品AV一区| 五月天久久成人| 中文AV网站| 强伦轩人妻一区二区电影| 色综合色色色色| 亚洲熟女色| 久久99久久99精品免视看婷婷| 五月开心网| 激情欧美婷五月| 日本激情综合| 综合五月婷婷| 91九色国产在线| 激情网五月| 天天插夜夜爽| 永久天堂日本| 五月丁香琪琪| 一夜福利不卡| 美女被操一区二区| 96丁香六月婷婷蜜桃综合久久| 99爽视频| 亚洲免费看片| 亚洲婷婷丁香五月天激情小说 | 久久色五月| 色欧洲| 97婷婷丁香五月天激情图片| 国产毛片欧美毛片久久久| 日韩欧美骚货| 久久9999| 开心五月天激情网| 99国产性感视频| 69久久99精品久久久久| 丁香六月激情| 色五月中文网| 丁香色六月| 在线综合亚洲欧美65| 丁香婷婷91在线观看视频| 色狠狠999综合网| 日韩AV在线免费| 91中文在线| 影音先锋 婷婷| 欧美日韩成人在线免费| 99∨VTV| 天天日天天干天天插天天射| 97人操人免费视频| 天天做天天爽| 婷婷社区五月天| 中文字幕婷婷五月天| 日本久久色| 殴美日比视频| 99热日本| 九九色大香蕉| 黑人巨粗进入警花疼哭A片| 婷婷五月天综合在线| 天天操夜夜爽天天操| 欧美日本日韩| 操逼巨乳91| 激情六月五月婷婷综合网| 色婷婷啪啪| 超碰精品在线| 天天天综合网| 欧美狠狠草| HD久久精品视频| 99精品久久| 五月激情久久综合网| 日本久久99| 色婷婷AV久久| 日本狠狠干| 日日操日日撸| 综合激情五月综合激情五月激情1| 婷婷五月六月| 六月天婷婷| 色噜噜狠狠色综无码久久合欧美| 美女va| 玖玖99精品视频| 欧美成人AAA片一区国产精品| 99色在线| 欧美噜一噜| 日本超碰在线| 天天综合色99| 精品无码久久久久久久久| 五月综合色| 激情五月婷婷综合网| 婷婷五月丁香六月| 中文字幕高清av| 色五月综合网| 日韩色久| 天天天天做夜夜夜夜做| 色狠狠五月天| 在线观看亚洲AV| 激情图片亚洲| 婷婷五月丁香五月| 色你久久| 五月天久久网站| 人人爱操| www.99热在线| 久婷婷久草| 五月激情六月综合| 99色色| 亚洲 五月 婷婷 成人| 亚洲热手机在线观看| 欧美三级黄色片久久| 操97在线观看| 99精品成人无码A片观看金桔| 婷婷综合五月天| 夜夜干夜夜操| 狠狠干伊人| 亚洲成人色五月天| 五月丁香六月婷| 亚洲婷婷激情综合激情999精品| 久久久婷婷五月天| 丁香五月激情网| 五月丁香| 婷婷五月AV| 婷香五月激情视频| 婷婷五月天综合色| 五月天五月色婷婷综合| 另类激情五月| 波多野结衣AV无码Porn| 亚洲 成人 电影av在线观看| 人妻无码视频网| 97精品综合| 五月婷婷天堂| 日本五月天网站| 丁香五月婷婷激情蜜桃| 狠狠操在线视频| 婷婷成人综合免费视频| 99色区| 亚洲永久四色| 天天色天天射天天日| WWW·色色色·COM| 99热久97| 9视频1在线| 激情碰碰碰| 婷色综合| 人人操婷婷| 久久看九九90| 大香蕉色婷婷伊人在线| 91 影音先锋| 九九热青草| 99ER热精品视频| 一点色成人网| 成人做爰高潮A片免费视频| 日本人妻A片成人免费看片| 五月婷婷六月丁香| 色五月婷婷丁香五月| 九九色热| 五月婷婷影| 第四色大香蕉| 婷婷在线视频| www.色9| 91婷婷色五月| 99视频久久| 日本91在线| 婷婷五月色情天| 九九99在线免费在线观看视频| 波多野结衣AV无码Porn| 五月丁香啪综合| 久久狼人天堂| 91五月天| 久久久97| 五月婷综合| 99久久综合网| 国产精品国产成人国产三级| 色五月激情五月| 精品久久久中文字幕大豆网推荐理由| 免费无码毛片一区二区A片| 性做爰1一7伦| 五月婷婷av在线| 五月丁香六月综合图| 激情网色五月| 色综合中文综合网| 色99免费视频中文| 99精品久久久久| 日日干天天射| 99热只有精品在线播放| 欧美综合激情五月丁香| 久香草视频在线观看| 婷婷四色五月| 色五月丁香网| 人人操av| 久久五月丁香| 成AV人片一区二区三区久久| 91打屁股免费看| 草榴视频黄色网| 成人网页在线观看| 国产成人av在线播放| 日本色图综合| 天天做综合| 中文人妻主播久久| 五月丁香啪啪综合网| av色色国产| 亚洲成人网在线观看| 久久曰曰| 色九月丁香婷婷蜜桃在线观看| 97干在线看| 五月激情视频| 六月婷婷网| 五月婷婷开心六月激情小说| 久久538| 99热亚洲精品| 青草视频在线观看视频| 丁香五月熟女| 丁香五月手机在线| 五月天狠狠网站| 成人网丁香五月| 丁香婷在线| 色色五月天丁香婷婷| 五月天精品视频| 97caop| 久久密臀婷婷| 色七七九九| 密臀久久| 这里只有精品免费| 国产亚洲在线观看| 久久综合久色欧美综合狠狠| 日韩精品无码AV| 九九综合色| 天天爽天天日人人爱| 26uuu亚洲精品国产| 97久久人人操| 久久丁香综合香蕉| 久久久激情视频| 激情综合网 激情五月天| 久久网日本| 99在线视频操999| 色五月婷婷在线| 婷婷五月色网| 九九激情网| 9l视频自拍九色9l黑人| www.久久99| 深爱五月网| www.五月天| 99天堂网最新| 丁香六月婷婷缴情欧美| 综合五月网| 丁香五月婷婷五月| 伊人影院久久网| 精热在线综合网| 婷婷色五月丁香六月欧美啪| 人人草人人爱| 人妻Av在线| 五月婷婷新网站| 美女五月狠狠| 激情综合五月天| 九色 在线| 久久性爱网站| 大香蕉婷婷色| 久久激情四射| 丁香婷婷精品视频| 婷婷俺去也| 乱精品一区字幕二区| 久9热视频| 欧美丁香五月天| 九九伊人网| 丁香五月天激情四射网络不好 | 综合久久五| 热中文字幕| 日韩aaa| 日韩中文字幕| 亚洲有码在线视频| 99色播| 婷婷综合97| 99青青草99| www狠狠| 人。妻久久| 99热久久这里只有精品| 中文无码婷婷| 天天综合在线网| 性色五月天| 99re欧美精品| site:hcxsz888.com| 国产精品美女| 精品无码久久久久久久久| 五月婷婷丁香综合| 99色精品| 五月天操逼激情| 噜一噜免费视频| 九月激情综合| 婷婷亚州综合| 五月天另类小说亚洲| 五月天丁香成人| 九97免费视频| 成人必爱视| 欧美性猛交99久久久99| 奇米色大香蕉| 玖玖福利视频资源| 无码AV免费精品一区二区三区| 久久丁香五月综合六月激情红杏视频 | 久久98| 99熟女啪啪视频| 91在线视频综合| 狠狠精品干练久久久无码中文字幕| 色色丁香婷婷综合| 天天色粽合合合合合合合| 六月婷婷日| 开心五月深爱激情| 青青草婷婷五月天| 天天爽人人爽| AA片在线观看视频在线播放| 人人干天天舔| 另类激情中文| 婷婷色亚洲| 97色在线| 亚洲1区| 欧美精品999| 丁香五月激情棕合| 狠狠干综合网| 99热精品99| 9月色婷婷| 色99色| 国产99热在线看| 深爱激情丁香| 九九热色视频| 五月丁香大香蕉| 婷婷色婷婷| 日本色色色| 玖玖在线视频福利| 99九九视频| 人人干天天舔| 亚洲第一综合| 丁香桃色综合网| 久久99国产综合精品免费| 婷婷久久视频| 国产精品天天狠天天看| 色色aⅤ網| 日韩中出视频| 老司机伊人| 免费成人网在线观看| 99色热视频在线| 99热在线资源| 婷婷五月丁香久久| AV中文在线| 婷婷五月天av| 美女要搞搞天天搞搞搞网站| 99婷婷精品推荐在线视频| 思思热在线视频99| 91熟妇大香蕉| 色五月综合| 天天射天天干天插色综合| 久久婷五月天| 婷婷五月成人有| 国产真人做爰视频免费| 婷婷丁香五月天亚洲| 99精彩视频在线观看| 久久 天天| 99在线观看视频| 伊人在线视频| 天天插轮理| 99久久婷婷国产综合亚洲| 久久人妻人人| 婷综合| 人人操av| 无码人妻一区二区三区免费九色| 日韩久久欧亚| 色色五月婷婷久久| 综合亚洲六月婷婷在线| 亚洲欧洲中文日韩久久AV乱码| 我要射综合| 97五月综合网| 日本三级大片| 丁香婷婷人妻综合网| 婷婷香蕉香| 狠狠干狠狠干| 四色综合网| 激情婷婷狠狠干综合| 五月色色激情网| 丁香激情网| 99国产精品白浆在线观看免费| 五月天艹天天| 看全色黄大色大片| 六月综合婷婷开心伊人| 26uuuavcom| 青青操丝袜美腿| 婷婷久久五月天| 色亚洲色宗合| 玖色色综合| 99热精品中文字幕| 激情网站综合五月天| 丁香婷婷久久综合在线| 97干97色| 色婷丨日丨天丨综合久久| 玖玖热99| 伊人五月天在线| 色天天综合成人网| 1024婷婷综合久久五月天| 色婷久久| 久 久9 9 热 视 频| 色色五月天丁香| 激情内射人妻1区2区3区| 狠狠操狠狠操AV| 色色色激情| 丁香影院五月综合| 色啪网| 天天日天天干天天插天天射| 丁香婷婷六月天| 人人爽网| 99九九99九九九视频精彩| 色五月婷婷、老熟女| 九色在线观看91av| 99热免费| 涩涩五月天| 五月天激情小说电影| 热久久色| 激情五月激情综合网| 色色日本| 久草久青福利| 五月丁香五月丁香五月丁香五月丁香91| 五月婷婷影院| 人人草开心五月天| 综合婷婷六月| 噜噜狠狠色综合久| 亚洲精品又粗又大又爽A片| 婷婷五月在线视频| 五月天婷婷网站| 性生活视频98791| 中文字幕无线久必| 狼人久草| 久久久久思思热| 五月婷婷新网站| se99热久久一本| 日韩丰满少妇无码内射| 激情中文在线| 天天天天天天天操| 激情综合网五月在线播放| 五月婷婷综合色啪首页| 99超级碰免费视频| 天天人人人人人人人人人人人| www.伊人天堂偷偷婷婷| 99热老司机| 婷婷WWW久久| 99热精品免费| 操操国产| 天天做天天爱天天综合| 亚洲俩性性爱图片久久第六页| 99九九视频| 操操综合网婷婷| 中文字幕在线免费观看视频| 五夜丁香| 五月丁香婷婷三级| 国内裸舞二区| 97久久人人| 色婷婷综合在线| 五月婷A V在线| 久久伊人大香蕉| 九色91视频| 激情五月天小说| 久热最新视频| 久久无码激情视频| 婷婷射综合| 五月丁香A∨在线| 97caop| 色婷视频| 91seav| 99色在线视频| 五月婷婷网站| 激情婷婷五月黑人| 无码四色色色| 色欲五月婷婷| 9 9热这里有精品| 成人龟情网丁香五月| 99精品在线播放| 五月丁香激情综合网| 九九综合| 99爱视频在线观看这里只有精品| 五月婷婷之激情五月| 国产VA播放| 97人人操人人干| 国产亚洲精品久久久久久郑州 | 五月婷婷久久综合| 亚洲综合婷婷五月| 亚洲午夜Av| 激情婷婷黄色五月| 99色在线观看视频者| 亚洲最大成人综合网720P| www.夜夜| 人妻操逼视频| 婷婷精品在线| 久久性刺激| 99热碰碰| 五月婷婷六月情| 开心五月婷婷婷美女| 亚洲色激情| 国产精品成人av在线观看春天| 色情五月天首页| 五月丁香六月婷婷综合免| 日操| 五月婷婷高清| 五月婷婷激情刺激| 依人大香蕉| 久操婷婷| 五月婷婷激情综合| 色综合激情| 久月婷婷| 九九综合九九| 97精品欧美91久久久久久久| 99A级片| 婷婷久久99| 久久六月天| 91碰视频| 色欲天天综合网| 婷婷五月天激情小说| 自拍偷窥99热| 丁香婷婷网| 99re热视频这里只有综合亚洲| 九九操操| 2015好吊操| 综合激情五月丁香9999久久精| 日本婷婷网| 手机激情网|