Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
As organizações podem adicionar uma camada de segurança aos seus agentes do Copilot Studio conectando-as a um sistema de detecção de ameaças em runtime. Uma vez conectado, o agente chama esse sistema em runtime. O agente fornece ao sistema dados para que o sistema possa determinar se uma ferramenta que o agente planeja invocar é legítima ou não. Em seguida, o sistema responde ao Copilot Studio com uma resposta de "aprovar" ou "bloquear", fazendo com que o agente invoque ou ignore a ferramenta adequadamente. Para obter mais informações sobre como conectar agentes a um sistema de detecção de ameaças externos existente, consulte Habilitar a detecção e proteção de ameaças externas para agentes personalizados do Copilot Studio.
Este artigo é direcionado a desenvolvedores e descreve como integrar seus próprios recursos de detecção de ameaças como um provedor de segurança para agentes do Copilot Studio.
A integração é baseada em uma API que consiste em dois pontos de extremidade. O ponto de extremidade principal que você precisa implementar é o analyze-tool-execution ponto de extremidade. Você precisa expor esse ponto de extremidade como uma interface para seu sistema de detecção de ameaças. Depois que os clientes configuram seu sistema como seu sistema de detecção de ameaças externas, o agente chama essa API sempre que pretende invocar uma ferramenta.
Além do analyze-tool-execution ponto de extremidade, você também precisa expor um segundo ponto de extremidade, chamado validate. O validate ponto de extremidade é usado para verificar a integridade e a preparação do ponto de extremidade como parte da configuração do sistema.
As seções a seguir descrevem cada ponto de extremidade em detalhes.
POST /validar
Propósito: Verifica se o ponto de extremidade de detecção de ameaças está acessível e funcionando. Usado para configuração e teste de configuração iniciais.
Validar solicitação
Método: POSTAR
URL:
https://{threat detection endpoint}/validate?api-version=2025-05-01Cabeçalhos:
Autorização: token de portador para autenticação de API
x-ms-correlation-id: GUID para rastreamento
Corpo: Vazio
Validar resposta
Exemplo de resposta 200 OK
{
"isSuccessful": true,
"status": "OK"
}
Exemplo de resposta de erro
Se ocorrer um erro (código HTTP malsucedido), o ponto de extremidade retornará um código de erro, uma mensagem e um diagnóstico opcional.
{
"errorCode": 5031,
"message": "Validation failed. Webhook service is temporarily unavailable.",
"httpStatus": 503,
"diagnostics": "{\\reason\\:\\Upstream dependency timeout\\}"
}
POST /analyze-tool-execution
Propósito: Envia o contexto de execução da ferramenta para avaliação de risco. Avalia a solicitação de execução da ferramenta e responde se deseja permitir ou bloquear a execução da ferramenta.
Solicitação de execução de ferramenta de análise
Método: POSTAR
URL:
https://{threat detection endpoint}/analyze-tool-execution?api-version=2025-05-01Cabeçalhos:
- Autorização: token de portador para autenticação de API
- Tipo de conteúdo: application/json
Corpo: Objeto JSON
Exemplo de solicitação de análise-execução de ferramentas
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"
}
}
Resposta de análise-execução de ferramentas
200 OK
Quando a solicitação é válida, o uso da ferramenta especificado na solicitação é avaliado e permitido ou bloqueado, com base nos critérios definidos. A resposta pode incluir os seguintes campos:
- blockAction (Boolean): se a ação deve ser bloqueada
- reasonCode (inteiro, opcional): código numérico explicando o motivo do bloco
- motivo (cadeia de caracteres, opcional): explicação legível por humanos
- diagnóstico (objeto, opcional): outros detalhes para rastreamento ou depuração
Exemplo de permitir resposta
{
"blockAction": false
}
Exemplo de resposta de bloco
{
"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\\}"
}
Exemplo de resposta de erro
Se a solicitação não for válida, uma resposta de erro será retornada com um código de erro, mensagem, status HTTP e diagnóstico opcional.
{
"errorCode": 4001,
"message": "Missing required field: toolDefinition",
"httpStatus": 400,
"diagnostics": "{\\missingField\\:\\toolDefinition\\,\\traceId\\:\\abc-123\\}"
}
Referência de estruturas de corpo de solicitação e resposta
As tabelas a seguir descrevem o conteúdo de vários objetos usados nos corpos de solicitação e resposta para os pontos de extremidade.
ValidationResponse
| Nome | Tipo | Required | Descrição |
|---|---|---|---|
| isSuccessful | booleano | Yes | Indica se a validação foi aprovada. |
| status | cadeia | Yes | Mensagem de status opcional ou detalhes específicos do parceiro. |
AnalyzeToolExecutionResponse
| Nome | Tipo | Required | Descrição |
|---|---|---|---|
| blockAction | booleano | Yes | Indica se a ação deve ser bloqueada. |
| Código de razão | inteiro | Não | Código de motivo numérico opcional, determinado pelo parceiro. |
| reason | cadeia | Não | Explicação opcional legível por humanos. |
| diagnostics | cadeia | Não | Informações opcionais de diagnóstico de forma livre para depuração ou telemetria. Deve ser pré-inicializado. |
ErrorResponse
| Nome | Tipo | Required | Descrição |
|---|---|---|---|
| código de erro | inteiro | Yes | Identificador numérico para o erro (por exemplo, 1001 = campo ausente, 2003 = falha de autenticação). |
| mensagem | cadeia | Yes | Explicação legível para humanos do erro. |
| httpStatus | inteiro | Yes | Código de status HTTP retornado pelo parceiro. |
| diagnostics | cadeia | Não | Informações opcionais de diagnóstico de forma livre para depuração ou telemetria. Deve ser pré-inicializado. |
EvaluationRequest
| Nome | Tipo | Required | Descrição |
|---|---|---|---|
| plannerContext | PlannerContext | Yes | Dados de contexto do Planner. |
| toolDefinition | ToolDefinition | Yes | Detalhes da definição da ferramenta. |
| inputValues | Objeto JSON | Yes | Dicionário de pares chave-valor fornecidos para a ferramenta. |
| conversationMetadata | ConversationMetadata | Yes | Metadados sobre o contexto da conversa, o usuário e o acompanhamento de planos. |
PlannerContext
| Nome | Tipo | Required | Descrição |
|---|---|---|---|
| mensagem do usuário | cadeia | Yes | A mensagem original enviada pelo agente. |
| pensamento | cadeia | Não | Explicação do Planner sobre por que essa ferramenta foi selecionada. |
| chatHistory | ChatMessage[] | Não | Lista de mensagens de chat recentes trocadas com o usuário. |
| previousToolsOutputs | ToolExecutionOutput[] | Não | Lista de saídas de ferramenta recentes. |
ChatMessage
| Nome | Tipo | Required | Descrição |
|---|---|---|---|
| id | cadeia | Yes | Identificador exclusivo dessa mensagem na conversa. |
| função | cadeia | Yes | Origem da mensagem (por exemplo, usuário, assistente). |
| conteúdo | cadeia | Yes | O texto da mensagem. |
| carimbo de data/hora | cadeia de caracteres (data e hora) | Não | Carimbo de data/hora ISO 8601 que indica quando a mensagem foi enviada. |
ToolExecutionOutputs
| Nome | Tipo | Required | Descrição |
|---|---|---|---|
| toolId | cadeia | Yes | Identificador exclusivo dessa mensagem na conversa. |
| toolName | cadeia | Yes | Nome da ferramenta. |
| saídas | ExecutionOutput[] | Yes | Lista das saídas de execução da ferramenta. |
| carimbo de data/hora | cadeia de caracteres (data e hora) | Não | Carimbo de data/hora ISO 8601 que indica quando a execução da ferramenta foi concluída. |
ExecutionOutput
| Nome | Tipo | Required | Descrição |
|---|---|---|---|
| nome | cadeia | Yes | Nome do parâmetro de saída. |
| descrição | cadeia | Não | Explicação para o valor de saída. |
| tipo | objeto | Não | Tipo de dados da saída. |
| value | Valor de dados JSON | Yes | O valor de saída. |
ToolDefinition
| Nome | Tipo | Required | Descrição |
|---|---|---|---|
| id | cadeia | Yes | Identificador exclusivo da ferramenta. |
| tipo | cadeia | Yes | Especifica o tipo de ferramenta usada no planejador. |
| nome | cadeia | Yes | Nome legível para humanos da ferramenta. |
| descrição | cadeia | Yes | Resumo do que a ferramenta faz. |
| inputParameters | ToolInput[] | Não | Parâmetros de entrada da ferramenta. |
| outputParameters | ToolOutput[] | Não | Parâmetros de saída que a ferramenta retorna após a execução. |
ToolInput
| Nome | Tipo | Required | Descrição |
|---|---|---|---|
| nome | cadeia | Yes | Nome do parâmetro de entrada. |
| descrição | cadeia | Não | Explicação do valor esperado para esse parâmetro de entrada. |
| tipo | Objeto JSON | Não | Tipo de dados do parâmetro de entrada. |
ToolOutput
| Nome | Tipo | Required | Descrição |
|---|---|---|---|
| nome | cadeia | Yes | Nome do parâmetro de saída. |
| descrição | cadeia | Não | Explicação do valor de saída. |
| tipo | Objeto JSON | Não | Tipo do valor de saída. |
ConversationMetadata
| Nome | Tipo | Required | Descrição |
|---|---|---|---|
| agente | AgentContext | Yes | Informações de contexto do agente. |
| usuário | UserContext | Não | Informações sobre o usuário interagindo com o agente. |
| disparador | TriggerContext | Não | Informações sobre o que disparou a execução do planejador. |
| conversationId | cadeia | Yes | ID da conversa em andamento. |
| planId | cadeia | Não | ID do plano usado para atender à solicitação do usuário. |
| planStepId | cadeia | Não | Etapa dentro do plano correspondente a essa execução de ferramenta. |
| parentAgentComponentId | cadeia | Não | ID do componente do agente pai. |
AgentContext
| Nome | Tipo | Required | Descrição |
|---|---|---|---|
| id | cadeia | Yes | ID do agente. |
| tenantId | cadeia | Yes | Locatário em que o agente reside. |
| environmentId | cadeia | Yes | Ambiente no qual o agente é publicado. |
| versão | cadeia | Não | Versão do agente (opcional se isPublished for false). |
| isPublished | booleano | Yes | Se esse contexto de execução é uma versão publicada. |
UserContext
| Nome | Tipo | Required | Descrição |
|---|---|---|---|
| id | cadeia | Não | ID de objeto do Microsoft Entra do usuário. |
| tenantId | cadeia | Não | ID do locatário do usuário. |
TriggerContext
| Nome | Tipo | Required | Descrição |
|---|---|---|---|
| id | cadeia | Não | A ID do gatilho que disparou o planejador. |
| schemaName | cadeia | Não | O nome do esquema de gatilho que disparou o planejador. |
Authentication
A integração que você desenvolve deve usar a autenticação da ID do Microsoft Entra. Siga as instruções sobre a integração de aplicativos que seus desenvolvedores criam.
As etapas a serem executadas incluem o seguinte:
- Crie um registro de aplicativo para o recurso em seu locatário.
-
Exponha um escopo para sua API Web. O escopo exposto deve ser a URL base para o recurso que os clientes chamam. Por exemplo, se a URL da API for
https://security.contoso.com/api/threatdetection, o escopo exposto deverá serhttps://security.contoso.com. - Dependendo de como você implementa seu serviço, você precisa implementar a lógica de autorização e validar tokens de entrada. Você precisa documentar como o cliente deve autorizar seus aplicativos. Há várias maneiras de fazer isso, por exemplo, usando uma lista de permissões de IDs de aplicativo ou RBAC (controle de acesso baseado em função).
Requisitos de tempo de resposta
O agente espera uma resposta do sistema de detecção de ameaças em menos de 1.000 ms. Você deve garantir que o ponto de extremidade responda à chamada dentro desse período. Se o sistema não responder a tempo, o agente se comportará como se sua resposta fosse "permitir", invocando a ferramenta.
Controle de versão da API
Nas solicitações, a versão da API é especificada por meio de um api-version parâmetro de consulta (por exemplo, api-version=2025-05-01). Sua implementação deve ser tolerante a outros campos inesperados e não deve falhar se novos valores forem adicionados no futuro. Os parceiros não devem verificar a versão da API, pois todas as versões no momento são consideradas não interruptivas. Os parceiros devem acompanhar as versões da API, mas não falhar na solicitação ao ver uma nova versão.