Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[25.x]Copilot FWS: address customer feedback/FUD with Copilot & AI Capabilities page #2464

Merged
merged 5 commits into from
Dec 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -30,95 +30,172 @@ page 7775 "Copilot AI Capabilities"
{
area(Content)
{
group(AllowedDataMovementOffInfo)
group(AOAIServicesInRegionArea)
{
ShowCaption = false;
Visible = ((not WithinGeo) or WithinEuropeGeo) and (not AllowDataMovement);
InstructionalText = 'Copilot uses the Azure OpenAI Service, which isn’t available in your region. To activate Copilot capabilities, you must allow data movement.';
}

group(AllowedDataMovementOnInfo)
{
ShowCaption = false;
Visible = ((not WithinGeo) or WithinEuropeGeo) and AllowDataMovement;
InstructionalText = 'Copilot uses the Azure OpenAI Service, which isn’t available in your region. To keep using Copilot capabilities, you must allow data movement.';
}
Visible = WithinAOAIServicesInRegionArea;
InstructionalText = 'Copilot and agents use the Azure OpenAI Service. Your environment connects to this service in your own region.';

group(AlwaysConnected)
{
ShowCaption = false;
InstructionalText = 'Copilot and other generative AI capabilities use Azure OpenAI Service. Your environment connects to Azure OpenAI Service in your region.';
Visible = WithinGeo and (not WithinEuropeGeo);

field(GovernData; CopilotGovernDataLbl)
field(DataSecurityAndPrivacy; FAQForDataSecurityAndPrivacyLbl)
{
ShowCaption = false;

trigger OnDrillDown()
begin
Hyperlink('https://go.microsoft.com/fwlink/?linkid=2249575');
Hyperlink(FAQForDataSecurityAndPrivacyDocLinkLbl);
end;
}
}

group(NotAlwaysConnected)
{
ShowCaption = false;
InstructionalText = 'By allowing data movement, you agree to data being stored and processed by the Azure OpenAI Service outside of your environment''s geographic region or compliance boundary.';
Visible = ((not WithinGeo) or WithinEuropeGeo) and AllowDataMovement;

field(DataMovement; AllowDataMovement)
field(GovernData; CopilotGovernDataLbl)
{
ApplicationArea = All;
Caption = 'Allow data movement';
ToolTip = 'Specifies whether data movement across regions is allowed. This is required to enable Copilot in your environment.';
Editable = AllowDataMovementEditable;
ShowCaption = false;

trigger OnValidate()
trigger OnDrillDown()
begin
UpdateAllowDataMovement();
Hyperlink(CopilotGovernDataDocLinkLbl);
end;
}

field(AOAIServiceLocated; AOAIServiceLocatedLbl)
field(DataProcessByAOAI; DataProcessByAOAILbl)
{
ShowCaption = false;

trigger OnDrillDown()
begin
Hyperlink('https://go.microsoft.com/fwlink/?linkid=2250267');
Hyperlink(DataProcessByAOAIDocLinkLbl);
end;
}
}

group(NotAlwaysConnected2)
group(EUDBArea)
{
ShowCaption = false;
InstructionalText = 'Generative AI capabilities are deactivated because Azure OpenAI Service is not available in your region. By allowing data movement, you agree to data being stored and processed by the Azure OpenAI Service outside of your environment''s geographic region or compliance boundary.';
Visible = ((not WithinGeo) or WithinEuropeGeo) and (not AllowDataMovement);
Visible = WithinEUDBArea;

field(DataMovement2; AllowDataMovement)
group(AllowedDataMovementOffInfo)
{
ShowCaption = false;
Visible = WithinEUDBArea and (not AllowDataMovement);
InstructionalText = 'Copilot and agents use the Azure OpenAI Service available within the EU Data Boundary. To activate these capabilities, you must allow data movement within this boundary.';
}
group(AllowedDataMovementOnInfo)
{
ShowCaption = false;
Visible = WithinEUDBArea and AllowDataMovement;
InstructionalText = 'Copilot and agents use the Azure OpenAI Service available within the EU Data Boundary. To keep using these capabilities, you must allow data movement within this boundary.';
}
field(EUDBAreaDataSecurityAndPrivacy; FAQForDataSecurityAndPrivacyLbl)
{
ApplicationArea = All;
Caption = 'Allow data movement';
ToolTip = 'Specifies whether data movement across regions is allowed. This is required to enable Copilot in your environment.';
Editable = AllowDataMovementEditable;
ShowCaption = false;

trigger OnValidate()
trigger OnDrillDown()
begin
UpdateAllowDataMovement();
Hyperlink(FAQForDataSecurityAndPrivacyDocLinkLbl);
end;
}
group(EUDBAreaDataMovementGroup)
{
ShowCaption = false;
label(EUDBAreaCaption)
{
ApplicationArea = All;
Caption = 'By allowing data movement, you agree to data being processed by the Azure OpenAI Service within the EU Data Boundary.';
}
field(EUDBAreaDataMovement; AllowDataMovement)
{
ApplicationArea = All;
Caption = 'Allow data movement';
ToolTip = 'Specifies whether data movement across regions is allowed. This is required to enable Copilot in your environment.';
Editable = WithinEUDBArea and AllowDataMovementEditable;

trigger OnValidate()
begin
UpdateAllowDataMovement();
end;
}
field(EUDBAreaAOAIServiceLocated; AOAIServiceLocatedLbl)
{
ShowCaption = false;

trigger OnDrillDown()
begin
Hyperlink(AOAIServiceLocatedDocLinkLbl);
end;
}
field(EUDBAreaDataProcess; DataProcessByAOAILbl)
{
ShowCaption = false;

trigger OnDrillDown()
begin
Hyperlink(DataProcessByAOAIDocLinkLbl);
end;
}
}
}

field(AOAIServiceLocated2; AOAIServiceLocatedLbl)
group(AOAIOutOfRegionArea)
{
ShowCaption = false;
Visible = WithinAOAIOutOfRegionArea;
group(AllowedDataMovementOffInfo2)
{
ShowCaption = false;
Visible = WithinAOAIOutOfRegionArea and (not AllowDataMovement);
InstructionalText = 'Copilot and agents use the Azure OpenAI Service, which isn''t available in your region. To activate these capabilities, you must allow data movement.';
}
group(AllowedDataMovementOnInfo2)
{
ShowCaption = false;
Visible = WithinAOAIOutOfRegionArea and AllowDataMovement;
InstructionalText = 'Copilot and agents use the Azure OpenAI Service, which isn''t available in your region. To keep using these capabilities, you must allow data movement.';
}
field(AOAIOutOfRegionAreaDataSecurityAndPrivacy; FAQForDataSecurityAndPrivacyLbl)
{
ShowCaption = false;

trigger OnDrillDown()
begin
Hyperlink('https://go.microsoft.com/fwlink/?linkid=2250267');
Hyperlink(FAQForDataSecurityAndPrivacyDocLinkLbl);
end;
}
group(AOAIOutOfRegionAreaDataMovementGroup)
{
ShowCaption = false;
label(AOAIOutOfRegionAreaCaption)
{
ApplicationArea = All;
Caption = 'By allowing data movement, you agree to data being processed by the Azure OpenAI Service outside of your environment''s geographic region or compliance boundary.';
}
field(AOAIOutOfRegionAreaDataMovement; AllowDataMovement)
{
ApplicationArea = All;
Caption = 'Allow data movement';
ToolTip = 'Specifies whether data movement across regions is allowed. This is required to enable Copilot in your environment.';
Editable = WithinAOAIOutOfRegionArea and AllowDataMovementEditable;

trigger OnValidate()
begin
UpdateAllowDataMovement();
end;
}
field(AOAIOutOfRegionAreaAOAIServiceLocated; AOAIServiceLocatedLbl)
{
ShowCaption = false;

trigger OnDrillDown()
begin
Hyperlink(AOAIServiceLocatedDocLinkLbl);
end;
}
field(AOAIOutOfRegionAreaDataProcess; DataProcessByAOAILbl)
{
ShowCaption = false;

trigger OnDrillDown()
begin
Hyperlink(DataProcessByAOAIDocLinkLbl);
end;
}
}
}

part(PreviewCapabilities; "Copilot Capabilities Preview")
Expand Down Expand Up @@ -149,7 +226,7 @@ page 7775 "Copilot AI Capabilities"

trigger OnAction()
begin
Hyperlink('https://aka.ms/azurestatus');
Hyperlink(CheckServiceHealthDocLinkLbl);
end;
}
}
Expand All @@ -165,10 +242,12 @@ page 7775 "Copilot AI Capabilities"
trigger OnOpenPage()
var
EnvironmentInformation: Codeunit "Environment Information";
WithinGeo: Boolean;
WithinEUDB: Boolean;
begin
OnRegisterCopilotCapability();

