
Делегирование разрешений на ИИ пользователям с помощью запроса доступа к доступу
25 июня 2025 г.По мере того, как агенты ИИ становятся более автономными и способными, их роль переходит от пассивных помощников к проактивным актерам. Сегодняшние крупные языковые модели (LLMS) не просто генерируют текст - они выполняют задачи, доступ к API, изменяют базы данных и даже управляют инфраструктурой.
Агенты искусственного интеллекта предпринимают действия, которые когда -то были зарезервированы строго для людей, будь то планирование встречи, развертывание услуги или доступ к конфиденциальному документу.
Когда агенты работают без огражденийВОни могут непреднамеренно принимать вредные или несанкционированные решенияПолем Единственная галлюцинированная команда, неправильно понятая или чрезмерно широкое разрешение может привести к утечкам данных, нарушениям соответствия или разбитым системам.
Вот почему интеграцияЧеловек в петле (Hitl)Рабочие процессы необходимы для безопасности и подотчетности агента.
MCP запроса доступаэто структура, предназначенная для предоставления агентам ИИ с возможностью возможностизапросчувствительные действия, позволяялюди остаются окончательными лицами, принимающими решенияПолем
Построен наРазрешение.ioи интегрируется в популярные агентские рамки, такие какЛангхейниЛангграф, эта система позволяет вам вставить рабочие процессы утверждения непосредственно в ваши приложения с LLM.
В этом уроке вы узнаете:
- Почему делегирование чувствительных разрешений для людей имеет решающее значение для заслуживающего доверия ИИ,
- КакПротокол контекста модели разрешения.включает рабочие процессы запроса доступа,
- Как построить реальную систему, которая сочетает в себе интеллект LLM с человеческим надзором-используя Langgraph
interrupt()
особенность.
Прежде чем мы погрузимся в нашу демонстрационную применение и шаги внедрения, давайте кратко обсудим важность делегирования разрешений искусственного интеллекта для людей.
Почему делегирование разрешений на ИИ является критическим
Агенты ИИ являются мощными, но, как мы все знаем, они не непогрешимы.
Они следуют инструкциям, но они не понимают контекста, как люди. Они генерируют ответы, но не могут судить последствия. И когда эти агенты интегрированы в реальные системы - инструменты барьинга, внутренние панели мониторинга, контроль инфраструктуры - это опасный разрыв.
В этом контексте все, что может пойти не так, довольно ясно:
- Чрезмерные виды агентов: LLMS может быть предоставлен доступ к инструментам, которые они не должны трогать, по дизайну или несчастным случаям.
- Галлюцинированные звонки инструмента: Агенты могут изготавливать команды, аргументы или идентификаторы, которые никогда не существовали.
- Отсутствие аудитации: Без человеческих контрольно -пропускных пунктов нет четкой записи о том, кто одобрил что или почему.
Делегирование является решением.
Вместо того, чтобы давать агентам неконтролируемую силу, мы даем им протокол:«Вы можете спросить, но человек решает».
ВведениемЧеловек в петле (Hitl)Утверждение в ключевых точках принятия решения, вы получаете:
- Безопасность: Предотвратить необратимые действия, прежде чем они произойдут.
- Подотчетность: Требовать явную человеческую подпись для операций с высокими ставками.
- Контроль: Пусть люди устанавливают правила - кто может одобрить, что можно утвердить, а когда.
Это разница между агентомделаетчто -то и агентЗапросчто -то сделать.
И это именно то, чтоРазрешение.ioЗапрос доступа MCP позволяет.
MCP запроса доступа
Запрос на доступ к MCPявляется основной частьюРазрешение.ioПротокол контекста модели (MCP)-спецификация, которая дает агентам AI безопасность, доступ к политике, доступ к инструментам и ресурсам.
Думать об этом как о мосте междуLLM, которые хотят действоватьиЛюди, которые нуждаются в контролеПолем
Что он делает
Запрос на доступ к разрешению MCP позволяет агентам ИИ:
- Запросить доступдля ограниченных ресурсов (например, «Могу ли я получить доступ к этому ресторану?»)
- Запросить утверждениеЧтобы выполнить чувствительные операции (например, «Могу ли я заказать это ограниченное блюдо?»)
- Ждать человеческого вкладаПрежде чем продолжить - Via Langgraph's
interrupt()
механизм - Зарегистрировать запрос и решениедля аудита и соответствия
За кулисами он используетРазрешение.ioВозможности авторизации, созданные для поддержки:
- Резак(Контроль доступа на основе отношений)и другиеМелкозернистое разрешение (FGA)политики.
- Удобные рабочие процессы
- Поддержанные политическими элементамиэта работа в контексте пользовательского интерфейса, API и LLM
Подключить и играть с Langchain и Langgraph
MCP разрешения интегрируется непосредственно вАдаптер Langchain MCPиЛангграфэкосистема:
- Вы можете разоблачить элементы разрешения в качестве инструментов, совместимых с Langgraph.
- Вы можете сделать паузу агента с
interrupt()
Когда происходят чувствительные действия. - Вы можете возобновить исполнение на основе реальных человеческих решений.
Это самый простой способвводить человеческое суждение в поведение ИИ- Нет пользовательской бэкэнд.
Понимая реализацию и ее преимущества, давайте перейдем к нашему демонстрационному приложению.
Что мы будем строить - обзор демонстрации приложений
В этом уроке мы построимРабочий процесс утверждения в реальном временив которомАгент ИИ может запросить доступ или выполнять конфиденциальные действия, но только человек может одобритьих.
Сценарий: Система заказа семьи семей.
Чтобы увидеть, как MCP разрешения может помочь включить рабочий процесс HITL в пользовательском приложении, мы будем моделировать AСистема заказа пищиДля семьи:
- Родителиможет получить доступ и управлять всеми ресторанами и блюдами.
- ДетиМожно просматривать публичные предметы, но должны запросить доступ к ограниченным ресторанам или дорогим блюдам.
- Когда ребенок подает запрос, родитель получает его для рассмотрения и должен явноутвердитьилиотрицатьэто до действия действия.
Этот вариант использования отражает общую схему:«Агенты могут помочь, но люди решают».
Технический стек
Мы создадим этот агент с поддержкой HITL, используя:
- Разрешение.io- обрабатывает авторизацию, роли, политику и разрешения
- Разрешить MCP Server - разоблачает рабочие процессы разрешений в качестве инструментов, которые агент может использовать
- Адаптеры Langchain MCP - Инструменты MCP разрешения на мосты в Langgraph & Langchain
- Langgraph - организует рабочий процесс агента с
interrupt()
поддерживать - Flash Gemini 2.0 - легкий, мультимодальный LLM, используемый в качестве двигателя рассуждений агента
- Python - клей удерживает все вместе
В итоге вы получите рабочую систему, в которой агенты могут сотрудничать с людьми, чтобы обеспечить безопасное, преднамеренное поведение-использование реальной политики, реальных инструментов и разрешений в реальном времени.
Репозиторий с полным кодом для этого приложения доступен здесь.
Пошаговый учебник
В этом разделе мы проведем, как реализовать полностью функциональную систему агентов человека в петле, используяРазрешение.ioи Langgraph.
Мы рассмотрим:
- Разрешения на моделирование с разрешением
- Настройка сервера MCP разрешения
- Создание клиента Langgraph + Langchain MCP
- Добавление человека в петле с
interrupt()
- Запуск полный рабочий процесс
Давайте вдамся -
Разрешения на моделирование с разрешением
Мы начнем с определения правил доступа вашей системы внутриРазрешениеПолем Это позволяет вам моделировать, какие пользователи могут делать то, что и какие действия должны вызвать поток утверждения.
Создать ресурс Rebac
Перейдите кПолитикаСтраница с боковой панели, затем:
- НажмитеРесурсывкладка
- НажиматьСоздать ресурс
- Назовите ресурс:
restaurants
- ПодВарианты Rebac, Определите две роли:
parent
child-can-order
- НажиматьСохранять
Теперь иди вРедактор политикивкладка и назначение разрешений:
parent
: Полный доступ (create
Вread
Вupdate
Вdelete
)child-can-order
:read
Установите элементы разрешения
Перейти кЭлементыВкладка с боковой панели. ВУправление пользователямираздел, нажмитеСоздать элементПолем
- Настройте элемент следующим образом:
- Имя: Запросы ресторана
- Настраивать элементы на основе: REBAC Resource Roles
- Тип ресурса: Рестораны
- Ролевые уровни разрешения
- Уровень 1 - Владелец рабочего пространства:
parent
- Назначаемые роли:
child-can-order
- Уровень 1 - Владелец рабочего пространства:
- НажиматьСоздавать
- В недавно созданной карте элемента нажмитеПолучить коди обратите внимание на идентификатор конфигурации:
restaurant-requests
Полем Мы будем использовать это позже в.env
файл.
Добавить элементы одобрения операции
- Создать новыйОперация утверждениеэлемент:
- Имя: Одобрение блюда
- Тип ресурса: Рестораны
- НажиматьСоздавать
- Затем создайтеУправление утверждениемэлемент:
- Имя: Запросы на блюдо
- НажиматьПолучить коди скопируйте идентификатор конфигурации:
dish-requests
Полем
Добавить тестовые пользователи и экземпляры ресурсов
- Перейти кСправочник> Экземпляры
- НажиматьДобавить экземпляр
- Тип ресурса: Рестораны
- Ключ экземпляра:
pizza-palace
- Жилец: Арендатор по умолчанию (или ваш рабочий арендатор)
- Переключиться наПользователивкладка
- НажиматьДобавить пользователя
- Ключ:
joe
- Экзамен на экземпляр:
restaurants:pizza-palace#parent
- НажиматьСохранять
- Ключ:
- Создайте другого пользователя с ключом
henry
- Не назначайте роль
Как только разрешение настроено, мы готовы клонировать сервер MCP и подключить ваши политики к рабочему агенту.
Настройка сервера MCP разрешения
С вашими политиками, смоделированной на панели управления разрешением, пришло время оживить их, настроивРазрешить MCP -сервер- Локальная услуга, которая раскрывает ваш запрос на доступ и одобрение, в качестве инструментов, которые может использовать агент искусственного интеллекта.
Клонировать и установить сервер MCP
Начните с клонирования репозитория сервера MCP и настройки виртуальной среды.
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 .
Добавить конфигурацию среды
Создать.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
PROJECT_ID
ENV_ID
⚠ Примечание: мы используемМестный НПП разрешения (точка политического решения)Для этого урока для поддержки оценки Rebac и офлайн-тестирования с низкой задержкой.
Запустить сервер
При все на месте вы можете запустить сервер MCP локально:
uv run -m src.permit_mcp
После того, как сервер будет запущен, он обнаружит ваши настроенные элементы разрешения (запрос на доступ, управление утверждением и т. Д.) В качестве инструментов, которые агент может вызовать протокол MCP.
Создание клиента Langgraph + Langchain MCP
Теперь, когда Sermit MCP -сервер работает, мы создадим клиента агента искусственного интеллекта, который может взаимодействовать с ним. Этот клиент будет:
- Используйте LLM, способствующий Близнецам, чтобы решить, какие действия на такедании, вызывая такие инструменты MCP, как
request_access
Вapprove_operation_approval
, и т. д. - Работать полностью в рабочем процессе Langgraph
- Пауза для человеческого обзора с использованием
interrupt()
(в следующем разделе)
Давайте подключим точки.
Установите необходимые зависимости
В вашем каталоге проекта MCP установите необходимые пакеты:
uv add langchain-mcp-adapters langgraph langchain-google-genai
Это дает вам:
langchain-mcp-adapters
: Автоматически преобразует инструменты MCP разрешения MCP в инструменты, совместимые с Langgraphlanggraph
: Для оркестрации рабочих процессов на основе графикаlangchain-google-genai
: Для взаимодействия с Gemini 2.0 Flash
Добавить ключ Google API
Вам понадобится ключ API отGoogle AI Studioиспользовать Близнецы.
Добавьте ключ к вашему.env
файл:
GOOGLE_API_KEY=your-key-here
Создайте клиента MCP
Создайте файл с именемclient.py
в вашем проекте root.
Мы разбим этот файл на логические блоки:
Импорт и настройка
Начните с импорта зависимостей и переменных среды загрузки:
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
Затем загрузите окружающую среду и настроите свой Gemini LLM:
load_dotenv()
global_llm_with_tools = None
llm = ChatGoogleGenerativeAI(
model="gemini-2.0-flash",
google_api_key=os.getenv('GOOGLE_API_KEY')
)
Настроить параметры сервера MCPРасскажите Langgraph, как общаться с запущенным сервером MCP:
server_params = StdioServerParameters( command="python", args=["src/permit_mcp/server.py"], )
Определите состояние общего агента:
class State(TypedDict):
messages: Annotated[list, add_messages]
Определите узлы рабочего процессаиГрафик Строитель:
Вот логика маршрута между вызовом LLM и призывом к инструментам:
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
Узел, если в сообщении состояния есть инструмент, или заканчивает график. Мы также определили функцию для настройки и составления графа с контрольной точкой в памяти.
Затем добавьте следующую строку кода для потоковой передачи с графика и добавьте интерактивный цикл чата, который будет работать до явного выхода.
Потоковой вывод и обрабатывать ввод чата,иБесконечный цикл для взаимодействия с пользователем:
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}")
Окончательная сборка
Добавьте основную точку входа, где мы будем преобразовать инструмент MCP Server MCP в инструменты, совместимые с Langgraph, связываем наш LLM с полученными инструментами, настроите график, нарисуйте его в файл и запустите цикл чата:
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())
Наконец,Запустите клиент
Как только вы все сохранили, запустите клиента:
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
Ваш агент теперь может динамически позвонить в инструменты MCP!
Добавление человека в петле сinterrupt()
Благодаря вашему клиенту MCP с Langgraph, инструментами разрешения теперь можно использовать автоматически. Но что происходит, когда действиечувствительный,Как предоставление доступа к ограниченному ресурсу или утверждение операции высокого риска?
Вот где у Лангграфаinterrupt()
становится полезным.
Теперь добавимУзел одобрения человекаЧтобы перехватить и приостановить рабочий процесс всякий раз, когда агент пытается вызвать критические инструменты, такие как:
approve_access_request
approve_operation_approval
Человека будет предложеновручную одобрить или отрицатьИнструментальный звонок до того, как агент продолжается.
Определите узел обзора человека
На вершине вашего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"],
}]})
Этот узел проверяет, считается ли называемый инструмент «высокий риск». Если это так, график прерывается с помощью подсказки с просьбой подтверждения человека.
Обновление графического маршрутизации
Изменить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"
Провод в узле HTLL
Обновить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)
Обрабатывать человеческий ввод во время выполнения
Наконец, давайте улучжим вашstream_responses
Функция для обнаружения при прерывании графика, приглашение к решению и возобновить с помощью человеческого ввода, используяCommand(resume={"action": user_input})
Полем
После запуска клиента график не должен выглядеть так:
После запуска клиента, на графической диаграмме (workflow_graph.png
) теперь будет включать узел обзора человека между этапами LLM и выполнения инструмента:
Это гарантирует этоты остаешься под контролемВсякий раз, когда агент пытается принять решение, которое может изменить разрешения или обходить ограничения.
При этом вы успешно добавили человеческий надзор с вашим агентом искусственного интеллекта, не переписывая свои инструменты или логику бэкэнд.
Заключение
В этом уроке мы построили безопасного, человеческого агента ИИ, использующегоMCP запроса доступаВЛангграф, иАдаптеры Langchain MCPПолем
Вместо того, чтобы позволить агенту работать без контроля, мы дали ему возможностьзапросдоступ иотложить критические решения для людей,Так же, как ответственный член команды.
Мы покрыли:
- Как моделировать разрешения и потоки одобрения с использованием элементов разрешения и Rebac
- Как разоблачить эти потоки через сервер MCP разрешения
- Как построить клиента с питанием для Langgraph, который естественным образом вызывает эти инструменты
- И как вставить в реальном времениЧеловек в петле (Hitl)проверяет с помощью
interrupt()
Хотите увидеть полную демонстрацию в действии? ПроверьтеGitHub RepoПолем
Дальнейшее чтение -
- Закрепите сотрудничество с ИИ через шлюз разрешений
- Разрешить MCP GitHub Repo
- Документы адаптеров Langchain MCP
- Разрешить политику Rebac
- Лангграф
interrupt()
Ссылка
Оригинал