หมายเหตุ
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลอง ลงชื่อเข้าใช้หรือเปลี่ยนไดเรกทอรีได้
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลองเปลี่ยนไดเรกทอรีได้
องค์กรสามารถเพิ่มเลเยอร์ของความปลอดภัยให้กับตัวแทน Copilot Studio ของพวกเขาได้โดยการเชื่อมต่อเข้ากับระบบตรวจจับภัยคุกคามรันไทม์ เมื่อเชื่อมต่อแล้ว ตัวแทนจะเรียกใช้ระบบนี้ในขณะทํางาน ตัวแทนให้ข้อมูลแก่ระบบเพื่อให้ระบบสามารถตรวจสอบว่าเครื่องมือที่แผนการเรียกใช้ตัวแทนนั้นถูกกฎหมายหรือไม่ จากนั้นระบบตอบกลับไปยัง Copilot Studio พร้อมการตอบกลับว่า "อนุมัติ" หรือ "บล็อก" ส่งผลให้ตัวแทนสามารถเรียกใช้หรือข้ามเครื่องมือดังกล่าวได้ สําหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีเชื่อมต่อตัวแทนกับระบบตรวจจับภัยคุกคามภายนอกที่มีอยู่ โปรดดู เปิดใช้งานการตรวจจับภัยคุกคามภายนอกและการป้องกันสําหรับตัวแทนแบบกําหนดเองของ Copilot Studio
บทความนี้มีการกําหนดเป้าหมายไปที่นักพัฒนาและอธิบายวิธีการรวมความสามารถในการตรวจจับภัยคุกคามของคุณเองในฐานะผู้ให้บริการความปลอดภัยสําหรับตัวแทน Copilot Studio
การรวมจะขึ้นอยู่กับ API ที่ประกอบด้วยจุดสิ้นสุดสองจุด จุดสิ้นสุดหลักที่คุณจำเป็นต้องใช้งานคือ analyze-tool-execution คุณจําเป็นต้องเปิดเผยจุดสิ้นสุดนี้เป็นอินเทอร์เฟซกับระบบตรวจจับภัยคุกคามของคุณ เมื่อลูกค้ากําหนดค่าระบบของคุณเป็นระบบตรวจจับภัยคุกคามภายนอกแล้ว ตัวแทนจะเรียกใช้ API นี้ทุกครั้งที่ตั้งใจจะใช้เครื่องมือ
นอกเหนือจากanalyze-tool-executionจุดสิ้นสุด คุณยังจําเป็นต้องแสดงจุดสิ้นสุดที่สอง ที่เรียกว่าvalidate จุด validate สิ้นสุดถูกใช้เพื่อตรวจสอบสถานภาพและความพร้อมของจุดสิ้นสุดเป็นส่วนหนึ่งของการตั้งค่าระบบ
ส่วนต่อไปนี้อธิบายแต่ละจุดสิ้นสุดโดยละเอียด
โพสต์ /ตรวจสอบความถูกต้อง
วัตถุประสงค์: ตรวจสอบว่าจุดสิ้นสุดการตรวจจับภัยคุกคามสามารถเข้าถึงและใช้งานได้ ใช้สําหรับการตั้งค่าเริ่มต้นและการทดสอบการกําหนดค่า
ตรวจสอบความถูกต้องของคําขอ
วิธีการ: POST
เว็บไซต์:
https://{threat detection endpoint}/validate?api-version=2025-05-01ส่วนหัว:
การอนุญาต: โทเค็นแบเรอร์สําหรับการรับรองความถูกต้อง API
x-ms-correlation-id: GUID สําหรับการติดตาม
ร่างกาย: เปล่า
ตรวจสอบความถูกต้องของการตอบสนอง
ตัวอย่างการตอบสนอง 200 ตกลง
{
"isSuccessful": true,
"status": "OK"
}
ตัวอย่างการตอบสนองข้อผิดพลาด
ถ้าเกิดข้อผิดพลาด (รหัส HTTP ไม่สําเร็จ) จุดสิ้นสุดจะส่งกลับรหัสข้อผิดพลาด ข้อความ และการวินิจฉัยทางเลือก
{
"errorCode": 5031,
"message": "Validation failed. Webhook service is temporarily unavailable.",
"httpStatus": 503,
"diagnostics": "{\\reason\\:\\Upstream dependency timeout\\}"
}
POST /การวิเคราะห์การใช้งานเครื่องมือ
วัตถุประสงค์: ส่งบริบทการดําเนินการของเครื่องมือสําหรับการประเมินความเสี่ยง ประเมินคําขอการดําเนินการเครื่องมือและตอบสนองว่าจะอนุญาตหรือบล็อกการดําเนินการของเครื่องมือ
คำขอการดำเนินการใช้เครื่องมือวิเคราะห์
วิธีการ: POST
เว็บไซต์:
https://{threat detection endpoint}/analyze-tool-execution?api-version=2025-05-01ส่วนหัว:
- การอนุญาต: โทเค็นแบเรอร์สําหรับการรับรองความถูกต้อง API
- เนื้อหา-ชนิด: แอปพลิเคชัน/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 ตกลง
เมื่อคําขอ ถูกต้อง เครื่องมือจะใช้ที่ระบุไว้ในคําขอจะได้รับการประเมินและ อนุญาต หรือ บล็อกโดยยึดตามเกณฑ์ที่กําหนด การตอบสนองสามารถมีเขตข้อมูลต่อไปนี้:
- 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
| ชื่อ | ชนิด | ต้องระบุ | คำอธิบาย |
|---|---|---|---|
| isSuccessful | แบบบูลีน | ใช่ | ระบุว่าการตรวจสอบความถูกต้องผ่านหรือไม่ |
| สถานะ | สตริง | ใช่ | ข้อความสถานะทางเลือกหรือรายละเอียดเฉพาะของคู่ค้า |
การวิเคราะห์การตอบสนองของการดำเนินการของเครื่องมือ
| ชื่อ | ชนิด | ต้องระบุ | คำอธิบาย |
|---|---|---|---|
| blockAction | แบบบูลีน | ใช่ | ระบุว่าควรบล็อคการดําเนินการหรือไม่ |
| รหัสเหตุผล | จำนวนเต็ม | ไม่ | รหัสเหตุผลตัวเลขที่เลือกได้ ซึ่งกําหนดโดยคู่ค้า |
| เหตุผล | สตริง | ไม่ | คําอธิบายเพิ่มเติมที่มนุษย์สามารถอ่านได้ |
| วินิจฉัย | สตริง | ไม่ | ข้อมูลการวินิจฉัยรูปแบบอิสระที่เลือกได้สําหรับการตรวจแก้จุดบกพร่องหรือการวัดและส่งข้อมูลทางไกล ต้องทำให้มีการซีเรียลไลซ์ล่วงหน้า |
ErrorResponse
| ชื่อ | ชนิด | ต้องระบุ | คำอธิบาย |
|---|---|---|---|
| รหัสข้อผิดพลาด | จำนวนเต็ม | ใช่ | ตัวระบุตัวเลขสําหรับข้อผิดพลาด (ตัวอย่างเช่น 1001 = เขตข้อมูลที่ขาดหายไป 2003 = การรับรองความถูกต้องล้มเหลว) |
| ข้อความ | สตริง | ใช่ | คําอธิบายข้อผิดพลาดที่มนุษย์อ่านได้ |
| httpStatus | จำนวนเต็ม | ใช่ | รหัสสถานะ HTTP ที่คู่ค้าส่งกลับ |
| วินิจฉัย | สตริง | ไม่ | ข้อมูลการวินิจฉัยรูปแบบอิสระที่เลือกได้สําหรับการตรวจแก้จุดบกพร่องหรือการวัดและส่งข้อมูลทางไกล ต้องทำให้มีการซีเรียลไลซ์ล่วงหน้า |
คำขอการประเมิน
| ชื่อ | ชนิด | ต้องระบุ | คำอธิบาย |
|---|---|---|---|
| plannerContext | PlannerContext | ใช่ | ข้อมูลบริบทของระบบวางแผน |
| toolDefinition | ToolDefinition | ใช่ | รายละเอียดข้อกําหนดเครื่องมือ |
| inputValues | วัตถุ JSON | ใช่ | พจนานุกรมของคู่คีย์-ค่าที่กําหนดให้กับเครื่องมือ |
| conversationMetadata | ConversationMetadata | ใช่ | เมตาดาต้าเกี่ยวกับบริบทการสนทนา ผู้ใช้ และการติดตามแผน |
PlannerContext
| ชื่อ | ชนิด | ต้องระบุ | คำอธิบาย |
|---|---|---|---|
| ข้อความผู้ใช้ | สตริง | ใช่ | ข้อความต้นฉบับส่งโดยเอเจนต์ |
| ความคิด | สตริง | ไม่ | คําอธิบายสําหรับนักวางแผนสําหรับสาเหตุที่เลือกเครื่องมือนี้ |
| chatHistory | ChatMessage[] | ไม่ | รายการของข้อความสนทนาล่าสุดที่แลกเปลี่ยนกับผู้ใช้ |
| ผลลัพธ์จากเครื่องมือก่อนหน้า | ToolExecutionOutput[] | ไม่ | รายการผลลัพธ์เครื่องมือล่าสุด |
ChatMessage
| ชื่อ | ชนิด | ต้องระบุ | คำอธิบาย |
|---|---|---|---|
| รหัส | สตริง | ใช่ | ตัวระบุที่ไม่ซ้ําสําหรับข้อความนี้ในการสนทนา |
| บทบาท | สตริง | ใช่ | แหล่งที่มาของข้อความ (ตัวอย่างเช่น ผู้ใช้ ผู้ช่วย) |
| เนื้อหา | สตริง | ใช่ | เนื้อหาข้อความ |
| ประทับเวลา | สตริง (วันที่-เวลา) | ไม่ | ตราประทับเวลา ISO 8601 ที่ระบุเมื่อส่งข้อความ |
ผลลัพธ์จากการทำงานของเครื่องมือ
| ชื่อ | ชนิด | ต้องระบุ | คำอธิบาย |
|---|---|---|---|
| toolId | สตริง | ใช่ | ตัวระบุที่ไม่ซ้ําสําหรับข้อความนี้ในการสนทนา |
| toolName | สตริง | ใช่ | ชื่อของเครื่องมือ |
| เอาต์ พุ ต | ExecutionOutput[] | ใช่ | รายการของผลลัพธ์การดําเนินการเครื่องมือ |
| ประทับเวลา | สตริง (วันที่-เวลา) | ไม่ | การประทับเวลา ISO 8601 จะระบุเมื่อการดําเนินการเครื่องมือเสร็จสิ้น |
ExecutionOutput
| ชื่อ | ชนิด | ต้องระบุ | คำอธิบาย |
|---|---|---|---|
| ชื่อ | สตริง | ใช่ | ชื่อของพารามิเตอร์เอาต์พุต |
| คำอธิบาย | สตริง | ไม่ | คําอธิบายสําหรับค่าเอาต์พุต |
| type | ออบเจ็กต์ | ไม่ | ชนิดข้อมูลของผลลัพธ์ |
| value | ค่าข้อมูล JSON | ใช่ | ค่าเอาต์พุต |
ToolDefinition
| ชื่อ | ชนิด | ต้องระบุ | คำอธิบาย |
|---|---|---|---|
| รหัส | สตริง | ใช่ | รหัสเฉพาะของเครื่องมือ |
| type | สตริง | ใช่ | ระบุชนิดของเครื่องมือที่ใช้ในตัววางแผน |
| ชื่อ | สตริง | ใช่ | ชื่อของเครื่องมือที่มนุษย์สามารถอ่านได้ |
| คำอธิบาย | สตริง | ใช่ | ข้อมูลสรุปของสิ่งที่เครื่องมือทํา |
| พารามิเตอร์ที่ใส่เข้าไป | ToolInput[] | ไม่ | พารามิเตอร์ข้อมูลป้อนเข้าของเครื่องมือ |
| outputParameters | ToolOutput[] | ไม่ | พารามิเตอร์เอาต์พุตที่เครื่องมือส่งกลับหลังจากการดําเนินการ |
ToolInput
| ชื่อ | ชนิด | ต้องระบุ | คำอธิบาย |
|---|---|---|---|
| ชื่อ | สตริง | ใช่ | ชื่อของพารามิเตอร์ข้อมูลป้อนเข้า |
| คำอธิบาย | สตริง | ไม่ | คําอธิบายค่าที่คาดไว้สําหรับพารามิเตอร์การป้อนข้อมูลนี้ |
| type | วัตถุ JSON | ไม่ | ชนิดข้อมูลของพารามิเตอร์ข้อมูลป้อนเข้า |
ToolOutput
| ชื่อ | ชนิด | ต้องระบุ | คำอธิบาย |
|---|---|---|---|
| ชื่อ | สตริง | ใช่ | ชื่อของพารามิเตอร์เอาต์พุต |
| คำอธิบาย | สตริง | ไม่ | คําอธิบายของค่าเอาต์พุต |
| type | วัตถุ JSON | ไม่ | ชนิดของค่าเอาต์พุต |
ConversationMetadata
| ชื่อ | ชนิด | ต้องระบุ | คำอธิบาย |
|---|---|---|---|
| เอเจนต์ | AgentContext | ใช่ | ข้อมูลบริบทของตัวแทน |
| ผู้ใช้ | UserContext | ไม่ | ข้อมูลเกี่ยวกับผู้ใช้ที่โต้ตอบกับตัวแทน |
| ทริกเกอร์ | TriggerContext | ไม่ | ข้อมูลเกี่ยวกับสิ่งที่กระตุ้นการดำเนินการตามแผน |
| conversationId | สตริง | ใช่ | ID ของการสนทนาที่กําลังดําเนินอยู่ |
| planId | สตริง | ไม่ | ID ของแผนที่ใช้ในการปฏิบัติตามคําขอของผู้ใช้ |
| planStepId | สตริง | ไม่ | ขั้นตอนภายในแผนที่สอดคล้องกับการดําเนินการของเครื่องมือนี้ |
| parentAgentComponentId | สตริง | ไม่ | รหัสของคอมโพเนนต์ของบริษัทตัวแทนหลัก |
AgentContext
| ชื่อ | ชนิด | ต้องระบุ | คำอธิบาย |
|---|---|---|---|
| รหัส | สตริง | ใช่ | ID ของเจ้าหน้าที่ |
| รหัสผู้เช่า | สตริง | ใช่ | ผู้เช่าที่มีตัวแทนอยู่ |
| environmentId | สตริง | ใช่ | สภาพแวดล้อมที่มีการเผยแพร่เอเจนต์ |
| รุ่น | สตริง | ไม่ | เวอร์ชันของตัวแทน (ไม่บังคับถ้า isPublished เป็นเท็จ) |
| เผยแพร่แล้ว | แบบบูลีน | ใช่ | ไม่ว่าบริบทการดําเนินการนี้เป็นเวอร์ชันที่เผยแพร่หรือไม่ |
UserContext
| ชื่อ | ชนิด | ต้องระบุ | คำอธิบาย |
|---|---|---|---|
| รหัส | สตริง | ไม่ | รหัสวัตถุ Microsoft Entra ของผู้ใช้ |
| รหัสผู้เช่า | สตริง | ไม่ | ID ผู้เช่าของผู้ใช้ |
TriggerContext
| ชื่อ | ชนิด | ต้องระบุ | คำอธิบาย |
|---|---|---|---|
| รหัส | สตริง | ไม่ | รหัสของทริกเกอร์ที่กระตุ้นตัววางแผน |
| 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 แต่ไม่ควรทำให้คำขอล้มเหลวเมื่อเห็นเวอร์ชันใหม่