CopilotCapabilityImpl.CheckGeo(WithinGeo, WithinEuropeGeo);
CopilotCapabilityImpl.CheckGeoAndEUDB(WithinGeo, WithinEUDB);

case PrivacyNotice.GetPrivacyNoticeApprovalState(CopilotCapabilityImpl.GetAzureOpenAICategory(), false) of
Enum::"Privacy Notice Approval State"::Agreed:
Expand All @@ -187,10 +266,14 @@ page 7775 "Copilot AI Capabilities"
if not EnvironmentInformation.IsSaaSInfrastructure() then
CopilotCapabilityImpl.ShowCapabilitiesNotAvailableOnPremNotification();

if (WithinGeo and not WithinEuropeGeo) and (not AllowDataMovement) then
if (WithinGeo and not WithinEUDB) and (not AllowDataMovement) then
CopilotCapabilityImpl.ShowPrivacyNoticeDisagreedNotification();

CopilotCapabilityImpl.UpdateGuidedExperience(AllowDataMovement);

WithinEUDBArea := WithinEUDB;
WithinAOAIServicesInRegionArea := WithinGeo and (not WithinEUDB);
WithinAOAIOutOfRegionArea := (not WithinGeo) and (not WithinEUDB);
end;

local procedure UpdateAllowDataMovement()
Expand All @@ -214,10 +297,18 @@ page 7775 "Copilot AI Capabilities"
var
CopilotCapabilityImpl: Codeunit "Copilot Capability Impl";
PrivacyNotice: Codeunit "Privacy Notice";
WithinGeo: Boolean;
WithinEuropeGeo: Boolean;
WithinEUDBArea: Boolean;
WithinAOAIServicesInRegionArea: Boolean;
WithinAOAIOutOfRegionArea: Boolean;
AllowDataMovement: Boolean;
AllowDataMovementEditable: Boolean;
CopilotGovernDataLbl: Label 'How do I govern my Copilot data?';
AOAIServiceLocatedLbl: Label 'In which region will my data be stored and processed?';
FAQForDataSecurityAndPrivacyLbl: Label 'FAQ for data security and privacy';
DataProcessByAOAILbl: Label 'What data is processed by Azure OpenAI Service?';
AOAIServiceLocatedLbl: Label 'In which region will my data be processed?';
CopilotGovernDataDocLinkLbl: Label 'https://go.microsoft.com/fwlink/?linkid=2249575', Locked = true;
FAQForDataSecurityAndPrivacyDocLinkLbl: Label 'https://go.microsoft.com/fwlink/?linkid=2298505', Locked = true;
DataProcessByAOAIDocLinkLbl: Label 'https://go.microsoft.com/fwlink/?linkid=2298232', Locked = true;
AOAIServiceLocatedDocLinkLbl: Label 'https://go.microsoft.com/fwlink/?linkid=2250267', Locked = true;
CheckServiceHealthDocLinkLbl: Label 'https://aka.ms/azurestatus', Locked = true;
}
Original file line number Diff line number Diff line change
Expand Up @@ -119,18 +119,19 @@ page 7774 "Copilot Capabilities GA"
end;
end;
}

