As AI agents become more autonomous and capable, their role is shifting from passive assistants to proactive actors. Today’s large language models (LLMs) don’t just generate text—they execute tasks, access APIs, modify databases, and even control infrastructure. Agen AI sedang mengambil tindakan yang dahulu dikehendaki secara ketat untuk pengguna manusia, sama ada ia merancang mesyuarat, melancarkan perkhidmatan, atau mengakses dokumen sensitif. daripada Satu perintah hallucinated, petunjuk yang salah dipahami, atau kebenaran yang terlalu luas boleh menyebabkan kebocoran data, pelanggaran pematuhan, atau sistem yang rosak. When agents operate without guardrails they can inadvertently make harmful or unauthorized decisions Itulah sebabnya integrasi aliran kerja adalah penting untuk keselamatan dan tanggungjawab agen. human-in-the-loop (HITL) merupakan rangka kerja yang direka untuk membolehkan agen AI dengan keupayaan untuk tindakan-tindakan yang sensitif, sementara membolehkan . Permit.io Permintaan Akses MCP request humans to remain the final decision-makers Permit.io Permintaan Akses MCP telah dibina dan diintegrasikan ke dalam rangka kerja agen popular seperti dan , sistem ini membolehkan anda memasukkan aliran kerja kelulusan secara langsung ke dalam permohonan LLM anda. izinkan saya LangChain LangGraph Dalam tutorial ini, anda akan belajar: Mengapa peruntukan kebenaran sensitif kepada manusia adalah penting untuk AI yang boleh dipercayai, Bagaimana Permit.io Model Konteks Protokol (MCP) membolehkan aliran kerja permintaan capaian, Bagaimana untuk membina sistem dunia sebenar yang menggabungkan kecerdasan LLM dengan pengawasan manusia - menggunakan ciri interrupt() LangGraph. Sebelum kita menyelam ke dalam langkah-langkah aplikasi demo dan pelaksanaan kami, mari kita bahas secara ringkas pentingnya mengehadkan keizinan AI kepada manusia. Mengapa Permit AI Diperuntukkan kepada Manusia Adalah Kritikal Agen AI adalah berkuasa, tetapi, seperti yang kita semua tahu, mereka bukan tidak dapat disesatkan. Mereka mengikuti arahan, tetapi mereka tidak memahami konteks seperti manusia.Mereka menghasilkan respons, tetapi mereka tidak boleh menilai akibat.Dan apabila agen-agen ini disepadukan ke dalam sistem sebenar – alat-alat perbankan, papan panduan dalaman, kawalan infrastruktur – ia merupakan kesenjangan yang berbahaya. Dalam konteks ini, semua yang boleh salah adalah agak jelas: Agen yang terlalu membenarkan: LLM mungkin diberi akses kepada alat-alat yang tidak boleh disentuh, sama ada oleh reka bentuk atau secara kebetulan. Panggilan Alat Halusinasi: Agen boleh membina perintah, argumen, atau ID yang tidak pernah wujud. Kekurangan kawalan: Tanpa titik kawalan manusia, tidak ada rekod yang jelas tentang siapa yang meluluskan apa, atau mengapa. Delegation is the solution. Alih-alih memberi agensi kuasa yang tidak terkawal, kami memberi mereka protokol: “Anda boleh bertanya, tetapi manusia membuat keputusan.” Dengan memperkenalkan Pengesahan pada titik-titik keputusan utama, anda mendapat: human-in-the-loop (HITL) Keselamatan: Mencegah tindakan yang tidak dapat dipulihkan sebelum mereka berlaku. Tanggungjawab: Memerlukan pendaftaran manusia yang jelas untuk operasi bertaruh tinggi. Kawalan: Biarkan orang menetapkan peraturan – siapa yang boleh menyetujui, apa yang boleh disetujui, dan bila. Perbezaan Antara Agen Sesuatu dan Agen untuk melakukan sesuatu. melakukan Meminta Dan ia adalah persis apa yang Permintaan Akses MCP membolehkan. izinkan saya Permit.io Permintaan Akses MCP Ia merupakan sebahagian daripada Protokol Konteks Model (MCP) – spesifikasi yang memberikan akses yang selamat kepada alat dan sumber kepada agen AI. The Access Request MCP izinkan saya Pertimbangkan ia sebagai jambatan antara dan . LLMs that want to act humans who need control Apa yang ia lakukan Permit's Access Request MCP membolehkan agen AI untuk: Meminta akses kepada sumber terhad (contohnya, "Bolehkah saya mengakses restoran ini?") Meminta kelulusan untuk melakukan operasi sensitif (contohnya, "Bolehkah saya memesan hidangan terhad ini?") Menunggu input manusia sebelum meneruskan—melalui mekanisme interrupt() LangGraph Log permintaan dan keputusan untuk audit dan pematuhan Di belakang adegan, beliau menggunakan ‘s keizinan keupayaan dibina untuk menyokong: izinkan saya ReBAC (Relationship-Based Access Control) dan dasar Fine-grained Authorization (FGA) yang lain. Pengesahan aliran kerja Elemen yang disokong dasar yang berfungsi di seluruh konteks UI, API, dan LLM Rebuah Pengesahan gandum halus (FGA) Pengesahan aliran kerja Elemen-elemen yang disokong oleh dasar Plug-and-play dengan LangChain dan LangGraph Permit's MCP disepadukan secara langsung ke dalam dan Sistem Ekosistem : LangChain MCP Adapter LangGraph Anda boleh mendedahkan Permit Elements sebagai alat yang bersesuaian LangGraph. Anda boleh menangguhkan agen dengan interrupt() apabila tindakan sensitif berlaku. Anda boleh meneruskan eksekusi berdasarkan keputusan manusia sebenar. It’s the easiest way to Tiada custom backend diperlukan. inject human judgment into AI behavior Memahami pelaksanaan dan faedahnya, mari kita masuk ke dalam aplikasi demo kami. Apa yang Kita Akan Bina - Demo Application Overview Dalam tutorial ini, kami akan membina Di mana sebuah kepada mereka real-time approval workflow AI agent can request access or perform sensitive actions, but only a human can approve Tag: sistem pemesanan makanan keluarga Untuk melihat bagaimana Permit's MCP boleh membantu mengaktifkan aliran kerja HITL dalam aplikasi pengguna, kita akan memodelkan Untuk Keluarga : food ordering system Ibu bapa boleh mengakses dan menguruskan semua restoran dan hidangan. Kanak-kanak boleh melihat barang-barang awam, tetapi mesti meminta akses kepada restoran terhad atau hidangan mahal. Apabila seorang kanak-kanak mengemukakan permintaan, seorang ibu bapa menerimanya untuk pertimbangan dan mesti secara eksplisit menyetujui atau menolaknya sebelum tindakan berterusan. Kes penggunaan ini mencerminkan corak biasa: “Agens boleh membantu, tetapi manusia membuat keputusan.” Teknologi Stack Kami akan membina agen HITL ini menggunakan: Permit.io - Mengendalikan kuasa, peranan, dasar, dan kelulusan Membenarkan MCP Server - Mengekspos Membenarkan aliran kerja sebagai alat yang boleh digunakan oleh agen Adapter MCP LangChain - Jambatan alat MCP Permit ke dalam LangGraph & LangChain LangGraph - Mengarahkan aliran kerja agen dengan sokongan interrupt() Gemini 2.0 Flash - LLM ringan, multimodal yang digunakan sebagai enjin pertimbangan agen Python - limau yang memegang semuanya bersama-sama Anda akan berakhir dengan sistem kerja di mana agen boleh bekerjasama dengan manusia untuk memastikan tingkah laku yang selamat dan disengaja - menggunakan dasar sebenar, alat sebenar, dan kelulusan masa nyata. A repository with the full code for this application is available here. Sebuah repository dengan kod penuh untuk aplikasi ini boleh didapati di sini. Langkah demi langkah tutorial Dalam seksyen ini, kita akan berjalan melalui bagaimana untuk melaksanakan sistem agen manusia yang sepenuhnya berfungsi menggunakan dan Langgraph. izinkan saya Kami akan meliputi: Model Permit dengan Permit Menyediakan Permit MCP Server Mencipta LangGraph + LangChain MCP Client Menambah Human-in-the-Loop dengan interrupt() Menjalankan aliran kerja penuh Mari kita masuk ke dalamnya - Model Permit dengan Permit Kami akan mula dengan mendefinisikan peraturan akses sistem anda di dalam Ini membolehkan anda memodelkan pengguna mana yang boleh melakukan apa, dan tindakan apa yang perlu memicu aliran kelulusan. Permit.io untuk dashboard Create a ReBAC Resource Navigasi ke halaman daripada sidebar, kemudian: Policy Klik tab Sumber Klik untuk mencipta sumber Nama Sumber: Restoran Under , define two roles: ReBAC Options parent child-can-order Klik Simpan Sekarang, pergi kepada Tab dan hantar keizinan: Policy Editor akses penuh (menciptakan, membaca, mengemas kini, memadamkan) Perkhidmatan kanak-kanak : Read Set Up Permit Elements Pergi ke The di dalam tab dari sidebar. bahagian, klik . Elements User Management Create Element Configure the element as follows: : Restaurant Requests Name : ReBAC Resource Roles Configure elements based on : restaurants Resource Type Role permission levels Level 1 – Workspace Owner: parent Assignable Roles: child-can-order Klik untuk cipta Pada kad elemen yang baru dicipta, klik Get Code dan ambil perhatian pada config ID: restaurant-requests. Add Operation Approval Elements Create a new element: Operation Approval : Dish Approval Name : restaurants Resource Type Klik untuk cipta Then create an element: Approval Management : Dish Requests Name Klik Get Code dan salin config ID: dish-requests. Add Test Users & Resource Instances Navigasi ke Direktori > Instansi Click Add Instance : restaurants Resource Type : Instance Key pizza-palace : Default Tenant (or your working tenant) Tenant Beralih ke tab pengguna Click Add User : Key joe : Instance Access restaurants:pizza-palace#parent Click Save Create another user with the key henry Don’t assign a role Sebaik sahaja Permit dikonfigurasi, kami bersedia untuk mengklonkan pelayan MCP dan menghubungkan dasar anda kepada agen kerja. Setting Up the Permit MCP Server Dengan dasar-dasar anda dimodelkan dalam dashboard Permit, masa untuk membawa mereka kepada kehidupan dengan menetapkan perkhidmatan tempatan yang mendedahkan permintaan capaian dan aliran kelulusan anda sebagai alat yang boleh digunakan oleh agen AI. Permit MCP server Clone and Install the MCP Server Mulakan dengan mengkloning repository pelayan MCP dan menyediakan persekitaran maya. git clone <https://github.com/permitio/permit-mcp> cd permit-mcp # Create virtual environment, activate it and install dependencies uv venv source .venv/bin/activate # For Windows: .venv\\Scripts\\activate uv pip install -e . Add Environment Configuration Menciptakan a fail di akar projek berdasarkan yang disediakan , dan mengisi dengan nilai yang betul dari setup Permit anda: .env .env.example bash CopyEdit RESOURCE_KEY=restaurants ACCESS_ELEMENTS_CONFIG_ID=restaurant-requests OPERATION_ELEMENTS_CONFIG_ID=dish-requests TENANT= # e.g. default LOCAL_PDP_URL= PERMIT_API_KEY= PROJECT_ID= ENV_ID= Anda boleh mendapatkan nilai-nilai ini menggunakan sumber-sumber berikut: Lokasi_PDP_URL Permit_API kunci Projek_ID Rujukan_ID ☀️ Nota: Kami menggunakan untuk tutorial ini untuk menyokong penilaian ReBAC dan pengujian latensi rendah, offline. Permit Local PDP (Titik Keputusan Dasar) Start the Server Dengan semua di tempat, anda kini boleh menjalankan pelayan MCP secara tempatan: uv run -m src.permit_mcp Sebaik sahaja pelayan berjalan, ia akan mendedahkan Permit Elements yang dikonfigurasikan (permintaan capaian, pengurusan kelulusan, dan lain-lain) sebagai alat yang boleh dipanggil oleh agen melalui protokol MCP. Mencipta LangGraph + LangChain MCP Client Sekarang bahawa pelayan Permit MCP telah dijalankan, kami akan membina klien agen AI yang boleh berinteraksi dengannya. Gunakan LLM bertenaga Gemini untuk memutuskan tindakan apa yang perlu diambilDinamik memanggil alat MCP seperti request_access, approve_operation_approval, dan lain-lain. Menjalankan sepenuhnya dalam aliran kerja LangGraph Berhenti untuk ulasan manusia menggunakan interrupt() (dalam seksyen seterusnya) Mari kita menghubungkan titik-titik Install Required Dependencies Dalam direktori projek MCP anda, memasang pakej yang diperlukan: uv add langchain-mcp-adapters langgraph langchain-google-genai Ini memberi anda: langchain-mcp-adapter: secara automatik menukar Permit MCP tools kepada alat yang bersesuaian dengan LangGraph langgraph: Untuk mengoreksi aliran kerja berasaskan graf langchain-google-genai: Untuk berinteraksi dengan Gemini 2.0 Flash Add Google API Key Anda akan memerlukan kunci API daripada Menggunakan Gemini Home » Google AI Studio Add the key to your Fail : .env GOOGLE_API_KEY=your-key-here Build the MCP Client Mencipta fail yang dinamakan dalam rancangan anda. client.py Kami akan memecah fail ini ke dalam blok logik: Imports and Setup Start by importing dependencies and loading environment variables: import os from typing_extensions import TypedDict, Literal, Annotated from dotenv import load_dotenv from langchain_google_genai import ChatGoogleGenerativeAI from langgraph.graph import StateGraph, START, END from langgraph.types import Command, interrupt from langgraph.checkpoint.memory import MemorySaver from langgraph.prebuilt import ToolNode from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client from langchain_mcp_adapters.tools import load_mcp_tools import asyncio from langgraph.graph.message import add_messages Then, load the environment and set up your Gemini LLM: load_dotenv() global_llm_with_tools = None llm = ChatGoogleGenerativeAI( model="gemini-2.0-flash", google_api_key=os.getenv('GOOGLE_API_KEY') ) Tell LangGraph how to communicate with the running MCP server: Configure MCP Server Parameters server_params = StdioServerParameters( command="python", args=["src/permit_mcp/server.py"], ) Menentukan status agensi bersama: class State(TypedDict): messages: Annotated[list, add_messages] and the : Define Workflow Nodes graph builder Here’s the logic to route between calling the LLM and invoking tools: async def call_llm(state): response = await global_llm_with_tools.ainvoke(state["messages"]) return {"messages": [response]} def route_after_llm(state) -> Literal[END, "run_tool"]: return END if len(state["messages"][-1].tool_calls) == 0 else "run_tool" async def setup_graph(tools): builder = StateGraph(State) run_tool = ToolNode(tools) builder.add_node(call_llm) builder.add_node('run_tool', run_tool) builder.add_edge(START, "call_llm") builder.add_conditional_edges("call_llm", route_after_llm) builder.add_edge("run_tool", "call_llm") memory = MemorySaver() return builder.compile(checkpointer=memory) Dalam kod di atas, kami telah mendefinisikan nod LLM dan tepi bersyaratnya, yang mengarahkan kepada Node jika terdapat panggilan alat dalam mesej status, atau mengakhiri grafik.Kami juga telah mendefinisikan fungsi untuk menetapkan dan mengkompilasi grafik dengan penanda dalam memori. run_tool Seterusnya, tambahkan baris kod berikut untuk aliran respons daripada grafik dan tambahkan loop chat interaktif, yang akan berjalan sehingga ia secara eksplisit keluar. and an : Stream Output and Handle Chat Input, infinite loop for user interaction async def stream_responses(graph, config, invokeWith): async for event in graph.astream(invokeWith, config, stream_mode='updates'): for key, value in event.items(): if key == 'call_llm': content = value["messages"][-1].content if content: print('\\n' + ", ".join(content) if isinstance(content, list) else content) async def chat_loop(graph): while True: try: user_input = input("\\nQuery: ").strip() if user_input in ["quit", "exit", "q"]: print("Goodbye!") break sys_m = """ Always provide the resource instance key during tool calls, as the ReBAC authorization model is being used. To obtain the resource instance key, use the list_resource_instances tool to view available resource instances. Always parse the provided data before displaying it. If the user has initially provided their ID, use that for subsequent tool calls without asking them again. """ invokeWith = {"messages": [ {"role": "user", "content": sys_m + '\\n\\n' + user_input}]} config = {"configurable": {"thread_id": "1"}} await stream_responses(graph, config, invokeWith) except Exception as e: print(f"Error: {e}") Final Assembly Add the main entry point where we will convert the Permit MCP server tool to LangGraph-compatible tools, bind our LLM to the resulting tools, set up the graph, draw it to a file, and fire up the chat loop: python CopyEdit async def main(): async with stdio_client(server_params) as (read, write): async with ClientSession(read, write) as session: await session.initialize() tools = await load_mcp_tools(session) llm_with_tools = llm.bind_tools(tools) graph = await setup_graph(tools) global global_llm_with_tools global_llm_with_tools = llm_with_tools with open("workflow_graph.png", "wb") as f: f.write(graph.get_graph().draw_mermaid_png()) await chat_loop(graph) if __name__ == "__main__": asyncio.run(main()) Lastly, Run the Client Sebaik sahaja anda menyimpan semua, mula klien: uv run client.py Selepas menjalankan, fail imej baru yang dipanggil akan dicipta, yang menunjukkan grafik. workflow_graph.png Dengan semua yang disediakan, kita kini boleh menentukan pertanyaan seperti ini: Query: My user id is henry, request access to pizza palace with the reason: I am now 18, and the role child-can-order Query: My user id is joe, list all access requests Your agent is now able to call MCP tools dynamically! Menambah Human-in-the-Loop dengan interrupt() Dengan klien MCP bertenaga LangGraph anda dan berjalan, alat Permit kini boleh dipanggil secara automatik. seperti memberi akses kepada sumber terhad atau mengesahkan operasi berisiko tinggi? sensitive, Di sinilah Langgraph menjadi berguna interrupt() Sekarang kita akan menambah a untuk menangkap dan menghentikan aliran kerja bila-bila masa agen cuba memanggil alat-alat penting seperti: human approval node Permohonan / Permohonan / Permohonan Pengesahan / pengesahan / pengesahan Manusia akan diminta untuk alat panggilan sebelum agen melanjutkan. manually approve or deny Define the Human Review Node Di puncak anda Fail (sebelum 3) Masukkan fungsi berikut: client.py setup_graph async def human_review_node(state) -> Command[Literal["call_llm", "run_tool"]]: """Handle human review process.""" last_message = state["messages"][-1] tool_call = last_message.tool_calls[-1] high_risk_tools = ['approve_access_request', 'approve_operation_approval'] if tool_call["name"] not in high_risk_tools: return Command(goto="run_tool") human_review = interrupt({ "question": "Do you approve this tool call? (yes/no)", "tool_call": tool_call, }) review_action = human_review["action"] if review_action == "yes": return Command(goto="run_tool") return Command(goto="call_llm", update={"messages": [{ "role": "tool", "content": f"The user declined your request to execute the {tool_call.get('name', 'Unknown')} tool, with arguments {tool_call.get('args', 'N/A')}", "name": tool_call["name"], "tool_call_id": tool_call["id"], }]}) Node ini memeriksa sama ada alat yang dipanggil dianggap "berisiko tinggi." Update Graph Routing Mengubahnya kepada berfungsi supaya alat memanggil laluan kepada nod tinjauan manusia alih-alih menjalankan segera: route_after_llm def route_after_llm(state) -> Literal[END, "human_review_node"]: """Route logic after LLM processing.""" return END if len(state["messages"][-1].tool_calls) == 0 else "human_review_node" Wire in the HITL Node mengemas kini Fungsi untuk menambah sebagai node dalam graf: setup_graph human_review_node async def setup_graph(tools): builder = StateGraph(State) run_tool = ToolNode(tools) builder.add_node(call_llm) builder.add_node('run_tool', run_tool) builder.add_node(human_review_node) # Add the interrupt node here builder.add_edge(START, "call_llm") builder.add_conditional_edges("call_llm", route_after_llm) builder.add_edge("run_tool", "call_llm") memory = MemorySaver() return builder.compile(checkpointer=memory) Handle Human Input During Runtime Akhirnya, kita akan meningkatkan function to detect when the graph is interrupted, prompt for a decision, and resume with human input using . stream_responses Command(resume={"action": user_input}) Selepas menjalankan klien, grafik tidak boleh kelihatan seperti ini: Selepas menjalankan klien, diagram grafik anda ( ) kini akan memasukkan nod ulasan manusia antara tahap pelaksanaan LLM dan alat: workflow_graph.png Ini memastikan bahawa setiap kali agen cuba membuat keputusan yang boleh mengubah keizinan atau mengelakkan pembatasan. you remain in control Dengan ini, anda telah berjaya menambah pengawasan manusia kepada agen AI anda, tanpa menuliskannya semula alat atau logik backend anda. Kesimpulan Dalam tutorial ini, kami membina agen AI yang selamat dan sedar manusia menggunakan . Permit.io Permintaan Akses MCP daripada Langgraf dan LangChain MCP Adapters Permit.io Permintaan Akses MCP Langgraf Penyesuai LangChain MCP Alih-alih membiarkan agensi beroperasi tanpa kawalan, kami memberikan kuasa untuk Akses dan Sama seperti ahli pasukan yang bertanggungjawab. request defer critical decisions to human users, We covered: Bagaimana untuk memodelkan kebenaran dan aliran kelulusan menggunakan Permit Elements dan ReBAC Bagaimana untuk mengekspos aliran ini melalui Permit MCP server Bagaimana untuk membina klien bertenaga LangGraph yang memanggil alat-alat ini secara semulajadi Dan bagaimana untuk memasukkan real-time human-in-the-loop (HITL) cek menggunakan interrupt() Ingin melihat demo penuh dalam tindakan? . Perkhidmatan GitHub Repo Further Reading - Menjamin kerjasama AI melalui gateway kebenaran Membolehkan MCP GitHub Repo LangChain MCP Adapter Dokumen Permit Kebijakan ReBAC LangGraph interrupt() rujukan