Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Организации могут добавить уровень безопасности своим агентам Copilot Studio, подключив их к системе обнаружения угроз во время выполнения. После подключения агент вызывает эту систему во время выполнения. Агент предоставляет системе данные, чтобы она могла определить, является ли инструмент, который агент планирует вызвать, легитимным или нет. Система затем отвечает Copilot Studio ответом «одобрить» или «заблокировать», из-за чего агент вызывает или пропускает инструмент соответственно. Для получения дополнительной информации о том, как подключить агентов к существующей системе обнаружения внешних угроз, см. Enable external threat detection and protection for Copilot Studio custom agents.
Эта статья ориентирована на разработчиков и описывает, как интегрировать собственные возможности обнаружения угроз в качестве поставщика безопасности для агентов Copilot Studio.
Интеграция основана на API, состоящем из двух конечных точек. Основная конечная точка, которую нужно реализовать — это конечная analyze-tool-execution точка. Вам нужно открыть эту конечную точку как интерфейс для вашей системы обнаружения угроз. После того как клиенты настраивают вашу систему как внешнюю систему обнаружения угроз, агент вызывает этот API каждый раз, когда собирается вызвать инструмент.
Помимо конечной analyze-tool-execution точки, нужно также открыть вторую конечную точку, называемую validate. Конечная validate точка используется для проверки состояния и готовности конечной точки в рамках настройки системы.
Следующие разделы подробно описывают каждую конечную точку.
POST /validate
Цель: Проверяет, что конечная точка обнаружения угроз доступна и функционирует. Используется для начальной настройки и тестирования конфигурации.
Запрос на проверку
Метод: POST
URL-адрес:
https://{threat detection endpoint}/validate?api-version=2025-05-01Заголовки:
Авторизация: токен носителя для аутентификации API
x-ms-correlation-id: GUID для трассировки
Корпус: Пусто
Валидируйте ответ
Пример ответа 200 OK
{
"isSuccessful": true,
"status": "OK"
}
Пример ответа об ошибке
Если возникает ошибка (неудачный HTTP-код), конечная точка возвращает код ошибки, сообщение и необязательную диагностику.
{
"errorCode": 5031,
"message": "Validation failed. Webhook service is temporarily unavailable.",
"httpStatus": 503,
"diagnostics": "{\\reason\\:\\Upstream dependency timeout\\}"
}
POST /analyze-tool-execution
Цель: Отправляет контекст выполнения инструмента для оценки рисков. Оценивает запрос на выполнение инструмента и отвечает, разрешать или блокировать выполнение инструмента.
Запрос на исполнение инструментов анализа
Метод: POST
URL-адрес:
https://{threat detection endpoint}/analyze-tool-execution?api-version=2025-05-01Заголовки:
- Авторизация: токен носителя для аутентификации API
- Тип содержания: application/json
Корпус: Объект JSON
Пример запроса на исполнение инструментов анализа
POST https://security.contoso.com/api/agentSecurity/analyze-tool-execution?api-version=2025-05-01
Authorization: Bearer XXX……
x-ms-correlation-id: fbac57f1-3b19-4a2b-b69f-a1f2f2c5cc3c
Content-Type: application/json
{
"plannerContext": {
"userMessage": "Send an email to the customer",
"thought": "User wants to notify customer",
"chatHistory": [
{
"id": "m1",
"role": "user",
"content": "Send an email to the customer",
"timestamp": "2025-05-25T08:00:00Z"
},
{
"id": "m2",
"role": "assistant",
"content": "Which customer should I email?",
"timestamp": "2025-05-25T08:00:01Z"
},
{
"id": "m3",
"role": "user",
"content": "The customer is John Doe",
"timestamp": "2025-05-25T08:00:02Z"
}
],
"previousToolOutputs": [
{
"toolId": "tool-123",
"toolName": "Get customer email by name",
"outputs": {
"name": "email",
"description": "Customer's email address",
"type": {
"$kind": "String"
},
"value": "customer@foobar.com"
},
"timestamp": "2025-05-25T08:00:02Z"
}
]
},
"toolDefinition": {
"id": "tool-123",
"type": "PrebuiltToolDefinition",
"name": "Send email",
"description": "Sends an email to specified recipients.",
"inputParameters": [
{
"name": "to",
"description": "Receiver of the email",
"type": {
"$kind": "String"
}
},
{
"name": "bcc",
"description": "BCC of the email",
"type": {
"$kind": "String"
}
}
],
"outputParameters": [
{
"name": "result",
"description": "Result",
"type": {
"$kind": "String"
}
}
]
},
"inputValues": {
"to": "customer@foobar.com",
"bcc": "hacker@evil.com"
},
"conversationMetadata": {
"agent": {
"id": "agent-guid",
"tenantId": "tenant-guid",
"environmentId": "env-guid",
"isPublished": true
},
"user": {
"id": "user-guid",
"tenantId": "tenant-guid"
},
"trigger": {
"id": "trigger-guid",
"schemaName": "trigger-schema"
},
"conversationId": "conv-id",
"planId": "plan-guid",
"planStepId": "step-1"
}
}
Ответ на исполнение инструмента анализа
200 OK (Запрос выполнен успешно)
Когда запрос валиден, использование инструмента, указанное в запросе, оценивается и либо разрешено , либо блокируется на основе определённых критериев. Ответ может включать следующие поля:
- blockAction (булевый): Следует ли блокировать действие
- reasonCode (целое число, необязательно): числовой код, объясняющий причину блокировки
- причина (строка, по желанию): Объяснение, читаемое человеком
- диагностика (объект, по желанию): другие детали для трассировки или отладки
Пример разрешённого ответа
{
"blockAction": false
}
Пример блочного ответа
{
"blockAction": true,
"reasonCode": 112,
"reason": "The action was blocked because there is a noncompliant email address in the BCC field.",
"diagnostics": "{\\flaggedField\\:\\bcc\\,\\flaggedValue\\:\\hacker@evil.com\\}"
}
Пример ответа об ошибке
Если запрос невалиден, возвращается ответ на ошибку с кодом ошибки, сообщением, HTTP-статусом и необязательной диагностикой.
{
"errorCode": 4001,
"message": "Missing required field: toolDefinition",
"httpStatus": 400,
"diagnostics": "{\\missingField\\:\\toolDefinition\\,\\traceId\\:\\abc-123\\}"
}
Ссылка на структуры запросов и ответных органов
Следующие таблицы описывают содержимое различных объектов, используемых в запросах и ответах для конечных точек.
ValidationResponse
| Name | Тип | Обязательный | Описание |
|---|---|---|---|
| isSuccessful | Логический | Да | Указывает, прошла ли валидация. |
| статус | струна | Да | Необязательное сообщение о статусе или детали, специфичные для партнёра. |
AnalyzeToolExecutionResponse
| Name | Тип | Обязательный | Описание |
|---|---|---|---|
| blockAction | Логический | Да | Указывает, стоит ли блокировать действие. |
| код причины | целое число | Нет | Необязательный числовой код причины, определяемый партнёром. |
| причина | струна | Нет | Необязательное объяснение, читаемое человеком. |
| diagnostics | струна | Нет | Опциональная свободная диагностическая информация для отладки или телеметрии. Должно быть предварительно сериализовано. |
Ответ об ошибке
| Name | Тип | Обязательный | Описание |
|---|---|---|---|
| Код ошибки | целое число | Да | Числовой идентификатор ошибки (например, 1001 = отсутствующее поле, 2003 = отказ аутентификации). |
| сообщение | струна | Да | Объяснение ошибки, читаемое человеком. |
| httpStatus | целое число | Да | HTTP-код, возвращаемый партнёром. |
| diagnostics | струна | Нет | Опциональная свободная диагностическая информация для отладки или телеметрии. Должно быть предварительно сериализовано. |
ОценкаЗапрос
| Name | Тип | Обязательный | Описание |
|---|---|---|---|
| plannerКонтекст | PlannerContext | Да | Данные контекста планера. |
| toolDefinition | ToolDefinition | Да | Детали определения инструментов. |
| inputЗначения | Объект JSON | Да | Словарь пар ключ-значение, предоставленных инструменту. |
| conversationМетаданные разговора | ConversationMetadata | Да | Метаданные о контексте разговора, отслеживании пользователя и плана. |
PlannerContext
| Name | Тип | Обязательный | Описание |
|---|---|---|---|
| сообщение пользователя | струна | Да | Оригинальное сообщение, отправленное агентом. |
| думал | струна | Нет | Объяснение планировщика, почему был выбран этот инструмент. |
| chatИстория | ЧатСообщение[] | Нет | Список недавних чат-сообщений, обменянных с пользователем. |
| previousToolsOutputs | ToolExecutionOutput[] | Нет | Список недавних результатов инструментов. |
ChatMessage
| Name | Тип | Обязательный | Описание |
|---|---|---|---|
| id | струна | Да | Уникальный идентификатор для этого сообщения в разговоре. |
| role | струна | Да | Источник сообщения (например, пользователь, ассистент). |
| содержимое | струна | Да | Текст сообщения. |
| отметка времени | строка (дата и время) | Нет | Временная метка ISO 8601, указывающая дату отправки сообщения. |
ToolExecutionOutputs
| Name | Тип | Обязательный | Описание |
|---|---|---|---|
| toolId | струна | Да | Уникальный идентификатор для этого сообщения в разговоре. |
| toolName | струна | Да | Название инструмента. |
| выходные данные | ИсполнениеВывод[] | Да | Список выходных результатов для выполнения инструментов. |
| отметка времени | строка (дата и время) | Нет | Временная метка ISO 8601, указывающая на завершение выполнения инструмента. |
ExecutionOutput
| Name | Тип | Обязательный | Описание |
|---|---|---|---|
| name | струна | Да | Название параметра выхода. |
| description | струна | Нет | Объяснение значения выхода. |
| тип | объект | Нет | Тип данных выхода. |
| значение | Значение данных JSON | Да | Выходное значение. |
ToolDefinition
| Name | Тип | Обязательный | Описание |
|---|---|---|---|
| id | струна | Да | Уникальный идентификатор инструмента. |
| тип | струна | Да | Указывает тип инструмента, используемого в планере. |
| name | струна | Да | Название инструмента, читаемое человеком. |
| description | струна | Да | Краткое описание того, что делает этот инструмент. |
| inputParameters | ИнструментВход[] | Нет | Входные параметры инструмента. |
| выходные параметры | ToolOutput[] | Нет | Параметры вывода, которые инструмент возвращает после выполнения. |
ToolInput
| Name | Тип | Обязательный | Описание |
|---|---|---|---|
| name | струна | Да | Название входного параметра. |
| description | струна | Нет | Объяснение ожидаемого значения для этого входного параметра. |
| тип | Объект JSON | Нет | Тип данных входного параметра. |
ToolOutput
| Name | Тип | Обязательный | Описание |
|---|---|---|---|
| name | струна | Да | Название параметра выхода. |
| description | струна | Нет | Объяснение выходного значения. |
| тип | Объект JSON | Нет | Тип выходного значения. |
ConversationMetadata
| Name | Тип | Обязательный | Описание |
|---|---|---|---|
| agent | AgentContext | Да | Информация о контексте агента. |
| user | UserContext | Нет | Информация о взаимодействии пользователя с агентом. |
| trigger | ТриггерКонтекст | Нет | Информация о том, что спровоцировало выполнение планировщика. |
| conversationId | струна | Да | ID продолжающегося разговора. |
| planId | струна | Нет | ID плана, использовавшегося для выполнения запроса пользователя. |
| planStepId | струна | Нет | Шаг в рамках плана, соответствующего исполнению этого инструмента. |
| parentAgentComponentId | струна | Нет | ID компонента-агента. |
AgentContext
| Name | Тип | Обязательный | Описание |
|---|---|---|---|
| id | струна | Да | Удостоверение личности агента. |
| tenantId | струна | Да | Арендатор, где проживает агент. |
| environmentId | струна | Да | Среда, в которой агент опубликован. |
| версия | струна | Нет | Версия агента (опционально, если isPublished false). |
| isPublished | Логический | Да | Является ли этот контекст исполнения опубликованной версией. |
UserContext
| Name | Тип | Обязательный | Описание |
|---|---|---|---|
| id | струна | Нет | Microsoft Entra идентификатор объекта пользователя. |
| tenantId | струна | Нет | Идентификатор клиента пользователя. |
TriggerContext
| Name | Тип | Обязательный | Описание |
|---|---|---|---|
| id | струна | Нет | Идентификатор триггера, который сработал планер. |
| schemaName | струна | Нет | Название схемы триггера, которая запускала планер. |
Аутентификация
Интеграция, которую вы разрабатываете, должна использовать аутентификацию Microsoft Entra ID. Следуйте инструкциям по интеграции приложений, которые создают ваши разработчики.
Шаги для выполнения включают следующее:
- Создайте регистрацию приложения для вашего ресурса в вашем арендаторе.
-
Откройте телескоп для вашего веб-API. Открытая область действия должна быть базовым URL ресурса, который вызывает клиент. Например, если URL API —
https://security.contoso.com/api/threatdetection, то открытая область действия должна бытьhttps://security.contoso.com. - В зависимости от того, как вы реализуете сервис, необходимо реализовать логику авторизации и проверить входящие токены. Вам нужно документировать, как клиент должен авторизовать свои приложения. Существует несколько способов сделать это, например, с помощью списка разрешённых идентификаторов приложений или ролевого контроля доступа (RBAC).
Требования к времени отклика
Агент ожидает ответ от системы обнаружения угроз менее чем в 1 000 мс. Убедитесь, что ваш конечный конец ответит на звонок в течение этого времени. Если ваша система не отвечает вовремя, агент ведёт себя так, будто ваш ответ — «разрешить», вызывая инструмент.
Версионирование API
В запросах версия API задаётся через api-version параметр запроса (например, api-version=2025-05-01). Ваша реализация должна быть терпимой к другим неожиданным полям и не должна провалиться, если в будущем появятся новые значения. Партнёрам не стоит проверять версию API, так как все текущие версии считаются неломающими. Партнёры должны отслеживать версии API, но не проваливать запрос при виде новой версии.