#if not CLEAN26
action(SupplementalTerms)
{
Caption = 'Supplemental Terms of Use';
ToolTip = 'Opens the supplemental terms of use for generally available capabilities.';
Image = Info;

Visible = false;
trigger OnAction()
begin
Hyperlink(SupplementalTermsLinkTxt);
end;
}
#endif
}
}

Expand Down Expand Up @@ -163,7 +164,9 @@ page 7774 "Copilot Capabilities GA"
ActionsEnabled: Boolean;
CapabilityEnabled: Boolean;
DataMovementEnabled: Boolean;
#if not CLEAN26
SupplementalTermsLinkTxt: Label 'https://go.microsoft.com/fwlink/?linkid=2236010', Locked = true;
#endif
CopilotFeatureDeactivatedLbl: Label 'The copilot/AI capability %1, App Id %2 has been deactivated by UserSecurityId %3.', Locked = true;
CopilotFeatureActivatedLbl: Label 'The copilot/AI capability %1, App Id %2 has been activated by UserSecurityId %3.', Locked = true;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -241,12 +241,12 @@ codeunit 7774 "Copilot Capability Impl"
end;

[TryFunction]
procedure CheckGeo(var WithinGeo: Boolean; var WithinEuropeGeo: Boolean)
procedure CheckGeoAndEUDB(var WithinGeo: Boolean; var WithinEUDB: Boolean)
var
ALCopilotFunctions: DotNet ALCopilotFunctions;
begin
WithinGeo := ALCopilotFunctions.IsWithinGeo();
WithinEuropeGeo := ALCopilotFunctions.IsEuropeGeo();
WithinEUDB := ALCopilotFunctions.IsWithinEUDB();
end;

procedure UpdateGuidedExperience(AllowDataMovement: Boolean)
Expand Down
Loading