នៅពេលដែលអេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រ អាជីវកម្មអេឡិចត្រូនិចកំពុងធ្វើការដែលជាមុនត្រូវបានរក្សាទុកដោយផ្ទាល់ខ្លួនសម្រាប់អ្នកប្រើប្រាស់បុគ្គលិក, ដូចជាការរៀបរៀបរាប់ការជួបប្រជុំ, ការដំឡើងសេវាកម្មឬការចូលទៅក្នុងឯកសារដែលមានអត្ថប្រយោជន៍។ លោក ការបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ជាបញ្ When agents operate without guardrails they can inadvertently make harmful or unauthorized decisions ដូច្នេះការរួមបញ្ចូល ការធ្វើដំណើរការងារគឺជាការសំខាន់សម្រាប់ការសុវត្ថិភាពនិងការអនុញ្ញាត។ human-in-the-loop (HITL) វាគឺជាប្រព័ន្ធដែលត្រូវបានរចនាឡើងដើម្បីអនុញ្ញាតឱ្យអាជីវកម្ម AI មានសមត្ថភាពដើម្បី លក្ខណៈពិសេសក្នុងការអនុញ្ញាតឱ្យ . Permit.io’s Access Request MCP request humans to remain the final decision-makers គោលបំណង MCP របស់ Permit.io បានបង្កើតឡើង និងរួមបញ្ចូលទៅក្នុងប្រព័ន្ធប្រតិបត្តិការ Agent Frameworks ដែលជា និង ប្រព័ន្ធនេះអនុញ្ញាតឱ្យអ្នកចូលដំណើរការការងារអនុម័តដោយផ្ទាល់ទៅក្នុងកម្មវិធី LLM របស់អ្នក។ សូមអរគុណ LangChain LangGraph នៅក្នុង tutorial នេះអ្នកនឹងរកឃើញ: Why Delegating Sensitive Permissions to Humans is Critical for Trustworthy AI តើប្រព័ន្ធប្រតិបត្តិការ Model Context Protocol (MCP) របស់ Permit.io អនុញ្ញាតឱ្យដំណើរការទម្រង់អតិថិជនបានធ្វើដូចម្តេច? តើធ្វើដូចម្តេចដើម្បីបង្កើតប្រព័ន្ធក្នុងពិភពលោកពិតប្រាកដដែលរួមបញ្ចូលគ្នានៃការយល់ដឹង LLM ជាមួយនឹងការត្រួតពិនិត្យរបស់មនុស្សដោយប្រើលក្ខណៈពិសេស interrupt() របស់ LangGraph ។ មុនពេលដែលយើងចូលទៅក្នុងដំណោះស្រាយកម្មវិធីបង្ហាញនិងការអនុវត្តរបស់យើង, សូមពិនិត្យឡើងវិញយ៉ាងឆាប់រហ័សអំពីសំខាន់នៃការផ្លាស់ប្តូរសមត្ថភាព AI ទៅមនុស្ស។ Why Delegating AI permissions to humans is critical អគ្គិសនី AI គឺមានប្រសិទ្ធិភាពប៉ុន្តែដូចជាយើងទាំងអស់បានដឹងថាពួកគេមិនអាចបាត់បង់បានទេ។ ពួកគេត្រូវបានអនុវត្តដោយសារតែពួកគេត្រូវបានអនុវត្តដោយសារតែពួកគេត្រូវបានអនុវត្តដោយសារតែពួកគេត្រូវបានអនុវត្តដោយសារតែពួកគេត្រូវបានអនុវត្តដោយសារតែពួកគេត្រូវបានអនុវត្តដោយសារតែពួកគេត្រូវបានអនុវត្តដោយសារតែពួកគេត្រូវបានអនុវត្តដោយពួកគេត្រូវបានអនុវត្តដោយពួកគេត្រូវបានអនុវត្តដោយពួកគេត្រូវបានអនុវត្តដោយពួកគេត្រូវបានអនុវត្តដោយពួកគេត្រូវបានអនុវត្តដោយពួកគេត្រូវបានអនុវត្តដោយពួកគេត្រូវបានអនុវត្តដោយពួកគេត្រូវបានអនុវត្តដោយពួកគេត្រូវបានអនុវត្តដោយពួកគេត្រូវបានអនុវត្តដោយពួកគេត្រូវបានអនុវត្តដោយពួកគេត្រូវបានអនុវត្តដោយពួកគេត្រូវបានអនុវត្តដោយពួកគេត្រូវបានអនុវត្តដោយពួកគេត្រូវបានអនុវត្តដោយ ក្នុងនាមទាំងអស់ដែលអាចធ្វើបានយ៉ាងហោចណាស់គឺយ៉ាងច្បាស់លាស់: អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់។ ការទូរស័ព្ទឧបករណ៍ Hallucinated: អេក្រង់អាចបង្កើតជម្រើស, អេក្រង់, ឬ IDs ដែលមិនមានទេ។ មិនមានការត្រួតពិនិត្យ: មិនមានទីតាំងត្រួតពិនិត្យរបស់មនុស្ស, មិនមានការត្រួតពិនិត្យដែលមានការត្រួតពិនិត្យដែលមានការត្រួតពិនិត្យដែលមានការត្រួតពិនិត្យដែលមានការត្រួតពិនិត្យដែលមានការត្រួតពិនិត្យដែលមានការត្រួតពិនិត្យ។ Delegation is the solution. នៅពេលដែលយើងផ្តល់នូវថាមពលដោយគ្មានការត្រួតពិនិត្យ, យើងផ្តល់ឱ្យពួកគេនូវប្រព័ន្ធប្រតិបត្តិការ: «អ្នកអាចសួរទេប៉ុន្តែបុរសបានជ្រើសរើស។» ដោយការបង្ហាញ ការទទួលបានអត្ថប្រយោជន៍នៅក្នុងតំបន់បំណងសំខាន់ៗអ្នកទទួលបាន: human-in-the-loop (HITL) ការសុវត្ថិភាព: កាត់បន្ថយកម្មវិធីដែលមិនអាចជួសជុលបានមុនពេលដែលវាត្រូវបានធ្វើឡើង។ គោលបំណង: គោលបំណងនេះត្រូវការការចុះឈ្មោះរបស់មនុស្សសម្រាប់ប្រតិបត្តិការមានតម្លៃខ្ពស់។ ការត្រួតពិនិត្យ: សូមអនុញ្ញាតឱ្យមនុស្សកំណត់គោលដៅ - អ្នកដែលអាចអនុញ្ញាត, អ្វីដែលអាចអនុញ្ញាតបាននិងពេលដែល។ វាគឺជាការផ្សេងគ្នានៃមិត្តភក្តិ អ្វីមួយនិងមិត្តភក្តិ ដើម្បីធ្វើអ្វី ការធ្វើ ការគាំទ្រ ហើយវាគឺជាអ្វីដែល គោលបំណង MCP ដែលអាចប្រើបាន។ សូមអរគុណ គោលបំណង MCP របស់ Permit.io គឺជាផ្នែកសំខាន់នៃ Model Context Protocol (MCP) - វិញ្ញាបនប័ត្រដែលផ្តល់នូវអតិថិជនអាជីវកម្មដែលមានជំនាញវិជ្ជាជីវៈសុវត្ថិភាពនិងមានជំនាញវិជ្ជាជីវៈដល់ឧបករណ៍និងឧបករណ៍។ The Access Request MCP សូមអរគុណ សូមគិតថាវាគឺជាប្រហែលជាប្រហែលជាប្រហែលជាប្រហែលជាប្រហែលជាប្រហែលជាប្រហែលជាប្រហែលជាប្រហែលជាប្រហែល និង . LLMs that want to act humans who need control អ្វីដែលវាធ្វើ កម្មវិធី MCP Access Request របស់អ្នកអនុញ្ញាតឱ្យអ្នកជំនាញ AI ដើម្បី: គោលបំណងដើម្បីចូលទៅក្នុងសម្ភារៈដែលមានកំណត់ (ដូចជា "ខ្ញុំអាចចូលទៅក្នុងសម្ភារៈនេះទេ?") សូមស្វែងរកការអនុញ្ញាតដើម្បីធ្វើប្រតិបត្តិការដែលមានអារម្មណ៍ (ដូចជា, "ខ្ញុំអាចទិញតម្រូវការនេះ?") សូមអរគុណសម្រាប់ការចូលរបស់មនុស្សមុនពេលដំណើរការ—តាមរយៈឧបករណ៍ interrupt() នៃ LangGraph សៀវភៅសៀវភៅសៀវភៅសៀវភៅសៀវភៅសៀវភៅសៀវភៅសៀវភៅសៀវភៅសៀវភៅសៀវភៅសៀវភៅ នៅខាងក្រៅនៃរូបរាងនេះវាត្រូវបានប្រើ សមត្ថភាពការអនុញ្ញាតបានបង្កើតឡើងដើម្បីគាំទ្រ: សូមអរគុណ ReBAC (Relationship-Based Access Control) និងគោលបំណងវិញ្ញាបនប័ត្រ Fine-grained (FGA) ផ្សេងទៀត។ វិញ្ញាបនប័ត្រការងារ សម្ភារៈដែលគាំទ្រដោយគោលបំណងដែលធ្វើការតាមរយៈ UI, API និង LLM យោបល់ សញ្ញាបនប័ត្រកម្រិតខ្ពស់ (Fine Grained Authorization - FGA) វិញ្ញាបនប័ត្រការងារ គោលបំណងដែលគាំទ្រ កម្មវិធី Plug-and-play ជាមួយ LangChain និង LangGraph MCP របស់ Permit ត្រូវបានរួមបញ្ចូលដោយផ្ទាល់ទៅក្នុង និង ប្រព័ន្ធអាកាសធាតុ: LangChain MCP Adapter LangGraph អ្នកអាចបង្ហាញអនុញ្ញាតអ៊ីម៉ែលជាឧបករណ៍ដែលសមស្របជាមួយ LangGraph ។ អ្នកអាចកាត់បន្ថយអេក្រង់ដោយ interrupt() នៅពេលដែលការប្រតិបត្តិការដែលមានអារម្មណ៍កើតឡើង។ អ្នកអាចចាប់ផ្តើមការអនុវត្តដោយផ្អែកលើការជ្រើសរើសរបស់មនុស្សពិតប្រាកដ។ នេះគឺជាវិធីងាយស្រួលបំផុតដើម្បី មិនចាំបាច់ធ្វើការ backend ។ inject human judgment into AI behavior ការយល់ដឹងអំពីការអនុវត្តនិងអត្ថប្រយោជន៍របស់វា, សូមចូលទៅក្នុងកម្មវិធីបង្ហាញរបស់យើង។ អ្វីដែលយើងនឹងបង្កើត - ការពិនិត្យឡើងវិញកម្មវិធី Demo ក្នុងកម្មវិធីបច្ចុប្បន្ននេះយើងនឹងបង្កើត a ក្នុងនាមជា ពួកគេ real-time approval workflow AI agent can request access or perform sensitive actions, but only a human can approve ប្រព័ន្ធ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ Family Food ដើម្បីមើលពីរបៀបដែល MCP របស់ Permit អាចជួយអនុញ្ញាតដំណើរការការងារ HITL ក្នុងកម្មវិធីអ្នកប្រើប្រាស់យើងនឹងរៀបចំនៃដំណោះស្រាយ សម្រាប់សហគ្រាស: food ordering system កុមារអាចចូលទៅក្នុងនិងគ្រប់គ្រងសណ្ឋាគារនិងសណ្ឋាគារទាំងអស់។ កុមារអាចមើលប្រសិនបើអ្នកអាចមើលប្រសិនបើអ្នកអាចមើលប្រសិនបើអ្នកអាចមើលប្រសិនបើអ្នកអាចរកឃើញប្រសិនបើអ្នកអាចរកឃើញប្រសិនបើអ្នកអាចរកឃើញប្រសិនបើអ្នកអាចរកឃើញប្រសិនបើអ្នកអាចរកឃើញប្រសិនបើអ្នកអាចរកឃើញប្រសិនបើអ្នកអាចរកឃើញប្រសិនបើអ្នកអាចរកឃើញប្រសិនបើអ្នកអាចរកឃើញប្រសិនបើអ្នកអាចរកឃើញប្រសិនបើអ្នកអាចរកឃើញប្រសិនបើអ្នកមានតម្លៃខ្ពស់។ នៅពេលដែលកុមារផ្ញើអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជនអតិថិជន ការប្រើប្រាស់នេះបង្ហាញពីគំរូដែលធម្មតានិងធម្មតានេះ: «អាជីវកម្មអាចជួយអ្នកទេប៉ុន្តែមនុស្សអាចជួយអ្នក»។ ការបច្ចេកទេស Stack យើងនឹងបង្កើតអេក្រង់ HITL ដែលអាចប្រើបាននេះដោយប្រើ: Permit.io - អនុញ្ញាតឱ្យគ្រប់គ្រងការអនុញ្ញាត, គោលនយោបាយនិងការអនុញ្ញាត អនុញ្ញាតឱ្យ MCP Server - ការបង្ហាញអនុញ្ញាតឱ្យដំណើរការការងារជាឧបករណ៍ដែលអេក្រង់អាចប្រើបាន ម៉ាស៊ីនផ្គត់ផ្គង់ LangChain MCP Adapters - Bridges permits MCP tools into LangGraph & LangChain LangGraph - ប្រព័ន្ធប្រតិបត្តិការប្រព័ន្ធប្រតិបត្តិការរបស់អ្នកជាមួយនឹងការគាំទ្រ interrupt() Gemini 2.0 Flash - Lightweight, multimodal LLM ដែលត្រូវបានប្រើជាម៉ាស៊ីនបម្រើអេក្រង់ Python - The glue holding it all together (ប្រព័ន្ធផ្សព្វផ្សាយ) អ្នកនឹងបញ្ចប់ជាមួយនឹងប្រព័ន្ធធ្វើការដែលអេក្រង់អាចធ្វើការជាមួយមនុស្សដើម្បីធានាឱ្យមានพฤติกรรมដែលមានសុវត្ថិភាពនិងមានគោលបំណង - ដោយប្រើគោលបំណងពិតប្រាកដ, ឧបករណ៍ពិតប្រាកដនិងការអនុញ្ញាតនៅក្នុងពេលវេលាពិតប្រាកដ។ A repository with the full code for this application is available here. សៀវភៅដែលមានកូដពេញលេញសម្រាប់កម្មវិធីនេះអាចរកបាននៅទីនេះ។ គោលបំណង step-by-step នៅក្នុងផ្នែកនេះយើងនឹងដោះស្រាយអំពីរបៀបដើម្បីអនុវត្តប្រព័ន្ធ agent human-in-the-loop ដែលមានប្រតិបត្តិការពេញលេញដោយប្រើ និង LangGraph ។ សូមអរគុណ យើងនឹងគ្របដណ្តប់: គំរូ គំរូ គំរូ គំរូ គំរូ គំរូ គំរូ គំរូ ការបង្កើតកម្មវិធី MCP Server ការបង្កើតកម្មវិធី LangGraph + LangChain MCP Client បន្ថែម ប្រព័ន្ធ ប្រតិបត្តិការ Human-in-the-Loop with interrupt() ការបើកដំណើរការការងារពេញលេញ សូមចូលទៅក្នុងវា - គំរូ គំរូ គំរូ គំរូ គំរូ គំរូ គំរូ គំរូ យើងនឹងចាប់ផ្តើមដោយការកំណត់ច្បាប់ការចូលរបស់ប្រព័ន្ធរបស់អ្នកនៅខាងក្នុង នេះអនុញ្ញាតឱ្យអ្នករៀបចំនៃអ្នកប្រើប្រាស់ដែលអាចធ្វើអ្វីនិងការធ្វើអ្វីដែលគួរកាត់បន្ថយដំណើរការអនុញ្ញាត។ ប្រព័ន្ធប្រតិបត្តិការ iOS Dashboard Create a ReBAC Resource navigate ទៅលើ ទំព័រពី sidebar បន្ទាប់មក: Policy ចុចលើ Resources Tab Click បាន បង្កើត សមត្ថភាព សៀវភៅ សៀវភៅ សៀវភៅ សៀវភៅ Under , define two roles: ReBAC Options parent child-can-order ចុច Save ឥឡូវនេះ, សូមចូលទៅក្នុង ទាញយកនិងទាញយកអត្ថប្រយោជន៍: Policy Editor ការចូលរួមទាំងអស់ (Create, Read, Update, Delete) កុមារកុមារកុមារកុមារ - Read Set Up Permit Elements សូមចូលទៅក្នុង The សៀវភៅសៀវភៅសៀវភៅសៀវភៅសៀវភៅសៀវភៅសៀវភៅសៀវភៅ ទំព័រដើម, Click . 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 Click ដើម្បីបង្កើត នៅ ក្នុង កាត សម្ភារៈ បានបង្កើតថ្មីៗ, ចុច Get Code និង ពិនិត្យឡើងវិញ កាត config ID: restaurant-requests ។ យើងនឹងប្រើវាបន្ទាប់មកនៅក្នុងឯកសារ .env ។ Add Operation Approval Elements Create a new element: Operation Approval : Dish Approval Name : restaurants Resource Type Click ដើម្បីបង្កើត Then create an element: Approval Management : Dish Requests Name សូមចុច Get Code ហើយចុច Config ID: dish-requests ។ Add Test Users & Resource Instances Navigate to Directory > ប្រព័ន្ធប្រតិបត្តិការ Click Add Instance : restaurants Resource Type : Instance Key pizza-palace : Default Tenant (or your working tenant) Tenant ការផ្លាស់ប្តូរទៅ 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 បន្ទាប់ពីអនុញ្ញាតត្រូវបានកំណត់, យើងបានរចនាឡើងដើម្បីកាត់បន្ថយសេវាកម្ម MCP និងតភ្ជាប់គោលដៅរបស់អ្នកជាមួយអធិដែលធ្វើការ។ ការបង្កើតកម្មវិធី MCP Server នៅពេលដែលគោលនយោបាយរបស់អ្នកត្រូវបានរចនាឡើងនៅក្នុងប្រព័ន្ធប្រតិបត្តិការអនុញ្ញាត, ពេលនេះគឺជាពេលដើម្បីធ្វើឱ្យពួកគេមានជីវិតដោយបង្កើតប្រព័ន្ធប្រតិបត្តិការ —សេវាកម្មផ្ទាល់ខ្លួនដែលបង្ហាញសំណួរការចូលនិងការអនុញ្ញាតរបស់អ្នកជាឧបករណ៍ដែលអេក្រង់ AI អាចប្រើ។ Permit MCP server Clone and Install the MCP Server ការចាប់ផ្តើមដោយការកាត់បន្ថយ repo MCP Server និងបង្កើតបរិស្ថានបច្ចុប្បន្ន។ 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 បានបង្កើត a ប្រព័ន្ធ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ , និងបញ្ចប់វាជាមួយគុណភាពត្រឹមត្រូវពីការកំណត់អនុញ្ញាតរបស់អ្នក: .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= អ្នកអាចទាញយកតម្លៃទាំងនេះដោយប្រើឧបករណ៍ដូចខាងក្រោម: LOCAL_PDP_URL PERMIT_API_KEY គម្រោង ID អាសយដ្ឋាន ☀️សេចក្តីអធិប្បាយ: យើងកំពុងប្រើ សម្រាប់វគ្គបណ្តុះបណ្តាលនេះដើម្បីគាំទ្រការវិញ្ញាបនប័ត្រ ReBAC និងការធ្វើតេស្តដោយឥតគិតថ្លៃដោយឥតគិតថ្លៃ។ PPP (Politics Decision Point) នៃការអនុញ្ញាត។ Start the Server ប្រសិនបើអ្នកមានអ្វីគ្រប់យ៉ាងនៅទីនេះ, អ្នកអាចដំណើរការបណ្តាញ MCP ដោយផ្ទាល់នៅទីនេះ: uv run -m src.permit_mcp បន្ទាប់ពីបណ្តាញត្រូវបានធ្វើដំណើរការវានឹងបង្ហាញប្រព័ន្ធអនុញ្ញាតដែលបានកំណត់របស់អ្នក (តម្រូវការចូល, ការគ្រប់គ្រងការអនុញ្ញាត, ល) ដូចជាឧបករណ៍ដែលអេក្រង់អាចហៅតាមរយៈប្រព័ន្ធប្រតិបត្តិការ MCP ។ ការបង្កើតកម្មវិធី LangGraph + LangChain MCP Client ឥឡូវនេះដែលប្រព័ន្ធប្រតិបត្តិការ MCP ដែលអាចអនុញ្ញាតបានត្រូវបានដំណើរការហើយយើងនឹងបង្កើតអតិថិជនអេក្រង់ AI ដែលអាចចូលរួមជាមួយវា។ អតិថិជននេះនឹង: ប្រើកម្មវិធី LLM ដែលអនុញ្ញាតឱ្យ Gemini ដើម្បីកំណត់ការធ្វើតេស្តដែលត្រូវធ្វើDynamically invoke MCP tools such as request_access, approve_operation_approval, etc. ការដំណើរការទាំងអស់នៅក្នុងដំណើរការ LangGraph ការបាត់បន្ថយសម្រាប់ការពិនិត្យរបស់មនុស្សដោយប្រើ interrupt() (នៅក្នុងផ្នែកបន្ទាប់) សូមទាញយក Dots ។ Install Required Dependencies ក្នុងប្រព័ន្ធប្រតិបត្តិការ MCP របស់អ្នកអ្នកអាចដំឡើងកញ្ចប់ដែលត្រូវការ។ uv add langchain-mcp-adapters langgraph langchain-google-genai នេះផ្តល់ឱ្យអ្នក: langchain-mcp-adapters: ដោយស្វ័យប្រវត្តិផ្លាស់ប្តូរឧបករណ៍អនុញ្ញាត MCP ទៅជាឧបករណ៍ដែលសមរម្យជាមួយ LangGraph langgraph: សម្រាប់ការរចនាសម្ព័ន្ធដំណើរការបណ្តុះបណ្តាលដែលមានមូលដ្ឋានលើបណ្តុះបណ្តាល langchain-google-genai: សម្រាប់ការចូលរួមជាមួយ Gemini 2.0 Flash Add Google API Key អ្នកនឹងត្រូវគោលបំណង API ពី សូមប្រើ Gemini ។ សាកលវិទ្យាល័យ Google សូមបន្ថែមគោលបំណងរបស់អ្នក សៀវភៅ: .env GOOGLE_API_KEY=your-key-here Build the MCP Client បានបង្កើតឯកសារដែលមានឈ្មោះ នៅក្នុងគម្រោង root របស់អ្នក client.py យើងនឹងកាត់បន្ថយឯកសារនេះទៅក្នុងប្លុកប្រវត្តិសាស្រ្ត: 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"], ) សូមបញ្ជាក់អំពីការផ្លាស់ប្តូរកម្មវិធី Share Agent State: 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) ក្នុងកូដខាងលើយើងបានកំណត់កូដ LLM និងតម្រូវការតម្រូវការរបស់វាដែលធ្វើដំណើរទៅ វាត្រូវបានកំណត់ដោយបច្ចុប្បន្នភាពនៅពេលវេលា។ យើងបានកំណត់បច្ចុប្បន្នភាពនៅពេលវេលា។ យើងបានកំណត់បច្ចុប្បន្នភាពនៅពេលវេលា។ យើងបានកំណត់បច្ចុប្បន្នភាពនៅពេលវេលា។ run_tool បន្ទាប់មកបន្ថែមលេខកូដដូចខាងក្រោមដើម្បីផ្លាស់ប្តូរការឆ្លើយតបពីក្រាហ្វិកនិងបន្ថែម loop chat interactive ដែលនឹងដំណើរការដល់ពេលវេលាដែលវាត្រូវបានផ្លាស់ប្តូរ។ 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 Once you’ve saved everything, start the client: uv run client.py បន្ទាប់ពីការដំឡើង, ឯកសាររូបភាពថ្មីដែលមានឈ្មោះ វាត្រូវបានបង្កើតឡើងដែលបង្ហាញពីកាត្រា។ workflow_graph.png នៅពេលដែលអ្វីគ្រប់យ៉ាងត្រូវបានបង្កើតឡើងយើងអាចបញ្ជាក់សំណួរដូចនេះ: 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! ការបន្ថែម Human-in-the-Loop ជាមួយ interrupt() ជាមួយនឹងអតិថិជន MCP របស់អ្នកដែលមានប្រសិទ្ធិភាពដោយ LangGraph បានបើកនិងដំណើរការបន្ទាប់មកឧបករណ៍អនុញ្ញាតអាចត្រូវបានទាញយកដោយស្វ័យប្រវត្តិ។ ប៉ុន្តែអ្វីដែលមានប្រសើរឡើងនៅពេលដែលការអនុវត្តគឺ ដូចជាការអនុញ្ញាតឱ្យការចូលទៅក្នុងសម្ភារៈដែលមានកម្រិតខ្ពស់ឬការអនុញ្ញាតឱ្យប្រតិបត្តិការដែលមានសុវត្ថិភាពខ្ពស់? sensitive, នេះគឺជាកន្លែងដែល LangGraph បាន ធ្វើឱ្យមានប្រសិទ្ធិភាព interrupt() ឥឡូវនេះយើងនឹងបន្ថែម a ដើម្បីកាត់បន្ថយនិងកាត់បន្ថយដំណើរការការងារនៅពេលដែលអេក្រង់ធ្វើតេស្តដើម្បីបង្កើតឧបករណ៍សំខាន់ដូចជា: human approval node សូមអរគុណ_access_request approve_operation_approval មនុស្សនឹងត្រូវបានគួរឱ្យ គោលបំណងរបស់អ្នកមុនពេលដែលក្រុមហ៊ុនផ្គត់ផ្គង់ធ្វើការ manually approve or deny Define the Human Review Node នៅលើខ្សែភាពយន្តរបស់អ្នក សៀវភៅ (មុនពេល លើសពីនេះបានបន្ថែមបច្ចុប្បន្នភាពដូចខាងក្រោម: 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"], }]}) វាគឺជាការត្រួតពិនិត្យថាតើឧបករណ៍ដែលត្រូវបានចែកចាយត្រូវបានគេស្គាល់ថាជា "មានសុវត្ថិភាពខ្ពស់" ។ ប្រសិនបើវាគឺវាត្រូវបានកាត់បន្ថយគ្រីបនេះដោយសារតែការចែកចាយដែលគួរឱ្យមានការត្រួតពិនិត្យរបស់មនុស្ស។ Update Graph Routing ការផ្លាស់ប្តូរ ឧបករណ៍នេះធ្វើការដូច្នេះធ្វើឱ្យប្រសិនបើឧបករណ៍នេះចុចរដូវរដូវរដូវរដូវរដូវរដូវរដូវរដូវរដូវរដូវរដូវរដូវរដូវរដូវរដូវរដូវរដូវរដូវរដូវរដូវរដូវរដូវរដូវរដូវ: 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 ការកំណត់ សកម្មភាពដើម្បីបន្ថែម ដូចជា node ក្នុង graph នេះ: 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 ឥឡូវនេះ, សូមបង្កើនការរបស់អ្នក គោលបំណងដើម្បីរកឃើញពេលដែលក្រាហ្វិកត្រូវបានកាត់បន្ថយ, បង្វិលសម្រាប់ការដោះស្រាយ, និងដោះស្រាយជាមួយការចូលរបស់មនុស្សដោយប្រើ . stream_responses Command(resume={"action": user_input}) នៅពេលដែលអ្នកដំណើរការអតិថិជនគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោងគម្រោង។ នៅពេលដែលអ្នកដំណើរការអតិថិជនរបស់អ្នក, ការកំណត់រចនាសម្ព័ន្ធរបស់អ្នក ( ) ឥឡូវនេះនឹងរួមបញ្ចូលដំណាក់កាលការពិនិត្យរបស់មនុស្សរវាងដំណើរការ LLM និងដំណើរការឧបករណ៍: workflow_graph.png វាមានការធានាថា នៅពេលដែលអេក្រង់ធ្វើការធ្វើការដើម្បីធ្វើការដែលអាចផ្លាស់ប្តូរការអនុញ្ញាតឬការឆ្លងកាត់ការតម្រូវការ។ you remain in control ជាមួយនឹងការនេះអ្នកបានបង្កើនការត្រួតពិនិត្យរបស់មនុស្សដល់អេក្រង់ AI របស់អ្នកដោយគ្មានការសរសេរឧបករណ៍ឬលក្ខណៈពិសេសបង្វិលរបស់អ្នក។ លទ្ធផល ក្នុងការបណ្តុះបណ្តាលនេះយើងបានបង្កើតអេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់អេក្រង់ . គោលបំណង MCP របស់ Permit.io លោក ស្លាក និង ម៉ាស៊ីនផ្គត់ផ្គង់ LangChain MCP គោលបំណង MCP របស់ Permit.io ស្លាក ម៉ាស៊ីនផ្គត់ផ្គង់ LangChain MCP ដូច្នេះនៅពេលដែលយើងមិនទទួលបានអត្ថប្រយោជន៍របស់អ្នក, យើងបានផ្តល់ឱ្យអ្នកនូវសមត្ថភាពដើម្បី ការចូលនិង ដូចគ្នានេះជាមិត្តភក្តិដែលមានជំនាញវិជ្ជាជីវៈនឹងធ្វើ។ request defer critical decisions to human users, We covered: តើធ្វើដូចម្តេចដើម្បីរៀបចំនៃការអនុញ្ញាតនិងដំណើរការអនុញ្ញាតដោយប្រើ Permit Elements និង ReBAC តើធ្វើដូចម្តេចដើម្បីបង្ហាញថាមពលទាំងនេះតាមរយៈប្រព័ន្ធប្រតិបត្តិការ MCP តើធ្វើដូចម្តេចដើម្បីបង្កើតអតិថិជនដែលមានប្រសិទ្ធិភាពដោយ LangGraph ដែលទាក់ទងនឹងឧបករណ៍ទាំងនេះយ៉ាងធម្មតា និងធ្វើដូចម្តេចដើម្បីដំឡើងការត្រួតពិនិត្យ Human-in-the-loop (HITL) ក្នុងអំឡុងពេលដែលប្រើ interrupt() តើអ្នកចង់មើលការបង្ហាញពេញលេញនៅក្នុងការប្រតិបត្តិការ? សូមពិនិត្យមើល . ហ្វេសប៊ុក Repo Further Reading - ការរួមបញ្ចូលគ្នានៃការរួមបញ្ចូលគ្នានៃការរួមបញ្ចូលគ្នានៃការរួមបញ្ចូលគ្នានៃការរួមបញ្ចូលគ្នានៃការរួមបញ្ចូលគ្នានៃការរួមបញ្ចូលគ្នានៃការរួមបញ្ចូល។ អនុញ្ញាតឱ្យ MCP GitHub Repo ម៉ាស៊ីនបម្រើ LangChain MCP Adapter អនុញ្ញាតឱ្យ reBAC គោលនយោបាយ LangGraph interrupt() ការបង្ហាញ