Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Las organizaciones pueden agregar una capa de seguridad a sus agentes de Copilot Studio conectándolos a un sistema de detección de amenazas en tiempo de ejecución. Una vez conectado, el agente llama a este sistema en tiempo de ejecución. El agente envía datos al sistema para que este pueda determinar si una herramienta que el agente planea invocar es legítima o no. El sistema responde entonces a Copilot Studio con una respuesta de "aprobar" o "bloquear", provocando que el agente invoque u omita la herramienta según corresponda. Para obtener más información sobre cómo conectar agentes a un sistema externo de detección de amenazas existente, consulte Habilitar la detección y protección externa de amenazas para agentes personalizados de Copilot Studio.
Este artículo está dirigido a desarrolladores y describe cómo integrar sus propias capacidades de detección de amenazas como proveedor de seguridad para los agentes de Copilot Studio.
La integración se basa en una API que consta de dos puntos de conexión. El punto de conexión principal que debe implementar es el punto de conexión analyze-tool-execution. Debe exponer este punto de conexión como una interfaz para su sistema de detección de amenazas. Una vez que los clientes configuren su sistema como su sistema de detección de amenazas externas, el agente llamará a esta API cada vez que pretenda ejecutar una herramienta.
Además del punto de conexión de analyze-tool-execution , también debe exponer un segundo punto de conexión, llamado validate. El punto de conexión validate se utiliza para comprobar el estado y la preparación del punto de conexión como parte de la configuración del sistema.
En las siguientes secciones se describirá cada punto de conexión en detalle.
POST /validate
Propósito: Verifica que el punto de conexión de detección de amenazas esté accesible y funcionando. Se utiliza para la configuración inicial y pruebas de configuración.
Validación de la solicitud
Método: POST
URL
https://{threat detection endpoint}/validate?api-version=2025-05-01:Encabezados:
Autorización: Token de portador para la autenticación de la API
x-ms-correlation-id: GUID para seguimiento
Cuerpo: vacío
Validar la respuesta
Ejemplo de respuesta 200 OK
{
"isSuccessful": true,
"status": "OK"
}
Ejemplo de respuesta de error
Si ocurre un error (código HTTP no exitoso), el punto de conexión devuelve un código de error, un mensaje y diagnósticos opcionales.
{
"errorCode": 5031,
"message": "Validation failed. Webhook service is temporarily unavailable.",
"httpStatus": 503,
"diagnostics": "{\\reason\\:\\Upstream dependency timeout\\}"
}
POST /analyze-tool-execution
Propósito: Envía el contexto de ejecución de la herramienta para la evaluación de riesgos. Evalúa la solicitud de ejecución de la herramienta y responde si permite o bloquea la ejecución de la herramienta.
Solicitud Analyze-tool-execution
Método: POST
URL
https://{threat detection endpoint}/analyze-tool-execution?api-version=2025-05-01:Encabezados:
- Autorización: Token de portador para la autenticación de la API
- Tipo de contenido: application/json
Cuerpo: objeto JSON
Ejemplo de solicitud analyze-tool-execution
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"
}
}
Analizar respuesta de ejecución de herramienta
200 OK
Cuando la solicitud es válida, se evalúa el uso de la herramienta especificado en la petición y se permite o se bloquea, según los criterios definidos. La respuesta puede incluir los siguientes campos:
- blockAction (booleano): Indica si la acción debe bloquearse
- reasonCode (entero, opcional): Código numérico que indica el motivo del bloqueo
- reason (cadena, opcional): Explicación legible para personas
- diagnostics (objeto, opcional): otros detalles para el seguimiento o la depuración
Ejemplo de respuesta de permiso
{
"blockAction": false
}
Ejemplo de respuesta de bloqueo
{
"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\\}"
}
Ejemplo de respuesta con error
Si la solicitud no es válida, se devuelve una respuesta de error con un código de error, mensaje, estado HTTP y diagnósticos opcionales.
{
"errorCode": 4001,
"message": "Missing required field: toolDefinition",
"httpStatus": 400,
"diagnostics": "{\\missingField\\:\\toolDefinition\\,\\traceId\\:\\abc-123\\}"
}
Referencia de estructuras de cuerpo de respuesta y solicitud
Las siguientes tablas describen el contenido de varios objetos utilizados dentro de los cuerpos de solicitud y respuesta para los puntos finales.
ValidationResponse
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| isSuccessful | Booleana | Sí | Indica si la validación ha pasado. |
| status | cadena | Sí | Mensaje de estado opcional o detalle específico del socio. |
AnalyzeToolExecutionResponse
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| blockAction | Booleana | Sí | Indica si la acción debe ser bloqueada. |
| reasonCode | entero | No | Código numérico de motivo (opcional), asignado por el socio. |
| reason | string | No | Explicación opcional legible por personas. |
| diagnóstico | cadena | No | Información de diagnóstico de forma libre opcional para depuración o telemetría Debe estar previamente serializado. |
ErrorResponse
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| errorCode | entero | Sí | Identificador numérico del error (p. ej., 1001 = campo ausente, 2003 = fallo de autenticación). |
| message | cadena | Sí | Explicación comprensible para humanos del error. |
| httpStatus | entero | Sí | Código de estado HTTP devuelto por el partner. |
| diagnóstico | cadena | No | Información de diagnóstico de forma libre opcional para depuración o telemetría Debe estar previamente serializado. |
EvaluationRequest
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| plannerContext | PlannerContext | Sí | Datos de contexto del planificador. |
| toolDefinition | ToolDefinition | Sí | Detalles de la definición de la herramienta. |
| inputValues | Objeto JSON | Sí | Diccionario de pares clave-valor proporcionado a la herramienta. |
| conversationMetadata | ConversationMetadata | Sí | Metadatos de contexto de la conversación, usuario y seguimiento del plan. |
PlannerContext
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| userMessage | cadena | Sí | El mensaje original enviado por el agente. |
| pensamiento | cadena | No | Explicación del planificador sobre por qué se eligió esta herramienta. |
| chatHistory | ChatMessage[] | No | Lista de mensajes de chat recientes con el usuario. |
| previousToolsOutputs | ToolExecutionOutput[] | No | Lista de salidas recientes de herramientas. |
ChatMessage
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| id | string | Sí | Identificador único para este mensaje en la conversación. |
| role | cadena | Sí | Origen del mensaje (p. ej., usuario, asistente). |
| contenido | cadena | Sí | El mensaje de texto. |
| marca de tiempo | string (date-time) | No | Marca de tiempo ISO 8601 que indica cuándo se envió el mensaje. |
ToolExecutionOutputs
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| toolId | cadena | Sí | Identificador único para este mensaje en la conversación. |
| toolName | cadena | Sí | Nombre de la herramienta. |
| resultados | ExecutionOutput[] | Sí | Lista de resultados de ejecución de la herramienta. |
| marca de tiempo | string (date-time) | No | Marca de tiempo ISO 8601 que indica cuándo se completó la ejecución de la herramienta. |
ExecutionOutput
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| name | string | Sí | Nombre del parámetro de salida. |
| Descripción | string | No | Explicación del valor de salida. |
| tipo | objeto | No | Tipo de datos de la salida. |
| Valor | Valor de datos JSON | Sí | El valor de salida. |
ToolDefinition
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| id | string | Sí | Identificador único de la herramienta. |
| tipo | cadena | Sí | Especifica el tipo de herramienta utilizada en el planificador. |
| name | string | Sí | Nombre de la herramienta en lenguaje natural. |
| Descripción | string | Sí | Resumen de lo que hace la herramienta. |
| inputParameters | ToolInput[] | No | Parámetros de entrada de la herramienta. |
| outputParameters | ToolOutput[] | No | Parámetros de salida que la herramienta devuelve tras la ejecución. |
ToolInput
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| name | string | Sí | Nombre del parámetro de entrada. |
| Descripción | string | No | Explicación del valor esperado para este parámetro de entrada. |
| tipo | Objeto JSON | No | Tipo de datos del parámetro de entrada. |
ToolOutput
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| name | string | Sí | Nombre del parámetro de salida. |
| Descripción | string | No | Explicación del valor de salida. |
| tipo | Objeto JSON | No | Tipo del valor de salida. |
ConversationMetadata
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| agente | AgentContext | Sí | Información sobre el contexto del agente. |
| Usuario de | UserContext | No | Información sobre el usuario que interactúa con el agente. |
| desencadenador | TriggerContext | No | Información sobre qué desencadenó la ejecución del planificador. |
| conversationId | cadena | Sí | Id. de la conversación en curso. |
| planId | cadena | No | Id. del plan utilizado para cumplir la solicitud del usuario. |
| planStepId | cadena | No | Paso dentro del plan correspondiente a la ejecución de esta herramienta. |
| parentAgentComponentId | cadena | No | Id. del componente del agente principal |
AgentContext
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| id | string | Sí | Id. del agente. |
| tenantId | cadena | Sí | Inquilino en el que reside el agente. |
| environmentId | cadena | Sí | Entorno en el que se publica el agente. |
| version | cadena | No | Versión del agente (opcional si isPublished es falso). |
| isPublished | Booleana | Sí | Si este contexto de ejecución es una versión publicada. |
UserContext
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| id | cadena | No | Id. de objeto de Microsoft Entra del usuario. |
| tenantId | cadena | No | Id. de inquilino del usuario. |
TriggerContext
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| id | cadena | No | Id. del desencadenador que desencadenó el planificador. |
| schemaName | cadena | No | El nombre del esquema del desencadenador que ha activado el planificador. |
Autenticación
La integración que desarrolle debe usar la autenticación Microsoft Entra ID. Siga las instrucciones sobre Integrar aplicaciones que crean sus desarrolladores.
Los pasos que se deben seguir son los siguientes:
- Cree un registro de aplicación para el recurso en el inquilino.
-
Exponer un ámbito para su API web. El ámbito expuesto debe ser la URL base del recurso al que llaman los clientes. Por ejemplo, si la URL de la API es
https://security.contoso.com/api/threatdetection, entonces el ámbito expuesto debe serhttps://security.contoso.com. - Dependiendo de cómo implemente su servicio, debe implementar lógica de autorización y validar los tokens entrantes. Debe documentar cómo el cliente debe autorizar sus aplicaciones. Hay varias formas de hacerlo, p. ej., usando una lista de permitidos de Id. de aplicación o control de acceso basado en roles (RBAC).
Requisitos de tiempo de respuesta
El agente espera una respuesta del sistema de detección de amenazas en menos de 1000 ms. Debe asegurarse de que su punto de conexión responda a la solicitud dentro de este plazo. Si su sistema no responde a tiempo, el agente actúa como si su respuesta fuera "permitir", invocando la herramienta.
Control de versiones de API
En las solicitudes, la versión de la API se especifica mediante el parámetro de consulta api-version (por ejemplo, api-version=2025-05-01). Su implementación debe ser tolerante a otros campos inesperados y no debe fallar si se agregan nuevos valores en el futuro. Los partners no deben comprobar la versión de la API, ya que todas las versiones en este momento se consideran que no rompen la compatibilidad. Los socios deben llevar un registro de las versiones de la API, pero no deben rechazar la solicitud al detectar una nueva versión.