Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Le organizzazioni possono aggiungere un livello di sicurezza ai loro agenti Copilot Studio collegandoli a un sistema di rilevamento delle minacce in fase di esecuzione. Una volta connesso, l'agente chiama questo sistema in fase di esecuzione. L'agente fornisce al sistema i dati affinché il sistema possa determinare se lo strumento che l'agente intende invocare sia legittimo oppure no. Il sistema risponde quindi a Copilot Studio con una risposta di "approvazione" o "blocco", consentendo all'agente di richiamare o ignorare lo strumento di conseguenza. Per altre informazioni su come connettere gli agenti a un sistema di rilevamento delle minacce esterno esistente, vedi Abilitare il rilevamento e la protezione dalle minacce esterni per gli agenti personalizzati di Copilot Studio.
Questo articolo è rivolto agli sviluppatori e descrive come integrare le proprie funzionalità di rilevamento delle minacce come provider di sicurezza per gli agenti Copilot Studio.
L'integrazione si basa su un'API composta da due endpoint. Il principale endpoint che devi implementare è l'endpoint analyze-tool-execution. Devi esporre questo endpoint come interfaccia per il tuo sistema di rilevamento delle minacce. Una volta che i clienti configurano il sistema come sistema esterno di rilevamento delle minacce, l'agente chiama questa API ogni volta che intende invocare uno strumento.
Oltre all'endpoint analyze-tool-execution, devi anche esporre un secondo endpoint, chiamato validate. L'endpoint validate viene usato per controllare l'integrità e la conformità dell'endpoint come parte della configurazione del sistema.
Le sezioni seguenti descrivono i dettagli per ciascun endpoint.
POST /validate
Scopo: Verifica che l'endpoint di rilevamento delle minacce sia raggiungibile e funzionante. Utilizzato per l'impostazione iniziale e la verifica della configurazione.
Convalida richiesta
Metodo: POST
URL:
https://{threat detection endpoint}/validate?api-version=2025-05-01Intestazioni:
Autorizzazione: token di connessione per l'autenticazione API
x-ms-correlation-id: GUID per la tracciabilità
Corpo: Vuoto
Convalida risposta
esempio 200 risposte OK
{
"isSuccessful": true,
"status": "OK"
}
Esempio di risposta all'errore
In caso di errore (codice HTTP di errore), l'endpoint restituisce un codice di errore, un messaggio e informazioni diagnostiche opzionali.
{
"errorCode": 5031,
"message": "Validation failed. Webhook service is temporarily unavailable.",
"httpStatus": 503,
"diagnostics": "{\\reason\\:\\Upstream dependency timeout\\}"
}
POST /analyze-tool-execution
Scopo: Invia il contesto di esecuzione dello strumento per la valutazione del rischio. Valuta la richiesta di esecuzione dello strumento e risponde se consentire o bloccare l'esecuzione.
Richiesta analyze-tool-execution
Metodo: POST
URL:
https://{threat detection endpoint}/analyze-tool-execution?api-version=2025-05-01Intestazioni:
- Autorizzazione: token di connessione per l'autenticazione API
- Content-Type: application/json
Corpo: oggetto JSON
Esempio di richiesta per l'endpoint 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"
}
}
Risposta analyze-tool-execution
200 - OK
Quando la richiesta è valida, l'uso dello strumento specificato nella richiesta viene valutato e consentito o bloccato, in base ai criteri definiti. La risposta può includere i seguenti campi:
- blockAction (booleano): Indica se l'azione deve essere bloccata
- reasonCode (integer, opzionale): Codice numerico che indica il motivo del blocco
- motivo (stringa, opzionale): Spiegazione comprensibile
- diagnostica (oggetto, opzionale): Altri dettagli per tracciamento o debug
Esempio di risposta abilitata
{
"blockAction": false
}
Esempio di risposta di blocco
{
"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\\}"
}
Esempio risposta all'errore
Se la richiesta non è valida, viene restituita una risposta di errore contenente un codice di errore, un messaggio, il codice di stato HTTP e informazioni diagnostiche opzionali.
{
"errorCode": 4001,
"message": "Missing required field: toolDefinition",
"httpStatus": 400,
"diagnostics": "{\\missingField\\:\\toolDefinition\\,\\traceId\\:\\abc-123\\}"
}
Informazioni di riferimento sulle strutture del corpo della richiesta e della risposta
Le seguenti tabelle descrivono i contenuti dei vari oggetti utilizzati all'interno dei corpi della richiesta e dei corpi della risposta per gli endpoint.
ValidationResponse
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| isSuccessful | Booleano | Sì | Indica se la validazione ha avuto esito positivo. |
| elaborazione | string | Sì | Messaggio di stato opzionale o dettaglio relativo al partner. |
AnalyzeToolExecutionResponse
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| blockAction | Booleano | Sì | Indica se l'azione deve essere bloccata. |
| reasonCode | integer | No | Codice motivo numerico facoltativo, determinato dal partner. |
| reason | string | No | Spiegazione opzionale leggibile da un umano. |
| diagnostica | string | No | Informazioni diagnostiche opzionali in formato libero per il debug o la telemetria. Deve essere preserializzato. |
ErrorResponse
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| errorCode | integer | Sì | Identificatore numerico per l'errore (es. 1001 = campo mancante, 2003 = fallimento dell'autenticazione). |
| messaggio | string | Sì | Spiegazione leggibile dall'uomo dell'errore. |
| httpStatus | integer | Sì | Codice di stato HTTP restituito dal partner. |
| diagnostica | string | No | Informazioni diagnostiche opzionali in formato libero per il debug o la telemetria. Deve essere preserializzato. |
EvaluationRequest
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| plannerContext | PlannerContext | Sì | Dati di contesto del planner. |
| toolDefinition | ToolDefinition | Sì | Dettagli della definizione dello strumento. |
| inputValues | Oggetto JSON | Sì | Dizionario delle coppie chiave-valore fornito allo strumento. |
| conversationMetadata | ConversationMetadata | Sì | Metadati sul contesto della conversazione, sull'utente e sul monitoraggio del piano. |
PlannerContext
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| userMessage | string | Sì | Il messaggio originale inviato dall'agente. |
| pensiero | string | No | Motivazione fornita dal planner per la scelta di questo strumento. |
| chatHistory | ChatMessage[] | No | Elenco dei messaggi di chat recenti scambiati con l'utente. |
| previousToolsOutputs | ToolExecutionOutput[] | No | Elenco degli output recenti degli strumenti. |
ChatMessage
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| ID. | string | Sì | Identificatore univoco per questo messaggio nella conversazione. |
| ruolo | string | Sì | Fonte del messaggio (es. utente, assistente). |
| contenuto | string | Sì | Il testo del messaggio. |
| timestamp | stringa (data e ora) | No | Timestamp ISO 8601 che indica quando il messaggio è stato inviato. |
ToolExecutionOutputs
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| toolId | string | Sì | Identificatore univoco per questo messaggio nella conversazione. |
| toolName | string | Sì | Nome dello strumento. |
| output | ExecutionOutput[] | Sì | Elenco degli output di esecuzione degli strumenti. |
| timestamp | stringa (data e ora) | No | Timestamp ISO 8601 che indica quando l'esecuzione dello strumento si è conclusa. |
ExecutionOutput
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| nome. | string | Sì | Nome del parametro di output. |
| description | string | No | Spiegazione del valore di output. |
| Tipo | object | No | Tipo di dati di output. |
| value | valore dati JSON | Sì | Il valore di output. |
ToolDefinition
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| ID. | string | Sì | Identificatore univoco dello strumento. |
| Tipo | string | Sì | Specifica il tipo di strumento utilizzato nel planner. |
| nome. | string | Sì | Nome comprensibile dello strumento. |
| description | string | Sì | Riassunto di cosa fa lo strumento. |
| inputParameters | ToolInput[] | No | Parametri di input dello strumento. |
| outputParameters | ToolOutput[] | No | Parametri di output che lo strumento restituisce dopo l'esecuzione. |
ToolInput
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| nome. | string | Sì | Nome del parametro di input. |
| description | string | No | Spiegazione del valore atteso per questo parametro di input. |
| Tipo | Oggetto JSON | No | Tipo di dati del parametro di input. |
ToolOutput
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| nome. | string | Sì | Nome del parametro di output. |
| description | string | No | Spiegazione del valore di output. |
| Tipo | Oggetto JSON | No | Tipo di valore di output. |
ConversationMetadata
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| agente | AgentContext | Sì | Informazioni sul contesto agente. |
| Utente di | UserContext | No | Informazioni sull'utente che interagisce con l'agente. |
| trigger | TriggerContext | No | Informazioni su cosa ha innescato l'esecuzione del planner. |
| conversationId | string | Sì | ID della conversazione in corso. |
| planId | string | No | ID del piano utilizzato per soddisfare la richiesta dell'utente. |
| planStepId | string | No | Passaggio all'interno del piano relativo all'esecuzione di questo strumento. |
| parentAgentComponentId | string | No | ID del componente agente padre. |
AgentContext
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| ID. | string | Sì | ID dell'agente. |
| tenantId | string | Sì | Tenant che ospita l'agente. |
| environmentId | string | Sì | Ambiente in cui viene pubblicato l'agente. |
| versione | string | No | Versione dell'agente (opzionale se isPublished è falso). |
| isPublished | Booleano | Sì | Indica se questo contesto di esecuzione è una versione pubblicata. |
UserContext
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| ID | string | No | ID oggetto Microsoft Entra dell'utente. |
| tenantId | string | No | ID tenant dell'utente. |
TriggerContext
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| ID. | string | No | L'ID del trigger che ha attivato il planner. |
| schemaName | string | No | Il nome dello schema di trigger che ha attivato il planner. |
Autenticazione
L'integrazione da sviluppare dovrebbe utilizzare l'autenticazione Microsoft Entra ID. Segui le istruzioni riportate in Integra le app sviluppate dai tuoi sviluppatori.
I passaggi da eseguire sono i seguenti:
- Creare una registrazione dell'app per la risorsa nel tenant.
-
Esporre un ambito per l'API Web. L'ambito esposto deve essere l'URL base per la risorsa chiamata dai clienti. Ad esempio, se l'URL dell'API è
https://security.contoso.com/api/threatdetection, allora l'ambito esposto deve esserehttps://security.contoso.com. - A seconda di come implementi il tuo servizio, devi implementare la logica di autorizzazione e validare i token in arrivo. È necessario documentare come il cliente deve autorizzare le proprie app. Ci sono diversi modi per farlo, ad esempio utilizzando una lista di autorizzazione degli ID delle app o il controllo degli accessi basato sui ruoli (RBAC).
Requisiti di tempo di risposta
L'agente si aspetta una risposta dal sistema di rilevamento delle minacce entro 1.000 ms. Dovresti assicurarti che il tuo endpoint risponda alla chiamata entro questo intervallo di tempo. Se il tuo sistema non risponde in tempo, l'agente presume che la tua risposta sia "allow" e invoca lo strumento.
Controllo delle versioni API
Nelle richieste, la versione dell'API viene specificata tramite un parametro di query api-version (ad esempio, api-version=2025-05-01). La tua implementazione dovrebbe accettare campi inaspettati e non restituire errori se in futuro vengono aggiunti nuovi valori. I partner non devono verificare la versione dell'API, perché tutte le versioni al momento sono considerate non di rilievo. I partner dovrebbero monitorare le versioni API ma non fallire la richiesta quando ne vedono una nuova versione.