diff --git a/src/System Application/App/AI/src/Copilot/CopilotAICapabilities.Page.al b/src/System Application/App/AI/src/Copilot/CopilotAICapabilities.Page.al index 6362b24562..7196f19e71 100644 --- a/src/System Application/App/AI/src/Copilot/CopilotAICapabilities.Page.al +++ b/src/System Application/App/AI/src/Copilot/CopilotAICapabilities.Page.al @@ -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") @@ -149,7 +226,7 @@ page 7775 "Copilot AI Capabilities" trigger OnAction() begin - Hyperlink('https://aka.ms/azurestatus'); + Hyperlink(CheckServiceHealthDocLinkLbl); end; } } @@ -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: @@ -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() @@ -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; } \ No newline at end of file diff --git a/src/System Application/App/AI/src/Copilot/CopilotCapabilitiesGA.Page.al b/src/System Application/App/AI/src/Copilot/CopilotCapabilitiesGA.Page.al index 71125feacc..c0fbbc521a 100644 --- a/src/System Application/App/AI/src/Copilot/CopilotCapabilitiesGA.Page.al +++ b/src/System Application/App/AI/src/Copilot/CopilotCapabilitiesGA.Page.al @@ -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 } } @@ -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; diff --git a/src/System Application/App/AI/src/Copilot/CopilotCapabilityImpl.Codeunit.al b/src/System Application/App/AI/src/Copilot/CopilotCapabilityImpl.Codeunit.al index 46bf32dfaf..af52a26f86 100644 --- a/src/System Application/App/AI/src/Copilot/CopilotCapabilityImpl.Codeunit.al +++ b/src/System Application/App/AI/src/Copilot/CopilotCapabilityImpl.Codeunit.al @@ -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)