Делегирование разрешений на ИИ пользователям с помощью запроса доступа к доступу

Делегирование разрешений на ИИ пользователям с помощью запроса доступа к доступу

25 июня 2025 г.

По мере того, как агенты ИИ становятся более автономными и способными, их роль переходит от пассивных помощников к проактивным актерам. Сегодняшние крупные языковые модели (LLMS) не просто генерируют текст - они выполняют задачи, доступ к API, изменяют базы данных и даже управляют инфраструктурой.

Агенты искусственного интеллекта предпринимают действия, которые когда -то были зарезервированы строго для людей, будь то планирование встречи, развертывание услуги или доступ к конфиденциальному документу.

Когда агенты работают без огражденийВОни могут непреднамеренно принимать вредные или несанкционированные решенияПолем Единственная галлюцинированная команда, неправильно понятая или чрезмерно широкое разрешение может привести к утечкам данных, нарушениям соответствия или разбитым системам.

Вот почему интеграцияЧеловек в петле (Hitl)Рабочие процессы необходимы для безопасности и подотчетности агента.

MCP запроса доступаэто структура, предназначенная для предоставления агентам ИИ с возможностью возможностизапросчувствительные действия, позволяялюди остаются окончательными лицами, принимающими решенияПолем

Построен наРазрешение.ioи интегрируется в популярные агентские рамки, такие какЛангхейниЛангграф, эта система позволяет вам вставить рабочие процессы утверждения непосредственно в ваши приложения с LLM.

В этом уроке вы узнаете:

  • Почему делегирование чувствительных разрешений для людей имеет решающее значение для заслуживающего доверия ИИ,
  • КакПротокол контекста модели разрешения.включает рабочие процессы запроса доступа,
  • Как построить реальную систему, которая сочетает в себе интеллект LLM с человеческим надзором-используя Langgraphinterrupt()особенность.

Прежде чем мы погрузимся в нашу демонстрационную применение и шаги внедрения, давайте кратко обсудим важность делегирования разрешений искусственного интеллекта для людей.

Почему делегирование разрешений на ИИ является критическим

Агенты ИИ являются мощными, но, как мы все знаем, они не непогрешимы.

Они следуют инструкциям, но они не понимают контекста, как люди. Они генерируют ответы, но не могут судить последствия. И когда эти агенты интегрированы в реальные системы - инструменты барьинга, внутренние панели мониторинга, контроль инфраструктуры - это опасный разрыв.

В этом контексте все, что может пойти не так, довольно ясно:

  • Чрезмерные виды агентов: LLMS может быть предоставлен доступ к инструментам, которые они не должны трогать, по дизайну или несчастным случаям.
  • Галлюцинированные звонки инструмента: Агенты могут изготавливать команды, аргументы или идентификаторы, которые никогда не существовали.
  • Отсутствие аудитации: Без человеческих контрольно -пропускных пунктов нет четкой записи о том, кто одобрил что или почему.

Делегирование является решением.

Вместо того, чтобы давать агентам неконтролируемую силу, мы даем им протокол:«Вы можете спросить, но человек решает».

ВведениемЧеловек в петле (Hitl)Утверждение в ключевых точках принятия решения, вы получаете:

  • Безопасность: Предотвратить необратимые действия, прежде чем они произойдут.
  • Подотчетность: Требовать явную человеческую подпись для операций с высокими ставками.
  • Контроль: Пусть люди устанавливают правила - кто может одобрить, что можно утвердить, а когда.

Это разница между агентомделаетчто -то и агентЗапросчто -то сделать.

И это именно то, чтоРазрешение.ioЗапрос доступа MCP позволяет.

MCP запроса доступа

Запрос на доступ к MCPявляется основной частьюРазрешение.ioПротокол контекста модели (MCP)-спецификация, которая дает агентам AI безопасность, доступ к политике, доступ к инструментам и ресурсам.

Думать об этом как о мосте междуLLM, которые хотят действоватьиЛюди, которые нуждаются в контролеПолем

Что он делает

Запрос на доступ к разрешению MCP позволяет агентам ИИ:

  • Запросить доступдля ограниченных ресурсов (например, «Могу ли я получить доступ к этому ресторану?»)
  • Запросить утверждениеЧтобы выполнить чувствительные операции (например, «Могу ли я заказать это ограниченное блюдо?»)
  • Ждать человеческого вкладаПрежде чем продолжить - Via Langgraph'sinterrupt()механизм
  • Зарегистрировать запрос и решениедля аудита и соответствия

За кулисами он используетРазрешение.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
  • НажиматьСоздавать
  • В недавно созданной карте элемента нажмитеПолучить коди обратите внимание на идентификатор конфигурации: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 в инструменты, совместимые с Langgraph
  • langgraph: Для оркестрации рабочих процессов на основе графика
  • 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()Ссылка


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE