Sebagai agen AI menjadi lebih otonom dan mampu, peran mereka bergeser dari asisten pasif ke aktor proaktif. model bahasa besar saat ini (LLM) tidak hanya menghasilkan teks - mereka menjalankan tugas, mengakses API, memodifikasi database, dan bahkan mengontrol infrastruktur. Agen AI sedang mengambil tindakan yang dulu direservasi secara ketat untuk pengguna manusia, apakah itu merencanakan pertemuan, mengimplementasikan layanan, atau mengakses dokumen sensitif. , yang Satu perintah halusinasi, petunjuk yang salah dipahami, atau izin yang terlalu luas dapat mengakibatkan kebocoran data, pelanggaran kepatuhan, atau sistem yang rusak. When agents operate without guardrails they can inadvertently make harmful or unauthorized decisions Itulah sebabnya integrasi alur kerja sangat penting untuk keamanan agen dan tanggung jawab. human-in-the-loop (HITL) adalah kerangka kerja yang dirancang untuk memungkinkan agen AI dengan kemampuan untuk tindakan-tindakan yang sensitif, sementara memungkinkan . Permit.io Permintaan Akses MCP request humans to remain the final decision-makers Permit.io Permintaan Akses MCP dibangun pada dan terintegrasi ke dalam framework agen populer seperti dan , sistem ini memungkinkan Anda memasukkan alur kerja persetujuan langsung ke dalam aplikasi yang didukung LLM Anda. Permit.io LangChain LangGraph Dalam tutorial ini, Anda akan belajar: Mengapa delegasi izin sensitif kepada manusia sangat penting untuk AI yang dapat diandalkan, Bagaimana Permit.io Model Context Protocol (MCP) memungkinkan alur kerja permintaan akses, Cara membangun sistem dunia nyata yang menggabungkan kecerdasan LLM dengan pengawasan manusia—menggunakan fitur interrupt() dari LangGraph. Sebelum kita menyelam ke dalam langkah-langkah aplikasi demo dan implementasi kami, mari kita bahas secara singkat tentang pentingnya mendelegasikan izin AI kepada manusia. Mengapa Delegasi izin AI ke manusia sangat penting Agen AI kuat, tetapi, seperti yang kita semua tahu, mereka tidak tak dapat disesatkan. Mereka mengikuti instruksi, tetapi mereka tidak memahami konteks seperti manusia.Mereka menghasilkan tanggapan, tetapi mereka tidak dapat menilai konsekuensi.Dan ketika agen-agen itu diintegrasikan ke dalam sistem nyata – alat-alat perbankan, dashboard internal, kontrol infrastruktur – itu adalah kesenjangan berbahaya. Dalam konteks ini, semua yang bisa salah cukup jelas: Agen over-permissive: LLM dapat diberikan akses ke alat-alat yang tidak seharusnya mereka sentuh, baik oleh desain atau secara tidak sengaja. Halusinasi alat panggilan: Agen dapat membuat perintah, argumen, atau ID yang tidak pernah ada. Kurangnya auditabilitas: Tanpa checkpoint manusia, tidak ada catatan yang jelas tentang siapa yang menyetujui apa, atau mengapa. Delegation is the solution. Alih-alih memberi agen kekuatan yang tidak terkendali, kami memberi mereka protokol: “Anda bisa bertanya, tapi manusia memutuskan.” Dengan memperkenalkan Dengan persetujuan pada titik-titik keputusan utama, Anda mendapatkan: human-in-the-loop (HITL) Keselamatan: Hindari tindakan yang tidak dapat diubah sebelum terjadi. Tanggung jawab: Diperlukan pendaftaran manusia yang eksplisit untuk operasi taruhan tinggi. Kontrol: Biarkan orang-orang menetapkan aturan – siapa yang dapat menyetujui, apa yang dapat disetujui, dan kapan. Ini adalah perbedaan antara seorang agen Sesuatu dan Agen untuk melakukan sesuatu. melakukan Meminta Dan itu persis apa yang Permintaan akses MCP memungkinkan. izin saya Permit.io Permintaan Akses MCP adalah bagian inti dari Model Context Protocol (MCP) – spesifikasi yang memberi agen AI akses yang aman dan sadar kebijakan ke alat dan sumber daya. The Access Request MCP izin saya Pikirkan ini sebagai jembatan antara dan . LLMs that want to act humans who need control Apa yang ia lakukan Permit’s Access Request MCP memungkinkan agen AI untuk: Meminta akses ke sumber daya terbatas (misalnya, "Apakah saya dapat mengakses restoran ini?") Minta persetujuan untuk melakukan operasi sensitif (misalnya, "Bolehkah saya memesan piring terbatas ini?") Tunggu input manusia sebelum melanjutkan—melalui mekanisme interrupt() dari LangGraph for auditing and compliance Log the request and decision Di balik adegan tersebut, ia menggunakan kemampuan otorisasi yang dibangun untuk mendukung: izin saya ReBAC (Relationship-Based Access Control) dan kebijakan Fine-grained Authorization (FGA) lainnya. Persetujuan Workflow Elemen yang didukung kebijakan yang bekerja di seluruh konteks UI, API, dan LLM Kembali Fine Grained Authorization (FGA) adalah Persetujuan Workflow Elemen yang didukung oleh kebijakan Plug-and-play dengan LangChain dan LangGraph Permit’s MCP terintegrasi langsung ke dalam dan Untuk ekosistem : LangChain MCP Adapter LangGraph Anda dapat mengekspos Permit Elements sebagai alat yang kompatibel dengan LangGraph. Anda dapat menghentikan agen dengan interrupt() ketika tindakan sensitif terjadi. Anda dapat melanjutkan eksekusi berdasarkan keputusan manusia yang sebenarnya. Ini adalah cara termudah untuk Tidak perlu custom backend. inject human judgment into AI behavior Memahami implementasi dan manfaatnya, mari kita masuk ke aplikasi demo kami. Apa yang akan kita bangun - Demo Application Overview Dalam tutorial ini kita akan membahas sebuah Di mana suatu Mereka yang real-time approval workflow AI agent can request access or perform sensitive actions, but only a human can approve Category: Sistem Pendaftaran Makanan Keluarga Untuk melihat bagaimana Permit MCP dapat membantu mengaktifkan alur kerja HITL dalam aplikasi pengguna, kita akan memodelkan Untuk keluarga : food ordering system Orang tua dapat mengakses dan mengelola semua restoran dan hidangan. Anak-anak dapat melihat barang-barang umum, tetapi harus meminta akses ke restoran terbatas atau hidangan mahal. Ketika seorang anak mengajukan permintaan, orang tua menerimanya untuk dipertimbangkan dan harus secara eksplisit menyetujui atau menolaknya sebelum tindakan dimulai. Kasus penggunaan ini mencerminkan pola yang umum: “Agennya bisa membantu, tapi manusia bisa memutuskan.” Teknologi Stack Kami akan membangun agen yang diaktifkan HITL ini menggunakan: Permit.io - Mengelola otorisasi, peran, kebijakan, dan persetujuan Permit MCP Server - Mengekspos Permit workflow sebagai alat yang dapat digunakan agen LangChain MCP Adapter - Jembatan Permit alat MCP ke LangGraph & LangChain LangGraph - Mengatur alur kerja agen dengan dukungan interrupt() Gemini 2.0 Flash - LLM ringan, multimodal yang digunakan sebagai mesin argumen agen Python: The glue holding it all together (Python: Kelenjar yang memegang semuanya bersama) Anda akan berakhir dengan sistem kerja di mana agen dapat berkolaborasi dengan manusia untuk memastikan perilaku yang aman dan disengaja - menggunakan kebijakan nyata, alat nyata, dan persetujuan real-time. A repository with the full code for this application is available here. Repository dengan kode lengkap untuk aplikasi ini tersedia di sini. Tutorial Langkah demi Langkah Dalam bagian ini, kita akan berjalan melalui bagaimana untuk menerapkan sistem agen manusia-in-the-loop yang sepenuhnya fungsional menggunakan dan Langgraph. izin saya Kami akan mencakup: Model izin dengan izin Menggunakan Permit MCP Server Menggunakan LangGraph + LangChain MCP Client Menambahkan Human-in-the-Loop dengan interrupt() Menggunakan Workflow Lengkap Mari kita masuk ke dalamnya - Model izin dengan izin Kami akan mulai dengan mendefinisikan aturan akses sistem Anda di Ini memungkinkan Anda untuk memodelkan pengguna mana yang dapat melakukan apa, dan tindakan apa yang harus memicu aliran persetujuan. Permit.io Untuk Dashboard Create a ReBAC Resource Navigasi ke halaman dari sidebar, maka: Policy Klik pada Resource tab Klik untuk membuat sumber daya Nama Sumber: Restoran Under , define two roles: ReBAC Options parent child-can-order Klik Save Sekarang, pergi ke Tab dan atur izin: Policy Editor akses penuh (membuat, membaca, memperbarui, menghapus) Anak-anak dapat membaca Set Up Permit Elements Pergilah ke the dari sidebar. dalam Bagian, 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 membuat Pada kartu elemen yang baru dibuat, klik Get Code dan catat ID konfig: restaurant-requests. Add Operation Approval Elements Create a new element: Operation Approval : Dish Approval Name : restaurants Resource Type Klik untuk membuat Then create an element: Approval Management : Dish Requests Name Klik Get Code dan salin ID config: dish-requests. Add Test Users & Resource Instances Navigasi ke Directory > Instansi Click Add Instance : restaurants Resource Type : Instance Key pizza-palace : Default Tenant (or your working tenant) Tenant Beralih ke User Tab 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 Setelah Permit dikonfigurasi, kami siap untuk mengkloning server MCP dan menghubungkan kebijakan Anda ke agen yang bekerja. Menggunakan Permit MCP Server Dengan kebijakan Anda dimodelkan di dashboard Permit, saatnya untuk membawa mereka ke kehidupan dengan mengatur layanan lokal yang mengekspos permintaan akses dan aliran persetujuan Anda sebagai alat yang dapat digunakan oleh agen AI. Permit MCP server Clone and Install the MCP Server Mulai dengan mengkloning repositori server MCP dan mengatur lingkungan virtual. 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 file pada akar proyek berdasarkan yang disediakan , dan isi dengan nilai-nilai yang benar dari pengaturan 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 dapat mendapatkan nilai-nilai ini menggunakan sumber daya berikut: Lokasi_PDP_URL Permit_API – Kunci Proyek - ID TID_ID ☀️ Catatan: Kami menggunakan untuk tutorial ini untuk mendukung evaluasi ReBAC dan pengujian latensi rendah, offline. Permit’s Local PDP (Policy Decision Point) Start the Server Dengan semuanya di tempat, Anda sekarang dapat menjalankan server MCP secara lokal: uv run -m src.permit_mcp Setelah server berjalan, itu akan mengekspos Permit Elements yang dikonfigurasi Anda (permintaan akses, manajemen persetujuan, dll.) sebagai alat yang dapat dipanggil agen melalui protokol MCP. Menggunakan LangGraph + LangChain MCP Client Sekarang bahwa Permit MCP server sedang berjalan, kami akan membangun klien agen AI yang dapat berinteraksi dengannya. Gunakan LLM bertenaga Gemini untuk memutuskan tindakan apa yang harus dilakukanDinamik memanggil alat MCP seperti request_access, approve_operation_approval, dll. Diluncurkan sepenuhnya dalam alur kerja LangGraph Pause untuk review manusia menggunakan interrupt() (dalam bagian berikutnya) Mari kita menghubungkan titik-titik Install Required Dependencies Di dalam direktori proyek MCP Anda, instal paket yang diperlukan: uv add langchain-mcp-adapters langgraph langchain-google-genai Ini memberi Anda: langchain-mcp-adapter: Mengkonversi Permit MCP tools secara otomatis menjadi alat yang kompatibel dengan LangGraph langgraph: Untuk mengoreksi alur kerja berbasis graf langchain-google-genai: Untuk berinteraksi dengan Gemini 2.0 Flash Add Google API Key Anda akan membutuhkan kunci API dari Menggunakan Gemini Menggunakan Google Studio Tambahkan Kunci ke Anda File yang : .env GOOGLE_API_KEY=your-key-here Build the MCP Client Membuat file dengan nama Dalam proyek Anda root. client.py Kami akan membagi file ini menjadi blok logika: 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"], ) Mengidentifikasi status agen 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 kode di atas, kami telah mendefinisikan node LLM dan tepi kondisinya, yang mengarah ke node jika ada panggilan alat dalam pesan status, atau mengakhiri graf. kami juga telah mendefinisikan fungsi untuk mengatur dan mengkompilasi graf dengan checkpointer dalam memori. run_tool Selanjutnya, tambahkan baris kode berikut untuk streaming tanggapan dari grafik dan tambahkan lingkaran obrolan interaktif, yang akan berjalan sampai 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 Setelah Anda menyimpan semuanya, mulailah klien: uv run client.py Setelah berjalan, file gambar baru yang disebut akan dibuat, yang menunjukkan grafik. workflow_graph.png Dengan semua yang diatur, kita sekarang dapat menentukan kueri 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! Menambahkan Human-in-the-Loop dengan interrupt() Dengan LangGraph-powered MCP client Anda up dan running, Permit tools sekarang dapat dipanggil secara otomatis. seperti memberikan akses ke sumber daya terbatas atau menyetujui operasi berisiko tinggi? sensitive, Di sinilah Langgraph menjadi berguna interrupt() Sekarang kita akan menambahkan a untuk menangkap dan menghentikan alur kerja setiap kali agen mencoba untuk memanggil alat-alat penting seperti: human approval node mengajukan permohonan / request persetujuan - persetujuan Manusia akan diminta untuk alat panggilan sebelum agen melanjutkan. manually approve or deny Define the Human Review Node Di puncak dari Anda File (Sebelumnya Kemudian tambahkan 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 apakah alat yang dipanggil dianggap "risiko tinggi."Jika demikian, grafik terganggu dengan petunjuk meminta konfirmasi manusia. Update Graph Routing Modifikasi dari fungsi sehingga alat memanggil rute ke node review manusia alih-alih berjalan 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 Update dari Fungsi untuk menambahkan 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, mari kita memperkuat fungsi untuk mendeteksi ketika grafik terganggu, mendesak untuk keputusan, dan melanjutkan dengan input manusia menggunakan . stream_responses Command(resume={"action": user_input}) Setelah menjalankan klien, grafik tidak seharusnya terlihat seperti ini: Setelah menjalankan klien, diagram grafis Anda ( ) sekarang akan mencakup node review manusia antara tahap eksekusi LLM dan alat: workflow_graph.png Hal ini memastikan bahwa Setiap kali agen mencoba membuat keputusan yang dapat mengubah izin atau menghindari pembatasan. you remain in control Dengan ini, Anda telah berhasil menambahkan pengawasan manusia ke agen AI Anda, tanpa menulis ulang alat atau logika backend Anda. Kesimpulan Dalam tutorial ini, kami membangun agen AI yang aman dan sadar manusia menggunakan . Permit.io’s Access Request MCP , yang Langgraf dan Menggunakan LangChain MCP Adapter Permit.io Permintaan Akses MCP Langgraf Menggunakan LangChain MCP Adapter Alih-alih membiarkan agen beroperasi tanpa kendali, kami memberinya kekuatan untuk Akses dan Sama seperti anggota tim yang bertanggung jawab. request defer critical decisions to human users, We covered: Cara memodelkan izin dan aliran persetujuan menggunakan Permit Elements dan ReBAC Cara mengekspos aliran tersebut melalui Permit MCP server Cara membangun klien bertenaga LangGraph yang memanggil alat-alat ini secara alami Dan cara memasukkan real-time human-in-the-loop (HITL) cek menggunakan interrupt() Ingin melihat demo lengkap dalam aksi? . GitHub Repo Further Reading - Mengamankan kolaborasi AI melalui Permissions Gateway Menggunakan MCP GitHub Repo Menggunakan LangChain MCP Adapter Memungkinkan kebijakan reBAC LangGraph interrupt() Referensi