Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
As organizações podem adicionar uma camada de segurança aos seus agentes do Copilot Studio conectando-os a um sistema de deteção de ameaças em tempo de execução. Uma vez conectado, o agente chama esse sistema em tempo de execução. O agente fornece dados ao sistema 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 de acordo. Para obter mais informações sobre como conectar agentes a um sistema de deteção de ameaças externo existente, consulte Habilitar deteção e proteção de ameaças externas para agentes personalizados do Copilot Studio.
Este artigo destina-se a desenvolvedores e descreve como integrar seus próprios recursos de deteçã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 endpoints. O principal ponto de extremidade que você precisa implementar é o ponto de analyze-tool-execution extremidade. Você precisa expor esse ponto de extremidade como uma interface para seu sistema de deteção de ameaças. Depois que os clientes configuram seu sistema como seu sistema externo de deteção de ameaças, o agente chama essa API toda vez que pretende invocar uma ferramenta.
Além do ponto de extremidade, você também precisa expor um segundo ponto de analyze-tool-execution extremidade, chamado validate. O validate ponto de extremidade é usado para verificar a integridade e a prontidã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
Finalidade: Verifica se o ponto de extremidade de deteção de ameaças está acessível e funcionando. Usado para instalação inicial e testes de configuração.
Validar pedido
Método: PUBLICAR
Endereço 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 diagnósticos opcionais.
{
"errorCode": 5031,
"message": "Validation failed. Webhook service is temporarily unavailable.",
"httpStatus": 503,
"diagnostics": "{\\reason\\:\\Upstream dependency timeout\\}"
}
POST /analyze-tool-execution
Finalidade: Submete o contexto de execução da ferramenta para avaliação de risco. Avalia a solicitação de execução da ferramenta e responde se deve permitir ou bloquear a execução da ferramenta.
Solicitação de execução de ferramenta de análise
Método: PUBLICAR
Endereço 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 execução de ferramenta de análise
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 execução da ferramenta de análise
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 (Booleano): Se a ação deve ser bloqueada
- reasonCode (inteiro, opcional): Código numérico que explica o motivo do bloco
- razão (string, opcional): Explicação legível por humanos
- diagnóstico (objeto, opcional): Outros detalhes para rastreamento ou depuração
Exemplo permitir resposta
{
"blockAction": false
}
Exemplo de resposta em 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 das estruturas dos órgãos de pedido 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 | Type | Obrigatório | Descrição |
|---|---|---|---|
| isSuccessful | booleano | Yes | Indica se a validação foi aprovada. |
| estado | cadeia (de caracteres) | Yes | Mensagem de status opcional ou detalhes específicos do parceiro. |
AnalyzeToolExecutionResponse
| Nome | Type | Obrigatório | Descrição |
|---|---|---|---|
| blockAction | booleano | Yes | Indica se a ação deve ser bloqueada. |
| código de motivo | número inteiro | Não | Código de razão numérico opcional, determinado pelo parceiro. |
| razão | cadeia (de caracteres) | Não | Explicação opcional legível por humanos. |
| diagnostics | cadeia (de caracteres) | Não | Informações opcionais de diagnóstico de forma livre para depuração ou telemetria. Deve ser pré-serializado. |
ErrorResponse
| Nome | Type | Obrigatório | Descrição |
|---|---|---|---|
| código de erro | número inteiro | Yes | Identificador numérico para o erro (por exemplo, 1001 = campo ausente, 2003 = falha de autenticação). |
| mensagem | cadeia (de caracteres) | Yes | Explicação do erro legível por humanos. |
| httpStatus | número inteiro | Yes | Código de status HTTP retornado pelo parceiro. |
| diagnostics | cadeia (de caracteres) | Não | Informações opcionais de diagnóstico de forma livre para depuração ou telemetria. Deve ser pré-serializado. |
AvaliaçãoPedido
| Nome | Type | Obrigatório | Descrição |
|---|---|---|---|
| plannerContext | PlannerContext | Yes | Dados de contexto do planejador. |
| toolDefinition | Definição de Ferramentas | Yes | Detalhes da definição da ferramenta. |
| inputValues | Objeto JSON | Yes | Dicionário de pares chave-valor fornecidos à ferramenta. |
| conversationMetadata | ConversationMetadata | Yes | Metadados sobre o contexto da conversa, o usuário e o acompanhamento do plano. |
PlannerContext
| Nome | Type | Obrigatório | Descrição |
|---|---|---|---|
| userMensagem | cadeia (de caracteres) | Yes | A mensagem original enviada pelo agente. |
| pensamento | cadeia (de caracteres) | Não | Explicação do planejador para o motivo pelo qual essa ferramenta foi selecionada. |
| chatHistórico | Mensagem de bate-papo[] | Não | Lista de mensagens de chat recentes trocadas com o usuário. |
| anteriorToolsOutputs | ToolExecutionOutput[] | Não | Lista de saídas de ferramentas recentes. |
ChatMensagem
| Nome | Type | Obrigatório | Descrição |
|---|---|---|---|
| id | cadeia (de caracteres) | Yes | Identificador exclusivo para esta mensagem na conversa. |
| função | cadeia (de caracteres) | Yes | Origem da mensagem (por exemplo, utilizador, assistente). |
| conteúdo | cadeia (de caracteres) | Yes | O texto da mensagem. |
| carimbo de data/hora | string (data-hora) | Não | Carimbo de data/hora ISO 8601 indicando quando a mensagem foi enviada. |
ToolExecutionOutputs
| Nome | Type | Obrigatório | Descrição |
|---|---|---|---|
| Id da ferramenta | cadeia (de caracteres) | Yes | Identificador exclusivo para esta mensagem na conversa. |
| nome_da_ferramenta | cadeia (de caracteres) | Yes | Nome da ferramenta. |
| saídas | ExecutionOutput[] | Yes | Lista dos resultados de execução da ferramenta. |
| carimbo de data/hora | string (data-hora) | Não | Carimbo de data/hora ISO 8601 indicando quando a execução da ferramenta foi concluída. |
ExecutionOutput
| Nome | Type | Obrigatório | Descrição |
|---|---|---|---|
| nome | cadeia (de caracteres) | Yes | Nome do parâmetro de saída. |
| descrição | cadeia (de caracteres) | Não | Explicação para o valor de saída. |
| tipo | objecto | Não | Tipo de dados da saída. |
| valor | Valor de dados JSON | Yes | O valor de saída. |
Definição de Ferramentas
| Nome | Type | Obrigatório | Descrição |
|---|---|---|---|
| id | cadeia (de caracteres) | Yes | Identificador único da ferramenta. |
| tipo | cadeia (de caracteres) | Yes | Especifica o tipo de ferramenta usada no planejador. |
| nome | cadeia (de caracteres) | Yes | Nome legível por humanos da ferramenta. |
| descrição | cadeia (de caracteres) | 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. |
Entrada de ferramentas
| Nome | Type | Obrigatório | Descrição |
|---|---|---|---|
| nome | cadeia (de caracteres) | Yes | Nome do parâmetro de entrada. |
| descrição | cadeia (de caracteres) | Não | Explicação do valor esperado para este parâmetro de entrada. |
| tipo | Objeto JSON | Não | Tipo de dados do parâmetro de entrada. |
Saída de ferramentas
| Nome | Type | Obrigatório | Descrição |
|---|---|---|---|
| nome | cadeia (de caracteres) | Yes | Nome do parâmetro de saída. |
| descrição | cadeia (de caracteres) | Não | Explicação do valor de saída. |
| tipo | Objeto JSON | Não | Tipo do valor de saída. |
ConversationMetadata
| Nome | Type | Obrigatório | Descrição |
|---|---|---|---|
| agente | AgentContext | Yes | Informações de contexto do agente. |
| utilizador | Contexto do usuário | Não | Informações sobre o usuário interagindo com o agente. |
| accionador | TriggerContext | Não | Informações sobre o que desencadeou a execução do planejador. |
| conversationId | cadeia (de caracteres) | Yes | ID da conversa em curso. |
| planId | cadeia (de caracteres) | Não | ID do plano usado para atender à solicitação do usuário. |
| planStepId | cadeia (de caracteres) | Não | Passo dentro do plano correspondente à execução desta ferramenta. |
| parentAgentComponentId | cadeia (de caracteres) | Não | ID do componente do agente pai. |
AgentContext
| Nome | Type | Obrigatório | Descrição |
|---|---|---|---|
| id | cadeia (de caracteres) | Yes | ID do agente. |
| tenantId | cadeia (de caracteres) | Yes | Inquilino onde o agente reside. |
| environmentId | cadeia (de caracteres) | Yes | Ambiente no qual o agente é publicado. |
| versão | cadeia (de caracteres) | Não | Versão do agente (opcional se isPublished for false). |
| isPublicado | booleano | Yes | Se este contexto de execução é uma versão publicada. |
Contexto do usuário
| Nome | Type | Obrigatório | Descrição |
|---|---|---|---|
| id | cadeia (de caracteres) | Não | ID do objeto Microsoft Entra do usuário. |
| tenantId | cadeia (de caracteres) | Não | ID do locatário do usuário. |
TriggerContext
| Nome | Type | Obrigatório | Descrição |
|---|---|---|---|
| id | cadeia (de caracteres) | Não | O id do gatilho que acionou o planejador. |
| schemaName | cadeia (de caracteres) | Não | O nome do esquema de gatilho que acionou o planejador. |
Authentication
A integração desenvolvida deve usar a autenticação Microsoft Entra ID. Siga as instruções em Integrar aplicativos criados por seus desenvolvedores.
As etapas a serem executadas incluem o seguinte:
- Crie um registo de aplicação para o seu recurso no seu inquilino.
-
Exponha um escopo para sua API da 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 os 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 controle de acesso baseado em função (RBAC).
Requisitos de tempo de resposta
O agente espera uma resposta do sistema de deteção de ameaças em menos de 1.000 ms. Você deve garantir que seu endpoint responda à chamada dentro desse período. Se o seu 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
Em 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 ininterruptas. Os parceiros devem acompanhar as versões da API, mas não falhar a solicitação ao ver uma nova versão.