欧美成人午夜精品久久久,国产?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
返回資訊列表
天天射网站| yw国产AV| 深爱激情综合| 五月天色婷婷小说| 99热精品在线| 91丨九色丨国产在线| 超碰免费人妻| 66色在线日韩| www.五月天社区| 久久久久久久久久久44| 激情AV网| 国产亚洲精品久久久久久郑州| 激情丁香五月激情婷婷| 激情小说五月丁香在线视频观看视频| 久久免费操| 色婷婷六月天| 激情综合五月色丁香婷婷 | 果冻传媒A片一二三区| 九九热99热| 草操网| 五月丁香久久婷| 日本综合久久| 久久久噜噜噜久久人妻| 99日本在线| 欧美综合激情五月| 久久亚洲色导航| 9热在线观看| 婷婷色五月91啪啪| 香蕉AV777XXX色综合一区| 婷婷综合97| 天堂婷婷丁香六月网| 香蕉国产2013| 99久久久免费| 99ri精品| aaaaa不卡| 超碰成人AV| 610018岁成人视频| 激情五月婷婷综合网| 伊人婷婷五月天| 九九热免费视频| 丁香五月综合在线观看| 99热亚洲精品66| 激情五月婷婷欧美极品 | 无码日本精品XXXXXXXXX | 超碰人人91| 婷婷综合六月| 99色色色色| 五月丁香AV、伊人业余、性色熟妇| 任你日视频| 九九久久免费视频44| 婷婷综合中文| 丁香婷婷五月激情四射网| 国产毛多水多女人A片| 青青草激情网| 9色在线| 亚洲综合在线视频| 五月香婷婷| 婷婷丁香十月| 99re6在线视频精品免费| 欧美日韩91| 99热综合| 99久久国产宗和精品1上映| 啊v视频在线观看| 一区二区乱码视频| 99色在线视频观看| 翔田千里aV中文字幕| 国产亚洲99| 性日本激情| 97综合在线| 色9999日韩国产| 超碰在线观看9| 在线观看中文字幕亚洲| 精品一区二区三区四区五区六区介绍| 99这里只有精品在线观看| 国产成人AV人人爽人人澡Va| 五月综合六月婷婷| 激情五月综合网| 婷婷综合一二三| 精品久热69| 婷婷欧美激情综合| 成人视频网| 欧美搡BBBBB摔BBBBB| 九九在线精品| 99伊人婷婷在线| 第四色网婷婷| 亚洲99激情| 97色五月天| 高清无码中文字幕aVDV| pacopacomama 070722_670 素人奥様初撮りドキュメント 103 大久保純子 | 99伊人婷婷在线| 亚洲色图啪啪| 精品久久二6| 天天色爽| 婷婷九月综合| 99ri在线视频| 婷婷性爱视频在线| 天天爽天天弄| 九九热re99re6在线精品| 超碰大香蕉网| 免费精品66| 婷婷婷五月天最新综合你懂的| 激情综合六月| 狠狠干在线| 国产成人精品一区二区三区视频| 91丨九色丨老农村| 婷婷五月天日日日干干干| 日韩精品二三区| 亚洲不卡欧洲| 激情五月黄色| 99热久| 深爱丁香激情| 色综合久| 精品九九网| 九九热这里只有精品556| 激情WWW| 天天激情欧美美女| 亚洲精品白浆高清久久久久久| 超碰丁香五月| 久噜久噜| 色爱综合网| WWW.久久久久久久久久久久久| 丁香五月天无码AV| 精品久久这里热66| 欧美 色婷婷| 99操无码视频观看| 色色色.COM| 亚洲精品大片| 五月婷婷黄网站大全| 天天操无码| 日日撸日日操| 日本欧美成人片AAAA| 婷婷色在线播放| 国产亚洲精品久久久久久郑州| 我想看国产大学生口爆吞精的视频| 伊人久久五月天| 中文字幕婷婷五月天在线观看| 思思热在线播放| 五月婷无码| 黄色aaaaa| 五月丁香六月成人| 色情婷婷久久五月天| 亚洲色啪| 日本美女上人| 丁香九月激情久久| 婷婷五月无码| 国产91在线视频| 天天拍夜夜撸| 看片视频在线免费日产在线看| 狠狠综合久久综合| 玖玖资源站中文| 少妇出轨做爰高潮A片| 69热在线| 色色色综合色| 中海油常州环保涂料有限公司| 久久狠狠干| 日韩在线观看网址| 26UUU精品一区二区c〇m| 综合婷婷| 婷婷五月天国产精品| 亚洲色五月天| 97se视频在线| 九九精品综合| 99ri国产| 天天色天天| 婷婷色色丁香五月天| 亚洲另类噜噜| 久久九九囯产| 五月丁香六月婷婷姐| 日本少妇裸体做爰高潮片| 中文字幕在线免费观看视频| 91九色在线| 日韩精品一品二区三区的使用体验| 色丁香五月婷婷在线| 色色亚洲| 人人人操97| 性生生活大片又黄又| 99re热| 婷婷六月天| AAA久久久| 这里只有精品网| 91麻豆国产三级精品福利在线观看| 丁香综合伊人| 五月丁香婷婷钟和色图| 99免费热视频在线| 亚洲无码yw| 天天综合色| 激情婷婷网| 五月婷婷婷婷| 五月丁香婷婷久久| 99这里都是精品| 久久黄色免费视频| 好叼操在线观看| 艹| 97涩婷婷婷婷基地| 婷婷激情在线| 久久久久婷婷五月热综合| 亚洲精品大片| 婷婷五月天99| 久热久操久热久草国产91| 亚洲天堂aaaa| 夜夜夜天天操| 色欲久久99精品久久久久久| 99热免费| 久久杏爱视频| 99日视频在线| www.五月丁香| site:feetmall.com| 色欲色香综合网站| 99久久婷婷| wuyuedingxiang99| 日韩人妻AV在线| 五月激情婷婷女| 99啪啪骑| 欧美日韩91| 天天透天天摸天天舔| 人操91在线| 激情亭亭五月| 俺来也综合网精品一区| www.夜夜爱.com| 狠狠操狠狠操AV| 色五月色五天色情网| 国内外色色色色色成人视频| 小视频久久久aaa| 99热爱爱干干日| 日本狠狠干| 五月天成人小说网| 狠狠干天天内射| 婷婷操无码| 99热| 操你av| 综合激情五月婷婷| 操操综合网婷婷| 天天搞天天色综合| 开心五月婷| 五月天丁香看婷婷| 婷婷伊人綜合中文字幕| 无码髙清| 五月婷婷狠狠干| 日韩精品超碰在线观看| 一本大道伊人AV久久综合| jizzdr| 国产片天天爽夜夜爽| 岛国AAAV| 97操操| 婷婷五月天天爽| 色色影院aaaav| 97人妻碰碰碰碰碰久久久久久| 91色久| 99爱在线视频观看| 激情亚洲五月| 九九视频免费| 婷婷丁香激情综合色情| 国内在线99视频| 性无码专区无码| 超碰人人干| 亚洲丁香五月美女| 婷婷免费精品视频| 99热99干| 极品色丁香| 超碰操日| 日本不卡一区二区三区| 天天狠狠夜夜狠狠2023| 日本久久人人| 停停五月色宗合| 激情综合网亚洲色图| 久久综合爱| 婷婷五月激情视频网| 精国产品一区二区三区A片| 综合性爱网| 五月丁香色五月| 99久热在线精品| 天堂久久大香蕉| 九九99久久精品| 六月激情综合| 激情五月婷婷五月| 色五月人妻| 色五月激情| 五月丁香免费看| 婷婷五月天影视| 五月天天堂久久| 97超喷视频在线观看| 强壮的公次次弄得我高潮A片日本 | 伊人婷婷大香蕉| 婷婷五月激情视频在线| 色色色色色网站| 五月天激情中文字幕| 99久久丝| 丁香亭亭久久| 丁香桃色综合网| 激情久久四色| 在线VA视频| 久久婷五月天| 99热欧美在线观看| 五月婷婷成人网首页| 密黄站| 色婷婷先锋| 99色免费| 五月婷婷深深爱| 日91高清无玛| 五月玖玖| www.婷婷网| 色狠狠狠干| 99小视频在线| 凹凸探花电影| 色婷婷五月网| 色婷婷视频在线| 天天骑天天操| 色一情一乱一乱一区91| 人人草人人爱| 精品无码久久久久久久久| 狠狠精品干练久久久无码中文字幕| 五月婷婷五月| 一级AV片| ady狠狠入| 伊人大香蕉在线视频| 玖玖@三月天天丁香婷婷| 九九爱激情| ai97re99一本| 久久婷婷五月天激情四射| 我去色色网五雨天| 丁香五月网站| 久久一二三视频| 日本熟女内射| 五月丁香亭亭操逼| 亚洲精品字幕在线观看| 91操人人操| 色色综合五月| 激情五月天视频| 99噜噜噜在线播放| 久久久色情| 亚州第一A片| 99热这里有精品首页10| 操操操av| 激情六月天婷婷| 任你日视频| 五月综合视频| 人人色人人弄人人操| 久久丁香婷婷色情综合| 伊人久久大香网| 久久视频66| 激情婷婷丁香色情五月天| 欧美综合激情五月天| 欧洲激情精品婷婷| 夜夜干天天操| 综合久久婷婷99| 九九人人看| 99视频自拍| 翔田千里无码| 91人人操人人| 91大屁股在线| 五月丁香六月综合情在线观看 | 亚洲亚洲人成综合网络| www.婷婷久久五月天| 97碰碰碰| 国产欧美日韩一区二区三区| 婷婷五月大香蕉| 粉嫩AV久久一区二区三区| 极品五月天| 大香蕉婷婷色| 五月天伊人综合| 二色AV| 婷婷综合性爱网| 中文字幕,综合,91| 婷婷丁香一月| 狠狠香蕉| 天天爽天天干| 人妻丰满精品一区二区A片| 91九色超碰正在播放| 成人色五月天婷婷| 91九色视频在线观看| 国产欧美精品AAAAAA片| 久久婷婷激情| 成人在线99| 99色天堂| 亚洲视频另类| 丁香五月综合色婷婷| 99色网站| 久久婷婷五月综合色和| 久色成人| 激情影院丁香五月| 久综合| 日日操,夜夜爽| 五月天啪啪| 江苏少妇性BBB搡BBB爽爽爽 | 黄色av网站在线免费播放| 久久99久久99久久99人受| 九九爱激情| 色婷婷成人| 婷婷99视频精品| 五月天激情社区| 丁香婷婷久久| WWW.天天日| 99人妻碰碰久久久禁片| 日本五月婷| 丁香五月九九| 久久性爱视频这里只有精品| 国色天香成人网| 色五月丁香五月| 这里只有精品免费| 色吊丝99| 亚洲欧州色情在线观看| 大香蕉久久视频久久视频| 欧美激情综合| 综合网色| 欧美99热| 99精品久久| 狼人婷婷久久| 99久在线精品99re5热视频| 激情性五月天免费小说视频| 97人人干视频| 日日天天操| 91黄操| 色噜久| 五月婷婷色情| 亚洲人操亚洲人| 五月婷婷综合色拍| 国产婷伊人| 美女100%露全身无挡网站| 婷婷大香蕉| 亚洲在线视频321| 五月丁香六月婷婷久久| 自拍视频在线观看9| 亚洲天天综合| 99久热视频在线| 六月丁香婷婷开心综合基地| 超碰免费观看| 久久人妻精品| 99九色视频在线观看| 日本一道久久| 九九蜜臀精品| 亚洲12p| 艾小青av| 丁香六月av| 久久色亭亭五月天| 亚洲愉拍99热成人精品| 九九精品热播| 九九热在线亚洲免费视频| 这里只有精品视频| 俺去也在线官网| 精品日本视频444| 五月丁查人人| 久久总和99| 五月天色婷婷综合| 丁香五月网在线观看| 成人视频免费观看高清完整版在线观看| 激情丁香五月天图片| 9l视频自拍九色9l视频在线观看| 亚洲热综合| 六月丁香深深爱| 玖玖资源站中文| 国产精品国产| 亚洲超碰在线| 丁香五月另类小说| 色爱综合网| 日本99久久| 色婷婷a三区麻| 丁香六月综合激| 67194成I人在线观看线路1| 思思热闹这里只有精品| 欧美一级a| 久久综合中文字幕| 丁香六月婷婷综合激情欧美| 国产成人精品一区二三区熟女在线| 襙逼网| 久热视频97AV在线观看| 天天插综合| www.99视频| 99操逼视频| www.99热视频在线观看| 97超碰99热99| 天天操天天干天天日| 婷婷狠狠五月综合| 久久久大香蕉| 亚洲六月综合激情久久下卡| av久热| 99操视频| 日本丰满久久| 色婷婷九月| 色婷婷五月中文字幕在线dvd| 五月天丁香综合久久国产| 97人人干| 国产.亚洲.欧洲视频在线| 丁香五月天激情婷婷丁香六月| 激情婷婷| 九九热啪啪| 色婷婷色久综| 天天色天天射天天日| 国外亚洲成AV人片在线观看| 4399在线日本A片| 深爱丁香激情| 日日骑夜夜撸| 四月婷婷五月丁香| 黄桃AV无码免费一区二区三区| 色五月天成人| 五月天激情久色| 久久久宗合| 黄色网址五月婷婷| 九九九九这里只有精品| 另类激情五月在线视频欧美| 五月婷婷婷自由综合| 97视频.干com| 五月亭亭色| 夫妇交换刺激做爰| www.天天日| 香蕉人在线香蕉人在线 | 色色婷婷综合网| 99热九九这里只有精品| 亚洲成人超碰| 夜夜AVV| 国产69久久久欧美黑人A片| 九色PORNY自拍成人精彩视频| 久久激情五月网| 色五月婷婷狠狠撸| 热99国产精品| 婷婷五月丁香人妻无码高清| 色五月婷婷五月天| 97九色| 久久人人妻| 久久久久人妻精选| 色狠狠图片| 久久99最新| 婷婷伊人综合中文字幕| 久久久性爱视频| 久久超级碰视频| 久久婷五月影院| 丁香婷婷天堂| 不卡成人免费| 色婷婷aV四虎| 狠干综合| 99视频在线观看网址| 99ri视频在线观看| 97碰在线免费观看| 狼人婷婷综合| 欧美在线干| 久久女婷| 色之综合网| 99热99在线| 色色婷| 婷婷丁香成人| 欧美大片免费播放器| 荡乳尤物3HP1V5| 精品一二三区久久AAA片| 91久热| 国产小精品| 国产偷人爽久久久久久老妇APP| 激情五月婷| 99re热视频这里只精品| 超碰cap| 五月婷婷精品视频| 婷婷午夜综合| 久久这里这里有精品免费视频| 丁香六月婷婷综合激情欧美| 丁香伊人激情| 色激情五月| 五月婷婷草| 久久新地址| 激情五月综合网| 草草夜夜操| 成人视频免费观看高清完整版在线观看| 日本欧美啪啪| 天天看A片| 亚洲激情 久久| 五月婷婷精品视频| 久久人妻人人| 亚洲综合色色| 色婷婷激情Av久久久| 碰人人97| 日韩成人综合网| 亚洲色欲欧美一区二区三区| 婷婷开心激情| 激情六月综合| 日本婷婷色| 桃色激情五月天| 精a品a视a频| 丁香激激情网| 大香蕉精品视频| 五月婷婷丁香| 激情 婷婷| 九九熱最新視頻| 六月丁香激情综合| www99精品| 色噜噜狠狠色综无码久久合欧美| 五月亭亭欧美女人| 99视频精品视频| 久艹久| 久久久这里都是精品| 九九在线免费观看| 五月丁香六月成人| 五月婷A V在线| 欧美色图天堂网色| 五月噜噜| 性爱视频99| 久久99草五月婷婷| 亚洲小视频免费播放| 性色99| 色噜噜狠狠色综合日日| 韩日AV片| www.sd-xiangsu.cpm| 五月婷婷免费在线视频| 午夜少妇在线观看视频| 色娸娸综合网| 丁香五月婷婷综合网| 99热九九热| 人人操人| 久久99热 这里有精品| 91碰超| 亚洲九九99精品视频在线播放| 伊人激情啪啪| 噜噜狠狠色综无码久久合欧美| 99啪啪| 看全色黄大色大片| 婷婷五月天综合色| 99热这里只有精品9| 久久婷婷综合国产| 五月婷婷六月少妇激情| 乱精品一区字幕二区| 五月丁香综合激情| 五月综合丁香婷婷| 性色综合网| www.五月激情红色| 99色色网| 99re这里只有精品99| 人人爱人人草| 色开心五月婷婷丁香HD| 丁香五月婷婷激情视频播放| 色色五月天激情| 大香蕉五月天婷婷丁香91| 99热这里只有精品最新地址获取| 大学生高潮无套内谢视频| 秋霞成人毛片一级A片| 深爱激情综合网| A片天天| 五月丁香啪啪激情| 五月天激情四射| 成片免费观看视频大全| 久久综合首页| 成人在线99| 9精品国产在热久久| 去干网最新版本亚洲版| 国产偷人爽久久久久久老妇APP | 国产伦亲子伦亲子视频观看| 色婷婷六月激情| 无码任你操| 久久婷婷五月天蜜桃| 另类激情首页| 亚洲色图81p| 丁香五月香蕉| 国产肏屄大片| 六月久久婷婷| 97干网站| 日韩无码专区| 久9热| 色婷婷婷婷| 丁香六月开心| 亚洲丁香花色| 婷婷五月天伦理| 亚洲精品V天堂中文字幕| 激情婷婷色小说| 国产人妻777人伦精品HD| 99热精在线九九久久保| 国产亚洲精品AAAA片APP| 日本的α片xxxwww| 色狠狠色噜噜AV天堂五区| 五月丁香在线国产| 黄色激情网站在线观看| 深爱激情六月天| 岛国操B不卡在线| 激情综合网激情五月天| 五月丁香好婷婷A片网| 噜噜干日本| 色亚洲无码| 99精品国产在热久久| 玖玖精品资源| 综合九九日本| 丁香五月中文字幕| 色婷婷色五月另类综合| 电影91久久久| 九九99久久| 婷婷久久久久| 国内外色色色色色成人视频| 色丁香婷婷美女视频网站| 九九99视频精品| 99九九视频精彩在线| www.婷婷五月天| 色色五月婷| WWW.99热| 99热99精品| 99熟女| 欧美综合激情五月天| 色色五月激情| 开心五月天激情网| 亚洲五月情| 操逼三区| 嫩草AV久久伊人妇女超级A| 五月丁香狠狠| 9999三级片| 国外亚洲成AV人片在线观看| 婷婷五月天激情在线| 婷婷月综合| 天天射影院| 激情五月丁香六月| 久久精品99| 五月丁香狠狠爱婷婷综合| 亚洲天堂青草| XX色综合| 九九激情视频| 五月婷婷在线丁香| 亚洲天堂制| 中文字幕在线日亚州9| 99re思思热这里| 操日视频| 激情操逼婷婷| 人妻av在线| 国产精品A片| 色五月综合网| 狠狠综合久久综合| 五月天婷婷基地| 另类视频五月天| 久久五月人人摸| 五月狠狠| 丁香六月在线综合| 婷婷午夜| 激情五月天婷婷五月天| 天天色五月| 久热黄色| 任我肏视频精品| 婷婷色婷婷| 婷婷色五天| 五月丁香六月婷婷综合伊人| 九月婷婷久久| 停停五月色宗合| A片试看120分钟做受图片| 午夜成人AV在线| 情婷婷五月天| 色五月激情五月丁香五月婷婷啪啪综合| 日韩日比视频| 色婷婷狠狠久久综合五月| 婷婷色六月| 男人的天堂五月丁香| 天天影视色综合网| 婷婷色五月天第7色| 一级性感黄色内射视频| 99日在线观看视频| 好叼操在线观看| 精品一二三区久久AAA片| 伊人超碰| 99久久精品国产色欲| 天天爽日日爽夜夜爽| 婷婷丁香午夜综合影视| 狠狠干狠狠色| 激情五月天啪啪| 超碰97色| 九热av| 色和综合网| 99网| 大香蕉综合网| 色色a| 激情综合亚洲| 91精品国产91久久久久青草| WWW.17C亚洲精品| 激情五月开心五月丁香五月| 思思久日精品视频| 思思re视频在线| 中文无码精品一区二区三区| 综合99在线| 丁香五月花婷婷开心| 一区二区成人电影| 丁香五月香蕉| 超碰在线观看99| 日韩人妻在线观看| 97操碰视频| 大香蕉99热| 久久大香蕉同僚| 非洲一级AV| 婷婷九月狠狠色| 99干99| 综合狠狠干| 丁香久久五月婷综合| www.91在线看| 99九无网码| 人伦30P| 99久在线视频| 亚洲成人免费在线| 五月色婷婷亚洲 | 99操碰| 91九色视频| 色色婷| 91久久久久久久久18| 99综合免费视频| 99热久久这里只有精品| 免费无码毛片一区二区A片| 一本大道伊人AV久久综合| 99热在线观看| www.韩日视频| 99爱爱网| 色婷婷网| 婷婷舔| 天天色天天色天天色天天色天天色| 久99热| 久久婷婷五月| 久久久久婷婷| 欧美激情综合色综合啪啪五月| 嫩草AV久久伊人妇女超级A| 久久婷婷七月丁香| 大香人妻| 婷婷丁香色情| 亚洲激情淫网| 婷婷五月丁香久久| 五月天婷婷激情| 色情五月婷婷| 久久AV无码精品人妻系列试探| 日本性视频| 9精品视频在线| 六月99天天婷婷激情综合| 久久伊人日日夜夜| 五月天网站亭亭| 久久久999精品| 午夜天堂一区人妻| 在线不卡的视频| 婷婷丁香九月| 五月天婷婷久色| www天天色天天射| 精品久热| 五月婷婷香蕉| 欧美日本黄色| 久久婷婷五月综合激情国产| 综合一本道| 色五月婷婷色| 人人操9| www.91操| 秋霞影音91人妻久久| 丁香六月婷婷色播| 五月婷婷激情综合| 最新AV在线观看| 日韩一区二区在线播放| 九九视频这里只有精品| 色婷婷小说| 久久综合站| 久99热| 色五月女| 激情五月婷| 人妻中文字幕网| 天天拍夜夜撸| 婷婷成人五月天成人文学| 婷婷久久综合久| 丁香五月综合久久| 一个色的综合| 99在线视频精品| 五月婷A V在线| 99re久久| 人妻久久久久久久| 黄桃AV无码免费一区二区三区| 奇米网大香蕉| 丁香五月天激情小说| 欧洲亚洲免费视频9| 天天干人人奸97| 97色婷| 思思热视频在线| 操人妻AV| 女性自慰系列第五页| 婷婷国产成人| 91夫妻视频| 丁香五月网站| 久久怡红院| 五月综合激情啪啪啪啪啪| 天天做天天爱天天搞| 丁香桃色网| 99久久九九视频| 激情小说五月天| 色五月激情网| 亚洲AV无码电影| 丁香六月 人妻| 婷婷色五月天在线观看| 97热久久| 五月丁香六月婷婷综合网站 | 久久五月天激情婷婷| 五月婷婷导航| 丁香婷婷综合色五月激情国产基地| 亚洲色激婷| 久久色情| 丝袜激情网| 五月婷婷在线免费| 久久加勤综合| 午夜精品777| 色墦五月丁香| 久久久婷| 91日本在线| 婷婷久久性爱| 狠狠操狠狠| 国产4P视频精品五区| 国语精品探花| 色五月丁香A欧美com| 这里只有精品热| 丁香五月色| 色色操| 亚洲av网站| 久综合| 色五月婷婷综合在线| 欧美啪啪五月天| 5月婷婷激情在线| 在线播放成人| 亚洲日日操| 亚洲天堂玖玖| 99re热视频这里只精品5| 婷婷99狠| 激情五月深爱婷婷| 日本97在线看片| 五月激情婷婷开心| 国产AV网页| 日日夜夜狠狠操| 97人人操com| 夜夜操夜夜操| 婷婷丁香社区| 97色在线观看视频| 国产综合色婷婷精品久久| 97人人操| 婷婷色五月丁香六月欧美啪| 九九性视频| VA婷婷| 亚洲精品色| 26uuuavcom| 99欧美热| 五月六月婷| 日本女人久久| 99在线热| 另类色视频| 少妇性按摩无码中文A片| 色久五月| 日本英国美国欧美亚洲国产精亚洲日韩精品在线观看 | 日日操,天天操| 色色综合网www| 99er精品视频| 色青五月天| 丁香五月区| 激情五月,色五月| 一本大道熟女人妻中文字幕在线 | 欧美日韩999| 狠狠狠狠狠草| 欧美久人人| 亚洲av免费在线| www久久99com| 色级停停| 日韩aaaaa| 欧美色色色色色色色| 深爱五月激情| renrencaoav| 久久99免费视频| av网址在线| 五月激情另类| www狠狠爱com| 婷婷五月天影院| 天天做天天爰天天爽天天无遮挡| 99色综合久久| 日韩精品一区二区亚洲AV观看| 91狠狠综合久久久久久| 最近中文字幕2019视频1| 91精品综合久久久久久五月丁香| 色婷婷a| 久久五月综合| 欧美丁香五月| 欧美色色色| 亚洲久久天堂| 色五月婷婷在线| 天天做天天爱天天爽在| 综合九色| 青草五月天| 精品无码99| 激情久久综合| 丁香花社区av| 久久停停超碰| 五月天夜夜爱夜夜操| 六月婷婷啪啪| 深爱激情五月天| 婷婷五月视屏| 秋霞三级色戒| 久热99久热| 久久久中文| 99热色精品| 激情5月婷婷狠狠干| 亚洲av无码精品色午夜| www99热| 久久性爱视频| 玖玖精品视频99| 99在线视频精品| 日日噜噜夜夜狠狠久久丁香五月| 九热视频在线精品15| 婷婷狠狠五月综合| 97精品自拍| 久久婷婷五月综合网| 亚洲这里只有精品| 五月婷婷丁香俺日污视频| 色A网| 99热1| WWW.HENHENL.| 丁香六月婷| 久久色五月天| 五月天色网站| .操區COm| 中文字幕,综合,91| 九一娱乐在线观看视频| 色噜噜狠狠色综无码久久合欧美| 丁香五月成人av| 五月天色婷婷图片| 国产精品电影| 亚洲熟女乱色综合亚洲网站| 色五月天婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷 | 襙比视频| 久久婷五月天| 色播播婷婷| 91九九九色在| 欧美色五月| 国产 亚洲 在线| 中文AV网站| 六月丁香激情婷婷| ss五月天激情| 婷婷天堂站| 大香蕉大香蕉在线影院| 婷婷色综合网日韩国产| 大地9中文在线观看免费高清 | 色色色五月婷| 五月色丁香婷婷综合| AV大片在线播放| 色婷婷影院| 99热在线精品观看| 婷婷久久久久| 日本爆乳片手机在线播放| 激情五月狠狠| 六月婷婷亚洲| 激情网第四色| 婷婷五月丁香狠狠| 九九综合视频在线观看| 婷婷五月天激情小说| 91岛国片| 色婷av| 亚洲视频无| 日韩成人综合| 激情色情五月天| 激情婷婷在线| 婷婷五月综合中文字幕| 亚洲精品a成人在线播放| 丰满女老板BD高清A片| 五月天成人免费视频| 亚洲热视频在线| 99久久综合| 五月激情偷拍| 久久99精品久久只有精品| 五月丁香色色网| 久久九九爽| 亚洲超碰在线| 日日杆天天| 激情婷婷五月天| 大香蕉五月天| 99热久久这里只有精品| 99热这里| 97在线观视频免费观看 | 亚洲色婷婷激情| 丁香伊人激情| 五月激情婷婷播播网| 色情播放| 色人妻五月| 中文字幕乱轮| 激情五月丁香亭亭| 91se在线观看| 日本精品99网站| 欧美精品99久久久| 99九九精品| 野战J办公桌椅H| 色狠狠婷婷| 夜夜AVV| 成人中文字幕在线| 成人视频一区| 包操45分钟网站| 插插五月天| 十月丁香九月婷婷综合| 日本狠狠网| 国産精品| 激情AV| 激情性爱五月天网页| 久久久日韩特色特黄AAAA| 婷婷五月激情五月丁香五月| 久久五月天色婷婷| 五月天婷婷激情网| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 丁香五月天社区婷婷| 91在线人| 人妻激情视频| 丁香五月激情婷婷视频| 成人婷婷五月天| 婷婷.com| 激情综合色婷婷啪啪六月天| 天天色宗合| 操操操97| 色婷婷AⅤ| 五月色综合| 五月婷在线色视频| 综合久久99| 婷婷香五月天| 婷婷在线中文字幕| 香蕉大综综综合久久| 俺来也综合网精品一区| 男女久久婷婷五月天| 国产毛片精品一区二区色欲黄A片| 国产成人网址| 亚洲六月色| 亚洲熟女色| 亚洲女婷婷五月基地综合久久久| 色五月六月| av色色国产| 性爱技巧五月| 婷婷射丁香| 婷婷开心综合人妻小说网址| 蜜桃人妻无码AV天堂三区| 九九人人操| 亚洲成人无码片| 五月天丁香啪啪综合| 骚。com| 久久综合五月天| 天天视频精品9| www.日本久久videos| 情婷婷五月天| 狠狠草狠狠草| 五月婷综合| 婷婷色五月噜噜| 日日干天天| www.五月天| 99精品在线观看视频| 五月婷深深爱激情网| 五月丁香色色| 亚洲精品第一国产综合亚AV | 国产精品噜噜在线视频| 99精品视频在线观看| 成人无码精品1区2区3区免费看| 嫩草国产| 色婷婷五月网| 五月丁香婷婷色| 婷婷WWW久久| 亚洲性图一区二区三区| 狼人婷婷综合| se色婷婷视频| 九九亚洲视频| 久久精品性爱| 乱乱av| 欧美va精品va老师va| 狠狠干五月天| 青青草婷婷五月天| 热九九在线| 久婷久婷| 超碰在线资源| 天天模,夜夜模夜夜爽| 国产成人网| 久草狼人| 丁香五月激情啪啪| 亚洲A片成人无码久久精品青桔| 超碰com| 99九九视频| 99国产99| 色婷婷丁香五月丁香| 激情小说视频图片| 97碰人人操| 天天色综网| 97在线观视频免费观看| 中海油常州环保涂料有限公司| 五月天丁香久久| 人妻六月天| 天天色综合综合| 少妇高潮呻吟A片免费看软件| 婷婷色色五月| 欧美精品99| 久久加勒比| 五月激情小说网| 超91热| www,婷婷五月天777me,com| 桃色五月天| 99ri在线视频| 九热...av| 五月丁香婷婷综合视频| 色婷婷亚洲精品天天综| 99五丁香月| 激情小说 五月天| 黄色热99| 激情五月丁香在线观看直播| 色色丁香| 九九热九九| 久久99综合| 色之综合网| 亚洲综合婷婷| 五月天激情播播网| 久久激情五月| www.天天色综合| 婷婷五月天开心网| 色综合网上班开心婷婷久久| 激情久久久| 五月香婷婷| 欧美丁香五月| 中文字幕亚洲-区久久99婷婷| 99热精地址| 丁香五月婷婷影视先锋| 激情网婷婷婷| 婷婷五月丁香99| 79色色色色| 婷五月天| 婷婷五月天国产在线播放| 日韩无码系列| 精品色色| 99欧州偷拍视频| 九热视频| 激情综合五月激情XXXX| 久热99| 五月色无码| 亚洲六月综合激情久久下卡| 五月婷网站| 日韩激情网站| 91久久五月天| 色5月婷婷| 能看的AV| 婷婷丁香五月天亚洲| 在线看AV| 五月婷婷深深爱| 91黄址| 色色激情| 久久在线人妻| 色黄啪啪| 五月丁香欧美综合| 热的五码久久精品| 少妇AB又爽又紧无码网站| 久久人人人人妻| 激情性爱网站| 久久婷五月婷| 久1色色| 激情综合视频| 五月丁香六月天| 66精品国产成人| AA片在线观看视频在线播放 | 久9久9久9久9久9久9| 五月丁香在线| 亚洲狠狠操| 丁香五月婷婷亚洲色图| 日韩1区2区| 开心五月色婷| 无码色综合| 99热这里只有精品4| 五月综合六月丁| 9视频1在线| 激情网五月天| 丁香五月婷婷综合网| 日本九九视频| 九九久久精品| 五月激情久久| 久久三级视频| 婷婷99视频在线| 91热视频色网站| 久这里只有精品| 青青999| 丁香六月婷婷| 五月天影院| 99热老网站| 人人妖人人97| 91ncom.色| 日本九九热| 久久九九玖玖| 影音先锋91网站在线观看| 久色大| 日操五月婷| 91丁香五月| 麻豆观看夏晴子| 综合AV在线|