核心架构与基础
Dynamics 365 Copilot 虽是强大的 AI 助手,但通用功能往往难以覆盖特定行业的定制需求。要扩展其能力,主要依赖 Power Platform 插件框架和 Copilot Studio 的自定义连接器。核心技术栈包括 C# (.NET Framework 4.8 或 .NET 6+) 编写业务逻辑、Dynamics 365 SDK 交互 Dataverse、Azure OpenAI 或自定义 LLM 接口扩展 AI 生成能力,以及 Power Platform 注册工具进行部署。 核心逻辑是通过 C# 插件拦截 Copilot 的交互请求,注入自定义业务规则,调用外部 AI 服务或 Dataverse 数据,最终返回定制化的 AI 响应。
环境准备与项目初始化
开发前需安装 Visual Studio 2022(含 .NET 桌面开发和 Azure 开发工作负载)、Dynamics 365 SDK、Power Platform CLI 以及拥有 Copilot 启用权限的 Dynamics 365 环境。 创建插件项目时,可以通过 Power Platform CLI 快速初始化:
pac plugin init --name CopilotCustomPlugin --template ClassLibrary
核心示例:自定义客户服务 Copilot 插件
场景描述
假设某零售企业需要定制 Copilot 能力:当用户通过 Copilot 查询客户订单状态时,Copilot 能自动从 Dataverse 中读取该客户的订单数据,并结合 AI 生成结构化、个性化的回复,而非通用话术。
插件核心类实现
我们需要继承 IPlugin 接口来实现业务逻辑。以下是一个处理客户订单查询的插件入口类 CustomerOrderCopilotPlugin.cs。
using Microsoft.Crm.Sdk.Messages;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using System;
using System.Linq;
public class CustomerOrderCopilotPlugin : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
try
{
string customerId = context.InputParameters["CustomerId"]?.ToString();
string queryType = context.InputParameters[]?.ToString();
(.IsNullOrEmpty(customerId) || queryType != )
{
InvalidPluginExecutionException();
}
orderData = GetCustomerOrders(service, customerId);
copilotResponse = BuildCopilotResponse(orderData);
context.OutputParameters[] = copilotResponse;
}
(Exception ex)
{
InvalidPluginExecutionException( + ex.Message, ex);
}
}
{
QueryExpression query = QueryExpression()
{
ColumnSet = ColumnSet(, , , , ),
Criteria = FilterExpression
{
Conditions = { ConditionExpression(, ConditionOperator.Equal, Guid(customerId)) }
},
Orders = { OrderExpression(, OrderType.Descending) }
};
service.RetrieveMultiple(query);
}
{
(orders.Entities.Count == )
{
;
}
responseBuilder = System.Text.StringBuilder();
responseBuilder.AppendLine();
( order orders.Entities)
{
orderName = order[].ToString();
orderStatus = GetOrderStatusText(order.GetAttributeValue<OptionSetValue>().Value);
totalAmount = order.GetAttributeValue<Money>().Value;
DateTime createDate = order.GetAttributeValue<DateTime>();
responseBuilder.AppendLine();
responseBuilder.AppendLine();
responseBuilder.AppendLine();
responseBuilder.AppendLine();
}
responseBuilder.AppendLine();
responseBuilder.ToString();
}
{
statusCode
{
=> ,
=> ,
=> ,
=> ,
=> ,
=> ,
_ =>
};
}
}

