diff --git a/404.html b/404.html index a9d1bf21..a3e17fc9 100644 --- a/404.html +++ b/404.html @@ -14,8 +14,8 @@ - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

diff --git a/Cookbook/dial-cookbook/examples/how_to_call_image_to_text_applications/index.html b/Cookbook/dial-cookbook/examples/how_to_call_image_to_text_applications/index.html index 984c2d1a..71712269 100644 --- a/Cookbook/dial-cookbook/examples/how_to_call_image_to_text_applications/index.html +++ b/Cookbook/dial-cookbook/examples/how_to_call_image_to_text_applications/index.html @@ -14,8 +14,8 @@ - - + +
Skip to main content

How to call image-to-text DIAL applications

From this diff --git a/Cookbook/dial-cookbook/examples/how_to_call_text_to_image_applications/index.html b/Cookbook/dial-cookbook/examples/how_to_call_text_to_image_applications/index.html index d96b53f1..554d01b1 100644 --- a/Cookbook/dial-cookbook/examples/how_to_call_text_to_image_applications/index.html +++ b/Cookbook/dial-cookbook/examples/how_to_call_text_to_image_applications/index.html @@ -14,8 +14,8 @@ - - + +

How to call text-to-image DIAL applications

From this diff --git a/Cookbook/dial-cookbook/examples/how_to_call_text_to_text_applications/index.html b/Cookbook/dial-cookbook/examples/how_to_call_text_to_text_applications/index.html index bcbd6d01..b67f157a 100644 --- a/Cookbook/dial-cookbook/examples/how_to_call_text_to_text_applications/index.html +++ b/Cookbook/dial-cookbook/examples/how_to_call_text_to_text_applications/index.html @@ -14,8 +14,8 @@ - - + +

How to call text-to-text DIAL applications

From this diff --git a/Deployment/Bedrock Model Deployment/index.html b/Deployment/Bedrock Model Deployment/index.html index 38b13214..e5b1fa7c 100644 --- a/Deployment/Bedrock Model Deployment/index.html +++ b/Deployment/Bedrock Model Deployment/index.html @@ -14,11 +14,11 @@ - - + + -

Bedrock Model Deployment

+

Bedrock Model Deployment

In this instruction, you will learn how to create Bedrock model in AWS and use it in AI DIAL config.

Refer to AWS Documentation to learn about this model.

diff --git a/Deployment/OpenAI Model Deployment/index.html b/Deployment/OpenAI Model Deployment/index.html index 5066fb49..78defea5 100644 --- a/Deployment/OpenAI Model Deployment/index.html +++ b/Deployment/OpenAI Model Deployment/index.html @@ -14,11 +14,11 @@ - - + + -

OpenAI Model Deployment

+

OpenAI Model Deployment

From this instruction, you will learn how to create an Azure OpenAI model GPT-3.5-turbo/GPT-4 and use it in AI DIAL config.

Table of Contents

  • Prerequisites
  • @@ -126,6 +126,6 @@

    Microsoft Entra Workload ID with Azure Kubernetes Service.

In this scenario, the adapter uses Azure user-assigned managed identity. In such a configuration, there's no need to setting the Azure OpenAI API key in the AI DIAL Core configuration file. Authentication takes place on the adapter level.

-
openai:
enabled: true

podLabels:
azure.workload.identity/use: "true"

serviceAccount:
create: true
annotations:
azure.workload.identity/client-id: "client-id"
+
openai:
enabled: true

podLabels:
azure.workload.identity/use: "true"

serviceAccount:
create: true
annotations:
azure.workload.identity/client-id: "client-id"
\ No newline at end of file diff --git a/Deployment/Vertex Model Deployment/index.html b/Deployment/Vertex Model Deployment/index.html index 659a41ac..51ba5c33 100644 --- a/Deployment/Vertex Model Deployment/index.html +++ b/Deployment/Vertex Model Deployment/index.html @@ -14,11 +14,11 @@ - - + + -

Vertex Model Deployment

+

Vertex Model Deployment

In this instruction, you will learn how to create VertexAI model in Google Cloud Platform and use it in AI DIAL config.

Table of Contents

+

Introduction

+

This basic tutorial demonstrates the steps to create a user pool in AWS Cognito and use it as an identity and access management solution for AI DIAL users.

+

In AI DIAL, you can assign roles to Models, Applications, Addons, and Assistants to restrict the number of tokens that can be transmitted in a specific time frame. These roles and their limitations can be created in external systems and then assigned in AI DIAL's configuration.

Configuration Guidelines

Configure AWS Cognito

-

To configure AWS Cognito, you can follow these steps:

+
+

[!TIP] +Replace <chat_url> with the actual address of your AI DIAL Chat application.

+
+

Follow these steps to configure AWS Cognito:

    -
  1. -

    Begin by creating a user pool. You can refer to the official AWS documentation for detailed instructions on how to create a user pool. Here is the link: Create User Pool.

    -
  2. -
  3. -

    Once the user pool is set up, you can proceed to create users within the pool. The AWS documentation provides guidance on how to sign up users in your application. You can find the instructions here: Create User.

    -
  4. -
  5. -

    Next, you will need to create an app client specifically for this user pool. This app client will be responsible for integrating your application with the user pool. The AWS documentation offers detailed instructions on configuring app integration with user pools. You can access the instructions here: Create App Client for User Pool.

    -
  6. -
  7. -

    Under the App client settings section, set the following parameters:

    +
  8. Create User Pool: refer to AWS documentation for detailed instructions on how to create a User Pool.
  9. +
  10. Configure Application Client: during the creation of a user pool, navigate to the section Integrate your app (you can access it later under App Integration/Create App Client) and create the following settings. Refer to AWS documentation for details.
      -
    • -

      Callback URL(s): Enter the callback function URL as follows

      -
      https://<chat_url>/api/auth/callback/cognito
      -

      Replace <chat_url> with the actual address of your AI DIAL Chat application.

      -
    • -
    • -

      OAuth 2.0 Allowed OAuth Flows: Select "Authorization code grant".

      -
    • -
    • -

      OAuth 2.0 Allowed OAuth Scopes: Enable the following scopes:

      -
        -
      • email
      • -
      • openid
      • -
      • profile
      • +
      • App client name: provide a relevant and descriptive name for the client.
      • +
      • Client secret: select the option to Generate a client secret
      • +
      • Allowed callback URLs: enter https://<chat_url>/api/auth/callback/cognito
      • +
      • Authentication flows: enable ALLOW_CUSTOM_AUTH ALLOW_REFRESH_TOKEN_AUTH and ALLOW_USER_SRP_AUTH.
      • +
      • OpenID Connect scopes: select OpenID Email Profile
    • -
    • -

      Enabled Identity Providers: Select "Cognito user pool".

      -
    • +
    • Create Cognito Domain: when setting up a user pool, navigate to the Hosted authentication pages. If the Use the Cognito Hosted UI option is enabled, you'll configure your domain here. Alternatively, you can access this configuration later by going to App Integration/Domain/Actions. Refer to AWS documentation for details.
    • +
    • Create Users: in the User polls/Users section, create necessary Users.
    • +
    • Collect Configuration Parameters: you will need them for AI DIAL configuration. +
        +
      • In the Amazon Cognito/User pools/Pool name section, record User pool ID and Token signing key URL.
      • +
      • In App Integration/App client list, click on the specific app client name to obtain the Client ID andClient secret - record them as well.
    • +
    • (Optional) Create and Assign Group: in the User polls/Groups section, create necessary Groups and assign to User created in the previous step.

Configure AI DIAL

-

By configuring both AI DIAL Chat and AI DIAL Core with the necessary AWS Cognito environment variables, you will enable them to work together seamlessly with AWS Cognito for authentication and authorization purposes. -To configure AI DIAL Chat and AI DIAL Core to work with AWS Cognito, follow these steps:

+

By configuring both AI DIAL Chat and AI DIAL Core with the necessary AWS Cognito environment variables, you will enable them to work together seamlessly with AWS Cognito for authentication and authorization purposes.

+

To configure AI DIAL Chat and AI DIAL Core to work with AWS Cognito, follow these steps:

AI DIAL Chat Settings

Add the following environment variables to AI DIAL Chat configuration. Refer to AI DIAL Chat to learn more.

-
AUTH_COGNITO_CLIENT_ID: "<client_id>"  # client ID of your AWS Cognito app client integration.
AUTH_COGNITO_HOST: "<cognito_host>" # URL consisting of the Cognito Identity endpoint and User Pool ID.
AUTH_COGNITO_NAME: "<cognito_client_name>" # name of your AWS Cognito app client integration
AUTH_COGNITO_SECRET: "<client_secret>" # client secret of your AWS Cognito app client integration
+
AUTH_COGNITO_CLIENT_ID: "<cognito_client_id>"
AUTH_COGNITO_HOST: "<cognito_host>"
AUTH_COGNITO_SECRET: "<cognito_client_secret>"
-

cognito_host example: https://cognito-idp.<region>.amazonaws.com/<my-pool-id>

+

[!TIP]
+cognito_host example: https://cognito-idp.<cognito_region>.amazonaws.com/<cognito_pool-id>

AI DIAL Core Settings

-

Add the following parameters to AI DIAL Core. Refer to AI DIAL Core configuration to learn more.

-
aidial.identityProviders.cognito.jwksUrl: "<token_url>" # URL to jwks token
aidial.identityProviders.cognito.rolePath: "roles"
aidial.identityProviders.cognito.issuerPattern: '^https:\/\/cognito-idp\.<region>\.amazonaws\.com.+$'
aidial.identityProviders.cognito.loggingKey: "email"
aidial.identityProviders.cognito.loggingSalt: "loggingSalt"
+

Add the following parameters to AI DIAL Core static settings. Refer to AI DIAL Core for more details.

+
aidial.identityProviders.cognito.jwksUrl: "<cognito_jwks_uri>"
aidial.identityProviders.cognito.rolePath: "cognito:groups"
aidial.identityProviders.cognito.issuerPattern: '^https:\/\/cognito-idp\.<cognito_region>\.amazonaws\.com.+$'
aidial.identityProviders.cognito.loggingKey: "sub"
aidial.identityProviders.cognito.loggingSalt: "loggingSalt"
-

token_url example: https://cognito-idp.<region>.amazonaws.com/<my-pool-id>/.well-known/jwks.json

-
+

[!TIP] +cognito_jwks_uri example: https://cognito-idp.<cognito_region>.amazonaws.com/<cognito_pool-id>/.well-known/jwks.json

+ +

Assignment of Roles

+

Once all the above steps are completed, including the ones marked as Optional, you can assign roles to Models, Applications, Addons, and Assistants.

+

In AI DIAL Core:

+
    +
  • Static settings: as value for aidial.identityProviders.cognito.rolePath provide a claim from Cognito.
  • +
  • Dynamic settings: for userRoles provide a specific group name as a claim value.
  • +
+

In this example, "cognito-group-name" role from the "cognito:groups" claim is configured for chat-gpt-35-turbo model:

+
  # Dynamic settings of AI DIAL Core
"models": {
"chat-gpt-35-turbo": {
"type": "chat",
"endpoint" : "http://localhost:7001/v1/openai/deployments/gpt-35-turbo/chat/completions",
"upstreams": [
{"endpoint": "http://localhost:7001", "key": "modelKey1"}
],
"userRoles": ["cognito-group-name"]
}
}
\ No newline at end of file diff --git a/Deployment/idp-configuration/entraID/index.html b/Deployment/idp-configuration/entraID/index.html new file mode 100644 index 00000000..3e3320c9 --- /dev/null +++ b/Deployment/idp-configuration/entraID/index.html @@ -0,0 +1,85 @@ + + + + + +entraID | DIAL Knowledge Base + + + + + + + + + + + + + + +

How to Set Microsoft Entra as Identity Provider

+ +

Introduction

+

This basic tutorial demonstrates how to configure Microsoft Entra ID and integrate it with AI DIAL for identity and access management.

+

In AI DIAL, you can assign roles to Models, Applications, Addons, and Assistants to restrict the number of tokens that can be transmitted in a specific time frame. These roles and their limitations can be created in external systems and then assigned in AI DIAL's configuration.

+

Configuration Guidelines

+

Configure Microsoft Entra ID

+
+

[!TIP] +Replace <chat_url> with the actual address of your AI DIAL Chat application.

+
+

Follow these steps to configure Microsoft Entra ID:

+
    +
  1. Create an Application: refer to Microsoft documentation to learn how to register an application. Set the following parameters: +
      +
    • Name
    • +
    • Supported account types
    • +
    • Platform: Web
    • +
    • Redirect URI: https://<chat_url>/api/auth/callback/azure-ad
    • +
    +
  2. +
  3. After registering an application, obtain and save Application (client) ID and Directory (tenant) ID - you will need them to configure AI DIAL. Refer to Microsoft documentation.
  4. +
  5. Create and save a Client secret: in the Certificates & secrets/Client secret section, create New client secret and save its value. Refer to Microsoft documentation.
  6. +
  7. (Optional) Create a Group and add members: once the application integration is set up, create the necessary Group and add members. Refer to Microsoft documentation.
  8. +
  9. (Optional) Configure ID Token: in the Token Configuration section, Add Groups claim and customize which groups you want to include and where (access, ID token). Refer to Microsoft documentation.
  10. +
+

Configure AI DIAL

+

By configuring both AI DIAL Chat and AI DIAL Core with the necessary Microsoft Entra ID environment variables, you will enable them to work together seamlessly with Microsoft Entra ID for authentication and authorization purposes.

+

To configure AI DIAL Chat and AI DIAL Core to work with Microsoft Entra ID, follow these steps:

+

AI DIAL Chat Settings

+
+

[!NOTE] +The application scope is required to validate signature of the access token. +Refer to Microsoft Portal to read more about this case.

+
+

Add the following environment variables to AI DIAL Chat configuration. Refer to AI DIAL Chat for more details.

+
AUTH_AZURE_AD_CLIENT_ID: "<azure_client_id>"
AUTH_AZURE_AD_TENANT_ID: "<azure_tenant_id>"
AUTH_AZURE_AD_SECRET: "<azure_client_secret>"
AUTH_AZURE_AD_SCOPE: "openid profile <azure_client_id>/.default email offline_access"
+

AI DIAL Core Settings

+

Add the following parameters to AI DIAL Core static settings. Refer to AI DIAL Core for more details.

+
aidial.identityProviders.azure.jwksUrl: "https://login.microsoftonline.com/<azure_tenant_id>/discovery/v2.0/keys"
aidial.identityProviders.azure.rolePath: "groups"
aidial.identityProviders.azure.issuerPattern: '^https:\/\/sts\.windows\.net.+$'
aidial.identityProviders.azure.loggingKey: "sub"
aidial.identityProviders.azure.loggingSalt: "loggingSalt"
+

Assignment of Roles

+

Once all the above steps are completed, including the ones marked as Optional, you can assign roles to Models, Applications, Addons, and Assistants.

+

In AI DIAL Core:

+
    +
  • Static settings: as value for aidial.identityProviders.azure.rolePath provide a claim from Microsoft Entra.
  • +
  • Dynamic settings: for userRoles provide a specific group name as a claim value.
  • +
+

In this example, "azure-group-name" role from the "groups" claim is configured for chat-gpt-35-turbo model:

+
# Dynamic settings of AI DIAL Core
"models": {
"chat-gpt-35-turbo": {
"type": "chat",
"endpoint" : "http://localhost:7001/v1/openai/deployments/gpt-35-turbo/chat/completions",
"upstreams": [
{"endpoint": "http://localhost:7001", "key": "modelKey1"}
],
"userRoles": ["azure-group-name"]
}
}
+ + \ No newline at end of file diff --git a/Deployment/idp-configuration/google/index.html b/Deployment/idp-configuration/google/index.html new file mode 100644 index 00000000..866c420d --- /dev/null +++ b/Deployment/idp-configuration/google/index.html @@ -0,0 +1,79 @@ + + + + + +google | DIAL Knowledge Base + + + + + + + + + + + + + + +

How to Set Google OAuth2 as Identity Provider

+ +

Introduction

+

This basic tutorial demonstrates how to configure Google OAuth2 and integrate it with AI DIAL for identity and access management.

+

In AI DIAL, you can assign roles to Models, Applications, Addons, and Assistants to restrict the number of tokens that can be transmitted in a specific time frame. These roles and their limitations can be created in external systems and then assigned in AI DIAL's configuration.

+

Configuration Guidelines

+

Configure Google OAuth2

+
+

[!TIP] +Replace <chat_url> with the actual address of your AI DIAL Chat application.

+
+

Follow these steps to configure Google OAuth2:

+
    +
  1. Create an OAuth consent screen: refer Google documentation to learn how to do this.
  2. +
  3. Create Client ID and Secret: click Create Credentials > OAuth Client ID and fill it with: +
      +
    • Name
    • +
    • Application Type: Web Application
    • +
    • Authorized JavaScript Origins: https://<chat_url>
    • +
    • Authorized Redirect URLs: https://<chat_url>/api/auth/callback/google
    • +
    +
  4. +
  5. Obtain and save Client ID and Client Secret from the OAuth Client modal.
  6. +
  7. (Optional) Create a Group and add members: Once the application integration is set up, create the necessary Group and add members in Google Group.
  8. +
  9. (Optional) Enable the Google Cloud Identity API: click ENABLE in your organization’s dashboard.
  10. +
+

Configure AI DIAL

+

To enable AI DIAL Chat and AI DIAL Core to work with Google OAuth2, configure them with the necessary specific parameters.

+

AI DIAL Chat Settings

+

Add the following environment variables to AI DIAL Chat configuration. Refer to AI DIAL Chat for more details.

+
AUTH_GOOGLE_CLIENT_ID: "<google_client_id>"
AUTH_GOOGLE_SECRET: "<google_tenant_id>"
AUTH_GOOGLE_SCOPE: "openid email profile https://www.googleapis.com/auth/cloud-identity.groups.readonly" # Optional
+

AI DIAL Core Settings

+

Add the following parameters to AI DIAL Core static settings. Refer to AI DIAL Core for more details.

+
aidial.identityProviders.google.userInfoEndpoint: "https://openidconnect.googleapis.com/v1/userinfo"
aidial.identityProviders.google.rolePath: "fn:getGoogleWorkspaceGroups"
aidial.identityProviders.google.loggingKey: "sub"
aidial.identityProviders.google.loggingSalt: "loggingSalt"
+

Assignment of Roles

+

Once all the above steps are completed, including the ones marked as Optional, you can assign roles to Models, Applications, Addons, and Assistants.

+

In AI DIAL Core:

+
    +
  • Static settings: as value for aidial.identityProviders.google.rolePath provide an API endpoint from Google OAuth2.
  • +
  • Dynamic settings: for userRoles provide a specific group name.
  • +
+

In this example, "google-group-name" role from the "fn:getGoogleWorkspaceGroups" API endpoint is configured for chat-gpt-35-turbo model:

+
"models": {
"chat-gpt-35-turbo": {
"type": "chat",
"endpoint" : "http://localhost:7001/v1/openai/deployments/gpt-35-turbo/chat/completions",
"upstreams": [
{"endpoint": "http://localhost:7001", "key": "modelKey1"}
],
"userRoles": ["google-group-name"]
}
}
+ + \ No newline at end of file diff --git a/Deployment/idp-configuration/keycloak/index.html b/Deployment/idp-configuration/keycloak/index.html new file mode 100644 index 00000000..74bd3731 --- /dev/null +++ b/Deployment/idp-configuration/keycloak/index.html @@ -0,0 +1,114 @@ + + + + + +keycloak | DIAL Knowledge Base + + + + + + + + + + + + + + +

How to Set Keycloak as Identity Provider

+ +

Introduction

+

This basic tutorial demonstrates the steps to create a REALM in Keycloak and use it as an identity and access management solution for AI DIAL users.

+

In AI DIAL, you can assign roles to Models, Applications, Addons, and Assistants to restrict the number of tokens that can be transmitted in a specific time frame. These roles and their limitations can be created in external systems and then assigned in AI DIAL's configuration.

+

Configuration Guidelines

+

Configure Keycloak

+
+

[!TIP] +Replace <chat_url> with the actual address of your AI DIAL Chat application.

+
+

There are two ways to configure Keycloak: via Admin Console or using a CLI tool.

+

Configuration in Keycloak Admin Console

+

Follow these steps to configure Keycloak in Admin Console:

+
    +
  1. Create a Client: Create an OpenID Connect client in Keycloak with the following settings: +
      +
    • Client type: OpenID Connect
    • +
    • Client ID: dial-chat
    • +
    • Client authentication: On
    • +
    • Root URL: <chat_url>
    • +
    • Valid redirect URIs: <chat_url>/*
    • +
    • Home URL: <chat_url>
    • +
    • Web origins: <chat_url>
    • +
    +
  2. +
  3. Collect configuration parameters: in this step, you will collect parameters that will be required for AI DIAL configuration. +
      +
    • In Clients/Client details/Settings, record the Client ID.
    • +
    • In Clients/Client details/Credentials, click on view Client secret and record it.
    • +
    • In Realm settings/General, record the Realm ID.
    • +
    +
  4. +
  5. Create Users: create necessary Users.
  6. +
  7. (Optional) Create and Assign Roles: under the Clients/Client details/Roles, create necessary Client roles. After that assign roles to users.
  8. +
+

Configuration in Keycloak Config CLI

+

For setting up Keycloak, which is included in the AI DIAL Helm chart, you can use Keycloak Config CLI. We suggest using the following configuration, which can be passed to keycloak.keycloakConfigCli.configuration."realm\.yaml" in the DIAL Helm chart.

+
+

[!IMPORTANT] +Replace <fields> before applying this configuration.

+
+
realm: "dial"
displayName: "dial"
enabled: true
accessTokenLifespan: 86400
ssoSessionIdleTimeout: 86400
ssoSessionMaxLifespan: 86400
roles:
client:
dial-chat:
- name: admin
description: "AI DIAL chat admin role"
composite: false
clientRole: true
groups:
- name: DIAL
subGroups:
- name: "admin"
clientRoles:
dial-chat: ["admin"]
clientScopes:
- name: dial
description: "dial scope"
protocol: openid-connect
attributes:
include.in.token.scope: "true"
display.on.consent.screen: "true"
consent.screen.text: ""
protocolMappers:
- name: "Audience for Dial"
protocol: openid-connect
protocolMapper: oidc-audience-mapper
consentRequired: false
config:
included.client.audience: dial-chat
id.token.claim: false
access.token.claim: true
clients:
- clientId: dial-chat
name: dial-chat
description: AI DIAL chat client
rootUrl: https://<chat_url>
adminUrl: https://<chat_url>
baseUrl: https://<chat_url>
surrogateAuthRequired: false
enabled: true
clientAuthenticatorType: client-secret
secret: <keycloak_client_secret>
redirectUris:
- https://<chat_url>/*
webOrigins:
- https://<chat_url>
notBefore: 0
bearerOnly: false
consentRequired: false
standardFlowEnabled: true
implicitFlowEnabled: false
directAccessGrantsEnabled: true
serviceAccountsEnabled: false
publicClient: false
frontchannelLogout: true
protocol: openid-connect
attributes:
oidc.ciba.grant.enabled: "false"
client.secret.creation.time: "1691398764"
backchannel.logout.session.required: "true"
display.on.consent.screen: "false"
oauth2.device.authorization.grant.enabled: "false"
backchannel.logout.revoke.offline.tokens: "false"
authenticationFlowBindingOverrides: {}
fullScopeAllowed: true
nodeReRegistrationTimeout: -1
defaultClientScopes:
- web-origins
- acr
- profile
- roles
- email
- dial
optionalClientScopes:
- address
- phone
- offline_access
- microprofile-jwt
+

Configure AI DIAL

+

By configuring both AI DIAL Chat and AI DIAL Core with the necessary environment variables, you will enable them to work together seamlessly with Identity Provider for authentication and authorization purposes.

+

To configure AI DIAL Chat and AI DIAL Core to work with Keycloak, follow these steps:

+

AI DIAL Chat Settings

+

Add the following environment variables to AI DIAL Chat configuration. Refer to AI DIAL Chat to learn more.

+
AUTH_KEYCLOAK_HOST: "https://<keycloak_host>/realms/<keycloak_realm_id>"
AUTH_KEYCLOAK_CLIENT_ID: "<keycloak_client_id>"
AUTH_KEYCLOAK_SECRET: "<keycloak_client_secret>"
+
+

[!TIP] +AUTH_KEYCLOAK_HOST example: https://keycloak.example.com/realms/dial

+
+

AI DIAL Core Settings

+

Add the following parameters to AI DIAL Core static settings. Refer to AI DIAL Core for more details.

+
aidial.identityProviders.keycloak.jwksUrl: "<keycloak_jwks_uri>"
aidial.identityProviders.keycloak.rolePath: "<keycloak_role_path>"
aidial.identityProviders.keycloak.issuerPattern: <issuerPattern>
aidial.identityProviders.keycloak.loggingKey: "sub"
aidial.identityProviders.keycloak.loggingSalt: "loggingSalt" # strong generated string
+
+

[!TIP]

+
    +
  • keycloak_jwks_uri example: https://<keycloak_host>/realms/<keycloak_realm_id>/protocol/openid-connect/certs
  • +
  • keycloak_role_path example: resource_access.dial-chat.roles
  • +
  • issuerPattern example: '^https:\/\/keycloak\.example\.com.+$'
  • +
+
+

Assignment of Roles

+

Once all the above steps are completed, including the ones marked as Optional, you can assign roles to Models, Applications, Addons, and Assistants.

+

In AI DIAL Core:

+
    +
  • Static settings: as value for aidial.identityProviders.keycloak.rolePath provide a role path from Keycloak.
  • +
  • Dynamic settings: for userRoles provide a specific role name(s).
  • +
+

In this example, "keycloak-role-name" role from the <keycloak_role_path> is configured for chat-gpt-35-turbo model:

+
# Dynamic settings of AI DIAL Core
"models": {
"chat-gpt-35-turbo": {
"type": "chat",
"endpoint" : "http://localhost:7001/v1/openai/deployments/gpt-35-turbo/chat/completions",
"upstreams": [
{"endpoint": "http://localhost:7001", "key": "modelKey1"}
],
"userRoles": ["keycloak-role-name"]
}
}
+ + \ No newline at end of file diff --git a/Deployment/idp-configuration/okta/index.html b/Deployment/idp-configuration/okta/index.html new file mode 100644 index 00000000..682feaea --- /dev/null +++ b/Deployment/idp-configuration/okta/index.html @@ -0,0 +1,95 @@ + + + + + +okta | DIAL Knowledge Base + + + + + + + + + + + + + + +

How to Set Okta as Identity Provider

+ +

Introduction

+

This basic tutorial demonstrates how to configure an application in Okta and integrate it with AI DIAL for identity and access management.

+

In AI DIAL, you can assign roles to Models, Applications, Addons, and Assistants to restrict the number of tokens that can be transmitted in a specific time frame. These roles and their limitations can be created in external systems and then assigned in AI DIAL's configuration.

+

Configuration Guidelines

+

Configure Okta

+
+

[!TIP] +Replace <chat_url> with the actual address of your AI DIAL Chat application.

+
+

Follow these steps to configure Okta:

+
    +
  1. Create an Application: begin by creating an Application. You can refer to the official Okta documentation for detailed instructions on how to create an OIDC app integration.
  2. +
  3. Configure Application Settings: under the Applications/Applications section, set the following parameters: +
      +
    • Sign-in redirect URIs: https://<chat_url>/api/auth/callback/okta
    • +
    • Sign-out redirect URIs: https://<chat_url>
    • +
    • Obtain and save Client ID and Client secrets generated for your application.
    • +
    +
  4. +
  5. Enable API Scopes: under the Applications/Okta API Scopes section, enable the following scopes: +
      +
    • okta.users.read
    • +
    • okta.users.read.self
    • +
    +
  6. +
  7. Obtain Issuer URI and JWKS URI: under Security/API section, locate the Issuer URI. You can find the jwks_uri within the Issuer URI. This URI will be used in AI DIAL Core configuration.
  8. +
  9. Create Users: once the application integration is set up, create the necessary users. Refer to People to learn how to do this.
  10. +
  11. (Optional) Create Groups: create the necessary Groups in Okta.
  12. +
  13. (Optional) Assign People: assign users (People) to the relevant Groups.
  14. +
  15. (Optional) Assign Application to Group: refer to Assign the Application to group to learn how to do this.
  16. +
  17. (Optional) Configure ID Token: under the Applications/Sign On/OpenID Connect ID Token section, set Groups claim type to Filter and Groups claim filter to groups; Matches regex: .*. For more information, refer to the Okta documentation.
  18. +
+

Configure AI DIAL

+

To enable AI DIAL Chat and AI DIAL Core to work with Okta, configure them with the necessary Okta-specific parameters.

+

AI DIAL Chat Settings

+

Add the following environment variables to AI DIAL Chat configuration. Refer to AI DIAL Chat for more details.

+
AUTH_OKTA_CLIENT_ID: "<okta_client_id>"
AUTH_OKTA_CLIENT_SECRET: "<okta_client_secret>"
AUTH_OKTA_ISSUER: "<okta_issuer>"
+
+

[!TIP] +okta_issuer example: https://${yourOktaDomain}/oauth2/${authorizationServerId}

+
+

AI DIAL Core Settings

+

Add the following parameters to AI DIAL Core static settings. Refer to AI DIAL Core for more details.

+
aidial.identityProviders.okta.jwksUrl: "<okta_jwks_uri>"
aidial.identityProviders.okta.rolePath: "Groups"
aidial.identityProviders.okta.issuerPattern: '^https:\/\/${yourOktaAccount}\.okta\.com.*$'
aidial.identityProviders.okta.loggingKey: "sub"
aidial.identityProviders.okta.loggingSalt: "loggingSalt"
+
+

[!TIP] +okta_jwks_uri example: https://${yourOktaDomain}/oauth2/${authorizationServerId}/v1/keys

+
+

Assignment of Roles

+

Once all the above steps are completed, including the ones marked as Optional, you can assign roles to Models, Applications, Addons, and Assistants.

+

In AI DIAL Core:

+
    +
  • Static settings: as value for aidial.identityProviders.okta.rolePath provide a claim from Okta.
  • +
  • Dynamic settings: for userRoles provide a specific claim value.
  • +
+

In this example, okta-group-name claim value from the Groups Okta claim is configured for chat-gpt-35-turbo model:

+
# Dynamic settings of AI DIAL Core
"models": {
"chat-gpt-35-turbo": {
"type": "chat",
"endpoint" : "http://localhost:7001/v1/openai/deployments/gpt-35-turbo/chat/completions",
"upstreams": [
{"endpoint": "http://localhost:7001", "key": "modelKey1"}
],
"userRoles": ["okta-group-name"]
}
}
+ + \ No newline at end of file diff --git a/architecture/index.html b/architecture/index.html index 2d4982ec..001effa7 100644 --- a/architecture/index.html +++ b/architecture/index.html @@ -14,8 +14,8 @@ - - + +

Architecture

diff --git a/assets/js/07d3d972.097669a4.js b/assets/js/07d3d972.097669a4.js new file mode 100644 index 00000000..f67fc172 --- /dev/null +++ b/assets/js/07d3d972.097669a4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdial=self.webpackChunkdial||[]).push([[372],{1904:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>c});var t=i(5893),o=i(1151);const l={},s="How to Set Keycloak as Identity Provider",r={id:"Deployment/idp-configuration/keycloak",title:"keycloak",description:"- Introduction",source:"@site/docs/Deployment/idp-configuration/keycloak.md",sourceDirName:"Deployment/idp-configuration",slug:"/Deployment/idp-configuration/keycloak",permalink:"/Deployment/idp-configuration/keycloak",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"CustomSideBar",previous:{title:"google",permalink:"/Deployment/idp-configuration/google"},next:{title:"okta",permalink:"/Deployment/idp-configuration/okta"}},a={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Configuration Guidelines",id:"configuration-guidelines",level:2},{value:"Configure Keycloak",id:"configure-keycloak",level:3},{value:"Configuration in Keycloak Admin Console",id:"configuration-in-keycloak-admin-console",level:4},{value:"Configuration in Keycloak Config CLI",id:"configuration-in-keycloak-config-cli",level:4},{value:"Configure AI DIAL",id:"configure-ai-dial",level:3},{value:"AI DIAL Chat Settings",id:"ai-dial-chat-settings",level:4},{value:"AI DIAL Core Settings",id:"ai-dial-core-settings",level:4},{value:"Assignment of Roles",id:"assignment-of-roles",level:4}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"how-to-set-keycloak-as-identity-provider",children:"How to Set Keycloak as Identity Provider"}),"\n",(0,t.jsxs)("div",{class:"docusaurus-ignore",children:[(0,t.jsx)(n.h1,{id:"table-of-contents",children:"Table of Contents"}),(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#introduction",children:"Introduction"})}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"#configuration-guidelines",children:"Configuration Guidelines"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"#configure-keycloak",children:"Configure Keycloak"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#configuration-in-keycloak-admin-console",children:"Configuration in Keycloak Admin Console"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#configuration-in-keycloak-config-cli",children:"Configuration in Keycloak Config CLI"})}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"#configure-ai-dial",children:"Configure AI DIAL"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#ai-dial-chat-settings",children:"AI DIAL Chat Settings"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#ai-dial-core-settings",children:"AI DIAL Core Settings"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#assignment-of-roles",children:"Assignment of Roles"})}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]})]}),"\n",(0,t.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,t.jsxs)(n.p,{children:["This basic tutorial demonstrates the steps to create a REALM in ",(0,t.jsx)(n.a,{href:"https://www.keycloak.org",children:"Keycloak"})," and use it as an identity and access management solution for AI DIAL users."]}),"\n",(0,t.jsx)(n.p,{children:"In AI DIAL, you can assign roles to Models, Applications, Addons, and Assistants to restrict the number of tokens that can be transmitted in a specific time frame. These roles and their limitations can be created in external systems and then assigned in AI DIAL's configuration."}),"\n",(0,t.jsx)(n.h2,{id:"configuration-guidelines",children:"Configuration Guidelines"}),"\n",(0,t.jsx)(n.h3,{id:"configure-keycloak",children:"Configure Keycloak"}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["[!TIP]\nReplace ",(0,t.jsx)(n.code,{children:""})," with the actual address of your AI DIAL Chat application."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"There are two ways to configure Keycloak: via Admin Console or using a CLI tool."}),"\n",(0,t.jsx)(n.h4,{id:"configuration-in-keycloak-admin-console",children:"Configuration in Keycloak Admin Console"}),"\n",(0,t.jsx)(n.p,{children:"Follow these steps to configure Keycloak in Admin Console:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Create a Client:"})," ",(0,t.jsx)(n.a,{href:"https://www.keycloak.org/docs/latest/server_admin/#proc-creating-oidc-client_server_administration_guide",children:"Create an OpenID Connect client"})," in Keycloak with the following settings:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Client type: OpenID Connect"}),"\n",(0,t.jsxs)(n.li,{children:["Client ID: ",(0,t.jsx)(n.code,{children:"dial-chat"})]}),"\n",(0,t.jsx)(n.li,{children:"Client authentication: On"}),"\n",(0,t.jsxs)(n.li,{children:["Root URL: ",(0,t.jsx)(n.code,{children:""})]}),"\n",(0,t.jsxs)(n.li,{children:["Valid redirect URIs: ",(0,t.jsx)(n.code,{children:"/*"})]}),"\n",(0,t.jsxs)(n.li,{children:["Home URL: ",(0,t.jsx)(n.code,{children:""})]}),"\n",(0,t.jsxs)(n.li,{children:["Web origins: ",(0,t.jsx)(n.code,{children:""})]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Collect configuration parameters:"})," in this step, you will collect parameters that will be required for ",(0,t.jsx)(n.a,{href:"#ai-dial-chat-settings",children:"AI DIAL configuration"}),".","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["In ",(0,t.jsx)(n.strong,{children:"Clients/Client details/Settings"}),", record the ",(0,t.jsx)(n.strong,{children:"Client ID"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["In ",(0,t.jsx)(n.strong,{children:"Clients/Client details/Credentials"}),", click on view ",(0,t.jsx)(n.strong,{children:"Client secret"})," and record it."]}),"\n",(0,t.jsxs)(n.li,{children:["In ",(0,t.jsx)(n.strong,{children:"Realm settings/General"}),", record the ",(0,t.jsx)(n.strong,{children:"Realm ID"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Create Users:"})," create necessary ",(0,t.jsx)(n.a,{href:"https://www.keycloak.org/docs/latest/server_admin/#proc-creating-user_server_administration_guide",children:"Users"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["(Optional) ",(0,t.jsx)(n.strong,{children:"Create and Assign Roles:"})," under the ",(0,t.jsx)(n.strong,{children:"Clients/Client details/Roles"}),", create necessary ",(0,t.jsx)(n.a,{href:"https://www.keycloak.org/docs/latest/server_admin/#con-client-roles_server_administration_guide",children:"Client roles"}),". After that ",(0,t.jsx)(n.a,{href:"https://www.keycloak.org/docs/latest/server_admin/#proc-assigning-role-mappings_server_administration_guide",children:"assign roles to users"}),"."]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"configuration-in-keycloak-config-cli",children:"Configuration in Keycloak Config CLI"}),"\n",(0,t.jsxs)(n.p,{children:["For setting up Keycloak, which is included in the AI DIAL Helm chart, you can use ",(0,t.jsx)(n.a,{href:"https://github.com/bitnami/containers/tree/main/bitnami/keycloak-config-cli#configuration",children:"Keycloak Config CLI"}),". We suggest using the following configuration, which can be passed to ",(0,t.jsx)(n.code,{children:'keycloak.keycloakConfigCli.configuration."realm\\.yaml"'})," in the DIAL ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial-helm/blob/56b41d6f3c2148b42bdd12c1dcecc9711e23fd6d/charts/dial/values.yaml#L29",children:"Helm chart"}),"."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["[!IMPORTANT]\nReplace ",(0,t.jsx)(n.code,{children:""})," before applying this configuration."]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'realm: "dial"\ndisplayName: "dial"\nenabled: true\naccessTokenLifespan: 86400\nssoSessionIdleTimeout: 86400\nssoSessionMaxLifespan: 86400\nroles:\n client:\n dial-chat:\n - name: admin\n description: "AI DIAL chat admin role"\n composite: false\n clientRole: true\ngroups:\n - name: DIAL\n subGroups:\n - name: "admin"\n clientRoles:\n dial-chat: ["admin"]\nclientScopes:\n - name: dial\n description: "dial scope"\n protocol: openid-connect\n attributes:\n include.in.token.scope: "true"\n display.on.consent.screen: "true"\n consent.screen.text: ""\n protocolMappers:\n - name: "Audience for Dial"\n protocol: openid-connect\n protocolMapper: oidc-audience-mapper\n consentRequired: false\n config:\n included.client.audience: dial-chat\n id.token.claim: false\n access.token.claim: true\nclients:\n - clientId: dial-chat\n name: dial-chat\n description: AI DIAL chat client\n rootUrl: https://\n adminUrl: https://\n baseUrl: https://\n surrogateAuthRequired: false\n enabled: true\n clientAuthenticatorType: client-secret\n secret: \n redirectUris:\n - https:///*\n webOrigins:\n - https://\n notBefore: 0\n bearerOnly: false\n consentRequired: false\n standardFlowEnabled: true\n implicitFlowEnabled: false\n directAccessGrantsEnabled: true\n serviceAccountsEnabled: false\n publicClient: false\n frontchannelLogout: true\n protocol: openid-connect\n attributes:\n oidc.ciba.grant.enabled: "false"\n client.secret.creation.time: "1691398764"\n backchannel.logout.session.required: "true"\n display.on.consent.screen: "false"\n oauth2.device.authorization.grant.enabled: "false"\n backchannel.logout.revoke.offline.tokens: "false"\n authenticationFlowBindingOverrides: {}\n fullScopeAllowed: true\n nodeReRegistrationTimeout: -1\n defaultClientScopes:\n - web-origins\n - acr\n - profile\n - roles\n - email\n - dial\n optionalClientScopes:\n - address\n - phone\n - offline_access\n - microprofile-jwt\n'})}),"\n",(0,t.jsx)(n.h3,{id:"configure-ai-dial",children:"Configure AI DIAL"}),"\n",(0,t.jsx)(n.p,{children:"By configuring both AI DIAL Chat and AI DIAL Core with the necessary environment variables, you will enable them to work together seamlessly with Identity Provider for authentication and authorization purposes."}),"\n",(0,t.jsx)(n.p,{children:"To configure AI DIAL Chat and AI DIAL Core to work with Keycloak, follow these steps:"}),"\n",(0,t.jsx)(n.h4,{id:"ai-dial-chat-settings",children:"AI DIAL Chat Settings"}),"\n",(0,t.jsxs)(n.p,{children:["Add the following environment variables to AI DIAL Chat configuration. Refer to ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial-chat/blob/development/apps/chat/README.md#environment-variables",children:"AI DIAL Chat"})," to learn more."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'AUTH_KEYCLOAK_HOST: "https:///realms/"\nAUTH_KEYCLOAK_CLIENT_ID: ""\nAUTH_KEYCLOAK_SECRET: ""\n'})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["[!TIP]\n",(0,t.jsx)(n.code,{children:"AUTH_KEYCLOAK_HOST"})," example: ",(0,t.jsx)(n.code,{children:"https://keycloak.example.com/realms/dial"})]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"ai-dial-core-settings",children:"AI DIAL Core Settings"}),"\n",(0,t.jsxs)(n.p,{children:["Add the following parameters to AI DIAL Core ",(0,t.jsx)(n.strong,{children:"static"})," settings. Refer to ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core?tab=readme-ov-file#static-settings",children:"AI DIAL Core"})," for more details."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'aidial.identityProviders.keycloak.jwksUrl: ""\naidial.identityProviders.keycloak.rolePath: ""\naidial.identityProviders.keycloak.issuerPattern: \naidial.identityProviders.keycloak.loggingKey: "sub" \naidial.identityProviders.keycloak.loggingSalt: "loggingSalt" # strong generated string\n'})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"[!TIP]"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"keycloak_jwks_uri"})," example: ",(0,t.jsx)(n.code,{children:"https:///realms//protocol/openid-connect/certs"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"keycloak_role_path"})," example: ",(0,t.jsx)(n.code,{children:"resource_access.dial-chat.roles"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"issuerPattern"})," example: ",(0,t.jsx)(n.code,{children:"'^https:\\/\\/keycloak\\.example\\.com.+$'"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"assignment-of-roles",children:"Assignment of Roles"}),"\n",(0,t.jsxs)(n.p,{children:["Once all the above steps are completed, including the ones marked as ",(0,t.jsx)(n.strong,{children:"Optional"}),", you can assign roles to Models, Applications, Addons, and Assistants."]}),"\n",(0,t.jsx)(n.p,{children:"In AI DIAL Core:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core?tab=readme-ov-file#static-settings",children:"Static settings"}),": as value for ",(0,t.jsx)(n.code,{children:"aidial.identityProviders.keycloak.rolePath"})," provide a role path from Keycloak."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core?tab=readme-ov-file#dynamic-settings",children:"Dynamic settings"}),": for ",(0,t.jsx)(n.code,{children:"userRoles"})," provide a specific role name(s)."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["In this example, ",(0,t.jsx)(n.code,{children:'"keycloak-role-name"'})," role from the ",(0,t.jsx)(n.code,{children:""})," is configured for ",(0,t.jsx)(n.code,{children:"chat-gpt-35-turbo"})," model:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'# Dynamic settings of AI DIAL Core\n"models": {\n "chat-gpt-35-turbo": {\n "type": "chat",\n "endpoint" : "http://localhost:7001/v1/openai/deployments/gpt-35-turbo/chat/completions",\n "upstreams": [\n {"endpoint": "http://localhost:7001", "key": "modelKey1"}\n ],\n "userRoles": ["keycloak-role-name"]\n }\n}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>r,a:()=>s});var t=i(7294);const o={},l=t.createContext(o);function s(e){const n=t.useContext(l);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),t.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0a0492db.79238c76.js b/assets/js/0a0492db.79238c76.js deleted file mode 100644 index a70e9a25..00000000 --- a/assets/js/0a0492db.79238c76.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdial=self.webpackChunkdial||[]).push([[310],{5358:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>r,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>d,toc:()=>l});var t=o(5893),i=o(1151);const s={},a="Launch AI DIAL Chat with a Sample Addon",d={id:"tutorials/quick-start-with-addon",title:"Launch AI DIAL Chat with a Sample Addon",description:"Introduction",source:"@site/docs/tutorials/quick-start-with-addon.md",sourceDirName:"tutorials",slug:"/tutorials/quick-start-with-addon",permalink:"/tutorials/quick-start-with-addon",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"CustomSideBar",previous:{title:"Launch AI DIAL Chat with Azure Model",permalink:"/tutorials/quick-start-model"},next:{title:"Roles Management Guide",permalink:"/tutorials/roles-management"}},r={},l=[{value:"Introduction",id:"introduction",level:2},{value:"About AI DIAL Addons",id:"about-ai-dial-addons",level:2},{value:"About AI DIAL Assistants",id:"about-ai-dial-assistants",level:2},{value:"About To-Do List Addon",id:"about-to-do-list-addon",level:2},{value:"Prerequisites",id:"prerequisites",level:2},{value:"Step 1: Get AI DIAL",id:"step-1-get-ai-dial",level:2},{value:"Step 2: Configuration",id:"step-2-configuration",level:2},{value:"Configure Model",id:"configure-model",level:3},{value:"Configure Addon",id:"configure-addon",level:3},{value:"Configure Assistant",id:"configure-assistant",level:3},{value:"Step 3: Launch AI DIAL Chat",id:"step-3-launch-ai-dial-chat",level:2}];function c(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"launch-ai-dial-chat-with-a-sample-addon",children:"Launch AI DIAL Chat with a Sample Addon"}),"\n",(0,t.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,t.jsxs)(n.p,{children:["In this tutorial, you will learn how to launch AI DIAL Chat with a To-Do List Addon and an OpenAI model. As a result, you will be able to access Chat on ",(0,t.jsx)(n.a,{href:"http://localhost:3000/",children:"http://localhost:3000/"})," and use a To-Do List Addon to create a to-do list."]}),"\n",(0,t.jsx)(n.h2,{id:"about-ai-dial-addons",children:"About AI DIAL Addons"}),"\n",(0,t.jsxs)(n.p,{children:["Within the AI DIAL framework, an ",(0,t.jsx)(n.strong,{children:"Addon"})," is a service - or any component adhering to its own or provided OpenAPI specification - that empowers LLMs to access and utilize any desired data source or technology to produce their responses."]}),"\n",(0,t.jsx)(n.p,{children:"For example, one might want LLM to access specific data or technology to use for generating its answers. It can be a corporate database, collection of PDF documents, calculation engines, or any other data source or technology."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Refer to ",(0,t.jsx)(n.a,{href:"https://epam-rail.com/extension-framework",children:"AI DIAL website"})," to view typical examples of addons."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"about-ai-dial-assistants",children:"About AI DIAL Assistants"}),"\n",(0,t.jsxs)(n.p,{children:["An Addon can be used in conjunction with a System Prompt to attain a particular behavior for the LLM, allowing for more flexibility and customization in the LLM's responses. Within the AI DIAL framework, we refer to such combinations of Addons and System Prompts as ",(0,t.jsx)(n.strong,{children:"Assistants"}),".\nAssistants provide enhanced control over the behavior of LLMs, leading to more tailored and accurate responses that meet specific requirements."]}),"\n",(0,t.jsx)(n.p,{children:"Flexibility offered by this combination allows developers to create custom Assistants within the AI DIAL framework. These Assistants can range from simple implementations, like instructing the LLM to provide answers using a specific tone or style (e.g., like a pirate), to more complex use cases, such as limiting the LLM's data scope to a particular geographical location (e.g., providing weather forecasts for Chicago only). Overall, combining Addons and System Prompts allows for better customization and adaptability to diverse situations, resulting in more versatile AI responses."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Refer to ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial-assistant",children:"AI DIAL Assistant"})," repository for more information."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"about-to-do-list-addon",children:"About To-Do List Addon"}),"\n",(0,t.jsxs)(n.p,{children:["In this tutorial, for example purposes, we will show how to quickly launch AI DIAL Chat with the ",(0,t.jsx)(n.a,{href:"https://github.com/openai/plugins-quickstart/",children:"To-Do List Addon"})," by OpenAI. With this addon, one can generate a list of tasks, append new entries, and fetch information about the entries saved in the list."]}),"\n",(0,t.jsx)(n.p,{children:"Following this pattern, you can develop your own addons or use a third-party ones. The only requirement is that it should be compatible with the OpenAPI specification."}),"\n",(0,t.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Docker engine installed on your machine (Docker Compose Version 2.20.0 +)."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Refer to ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/desktop/",children:"Docker"})," documentation."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Account in MS Azure OpenAI Studio."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Refer to ",(0,t.jsx)(n.a,{href:"/Deployment/OpenAI%20Model%20Deployment",children:"Create and Deploy OpenAI Model in Azure"})," to learn how to create and deploy an OpenAI model in MS Azure."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Addon. In this example, it is ",(0,t.jsx)(n.a,{href:"https://github.com/openai/plugins-quickstart/",children:"To-Do List"})," by OpenAI."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"step-1-get-ai-dial",children:"Step 1: Get AI DIAL"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial/tree/main/dial-docker-compose/addon/",children:"Download"})," AI DIAL."]}),"\n",(0,t.jsx)(n.h2,{id:"step-2-configuration",children:"Step 2: Configuration"}),"\n",(0,t.jsxs)(n.p,{children:["In ",(0,t.jsx)(n.strong,{children:"docker-compose.yaml"}),", you can find sections for ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial/tree/main/dial-docker-compose/addon/docker-compose.yml#L8",children:"OpenAI Adapter"})," to work with an Azure model, ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial/tree/main/dial-docker-compose/addon/docker-compose.yml#L13",children:"AI DIAL Assistant"}),", ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial/tree/main/dial-docker-compose/addon/docker-compose.yml#L19",children:"Addon"}),", and ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial/tree/main/dial-docker-compose/common.yml#L19",children:"AI DIAL Core"}),"."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Refer to ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial-adapter-openai",children:"AI DIAL Adapter for OpenAI"})," to learn more."]}),"\n",(0,t.jsxs)(n.li,{children:["Refer to the ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core",children:"AI DIAL Core"})," to view a complete documentation."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["In the ",(0,t.jsx)(n.strong,{children:"/addon"})," folder, you can find a ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial/tree/main/dial-docker-compose/addon/addon/Dockerfile",children:"Dockerfile"})," we need to get and launch the To-Do List Addon."]}),"\n",(0,t.jsxs)(n.p,{children:["In the ",(0,t.jsx)(n.strong,{children:"/core"})," folder, you can find a ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial/tree/main/dial-docker-compose/addon/core/config.json",children:"config.json"})," configuration file. In this file, you can configure your model, assistant and addon."]}),"\n",(0,t.jsx)(n.h3,{id:"configure-model",children:"Configure Model"}),"\n",(0,t.jsxs)(n.p,{children:["Add you model credentials in the ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial/tree/main/dial-docker-compose/addon/core/config.json#L36",children:"config.json"})," file in ",(0,t.jsx)(n.code,{children:"upstreams"}),"."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Supply your ",(0,t.jsx)(n.strong,{children:"Azure API Keys"})," for your deployments for the ",(0,t.jsx)(n.code,{children:"key"})," parameter."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Replace ",(0,t.jsx)(n.code,{children:"http://azure_deployment_host"})," with your GPT ",(0,t.jsx)(n.strong,{children:"endpoint"})," for the ",(0,t.jsx)(n.code,{children:"endpoint"})," parameter. ",(0,t.jsx)(n.strong,{children:"Note"}),": in the endpoint, replace ",(0,t.jsx)(n.code,{children:"gpt-4"})," with your Azure deployment name, in case it is different."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:' "upstreams": [\n {\n "endpoint": "http://azure_deployment_host/openai/deployments/gpt-4/chat/completions",\n "key": "AZURE_MODEL_API_KEY"\n }\n]\n'})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Refer to ",(0,t.jsx)(n.a,{href:"/Deployment/OpenAI%20Model%20Deployment",children:"Create and Deploy OpenAI Model in Azure"})," to learn how to create and deploy an OpenAI model in MS Azure."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"configure-addon",children:"Configure Addon"}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["In this example, we get information about the name, description etc. from the ",(0,t.jsx)(n.a,{href:"https://github.com/openai/plugins-quickstart/blob/main/.well-known/ai-plugin.json",children:"addon repository"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Provide configuration for your addon in the ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial/tree/main/dial-docker-compose/addon/core/config.json#L4",children:"config file"})," in the ",(0,t.jsx)(n.code,{children:"addons"})," section:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:' "addons": {\n "addon-todo": {\n "endpoint": "http://addon:5003/.well-known/ai-plugin.json",\n "displayName": "TODO List",\n "description": "Addon that allows to manage user\'s TODO list."\n }\n }\n'})}),"\n",(0,t.jsx)(n.h3,{id:"configure-assistant",children:"Configure Assistant"}),"\n",(0,t.jsxs)(n.p,{children:["Provide the endpoint for AI DIAL Assistant in the ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial/tree/main/dial-docker-compose/addon/core/config.json#L10",children:"config file"})," in the ",(0,t.jsx)(n.code,{children:"assistant"})," section and configure the ",(0,t.jsx)(n.code,{children:"todo-assistant"})," with the ",(0,t.jsx)(n.code,{children:"addon-todo"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:' "assistant": {\n "endpoint": "http://assistant:5000/openai/deployments/assistant/chat/completions",\n "assistants": {\n "todo-assistant": {\n "prompt": "You are assistant that helps to manage TODO list for the user. You can add, remove and view your TODOs.",\n "addons": [\n "addon-todo"\n ],\n "displayName": "TODO Assistant",\n "description": "The assistant that manages your TODO list. It can add, remove and view your TODOs."\n }\n }\n }\n'})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Refer to ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial-assistant",children:"AI DIAL Assistant"})," repository for more information about AI DIAL Assistant."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Finally, configure roles for the addon and the TODO assistant in the ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial/tree/main/dial-docker-compose/addon/core/config.json#L55",children:"config file"})," in the ",(0,t.jsx)(n.code,{children:"roles"})," section:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'"roles": {\n "default": {\n "limits": {\n "addon-todo": {},\n "todo-assistant": {}\n }\n }\n}\n'})}),"\n",(0,t.jsx)(n.h2,{id:"step-3-launch-ai-dial-chat",children:"Step 3: Launch AI DIAL Chat"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Run the ",(0,t.jsx)(n.code,{children:"docker compose up"})," command from the folder with the ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial/blob/main/dial-docker-compose/addon/docker-compose.yml",children:"docker-compose file"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Open ",(0,t.jsx)(n.a,{href:"http://localhost:3000/",children:"http://localhost:3000/"})," in your browser to launch the AI DIAL Chat application."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["The AI DIAL Chat is launched with the Azure model we have configured, and the Addon is enabled with the display name you configured for the ",(0,t.jsx)(n.code,{children:"addons.displayName"})," parameter in ",(0,t.jsx)(n.code,{children:"config.json"}),"."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{src:o(8433).Z+"",width:"1637",height:"749"})}),"\n",(0,t.jsx)(n.p,{children:'Select the Addon and start a new conversation. For example, send "Add homework to the to do list" and then "Get the to do list".'})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8433:(e,n,o)=>{o.d(n,{Z:()=>t});const t=o.p+"assets/images/addon-9d78643d20a398536ee2b6ba1fc18188.png"},1151:(e,n,o)=>{o.d(n,{Z:()=>d,a:()=>a});var t=o(7294);const i={},s=t.createContext(i);function a(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0a0492db.7c6cf063.js b/assets/js/0a0492db.7c6cf063.js new file mode 100644 index 00000000..385a2235 --- /dev/null +++ b/assets/js/0a0492db.7c6cf063.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdial=self.webpackChunkdial||[]).push([[310],{5358:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>r,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>d,toc:()=>l});var t=o(5893),i=o(1151);const s={},a="Launch AI DIAL Chat with a Sample Addon",d={id:"tutorials/quick-start-with-addon",title:"Launch AI DIAL Chat with a Sample Addon",description:"Introduction",source:"@site/docs/tutorials/quick-start-with-addon.md",sourceDirName:"tutorials",slug:"/tutorials/quick-start-with-addon",permalink:"/tutorials/quick-start-with-addon",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"CustomSideBar",previous:{title:"Launch AI DIAL Chat with Azure Model",permalink:"/tutorials/quick-start-model"},next:{title:"Chat User Guide",permalink:"/user-guide"}},r={},l=[{value:"Introduction",id:"introduction",level:2},{value:"About AI DIAL Addons",id:"about-ai-dial-addons",level:2},{value:"About AI DIAL Assistants",id:"about-ai-dial-assistants",level:2},{value:"About To-Do List Addon",id:"about-to-do-list-addon",level:2},{value:"Prerequisites",id:"prerequisites",level:2},{value:"Step 1: Get AI DIAL",id:"step-1-get-ai-dial",level:2},{value:"Step 2: Configuration",id:"step-2-configuration",level:2},{value:"Configure Model",id:"configure-model",level:3},{value:"Configure Addon",id:"configure-addon",level:3},{value:"Configure Assistant",id:"configure-assistant",level:3},{value:"Step 3: Launch AI DIAL Chat",id:"step-3-launch-ai-dial-chat",level:2}];function c(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"launch-ai-dial-chat-with-a-sample-addon",children:"Launch AI DIAL Chat with a Sample Addon"}),"\n",(0,t.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,t.jsxs)(n.p,{children:["In this tutorial, you will learn how to launch AI DIAL Chat with a To-Do List Addon and an OpenAI model. As a result, you will be able to access Chat on ",(0,t.jsx)(n.a,{href:"http://localhost:3000/",children:"http://localhost:3000/"})," and use a To-Do List Addon to create a to-do list."]}),"\n",(0,t.jsx)(n.h2,{id:"about-ai-dial-addons",children:"About AI DIAL Addons"}),"\n",(0,t.jsxs)(n.p,{children:["Within the AI DIAL framework, an ",(0,t.jsx)(n.strong,{children:"Addon"})," is a service - or any component adhering to its own or provided OpenAPI specification - that empowers LLMs to access and utilize any desired data source or technology to produce their responses."]}),"\n",(0,t.jsx)(n.p,{children:"For example, one might want LLM to access specific data or technology to use for generating its answers. It can be a corporate database, collection of PDF documents, calculation engines, or any other data source or technology."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Refer to ",(0,t.jsx)(n.a,{href:"https://epam-rail.com/extension-framework",children:"AI DIAL website"})," to view typical examples of addons."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"about-ai-dial-assistants",children:"About AI DIAL Assistants"}),"\n",(0,t.jsxs)(n.p,{children:["An Addon can be used in conjunction with a System Prompt to attain a particular behavior for the LLM, allowing for more flexibility and customization in the LLM's responses. Within the AI DIAL framework, we refer to such combinations of Addons and System Prompts as ",(0,t.jsx)(n.strong,{children:"Assistants"}),".\nAssistants provide enhanced control over the behavior of LLMs, leading to more tailored and accurate responses that meet specific requirements."]}),"\n",(0,t.jsx)(n.p,{children:"Flexibility offered by this combination allows developers to create custom Assistants within the AI DIAL framework. These Assistants can range from simple implementations, like instructing the LLM to provide answers using a specific tone or style (e.g., like a pirate), to more complex use cases, such as limiting the LLM's data scope to a particular geographical location (e.g., providing weather forecasts for Chicago only). Overall, combining Addons and System Prompts allows for better customization and adaptability to diverse situations, resulting in more versatile AI responses."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Refer to ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial-assistant",children:"AI DIAL Assistant"})," repository for more information."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"about-to-do-list-addon",children:"About To-Do List Addon"}),"\n",(0,t.jsxs)(n.p,{children:["In this tutorial, for example purposes, we will show how to quickly launch AI DIAL Chat with the ",(0,t.jsx)(n.a,{href:"https://github.com/openai/plugins-quickstart/",children:"To-Do List Addon"})," by OpenAI. With this addon, one can generate a list of tasks, append new entries, and fetch information about the entries saved in the list."]}),"\n",(0,t.jsx)(n.p,{children:"Following this pattern, you can develop your own addons or use a third-party ones. The only requirement is that it should be compatible with the OpenAPI specification."}),"\n",(0,t.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Docker engine installed on your machine (Docker Compose Version 2.20.0 +)."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Refer to ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/desktop/",children:"Docker"})," documentation."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Account in MS Azure OpenAI Studio."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Refer to ",(0,t.jsx)(n.a,{href:"/Deployment/OpenAI%20Model%20Deployment",children:"Create and Deploy OpenAI Model in Azure"})," to learn how to create and deploy an OpenAI model in MS Azure."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Addon. In this example, it is ",(0,t.jsx)(n.a,{href:"https://github.com/openai/plugins-quickstart/",children:"To-Do List"})," by OpenAI."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"step-1-get-ai-dial",children:"Step 1: Get AI DIAL"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial/tree/main/dial-docker-compose/addon/",children:"Download"})," AI DIAL."]}),"\n",(0,t.jsx)(n.h2,{id:"step-2-configuration",children:"Step 2: Configuration"}),"\n",(0,t.jsxs)(n.p,{children:["In ",(0,t.jsx)(n.strong,{children:"docker-compose.yaml"}),", you can find sections for ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial/tree/main/dial-docker-compose/addon/docker-compose.yml#L8",children:"OpenAI Adapter"})," to work with an Azure model, ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial/tree/main/dial-docker-compose/addon/docker-compose.yml#L13",children:"AI DIAL Assistant"}),", ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial/tree/main/dial-docker-compose/addon/docker-compose.yml#L19",children:"Addon"}),", and ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial/tree/main/dial-docker-compose/common.yml#L19",children:"AI DIAL Core"}),"."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Refer to ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial-adapter-openai",children:"AI DIAL Adapter for OpenAI"})," to learn more."]}),"\n",(0,t.jsxs)(n.li,{children:["Refer to the ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core",children:"AI DIAL Core"})," to view a complete documentation."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["In the ",(0,t.jsx)(n.strong,{children:"/addon"})," folder, you can find a ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial/tree/main/dial-docker-compose/addon/addon/Dockerfile",children:"Dockerfile"})," we need to get and launch the To-Do List Addon."]}),"\n",(0,t.jsxs)(n.p,{children:["In the ",(0,t.jsx)(n.strong,{children:"/core"})," folder, you can find a ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial/tree/main/dial-docker-compose/addon/core/config.json",children:"config.json"})," configuration file. In this file, you can configure your model, assistant and addon."]}),"\n",(0,t.jsx)(n.h3,{id:"configure-model",children:"Configure Model"}),"\n",(0,t.jsxs)(n.p,{children:["Add you model credentials in the ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial/tree/main/dial-docker-compose/addon/core/config.json#L36",children:"config.json"})," file in ",(0,t.jsx)(n.code,{children:"upstreams"}),"."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Supply your ",(0,t.jsx)(n.strong,{children:"Azure API Keys"})," for your deployments for the ",(0,t.jsx)(n.code,{children:"key"})," parameter."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Replace ",(0,t.jsx)(n.code,{children:"http://azure_deployment_host"})," with your GPT ",(0,t.jsx)(n.strong,{children:"endpoint"})," for the ",(0,t.jsx)(n.code,{children:"endpoint"})," parameter. ",(0,t.jsx)(n.strong,{children:"Note"}),": in the endpoint, replace ",(0,t.jsx)(n.code,{children:"gpt-4"})," with your Azure deployment name, in case it is different."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:' "upstreams": [\n {\n "endpoint": "http://azure_deployment_host/openai/deployments/gpt-4/chat/completions",\n "key": "AZURE_MODEL_API_KEY"\n }\n]\n'})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Refer to ",(0,t.jsx)(n.a,{href:"/Deployment/OpenAI%20Model%20Deployment",children:"Create and Deploy OpenAI Model in Azure"})," to learn how to create and deploy an OpenAI model in MS Azure."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"configure-addon",children:"Configure Addon"}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["In this example, we get information about the name, description etc. from the ",(0,t.jsx)(n.a,{href:"https://github.com/openai/plugins-quickstart/blob/main/.well-known/ai-plugin.json",children:"addon repository"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Provide configuration for your addon in the ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial/tree/main/dial-docker-compose/addon/core/config.json#L4",children:"config file"})," in the ",(0,t.jsx)(n.code,{children:"addons"})," section:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:' "addons": {\n "addon-todo": {\n "endpoint": "http://addon:5003/.well-known/ai-plugin.json",\n "displayName": "TODO List",\n "description": "Addon that allows to manage user\'s TODO list."\n }\n }\n'})}),"\n",(0,t.jsx)(n.h3,{id:"configure-assistant",children:"Configure Assistant"}),"\n",(0,t.jsxs)(n.p,{children:["Provide the endpoint for AI DIAL Assistant in the ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial/tree/main/dial-docker-compose/addon/core/config.json#L10",children:"config file"})," in the ",(0,t.jsx)(n.code,{children:"assistant"})," section and configure the ",(0,t.jsx)(n.code,{children:"todo-assistant"})," with the ",(0,t.jsx)(n.code,{children:"addon-todo"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:' "assistant": {\n "endpoint": "http://assistant:5000/openai/deployments/assistant/chat/completions",\n "assistants": {\n "todo-assistant": {\n "prompt": "You are assistant that helps to manage TODO list for the user. You can add, remove and view your TODOs.",\n "addons": [\n "addon-todo"\n ],\n "displayName": "TODO Assistant",\n "description": "The assistant that manages your TODO list. It can add, remove and view your TODOs."\n }\n }\n }\n'})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Refer to ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial-assistant",children:"AI DIAL Assistant"})," repository for more information about AI DIAL Assistant."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Finally, configure roles for the addon and the TODO assistant in the ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial/tree/main/dial-docker-compose/addon/core/config.json#L55",children:"config file"})," in the ",(0,t.jsx)(n.code,{children:"roles"})," section:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'"roles": {\n "default": {\n "limits": {\n "addon-todo": {},\n "todo-assistant": {}\n }\n }\n}\n'})}),"\n",(0,t.jsx)(n.h2,{id:"step-3-launch-ai-dial-chat",children:"Step 3: Launch AI DIAL Chat"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Run the ",(0,t.jsx)(n.code,{children:"docker compose up"})," command from the folder with the ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial/blob/main/dial-docker-compose/addon/docker-compose.yml",children:"docker-compose file"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Open ",(0,t.jsx)(n.a,{href:"http://localhost:3000/",children:"http://localhost:3000/"})," in your browser to launch the AI DIAL Chat application."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["The AI DIAL Chat is launched with the Azure model we have configured, and the Addon is enabled with the display name you configured for the ",(0,t.jsx)(n.code,{children:"addons.displayName"})," parameter in ",(0,t.jsx)(n.code,{children:"config.json"}),"."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{src:o(8433).Z+"",width:"1637",height:"749"})}),"\n",(0,t.jsx)(n.p,{children:'Select the Addon and start a new conversation. For example, send "Add homework to the to do list" and then "Get the to do list".'})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8433:(e,n,o)=>{o.d(n,{Z:()=>t});const t=o.p+"assets/images/addon-9d78643d20a398536ee2b6ba1fc18188.png"},1151:(e,n,o)=>{o.d(n,{Z:()=>d,a:()=>a});var t=o(7294);const i={},s=t.createContext(i);function a(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1db65d89.23859b79.js b/assets/js/1db65d89.23859b79.js new file mode 100644 index 00000000..fa3bc4f2 --- /dev/null +++ b/assets/js/1db65d89.23859b79.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdial=self.webpackChunkdial||[]).push([[659],{7925:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>c});var s=t(5893),i=t(1151);const a={},o="Chat User Guide",r={id:"user-guide",title:"Chat User Guide",description:"Interface Components",source:"@site/docs/user-guide.md",sourceDirName:".",slug:"/user-guide",permalink:"/user-guide",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"CustomSideBar",previous:{title:"Launch AI DIAL Chat with a Sample Addon",permalink:"/tutorials/quick-start-with-addon"},next:{title:"configuration",permalink:"/Deployment/configuration"}},l={},c=[{value:"Interface Components",id:"interface-components",level:2},{value:"Conversations",id:"conversations",level:2},{value:"Actions",id:"actions",level:3},{value:"Arrange",id:"arrange",level:3},{value:"Search and Filter",id:"search-and-filter",level:3},{value:"Create",id:"create",level:3},{value:"Share",id:"share",level:3},{value:"Unshare",id:"unshare",level:3},{value:"Duplicate",id:"duplicate",level:3},{value:"Export",id:"export",level:3},{value:"Import",id:"import",level:3},{value:"Delete",id:"delete",level:3},{value:"Replay",id:"replay",level:3},{value:"Playback",id:"playback",level:3},{value:"Compare",id:"compare",level:3},{value:"Manage Attachments",id:"manage-attachments",level:3},{value:"Prompts",id:"prompts",level:2},{value:"Actions",id:"actions-1",level:3},{value:"Arrange",id:"arrange-1",level:3},{value:"Search and Filter",id:"search-and-filter-1",level:3},{value:"Create",id:"create-1",level:3},{value:"Variables",id:"variables",level:4},{value:"Share",id:"share-1",level:3},{value:"Unshare",id:"unshare-1",level:3},{value:"Duplicate",id:"duplicate-1",level:3},{value:"Chat Settings",id:"chat-settings",level:2},{value:"Talk To",id:"talk-to",level:3},{value:"Language Models",id:"language-models",level:3},{value:"Assistants",id:"assistants",level:3},{value:"Applications",id:"applications",level:3},{value:"System Prompt",id:"system-prompt",level:3},{value:"Example",id:"example",level:4},{value:"Temperature",id:"temperature",level:3},{value:"Addons",id:"addons",level:3},{value:"Isolated View Mode",id:"isolated-view-mode",level:3},{value:"User Settings",id:"user-settings",level:2},{value:"Data Visualization",id:"data-visualization",level:2},{value:"Plotly",id:"plotly",level:3}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"chat-user-guide",children:"Chat User Guide"}),"\n",(0,s.jsx)(n.h2,{id:"interface-components",children:"Interface Components"}),"\n",(0,s.jsx)(n.p,{children:"The AI DIAL Chat application interface has several sections, such as the chat box, settings, and panels for managing conversations and saved prompts."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(7830).Z+"",width:"1914",height:"947"})}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Conversations"}),": Here, you can manage your conversations: create new ones, organize them in folders, and delete. You can collapse and expand the panel by clicking the ",(0,s.jsx)(n.strong,{children:"Hide panel"})," icon above it."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Prompts"}),": In this section, you can work with saved prompts: create new templates, update them, and organize them in folders. You can collapse and expand the panel by clicking the ",(0,s.jsx)(n.strong,{children:"Hide panel"})," icon above it."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Chat"}),": Use this section to enter a prompt, view results, and interact with language models."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Chat Settings"}),": In this section, you can select the language model, assistant, application, and addons you'd like to use. You can also provide a system prompt and adjust the temperature setting."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"User Settings"}),": In your user settings, you can customize the color theme (dark or light), choose a custom logo and other customization options."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"conversations",children:"Conversations"}),"\n",(0,s.jsx)(n.p,{children:"In the AI DIAL framework, a conversation is a dialogue between an agent, such as a language model, assistant, or application, and a human user. The agent uses natural language to interact with a human and receive/give a feedback. Within one conversation, you can refer to previous questions and answers. But different conversations don\u2019t share context."}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"All your conversations are stored on the server, and you can access them from any device you use."}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"actions",children:"Actions"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"During a conversation"}),", you can perform various actions:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Enter prompt"}),": you can use a text box at the bottom to enter your prompts."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Generate answer"}),": click enter to generate the response to your prompt."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Stop generating"}),": in the process of generating the response, you can stop it."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Regenerate response"}),": when stopped, you can regenerate the response. ",(0,s.jsx)(n.strong,{children:"Important"}),": If you encounter a server error or click the ",(0,s.jsx)(n.strong,{children:"Stop Generating"})," button and receive an empty response, the ",(0,s.jsx)(n.strong,{children:"Send"})," button will be disabled. To continue the conversation, you'll need to generate the answer again. If you receive a partial response (a combination of text and an error), the model can still proceed, while for Assistants/Applications, you'll need to generate the response again."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Delete/Edit"}),": during the conversation, you can edit or delete your prompts. After a prompt has been edited, the response is regenerated, and all your prompts after the edited one will be deleted. When you delete your prompt, the response will be deleted, too."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Attach files"}),": some models and applications, like ",(0,s.jsx)(n.em,{children:"DIAL RAG"})," and ",(0,s.jsx)(n.em,{children:"Echo"}),", allow adding attachments to the conversation. In this case, you'll see the ",(0,s.jsx)(n.strong,{children:"Attachments"})," icon available in the chat box. Click it to upload a file from your device or select an already uploaded file. Refer to the ",(0,s.jsx)(n.a,{href:"#manage-attachments",children:"Manage attachments"})," section for details."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Download attached files"}),": click the ",(0,s.jsx)(n.strong,{children:"Download"})," icon near the file name."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Preview attached images"}),": click the ",(0,s.jsx)(n.strong,{children:"Expand"})," icon near the image name."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Copy"}),": you can copy answers."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Like/dislike"}),": you can like and dislike responses in a conversation. Use likes to highlight important responses and dislikes to mark the responses you don't need."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Clear conversation messages"}),": you can clear all messages in your conversation. Click the eraser icon on the top bar to do that."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Change conversation settings"}),": during the conversation, you can access and edit its setting by clicking the gear icon on the top bar. Refer to ",(0,s.jsx)(n.a,{href:"#chat-settings",children:"Chat Settings"})," to learn more."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"View current settings"}),": on the top bar, point to the language model logo icon near the conversation name to see current settings."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"arrange",children:"Arrange"}),"\n",(0,s.jsx)(n.p,{children:"You can gather your conversations in folders."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(9779).Z+"",width:"487",height:"255"})}),"\n",(0,s.jsxs)(n.p,{children:["You can create a hierarchy of folders with three nesting levels. Just create a folder and drag-n-drop it in the other folder to create a nesting level. The same way, you can either drag-n-drop a conversation into a folder or use ",(0,s.jsx)(n.strong,{children:"Move to"})," in the context menu of a conversation to move it to a folder.\nEmpty folders are deleted after refreshing a page."]}),"\n",(0,s.jsxs)(n.p,{children:['The following symbols in the folders names are prohibited: tab, ":", ";", "/", "", ",", "=", "',", ",'", "%", "&" and will be excluded. Note that you can use the "." symbol at the start or inside a name, but the dot at the end will be automatically removed.']}),"\n",(0,s.jsx)(n.p,{children:"The MAX length of the folder name is limited to 160 symbols. Everything beyond is cut off."}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"When you use the contextual menu to move a conversation, you can create a new folder, in which the conversation should be moved."}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"search-and-filter",children:"Search and Filter"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.strong,{children:"Search"})," box can be utilized to find conversations and folders by their names."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(6969).Z+"",width:"373",height:"235"})}),"\n",(0,s.jsxs)(n.p,{children:['You can filter conversations by the "Shared by me" criterion. To do so, click the ',(0,s.jsx)(n.strong,{children:"Filter"})," icon and select ",(0,s.jsx)(n.strong,{children:"Shared by me"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"create",children:"Create"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(8593).Z+"",width:"1910",height:"947"})}),"\n",(0,s.jsx)(n.p,{children:"To create a conversation:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["On the left panel, click ",(0,s.jsx)(n.strong,{children:"New conversation"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["In the main section, under ",(0,s.jsx)(n.strong,{children:"Talk To"}),", select a language model, an assistant, or an application. Five most recently used items are shown in the section. To see all available items, click ",(0,s.jsx)(n.strong,{children:"See full list"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Optionally, under ",(0,s.jsx)(n.strong,{children:"System prompts"}),', select a prompt by typing "/" in the text box. For details, refer to the ',(0,s.jsx)(n.a,{href:"#prompts",children:"Prompts"})," section of this guide."]}),"\n",(0,s.jsxs)(n.li,{children:["Under ",(0,s.jsx)(n.strong,{children:"Temperature"}),", set a value of the temperature parameter. For details, refer to the ",(0,s.jsx)(n.a,{href:"#temperature",children:"Temperature"})," section of this guide."]}),"\n",(0,s.jsxs)(n.li,{children:["Optionally, under ",(0,s.jsx)(n.strong,{children:"Addons"}),", select an Addon. For details, refer to the ",(0,s.jsx)(n.a,{href:"#addons",children:"Addons"})," section of this guide."]}),"\n",(0,s.jsxs)(n.li,{children:["Under conversation settings, type your text (prompt) in the chat box and click the ",(0,s.jsx)(n.strong,{children:"Send"})," icon. The conversation will be created, and your first question will be used as its name."]}),"\n"]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:['The following symbols in the conversation names are prohibited: tab, ":", ";", "/", "", ",", "=", "',", ",'", "%", "&" and will be excluded. Note that you can use the "." symbol at the start or inside a name, but the dot at the end will be automatically removed. The MAX length of the conversation name is limited to 160 symbols. Everything beyond is cut off.']}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"share",children:"Share"}),"\n",(0,s.jsx)(n.p,{children:"You can share a conversation or a folder with several conversations with other users."}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["When someone shared a conversation with you, you can find it in the ",(0,s.jsx)(n.strong,{children:"Shared with me"})," section on the left panel. ",(0,s.jsx)(n.strong,{children:"Important"}),": you cannot change a conversation that has been shared with you. To be able to work with it, ",(0,s.jsx)(n.a,{href:"#duplicate",children:"duplicate it"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["To share a conversation or a folder, click ",(0,s.jsx)(n.strong,{children:"Share"})," in the contextual menu and copy the link. After someone has opened your link, an arrow icon appears near its name and this conversation can be found when ",(0,s.jsx)(n.strong,{children:"Shared by me"})," checkbox is selected in the ",(0,s.jsx)(n.strong,{children:"Search"})," menu."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(299).Z+"",width:"251",height:"341"})}),"\n",(0,s.jsx)(n.p,{children:"When you share a folder, all folders and conversations in this folders will be shared."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(1563).Z+"",width:"351",height:"428"})}),"\n",(0,s.jsx)(n.h3,{id:"unshare",children:"Unshare"}),"\n",(0,s.jsxs)(n.p,{children:["To revoke access from all users, click ",(0,s.jsx)(n.strong,{children:"Unshare"})," in the contextual menu and then confirm action in the dialog window."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(5498).Z+"",width:"414",height:"405"})}),"\n",(0,s.jsx)(n.h3,{id:"duplicate",children:"Duplicate"}),"\n",(0,s.jsxs)(n.p,{children:["You can duplicate a conversation, for example, to be able to change a conversation that was shared with you. To duplicate a conversation, click ",(0,s.jsx)(n.strong,{children:"Duplicate"})," in the contextual menu."]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"This feature is available only for conversations shared with you."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(1319).Z+"",width:"389",height:"326"})}),"\n",(0,s.jsx)(n.h3,{id:"export",children:"Export"}),"\n",(0,s.jsx)(n.p,{children:"You can export selected conversations with or without attachments or all conversations without attachments in a JSON format."}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:'Exported conversations are named by the following pattern: prefix "epam_ai_dial_chat", then "with_attachments" if the conversation was exported with attachments, then "month_day". However, the naming convention is configurable in the chat config.'}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(5603).Z+"",width:"512",height:"469"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Export a single conversation with attachments"})}),"\n",(0,s.jsx)(n.p,{children:"To export a single conversation:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["On the left panel, in the conversation contextual menu, point to ",(0,s.jsx)(n.strong,{children:"Export"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"With attachments"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["The conversation will be exported as a ",(0,s.jsx)(n.strong,{children:"ZIP"})," archive."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Export a single conversation without attachments"})}),"\n",(0,s.jsx)(n.p,{children:"To export a single conversation:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["On the left panel, in the conversation contextual menu, point to ",(0,s.jsx)(n.strong,{children:"Export"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"Without attachments"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["The conversation will be exported as a ",(0,s.jsx)(n.strong,{children:"JSON"})," file."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Export all conversations"})}),"\n",(0,s.jsxs)(n.p,{children:["To export all conversations, at the bottom of the left panel, click the ",(0,s.jsx)(n.strong,{children:"Export conversations"})," icon."]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"Conversations will be exported without attachments."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(2547).Z+"",width:"245",height:"110"})}),"\n",(0,s.jsx)(n.h3,{id:"import",children:"Import"}),"\n",(0,s.jsx)(n.p,{children:"Exported conversations can be imported."}),"\n",(0,s.jsxs)(n.p,{children:["To import JSON or a zip file with conversations, click the ",(0,s.jsx)(n.strong,{children:"Import conversations"})," icon at the bottom of the left panel and then select a file with conversations."]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"When you import a conversation with attachments, the attachments will be available in the Imports folder."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(5764).Z+"",width:"247",height:"87"})}),"\n",(0,s.jsx)(n.h3,{id:"delete",children:"Delete"}),"\n",(0,s.jsx)(n.p,{children:"You can delete a single conversation or all conversations."}),"\n",(0,s.jsxs)(n.p,{children:["To delete a single conversation, on the left panel, in the conversation contextual menu, select ",(0,s.jsx)(n.strong,{children:"Delete"})," and confirm your action."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(3299).Z+"",width:"422",height:"822"})}),"\n",(0,s.jsxs)(n.p,{children:["To delete all conversations, at the bottom of the left panel, click the ",(0,s.jsx)(n.strong,{children:"Delete conversations"})," icon."]}),"\n",(0,s.jsx)(n.h3,{id:"replay",children:"Replay"}),"\n",(0,s.jsxs)(n.p,{children:["You can use ",(0,s.jsx)(n.strong,{children:"Replay"})," to reproduce conversations but with different settings (e.g. a different model). A replayed conversation can be used to compare responses to the same questions from different models and with different settings of the conversation."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(1198).Z+"",width:"377",height:"348"})}),"\n",(0,s.jsxs)(n.p,{children:["Use ",(0,s.jsx)(n.strong,{children:"Replay as is"})," to reproduce the conversation with the original settings."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(3903).Z+"",width:"513",height:"140"})}),"\n",(0,s.jsx)(n.p,{children:"To replay a conversation:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"Replay"})," in the conversation menu."]}),"\n",(0,s.jsxs)(n.li,{children:["Select ",(0,s.jsx)(n.strong,{children:"Replay as is"})," in ",(0,s.jsx)(n.strong,{children:"More info"})," in the Replay settings to reproduce the conversation with the original settings or change the conversation settings."]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"Start replay"}),"."]}),"\n",(0,s.jsx)(n.li,{children:"In the process of replaying, you can stop and resume the replay process."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["The replayed conversation is displayed as a new conversation with the ",(0,s.jsx)(n.code,{children:"[Replay]"})," tag in the list of your conversations."]}),"\n",(0,s.jsx)(n.h3,{id:"playback",children:"Playback"}),"\n",(0,s.jsx)(n.p,{children:"The Playback mode can be used to simulate the current conversation without any engagement with models. This mode accurately reproduces the conversation like a recording. It should be noted that this differs from the Replay mode, where the prompts are resubmitted to the chosen model and the outcomes may differ from the initial conversation."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(6430).Z+"",width:"368",height:"303"})}),"\n",(0,s.jsx)(n.p,{children:"During the playback, you can manually stop and resume the playback process."}),"\n",(0,s.jsx)(n.h3,{id:"compare",children:"Compare"}),"\n",(0,s.jsx)(n.p,{children:"Use the Compare mode to compare two new (or two existing) conversations with different setting (e.g. different models or temperature)."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(4171).Z+"",width:"1656",height:"949"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsxs)(n.strong,{children:["To compare two ",(0,s.jsx)(n.strong,{children:"new"})," conversations"]}),":"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Click the ",(0,s.jsx)(n.strong,{children:"Compare"})," icon at the bottom of the left panel."]}),"\n",(0,s.jsx)(n.li,{children:"Choose settings of the first conversations."}),"\n",(0,s.jsx)(n.li,{children:"Choose settings of the second conversation."}),"\n",(0,s.jsx)(n.li,{children:"Type your question (prompt) in the chat box."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"As you can see on the picture above, the system creates two conversations with the same name but adds numbers to them. If you have chosen different language models, the conversations icons on the left panel will differ."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"You can also compare two existing conversations"}),":"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(1831).Z+"",width:"1665",height:"516"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"The Compare mode works only with conversations with the same amount of prompts from a user. The application will not allow comparing two conversations with different amounts of prompts."}),"\n"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["On the left panel, in the conversation menu of a conversation, select ",(0,s.jsx)(n.strong,{children:"Compare"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["In the main section, under ",(0,s.jsx)(n.strong,{children:"Select conversation to compare with"}),", select the second conversation from the drop box."]}),"\n",(0,s.jsxs)(n.li,{children:["By default, only conversations with the same name are available in the drop box. Select ",(0,s.jsx)(n.strong,{children:"Show all conversations"})," to see the full list of conversations."]}),"\n",(0,s.jsx)(n.li,{children:"Type your question (prompt) in the chat box."}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"manage-attachments",children:"Manage Attachments"}),"\n",(0,s.jsxs)(n.p,{children:["To manage all attachments, click the ",(0,s.jsx)(n.strong,{children:"Attachments"})," icon at the bottom of the left panel."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(1304).Z+"",width:"361",height:"80"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"To Upload a file:"})}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["In the Manage attachments dialog, select ",(0,s.jsx)(n.strong,{children:"Upload from device"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Select one or several files you want to upload and click ",(0,s.jsx)(n.strong,{children:"Open"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Under ",(0,s.jsx)(n.strong,{children:"Upload to"}),", select ",(0,s.jsx)(n.strong,{children:"Change"})," to pick a folder, in which the files will be uploaded."]}),"\n",(0,s.jsxs)(n.li,{children:["Under ",(0,s.jsx)(n.strong,{children:"Files"}),', change file names or delete files, if necessary. The following symbols in the file names are prohibited: tab, ":", ";", "/", "", ",", "=", "',", ",'", "%", "&". Note that you can use the "." symbol at the start or inside a name, but the dot at the end will be automatically removed.']}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"Upload and attach files"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(967).Z+"",width:"507",height:"576"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"To Download Attachments"}),":"]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"Click a folder to expand it."}),"\n"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"In the Manage attachments dialog, point to a file and select it. You can select several files."}),"\n",(0,s.jsxs)(n.li,{children:["Click the ",(0,s.jsx)(n.strong,{children:"Download"})," icon below the files tree."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"To Delete Attachments"}),":"]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"You won't be able to preview or download a deleted file in a conversation, but you still will see its name."}),"\n"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"In the Manage attachments dialog, point to a file and select it. You can select several files."}),"\n",(0,s.jsxs)(n.li,{children:["Click the ",(0,s.jsx)(n.strong,{children:"Delete"})," icon below the files tree."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"prompts",children:"Prompts"}),"\n",(0,s.jsx)(n.p,{children:"A prompt is an instruction, a question, or a message that a user provides to a language model to receive an answer. Prompts can also contain constraints or requirements. They help the model understand the task at hand and the types of responses that are expected.\nYou can use prompts as templates for your messages, instructions to the model, or to encourage the model to generate specific types of content.\nIn AI DIAL, you can create prompts beforehand and reuse them in one or several conversations."}),"\n",(0,s.jsxs)(n.p,{children:["Prompts can be applied to one message or a whole conversation. Refer to the ",(0,s.jsx)(n.a,{href:"#system-prompt",children:"System prompt"})," section of this guide for details."]}),"\n",(0,s.jsx)(n.p,{children:"The section with your prompts is located in the right-hand area of the screen. In this section, you can work with saved prompts: create new templates, update them, and organize them with folders."}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"All your prompts are stored on the server, and you can access them from any device you use."}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"actions-1",children:"Actions"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(155).Z+"",width:"393",height:"277"})}),"\n",(0,s.jsx)(n.p,{children:"You can perform various actions with your prompts:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Edit"}),": select a prompt on the right panel to invoke the Edit window. Make all necessary changes and click ",(0,s.jsx)(n.strong,{children:"Save"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Export"}),": right-click a prompt on the right panel and select ",(0,s.jsx)(n.strong,{children:"Export"}),". The prompt will be exported as JSON."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Move to"}),": use to place a prompt in a folder."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Delete"}),": right-click a prompt on the right panel and select ",(0,s.jsx)(n.strong,{children:"Delete"}),", then confirm the action."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Delete all prompts"}),": click the ",(0,s.jsx)(n.strong,{children:"Delete all"})," icon at the bottom of the right panel and confirm your action."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Export all prompts"}),": click the ",(0,s.jsx)(n.strong,{children:"Export prompts"})," icon at the bottom of the right panel. All your prompts will be exported as JSON."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Import"}),": click the ",(0,s.jsx)(n.strong,{children:"Import prompts"})," icon at the bottom of the right panel and then select a JSON file with prompts."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Share"}),": use to share a prompt or a folder with several prompts with other users."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Unshare"}),": use to revoke access to shared prompts."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"arrange-1",children:"Arrange"}),"\n",(0,s.jsx)(n.p,{children:"You can gather your prompts in folders."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(7176).Z+"",width:"274",height:"169"})}),"\n",(0,s.jsxs)(n.p,{children:["You can create a hierarchy of folders with three nesting levels. Just create a folder and drag-n-drop it in the other folder to create a nesting level.\nThe same way, you can either drag-n-drop a prompt into a folder or use ",(0,s.jsx)(n.strong,{children:"Move to"})," in the context menu of a prompt to place it in one of the folders."]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"After refreshing the page or logging in again, any empty folders will be deleted."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:['The following symbols in the folders names are prohibited: tab, ":", ";", "/", "", ",", "=", "',", ",'", "%", "&". Note that you can use the "." symbol at the start or inside a name, but the dot at the end will be automatically removed. The MAX length of the folder name is limited to 160 symbols. Everything beyond is cut off.']}),"\n",(0,s.jsx)(n.h3,{id:"search-and-filter-1",children:"Search and Filter"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(3115).Z+"",width:"255",height:"251"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.strong,{children:"Search"})," box can be utilized to find prompts and folders by their names."]}),"\n",(0,s.jsxs)(n.p,{children:['You can filter prompts by the "Shared by me" criterion. To do so, click the ',(0,s.jsx)(n.strong,{children:"Filter"})," icon and select ",(0,s.jsx)(n.strong,{children:"Shared by me"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"create-1",children:"Create"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(6331).Z+"",width:"1912",height:"943"})}),"\n",(0,s.jsx)(n.p,{children:"To create a new prompt:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["On the right panel, select ",(0,s.jsx)(n.strong,{children:"New prompt"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Fill in the ",(0,s.jsx)(n.strong,{children:"Name"}),", ",(0,s.jsx)(n.strong,{children:"Description"}),", and ",(0,s.jsx)(n.strong,{children:"Prompt"}),' boxes. The following symbols in the prompt names are prohibited: tab, ":", ";", "/", "", ",", "=", "',", ",'", "%", "&". Note that you can use the "." symbol at the start or inside a name, but the dot at the end will be automatically removed. The MAX length of the prompt name is limited to 160 symbols. Everything beyond is cut off.']}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"Save"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Name"})," and ",(0,s.jsx)(n.strong,{children:"Description"})," aren\u2019t used as instructions for a language model. They only help you to distinguish the prompt from others. The language model will only use instructions from the ",(0,s.jsx)(n.strong,{children:"Prompt"})," box."]}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"variables",children:"Variables"}),"\n",(0,s.jsxs)(n.p,{children:["You can use prompts as templates for your messages to a language model. For example, you need to calculate an equation ",(0,s.jsx)(n.code,{children:"a + c/d"}),", round up the answer, and then divide it by 4. Let\u2019s imagine that you need results for four sets of ",(0,s.jsx)(n.code,{children:"a"}),", ",(0,s.jsx)(n.code,{children:"c"}),", and ",(0,s.jsx)(n.code,{children:"d"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"In that case you can create the following prompt:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(848).Z+"",width:"1241",height:"775"})}),"\n",(0,s.jsxs)(n.p,{children:["Here, ",(0,s.jsx)(n.code,{children:"a"}),", ",(0,s.jsx)(n.code,{children:"c"}),", and ",(0,s.jsx)(n.code,{children:"d"})," are variables. In the prompt body, they are denoted by double curly brackets: ",(0,s.jsx)(n.code,{children:"{{ }}"}),"."]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"You can combine mathematical expressions and natural language in your prompts."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["After you\u2019ve created the prompt, you can use it by typing a slash ",(0,s.jsx)(n.code,{children:"/"})," in the chat box and selecting the name of a prompt (it is ",(0,s.jsx)(n.strong,{children:"Math"})," in our example). You\u2019ll see the following form where you can enter any numbers:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(9555).Z+"",width:"967",height:"775"})}),"\n",(0,s.jsx)(n.p,{children:"When you submit the form, your message will look like on the illustration below:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(1003).Z+"",width:"972",height:"116"})}),"\n",(0,s.jsx)(n.p,{children:"Send the message to the model, and it will generate an answer using both mathematical and natural language instructions:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(3064).Z+"",width:"804",height:"727"})}),"\n",(0,s.jsxs)(n.p,{children:["Generally, variables can be anything, not only numbers. For example, you can create a prompt with the following body: ",(0,s.jsx)(n.code,{children:"Who played {{character}} in {{movie}}? or What is a Latin name of {{plant common name}}?"})]}),"\n",(0,s.jsx)(n.h3,{id:"share-1",children:"Share"}),"\n",(0,s.jsx)(n.p,{children:"You can share a prompt or a folder with several prompts with other users."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"To Receive a Shared Prompt"}),":"]}),"\n",(0,s.jsx)(n.p,{children:"To obtain a prompt from someone else (receive a shared prompt), you must get a link from them. By clicking on this link, you will import the prompt into your chat."}),"\n",(0,s.jsxs)(n.p,{children:["When someone shares a prompt with you, you can find it in the ",(0,s.jsx)(n.strong,{children:"Shared with me"})," section on the right panel. ",(0,s.jsx)(n.strong,{children:"Important"}),": you cannot change a prompt that has been shared with you. To be able to work with it, ",(0,s.jsx)(n.a,{href:"#duplicate-1",children:"duplicate it"}),". When you receive a shared prompt, a pop-up window opens up, where you can preview a prompt and duplicate it if needed."]}),"\n",(0,s.jsx)(n.p,{children:"You can always view prompts that have been shared with you in a dedicated section and perform various actions on them such as"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(4091).Z+"",width:"258",height:"200"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"View: opens a pop-up window with a prompt preview."}),"\n",(0,s.jsx)(n.li,{children:"Duplicate: use to duplicate a shared with you prompt to be able to modify it."}),"\n",(0,s.jsx)(n.li,{children:"Delete: remove from the list."}),"\n",(0,s.jsx)(n.li,{children:"Export: download in a JSON format."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"To Share a Prompt"}),":"]}),"\n",(0,s.jsxs)(n.p,{children:["To share a prompt or a folder, click ",(0,s.jsx)(n.strong,{children:"Share"})," in the contextual menu and copy the link. After someone has opened your link, an arrow icon appears near its name and this prompt can be found when ",(0,s.jsx)(n.strong,{children:"Shared by me"})," checkbox is selected in the ",(0,s.jsx)(n.strong,{children:"Search"})," menu."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(3626).Z+"",width:"135",height:"34"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"When you share a folder, all folders and prompts in this folders will be shared."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(3845).Z+"",width:"255",height:"361"})}),"\n",(0,s.jsx)(n.h3,{id:"unshare-1",children:"Unshare"}),"\n",(0,s.jsxs)(n.p,{children:["To revoke access from all users, click ",(0,s.jsx)(n.strong,{children:"Unshare"})," in the contextual menu and then confirm actions in the dialog window."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(1254).Z+"",width:"258",height:"370"})}),"\n",(0,s.jsx)(n.h3,{id:"duplicate-1",children:"Duplicate"}),"\n",(0,s.jsxs)(n.p,{children:["You can duplicate a prompt, for example, to be able to change a prompt that was shared with you. To duplicate a prompt, click ",(0,s.jsx)(n.strong,{children:"Duplicate"})," in the contextual menu."]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"You can duplicate only prompt shared with you."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(2035).Z+"",width:"260",height:"313"})}),"\n",(0,s.jsx)(n.h2,{id:"chat-settings",children:"Chat Settings"}),"\n",(0,s.jsx)(n.p,{children:"In the Chat Settings section, there are the following components:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Talk To"}),"\n",(0,s.jsx)(n.li,{children:"System Prompt"}),"\n",(0,s.jsx)(n.li,{children:"Temperature"}),"\n",(0,s.jsx)(n.li,{children:"Addons"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Take a closer look at each of these elements."}),"\n",(0,s.jsx)(n.h3,{id:"talk-to",children:"Talk To"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(3565).Z+"",width:"1920",height:"891"})}),"\n",(0,s.jsx)(n.p,{children:"In this section, you can choose the language model for communication, as well as an Assistant or Application to implement specific behavior for the LLM."}),"\n",(0,s.jsx)(n.h3,{id:"language-models",children:"Language Models"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(5237).Z+"",width:"1399",height:"945"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Available language models"}),":"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"GPT-3.5"})," is an advanced language model developed by OpenAI, known for its powerful natural language processing, understanding, and context awareness. Enabling human-like conversations, it can carry out various tasks, including summarizing, translation, content creation, and answering queries."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"GPT-4"})," is the latest iteration of the GTP series by OpenAI, offering more powerful natural language processing capabilities than its previous versions. It harnesses extensive training and massive datasets to deliver lifelike conversations, unsurpassed context awareness, and high-quality content generation across multiple languages and domains."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"GPT-4-32K"})," is the extension for GTP-4 that can possess a larger context window size (32,000 tokens). It offers several advantages, including a better understanding of context, improved performance in long-form tasks, enhanced reasoning and knowledge handling, and increased creativity in content generation. Please only use this one if you absolutely need it. It's slower and more expensive."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"PaLM2 (Bison)"})," is an LLM developed by Google that leverages an innovative hierarchical architecture to enhance its linguistic competence and computational efficiency. By employing parallel and multitask learning mechanisms, PaLM2 (Bison) provides exceptional performance in diverse language tasks, like question-answering, summarization, and translation, while also being highly scalable and adaptive to new environments."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"AI21 (Jurassic-2 Grande)"})," is a large-scale language model with 178 billion parameters developed by AI21 Labs. It is an upgraded version of its predecessor AI21 Jurassic-1 and is capable of processing extensive amounts of text and generating contextually appropriate replies. The model's distinguishing features include its scale, contextual understanding, multilingualism, few-shot learning, and knowledge integration with external sources. It is designed to enhance natural language processing, chatbots, virtual assistants, and other applications requiring advanced language capabilities."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"AI21 (Jurassic-2 Jumbo)"})," is an expansion of the AI21 Jurassic-2 Grande model, leveraging improved training techniques, larger datasets, and advanced hardware resources. Jumbo provides a boost in performance and is specifically designed for challenging natural language applications such as sentiment analysis, language translation, and document summarization. AI21 Jurassic-2 Jumbo has 199 billion parameters, making it the largest publicly available language model to date."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"CodeLlama-34b"})," is a language model developed by AI21 that has 34 billion parameters. CodeLlama-34b is specifically designed for use in software development and is trained on a diverse set of technical documentation, including programming languages, code samples, and developer forums. The model is optimized for code-related natural language queries, including code completion, code understanding, and code generation."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"Llama2q-70B"})," is an LLM developed by AI21, which has 70 billion parameters. Like CodeLlama-34b, it is designed for technical applications but with a broader scope. Llama2q-70B has a wide range of capabilities, including question answering, text classification, and summarization. It is trained on a variety of sources, including technical documents, academic papers, and news articles, and is designed to provide accurate results for a wide range of technical queries and applications."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"Anthropic (Claude)"})," is a large-scale LLM with 175 billion parameters that is optimized for general-purpose language tasks, including question answering, dialogue generation, and text completion. The model has been trained on data from a wide range of sources to provide high accuracy in many contexts."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"Anthropic (Claude Instant)"})," is an LLM that can generate responses in real-time, making it useful for applications such as chatbots and virtual assistants. It is a smaller model than the Anthropic (Claude) model, with 9 billion parameters, and is optimized for low-latency inference."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"Anthropic (Claude V2)"})," is an upgraded version of the Anthropic (Claude) model, with 400 billion parameters, making it one of the largest language models to date. This model is designed for sophisticated NLP applications involving complex reasoning, inference, and understanding of long-form text data."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"AWS (Titan)"}),": AWS (Amazon Web Services) developed an LLM called Titan in 2021, which has 850 billion parameters, making it the largest publicly available language model at the time of its introduction. The model was trained on a diverse set of text sources, including web pages, books, and news articles. Titan is designed to handle complex natural language processing tasks, such as summarization, dialogue generation, and translation."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"assistants",children:"Assistants"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(9229).Z+"",width:"771",height:"292"})}),"\n",(0,s.jsx)(n.p,{children:"In the AI DIAL framework, Assistants are a combination of preselected Addons and System Prompts that enable specific behavior in the LLM, allowing for more tailored and adaptive responses to user needs. Unlike the Model+Addon configuration, where users have the flexibility to choose different Addons, Assistants come with predetermined Addons that cannot be removed or unselected. However, the Model can still be reassigned within the Assistant."}),"\n",(0,s.jsx)(n.p,{children:"Assistants give you more control over LLM behavior, resulting in tailored and accurate responses that match specific needs. The flexibility of this combination lets you create custom Assistants within the AI DIAL framework. These Assistants can range from simple tasks, like asking the LLM to provide answers in a specific tone or style (e.g., like a pirate), to more complex tasks, such as restricting the LLM's data to a specific geographical area (e.g., providing weather forecasts for Chicago only). Combining Addons and System Prompts enables better customization and adaptability to various situations, leading to more versatile responses."}),"\n",(0,s.jsx)(n.p,{children:"In a chat application, you can include custom Assistant(s) that users can choose when using AI DIAL."}),"\n",(0,s.jsx)(n.h3,{id:"applications",children:"Applications"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(1036).Z+"",width:"1414",height:"936"})}),"\n",(0,s.jsx)(n.p,{children:"In the AI DIAL framework, Applications are ready-to-use solutions made up of predefined configurations of Addons and other services or any custom logic. They help you customize LLM behavior by integrating Addons with any desired logic. Applications can be any component that meets API requirements and implements non-LLM-related logic, such as repeating user messages, creating a fully deterministic chatbot, or managing complex multi-LLM interactions. This versatility in Applications allows for tailored handling of unique scenarios and requirements."}),"\n",(0,s.jsx)(n.h3,{id:"system-prompt",children:"System Prompt"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(9180).Z+"",width:"1912",height:"580"})}),"\n",(0,s.jsxs)(n.p,{children:["The system prompt in AI DIAL refers to the initial instructions given to the model. You can use any previously created prompt as a system prompt (for details, refer to the ",(0,s.jsx)(n.a,{href:"#create",children:"Create"})," in Prompts), and it will set the context and tone for the whole conversation."]}),"\n",(0,s.jsx)(n.p,{children:"The system prompt in AI DIAL is like a compass for a traveler, pointing the model in the right direction to navigate the conversational landscape, ensuring it stays on course and aligned with the overall purpose and desired outcome."}),"\n",(0,s.jsxs)(n.p,{children:["You can change system prompts during a conversation by selecting the ",(0,s.jsx)(n.strong,{children:"Settings"})," icon at the top bar of the conversation."]}),"\n",(0,s.jsx)(n.h4,{id:"example",children:"Example"}),"\n",(0,s.jsxs)(n.p,{children:["Let\u2019s compare a conversation with a system prompt selected and a conversation without a system prompt. For illustration purposes, we\u2019re going to use the compare mode (refer to the ",(0,s.jsx)(n.a,{href:"#compare",children:"Compare"})," section for details) and create two conversations with identical settings except for the system prompt selection."]}),"\n",(0,s.jsx)(n.p,{children:"The prompt used as a system prompt is as follows:"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"Let's play a game. Name a city that starts with the last letter of the one that I named in a previous message and then tell me that it is my turn to name a city."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(9855).Z+"",width:"1920",height:"891"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(5937).Z+"",width:"1383",height:"714"})}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:(0,s.jsx)(n.strong,{children:"User message"})}),(0,s.jsx)(n.th,{children:(0,s.jsx)(n.strong,{children:"Language model response without a system prompt"})}),(0,s.jsx)(n.th,{children:(0,s.jsx)(n.strong,{children:"Language model response with a system prompt"})})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Grodno"}),(0,s.jsx)(n.td,{children:"Grodno, also known as Hrodna, is a city in western Belarus, near the borders with Poland and Lithuania. It is the administrative center of Grodno region and has a population of around 365,000 people. Grodno is one of the oldest cities in Belarus, dating back to the 11th century. The city boasts a rich history and diverse architectural styles, including baroque, classicism, and modernism."}),(0,s.jsx)(n.td,{children:"Oslo. It's your turn!"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Osaka"}),(0,s.jsx)(n.td,{children:"Osaka is a large port city and commercial center on the Japanese island of Honshu. It's known for its modern architecture, nightlife, and hearty street food. One of Osaka's most popular tourist destinations is the bustling urban area of Dotonbori, where the city's entertainment and dining scenes come to life with numerous restaurants, bars, and shops."}),(0,s.jsx)(n.td,{children:"Ankara. Now it's your turn to name a city!"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Antwerp"}),(0,s.jsx)(n.td,{children:"Antwerp is a city in Belgium, and it's the country\u2019s biggest port. It is located on the River Scheldt, linked to the North Sea by the Westerschelde estuary. Known for its many historical buildings, squares, museums, and cultural attractions, it's a popular tourist destination."}),(0,s.jsx)(n.td,{children:"Prague. Your turn to name a city!"})]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"temperature",children:"Temperature"}),"\n",(0,s.jsx)(n.p,{children:"The temperature parameter controls the creativity and randomness of the model's output. A higher temperature (e.g., 1.0) makes the output more diverse and creative, while a lower temperature (e.g., 0.1) makes the output more focused and deterministic."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(9402).Z+"",width:"1912",height:"580"})}),"\n",(0,s.jsx)(n.p,{children:"Adjusting the temperature allows you to balance creativity and consistency in the generated response."}),"\n",(0,s.jsx)(n.h3,{id:"addons",children:"Addons"}),"\n",(0,s.jsx)(n.p,{children:"You may want LLM to access particular data or technology to generate responses. This could be your company's database, a collection of PDF documents, calculation engines, API or any other data source or technology.\nWithin the AI DIAL framework, an Addon is a service or any component that follows the Open API specification. LLMs can access and use any desired data source or technology to create responses."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(4185).Z+"",width:"983",height:"524"})}),"\n",(0,s.jsx)(n.p,{children:"Some examples of Addon implementation are semantic search, Q&A search, DB query generator, or any other custom logic that meets your business needs. AI DIAL can include custom Addons that you can choose to activate a specific system behavior."}),"\n",(0,s.jsx)(n.h3,{id:"isolated-view-mode",children:"Isolated View Mode"}),"\n",(0,s.jsxs)(n.p,{children:["In the Isolated View Mode, a user can follow a specific URL ",(0,s.jsx)(n.code,{children:"https://server/models/modelID"})," or ",(0,s.jsx)(n.code,{children:"https://server/models/applicationID"})," to use the AI DIAL Chat in a simplified view with minimal configuration settings for a selected model or application. Conversation settings, conversation and prompt panels are not shown in this case. All created conversations are saved and displayed in the regular chat view mode as well (when just created, names of such conversations are appended in the regular view mode with an ",(0,s.jsx)(n.code,{children:"isolated"})," prefix in the beginning. e.g. ",(0,s.jsx)(n.code,{children:"isolated_dial-rag"}),")."]}),"\n",(0,s.jsxs)(n.p,{children:["For instance, if a user wants to open GPT-4 without any extra features or configurations, they can simply go to ",(0,s.jsx)(n.code,{children:"https://AI DIAL Chat URL/models/gpt-4"})," and access a streamlined user interface that only contains a chat input with GPT-4:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(5311).Z+"",width:"1338",height:"455"})}),"\n",(0,s.jsx)(n.h2,{id:"user-settings",children:"User Settings"}),"\n",(0,s.jsx)(n.p,{children:"On the top bar, in the user area, you can click a down arrow to access additional settings or logout."}),"\n",(0,s.jsx)(n.p,{children:"You can select the chat theme, dark or light, add a custom logo, and switch on a full width chat mode."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(3578).Z+"",width:"1910",height:"679"})}),"\n",(0,s.jsx)(n.h2,{id:"data-visualization",children:"Data Visualization"}),"\n",(0,s.jsxs)(n.p,{children:["AI DIAL Chat enables data visualization for specific data types using data visualizers. It comes with built-in support for the ",(0,s.jsx)(n.a,{href:"#plotly",children:"Plotly data visualizer"}),". To link any other custom visualizers, you can use the ",(0,s.jsx)(n.a,{href:"https://github.com/epam/ai-dial-chat/blob/development/libs/chat-visualizer-connector/README.md",children:"DIAL Chat Visualizer Connector"})," library."]}),"\n",(0,s.jsx)(n.h3,{id:"plotly",children:"Plotly"}),"\n",(0,s.jsx)(n.p,{children:"Plotly is an open-source JavaScript library that enables the creation of diverse data visualizations, including charts, 3D graphs, and more."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(2198).Z+"",width:"1912",height:"813"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["Refer to ",(0,s.jsx)(n.a,{href:"https://plotly.com/",children:"Plotly"})," to learn more."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"AI DIAL Chat integrates with Plotly, offering robust data visualization capabilities. To utilize Plotly, choose an AI DIAL application that supports this feature. These applications must be capable of querying data (either from a URL or directly from the Chat application) based on user input and returning it in a format compatible with Plotly. Chat automatically detects attachments in this format and uses Plotly to visualize the data."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(6536).Z+"",width:"721",height:"775"})}),"\n",(0,s.jsx)(n.p,{children:"The visualizations come with standard Plotly controls for easy manipulation."}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["Refer to ",(0,s.jsx)(n.a,{href:"https://github.com/plotly/react-plotly.js",children:"Plotly GitHub"})," to learn more."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},3299:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/Delete_conv-a4ad2f554e80d9e8beb4ad9592d4bf13.png"},848:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/Prompt_example_math_edit_window-0c9e0cf4b5e706e8c777da1c10249a8b.png"},9555:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/Prompt_example_math_enter_variables-75f9d1be8618f9c42e6a1b8e69c54842.png"},3064:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/Prompt_example_math_response-8af03a748626eae59a3ca38522dd0601.png"},1003:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/Prompt_example_math_resulting_message-280e6af59bea553b1b25c7efa28020b8.png"},3903:(e,n,t)=>{t.d(n,{Z:()=>s});const s="data:image/png;base64,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"},9855:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/System_prompt_example_compare_settings-9bae1a272e703e3e7a19783586bda7d3.png"},5937:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/System_prompt_example_conversation-b8acac4bc78a51dd979a1526c2bd3b5e.png"},3565:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/Talk_to_full_list-0f8667f4ebc22985de2fd75a7cdee746.png"},9229:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/Talk_to_full_list_assistants-90f8dc510f8ea1b3c0edf9a55c1e99f0.png"},4185:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/addons2-404880c97da9d45d5a391dd35e650cb8.png"},5237:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/all_models-aa26c27e7e84b6b0e092a5739be677cb.png"},1036:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/applications-1c4e4a90fddc7be602f147b8d6f0f88f.png"},967:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/attachments2-ff159b5e60f8177df95ccb5afd36ccba.png"},1304:(e,n,t)=>{t.d(n,{Z:()=>s});const s="data:image/png;base64,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"},1831:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/compare-caf2ff8cbbe3ef9bc7b0070636a79fbc.png"},4171:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/compare2-f3a9fc062741202e3f0e861fc89593e3.png"},8593:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/conversations-a284e306a9213cf466ff6e50ec734c0d.png"},6331:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/create_prompt-a9159bd0c2cfd8d448f22097c39d34df.png"},1319:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/duplicate_conv-1046542b7103644a484fd45405d11c4e.png"},2035:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/duplicate_prompt-34520c5d69fbfcb24b5a5c494474a377.png"},5603:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/export-conv-cdf65ca84cfc687f467cd245e592b1f0.png"},2547:(e,n,t)=>{t.d(n,{Z:()=>s});const s="data:image/png;base64,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"},7830:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/home-9d069fea243ec7a3ea2e6e6e7f105989.png"},5764:(e,n,t)=>{t.d(n,{Z:()=>s});const s="data:image/png;base64,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"},5311:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/isolated_view_mode-2a60e40cbea4eb507f25b263c74d6b50.png"},9779:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/move_conv-30a3ef1b4fde3a24bdca0bae5a6aaf61.png"},7176:(e,n,t)=>{t.d(n,{Z:()=>s});const s="data:image/png;base64,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"},6430:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/playback2-ec27c32f83e65baf353914299635f464.png"},2198:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/plotly-f05f6c67e2388529bbafc508cf2dc4cf.png"},6536:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/plotly2-48707125cf7011ca6ae64b2bc88d21ca.png"},155:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/prompt_actions-4fbbf3872ca18751a819977efcfa0a77.png"},3115:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/pt_search-13fa8427ae1e46b9553930dd91fdc41a.png"},3845:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/pt_share-2fe22502e0aac65be9db10c2195d7071.png"},1254:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/pt_unshare-6586692d9e1f05edfe8a1bf967365c0c.png"},1198:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/replay2-f86b70983ec830788b0e3aebdaeda678.png"},6969:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/search-conv-6f8993d9ed3be0be9ef1d2d5a0e3c829.png"},1563:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/share_conv-a95b232e78f139731210e52e9f36857a.png"},299:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/shared-6b32551db1bde691a30c876e5f186fcd.png"},3626:(e,n,t)=>{t.d(n,{Z:()=>s});const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIcAAAAiCAYAAAB1NspXAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwgAADsIBFShKgAAABSBJREFUeF7tmN1Lm1ccx/dH5Mpb73IjejO2iw0ZLb2o4IWQi0CFQAqCDC9msxvdEEPXERkuYRTLcMmYq7Y2ywpqKGmjTbuY+L6pTddlmbZJtJpVy6M2Ct+dc57kyfP4PM/U4Fv0XHwg55zfOc8Tzuf5nZf3dnZ2wOFoweXg6MLl4OjC5eDowuXg6MLl4OjC5eDowuXg6HJiciQWXjK02jingxOTo/unfoZWG+d0cCxyrGbe4I+554q6yPgMQ173+1yMxcrr9oOQyZB+Mta040qOtZP9L8ciRzg6hS+uf8smn5af/RnHk9FxRoz8pnUzs89YzOjYtKLv3qTRZy2HoUxJlbULkxmt+BNmOYbgRAKCVptEGmGXGVX0v3RENdqPh2NbVkbHpvB6ZRU/9vqYBHJ67txnbZHxg4pBEeWo70/L6jIId1yEocmLVUXsKSBih8F6G0mtNkomBEddJWpbvfDYz4kclDu/DOLLr5x4/NsY3qytM4ZDEVZ31zek2WdvtOQgpLy4WtYEP8seCfhdboQTMfhcTahvHZAmJzniRrvNjHqbHZ4R5RjxIQc8kTSJ6UKz1YxmlxfzJM0LiQA8bQ2kjwO+2YwUvxpxwzlEskLMC6fGmKzdVgfDBQvaXQ74XxSeJZEKwT8hjhnuOCdy/LPwimWJx0/Vf3b4SYS1Lb5Kqdr25v/ksMCXouUoHGU1MFnMaO8P5NK6gElXDaqukAkeCSE44oXjihGXOqNSyqeTU2ttQMst0mckgFuNRhgbSbnVDT/p4++x4RJ5Rt+iGJ/st5CsYMGn1tyYD9xovmzE1f4EaxcWowh2N8BgsrP2+eXcu+pwpuWgR1V6ImGbz4kZJsDa+ltVHM0gtG18apbF0j77P+ZqyxHvIRNldiPOylSOcjQ/EAoxi7dRX9YAn3yC1gJoqaiDJ/dFs8lpCxT2BwnaJ5+NKGn4GsvR8kgcl8lR0YqgfBP5wg0TrRNy5b2WFRnnRo6nkQlRDiLC7ri8HHTjWqwcxuoa1JpyVJMvvM4GfyIfI8rhiBT6CY9aYWj07pqkDPw2ItGQTlpnQtkRluLFmLyYTA7VmDF4TB/DOZ0rczn02draUtXRUwuVI7X0WtW2N7nM4ZmRHWdlGYKhliPpIxN5IySLEQnfKEx2UXLIMw1DfD/p2edZju0syRiTWcTH1CzFt1lMNpuV4uOJBbR97ULvvQGp7mDo7DkUqOXYmXai+oITk4o4+pUb4ZgQy0XJYcovZTkEslRJex/CeZYjem8L7R+91eXflCgIzRR5vvnuB4UwB6NIOagIZrJZ7BM3i5R4nwXGywVhipKjTD6meKQ22gYKR2oqh6kL81uFMfQ4c3Ikn2cR/H5TInBzE9c/Kcix9Jcox/3Bh/h1MMDkoHcgu8fZP8XKQVgOwWmtJJvISlRVlKPKbEdQtkEtSg5rF/o6a2D88H18QMekl3GKW84EfE3kmeR98nsbPc6cHHLeka+j57MNReZI5+SgN6FUCirH0vKKqu+xckjX1KIcuSVDKP1r/COTI/uuIEbv5xt42LWpyBz5JaXzplvVt1RRyHEGOBI5qBhUiLwYtEyXGHnmoHcakzNzEIQNVf9SJTlkQ63s9rXUOXQ55GLQzEHLtH63HJzTz6HLcbdFFOPnaxtsz5GvH+4WTzHLf3M5SoVDlWN9ZVvKGHIxKPlTDL0HkddzTi+HnjlezmVVYnBKkyPZkHLOBlwOji5cDo4uXA6OLlwOji5cDo4OO/gP0MoGJj3NhccAAAAASUVORK5CYII="},4091:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/shared_prompt2-d728e8cf8e5859123582a9b8f87808a2.png"},9180:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/system_prompt-c64a3a8ad45aa928cf8e8fd41a9c95f3.png"},9402:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/temperature-259895bafb8f9c1336e6fa97864ace7c.png"},5498:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/unshare_conv-7911515c82cefef41f954d14384609e1.png"},3578:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/user_settings-0a34980bd07353872d12bc1d39d86e04.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>r,a:()=>o});var s=t(7294);const i={},a=s.createContext(i);function o(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1db65d89.91e39e15.js b/assets/js/1db65d89.91e39e15.js deleted file mode 100644 index 13536eaa..00000000 --- a/assets/js/1db65d89.91e39e15.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdial=self.webpackChunkdial||[]).push([[659],{7925:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>c});var s=t(5893),i=t(1151);const a={},o="Chat User Guide",r={id:"user-guide",title:"Chat User Guide",description:"Interface Components",source:"@site/docs/user-guide.md",sourceDirName:".",slug:"/user-guide",permalink:"/user-guide",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"CustomSideBar",previous:{title:"cognito",permalink:"/Deployment/idp-configuration/cognito"},next:{title:"configuration",permalink:"/Deployment/configuration"}},l={},c=[{value:"Interface Components",id:"interface-components",level:2},{value:"Conversations",id:"conversations",level:2},{value:"Actions",id:"actions",level:3},{value:"Arrange",id:"arrange",level:3},{value:"Search and Filter",id:"search-and-filter",level:3},{value:"Create",id:"create",level:3},{value:"Share",id:"share",level:3},{value:"Unshare",id:"unshare",level:3},{value:"Duplicate",id:"duplicate",level:3},{value:"Export",id:"export",level:3},{value:"Import",id:"import",level:3},{value:"Delete",id:"delete",level:3},{value:"Replay",id:"replay",level:3},{value:"Playback",id:"playback",level:3},{value:"Compare",id:"compare",level:3},{value:"Manage Attachments",id:"manage-attachments",level:3},{value:"Prompts",id:"prompts",level:2},{value:"Actions",id:"actions-1",level:3},{value:"Arrange",id:"arrange-1",level:3},{value:"Search and Filter",id:"search-and-filter-1",level:3},{value:"Create",id:"create-1",level:3},{value:"Variables",id:"variables",level:4},{value:"Share",id:"share-1",level:3},{value:"Unshare",id:"unshare-1",level:3},{value:"Duplicate",id:"duplicate-1",level:3},{value:"Chat Settings",id:"chat-settings",level:2},{value:"Talk To",id:"talk-to",level:3},{value:"Language Models",id:"language-models",level:3},{value:"Assistants",id:"assistants",level:3},{value:"Applications",id:"applications",level:3},{value:"System Prompt",id:"system-prompt",level:3},{value:"Example",id:"example",level:4},{value:"Temperature",id:"temperature",level:3},{value:"Addons",id:"addons",level:3},{value:"Isolated View Mode",id:"isolated-view-mode",level:3},{value:"User Settings",id:"user-settings",level:2},{value:"Data Visualization",id:"data-visualization",level:2},{value:"Plotly",id:"plotly",level:3}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"chat-user-guide",children:"Chat User Guide"}),"\n",(0,s.jsx)(n.h2,{id:"interface-components",children:"Interface Components"}),"\n",(0,s.jsx)(n.p,{children:"The AI DIAL Chat application interface has several sections, such as the chat box, settings, and panels for managing conversations and saved prompts."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(7830).Z+"",width:"1914",height:"947"})}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Conversations"}),": Here, you can manage your conversations: create new ones, organize them in folders, and delete. You can collapse and expand the panel by clicking the ",(0,s.jsx)(n.strong,{children:"Hide panel"})," icon above it."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Prompts"}),": In this section, you can work with saved prompts: create new templates, update them, and organize them in folders. You can collapse and expand the panel by clicking the ",(0,s.jsx)(n.strong,{children:"Hide panel"})," icon above it."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Chat"}),": Use this section to enter a prompt, view results, and interact with language models."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Chat Settings"}),": In this section, you can select the language model, assistant, application, and addons you'd like to use. You can also provide a system prompt and adjust the temperature setting."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"User Settings"}),": In your user settings, you can customize the color theme (dark or light), choose a custom logo and other customization options."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"conversations",children:"Conversations"}),"\n",(0,s.jsx)(n.p,{children:"In the AI DIAL framework, a conversation is a dialogue between an agent, such as a language model, assistant, or application, and a human user. The agent uses natural language to interact with a human and receive/give a feedback. Within one conversation, you can refer to previous questions and answers. But different conversations don\u2019t share context."}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"All your conversations are stored on the server, and you can access them from any device you use."}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"actions",children:"Actions"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"During a conversation"}),", you can perform various actions:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Enter prompt"}),": you can use a text box at the bottom to enter your prompts."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Generate answer"}),": click enter to generate the response to your prompt."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Stop generating"}),": in the process of generating the response, you can stop it."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Regenerate response"}),": when stopped, you can regenerate the response. ",(0,s.jsx)(n.strong,{children:"Important"}),": If you encounter a server error or click the ",(0,s.jsx)(n.strong,{children:"Stop Generating"})," button and receive an empty response, the ",(0,s.jsx)(n.strong,{children:"Send"})," button will be disabled. To continue the conversation, you'll need to generate the answer again. If you receive a partial response (a combination of text and an error), the model can still proceed, while for Assistants/Applications, you'll need to generate the response again."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Delete/Edit"}),": during the conversation, you can edit or delete your prompts. After a prompt has been edited, the response is regenerated, and all your prompts after the edited one will be deleted. When you delete your prompt, the response will be deleted, too."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Attach files"}),": some models and applications, like ",(0,s.jsx)(n.em,{children:"DIAL RAG"})," and ",(0,s.jsx)(n.em,{children:"Echo"}),", allow adding attachments to the conversation. In this case, you'll see the ",(0,s.jsx)(n.strong,{children:"Attachments"})," icon available in the chat box. Click it to upload a file from your device or select an already uploaded file. Refer to the ",(0,s.jsx)(n.a,{href:"#manage-attachments",children:"Manage attachments"})," section for details."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Download attached files"}),": click the ",(0,s.jsx)(n.strong,{children:"Download"})," icon near the file name."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Preview attached images"}),": click the ",(0,s.jsx)(n.strong,{children:"Expand"})," icon near the image name."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Copy"}),": you can copy answers."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Like/dislike"}),": you can like and dislike responses in a conversation. Use likes to highlight important responses and dislikes to mark the responses you don't need."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Clear conversation messages"}),": you can clear all messages in your conversation. Click the eraser icon on the top bar to do that."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Change conversation settings"}),": during the conversation, you can access and edit its setting by clicking the gear icon on the top bar. Refer to ",(0,s.jsx)(n.a,{href:"#chat-settings",children:"Chat Settings"})," to learn more."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"View current settings"}),": on the top bar, point to the language model logo icon near the conversation name to see current settings."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"arrange",children:"Arrange"}),"\n",(0,s.jsx)(n.p,{children:"You can gather your conversations in folders."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(9779).Z+"",width:"487",height:"255"})}),"\n",(0,s.jsxs)(n.p,{children:["You can create a hierarchy of folders with three nesting levels. Just create a folder and drag-n-drop it in the other folder to create a nesting level. The same way, you can either drag-n-drop a conversation into a folder or use ",(0,s.jsx)(n.strong,{children:"Move to"})," in the context menu of a conversation to move it to a folder.\nEmpty folders are deleted after refreshing a page."]}),"\n",(0,s.jsxs)(n.p,{children:['The following symbols in the folders names are prohibited: tab, ":", ";", "/", "", ",", "=", "',", ",'", "%", "&" and will be excluded. Note that you can use the "." symbol at the start or inside a name, but the dot at the end will be automatically removed.']}),"\n",(0,s.jsx)(n.p,{children:"The MAX length of the folder name is limited to 160 symbols. Everything beyond is cut off."}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"When you use the contextual menu to move a conversation, you can create a new folder, in which the conversation should be moved."}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"search-and-filter",children:"Search and Filter"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.strong,{children:"Search"})," box can be utilized to find conversations and folders by their names."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(6969).Z+"",width:"373",height:"235"})}),"\n",(0,s.jsxs)(n.p,{children:['You can filter conversations by the "Shared by me" criterion. To do so, click the ',(0,s.jsx)(n.strong,{children:"Filter"})," icon and select ",(0,s.jsx)(n.strong,{children:"Shared by me"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"create",children:"Create"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(8593).Z+"",width:"1910",height:"947"})}),"\n",(0,s.jsx)(n.p,{children:"To create a conversation:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["On the left panel, click ",(0,s.jsx)(n.strong,{children:"New conversation"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["In the main section, under ",(0,s.jsx)(n.strong,{children:"Talk To"}),", select a language model, an assistant, or an application. Five most recently used items are shown in the section. To see all available items, click ",(0,s.jsx)(n.strong,{children:"See full list"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Optionally, under ",(0,s.jsx)(n.strong,{children:"System prompts"}),', select a prompt by typing "/" in the text box. For details, refer to the ',(0,s.jsx)(n.a,{href:"#prompts",children:"Prompts"})," section of this guide."]}),"\n",(0,s.jsxs)(n.li,{children:["Under ",(0,s.jsx)(n.strong,{children:"Temperature"}),", set a value of the temperature parameter. For details, refer to the ",(0,s.jsx)(n.a,{href:"#temperature",children:"Temperature"})," section of this guide."]}),"\n",(0,s.jsxs)(n.li,{children:["Optionally, under ",(0,s.jsx)(n.strong,{children:"Addons"}),", select an Addon. For details, refer to the ",(0,s.jsx)(n.a,{href:"#addons",children:"Addons"})," section of this guide."]}),"\n",(0,s.jsxs)(n.li,{children:["Under conversation settings, type your text (prompt) in the chat box and click the ",(0,s.jsx)(n.strong,{children:"Send"})," icon. The conversation will be created, and your first question will be used as its name."]}),"\n"]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:['The following symbols in the conversation names are prohibited: tab, ":", ";", "/", "", ",", "=", "',", ",'", "%", "&" and will be excluded. Note that you can use the "." symbol at the start or inside a name, but the dot at the end will be automatically removed. The MAX length of the conversation name is limited to 160 symbols. Everything beyond is cut off.']}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"share",children:"Share"}),"\n",(0,s.jsx)(n.p,{children:"You can share a conversation or a folder with several conversations with other users."}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["When someone shared a conversation with you, you can find it in the ",(0,s.jsx)(n.strong,{children:"Shared with me"})," section on the left panel. ",(0,s.jsx)(n.strong,{children:"Important"}),": you cannot change a conversation that has been shared with you. To be able to work with it, ",(0,s.jsx)(n.a,{href:"#duplicate",children:"duplicate it"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["To share a conversation or a folder, click ",(0,s.jsx)(n.strong,{children:"Share"})," in the contextual menu and copy the link. After someone has opened your link, an arrow icon appears near its name and this conversation can be found when ",(0,s.jsx)(n.strong,{children:"Shared by me"})," checkbox is selected in the ",(0,s.jsx)(n.strong,{children:"Search"})," menu."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(299).Z+"",width:"251",height:"341"})}),"\n",(0,s.jsx)(n.p,{children:"When you share a folder, all folders and conversations in this folders will be shared."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(1563).Z+"",width:"351",height:"428"})}),"\n",(0,s.jsx)(n.h3,{id:"unshare",children:"Unshare"}),"\n",(0,s.jsxs)(n.p,{children:["To revoke access from all users, click ",(0,s.jsx)(n.strong,{children:"Unshare"})," in the contextual menu and then confirm action in the dialog window."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(5498).Z+"",width:"414",height:"405"})}),"\n",(0,s.jsx)(n.h3,{id:"duplicate",children:"Duplicate"}),"\n",(0,s.jsxs)(n.p,{children:["You can duplicate a conversation, for example, to be able to change a conversation that was shared with you. To duplicate a conversation, click ",(0,s.jsx)(n.strong,{children:"Duplicate"})," in the contextual menu."]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"This feature is available only for conversations shared with you."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(1319).Z+"",width:"389",height:"326"})}),"\n",(0,s.jsx)(n.h3,{id:"export",children:"Export"}),"\n",(0,s.jsx)(n.p,{children:"You can export selected conversations with or without attachments or all conversations without attachments in a JSON format."}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:'Exported conversations are named by the following pattern: prefix "epam_ai_dial_chat", then "with_attachments" if the conversation was exported with attachments, then "month_day". However, the naming convention is configurable in the chat config.'}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(5603).Z+"",width:"512",height:"469"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Export a single conversation with attachments"})}),"\n",(0,s.jsx)(n.p,{children:"To export a single conversation:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["On the left panel, in the conversation contextual menu, point to ",(0,s.jsx)(n.strong,{children:"Export"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"With attachments"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["The conversation will be exported as a ",(0,s.jsx)(n.strong,{children:"ZIP"})," archive."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Export a single conversation without attachments"})}),"\n",(0,s.jsx)(n.p,{children:"To export a single conversation:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["On the left panel, in the conversation contextual menu, point to ",(0,s.jsx)(n.strong,{children:"Export"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"Without attachments"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["The conversation will be exported as a ",(0,s.jsx)(n.strong,{children:"JSON"})," file."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Export all conversations"})}),"\n",(0,s.jsxs)(n.p,{children:["To export all conversations, at the bottom of the left panel, click the ",(0,s.jsx)(n.strong,{children:"Export conversations"})," icon."]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"Conversations will be exported without attachments."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(2547).Z+"",width:"245",height:"110"})}),"\n",(0,s.jsx)(n.h3,{id:"import",children:"Import"}),"\n",(0,s.jsx)(n.p,{children:"Exported conversations can be imported."}),"\n",(0,s.jsxs)(n.p,{children:["To import JSON or a zip file with conversations, click the ",(0,s.jsx)(n.strong,{children:"Import conversations"})," icon at the bottom of the left panel and then select a file with conversations."]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"When you import a conversation with attachments, the attachments will be available in the Imports folder."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(5764).Z+"",width:"247",height:"87"})}),"\n",(0,s.jsx)(n.h3,{id:"delete",children:"Delete"}),"\n",(0,s.jsx)(n.p,{children:"You can delete a single conversation or all conversations."}),"\n",(0,s.jsxs)(n.p,{children:["To delete a single conversation, on the left panel, in the conversation contextual menu, select ",(0,s.jsx)(n.strong,{children:"Delete"})," and confirm your action."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(3299).Z+"",width:"422",height:"822"})}),"\n",(0,s.jsxs)(n.p,{children:["To delete all conversations, at the bottom of the left panel, click the ",(0,s.jsx)(n.strong,{children:"Delete conversations"})," icon."]}),"\n",(0,s.jsx)(n.h3,{id:"replay",children:"Replay"}),"\n",(0,s.jsxs)(n.p,{children:["You can use ",(0,s.jsx)(n.strong,{children:"Replay"})," to reproduce conversations but with different settings (e.g. a different model). A replayed conversation can be used to compare responses to the same questions from different models and with different settings of the conversation."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(1198).Z+"",width:"377",height:"348"})}),"\n",(0,s.jsxs)(n.p,{children:["Use ",(0,s.jsx)(n.strong,{children:"Replay as is"})," to reproduce the conversation with the original settings."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(3903).Z+"",width:"513",height:"140"})}),"\n",(0,s.jsx)(n.p,{children:"To replay a conversation:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"Replay"})," in the conversation menu."]}),"\n",(0,s.jsxs)(n.li,{children:["Select ",(0,s.jsx)(n.strong,{children:"Replay as is"})," in ",(0,s.jsx)(n.strong,{children:"More info"})," in the Replay settings to reproduce the conversation with the original settings or change the conversation settings."]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"Start replay"}),"."]}),"\n",(0,s.jsx)(n.li,{children:"In the process of replaying, you can stop and resume the replay process."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["The replayed conversation is displayed as a new conversation with the ",(0,s.jsx)(n.code,{children:"[Replay]"})," tag in the list of your conversations."]}),"\n",(0,s.jsx)(n.h3,{id:"playback",children:"Playback"}),"\n",(0,s.jsx)(n.p,{children:"The Playback mode can be used to simulate the current conversation without any engagement with models. This mode accurately reproduces the conversation like a recording. It should be noted that this differs from the Replay mode, where the prompts are resubmitted to the chosen model and the outcomes may differ from the initial conversation."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(6430).Z+"",width:"368",height:"303"})}),"\n",(0,s.jsx)(n.p,{children:"During the playback, you can manually stop and resume the playback process."}),"\n",(0,s.jsx)(n.h3,{id:"compare",children:"Compare"}),"\n",(0,s.jsx)(n.p,{children:"Use the Compare mode to compare two new (or two existing) conversations with different setting (e.g. different models or temperature)."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(4171).Z+"",width:"1656",height:"949"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsxs)(n.strong,{children:["To compare two ",(0,s.jsx)(n.strong,{children:"new"})," conversations"]}),":"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Click the ",(0,s.jsx)(n.strong,{children:"Compare"})," icon at the bottom of the left panel."]}),"\n",(0,s.jsx)(n.li,{children:"Choose settings of the first conversations."}),"\n",(0,s.jsx)(n.li,{children:"Choose settings of the second conversation."}),"\n",(0,s.jsx)(n.li,{children:"Type your question (prompt) in the chat box."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"As you can see on the picture above, the system creates two conversations with the same name but adds numbers to them. If you have chosen different language models, the conversations icons on the left panel will differ."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"You can also compare two existing conversations"}),":"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(1831).Z+"",width:"1665",height:"516"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"The Compare mode works only with conversations with the same amount of prompts from a user. The application will not allow comparing two conversations with different amounts of prompts."}),"\n"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["On the left panel, in the conversation menu of a conversation, select ",(0,s.jsx)(n.strong,{children:"Compare"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["In the main section, under ",(0,s.jsx)(n.strong,{children:"Select conversation to compare with"}),", select the second conversation from the drop box."]}),"\n",(0,s.jsxs)(n.li,{children:["By default, only conversations with the same name are available in the drop box. Select ",(0,s.jsx)(n.strong,{children:"Show all conversations"})," to see the full list of conversations."]}),"\n",(0,s.jsx)(n.li,{children:"Type your question (prompt) in the chat box."}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"manage-attachments",children:"Manage Attachments"}),"\n",(0,s.jsxs)(n.p,{children:["To manage all attachments, click the ",(0,s.jsx)(n.strong,{children:"Attachments"})," icon at the bottom of the left panel."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(1304).Z+"",width:"361",height:"80"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"To Upload a file:"})}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["In the Manage attachments dialog, select ",(0,s.jsx)(n.strong,{children:"Upload from device"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Select one or several files you want to upload and click ",(0,s.jsx)(n.strong,{children:"Open"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Under ",(0,s.jsx)(n.strong,{children:"Upload to"}),", select ",(0,s.jsx)(n.strong,{children:"Change"})," to pick a folder, in which the files will be uploaded."]}),"\n",(0,s.jsxs)(n.li,{children:["Under ",(0,s.jsx)(n.strong,{children:"Files"}),', change file names or delete files, if necessary. The following symbols in the file names are prohibited: tab, ":", ";", "/", "", ",", "=", "',", ",'", "%", "&". Note that you can use the "." symbol at the start or inside a name, but the dot at the end will be automatically removed.']}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"Upload and attach files"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(967).Z+"",width:"507",height:"576"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"To Download Attachments"}),":"]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"Click a folder to expand it."}),"\n"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"In the Manage attachments dialog, point to a file and select it. You can select several files."}),"\n",(0,s.jsxs)(n.li,{children:["Click the ",(0,s.jsx)(n.strong,{children:"Download"})," icon below the files tree."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"To Delete Attachments"}),":"]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"You won't be able to preview or download a deleted file in a conversation, but you still will see its name."}),"\n"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"In the Manage attachments dialog, point to a file and select it. You can select several files."}),"\n",(0,s.jsxs)(n.li,{children:["Click the ",(0,s.jsx)(n.strong,{children:"Delete"})," icon below the files tree."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"prompts",children:"Prompts"}),"\n",(0,s.jsx)(n.p,{children:"A prompt is an instruction, a question, or a message that a user provides to a language model to receive an answer. Prompts can also contain constraints or requirements. They help the model understand the task at hand and the types of responses that are expected.\nYou can use prompts as templates for your messages, instructions to the model, or to encourage the model to generate specific types of content.\nIn AI DIAL, you can create prompts beforehand and reuse them in one or several conversations."}),"\n",(0,s.jsxs)(n.p,{children:["Prompts can be applied to one message or a whole conversation. Refer to the ",(0,s.jsx)(n.a,{href:"#system-prompt",children:"System prompt"})," section of this guide for details."]}),"\n",(0,s.jsx)(n.p,{children:"The section with your prompts is located in the right-hand area of the screen. In this section, you can work with saved prompts: create new templates, update them, and organize them with folders."}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"All your prompts are stored on the server, and you can access them from any device you use."}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"actions-1",children:"Actions"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(155).Z+"",width:"393",height:"277"})}),"\n",(0,s.jsx)(n.p,{children:"You can perform various actions with your prompts:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Edit"}),": select a prompt on the right panel to invoke the Edit window. Make all necessary changes and click ",(0,s.jsx)(n.strong,{children:"Save"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Export"}),": right-click a prompt on the right panel and select ",(0,s.jsx)(n.strong,{children:"Export"}),". The prompt will be exported as JSON."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Move to"}),": use to place a prompt in a folder."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Delete"}),": right-click a prompt on the right panel and select ",(0,s.jsx)(n.strong,{children:"Delete"}),", then confirm the action."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Delete all prompts"}),": click the ",(0,s.jsx)(n.strong,{children:"Delete all"})," icon at the bottom of the right panel and confirm your action."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Export all prompts"}),": click the ",(0,s.jsx)(n.strong,{children:"Export prompts"})," icon at the bottom of the right panel. All your prompts will be exported as JSON."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Import"}),": click the ",(0,s.jsx)(n.strong,{children:"Import prompts"})," icon at the bottom of the right panel and then select a JSON file with prompts."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Share"}),": use to share a prompt or a folder with several prompts with other users."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Unshare"}),": use to revoke access to shared prompts."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"arrange-1",children:"Arrange"}),"\n",(0,s.jsx)(n.p,{children:"You can gather your prompts in folders."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(7176).Z+"",width:"274",height:"169"})}),"\n",(0,s.jsxs)(n.p,{children:["You can create a hierarchy of folders with three nesting levels. Just create a folder and drag-n-drop it in the other folder to create a nesting level.\nThe same way, you can either drag-n-drop a prompt into a folder or use ",(0,s.jsx)(n.strong,{children:"Move to"})," in the context menu of a prompt to place it in one of the folders."]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"After refreshing the page or logging in again, any empty folders will be deleted."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:['The following symbols in the folders names are prohibited: tab, ":", ";", "/", "", ",", "=", "',", ",'", "%", "&". Note that you can use the "." symbol at the start or inside a name, but the dot at the end will be automatically removed. The MAX length of the folder name is limited to 160 symbols. Everything beyond is cut off.']}),"\n",(0,s.jsx)(n.h3,{id:"search-and-filter-1",children:"Search and Filter"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(3115).Z+"",width:"255",height:"251"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.strong,{children:"Search"})," box can be utilized to find prompts and folders by their names."]}),"\n",(0,s.jsxs)(n.p,{children:['You can filter prompts by the "Shared by me" criterion. To do so, click the ',(0,s.jsx)(n.strong,{children:"Filter"})," icon and select ",(0,s.jsx)(n.strong,{children:"Shared by me"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"create-1",children:"Create"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(6331).Z+"",width:"1912",height:"943"})}),"\n",(0,s.jsx)(n.p,{children:"To create a new prompt:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["On the right panel, select ",(0,s.jsx)(n.strong,{children:"New prompt"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Fill in the ",(0,s.jsx)(n.strong,{children:"Name"}),", ",(0,s.jsx)(n.strong,{children:"Description"}),", and ",(0,s.jsx)(n.strong,{children:"Prompt"}),' boxes. The following symbols in the prompt names are prohibited: tab, ":", ";", "/", "", ",", "=", "',", ",'", "%", "&". Note that you can use the "." symbol at the start or inside a name, but the dot at the end will be automatically removed. The MAX length of the prompt name is limited to 160 symbols. Everything beyond is cut off.']}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"Save"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Name"})," and ",(0,s.jsx)(n.strong,{children:"Description"})," aren\u2019t used as instructions for a language model. They only help you to distinguish the prompt from others. The language model will only use instructions from the ",(0,s.jsx)(n.strong,{children:"Prompt"})," box."]}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"variables",children:"Variables"}),"\n",(0,s.jsxs)(n.p,{children:["You can use prompts as templates for your messages to a language model. For example, you need to calculate an equation ",(0,s.jsx)(n.code,{children:"a + c/d"}),", round up the answer, and then divide it by 4. Let\u2019s imagine that you need results for four sets of ",(0,s.jsx)(n.code,{children:"a"}),", ",(0,s.jsx)(n.code,{children:"c"}),", and ",(0,s.jsx)(n.code,{children:"d"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"In that case you can create the following prompt:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(848).Z+"",width:"1241",height:"775"})}),"\n",(0,s.jsxs)(n.p,{children:["Here, ",(0,s.jsx)(n.code,{children:"a"}),", ",(0,s.jsx)(n.code,{children:"c"}),", and ",(0,s.jsx)(n.code,{children:"d"})," are variables. In the prompt body, they are denoted by double curly brackets: ",(0,s.jsx)(n.code,{children:"{{ }}"}),"."]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"You can combine mathematical expressions and natural language in your prompts."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["After you\u2019ve created the prompt, you can use it by typing a slash ",(0,s.jsx)(n.code,{children:"/"})," in the chat box and selecting the name of a prompt (it is ",(0,s.jsx)(n.strong,{children:"Math"})," in our example). You\u2019ll see the following form where you can enter any numbers:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(9555).Z+"",width:"967",height:"775"})}),"\n",(0,s.jsx)(n.p,{children:"When you submit the form, your message will look like on the illustration below:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(1003).Z+"",width:"972",height:"116"})}),"\n",(0,s.jsx)(n.p,{children:"Send the message to the model, and it will generate an answer using both mathematical and natural language instructions:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(3064).Z+"",width:"804",height:"727"})}),"\n",(0,s.jsxs)(n.p,{children:["Generally, variables can be anything, not only numbers. For example, you can create a prompt with the following body: ",(0,s.jsx)(n.code,{children:"Who played {{character}} in {{movie}}? or What is a Latin name of {{plant common name}}?"})]}),"\n",(0,s.jsx)(n.h3,{id:"share-1",children:"Share"}),"\n",(0,s.jsx)(n.p,{children:"You can share a prompt or a folder with several prompts with other users."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"To Receive a Shared Prompt"}),":"]}),"\n",(0,s.jsx)(n.p,{children:"To obtain a prompt from someone else (receive a shared prompt), you must get a link from them. By clicking on this link, you will import the prompt into your chat."}),"\n",(0,s.jsxs)(n.p,{children:["When someone shares a prompt with you, you can find it in the ",(0,s.jsx)(n.strong,{children:"Shared with me"})," section on the right panel. ",(0,s.jsx)(n.strong,{children:"Important"}),": you cannot change a prompt that has been shared with you. To be able to work with it, ",(0,s.jsx)(n.a,{href:"#duplicate-1",children:"duplicate it"}),". When you receive a shared prompt, a pop-up window opens up, where you can preview a prompt and duplicate it if needed."]}),"\n",(0,s.jsx)(n.p,{children:"You can always view prompts that have been shared with you in a dedicated section and perform various actions on them such as"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(4091).Z+"",width:"258",height:"200"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"View: opens a pop-up window with a prompt preview."}),"\n",(0,s.jsx)(n.li,{children:"Duplicate: use to duplicate a shared with you prompt to be able to modify it."}),"\n",(0,s.jsx)(n.li,{children:"Delete: remove from the list."}),"\n",(0,s.jsx)(n.li,{children:"Export: download in a JSON format."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"To Share a Prompt"}),":"]}),"\n",(0,s.jsxs)(n.p,{children:["To share a prompt or a folder, click ",(0,s.jsx)(n.strong,{children:"Share"})," in the contextual menu and copy the link. After someone has opened your link, an arrow icon appears near its name and this prompt can be found when ",(0,s.jsx)(n.strong,{children:"Shared by me"})," checkbox is selected in the ",(0,s.jsx)(n.strong,{children:"Search"})," menu."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(3626).Z+"",width:"135",height:"34"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"When you share a folder, all folders and prompts in this folders will be shared."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(3845).Z+"",width:"255",height:"361"})}),"\n",(0,s.jsx)(n.h3,{id:"unshare-1",children:"Unshare"}),"\n",(0,s.jsxs)(n.p,{children:["To revoke access from all users, click ",(0,s.jsx)(n.strong,{children:"Unshare"})," in the contextual menu and then confirm actions in the dialog window."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(1254).Z+"",width:"258",height:"370"})}),"\n",(0,s.jsx)(n.h3,{id:"duplicate-1",children:"Duplicate"}),"\n",(0,s.jsxs)(n.p,{children:["You can duplicate a prompt, for example, to be able to change a prompt that was shared with you. To duplicate a prompt, click ",(0,s.jsx)(n.strong,{children:"Duplicate"})," in the contextual menu."]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"You can duplicate only prompt shared with you."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(2035).Z+"",width:"260",height:"313"})}),"\n",(0,s.jsx)(n.h2,{id:"chat-settings",children:"Chat Settings"}),"\n",(0,s.jsx)(n.p,{children:"In the Chat Settings section, there are the following components:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Talk To"}),"\n",(0,s.jsx)(n.li,{children:"System Prompt"}),"\n",(0,s.jsx)(n.li,{children:"Temperature"}),"\n",(0,s.jsx)(n.li,{children:"Addons"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Take a closer look at each of these elements."}),"\n",(0,s.jsx)(n.h3,{id:"talk-to",children:"Talk To"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(3565).Z+"",width:"1920",height:"891"})}),"\n",(0,s.jsx)(n.p,{children:"In this section, you can choose the language model for communication, as well as an Assistant or Application to implement specific behavior for the LLM."}),"\n",(0,s.jsx)(n.h3,{id:"language-models",children:"Language Models"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(5237).Z+"",width:"1399",height:"945"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Available language models"}),":"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"GPT-3.5"})," is an advanced language model developed by OpenAI, known for its powerful natural language processing, understanding, and context awareness. Enabling human-like conversations, it can carry out various tasks, including summarizing, translation, content creation, and answering queries."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"GPT-4"})," is the latest iteration of the GTP series by OpenAI, offering more powerful natural language processing capabilities than its previous versions. It harnesses extensive training and massive datasets to deliver lifelike conversations, unsurpassed context awareness, and high-quality content generation across multiple languages and domains."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"GPT-4-32K"})," is the extension for GTP-4 that can possess a larger context window size (32,000 tokens). It offers several advantages, including a better understanding of context, improved performance in long-form tasks, enhanced reasoning and knowledge handling, and increased creativity in content generation. Please only use this one if you absolutely need it. It's slower and more expensive."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"PaLM2 (Bison)"})," is an LLM developed by Google that leverages an innovative hierarchical architecture to enhance its linguistic competence and computational efficiency. By employing parallel and multitask learning mechanisms, PaLM2 (Bison) provides exceptional performance in diverse language tasks, like question-answering, summarization, and translation, while also being highly scalable and adaptive to new environments."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"AI21 (Jurassic-2 Grande)"})," is a large-scale language model with 178 billion parameters developed by AI21 Labs. It is an upgraded version of its predecessor AI21 Jurassic-1 and is capable of processing extensive amounts of text and generating contextually appropriate replies. The model's distinguishing features include its scale, contextual understanding, multilingualism, few-shot learning, and knowledge integration with external sources. It is designed to enhance natural language processing, chatbots, virtual assistants, and other applications requiring advanced language capabilities."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"AI21 (Jurassic-2 Jumbo)"})," is an expansion of the AI21 Jurassic-2 Grande model, leveraging improved training techniques, larger datasets, and advanced hardware resources. Jumbo provides a boost in performance and is specifically designed for challenging natural language applications such as sentiment analysis, language translation, and document summarization. AI21 Jurassic-2 Jumbo has 199 billion parameters, making it the largest publicly available language model to date."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"CodeLlama-34b"})," is a language model developed by AI21 that has 34 billion parameters. CodeLlama-34b is specifically designed for use in software development and is trained on a diverse set of technical documentation, including programming languages, code samples, and developer forums. The model is optimized for code-related natural language queries, including code completion, code understanding, and code generation."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"Llama2q-70B"})," is an LLM developed by AI21, which has 70 billion parameters. Like CodeLlama-34b, it is designed for technical applications but with a broader scope. Llama2q-70B has a wide range of capabilities, including question answering, text classification, and summarization. It is trained on a variety of sources, including technical documents, academic papers, and news articles, and is designed to provide accurate results for a wide range of technical queries and applications."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"Anthropic (Claude)"})," is a large-scale LLM with 175 billion parameters that is optimized for general-purpose language tasks, including question answering, dialogue generation, and text completion. The model has been trained on data from a wide range of sources to provide high accuracy in many contexts."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"Anthropic (Claude Instant)"})," is an LLM that can generate responses in real-time, making it useful for applications such as chatbots and virtual assistants. It is a smaller model than the Anthropic (Claude) model, with 9 billion parameters, and is optimized for low-latency inference."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"Anthropic (Claude V2)"})," is an upgraded version of the Anthropic (Claude) model, with 400 billion parameters, making it one of the largest language models to date. This model is designed for sophisticated NLP applications involving complex reasoning, inference, and understanding of long-form text data."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"AWS (Titan)"}),": AWS (Amazon Web Services) developed an LLM called Titan in 2021, which has 850 billion parameters, making it the largest publicly available language model at the time of its introduction. The model was trained on a diverse set of text sources, including web pages, books, and news articles. Titan is designed to handle complex natural language processing tasks, such as summarization, dialogue generation, and translation."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"assistants",children:"Assistants"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(9229).Z+"",width:"771",height:"292"})}),"\n",(0,s.jsx)(n.p,{children:"In the AI DIAL framework, Assistants are a combination of preselected Addons and System Prompts that enable specific behavior in the LLM, allowing for more tailored and adaptive responses to user needs. Unlike the Model+Addon configuration, where users have the flexibility to choose different Addons, Assistants come with predetermined Addons that cannot be removed or unselected. However, the Model can still be reassigned within the Assistant."}),"\n",(0,s.jsx)(n.p,{children:"Assistants give you more control over LLM behavior, resulting in tailored and accurate responses that match specific needs. The flexibility of this combination lets you create custom Assistants within the AI DIAL framework. These Assistants can range from simple tasks, like asking the LLM to provide answers in a specific tone or style (e.g., like a pirate), to more complex tasks, such as restricting the LLM's data to a specific geographical area (e.g., providing weather forecasts for Chicago only). Combining Addons and System Prompts enables better customization and adaptability to various situations, leading to more versatile responses."}),"\n",(0,s.jsx)(n.p,{children:"In a chat application, you can include custom Assistant(s) that users can choose when using AI DIAL."}),"\n",(0,s.jsx)(n.h3,{id:"applications",children:"Applications"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(1036).Z+"",width:"1414",height:"936"})}),"\n",(0,s.jsx)(n.p,{children:"In the AI DIAL framework, Applications are ready-to-use solutions made up of predefined configurations of Addons and other services or any custom logic. They help you customize LLM behavior by integrating Addons with any desired logic. Applications can be any component that meets API requirements and implements non-LLM-related logic, such as repeating user messages, creating a fully deterministic chatbot, or managing complex multi-LLM interactions. This versatility in Applications allows for tailored handling of unique scenarios and requirements."}),"\n",(0,s.jsx)(n.h3,{id:"system-prompt",children:"System Prompt"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(9180).Z+"",width:"1912",height:"580"})}),"\n",(0,s.jsxs)(n.p,{children:["The system prompt in AI DIAL refers to the initial instructions given to the model. You can use any previously created prompt as a system prompt (for details, refer to the ",(0,s.jsx)(n.a,{href:"#create",children:"Create"})," in Prompts), and it will set the context and tone for the whole conversation."]}),"\n",(0,s.jsx)(n.p,{children:"The system prompt in AI DIAL is like a compass for a traveler, pointing the model in the right direction to navigate the conversational landscape, ensuring it stays on course and aligned with the overall purpose and desired outcome."}),"\n",(0,s.jsxs)(n.p,{children:["You can change system prompts during a conversation by selecting the ",(0,s.jsx)(n.strong,{children:"Settings"})," icon at the top bar of the conversation."]}),"\n",(0,s.jsx)(n.h4,{id:"example",children:"Example"}),"\n",(0,s.jsxs)(n.p,{children:["Let\u2019s compare a conversation with a system prompt selected and a conversation without a system prompt. For illustration purposes, we\u2019re going to use the compare mode (refer to the ",(0,s.jsx)(n.a,{href:"#compare",children:"Compare"})," section for details) and create two conversations with identical settings except for the system prompt selection."]}),"\n",(0,s.jsx)(n.p,{children:"The prompt used as a system prompt is as follows:"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"Let's play a game. Name a city that starts with the last letter of the one that I named in a previous message and then tell me that it is my turn to name a city."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(9855).Z+"",width:"1920",height:"891"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(5937).Z+"",width:"1383",height:"714"})}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:(0,s.jsx)(n.strong,{children:"User message"})}),(0,s.jsx)(n.th,{children:(0,s.jsx)(n.strong,{children:"Language model response without a system prompt"})}),(0,s.jsx)(n.th,{children:(0,s.jsx)(n.strong,{children:"Language model response with a system prompt"})})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Grodno"}),(0,s.jsx)(n.td,{children:"Grodno, also known as Hrodna, is a city in western Belarus, near the borders with Poland and Lithuania. It is the administrative center of Grodno region and has a population of around 365,000 people. Grodno is one of the oldest cities in Belarus, dating back to the 11th century. The city boasts a rich history and diverse architectural styles, including baroque, classicism, and modernism."}),(0,s.jsx)(n.td,{children:"Oslo. It's your turn!"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Osaka"}),(0,s.jsx)(n.td,{children:"Osaka is a large port city and commercial center on the Japanese island of Honshu. It's known for its modern architecture, nightlife, and hearty street food. One of Osaka's most popular tourist destinations is the bustling urban area of Dotonbori, where the city's entertainment and dining scenes come to life with numerous restaurants, bars, and shops."}),(0,s.jsx)(n.td,{children:"Ankara. Now it's your turn to name a city!"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Antwerp"}),(0,s.jsx)(n.td,{children:"Antwerp is a city in Belgium, and it's the country\u2019s biggest port. It is located on the River Scheldt, linked to the North Sea by the Westerschelde estuary. Known for its many historical buildings, squares, museums, and cultural attractions, it's a popular tourist destination."}),(0,s.jsx)(n.td,{children:"Prague. Your turn to name a city!"})]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"temperature",children:"Temperature"}),"\n",(0,s.jsx)(n.p,{children:"The temperature parameter controls the creativity and randomness of the model's output. A higher temperature (e.g., 1.0) makes the output more diverse and creative, while a lower temperature (e.g., 0.1) makes the output more focused and deterministic."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(9402).Z+"",width:"1912",height:"580"})}),"\n",(0,s.jsx)(n.p,{children:"Adjusting the temperature allows you to balance creativity and consistency in the generated response."}),"\n",(0,s.jsx)(n.h3,{id:"addons",children:"Addons"}),"\n",(0,s.jsx)(n.p,{children:"You may want LLM to access particular data or technology to generate responses. This could be your company's database, a collection of PDF documents, calculation engines, API or any other data source or technology.\nWithin the AI DIAL framework, an Addon is a service or any component that follows the Open API specification. LLMs can access and use any desired data source or technology to create responses."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(4185).Z+"",width:"983",height:"524"})}),"\n",(0,s.jsx)(n.p,{children:"Some examples of Addon implementation are semantic search, Q&A search, DB query generator, or any other custom logic that meets your business needs. AI DIAL can include custom Addons that you can choose to activate a specific system behavior."}),"\n",(0,s.jsx)(n.h3,{id:"isolated-view-mode",children:"Isolated View Mode"}),"\n",(0,s.jsxs)(n.p,{children:["In the Isolated View Mode, a user can follow a specific URL ",(0,s.jsx)(n.code,{children:"https://server/models/modelID"})," or ",(0,s.jsx)(n.code,{children:"https://server/models/applicationID"})," to use the AI DIAL Chat in a simplified view with minimal configuration settings for a selected model or application. Conversation settings, conversation and prompt panels are not shown in this case. All created conversations are saved and displayed in the regular chat view mode as well (when just created, names of such conversations are appended in the regular view mode with an ",(0,s.jsx)(n.code,{children:"isolated"})," prefix in the beginning. e.g. ",(0,s.jsx)(n.code,{children:"isolated_dial-rag"}),")."]}),"\n",(0,s.jsxs)(n.p,{children:["For instance, if a user wants to open GPT-4 without any extra features or configurations, they can simply go to ",(0,s.jsx)(n.code,{children:"https://AI DIAL Chat URL/models/gpt-4"})," and access a streamlined user interface that only contains a chat input with GPT-4:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(5311).Z+"",width:"1338",height:"455"})}),"\n",(0,s.jsx)(n.h2,{id:"user-settings",children:"User Settings"}),"\n",(0,s.jsx)(n.p,{children:"On the top bar, in the user area, you can click a down arrow to access additional settings or logout."}),"\n",(0,s.jsx)(n.p,{children:"You can select the chat theme, dark or light, add a custom logo, and switch on a full width chat mode."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(3578).Z+"",width:"1910",height:"679"})}),"\n",(0,s.jsx)(n.h2,{id:"data-visualization",children:"Data Visualization"}),"\n",(0,s.jsxs)(n.p,{children:["AI DIAL Chat enables data visualization for specific data types using data visualizers. It comes with built-in support for the ",(0,s.jsx)(n.a,{href:"#plotly",children:"Plotly data visualizer"}),". To link any other custom visualizers, you can use the ",(0,s.jsx)(n.a,{href:"https://github.com/epam/ai-dial-chat/blob/development/libs/chat-visualizer-connector/README.md",children:"DIAL Chat Visualizer Connector"})," library."]}),"\n",(0,s.jsx)(n.h3,{id:"plotly",children:"Plotly"}),"\n",(0,s.jsx)(n.p,{children:"Plotly is an open-source JavaScript library that enables the creation of diverse data visualizations, including charts, 3D graphs, and more."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(2198).Z+"",width:"1912",height:"813"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["Refer to ",(0,s.jsx)(n.a,{href:"https://plotly.com/",children:"Plotly"})," to learn more."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"AI DIAL Chat integrates with Plotly, offering robust data visualization capabilities. To utilize Plotly, choose an AI DIAL application that supports this feature. These applications must be capable of querying data (either from a URL or directly from the Chat application) based on user input and returning it in a format compatible with Plotly. Chat automatically detects attachments in this format and uses Plotly to visualize the data."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:t(6536).Z+"",width:"721",height:"775"})}),"\n",(0,s.jsx)(n.p,{children:"The visualizations come with standard Plotly controls for easy manipulation."}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["Refer to ",(0,s.jsx)(n.a,{href:"https://github.com/plotly/react-plotly.js",children:"Plotly GitHub"})," to learn more."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},3299:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/Delete_conv-a4ad2f554e80d9e8beb4ad9592d4bf13.png"},848:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/Prompt_example_math_edit_window-0c9e0cf4b5e706e8c777da1c10249a8b.png"},9555:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/Prompt_example_math_enter_variables-75f9d1be8618f9c42e6a1b8e69c54842.png"},3064:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/Prompt_example_math_response-8af03a748626eae59a3ca38522dd0601.png"},1003:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/Prompt_example_math_resulting_message-280e6af59bea553b1b25c7efa28020b8.png"},3903:(e,n,t)=>{t.d(n,{Z:()=>s});const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgEAAACMCAYAAADlV3pOAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnMAABJzAYwiuQcAACZ7SURBVHhe7Z3/U5xJft/zRyjlFKlLnJLPjlQXa9eV5LyXyt6Vt3bjrBVVShXis0zZKqvKG1uhclZWdVZWWXZFDgyno1jkkUYrZgnsyJk6jQIZFnQTcAaNJZAACbEITiMhgRYYA2ZutGhrf/3k0/18mX6ep2eeAQYJ6Xn/8CqYp5/up/vT/fTn3V+e5/l7T7/6mgAAAAAQPCACAAAAgIACEQAAAAAEFIgAAAAAIKBABAAAAAABBSIAAAAACCgQAQAAAEBAgQgAAAAAAgpEAAAAABBQIAIAAACAgAIRAAAAAAQUiAAAAAAgoEAEbIC17AotrerDAAAAgBeNioiAmUQTtbRG6OqCPtzgASVa+bzOEVrShj8Dskk68dpeOvDxXX14MRZS9MHBvbSrajftqo7QjO4cAAAA4AWjIiLgahM7R3aQ1Z0PtOGSsVb6rnCiR6L0SBf+LMjdolDtITrR/4U+vAg3zrxOu75/jiZy/PtLbzgAAADwIlJREbDrjVa6oQl/+lWekh+aI+nnKQI2iSxf04g2DAAAAHhRqZwI+OFJOrFvL30wmPeesxCno1X76dgPD3lFwMIIRZveoQPV++nAkVpq6b7lXC64cY7DztGN7Ai1v3uI/z9OiTl93FD/A1pT43oYoRCfG7ph/rbSXr1Ll6x0ak/RpdsrRvhcgk7wsbde4/K99qYRfk4RA355BwAAAHYwlRMBTSm60fo67aqNexzhTOdB2vX9CCVjh50iIBOlIywcDrwXocRgipLdrVTDDvctHnXbzvzaKdpVdZCq/3A/HT0XpySfN5MtM66HEWqs2k2N18zfMu3DdKT2EH0QS3LaSWr/4Zvyeu3THJ57QDc47dAPuHw/OCevnfzcFAibuj4AAACwc6igCOAR8nSEqi0HaoffopY3dtPR7hV65BABK3SpdjfteT/pdJrsXGuqXqeWMfO3dNSv0wdX1RmGFUq8u9frcLXXV9GJAHfadylUvZsOfFLYPOhdDigz7wAAAMAOprIiwHSO3229ZYetDZ6kPftOUjL3tVME5JJ0ompvwSHbCAfPDvYnptOVjvoUXVXPkXH3a5z9XWpnB34sYY7WPehEgJE39Ty30/eIgHLzDgAAAOxgKiwCnE7fLQocImBWjJoPU3TWmZbA4XR1IkDG5XOKUBMrtvtfJwJcaTO+IqDcvAMAAAA7mIqLAHX63z097xABc3E6oh3Nc3o/UtLTOWoZ9xBFM8qxsqiQCCg37wAAAMAOZhtEQGEjYNS1UdC5J8CYuve+W8AQEfaUvtZRK0LDcXyFHmU0TyfYVEgElJt3AAAAYAezLSLAeCSQj1U5Hxl0ioCvaSlRS3v2HaSWa6bTzD2gxIdv0q63m+iGtU5fxFFbcRsHzccCv1yhG58c5mO1lCj65sJKiYAy8w4AAADsYLZHBFgvB3K9PMgtAgQz3cfpwD4hGAxePdLqfP1wEUctmOk+SdXiGX4z7p6Dxyn6+bOYCTDwzTsAAACwg6mICNg6eVrawsd55Id9sqWc/3aytbwDAAAAz4sdIgIAAAAA8KyBCAAAAAACCkQAAAAAEFAgAgAAAICAAhEAAAAABBSIAAAAACCgQAQAAAAAAQUiAAAAAAgoEAEAAABAQIEIAAAAAAIKRAAAAAAQUCACAAAAgIACEQAAAAAEFIgAAAAAIKBABAAAAAABBSIAAAAACCgQAQAAAEBAgQgAAAAAAgpEAAAAABBQIAIAAACAgAIRAAAAAAQUiAAAAAAgoDwzEfDzzCxd+t8JOnv+E/ofjT+R9P9skPJP1rXnAwAAAGB7qagIeDA7R2fOXpB/rWO9/f+X/n11De2q2q3ll391Hx15p5Zu3f7ckRYAAAAAtpeKioAT/71eOnbx98mXX9Gfv/eh7ey/9RvfoZrD79C7f/4+HT9RR7+9/z/QL33jm3b4P/jGr9Kphh/TL/JfatMGAAAAQGWpqAh45+gx6dB/t+YI/buDvyf//5U9v0Gh8xGtc1/5uxz1JPrpP/7+H9li4Htv7qe1XN5z7kaYSTRRS6uLzjjdmNOfv3UeUIKvkZjWhe1wskk68dpeOvDxXX04AACAl5ZtEQEWv/bP/gXd+Xxae66bRF+S/umv/0sZ7wfv/jftOeVytYmv/8Zh+sAWAafoWM23aU/VK3T00gNtnK0xQo2c78ZrurAdTu4WhWoP0Yn+L/ThAAAAXlq2TQT8/X/4KzR26472vGL8bCBlx7/c85n2nHKQIuBIlB65js9ED9OufScpmXMe3zovsAgAAAAQWLZ1JsDiX//W29rzdRz9L8dlnH/1vd/WhpdDMRHwdDZKNVV7qfGGcmxhhKJN79CB6v104Egthfof0JoS51HiOB14L0GPsrco+v4h47zaU3Tpc3XJQiMC+PxLrbVUI86vPkTHWuM0kTXDrrVSdXUTXXWLkdk4Has+TO2fu46rzKWo/X0zv9Xv0InOFD360ntO6F0zr6JMV0uN8kcoxOeFVJuIvFs24Ws0dt912AQAAMDLQUVFQN2pv/AIAEHVL++h1b/7hTaOm7vT9+x4s4/mtef4UVQEZIQIeJ1axgq/j+zby04+QonBFCW7W6nmtd30VtOI7fQexQ7TruqTdOJP97PDTVJyMMmi4RC9WvUmO31LCLhEwCr/fns37ak5RdF+TncwTi1HXqFd34/QjHX+vt10LLFixjeY6TzI17LO0SDzy/mrPUeXRH77I3Ti4F7a836y4KTlOa9QDYuOpCxTE1VzGU8ki+2z0OVdsQlf4xiXpfoT7BkAAICXjYqKgCdfPqWrfzNCA3991cGDh4Yzz/7tKv2kNUS//4d/LP+K3+40BOJJAiEC2js+1Yb7oRcBK3z8Tdr1RivdMH8n3t3rcPiS6QhVVx2kdnOTnxQBVV4nOvMJO2zVqauOdOEuJToTNKGc/3QhTker9tvp3mh9nXa9m6Al+5wH1P59dradxfcsrM2mKBodUeIwY6303arCEofMr6vsS2MsXjJlioBrp7i8p+iqes7nKbp0G3sGAADgZaOiIsCPvzzXbo/yBaFwRHte7Z/9UIaf/OBH2nA/pAjY921zOtvgLR7h79p3kFrGTGeYS9IJxSkXuEvt1YVRuiECXE5RIGcVDlN0Vvx2OVIXa9kVejR2js9XzpHO+x26tGD+luLDSq88RLoziZOcTiHeUv9x2sPlbBx8QGvuZQItrrzfPkdvVb1Jx2K3aKnieycAAADsJCoqApbYKbWeCdOjOf2o8Q+O/IlDBIjfuvMezj2W6RSbKfBDioDqU8aUuSAqHOW3nXsB5P6AQl7c1MSMMuhG1gYp+oDPM5ynWwTkaaL7FB09KJ5IEOntpd+sOcjOVT3HEBtHuw2xMfPJftpVG3eO8j18QVfP1VLN26+Y+XyF3qrZ7xAB4to3zh2m39xnXvegWNNnh+5Jy8IrYISwqBaiiY+/+vYhOnZOs+8AAADAC09FRcCJk2IqeTf92fH3tOFi5G85WUGxmYCt4l0OMKb+Hcfm4nSk6hBFM9Y5eqQIsJcQFKSIsOI7HelS9zty1qGx/y49WrXiaJyt2AMgHb9z9qEYcgnh7ePUfu1BYZQu86GfQVibu0vJ2CmqFvsIztzyhBt482Wxln1AN7rP0VGxv8GxdAEAAOBloKIiIPI/L0rnLtb0deHuPQF/u2yM9MWeAfc+gr+5fkPuMXCnUQ7aPQFyul1d279FLW8URuIFVuiRsn5uLAcU9ghYGI7eWiZwOlJ5/aYRx/nWzIPD2VoOPBmhA76PLn5B0SOFGQqba6dojyIChOOemXXtX4geKjKbIXCJgNUvaCLjsslVzT4BAAAALzwVFQFfLCzZo/xyXxKU+8UT+ke7v2XHU2n8cas2jh9aEfBVnpIf7uWRdGFUv5SoLayfi2NfrtCNTw7zsVpKmGv1xkzAm3TgSCtdNY8tjUXkLv3CjnmnI5Uj/LdPUsJ6Q+HCLWqvfUUuDThH3Ct0qZZH2fv20p4PUz6P4Rn53/OnEftRw7XZJH0gng5QRIAxW3CKktZeA752iMVD8fSdeTfEDac3be2deECJ9zlNexMkAACAl4WKbwx863fYAbJT+ZPa/6oNdyO+Ivid7/4bjwAQiPcO6OL4oRcBjDkar4kWduDPdBfWvwV7Dh6nqPIOAGtPwMS1Jh6tW+e9QjXn1F367il1dpzv7Tf3AzCvHaSWa0nXOQZCiOxSH1ssxapw6NZ+AM7r92rp0lXXcsDqXYqq164Sj/tx/u1lCTfuvH9BV1vFI5BW/N30qiKAAAAAvDxUXAQM/r+07TyuJP9ae04xxBKAFVewWRGwGcRO+6Wscxpd4NgY+GVebn4sb9c9syrS5PN1YSZryZP6PQclKJZXBznj2pve4W+WdamoeAAAAPCiU3ERIBBfChRO/B9/89flPgHdOW4mp2Zoz75vPzcRUAyHCKg0Xz6g9iOl3w0AAAAAbBfbIgLEVwBff+N3bGde/XuH5dcCxVcD3eeKrwuK9wf8k1/bJ8/9oz+ulbzcIiBPyfcN2+ypaaUbGG0DAAB4DmyLCBAIh/+f/rPzWwK/9I1v0r89UE3HT9TJ2YKaw+/Qt159zQ4/1fBjGffY8ZPyt/jrTveZI6fVfabeN0FZU/oAAADANrJtIsAi+r/i9M+/81u2o9dx8Hf/gPp/NmjHuf/gEX30l+flXzUtAAAAAFSObRcBFvOPF+mnl/8P1Teeph/9RQudPf8Jxbt76d79We35AAAAANhenpkIAAAAAMDOAiIAAAAACCgQAQAAAEBAgQgAAAAAAgpEAAAAABBQIAIAAACAgAIRAAAAAAQUiAAAAAAgoEAEAAAAAAEFIgAAAAAIKBABAAAAQECBCAAAAAACCkQAAAAAEFAgAgAAAICAAhEAAAAABBSIAAAAACCgQAQAAAAAAQUiAAAAAAgoEAEAAABAQIEIAAAAAALK1kVAPkfL2ZWirOX5nPUntJbNUX7dFddiPUuTQ1O0WCz8eWLlXRf2PMixvZefGP/vZLuB50d+gUYT3RSL9dHoY03488CvD3gWPJ6i4fGsPsxDjjLXx+nhqi5sg6j3LCiwofrYIBVMO7/Kvmz1qTasLISPtOp/O8u8SbYuAm7Gqa6xrSjRm3zOo0Fqa+yggUeuuBZTfdTQGKaeKU3Y80bmPU63dWHPgfn+DqoLDdK8+F1Juy1laHR8fueInQCTn52i0ekVbZg/K5SOtFFDJEnDQ+OUyenO2X48ZfDrA54Bmcthqmvpo4wmzEN2mCJNbRQZ2mw9FHDcswHG3SY2VB8bpJJp346yL4tOaMPKQvhIs/63s8ybpbLLAcVu9B3QAWyanSwCKonSULXh4Jkh63jTnc4CDYRM8a0NfzZ4yvAi9wFbBCLAYGvt+vlRSRGgDX/OPFsRMJWhVOwitbV2UWdivDCNnZ2gK7EkTWbN3/kFut3fTefPhCnU0UepqZwzPQsZb5gy2RlKRbuoORyj3pGsMU0u45vXEUsSVhw5VRrnsAt0Ppqk0TnXNE92loYTMQpZeZz1ioDlyTT1dBjX6xmYoeUiU5zLY0mKpTK0OJKkzjCP2G+bYSXy8DDVTVfGsnYcWf7Jgnp2dChuuzGl8pafG6femFm2y4M0aU4Vy3y2X6C60x3UGeum9D0rzlNavJ6kKIe1tcep9/qCc6bAtpVZjiJTzzL9xAQtK8eMchbKtXxvmHpFvs9cpKjaNgS+9pqnzICo74uU1uSh2Dkl63F9hR4OWXUgysZtKmHZZpbSDjsxZlt8aP1mSqZfxHYir51nQ1T30UWKKXVb0j4WMg9xCp1uo5Z2sRxg5Gcz5TficDu83mfYPZamzOrXtHbfyEcbp6+2SxVtGfz6AIlPe3NTol3o7j1PO+Q6nh7oK6OOxf9cjoUsX8/qG9i26lKBmZad96F5WjPDfEWAb5/E/dtl675N07Ryv9v1ZPcXSRq+b/SXou5ig5lCOoKFCe4DUjRt9onF24BZ5lmzviJpWhTHOa9F++YSNtC1CW+/UKL+rftr1cwPt+NYf/GlUEfa5cQtUQeqCBDliKVmC/G+WlHajEF+boIGrOsMZGhNEQEbzlfJNloZnqEICFFD6CI3jHEavZ6m2Jk2amDDykp2xMtS+mNjOnN0mjuuoW5qaeKwWSU9R7odFIrEaeA6p3slRg2NFyj0cRcbX3Od3BTFW7mD5A5tVJzPnWJLU5hi4+Z6zeoERVsK4cMJrpizHdSsiID5gS6qbymUI86jrvrOm3ZjV5E3/0ecnzDfLJxeZomPu/IgrtHcdIF6f27EEQ2uma/ZJqZzlTxGbxo3m6NDcdlb5o1tFZdlH6aesJK3Owm5dBDhzmv6zgwNX+J0WrppMmdO03V3UV1rvJDPr57QZCxM9We4sxf5YIcYEflOmDfA+gzFTVtN35+n21yOhha2k2YNVdcJinK29S8Yv0Xe2AYx7oQe3udOKhKWdSbzXY692MZtnw6yvaZoXjP9rTundD3mOE6Y6tSyh7idcT6METa3E2upy7qOrIsy20kJ2y1Pj7Og5Wt/3MfxzPKUso9Kbp4m+VpRzuf5bnHdjOxs/MvPjp3TrDubsutIxgl1UeTysAzvOcsd4Vn+bbZLUQ8Nunud0ZbBrw/wa29ufO5l3b3nbIcbqWPxP3fCYWe/Uvdx2nRgRp8l0xqboemxFHVy/YaSRvvWtX8bsxzN1v1+Je5o308fpSnE5RL3rdX+G0R/aNpd1hPXixBpIjwVYzHf1EXpBQ4X7eZ0giYVp/IwweHcDoXNS98DRplbznRQtJ+vLZcKS/XNpW2gaxNOu7jq32ofsSmHjwhFzPyK+uL0Gy7NyPTdONL2i+tTB8LGlghQ/zdwzbzxoFGtr1SMr8v9uZWXDeXLt41WhmcoAlxr1z9PFpyrI55ofBfoiuL0l+dYUaqjeQszXfuGYUY/dTWM8W52bkm5BiMrIGzduAZr6Rh3FkljxCRukA6nQ8/08DErn+vcWE4rN6h6TKPM5PVa+yij3ITLfOO5ryGPmTembGScHzWOmkddI5J2k/kIUdyabRDkZliR8oh/Wfyfpcw9dUPKLPVyY4qNm7/dU1YLovOJ0bDq1M1jo3anHqdRO59PaHE2q9345ciziSinJQJk+KfjdpjI6/yC0ZmXZa/IsNchKnjO8avHe0nu3Fxl5/ba4nAKrhvRtEdZ7cTHdtIeSkdTyj5evMsB3vJz/ptcbWWd28NHbdR5zUhXxmG7Gw6a4c6tpZGdiz0KzdIAC4POtD4f7jJY92rRPsCvvVnHTGT6Je5lGe669+Qxqx3q6lgc09ax8X9kSBn1yvJY9nhKa/czjpmBvMgLiyoxenZc14Vsy65yzF/roziPosX/oh4afjplhwlkn1S0/Rv1f35QzNIYdVpoC0od+7VRXZlL9s2lbSB+u9uEwy6mPVNCvJjhT1dvUqdwxvY942o/os9ikTNt/Vbwpl08bjl1UJ4IeEKjnSxMe1ThmqPhDo5j5mUj+fJvo5Xh+e0JkMd0IsBUlK1d1DMwQZm5EjvzNemKSrJHmPY54jpPZGWEkq6dmdk0nZc3sxFu3DxKuNpRif+bL9IVqVQtjJGXrjP03vzGNdpihkq0kaNwQ6jIRsbq15FWjm8Gs8PxNiKz/CJvRW4Im3yOFqcnWFEOUk/sIjcwpTG5RIC8gVmBptV8iqlhS3SZo9n6UJwGhniEWmL3s9cOrnqSsxT8O8oj1Tvcqdidfpn2ctyUXjzn+NSjLLs9yrMwRJPqFBw3otqe/dqJj+2kvdT8FrWPjiIiwF3+pm6atH6bTF/ikbopoD1x1PKZOOrQhacMmntVTdO3vVlxJH73sr7Nqcc2Vsea+pbHnOXJL8/TNOc7leimaJhHcOa1dHkxKNLn2Bj5sYW6hTnCF/e6rv2r9SIHNla4cCAcT84M+PZlujL7983FbCDC3G3CUx+KYDBYkdeT9vFpP4U4Bg6bl4zrVwdOG3vtrd5vor5YXN8pxBXIsunagk+Z/NtoZdiBIoBZX6GH19lRibWqZtHourXTzLp0PR2TfR1j5BIdKZwrWR83b+YiIxs5AjLzKWYVzHXzmAt1fdvCe/Mb1zDWa90Y67ci/80OJSkodDhFG5Ey4+GMa7B2s5s7fk67PU6xy+xMxm5SzxmlMblEwGKSryPX77x5tdej8gs0PWCs4TVw2vXhFM1vYiZAkJ+b4Y5DrMmFqJ47n1BSqPDy7OXuBN14zvGpR1l2dRQsmacrtr00HaTanstpJyVsJ+3lKpPePoXwAmWIAJG/M876EMx/VnAYnjhq+UzcdajiKYPmXlXTLKu92fjdy/o2px7bWB3rHGLhnny6Pk8DYbZXs1HnvQPjNH2lSMfvoEifYzNFMR4JqyNvidIn6dq/o16Ejc3ZFCEI7FkF3zaqKzNTrG/2sYGI624TnvpQZ7tMxMyuLItP+1HjCBw2LxnXrw6cNvbaW73fRH1pROtIoW8tP1/ltNHKsENFgPlXkqNh8ciTbu1Hk66nY1Kuo450bJRR0WTMex2pxqx8Pk5RqDFGwyVHYgV0N7+4htfJF5CNzF3xSh6LNiJzFOSYThNTdPLZbENRhwa8ywF2Y3KJAD9RIVHraT1DPZyeTlGrStg6Zt/c1jE1rak+ajZHdGXZy9UJuvGc41ePsoN0zarI2RjLXho1rorFctpJCdvJOnaXqYh9HOdIyhAByojZPuYaXXviqPeriTinUiKgrPam4Hcv6+49xzHNerlcftA6fh8RoEmr6OjPhSyHa7pfvldAPpeujISVcJm2OWrWtX9nvWQpxc6589qMc5Tq20aLiQD1t9I3+9hA/Ha3CV19OGcylZkQv/bjwpG2T9zSdeC0caYn7LK36pQNQeGuLxlH1xb8yuTbRivDzhMB4v+mDrpyz9ydmZ+lK9ypaTsbTbqejkm9DncSYiOLI22uNLszEUZXw7M8suBGaIsAc32nITpu76LN3xMbQTRlZrQ3vzsP7KBHo2Gq/ytjg5RscI1hHuWYDcmVx+KNyJu3xaGY3YhEui2XM7a4WOQbVEwx241JiIDWPnvXsLVGHPps1o6zzIq2oZk7WT4nz+fXt8Rp1HIkwlanizROuY7VQT1iN/n6E5ofEhtvrHp6KvOm5nv5Ol+niW0ufpdjL1cn6MZ7jk89mtP1dtnNa9bZyyfG2l9Dx7B88iS/xB2sGAWV2U78bCfrODJsxvWxj7yeShkiQJM/WbfWhjJdHPU+MhHnlBQBdhkYzb3qSNOnvdlxLHzuZd295zzGdhLnd6YpM7dCy3OiDsN8v1i224AIEOUQa7dWfa5mqJfTtq6ly4uNuxwct4frzxLscp+Du61w2zw/WESsmcfUelke7OI0uGzmfgnjuF9fpimzLKfL5lbf7GMDcczdJhx28dT/U3r4GYe3sDAQ5/u1HxeOtP3i+tSBauP8Na6P0zFKi6cH8is03SM2YxfsZNi6UF+GTYu0Bd8y+bXRyrAjZwLmB8UO8DbuKI2pz+ZIWjvNrEvX0zGp12EWR7q5sXKlCETa0ZuORzLsazeH5C7bgRFnfNFABsROao5bL6bDmi5Q56B+arbYzW/nga8hyld/to8mzeUO2eA+HTSn1rzlL9mIxI33MedbpCnT76Je6xGe2bTcbV3XxKqXw5pjg7Kh243Jms7juLaSfTwudwyLOEZ67MhvWxuFcjR5uUPmr4HrScRruzxVZINe4Vxp89gEDav1tDol8yKuI6cY+YYsXKcMe7k6QTfac/zqUbGXKHsoOS47PNteVrgo04bbiY/tVicoJtM2R24+9nFSjghg1Py524oujus+ss4pJgI8ZdDcq540S7Y3L6XuZd295znGTiwtHi1uDVPzmZh8fLFguw2IAKU+60+b/cZnRaaANSymDVGs75NylOk3+yR5TojOJzJ2W9HVradexCwWx/U8aVGyjerKzGUp2jeXtoFxPWeb8NjFrn+jrPUfxWnYeuS3nPajULKftI8V4paqA4eNuZ9MmzYTePoF1Q7CpmK5hAc92rZQTplKttHKUFkRUEnka0bN1w7rwreEmCYvkXY5rzgV00Vbep2wmQfXdJza4MTrKktvAitCideU5pc3nqZ8bWaxjX/ytdE+tiqTktcpYq8t41OPBXt5nWtZlEp/g7YrbZ9NUqKtPC82Vk6fe7kUHrsr08+O42Vi1acuzJcK9EmbZaN9Wam+eUs2MJD1v5XX9G6aLbQlNxWwg6TSbVTDzhUBAUWn7MFOYJMiAOxM8jMU59FV59C84Vi5084ku6jB3ESnjQPAs+QZtVGIgB3G5OUwNV92bVIBO4CsnAa03/oIXnjWptIUFW+xM6d2G8JxSlvrwgDsAJ5FG4UIAAAAAAIKRAAAAAAQUCACAAAAgIACEQAAAAAElBdDBKxnaXKo+GcjX1geT9HwuPoWvx3CDnxsDAAAQOV5/iJgKWN+prLEsak++Rlcx9eWXgR0ZVPIXA5TXUtf2a9KfVb4vdwEAADAy8HzFwHud9YXO/Yi8oKWAyIAAACCQWVEQH6Bbvd30/kzYQp19FFKef2oYHkybXx1KhyjnoGZwvvKx5IUa79gf81KfC1Md+xpdoKuxJI0Kd/HPEtp8f9ClkYTMQq1dlFnYtjxHWvx5qfF68YX2trau2V+HqbUL/1x+NigvI6Rp8JrOD1UsGxqPPucxITxqUhZRlGODKViF6ntzEWK9fssgXDeRuWX5S7Q+WiSRsX7rJVwmbeokVbUY6PiebdEQGYqbduod6T4soVh2yzbvM/ISyxNGb7W2v1h6uX0ZR2I7wYocYpdW1LK5qXC1ldoeqDPrPc49Q7NO+s1O0Opy1abGafFBdPm9jlqu+H41xe2/sYvAADYwVRABBjfmG6IsBOanqfMULf8GMOA+fnL+YEuqm+5yB2y8b1q8W7o+s6bsnPOz06Z34aPU+r6OGWW9Mec71gW77RmBxDuotiAkWbsTJvju8vSiSnXjIW6KMTXtd6nbXzkgcOvZ+jh9LCMH+rXvf+/smVzp697j3QoYqY3lKRIC1/b/aU0i9wUxVvbqIUdrvgW+HBCvNP7gv0ZS1lG/h0bmKDpOxM00BmWXx6zRvcy71yWuLThMPWEC3mX+TodpjYu9zCnPTogyh2i6E39PgHxlsNmtnHksvjuP6clPhxyln+b8UXeGpR3ZJeyW2mb+4eJb9KnxmZoeixFneIjQEnr+wTcbvi3aq+2sx3UbL+n+wlNxsJUL+KLMgv7C/u637cOAAAvERUQAcIpO795vTzHIzDx/uV1dlSnC45JYh2zRsblLAd4REAbRYaUEaAMNz+NKj+W4bqm+QENSwQIp9XymeL0lxZ4lKx7C9M2lE3BKwJc+x5EfM/nNQ2W2ZGKTw6rI115jJ2pGL3mV9lJ3ldsJD+FyzYUH+SQ+QxRXH37XW6GBmKDNLls5qu1jzLK6Nz7Cc0C8lXH6ueP5Wd11U/VKt/s9rVbCZuXDHtKa/dZ1CmzHeonV8W31N32kscsESA+0Sm+gqbOlpjH8BpZAMDLSsVmAupau6iHR52ZOeWjCT9PUnPzRboiRlY2afl5XukQxDmbFAHOd7iLY2a4uKbHcRrfSnfMBDSF6fzlNE1OL5T4YMQ2lE1BNxNgjZYl8pjuK1lmeWJi5K1cX848KN9kz+Xo4R0+PpCkWLSrMBrX2qiAI1/qsVIiQA3T5FucI+3va7cSNi8ZZpBfnqdpTjOV6KZomIWLLIdhL/d3vmVezHxKwXCmm9KOfPXReRZmDsECAAAvEZXZE7C+Qg+vDxprvNbnE8WIarzbXhOPubDX5ystAsQ1VUdoMvppQQQIlu+N04BYHxafcmVBELvpXOu3qXTZFDYvAoyRdUu799oxc417Pimm+0PU1sHHEmkavZMyZgJK2MhiW0VAOXYrZvNSYdankJuNtHsHxmn6Cjt2WQ5lJkLJkzFjYeRzMcnl++iiJ08C3X4OAAB4GaiQCFB/52g4Yq5lP05RqDFGw6WmUystArJpHr11UWpBCZfTzU4RoOZ5behi0Wn3ipdNYfMi4GuajLVRc0+x9eoZzXS/uRxQzEbyM5o8subybqsIKMduxWxeKuxOghq4DieVcDm6N8sxfSlEDT91fphJLp9Y+fQRRgAA8DKydREgOvymDrpifdkoP0tX7E143El3cCcdHbd3f+fvDVJIbOaynJ1wlK19NK1OybuPbUQEmBu86s4m6Pb9FVrOztNwZwc1tFh5Mj4JG/ps1pxKfkoPE16nZ1+30mVT2IoIEFPZYlOcnTceIY9Gw1T/VxNcLqOMnUPW9HeOMj18LTt9b94Xh2K2E91WEeBnt1I29w1jcWHtQ1jNUK/YoGjbl8VHU5g6BzK0mF2hxTtJCrWGqcHK5/os9X6ktgsWCSNxamjupklRf+vcjmJx6r1dZMYIAABeQCoyEzA/KHamt1F9S4jq2UE3R9I0b3bwojMeiLBT5uP1Yvq26QJ1Diqb8qxpXA6312zdx6RTsRyYnwhg2CFOit3f3Mk3t3ZRfCTLDtJyQhw+m5Y7v+ua2QlwvutaL1Ja2WymUvGyKWxJBDCLI93s+EQ5jLzVn+2jSXPafO12XyGM/4aSg04bCSf5sfGJShFe19xFvebjdtsrAvi3j91K2bx4WI4mL3cYdjgtlni6aOAz50xM/t6w3CfQzO2irVM8AunK5+Nx+aRCXZNhM7G00GM5fXNzacPljPEbAABeAiqzHCBYf0JrPMIquslOvIpWTDfrwiqN5aRtjI1hoaTzWff88gota58KcLGTyuZBTONz3rTT62ZYsXwLnucrgkvZrZTNS4XlS6Xp+i02BjbxSF89xuRXuV3gtckAgABQORGwY8hS6mN2+D0ztCycBDuMxbEEtTQqj+6BwJG/k6DmlhgNzxrOPS9mI8RMiPlIpft8AAAIAi+hCGAej1NP+wU5NSynnD+6SL3j3ul4ECRylBmIU5tYfhDtoilEoegwPSw1SwIAAC85L6cIAAAAAIAvEAEAAABAQIEIAAAAAAIKRAAAAAAQUCACAAAAgIACEQAAAAAEFIgAAAAAIKBABAAAAAABBSIAAAAACCgQAQAAAEBAgQgAAAAAAgpEAAAAABBQIAIAAACAgAIRAAAAAAQUiAAAAAAgoEAEAAAAAAEFIgAAAAAIKBABAAAAQECBCAAAAAACydf0/wEuVR1nWvQExAAAAABJRU5ErkJggg=="},9855:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/System_prompt_example_compare_settings-9bae1a272e703e3e7a19783586bda7d3.png"},5937:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/System_prompt_example_conversation-b8acac4bc78a51dd979a1526c2bd3b5e.png"},3565:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/Talk_to_full_list-0f8667f4ebc22985de2fd75a7cdee746.png"},9229:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/Talk_to_full_list_assistants-90f8dc510f8ea1b3c0edf9a55c1e99f0.png"},4185:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/addons2-404880c97da9d45d5a391dd35e650cb8.png"},5237:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/all_models-aa26c27e7e84b6b0e092a5739be677cb.png"},1036:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/applications-1c4e4a90fddc7be602f147b8d6f0f88f.png"},967:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/attachments2-ff159b5e60f8177df95ccb5afd36ccba.png"},1304:(e,n,t)=>{t.d(n,{Z:()=>s});const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWkAAABQCAYAAADbeYSfAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwgAADsIBFShKgAAAEn5JREFUeF7tnd1PVNf6x39/hFfeemG8UW9OE5OmTawXx5zkpCbGHH9J4y+mPxMNFzU9qYk5ppxWCrUoLQqC+DKlCqIdKYooL60iCIVWQXBAdGBgeJXhTQRE2uQ5+7tm1rBnWDOzZ9h7Mxyei0/ce73svfbg/swzz1p75n/+/PNPYhjGfP7444+k5uXYJLOCjI5PGYIlzTAmoxfhwsKC4O1bydukYXh0nLGJEd9ECPHImiXNMCYixQwJzs/P09zcG5qdm6PZ2dmko3/oJWMzA8OjNDjio6GXY0F5xxI1S5phTEIKGnKGBKenp2lyaorGJyZofHycxsbAWNLwoqePsRG3x6vRTz19g9Q3MCyEDVnHEjVLmmFMQC/omZkZmpzUPsqOalHT4BB5vf3U29tHHuDpTRpa2lyMXbR3UKtGm+sZuZ69oC63R5P1gIiuY4maJc0wJgBJI8WBCBqCHh4eIa/PR95Xr8irRdQMI+nT/k+8GBqmjq5uIWpE1Eh9sKQZxiL0UTRSHIighaDDbk6G0QNRI6JG6iNaNM2SZphlIiWNSULkoEWKgyNoJgaIqJH6QI4ak4ksaYaxCH+qY0Gs4piYmBA5aNVNyTDhIEfd3dsvUh4saYaxiKCkZ2fFKg5MEqpuSIYJB5OJWPWBCUSWNMNYhH7SEMvssHJCdUMyTDgtbR1ieR4kHWnykCXNMMskVNJjLGnGMFiex5JmGIthSTOJwpJmGBtgSTOJwpJmGBuwS9J3HzZTZs5F+jIzlwquOKlr5KWyHbN6YEkzjA3YIekbVffp8/RsOp55lrLyvhfbX2efp2cs6lUNS5phbMBqSV+v+FlIuaS8inqwDlsr+63LTWmn8uhCcemS9svBPTBI7kl1nR2s9PnthiXNMDZgpaRLyquFoK/f+VnsdwwOU21Lm9guv/+QUjNOk2diMqRPwjwvpD3rN9C7Wc1L6/qekLOhk9yxypZFPX2unf/zOlXdyuF+Xk/O1kFl3XJhSTOMDVgl6aKyu4EIulrsP+0foK+/KxB5aezXND0S9Z1DwyH9EqXRsYs27ttLH25OpfLw+rpUWre/kFpilS2L5JR0S/E+WpdRr6xbLixphrEBKyR9ubRCCBiixn5bXz9lfHuOMjRJQ9YoO190Q5Tp+yVOJ2X/4z1Ka3qi/buJjlSPBetcdQWU9ukuWvfBPjqSlU5FT9VlwfaPSijzeArt2Z9CRxwV1DiyWBesP3aAdqYcpUxnM7mCdQFJ3/NQueMofbx7Lx3KKqFaXf/GsnTKrvNQS3UOHdq/WO/urKBs7Zh7Pk0nx6OwqHegmRy5ON4BOpyrtR9YrBPXUaZ9Gmgt0a5nr+if3+AJ1uN8Rw6+R+v+kUJpWQVUHujreuo/305xjTW6a4gPljTD2IDZkr5WUSMEfeWnO2K/taeXvsrKp/Ssc9Qe+F4QpD/Q5t7vrSF9E6bpFL37wSmq0rYROW5MrQmmMcTH/fwDtG53Kjmqa6i2T12Gtq6yFNq4eRd97qynqqZ6yk/dQRsPlgSj7RbnAdqybS+lOWvIWV1BmSlbaUvwXH5Jb9+VovX312d/tiMkWi/P2KCJEbKt8Pc/uEk7vrZ/tICKtHEUOT6l7ev3Uf5zf3vv8xL6eNsOOqS9WTi1ekfWXu38R8kZEL+IkvfvC+u/Q3uz8te7WrU+x/9G6z7J0frXU4tPK9deq+3iGpupsbNejHG7FmknkvZhSTOMDZgp6V9dz4R8L5WUiW9Ja+n2iAnCrzSeBL4TBBOIaCPz1GZQlfUevZsdyEX3aWJbn0JFuojTcLpjpJNqOxejcK+vgg5r0nT0YL+Z0j5AtB6oE/XNlJ9VSFVCmn5JHypf2l9KF5Jed6xiUYidyKPrx+ohx8ENdPiu/xi4rg/PPwnU+RFljk6xLSS9O4dqdfXlGZsWXwvZRpfuEPvHa4L7Xp8W2ffpxhwHLGmGsQEzJV1Q5BRL67rHxoWU007mCUkjmkZ98c1KIWhE29h/6h2gU2cdVPvYP5mYGJocN/+NsoMpi0FypGygj526tEE8OWnfIDU2aZGws4DSjh9YjGyfFtDOQLQe0j6IKieNsjBJ6/PDYrIzNIeONnuKkbJ4Qtm736HDDkTli4jIOCB6fyQdeg1KKevPiUh6/Vbak1FIRU2d5EJ0LevihCXNMDZgpqQhaJmHvnC1VDy4gmga+0h/QNBXb1WJfZGn/q5ATCZi1Yc8Rry4q4/SRk2O68LRy8ugpBuvHaAtm9+hj46lU5qjhJxNJXRESrYhnTbuLqBGXftQzJY03nzeo49StbFkheGoF3nkhCQNeprJ4UilQ/t30BZN2B9f80fm8cKSZhgbMFPSX5zIITy4gu0zF4vo9IUi6p2coh9u3BaClgJHlJ2OiUQNRNP6Y8THGDlTN9GH+c3kGhhcpKeUDq3ftRhdG5K0Kp2hS1cM4JgHyBHIX0vE2mixbbakQ1MfKhKWtJ7WHNoZnh4yCEuaYWzATEmf0aSMR76xffMXTVCamDFpiH8hauSpWz19/olETdCIpsOPERdCnDoZBwnIO5C7FUJG7lb/oMmSMg/l799Eh8tlmmSMas/v06J0KVntmMc20faMxdUQrvKjwQlL8yWtvQHc1T4l7NTqpUAnOyn/4Fb6qFiXkzYi6c9KA2Me046/NfQaqlPpXdWyRQOwpBnGBsyUdGVDsxDyw/YOIeSaXx/RTzUPqPrX30X9Y3ePeDQcE4mQdXj/eHE5DyyNkAOINEhQoJ3kSNkq0iCHyqSEl5a5m3Joz7YNtPH9HfSXzUgDFC6mO9Bn5Allf/KOJu6ttEW0S6HsVhnpmi9p8UZR/Cnt3LyBtrzvP++Hx0qDKRcjkvaOaGPYtUm7zsCnhJFmytyvXfe2HbTzfa18217KbOKJQ4ZJWsyUNMSclV8octHyyUIJltuhHJOJT0wQtJXEfLzbh7RKYmJLjDGRxjH1kfOR5V8DS5phbMBMSQMI+GSuQ0TUSGkgN41/sY9yudKDWf2wpBnGBsyWNPBMTtKte/UiD33u8o/i31v3H4pyVXtmdWJI0uEFDMPEB24s3GC40XDD4cZT3ZAMEw5H0gxjA1ZE0szagCXNMDbAkmYShSXNMDYQKulxljRjmJa2DpY0w1iNX9ILQtLj4+PUG/giJIaJRWt7B7k9XiHpEd8ES5phrCAo6bk5msDPWwW+TpRhYtHmekbdvf00MDzKkmYYq4CkFxYWaG7uDU1OTdHg4BB5X71S3pQMI8GDS65nL6inb5AGR3wsaYaxCinp+fl5mtZuvpejo+T1+ZQ3JsNIXgwNU5fbQ30DwzT0cowlzTBWop88nJycpOHhEb+oOaJmwkAEDUF3dHVrUfSASHVEmjRkSTOMSeij6ZmZGSFqRNQi9eHtF5OJHuDpTRqw/IuxifYOMUmIHDRSHIigIWhMGEaLolnSDGMielEjokbqAznq8YkJseoDy/O6hhuoqb+YavvORqXB+z11Dj8Q666tAku/GPvAKg63p1/koJHiQAQdS9CAJc0wJiJFjdQHZI3JxOnZKbrTm0q5HdsToszzTxqbHhDiNxNEcYy9QMyYJISckeKIJWjAkmYYk4GoJRNz/XTlxT6lfOPhQtffqXO8SsjfLCAJxh4gYz0Qs0QlZj0saYaxiPmFWVMELcnr+Cv5ZntC3gSWg14UjP2ohKyCJc0wFlHp/WKJaBERl3o+oaaXl6Jyq+8zKnz+v0v6l3T/P739Y055vnhRCYFJPljSDGMBs2+nlgj254GMuAULYYcfZ2imXdk2XlRCYJKPuCXd5uqia6UVdPHyjyHUNfymbL/SRBqvJDuvkK46byv72slqGaeeyalXdLvq/pKxomzq1bSyz0pzt+aBQFVnJv2vH4eIFVFxohEwomr9sdrGflK2ixeVEJjkIy5J/9bS7v8JnzMXQ27K/EtXRXnVL/XKfitFpPHqSTt5dsXHvlrGGU555T364kSOcqwQtarPSiPHqKozkxbftRCxVnj/pWwn3+gAtlVtwqNp7KvaxYtKCEzyEZeki38sp2+yzyvrcMNCInZEKUaJNl4JbtjM0xdWdOyrZZzhRBJepPKVAKsYBoZGCF8JWX3vIWV8e06AbZShDm1UfZeDUbHKNzpwu1L9xsaSXtvEJelYN9/dn+uERPIdV4Ntw/mx7C719HqV/c1GnlNVJ5FtVvJNZrWMM5xI445UbidXrt+iE9obH16rWKRmnKavNXHj/6bqWIkQj6TxySPapw+W9NrGVEmDmvsNwXYq8JEeN4anr1/Z30zkOVV1En2blRLgahgnzvVd3veUnV8YHEv6qTyB3I9Ujnw6+to13unp1/Tvr88I+VZU1YZEzHJM+ggbbdD2ixNnRF/VMePFqFiR4sDfE2OIlMdnSa9tTJe0EfDR3syoJRJGxisjGdlWvokUO8uV7a1gNYwTgs3IOkdfnQyVL5D7kcoxbqQY7JI0zoPXRryRaZ/u9HVyTPqyaO0TxUyxsqTXNisiabOOEwsj5xETN5WhKxQgIkhG1d4KVss4b9yqpKxch7IuGlm5l7S+Vco6s3n9eoa+/CZHyPaOJl9so0zWh7/WsdonCkuaMYs1L2kVdo1PslrGCZEdzzyrrIvG8cxcqjQpQo0FomIpWr2AZX34axarfaKwpBmzsFzSWD+dd7FY5PsAtr8967BFLomMFyTaL1FWyzjxt0RKAD8VpapXgbboU9f4u7LeTIKS1cQry8KjY/1rZqR9ohgVKy/BY2JhmaR9YxOUd6lY3KCXrjjF+l6AbZR9dSpPtFH1NYto44127niu0wxinS/SWO0e56PWp+JvNz4xFSxrftQWImCI/LfHbcH98YlJ0edRqytYZhX4//XlN7k0rRPsq+nXQrpyfbn+NTPSPlGMihVzDbwEj4mGZZKGoDFh1NHlFvuvZ2YF2G5t7xR1aKPvYzaRxouP3hDHyKhvSR2I5zrNINr5hl/6xFgrf1n6EdzucT573i3G0j8wFCyrrW8WZZAaxojtBw8Xnz71am1R9uxFT7DMKvBE5qmci0vKMclacqNCbOtfMyPtEyUeSeNeALwEj1FhiaTlx2IpaHC5pEwg91GHNlY+Tq4ar5zJ13/EDcfodZpFrPPhRlaN2e5xRhIuBI1yEB6BqsRuFXIc7R1dwTI8bq8fl/41M9I+UYyKlZfgMbGwRNLIOyOtoS9T9UUbtNWXmUn4OS/8cF3cgCe16EnWSfQClGVy32rCz4exyDKJXHJ34YfFdrJO7lvN2Lg/dfH4ydLUBaSmEhvSHOiDtEd4ndkgbSFfJzydeeK7ArGNaFmmNPSvmZH2iWKmWFnSaxtLJI0JQtyw+I9+5dpN0Qc5aIBtlKEObdBWdQwzCB8vJI3cn/6BDEmySxpjxmu1kpJ+82ZeSEyfg5bpDqx7B9jWpzsSmWxcDvgllHt1v9KV6zfFGnJso0zWh79msdonCkuaMYu4JG3kOyZAskoaREod6FH1s5JY58NYVWO2e5wAfy/9crqG5sdCbHIf243NLcH9RJftWYVdrxlLmjGLuCRt5NvaACZBEPnp+8o6fZnd6Q7JnepacR08cRg/p3IuUWm58QdT8BALHmZR1a0Edr1mRsXKS/CYWMQlaYCJlZIbt4P/2VVgHTTEkowThxJvf+SJrGj9rCDW+SKN1e5xAnwtrf7vGIsftLb4wi1V3Upg12tmVKy8BI+JRdySNkq0JXgos2MJHnKMiPxUddFASuf6T3eUdVawWsYJ8MMERlJeErRFmkxVZzWq3H6kL4WKlv5KhHgkzUvwmGhYJmk8gBHtYRbURXugxAxkeian4PKSmzIScrbfjm/pk6yWcQJ3T584b6yUF5Bj/F27PtWxrEYlaYxJNXarJX1/6KSyHS/BY2JhmaQlSGeEPxZuZYojHCPpGT3Om5XU7bHn+671rJZxAogaEbxqXHrQBtelOsZ/O+6pByFixQ/IqtoZAb+NqD8WfvVF1S5eVEJgkg/LJc0wa5HJNwMhYgWu8fifYsRx8jr+GnIcz6vF1TTLQSUEJvlgSTOMRRS5/y9ErgBpD6QrjFA3dJoudP09pD/28UvkqvPFi0oITPLBkmYYi/DN9iyJgpeLWb8UDlRCYJIPljTDWAikqpJtItzq+0x5jkRRCYFJPljSDGMxQzPt5Hi+WyleIyDFYdZkoR6VEJjkgyXNMDaAPHL/68fK3HM0sEpken5UeczlohICk3ywpBlmjaISApN8sKQZZo2iEgKTfLCkGWaNohICk3ywpBlmjaISApN8sKQZZo2iEgKTfLCkGWaNohICk3ywpBlmjaISApN8sKQZZo2iEgKTbEzRfwDpGmh78Ot3hAAAAABJRU5ErkJggg=="},1831:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/compare-caf2ff8cbbe3ef9bc7b0070636a79fbc.png"},4171:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/compare2-f3a9fc062741202e3f0e861fc89593e3.png"},8593:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/conversations-a284e306a9213cf466ff6e50ec734c0d.png"},6331:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/create_prompt-a9159bd0c2cfd8d448f22097c39d34df.png"},1319:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/duplicate_conv-1046542b7103644a484fd45405d11c4e.png"},2035:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/duplicate_prompt-34520c5d69fbfcb24b5a5c494474a377.png"},5603:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/export-conv-cdf65ca84cfc687f467cd245e592b1f0.png"},2547:(e,n,t)=>{t.d(n,{Z:()=>s});const s="data:image/png;base64,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"},7830:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/home-9d069fea243ec7a3ea2e6e6e7f105989.png"},5764:(e,n,t)=>{t.d(n,{Z:()=>s});const s="data:image/png;base64,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"},5311:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/isolated_view_mode-2a60e40cbea4eb507f25b263c74d6b50.png"},9779:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/move_conv-30a3ef1b4fde3a24bdca0bae5a6aaf61.png"},7176:(e,n,t)=>{t.d(n,{Z:()=>s});const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARIAAACpCAYAAADnTbIhAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwgAADsIBFShKgAAAINVJREFUeF7tne1PVNfe968/gle+5ZWTGLRvTE2uGq472ia3XMe0NJxLkpuURKOJUXIl3KS5j/QcC7Ycx3r1DLYKbUVaEWnpSKWjyIMIWKkoCFR5dAB5GlDwiRG0Jt97/daePbP3zMbhYWb2zPB78Qkza639AGvtz/x+a29m/dv0zBOEmtevXzMMs4ZgkTAMs2pYJAzDrBoWCcMwq4ZFwjDMqmGRMAyzalgkDMOsGtNEUn10Hs2lC3js+pNhmBjmyfSf5ojEcWweeVuf49GY8YkxDBNbmCKSf777HNb/PWd4QgzDxB6miCTvnec4toNFwjDxAouEYZhVwyJhGGbVsEgYhlk1cSmSe11jEqM6hmFCT1yK5JuSSolRHcMwoSfmRfLg/mO0/d6nK2u61inRlrW19sm22rKl4BqYwYgWp3G7mMMZR78LYzoxL5LGxg588tm/pCjofcet+2iovy25c9spy36/0SvbXGu8o9s2OJMozUhEwjo9GzOKcH3AqL3J9PbC0TAEl1Gdl0k0FKRjI/0un7YZ1DPM8omL1IYEMTTwCCXfX5DC0FJ69qKs849QloYikl0lk5qyGTR8uh0Je+0Y0bWNAmrzkJBxDv1GdcRAM/L/sgkp2XYU/Y1FwoSOuJkjKTt/CX//3Ia6ujaMDT2VXLnyuyw7V3HJcJvgGIlEcNeOj9YdhF1GJUOwF5Sgob0X5wsOYle2w3sh918sQe7BdOw6mIeii/p9dFccRVHtpGhThKyMdGQV2HFLpBqu9joUfbxXbHMU51tmvO1HaktgrRDRRqsdVoN9yvqDHyAhORO5BUdhb/Mdy8vdZtgblH02fMoiYUJHXIjkXveYjD7qagMvjCtXbsq6vrsTAXXBeZNIMnH+Lr1vQ/66FKSmpyO3pM6TWszhekEKNv5VyOBiMxwX7cj/qwXbjrR50w66kFMy9iLnf8Q2F+tg223B+t3ifXYJ7GIbe1EOtoljlHYq7ftLMkW0kYl9GZ59VpYg610LPioZkvWuzjY4bHuR8H6erL/V6znXRWCRMKEkZkVCt3fpzgylLM1NnVIW48PPAtqNOZ/Kuustf8i2tM3Sbw0bi6S7SFzUH5agW74nkSQiq1Lz+3Sew651e3FeezE765Cz4QMUeSIFeSF/XOebz2inbdQoh5jE+d2JyLmg7FeKZEMuHNoJ0rYSpFLZA8/7YKmNBhYJE0riQiRXG9oVkQwZiESkOFTXeLVjxSJZ/04KUt738I6IHP6SA3u72kYRSX6tbzvXhVwk7Lb7XdAzsB8UwqlYJLWQ8slDg7e90kaVmBRJwD57UfT+Vlived6zSBiTiAmRPJkyLvfn0fhCQFu6e0Miud87rStfGp6I5KtOzS1g//MOFEn/9+Ki/6RZ00ah4ROfGFYkEm0EI1HOz3tsFgljEjEVkcxOiEik8SX+qA/EefuV0mZS+Un8cWcEhwsKcbb8V2/Z8lhkjkRHoEgeX7PhnWQbruvaUfRgQX6D8n5FInlfTac8PBDpkneuRsAiYUwipkRC36hG2y7G6F1FIhSBqHxhK8HMxMuAfS2NFYqEpPGhBR99q0yEEt3fZmL9uz65rEgk67T7VG5Drz/o8N2GJpG8X4Rb4759LAaLhAklMSWSwd9focY27+XS8Xl89r98IlGjkp/tDai01ylzI8t+CE3LSkUi6G2GNWMTEjZswsYNidj4YR4cmsnXFYkkowilR1KwfvNmbKZ90oNxuqdTh3B+rzimOB91LmYxzBIJRYxMbGDUf4sRs5Ot9DWNpQfcXokQ928pvzw9oEaQSJx9DwO2jSghehRdEYknbXkQe4+3awcoRYhaaG6LMRf/PtH2l1F/+hOTIpkRobsqkbP/7cblL+flazUiUdOa4yfOBGwbq+hEEmOo8qAB+3BsHtOjLzD1wA3Xgzm4RpioQfQH9Qv1D/WTKpilyCTmREISIXmoEqH3lObQezUioWdGbly/J/4w7oDtY5X+ihykaJ6ajRVUidDApIE6PvQUo/cfyztgw/2PFETUyJiMpy+oX6h/qJ+ov6jfliKTmBKJViIUkdB7KvcXCRMdaCUyOfIco4OzuN8zhb7ucdy78wB/dAzjj/ZhdLcPMSZD/UD9Qf1C/UP9RP1F/bYUmcSUSMpzXshtv89y65ayqD2hiGSonUUSTdDAo/CYPtloUA7cncTDqSd49fKV4bhgogPqH+on6i/qN+o/6se4EMlE3ytFIgf1EiHUuzn0nIm2nDEPbTRCYTJ9wtHgNBoPTHRC/UX9Rv0XLCqJqYik/7eXvKhWjKCKhCbuKOemcJkjkdiC+ov6jfqP+jHqRLLcBbKW+og8sZy2TPhQRUJ3AWgCj3Jvo7HARDfUb9R/1I9RJxJesjP+UUVC+TXdDaCJPKOxwEQ31G/Uf9SPUScSghcRj29owMmJ1hGPSNqHDMcBE91Qv0mRiH5cbMLVtEXEmfjnzz//xMuXL+F2u/Ho0SMMDXFEEotQv1H/UT9Sf1K/GrVjkTBhgUUSH7BIGFNhkcQHLBLGVFgk8QGLhDGVSIvE/eIFRscnxTH5WZVQwiJhTCVSIqHjOGqvyWVH6D++Pz9+Cnd7BgzbLgf37CxmDHAvGLeXLLhFG7fnvRs9TS1wPvVrE2OwSBhTiYRI6BgnvzsnBXL6bCVudXTj+Fcl+OyLU5ifXzDcZmm4ULE7Ube6oor1plF7DzfzkbC7HBP0etaB7CQLsmtnPfVuTLS3oGda0z4GYJEwphIJkdirr3i/e+bEN2cxN+dG111ledaxCZfhNktDEUlG5TL3oRVJAMo+3yiiKIRFwphKuEVyobpWCoNkcrO9S74uLP4BpeUXkGf9OiQRSVCRTLahojALGbuzYKvug1snkmHUFFpRM6i+zsWebYlIy7HCVtam308UwyJhTCWcIvnlUr0UR9Wvdd6y1jblqzWJ+mu/6dovnyWIZLgce5K2I7usHo1NLaj6Mh0H9mdqRNIGqzcVmkVPkx15aYk4cLoFje3hmS8KBywSxlTCJZJfLjUESIT4qeqyLD9RfFZXvjIUkSTvz4VNRBU+HHDKejca8y1IK+3TbCPKDlsWEQnBqc2yMToQs7YIh0gWk4jdk+ZU/lKjK185ykW/s8Auow0ffZiR9X0oTdsKW6d+O/dVWmGRRRIyjA7ErC1CLRLHlWtSFtU1V3XloZcIESy1EZJISkGpnP/QcEM7R8IiWTVGB2LWFqEUybWWm1IWl2qv6cpJKlROkYq2fPUEE4kLVfsTkX1ZvbWr4CxNYZGEEqMDMWuLUIrkux9+QnFpha7s1yuNhhFKaAgmkteYuZwFy458tM56yobLcWBL8DkSf/lEOywSxlRCLRJCfW+U5tzp7kFD040A1PrloVz0Rg+k+eTiRkdxOt5aZ8HbyZtgSbWitfZNqc1ruG9asTNJ7GebzVsW7bBIGFMJtUiOfHFS/jx1ulxK5HJdk65N2Y8XZbk/Iw/Gde1Cju6x+PiDRcKYSihFcvN2lzcqIRqaWg3bMaGHRcKYSihFwpgHi4QxFRZJfMAiYUyFRRIfsEgYU2GRxAcsEsZUWCTxAYuEMRUWSXzAImFMhUUSH7BIGFNhkcQHLBLGVFgk8QGLhDEVFkl8wCJhTIVFEh+wSBhTYZHEBywSxlRYJPEBi4QxFRZJfMAiYUyFRRIfsEgYU2GRxAcsEsZUWCTxAYuEMRUWSXzAImFMhUUSH7BIGFMJtUhevnyFvgGn/L7W+ms3vNQ1Xsd5u0Mex2g7ZnWwSBhTCbVIqhzKwuGL8fV357CwsGC4LbNyWCSMqYRaJP/81zeosF8KGMj3h0akSP7+uQ2nz1aGTCbu2VnMGOBeMG4fr7BIGFMJtUhIFpTK+JerIrl2/Sb+UVCI736olMf1b7c8Fl8gy/wlN92YaG9Bz7RRXehhkTCmEimRuKYeyrqvvi3DieIf5OsvTpwOaLc8gi/ZaR7KuUVKaCwSxlQiJRKClu6kSIQWzyKJUFujdksnmEhcaC21oqJTM8E7Wo/iwnJ0yLWAh1FTeAat06JdWS4OpO3DoWI7etR1glUWXGgsy0f27nRkF5xB46SmbrYNpYUOEXm0oPTwPuwsbhPltN9c7NmWiLQcK2xlbZjR7i8MsEgYU4mkSLRQm/CL5DXcN/KRvMOGDvnejcbDFqSV9nnqad3fFOzZLwRRVo/GphZUfZmqLDr+1LMPdxtsqZuQ9qVd1jdWW5GWtB3Wdo+cRsuRsS4VaVn7UFwt6vto8fFZ9DTZkZeWiAOnRVn7MNzyeOGDRcKYSiRE4na/wO07f+gGdyhFkrw/F7ZC8cnvxQGnt41PHu52K95LP6OpUxYQ94lF075M+TtMVGYiIcuuiyjcV3NhUfcjRZKC4j5fvQKnNswaIhIiudc3KMsvVNd6y0Ipkp0FnmjBS58+lZh2IHtLCnbu2A5bp6ZcisQiogttmSKKhByH2AdJJRF7qvwinlmxv3VZqKEUSIokExWjmnoJi4RZQ4RTJM2/taGh6YaEnh+hOrr1S3WhFEnwydZh2S5hmyZlkSipTemgtkxwMx8Ju8sxIfZftT8ReTf86l+3IE+VB4uERcKEVyRW27fyvZZ/FNhkXSRFMlGVibf2l6Pm5HYkF7Ro5iuU1ObQVf3Tts7SFFi+pEnT1+g4uRXJJ7t09a8Hz2BnklWZd2GRsEiYyKQ2U9OPcOSLk/j8+Cn5msoiJhJKa5JSlajDLcQh0hvvRKlHJAk0uareqRkux54kTQokpJGWJEQx7Hm/IKKb/Ra8p8oliEiyL9Pkq39d6GGRMKYSCZEMPxiTIhmf8F3woRSJ0QNpilxmUZOjuegFyl0cNcVRRJJXYceBLRa8nbwJCUkpOHRZ/zeYuWFDxpZEWLZsgmXdJqQdq/fNwSwqEnGsm1YRuYjz2abeNQofLBLGVEItksUekddCddSG2hrVRw5FJGr6QY/bv+k2rayP0kfvWSSMqYRaJFWOOhlpLAVqa7SPyKEXSSzDImFMJdQiWexrBLRQHbV59eqV4T4iRxuK01JQ7Hf7NxZhkTCmEmqRMObAImFMhUUSH7BIGFNhkcQHLBLGVFgk8UHUi4ROiIlfaMKTvq1sbm4ODx8+ZJHEKFErEv/BRtCMvMJLJi4gibzE/Pw8nj9/LkXidA4tOgiZ6CUqRaLKg06IPq1evJiH+8ULeZJMfEGRyDMhkcdPnsDlcmFw8L7se5ZJbBF1IlElQgKhk3r27JkcZPJLdWdmxMkSj5i4QOlLikSmpqYwOjqKvr5+2fcsk9giqkSilQh9Uj1+/BhT09MYH5/AgwejGB4ewRAhTpqJAzR96RwawsDAALr/uCv73kgmE3Pd6Hp0Ab9PnWYiSMfDCow+b9ddq/5QH0aVSOgk6GRIIpOTLkyNP8Hs5Cs8dv3JxDHUx2PDj3Drdrvse3VALrxyo+bBYXx17z+YKODiyP/Fs4XpgGs3akSijUYonaFIhCRiNOiY+GVocFL2PY2BR3MjODuQYTigGfP4tu8/0fdY/39KUScSmlilORFKZzgSWXvMTL6UfT/zeJolEsWcvPceHrqd3us3qkRCtwPp7szs7KycEzEaaEz8Q31fff9QwOClT0L7UJZhHs+ED0pnSvt3BfTH+fu78fLPF/L6jT6RiBOhuzM0sWo0yJj4Z2CoJ2DQ1o997h20jDmQVPz7hSbAqS7KRKI+Kj0jT8xokDHxz+37NbrBeqbvv1giUQJFJ9q+obtoVB6lIlH+58JokDHxz9WBYt1gdTz4m26sMObhH5XQeypnkTBRx5X+L3WDtdX1nW6sMObBImFiBhZJ9MIiYWIGFkn0sqZEcr25G9+fq0bx6Z8k35RUorN9yLAtE32sVCS0vm955a/47oefJLSqXv/gkGFbZmWsGZEM9LjkN4QfKyzxiuT4iTP4R0EhOm7dN9wmFLgGZjDyYPE617hxXTgYabHDVnAU1u97Dev9CX5+cxgZmDMoDw8rEcnE5JTs9+NflXhF8uVJpd97B3wPToUaWiJiRrcMpx8LbvkPp29aZiKWWDMiqattkwNqevSFt+zh+LwUCg2q6l+bcenSbzoar3aIC2VGt5/lMYnSjEQkfFiC7kXq8mv9y8NESxG2bfgA+eeaYb82adxGRxvy1wU5v85z2LUuDw1GdWFgJSKhdX6p31/Mz3vL6N8tSCjU71caWgK+Tf7GzQ48mlnNSnSeBbLesACVsywVCYssYBUZZtHT1IYJt1Hd8lkzIiEx0IDyL384No9T3/0o6xZjzPk0YLul4RGJuCC3Hes0rIuYSGrzkJBxDv1GdYbEh0hIDNSH/uXz8wv45vs39/uTp88Ctlsa6kp7FuQ16dfvVeiCbRvVmykSWjsndMdf8yJ5E/d7p+U21xrvGNYHR5HFrgIbsjZsR36DNg0wEMn4JBxFecjKSEfWJyVw3PXV9V8sgu2iJpIYaENRQREcnfo21srAOZ/uCpHOHPwACcmZyBWpTVGtL8rqv1iC3IPp2HUwD0Xa/RuJZKAX9qJc7Ht/L3KKmjHSHigSmT59vBcpe3NhO9eJEU0dnUdR7RBunTsqfsccb/lSCaVI3sTk1EO5ze+3Og3rg6OI5EDWPiRk2X3LaHpwN+XCkp6KNP8LecGFxrJ8ZO9OR3bBGTROqnWi/LQVNX2atoKZm2dgq+rypkczd+0oPrwPO7NyUVzdFXBcL7NtKC3MEsffij35Vti0S4HOdqGqOBcH0vbhULEdPeraw0FgkQSBtqFtjeqC4xFJySRcF3Kx/l1x0Tn1dd4L9YH4hPjLJqQescNxUaQfRTlI2ZyOojZPvYgo1msiCtofRTq0b+3+ci4EzlmMtDbDYduLhPfzcF7s+3ontZnD9YIUbPzrUVnmuGhH/l8t2HakDS65nZ9InOL9uxbd+e3anYkUjUj6z+3FxndzUFSp7M+asQkb/9bs2d+faPg0ESkfCmn97RzsF9uU/S6DSImEoG1oW6O64CgisV5tQZ66ULi3bhZVWUIy1eLvoxWJuw221E1I+9KOxqYWNFZbkZbkW1i84+RWJBf61gp+/XoYpem+iGeieh/e2pGD0lqxbZOQ+e5NeCu/xXgOxj2MjqYiHFiXgrwq0b7Pk8aN0lrD25FdVi/PoaYsB+8lZaJqCVELiyQIoRIJXbgNn2zFtk/VC1UvkhFxEa7/uM570XnL1AvxQTNyN2Si1BOBNHy6CbmfCrkcdCif+gMOZK3LhWORid2A1EamJXtxvlfTxlmHnA0feOSlF0l30QcB59f9lYhyvCLphDVZ3VZFX0YiSfhv/T6WQ8yJ5KYQQKGfAAbPCEHkolGIQyuSicrMgOjFfZUilzNwerfLR6ta790PvadUyV9YRmVaAlOb1mMWP1m9hrM0FZbFhKSBRRKEvKNfo65u+Z+eClqRiPfyU30rci9TRKAVyRwcH1MK5JCf9l5kFKFO1CptsiooLaELVEijl+SiyENGKKpUjPATiWy/2+43ZzID+0H1GFqRaI+tad9W4otI6PUWEY1oz19EJbnv+6IkKRIhUt0+lkEkRfL3z2242txqWBccn0j0F7w2stBeyG40Hk7EniqXZ3sPsw5kr8tCjUwvlAhEXQ+YJmu9F704xs5/F9EIRTJe7MhLS8Shq0ZzNIS/SPpQmib2779MaKcNyW+YNFZhkQRhZHAWMxMvDeuC4ycSgUtc0Nvo4ndqRTKJ82LgpR48CivdntXh8N7xGak4iASKCq7Z8I6UBl3gW2G9RhepBfvOveEOk59I+r8Xn4CfNAe0a/hEPV+tSJTzC0ibtHMkDUex3jMH4/87qHMysSSSrru9mH2sH4tLRyMSbypD6YM2StBeyC5U7U9E3g11exWRGvlFLUp0QFLZClunp127FZZtmcgrtMLmR+nNxe4++YtEvE9KR8Wwto1guBwZ6zSR0CKwSBah9bd7KD37i2Hd0gkUiZybOLJdpCQ25Kf7UofrRyxI+SrI8x2UvmzIQ5EtxbtPkkvKV+dEhOJLewzxT21IRsk2XNe2cfWi6H0L8hvotT61ofN7x+/OkzJP4xHJXTs+elNqJYglkdAtYqPypaEViTq5egY99NObvugvZBmpnNSnFTLSSLL6ooFpOw5QdNMpyrVRwqQde8TfXo16loa/SGZRk5OI7Mt68VB6lbDfjglNmRFrRiSXL7fKAbXUb1e7dEkZgEZ1S8dIJIRITd6l23++C5VSg1SaA2lX28yIC287Nh/RXni0PwvWb0jxzUXQXMcGUWb4rIoGf5GQND604KNvfXd5ur/NxPp3VbnoRULi2aY9v4Fm5P9FHNc7R0LRkQXbPm32pVciYvlos3ZeJ/IiofSE+nGxAawyPDKGw/8slG1Vzv/8q2Hb4OhFokQiFliStLeD/S5kmQKJ92pEsDCMiv0WvKeTC13somzHVqSVaRcMo9RIlB9r8c2xiEhizxatKPyh46eg+K6vTM7J7BDRh3qnZrYF1h2WALkYsWZE0tUxLAdHWblDRif+3Osak+0oEiGJ0INq1J5eE/77WxqLiURA4tBeqIKRyzbs2pyI9e9sxsZ1FmzOLMJ1710ehf4SkZLoIgmKIhKDRzMBIhH0Nss7KwkbNmHjhkRs/DAPDu/kq59IBN0VOUihduL81m/ei/OX/W7/OntRmp0i5LIJm9+xIGHzB8ip8InKDJEMOkdkP1bYL8noxB8SDaUwc2J8XWu5iSpHPfKPfS23sVfXGu4zOP4i8TyApptr8I8IXmPmhg0ZWxJh2bIJFvE3TDtWb3zreJ3BJOrTPlTkpsjt3k4Wf/stqTikva1rgLNqH94SfZyQ4/Acx42eyhwRBSXiLXEOCUmbcaCsL+hEK7FmREKRSPmPNThy7JQcJP78fKFBtqN0xqj+Xrcimkjwpsfqw4JTHM9PWItDj8XPvPnOywOxvzA8Or8SkdD4qfylBp8dN+53mlSl+RBqOzbhgtX2rYTqSDT++4sE9Hi9e8G4LijuWczMLjbBulSW//j+mhHJcglNasOEkpWIZKloJUKvzRRJLMIiWQQWSfQRTpFoJULvTxT/gDvdPQHtGGNYJG8gkukME5xwimR8ckpiVMcEh0XCxAzhFAmzOlgkTMzAIoleYkwkvBzFWsZfJFfHrbqxwphHjIiEF8hi/sTv9+26wUorumnHCmMetFCZtm86HlbI8ugTCS/ZuebpG+nQDVbi7oxDN16YyPN4fkyu+avtl6Gnyj88RpVIeBFxRl1E/Pv+/6MbsETjxDEZSjORp3nCJtde1vYHvXe/VK7jqBMJ/RPVs2fPMDU9janxJ4aDjYlfhgYnZd+PztwL+PRjogt1uU4iakRC0MHpJOhkHj9+jMlJl5QJRybxD/Xx2PAj3LrdLvuexsCd6Z8NBzBjPrQGsPbajTqRqFHJ3NycHFD06UShLs2Z0ATsECFOmokDNH3pHBrCwMAAuv+4K/uexgCNhfHnXSjpTzUczEzkoXRGnWDVQn0YNSIhtDKhk6I0h+ZM6J+L6G4O3RqmE2biAaUvHz58iKmpKYyOjqKvr98rEXUwUh4++rzdMHdnIsfgkyY8W5gOuGaJqBMJocqETogGFU3A0t0cOkkmvqDo49nz5/LDwuVyYXDwvk4iTGwQlSIh6ERUaGApYlF5ycQFFHm+xPz8PJ4LmVBk4nQOsURikKgViYpWKEz8QR8Q6pwYiYQGpNE4YKKbqBcJE9/QgKOBRwOQBiKLJDZhkTCmwiKJD1gkjKmwSOIDFgljKiyS+IBFwphKuEXiHB7F9d9vS+i1URtm9bBIGFMJl0joblDZjxfl9/FqKfvpoqwz2oZZOSwSxlTCJZLrrbelOC7VNWH64YyEXlMZ1Rltsxrcs7Tyfxt6JgOXiFjVshMxAouEMZVwieSnqstyASx66E0to9dURnXatqviaReKd2+CJTkFO9MEyRZYUvPROK22oQWy9ItoxSMsEsZUwiWSHyp+wb9OlQaUUxnV+ZevDDca8/2W0KRV7E5nIkG39i+LRIVFwoSFcInk4uUGmcY8mnnsLaP0hsqoTtt25QyjNN1AEm5Kc/r0IrnhQmtZLg6kpSO70I6ep/ptZu7aUVyQhYzdWcgrq4fTWz+MmsIzaB3uQ1WhqM91eBf6ltsc3oedWbkoru4KWPYzkrBIGFMJl0jGJ1xymc7Pvjgll/L88cIl+fofBYWyzmib5aNEJMk5djjdRvWEIpL3UrNgrW5BY1M9Sv/fdiTsLvcJ4XIWLEmpor4NHZ1tqMjfDst+u6eetk9BWmY68irr0dg+LJfYnKjeh7d25KC0lvZph02kV2/ltyxr+c1QwiJhTCVcIiFGxyZw+mwljhw7ic+Pn5Kvqcyo7YrRLOr9nogmbJUtcKqr/EsUkWTXaiZh3fU4pF1Y/OkweoYD66sm6b3B9q+7YNvmv8C4UVnkYJEwphJOkUQUtws9TeWw5aTiraQUHLqs/h6e1EaX/lCZRiRy+1k4O0V0UX0GtoJ9eM9bb7D94Bns/HcRjTRRNKJiR15aIg5dXe3C4iuDRcKYSrhE8uzZc7mm79XmVrlIOP2cfRyZMee+kY/kpFw0ynQnuEicVSJNSdqMPYetsJXZ0dgppPAmkbRbYdmWibxC0d6P0puzvnYRhEXCmEo4RDJwfxifiVSGJlZVaL6k625vQFv6CgP/siUz24bSQjs6/OdHZh3I9ktNFhcJpSRbYevU1OtSH4PtJ+3Ys04VVXTAImFMJdQioWdFaFL1f74+g56+wQBRDI+M4fA/C3WSOf/zr7o2S0e5a/Nefj0m1AfO3MOoyddOpgYTiQsVuy04VKtGEm70lGbC8iaR0CTvYb/bzsPl2LNF3SbysEgYUwm1SKYePpJyoFTGqH5OHOday01UOerlw2nU1l5da9h2SUy3wLZvs7jwE5EgseDtfUXo8E64BhOJSIU6i5CxJRGW5O14O2kTDlSVvzm1ITSTvG8nW5CwJVUzLxN5WCSMqYRaJM7hB1IOg84Rw3pibMIFq+1bCbWlORSjdsvCPSu/oHw1j8Kv6FF6eVxzJli1sEgYUwm9SEalHBb7T1+tROh1yESyxmGRMKYSapHQvtrau+RPo3qtROj9ieIf5N0d/3bM8mCRMKYSapEEY3xySmJUx6wcFgljKpEWCRMeWCSMqbBI4gMWCWMqLJL4gEXCmAqLJD5gkTCmwiKJD1gkjKmwSOIDFgljKiyS+IBFwpgKiyQ+YJEwpsIiiQ9YJIypsEjig6WJ5DX+P5CI/j2mRmJHAAAAAElFTkSuQmCC"},6430:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/playback2-ec27c32f83e65baf353914299635f464.png"},2198:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/plotly-f05f6c67e2388529bbafc508cf2dc4cf.png"},6536:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/plotly2-48707125cf7011ca6ae64b2bc88d21ca.png"},155:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/prompt_actions-4fbbf3872ca18751a819977efcfa0a77.png"},3115:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/pt_search-13fa8427ae1e46b9553930dd91fdc41a.png"},3845:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/pt_share-2fe22502e0aac65be9db10c2195d7071.png"},1254:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/pt_unshare-6586692d9e1f05edfe8a1bf967365c0c.png"},1198:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/replay2-f86b70983ec830788b0e3aebdaeda678.png"},6969:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/search-conv-6f8993d9ed3be0be9ef1d2d5a0e3c829.png"},1563:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/share_conv-a95b232e78f139731210e52e9f36857a.png"},299:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/shared-6b32551db1bde691a30c876e5f186fcd.png"},3626:(e,n,t)=>{t.d(n,{Z:()=>s});const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIcAAAAiCAYAAAB1NspXAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwgAADsIBFShKgAAABSBJREFUeF7tmN1Lm1ccx/dH5Mpb73IjejO2iw0ZLb2o4IWQi0CFQAqCDC9msxvdEEPXERkuYRTLcMmYq7Y2ywpqKGmjTbuY+L6pTddlmbZJtJpVy6M2Ct+dc57kyfP4PM/U4Fv0XHwg55zfOc8Tzuf5nZf3dnZ2wOFoweXg6MLl4OjC5eDowuXg6MLl4OjC5eDowuXg6HJiciQWXjK02jingxOTo/unfoZWG+d0cCxyrGbe4I+554q6yPgMQ173+1yMxcrr9oOQyZB+Mta040qOtZP9L8ciRzg6hS+uf8smn5af/RnHk9FxRoz8pnUzs89YzOjYtKLv3qTRZy2HoUxJlbULkxmt+BNmOYbgRAKCVptEGmGXGVX0v3RENdqPh2NbVkbHpvB6ZRU/9vqYBHJ67txnbZHxg4pBEeWo70/L6jIId1yEocmLVUXsKSBih8F6G0mtNkomBEddJWpbvfDYz4kclDu/DOLLr5x4/NsY3qytM4ZDEVZ31zek2WdvtOQgpLy4WtYEP8seCfhdboQTMfhcTahvHZAmJzniRrvNjHqbHZ4R5RjxIQc8kTSJ6UKz1YxmlxfzJM0LiQA8bQ2kjwO+2YwUvxpxwzlEskLMC6fGmKzdVgfDBQvaXQ74XxSeJZEKwT8hjhnuOCdy/LPwimWJx0/Vf3b4SYS1Lb5Kqdr25v/ksMCXouUoHGU1MFnMaO8P5NK6gElXDaqukAkeCSE44oXjihGXOqNSyqeTU2ttQMst0mckgFuNRhgbSbnVDT/p4++x4RJ5Rt+iGJ/st5CsYMGn1tyYD9xovmzE1f4EaxcWowh2N8BgsrP2+eXcu+pwpuWgR1V6ImGbz4kZJsDa+ltVHM0gtG18apbF0j77P+ZqyxHvIRNldiPOylSOcjQ/EAoxi7dRX9YAn3yC1gJoqaiDJ/dFs8lpCxT2BwnaJ5+NKGn4GsvR8kgcl8lR0YqgfBP5wg0TrRNy5b2WFRnnRo6nkQlRDiLC7ri8HHTjWqwcxuoa1JpyVJMvvM4GfyIfI8rhiBT6CY9aYWj07pqkDPw2ItGQTlpnQtkRluLFmLyYTA7VmDF4TB/DOZ0rczn02draUtXRUwuVI7X0WtW2N7nM4ZmRHWdlGYKhliPpIxN5IySLEQnfKEx2UXLIMw1DfD/p2edZju0syRiTWcTH1CzFt1lMNpuV4uOJBbR97ULvvQGp7mDo7DkUqOXYmXai+oITk4o4+pUb4ZgQy0XJYcovZTkEslRJex/CeZYjem8L7R+91eXflCgIzRR5vvnuB4UwB6NIOagIZrJZ7BM3i5R4nwXGywVhipKjTD6meKQ22gYKR2oqh6kL81uFMfQ4c3Ikn2cR/H5TInBzE9c/Kcix9Jcox/3Bh/h1MMDkoHcgu8fZP8XKQVgOwWmtJJvISlRVlKPKbEdQtkEtSg5rF/o6a2D88H18QMekl3GKW84EfE3kmeR98nsbPc6cHHLeka+j57MNReZI5+SgN6FUCirH0vKKqu+xckjX1KIcuSVDKP1r/COTI/uuIEbv5xt42LWpyBz5JaXzplvVt1RRyHEGOBI5qBhUiLwYtEyXGHnmoHcakzNzEIQNVf9SJTlkQ63s9rXUOXQ55GLQzEHLtH63HJzTz6HLcbdFFOPnaxtsz5GvH+4WTzHLf3M5SoVDlWN9ZVvKGHIxKPlTDL0HkddzTi+HnjlezmVVYnBKkyPZkHLOBlwOji5cDo4uXA6OLlwOji5cDo4OO/gP0MoGJj3NhccAAAAASUVORK5CYII="},4091:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/shared_prompt2-d728e8cf8e5859123582a9b8f87808a2.png"},9180:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/system_prompt-c64a3a8ad45aa928cf8e8fd41a9c95f3.png"},9402:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/temperature-259895bafb8f9c1336e6fa97864ace7c.png"},5498:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/unshare_conv-7911515c82cefef41f954d14384609e1.png"},3578:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/user_settings-0a34980bd07353872d12bc1d39d86e04.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>r,a:()=>o});var s=t(7294);const i={},a=s.createContext(i);function o(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2e7f61df.0bf3848a.js b/assets/js/2e7f61df.0bf3848a.js new file mode 100644 index 00000000..b40991e4 --- /dev/null +++ b/assets/js/2e7f61df.0bf3848a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdial=self.webpackChunkdial||[]).push([[184],{2850:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var t=i(5893),r=i(1151);const o={},s="How to Set Microsoft Entra as Identity Provider",a={id:"Deployment/idp-configuration/entraID",title:"entraID",description:"- Introduction",source:"@site/docs/Deployment/idp-configuration/entraID.md",sourceDirName:"Deployment/idp-configuration",slug:"/Deployment/idp-configuration/entraID",permalink:"/Deployment/idp-configuration/entraID",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"CustomSideBar",previous:{title:"cognito",permalink:"/Deployment/idp-configuration/cognito"},next:{title:"google",permalink:"/Deployment/idp-configuration/google"}},l={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Configuration Guidelines",id:"configuration-guidelines",level:2},{value:"Configure Microsoft Entra ID",id:"configure-microsoft-entra-id",level:3},{value:"Configure AI DIAL",id:"configure-ai-dial",level:3},{value:"AI DIAL Chat Settings",id:"ai-dial-chat-settings",level:4},{value:"AI DIAL Core Settings",id:"ai-dial-core-settings",level:4},{value:"Assignment of Roles",id:"assignment-of-roles",level:4}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"how-to-set-microsoft-entra-as-identity-provider",children:"How to Set Microsoft Entra as Identity Provider"}),"\n",(0,t.jsxs)("div",{class:"docusaurus-ignore",children:[(0,t.jsx)(n.h1,{id:"table-of-contents",children:"Table of Contents"}),(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#introduction",children:"Introduction"})}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"#configuration-guidelines",children:"Configuration Guidelines"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#configure-microsoft-entra-id",children:"Configure Microsoft Entra ID"})}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"#configure-ai-dial",children:"Configure AI DIAL"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#ai-dial-chat-settings",children:"AI DIAL Chat Settings"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#ai-dial-core-settings",children:"AI DIAL Core Settings"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#assignment-of-roles",children:"Assignment of Roles"})}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]})]}),"\n",(0,t.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,t.jsxs)(n.p,{children:["This basic tutorial demonstrates how to configure ",(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/entra/fundamentals/whatis",children:"Microsoft Entra ID"})," and integrate it with AI DIAL for identity and access management."]}),"\n",(0,t.jsx)(n.p,{children:"In AI DIAL, you can assign roles to Models, Applications, Addons, and Assistants to restrict the number of tokens that can be transmitted in a specific time frame. These roles and their limitations can be created in external systems and then assigned in AI DIAL's configuration."}),"\n",(0,t.jsx)(n.h2,{id:"configuration-guidelines",children:"Configuration Guidelines"}),"\n",(0,t.jsx)(n.h3,{id:"configure-microsoft-entra-id",children:"Configure Microsoft Entra ID"}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["[!TIP]\nReplace ",(0,t.jsx)(n.code,{children:""})," with the actual address of your AI DIAL Chat application."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Follow these steps to configure Microsoft Entra ID:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Create an Application:"})," refer to ",(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/azure/healthcare-apis/register-application",children:"Microsoft documentation"})," to learn how to register an application. Set the following parameters:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Name"}),"\n",(0,t.jsx)(n.li,{children:"Supported account types"}),"\n",(0,t.jsxs)(n.li,{children:["Platform: ",(0,t.jsx)(n.code,{children:"Web"})]}),"\n",(0,t.jsxs)(n.li,{children:["Redirect URI: ",(0,t.jsx)(n.code,{children:"https:///api/auth/callback/azure-ad"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["After registering an application, obtain and save ",(0,t.jsx)(n.strong,{children:"Application (client) ID"})," and ",(0,t.jsx)(n.strong,{children:"Directory (tenant) ID"})," - you will need them to configure AI DIAL. Refer to ",(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/azure/healthcare-apis/register-application#application-id-client-id",children:"Microsoft documentation"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Create and save a Client secret:"})," in the ",(0,t.jsx)(n.strong,{children:"Certificates & secrets/Client secret"})," section, create ",(0,t.jsx)(n.strong,{children:"New client secret"})," and save its value. Refer to ",(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/azure/healthcare-apis/register-application#certificates--secrets",children:"Microsoft documentation"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["(Optional) ",(0,t.jsx)(n.strong,{children:"Create a Group and add members:"})," once the application integration is set up, create the necessary Group and add members. Refer to ",(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/entra/fundamentals/groups-view-azure-portal",children:"Microsoft documentation"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["(Optional) ",(0,t.jsx)(n.strong,{children:"Configure ID Token:"})," in the ",(0,t.jsx)(n.strong,{children:"Token Configuration"})," section, ",(0,t.jsx)(n.strong,{children:"Add Groups claim"})," and customize which groups you want to include and where (access, ID token). Refer to ",(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-fed-group-claims#important-caveats-for-this-functionality",children:"Microsoft documentation"}),"."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"configure-ai-dial",children:"Configure AI DIAL"}),"\n",(0,t.jsx)(n.p,{children:"By configuring both AI DIAL Chat and AI DIAL Core with the necessary Microsoft Entra ID environment variables, you will enable them to work together seamlessly with Microsoft Entra ID for authentication and authorization purposes."}),"\n",(0,t.jsx)(n.p,{children:"To configure AI DIAL Chat and AI DIAL Core to work with Microsoft Entra ID, follow these steps:"}),"\n",(0,t.jsx)(n.h4,{id:"ai-dial-chat-settings",children:"AI DIAL Chat Settings"}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["[!NOTE]\nThe application ",(0,t.jsx)(n.strong,{children:"scope"})," is required to validate signature of the access token.\nRefer to ",(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/answers/questions/318741/graphapi-cannot-validate-access-token-signature",children:"Microsoft Portal"})," to read more about this case."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Add the following environment variables to AI DIAL Chat configuration. Refer to ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial-chat/blob/development/apps/chat/README.md#environment-variables",children:"AI DIAL Chat"})," for more details."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'AUTH_AZURE_AD_CLIENT_ID: ""\nAUTH_AZURE_AD_TENANT_ID: ""\nAUTH_AZURE_AD_SECRET: ""\nAUTH_AZURE_AD_SCOPE: "openid profile /.default email offline_access"\n'})}),"\n",(0,t.jsx)(n.h4,{id:"ai-dial-core-settings",children:"AI DIAL Core Settings"}),"\n",(0,t.jsxs)(n.p,{children:["Add the following parameters to AI DIAL Core ",(0,t.jsx)(n.strong,{children:"static"})," settings. Refer to ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core?tab=readme-ov-file#static-settings",children:"AI DIAL Core"})," for more details."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'aidial.identityProviders.azure.jwksUrl: "https://login.microsoftonline.com//discovery/v2.0/keys"\naidial.identityProviders.azure.rolePath: "groups"\naidial.identityProviders.azure.issuerPattern: \'^https:\\/\\/sts\\.windows\\.net.+$\'\naidial.identityProviders.azure.loggingKey: "sub"\naidial.identityProviders.azure.loggingSalt: "loggingSalt"\n'})}),"\n",(0,t.jsx)(n.h4,{id:"assignment-of-roles",children:"Assignment of Roles"}),"\n",(0,t.jsxs)(n.p,{children:["Once all the above steps are completed, including the ones marked as ",(0,t.jsx)(n.strong,{children:"Optional"}),", you can assign roles to Models, Applications, Addons, and Assistants."]}),"\n",(0,t.jsx)(n.p,{children:"In AI DIAL Core:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core?tab=readme-ov-file#static-settings",children:"Static settings"}),": as value for ",(0,t.jsx)(n.code,{children:"aidial.identityProviders.azure.rolePath"})," provide a claim from Microsoft Entra."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core?tab=readme-ov-file#dynamic-settings",children:"Dynamic settings"}),": for ",(0,t.jsx)(n.code,{children:"userRoles"})," provide a specific group name as a claim value."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["In this example, ",(0,t.jsx)(n.code,{children:'"azure-group-name"'})," role from the ",(0,t.jsx)(n.code,{children:'"groups"'})," claim is configured for ",(0,t.jsx)(n.code,{children:"chat-gpt-35-turbo"})," model:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'# Dynamic settings of AI DIAL Core\n"models": {\n "chat-gpt-35-turbo": {\n "type": "chat",\n "endpoint" : "http://localhost:7001/v1/openai/deployments/gpt-35-turbo/chat/completions",\n "upstreams": [\n {"endpoint": "http://localhost:7001", "key": "modelKey1"}\n ],\n "userRoles": ["azure-group-name"]\n }\n}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>a,a:()=>s});var t=i(7294);const r={},o=t.createContext(r);function s(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3392dc53.1c868d78.js b/assets/js/3392dc53.1c868d78.js new file mode 100644 index 00000000..59d79aeb --- /dev/null +++ b/assets/js/3392dc53.1c868d78.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdial=self.webpackChunkdial||[]).push([[410],{3547:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var t=i(5893),s=i(1151);const o={},r="How to Set Okta as Identity Provider",a={id:"Deployment/idp-configuration/okta",title:"okta",description:"- Introduction",source:"@site/docs/Deployment/idp-configuration/okta.md",sourceDirName:"Deployment/idp-configuration",slug:"/Deployment/idp-configuration/okta",permalink:"/Deployment/idp-configuration/okta",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"CustomSideBar",previous:{title:"keycloak",permalink:"/Deployment/idp-configuration/keycloak"},next:{title:"OpenAI Model Deployment",permalink:"/Deployment/OpenAI Model Deployment"}},l={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Configuration Guidelines",id:"configuration-guidelines",level:2},{value:"Configure Okta",id:"configure-okta",level:3},{value:"Configure AI DIAL",id:"configure-ai-dial",level:3},{value:"AI DIAL Chat Settings",id:"ai-dial-chat-settings",level:4},{value:"AI DIAL Core Settings",id:"ai-dial-core-settings",level:4},{value:"Assignment of Roles",id:"assignment-of-roles",level:4}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"how-to-set-okta-as-identity-provider",children:"How to Set Okta as Identity Provider"}),"\n",(0,t.jsxs)("div",{class:"docusaurus-ignore",children:[(0,t.jsx)(n.h1,{id:"table-of-contents",children:"Table of Contents"}),(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#introduction",children:"Introduction"})}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"#configuration-guidelines",children:"Configuration Guidelines"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#configure-okta",children:"Configure Okta"})}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"#configure-ai-dial",children:"Configure AI DIAL"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#ai-dial-chat-settings",children:"AI DIAL Chat Settings"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#ai-dial-core-settings",children:"AI DIAL Core Settings"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#assignment-of-roles",children:"Assignment of Roles"})}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]})]}),"\n",(0,t.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,t.jsxs)(n.p,{children:["This basic tutorial demonstrates how to configure an application in ",(0,t.jsx)(n.a,{href:"https://www.okta.com/customer-identity/single-sign-on",children:"Okta"})," and integrate it with AI DIAL for identity and access management."]}),"\n",(0,t.jsx)(n.p,{children:"In AI DIAL, you can assign roles to Models, Applications, Addons, and Assistants to restrict the number of tokens that can be transmitted in a specific time frame. These roles and their limitations can be created in external systems and then assigned in AI DIAL's configuration."}),"\n",(0,t.jsx)(n.h2,{id:"configuration-guidelines",children:"Configuration Guidelines"}),"\n",(0,t.jsx)(n.h3,{id:"configure-okta",children:"Configure Okta"}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["[!TIP]\nReplace ",(0,t.jsx)(n.code,{children:""})," with the actual address of your AI DIAL Chat application."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Follow these steps to configure Okta:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Create an Application:"})," begin by creating an ",(0,t.jsx)(n.a,{href:"https://help.okta.com/okta_help.htm?type=oie&locale=en&id=csh-apps-main",children:"Application"}),". You can refer to the official Okta documentation for detailed instructions on ",(0,t.jsx)(n.a,{href:"https://help.okta.com/oie/en-us/content/topics/apps/apps_app_integration_wizard_oidc.htm",children:"how to create an OIDC app integration"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Configure Application Settings:"})," under the ",(0,t.jsx)(n.strong,{children:"Applications/Applications"})," section, set the following parameters:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Sign-in redirect URIs: ",(0,t.jsx)(n.code,{children:"https:///api/auth/callback/okta"})]}),"\n",(0,t.jsxs)(n.li,{children:["Sign-out redirect URIs: ",(0,t.jsx)(n.code,{children:"https://"})]}),"\n",(0,t.jsxs)(n.li,{children:["Obtain and save ",(0,t.jsx)(n.strong,{children:"Client ID"})," and ",(0,t.jsx)(n.strong,{children:"Client secrets"})," generated for your application."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Enable API Scopes:"})," under the ",(0,t.jsx)(n.strong,{children:"Applications/Okta API Scopes"})," section, enable the following scopes:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"okta.users.read"}),"\n",(0,t.jsx)(n.li,{children:"okta.users.read.self"}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Obtain Issuer URI and JWKS URI:"})," under ",(0,t.jsx)(n.strong,{children:"Security/API"})," section, locate the ",(0,t.jsx)(n.strong,{children:"Issuer URI"}),". You can find the ",(0,t.jsx)(n.strong,{children:"jwks_uri"})," within the Issuer URI. This URI will be used in AI DIAL Core configuration."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Create Users:"})," once the application integration is set up, create the necessary users. Refer to ",(0,t.jsx)(n.a,{href:"https://help.okta.com/oie/en-us/content/topics/users-groups-profiles/usgp-people.htm",children:"People"})," to learn how to do this."]}),"\n",(0,t.jsxs)(n.li,{children:["(Optional) ",(0,t.jsx)(n.strong,{children:"Create Groups:"})," create the necessary ",(0,t.jsx)(n.a,{href:"https://help.okta.com/oie/en-us/content/topics/users-groups-profiles/usgp-groups-main.htm",children:"Groups"})," in Okta."]}),"\n",(0,t.jsxs)(n.li,{children:["(Optional) ",(0,t.jsx)(n.strong,{children:"Assign People:"})," assign users (People) to the relevant Groups."]}),"\n",(0,t.jsxs)(n.li,{children:["(Optional) ",(0,t.jsx)(n.strong,{children:"Assign Application to Group:"})," refer to ",(0,t.jsx)(n.a,{href:"https://help.okta.com/oie/en-us/content/topics/users-groups-profiles/usgp-assign-app-group.htm",children:"Assign the Application to group"})," to learn how to do this."]}),"\n",(0,t.jsxs)(n.li,{children:["(Optional) ",(0,t.jsx)(n.strong,{children:"Configure ID Token:"})," under the ",(0,t.jsx)(n.strong,{children:"Applications/Sign On/OpenID Connect ID Token"})," section, set ",(0,t.jsx)(n.strong,{children:"Groups"})," claim type to ",(0,t.jsx)(n.code,{children:"Filter"})," and ",(0,t.jsx)(n.strong,{children:"Groups claim filter"})," to ",(0,t.jsx)(n.code,{children:"groups; Matches regex: .*"}),". For more information, refer to the ",(0,t.jsx)(n.a,{href:"https://developer.okta.com/docs/guides/customize-tokens-groups-claim/main/",children:"Okta documentation"}),"."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"configure-ai-dial",children:"Configure AI DIAL"}),"\n",(0,t.jsx)(n.p,{children:"To enable AI DIAL Chat and AI DIAL Core to work with Okta, configure them with the necessary Okta-specific parameters."}),"\n",(0,t.jsx)(n.h4,{id:"ai-dial-chat-settings",children:"AI DIAL Chat Settings"}),"\n",(0,t.jsxs)(n.p,{children:["Add the following environment variables to AI DIAL Chat configuration. Refer to ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial-chat/blob/development/apps/chat/README.md#environment-variables",children:"AI DIAL Chat"})," for more details."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'AUTH_OKTA_CLIENT_ID: ""\nAUTH_OKTA_CLIENT_SECRET: ""\nAUTH_OKTA_ISSUER: "" \n'})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["[!TIP]\n",(0,t.jsx)(n.code,{children:"okta_issuer"})," example: ",(0,t.jsx)(n.code,{children:"https://${yourOktaDomain}/oauth2/${authorizationServerId}"})]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"ai-dial-core-settings",children:"AI DIAL Core Settings"}),"\n",(0,t.jsxs)(n.p,{children:["Add the following parameters to AI DIAL Core ",(0,t.jsx)(n.strong,{children:"static"})," settings. Refer to ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core?tab=readme-ov-file#static-settings",children:"AI DIAL Core"})," for more details."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'aidial.identityProviders.okta.jwksUrl: ""\naidial.identityProviders.okta.rolePath: "Groups"\naidial.identityProviders.okta.issuerPattern: \'^https:\\/\\/${yourOktaAccount}\\.okta\\.com.*$\'\naidial.identityProviders.okta.loggingKey: "sub"\naidial.identityProviders.okta.loggingSalt: "loggingSalt"\n'})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["[!TIP]\n",(0,t.jsx)(n.code,{children:"okta_jwks_uri"})," example: ",(0,t.jsx)(n.code,{children:"https://${yourOktaDomain}/oauth2/${authorizationServerId}/v1/keys"})]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"assignment-of-roles",children:"Assignment of Roles"}),"\n",(0,t.jsxs)(n.p,{children:["Once all the above steps are completed, including the ones marked as ",(0,t.jsx)(n.strong,{children:"Optional"}),", you can assign roles to Models, Applications, Addons, and Assistants."]}),"\n",(0,t.jsx)(n.p,{children:"In AI DIAL Core:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core?tab=readme-ov-file#static-settings",children:"Static settings"}),": as value for ",(0,t.jsx)(n.code,{children:"aidial.identityProviders.okta.rolePath"})," provide a claim from Okta."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core?tab=readme-ov-file#dynamic-settings",children:"Dynamic settings"}),": for ",(0,t.jsx)(n.code,{children:"userRoles"})," provide a specific claim value."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["In this example, ",(0,t.jsx)(n.code,{children:"okta-group-name"})," claim value from the ",(0,t.jsx)(n.code,{children:"Groups"})," Okta claim is configured for ",(0,t.jsx)(n.code,{children:"chat-gpt-35-turbo"})," model:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'# Dynamic settings of AI DIAL Core\n"models": {\n "chat-gpt-35-turbo": {\n "type": "chat",\n "endpoint" : "http://localhost:7001/v1/openai/deployments/gpt-35-turbo/chat/completions",\n "upstreams": [\n {"endpoint": "http://localhost:7001", "key": "modelKey1"}\n ],\n "userRoles": ["okta-group-name"]\n }\n}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>a,a:()=>r});var t=i(7294);const s={},o=t.createContext(s);function r(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3822d5df.5a246e6f.js b/assets/js/3822d5df.5a246e6f.js new file mode 100644 index 00000000..d908762b --- /dev/null +++ b/assets/js/3822d5df.5a246e6f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdial=self.webpackChunkdial||[]).push([[605],{9655:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>c});var i=t(5893),s=t(1151);const o={},a="How to Set Auth0 as Identity Provider",r={id:"Deployment/idp-configuration/auth0",title:"auth0",description:"- Introduction",source:"@site/docs/Deployment/idp-configuration/auth0.md",sourceDirName:"Deployment/idp-configuration",slug:"/Deployment/idp-configuration/auth0",permalink:"/Deployment/idp-configuration/auth0",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"CustomSideBar",previous:{title:"configuration",permalink:"/Deployment/configuration"},next:{title:"cognito",permalink:"/Deployment/idp-configuration/cognito"}},l={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Configuration Guidelines",id:"configuration-guidelines",level:2},{value:"Configure Auth0",id:"configure-auth0",level:3},{value:"Configure AI DIAL",id:"configure-ai-dial",level:3},{value:"AI DIAL Chat Settings",id:"ai-dial-chat-settings",level:4},{value:"AI DIAL Core Settings",id:"ai-dial-core-settings",level:4},{value:"Assignment of Roles",id:"assignment-of-roles",level:4}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"how-to-set-auth0-as-identity-provider",children:"How to Set Auth0 as Identity Provider"}),"\n",(0,i.jsxs)("div",{class:"docusaurus-ignore",children:[(0,i.jsx)(n.h1,{id:"table-of-contents",children:"Table of Contents"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#introduction",children:"Introduction"})}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#configuration-guidelines",children:"Configuration Guidelines"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#configure-auth0",children:"Configure Auth0"})}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#configure-ai-dial",children:"Configure AI DIAL"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#ai-dial-chat-settings",children:"AI DIAL Chat Settings"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#ai-dial-core-settings",children:"AI DIAL Core Settings"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#assignment-of-roles",children:"Assignment of Roles"})}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]})]}),"\n",(0,i.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsxs)(n.p,{children:["This basic tutorial demonstrates how to configure an application in ",(0,i.jsx)(n.a,{href:"https://auth0.com/docs/get-started",children:"Auth0"})," and integrate it with AI DIAL for identity and access management."]}),"\n",(0,i.jsx)(n.p,{children:"In AI DIAL, you can assign roles to Models, Applications, Addons, and Assistants to restrict the number of tokens that can be transmitted in a specific time frame. These roles and their limitations can be created in external systems and then assigned in AI DIAL's configuration."}),"\n",(0,i.jsx)(n.h2,{id:"configuration-guidelines",children:"Configuration Guidelines"}),"\n",(0,i.jsx)(n.h3,{id:"configure-auth0",children:"Configure Auth0"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["[!TIP]\nReplace ",(0,i.jsx)(n.code,{children:""})," with the actual address of your AI DIAL Chat application."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Follow these steps to configure Auth0:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Create Tenant:"})," create a new tenant and save its name. Refer to ",(0,i.jsx)(n.a,{href:"https://auth0.com/docs/get-started/auth0-overview/create-tenants",children:"Auth0 documentation"})," to learn how to do it."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Create Application:"})," create an ",(0,i.jsx)(n.a,{href:"https://auth0.com/docs/get-started/auth0-overview/create-applications",children:"Application"}),". Set a name and choose ",(0,i.jsx)(n.code,{children:"Regular Web Applications"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Configure Application Settings:"})," in the ",(0,i.jsx)(n.a,{href:"https://auth0.com/docs/get-started/applications/application-settings",children:(0,i.jsx)(n.strong,{children:"Applications/Settings"})})," section, set the following parameters:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Obtain and save ",(0,i.jsx)(n.strong,{children:"Domain"}),",",(0,i.jsx)(n.strong,{children:"Client ID"})," and ",(0,i.jsx)(n.strong,{children:"Client secrets"})," generated for your application."]}),"\n",(0,i.jsxs)(n.li,{children:["Allowed Callback URLs: ",(0,i.jsx)(n.code,{children:"https:///api/auth/callback/auth0"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Create API:"})," in the ",(0,i.jsx)(n.strong,{children:"Applications/APIs"})," section, configure a new ",(0,i.jsx)(n.a,{href:"https://auth0.com/docs/get-started/apis/api-settings",children:(0,i.jsx)(n.strong,{children:"API"})}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Create Users:"})," in the ",(0,i.jsx)(n.strong,{children:"User Management/Users"})," section, create necessary ",(0,i.jsx)(n.a,{href:"https://auth0.com/docs/manage-users/user-accounts/create-users",children:"Users"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["(Optional) ",(0,i.jsx)(n.strong,{children:"Create and Assign Roles:"})," in the ",(0,i.jsx)(n.strong,{children:"User Management/Roles"})," section, create necessary ",(0,i.jsx)(n.a,{href:"https://auth0.com/docs/manage-users/access-control/configure-core-rbac/roles/create-roles",children:"Roles"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["(Optional) ",(0,i.jsx)(n.strong,{children:"Create Action:"})," in the ",(0,i.jsx)(n.strong,{children:"Actions/Library"})," section, create a necessary ",(0,i.jsx)(n.a,{href:"https://auth0.com/docs/customize/actions/write-your-first-action#create-an-action",children:"Action"})," and ",(0,i.jsx)(n.a,{href:"https://auth0.com/docs/customize/actions/write-your-first-action#deploy-the-action",children:"Deploy"})," it. Action parameters:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Name: ",(0,i.jsx)(n.code,{children:"DIAL role"})]}),"\n",(0,i.jsxs)(n.li,{children:["Trigger: ",(0,i.jsx)(n.code,{children:"Login/Post Login"})]}),"\n",(0,i.jsxs)(n.li,{children:["Runtime: ",(0,i.jsx)(n.code,{children:"Node 18"})]}),"\n",(0,i.jsxs)(n.li,{children:["Add the following code in the Actions Code Editor:","\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-js",children:"exports.onExecutePostLogin = async (event, api) => {\n if (event.authorization) { \n api.accessToken.setCustomClaim(\"dial_roles\", event.authorization.roles);\n api.accessToken.setCustomClaim('email', event.user.email);\n }\n};\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["(Optional) ",(0,i.jsx)(n.strong,{children:"Configure the Login Flow:"})," in the ",(0,i.jsx)(n.strong,{children:"Actions/Flows"})," section, choose ",(0,i.jsx)(n.code,{children:"Login"}),", add a custom action ",(0,i.jsx)(n.code,{children:"DIAL role"})," to ",(0,i.jsx)(n.code,{children:"Flow"})," and apply the change. Refer to ",(0,i.jsx)(n.a,{href:"https://auth0.com/docs/customize/actions/flows-and-triggers",children:"Auth0"})," documentation to learn more."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"configure-ai-dial",children:"Configure AI DIAL"}),"\n",(0,i.jsx)(n.p,{children:"By configuring both AI DIAL Chat and AI DIAL Core with the necessary environment variables, you will enable them to work together seamlessly with Identity Provider for authentication and authorization purposes."}),"\n",(0,i.jsx)(n.h4,{id:"ai-dial-chat-settings",children:"AI DIAL Chat Settings"}),"\n",(0,i.jsxs)(n.p,{children:["Add the following environment variables to AI DIAL Chat configuration. Refer to ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-chat/blob/development/apps/chat/README.md#environment-variables",children:"AI DIAL Chat"})," for more details."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:'AUTH_AUTH0_HOST: ""\nAUTH_AUTH0_CLIENT_ID: ""\nAUTH_AUTH0_CLIENT_SECRET: ""\nAUTH_AUTH0_AUDIENCE: "" \n'})}),"\n",(0,i.jsx)(n.h4,{id:"ai-dial-core-settings",children:"AI DIAL Core Settings"}),"\n",(0,i.jsxs)(n.p,{children:["Add the following parameters to AI DIAL Core ",(0,i.jsx)(n.strong,{children:"static"})," settings. Refer to ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core?tab=readme-ov-file#static-settings",children:"AI DIAL Core"})," for more details."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:'aidial.identityProviders.auth0.jwksUrl: "https:////.well-known/jwks.json"\naidial.identityProviders.auth0.issuerPattern: \'^https:\\/\\/${auth0_domain_name}\\.eu\\.auth0\\.com.*$\'\naidial.identityProviders.auth0.loggingKey: "sub"\naidial.identityProviders.auth0.loggingSalt: "loggingSalt"\naidial.identityProviders.auth0.rolePath: "dial_roles"\n'})}),"\n",(0,i.jsx)(n.h4,{id:"assignment-of-roles",children:"Assignment of Roles"}),"\n",(0,i.jsxs)(n.p,{children:["Once all the above steps are completed, including the ones marked as ",(0,i.jsx)(n.strong,{children:"Optional"}),", you can assign roles to Models, Applications, Addons, and Assistants."]}),"\n",(0,i.jsx)(n.p,{children:"In AI DIAL Core:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core?tab=readme-ov-file#static-settings",children:"Static settings"}),": as value for ",(0,i.jsx)(n.code,{children:"aidial.identityProviders.auth0.rolePath"})," provide a claim from Auth0."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core?tab=readme-ov-file#dynamic-settings",children:"Dynamic settings"}),": for ",(0,i.jsx)(n.code,{children:"userRoles"})," provide a specific claim value."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["In this example, ",(0,i.jsx)(n.code,{children:"auth0-role-name"})," role from the ",(0,i.jsx)(n.code,{children:'"dial_roles"'})," claim is configured for ",(0,i.jsx)(n.code,{children:"chat-gpt-35-turbo"})," model:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:'# Dynamic settings of AI DIAL Core\n"models": {\n "chat-gpt-35-turbo": {\n "type": "chat",\n "endpoint" : "http://localhost:7001/v1/openai/deployments/gpt-35-turbo/chat/completions",\n "upstreams": [\n {"endpoint": "http://localhost:7001", "key": "modelKey1"}\n ],\n "userRoles": ["auth0-role-name"]\n }\n}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>r,a:()=>a});var i=t(7294);const s={},o=i.createContext(s);function a(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3cda4e15.e2736122.js b/assets/js/3cda4e15.e2736122.js new file mode 100644 index 00000000..a4797226 --- /dev/null +++ b/assets/js/3cda4e15.e2736122.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdial=self.webpackChunkdial||[]).push([[122],{7577:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var i=t(5893),s=t(1151);const r={},a="Configuration",o={id:"Deployment/configuration",title:"configuration",description:"Important: it is assumed that you have a working knowledge of standard Helm chart parameters in order to define them within the configuration file.",source:"@site/docs/Deployment/configuration.md",sourceDirName:"Deployment",slug:"/Deployment/configuration",permalink:"/Deployment/configuration",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"CustomSideBar",previous:{title:"Chat User Guide",permalink:"/user-guide"},next:{title:"auth0",permalink:"/Deployment/idp-configuration/auth0"}},l={},c=[{value:"General method of configuration",id:"general-method-of-configuration",level:2},{value:"Core Parameters",id:"core-parameters",level:2},{value:"Static settings",id:"static-settings",level:3},{value:"Dynamic settings",id:"dynamic-settings",level:3},{value:"Chat Parameters",id:"chat-parameters",level:2},{value:"Themes Parameters",id:"themes-parameters",level:2},{value:"Adapters Parameters",id:"adapters-parameters",level:2},{value:"Assistant Parameters",id:"assistant-parameters",level:2},{value:"Auth Helper Parameters",id:"auth-helper-parameters",level:2}];function h(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Important"}),": it is assumed that you have a working knowledge of standard Helm chart parameters in order to define them within the configuration file."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["This instruction assumes that you are installing and configuring applications using the latest official ",(0,i.jsx)(n.a,{href:"https://charts.epam-rail.com/",children:"dial"})," helm chart."]}),"\n",(0,i.jsxs)("div",{class:"docusaurus-ignore",children:[(0,i.jsx)(n.h1,{id:"table-of-contents",children:"Table of Contents"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#general-method-of-configuration",children:"General method of configuration"})}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#core-parameters",children:"Core Parameters"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#static-settings",children:"Static settings"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#dynamic-settings",children:"Dynamic settings"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#chat-parameters",children:"Chat Parameters"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#themes-parameters",children:"Themes Parameters"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#adapters-parameters",children:"Adapters Parameters"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#assistant-parameters",children:"Assistant Parameters"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#auth-helper-parameters",children:"Auth Helper Parameters"})}),"\n"]})]}),"\n",(0,i.jsx)(n.h2,{id:"general-method-of-configuration",children:"General method of configuration"}),"\n",(0,i.jsxs)(n.p,{children:["AI DIAL helm chart contains various applications, and, to configure them, it is necessary to make corresponding changes to different sections of the ",(0,i.jsx)(n.strong,{children:"values"})," file."]}),"\n",(0,i.jsxs)(n.p,{children:["To add environment variables to AI DIAL application, you can use either ",(0,i.jsx)(n.code,{children:"env"})," or ",(0,i.jsx)(n.code,{children:"secrets"})," section in specific components, e.g ",(0,i.jsx)(n.code,{children:"core.env"}),", ",(0,i.jsx)(n.code,{children:"openai.secrets"})]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Refer to the ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-helm/tree/main/charts/dial/examples",children:"helm chart repository"})," to view selected configuration examples."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"core-parameters",children:"Core Parameters"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Refer to the ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core",children:"AI DIAL Core"})," to view a complete documentation."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Configure AI DIAL Core parameters in the ",(0,i.jsx)(n.code,{children:"core"})," section of the values file."]}),"\n",(0,i.jsxs)(n.p,{children:["You can provide ",(0,i.jsx)(n.strong,{children:"dynamic"})," and ",(0,i.jsx)(n.strong,{children:"static"})," settings for the AI DIAL Core:"]}),"\n",(0,i.jsx)(n.h3,{id:"static-settings",children:"Static settings"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Refer to ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core#static-settings",children:"static settings"})," in the AI DIAL Core repository to learn more."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Static settings are used on startup and ",(0,i.jsx)(n.strong,{children:"cannot"})," be changed while application is running. You can modify static settings in two ways:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["via environment variables","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["add a parameter to an environment variable with the prefix ",(0,i.jsx)(n.strong,{children:"aidial."}),", e.g. ",(0,i.jsx)(n.code,{children:"aidial.server.port"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["by overriding the default configuration file","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["set the environment variable ",(0,i.jsx)(n.strong,{children:"AIDIAL_SETTINGS"})," with a full path to the config file"]}),"\n",(0,i.jsx)(n.li,{children:"mount the configuration file at the above path"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"dynamic-settings",children:"Dynamic settings"}),"\n",(0,i.jsxs)(n.p,{children:["Dynamic settings are stored in JSON files, specified via ",(0,i.jsx)(n.code,{children:"config.files"})," static setting, and reloaded at interval, specified via ",(0,i.jsx)(n.code,{children:"config.reload"})," static setting."]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Refer to ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core#dynamic-settings",children:"dynamic settings"})," in the AI DIAL Core repository to learn more."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"To modify dynamic settings:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["add the environment variable ",(0,i.jsx)(n.strong,{children:"aidial.config.files"}),", e.g. ",(0,i.jsx)(n.code,{children:"aidial.config.files: '[\"/mnt/secrets-store/aidial.config.json\"]'"})]}),"\n",(0,i.jsx)(n.li,{children:"mount the configuration file at the provided path"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"chat-parameters",children:"Chat Parameters"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Refer to the ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-chat",children:"AI DIAL Chat"})," to view a complete documentation."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Configure ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-chat/tree/development/apps/chat#environment-variables",children:"chat parameters"})," in the ",(0,i.jsx)(n.code,{children:"chat"})," section of the values file."]}),"\n",(0,i.jsx)(n.p,{children:"You can modify chat settings using environment variables."}),"\n",(0,i.jsx)(n.h2,{id:"themes-parameters",children:"Themes Parameters"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Refer to the ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-chat-themes",children:"AI DIAL Chat Themes"})," to view a complete documentation."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Configure Themes parameters in the ",(0,i.jsx)(n.code,{children:"themes"})," section of the values file."]}),"\n",(0,i.jsx)(n.p,{children:"This component is designed for customizing AI DIAL Chat themes and images, as well as hosting the necessary static files for other AI DIAL applications. To apply any changes, we recommend building your own Docker image based on this component."}),"\n",(0,i.jsx)(n.h2,{id:"adapters-parameters",children:"Adapters Parameters"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Refer to the ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-adapter-bedrock",children:"Adapter for Bedrock"})," to view a complete documentation."]}),"\n",(0,i.jsxs)(n.li,{children:["Refer to the ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-adapter-vertexai",children:"Adapter for Vertex"})," to view a complete documentation."]}),"\n",(0,i.jsxs)(n.li,{children:["Refer to the ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-adapter-openai",children:"Adapter for OpenAI"})," to view a complete documentation."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["To work with Azure, AWS or GCP models, AI DIAL uses applications called Adapters. You can configure Adapters in the ",(0,i.jsx)(n.code,{children:"openai"}),",",(0,i.jsx)(n.code,{children:"bedrock"})," and ",(0,i.jsx)(n.code,{children:"vertexai"})," sections."]}),"\n",(0,i.jsx)(n.p,{children:"You can modify adapters settings using environment variables."}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"Refer to these repositories to learn how to configure adapters:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/Deployment/Bedrock%20Model%20Deployment#configure-adapter",children:"Bedrock Model Deployment"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/Deployment/OpenAI%20Model%20Deployment#configure-adapter",children:"OpenAI Model Deployment"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/Deployment/Vertex%20Model%20Deployment#configure-adapter",children:"Vertex Model Deployment"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"assistant-parameters",children:"Assistant Parameters"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Refer to the ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-assistant",children:"AI DIAL Assistant"})," to view a complete documentation."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["You can add AI DIAL ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-assistant#environment-variables",children:"Assistant settings"})," in the ",(0,i.jsx)(n.code,{children:"assistant"})," section of the AI DIAL values file."]}),"\n",(0,i.jsx)(n.p,{children:"You can modify Assistant settings using environment variables."}),"\n",(0,i.jsx)(n.h2,{id:"auth-helper-parameters",children:"Auth Helper Parameters"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Refer to the ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-auth-helper",children:"Auth Helper"})," to view a complete documentation."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["You can add ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-auth-helper#configure",children:"Auth Helper settings"})," in the ",(0,i.jsx)(n.code,{children:"authhelper"})," section of the AI DIAL values file."]}),"\n",(0,i.jsxs)(n.p,{children:["You can modify Assistant settings using environment variables with ",(0,i.jsx)(n.a,{href:"https://docs.spring.io/spring-boot/docs/2.1.8.RELEASE/reference/html/boot-features-external-config.html",children:"Spring style"}),"."]})]})}function d(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>a});var i=t(7294);const s={},r=i.createContext(s);function a(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3cda4e15.fecb72e0.js b/assets/js/3cda4e15.fecb72e0.js deleted file mode 100644 index 8272a833..00000000 --- a/assets/js/3cda4e15.fecb72e0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdial=self.webpackChunkdial||[]).push([[122],{7577:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var i=t(5893),s=t(1151);const r={},a="Configuration",o={id:"Deployment/configuration",title:"configuration",description:"Important: it is assumed that you have a working knowledge of standard Helm chart parameters in order to define them within the configuration file.",source:"@site/docs/Deployment/configuration.md",sourceDirName:"Deployment",slug:"/Deployment/configuration",permalink:"/Deployment/configuration",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"CustomSideBar",previous:{title:"Chat User Guide",permalink:"/user-guide"},next:{title:"OpenAI Model Deployment",permalink:"/Deployment/OpenAI Model Deployment"}},l={},c=[{value:"General method of configuration",id:"general-method-of-configuration",level:2},{value:"Core Parameters",id:"core-parameters",level:2},{value:"Static settings",id:"static-settings",level:3},{value:"Dynamic settings",id:"dynamic-settings",level:3},{value:"Chat Parameters",id:"chat-parameters",level:2},{value:"Themes Parameters",id:"themes-parameters",level:2},{value:"Adapters Parameters",id:"adapters-parameters",level:2},{value:"Assistant Parameters",id:"assistant-parameters",level:2},{value:"Auth Helper Parameters",id:"auth-helper-parameters",level:2}];function h(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Important"}),": it is assumed that you have a working knowledge of standard Helm chart parameters in order to define them within the configuration file."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["This instruction assumes that you are installing and configuring applications using the latest official ",(0,i.jsx)(n.a,{href:"https://charts.epam-rail.com/",children:"dial"})," helm chart."]}),"\n",(0,i.jsxs)("div",{class:"docusaurus-ignore",children:[(0,i.jsx)(n.h1,{id:"table-of-contents",children:"Table of Contents"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#general-method-of-configuration",children:"General method of configuration"})}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#core-parameters",children:"Core Parameters"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#static-settings",children:"Static settings"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#dynamic-settings",children:"Dynamic settings"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#chat-parameters",children:"Chat Parameters"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#themes-parameters",children:"Themes Parameters"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#adapters-parameters",children:"Adapters Parameters"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#assistant-parameters",children:"Assistant Parameters"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#auth-helper-parameters",children:"Auth Helper Parameters"})}),"\n"]})]}),"\n",(0,i.jsx)(n.h2,{id:"general-method-of-configuration",children:"General method of configuration"}),"\n",(0,i.jsxs)(n.p,{children:["AI DIAL helm chart contains various applications, and, to configure them, it is necessary to make corresponding changes to different sections of the ",(0,i.jsx)(n.strong,{children:"values"})," file."]}),"\n",(0,i.jsxs)(n.p,{children:["To add environment variables to AI DIAL application, you can use either ",(0,i.jsx)(n.code,{children:"env"})," or ",(0,i.jsx)(n.code,{children:"secrets"})," section in specific components, e.g ",(0,i.jsx)(n.code,{children:"core.env"}),", ",(0,i.jsx)(n.code,{children:"openai.secrets"})]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Refer to the ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-helm/tree/main/charts/dial/examples",children:"helm chart repository"})," to view selected configuration examples."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"core-parameters",children:"Core Parameters"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Refer to the ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core",children:"AI DIAL Core"})," to view a complete documentation."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Configure AI DIAL Core parameters in the ",(0,i.jsx)(n.code,{children:"core"})," section of the values file."]}),"\n",(0,i.jsxs)(n.p,{children:["You can provide ",(0,i.jsx)(n.strong,{children:"dynamic"})," and ",(0,i.jsx)(n.strong,{children:"static"})," settings for the AI DIAL Core:"]}),"\n",(0,i.jsx)(n.h3,{id:"static-settings",children:"Static settings"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Refer to ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core#static-settings",children:"static settings"})," in the AI DIAL Core repository to learn more."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Static settings are used on startup and ",(0,i.jsx)(n.strong,{children:"cannot"})," be changed while application is running. You can modify static settings in two ways:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["via environment variables","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["add a parameter to an environment variable with the prefix ",(0,i.jsx)(n.strong,{children:"aidial."}),", e.g. ",(0,i.jsx)(n.code,{children:"aidial.server.port"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["by overriding the default configuration file","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["set the environment variable ",(0,i.jsx)(n.strong,{children:"AIDIAL_SETTINGS"})," with a full path to the config file"]}),"\n",(0,i.jsx)(n.li,{children:"mount the configuration file at the above path"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"dynamic-settings",children:"Dynamic settings"}),"\n",(0,i.jsxs)(n.p,{children:["Dynamic settings are stored in JSON files, specified via ",(0,i.jsx)(n.code,{children:"config.files"})," static setting, and reloaded at interval, specified via ",(0,i.jsx)(n.code,{children:"config.reload"})," static setting."]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Refer to ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core#dynamic-settings",children:"dynamic settings"})," in the AI DIAL Core repository to learn more."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"To modify dynamic settings:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["add the environment variable ",(0,i.jsx)(n.strong,{children:"aidial.config.files"}),", e.g. ",(0,i.jsx)(n.code,{children:"aidial.config.files: '[\"/mnt/secrets-store/aidial.config.json\"]'"})]}),"\n",(0,i.jsx)(n.li,{children:"mount the configuration file at the provided path"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"chat-parameters",children:"Chat Parameters"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Refer to the ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-chat",children:"AI DIAL Chat"})," to view a complete documentation."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Configure ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-chat/tree/development/apps/chat#environment-variables",children:"chat parameters"})," in the ",(0,i.jsx)(n.code,{children:"chat"})," section of the values file."]}),"\n",(0,i.jsx)(n.p,{children:"You can modify chat settings using environment variables."}),"\n",(0,i.jsx)(n.h2,{id:"themes-parameters",children:"Themes Parameters"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Refer to the ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-chat-themes",children:"AI DIAL Chat Themes"})," to view a complete documentation."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Configure Themes parameters in the ",(0,i.jsx)(n.code,{children:"themes"})," section of the values file."]}),"\n",(0,i.jsx)(n.p,{children:"This component is designed for customizing AI DIAL Chat themes and images, as well as hosting the necessary static files for other AI DIAL applications. To apply any changes, we recommend building your own Docker image based on this component."}),"\n",(0,i.jsx)(n.h2,{id:"adapters-parameters",children:"Adapters Parameters"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Refer to the ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-adapter-bedrock",children:"Adapter for Bedrock"})," to view a complete documentation."]}),"\n",(0,i.jsxs)(n.li,{children:["Refer to the ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-adapter-vertexai",children:"Adapter for Vertex"})," to view a complete documentation."]}),"\n",(0,i.jsxs)(n.li,{children:["Refer to the ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-adapter-openai",children:"Adapter for OpenAI"})," to view a complete documentation."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["To work with Azure, AWS or GCP models, AI DIAL uses applications called Adapters. You can configure Adapters in the ",(0,i.jsx)(n.code,{children:"openai"}),",",(0,i.jsx)(n.code,{children:"bedrock"})," and ",(0,i.jsx)(n.code,{children:"vertexai"})," sections."]}),"\n",(0,i.jsx)(n.p,{children:"You can modify adapters settings using environment variables."}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"Refer to these repositories to learn how to configure adapters:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/Deployment/Bedrock%20Model%20Deployment#configure-adapter",children:"Bedrock Model Deployment"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/Deployment/OpenAI%20Model%20Deployment#configure-adapter",children:"OpenAI Model Deployment"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/Deployment/Vertex%20Model%20Deployment#configure-adapter",children:"Vertex Model Deployment"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"assistant-parameters",children:"Assistant Parameters"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Refer to the ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-assistant",children:"AI DIAL Assistant"})," to view a complete documentation."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["You can add AI DIAL ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-assistant#environment-variables",children:"Assistant settings"})," in the ",(0,i.jsx)(n.code,{children:"assistant"})," section of the AI DIAL values file."]}),"\n",(0,i.jsx)(n.p,{children:"You can modify Assistant settings using environment variables."}),"\n",(0,i.jsx)(n.h2,{id:"auth-helper-parameters",children:"Auth Helper Parameters"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Refer to the ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-auth-helper",children:"Auth Helper"})," to view a complete documentation."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["You can add ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-auth-helper#configure",children:"Auth Helper settings"})," in the ",(0,i.jsx)(n.code,{children:"authhelper"})," section of the AI DIAL values file."]}),"\n",(0,i.jsxs)(n.p,{children:["You can modify Assistant settings using environment variables with ",(0,i.jsx)(n.a,{href:"https://docs.spring.io/spring-boot/docs/2.1.8.RELEASE/reference/html/boot-features-external-config.html",children:"Spring style"}),"."]})]})}function d(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>a});var i=t(7294);const s={},r=i.createContext(s);function a(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/51686d2b.1c35e84d.js b/assets/js/51686d2b.1c35e84d.js new file mode 100644 index 00000000..81d211af --- /dev/null +++ b/assets/js/51686d2b.1c35e84d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdial=self.webpackChunkdial||[]).push([[162],{3728:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var o=i(5893),t=i(1151);const s={},l="How to Set Google OAuth2 as Identity Provider",r={id:"Deployment/idp-configuration/google",title:"google",description:"- Introduction",source:"@site/docs/Deployment/idp-configuration/google.md",sourceDirName:"Deployment/idp-configuration",slug:"/Deployment/idp-configuration/google",permalink:"/Deployment/idp-configuration/google",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"CustomSideBar",previous:{title:"entraID",permalink:"/Deployment/idp-configuration/entraID"},next:{title:"keycloak",permalink:"/Deployment/idp-configuration/keycloak"}},a={},d=[{value:"Introduction",id:"introduction",level:2},{value:"Configuration Guidelines",id:"configuration-guidelines",level:2},{value:"Configure Google OAuth2",id:"configure-google-oauth2",level:3},{value:"Configure AI DIAL",id:"configure-ai-dial",level:3},{value:"AI DIAL Chat Settings",id:"ai-dial-chat-settings",level:4},{value:"AI DIAL Core Settings",id:"ai-dial-core-settings",level:4},{value:"Assignment of Roles",id:"assignment-of-roles",level:4}];function c(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"how-to-set-google-oauth2-as-identity-provider",children:"How to Set Google OAuth2 as Identity Provider"}),"\n",(0,o.jsxs)("div",{class:"docusaurus-ignore",children:[(0,o.jsx)(n.h1,{id:"table-of-contents",children:"Table of Contents"}),(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"#introduction",children:"Introduction"})}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"#configuration-guidelines",children:"Configuration Guidelines"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"#configure-google-oauth2",children:"Configure Google OAuth2"})}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"#configure-ai-dial",children:"Configure AI DIAL"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"#ai-dial-chat-settings",children:"AI DIAL Chat Settings"})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"#ai-dial-core-settings",children:"AI DIAL Core Settings"})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"#assignment-of-roles",children:"Assignment of Roles"})}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]})]}),"\n",(0,o.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,o.jsxs)(n.p,{children:["This basic tutorial demonstrates how to configure ",(0,o.jsx)(n.a,{href:"https://developers.google.com/identity/protocols/oauth2",children:"Google OAuth2"})," and integrate it with AI DIAL for identity and access management."]}),"\n",(0,o.jsx)(n.p,{children:"In AI DIAL, you can assign roles to Models, Applications, Addons, and Assistants to restrict the number of tokens that can be transmitted in a specific time frame. These roles and their limitations can be created in external systems and then assigned in AI DIAL's configuration."}),"\n",(0,o.jsx)(n.h2,{id:"configuration-guidelines",children:"Configuration Guidelines"}),"\n",(0,o.jsx)(n.h3,{id:"configure-google-oauth2",children:"Configure Google OAuth2"}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["[!TIP]\nReplace ",(0,o.jsx)(n.code,{children:""})," with the actual address of your AI DIAL Chat application."]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"Follow these steps to configure Google OAuth2:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Create an OAuth consent screen:"})," refer ",(0,o.jsx)(n.a,{href:"https://developers.google.com/workspace/guides/configure-oauth-consent",children:"Google documentation"})," to learn how to do this."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Create Client ID and Secret:"})," click ",(0,o.jsx)(n.strong,{children:"Create Credentials > OAuth Client ID"})," and fill it with:","\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Name"}),"\n",(0,o.jsxs)(n.li,{children:["Application Type: ",(0,o.jsx)(n.code,{children:"Web Application"})]}),"\n",(0,o.jsxs)(n.li,{children:["Authorized JavaScript Origins: ",(0,o.jsx)(n.code,{children:"https://"})]}),"\n",(0,o.jsxs)(n.li,{children:["Authorized Redirect URLs: ",(0,o.jsx)(n.code,{children:"https:///api/auth/callback/google"})]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["Obtain and save ",(0,o.jsx)(n.strong,{children:"Client ID"})," and ",(0,o.jsx)(n.strong,{children:"Client Secret"})," from the ",(0,o.jsx)(n.strong,{children:"OAuth Client"})," modal."]}),"\n",(0,o.jsxs)(n.li,{children:["(Optional) ",(0,o.jsx)(n.strong,{children:"Create a Group and add members:"})," Once the application integration is set up, ",(0,o.jsx)(n.a,{href:"https://support.google.com/a/answer/9400082?hl=en#zippy=%2Cstep-create-a-group",children:"create the necessary Group and add members in Google Group"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["(Optional) ",(0,o.jsx)(n.strong,{children:"Enable the Google Cloud Identity API:"})," click ",(0,o.jsx)(n.code,{children:"ENABLE"})," in ",(0,o.jsx)(n.a,{href:"https://console.cloud.google.com/apis/api/cloudidentity.googleapis.com/",children:"your organization\u2019s dashboard"}),"."]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"configure-ai-dial",children:"Configure AI DIAL"}),"\n",(0,o.jsx)(n.p,{children:"To enable AI DIAL Chat and AI DIAL Core to work with Google OAuth2, configure them with the necessary specific parameters."}),"\n",(0,o.jsx)(n.h4,{id:"ai-dial-chat-settings",children:"AI DIAL Chat Settings"}),"\n",(0,o.jsxs)(n.p,{children:["Add the following environment variables to AI DIAL Chat configuration. Refer to ",(0,o.jsx)(n.a,{href:"https://github.com/epam/ai-dial-chat/blob/development/apps/chat/README.md#environment-variables",children:"AI DIAL Chat"})," for more details."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'AUTH_GOOGLE_CLIENT_ID: ""\nAUTH_GOOGLE_SECRET: ""\nAUTH_GOOGLE_SCOPE: "openid email profile https://www.googleapis.com/auth/cloud-identity.groups.readonly" # Optional\n'})}),"\n",(0,o.jsx)(n.h4,{id:"ai-dial-core-settings",children:"AI DIAL Core Settings"}),"\n",(0,o.jsxs)(n.p,{children:["Add the following parameters to AI DIAL Core ",(0,o.jsx)(n.strong,{children:"static"})," settings. Refer to ",(0,o.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core?tab=readme-ov-file#static-settings",children:"AI DIAL Core"})," for more details."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'aidial.identityProviders.google.userInfoEndpoint: "https://openidconnect.googleapis.com/v1/userinfo"\naidial.identityProviders.google.rolePath: "fn:getGoogleWorkspaceGroups"\naidial.identityProviders.google.loggingKey: "sub"\naidial.identityProviders.google.loggingSalt: "loggingSalt"\n'})}),"\n",(0,o.jsx)(n.h4,{id:"assignment-of-roles",children:"Assignment of Roles"}),"\n",(0,o.jsxs)(n.p,{children:["Once all the above steps are completed, including the ones marked as ",(0,o.jsx)(n.strong,{children:"Optional"}),", you can assign roles to Models, Applications, Addons, and Assistants."]}),"\n",(0,o.jsx)(n.p,{children:"In AI DIAL Core:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core?tab=readme-ov-file#static-settings",children:"Static settings"}),": as value for ",(0,o.jsx)(n.code,{children:"aidial.identityProviders.google.rolePath"})," provide an API endpoint from Google OAuth2."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core?tab=readme-ov-file#dynamic-settings",children:"Dynamic settings"}),": for ",(0,o.jsx)(n.code,{children:"userRoles"})," provide a specific group name."]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["In this example, ",(0,o.jsx)(n.code,{children:'"google-group-name"'})," role from the ",(0,o.jsx)(n.code,{children:'"fn:getGoogleWorkspaceGroups"'})," API endpoint is configured for ",(0,o.jsx)(n.code,{children:"chat-gpt-35-turbo"})," model:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'"models": {\n "chat-gpt-35-turbo": {\n "type": "chat",\n "endpoint" : "http://localhost:7001/v1/openai/deployments/gpt-35-turbo/chat/completions",\n "upstreams": [\n {"endpoint": "http://localhost:7001", "key": "modelKey1"}\n ],\n "userRoles": ["google-group-name"]\n }\n}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>r,a:()=>l});var o=i(7294);const t={},s=o.createContext(t);function l(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8b91756d.1d49b61c.js b/assets/js/8b91756d.1d49b61c.js deleted file mode 100644 index 4787deb5..00000000 --- a/assets/js/8b91756d.1d49b61c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdial=self.webpackChunkdial||[]).push([[467],{549:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var o=n(5893),i=n(1151);const a={},r="How to Enable Authentication with Azure AD",s={id:"tutorials/azure-ad-configuration",title:"How to Enable Authentication with Azure AD",description:"To enable authentication with Azure AD, you can use Chat environment variables.",source:"@site/docs/tutorials/azure-ad-configuration.md",sourceDirName:"tutorials",slug:"/tutorials/azure-ad-configuration",permalink:"/tutorials/azure-ad-configuration",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"CustomSideBar",previous:{title:"Roles Management Guide",permalink:"/tutorials/roles-management"},next:{title:"cognito",permalink:"/Deployment/idp-configuration/cognito"}},c={},l=[];function u(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",li:"li",ol:"ol",p:"p",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"how-to-enable-authentication-with-azure-ad",children:"How to Enable Authentication with Azure AD"}),"\n",(0,o.jsx)(t.p,{children:"To enable authentication with Azure AD, you can use Chat environment variables."}),"\n",(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsxs)(t.li,{children:["Register your application via the Microsoft Azure Portal. Refer to ",(0,o.jsx)(t.a,{href:"https://learn.microsoft.com/en-us/azure/healthcare-apis/register-application",children:"Microsoft Documentation"})," to learn how to register a new application."]}),"\n",(0,o.jsxs)(t.li,{children:["Define environment variables for AI DIAL Chat: ",(0,o.jsx)(t.code,{children:"AUTH_AZURE_AD_CLIENT_ID"}),", ",(0,o.jsx)(t.code,{children:"AUTH_AZURE_AD_NAME"}),", ",(0,o.jsx)(t.code,{children:"AUTH_AZURE_AD_SECRET"}),", ",(0,o.jsx)(t.code,{children:"AUTH_AZURE_AD_TENANT_ID"}),", ",(0,o.jsx)(t.code,{children:"AUTH_AZURE_AD_SCOPE"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:["Refer to ",(0,o.jsx)(t.a,{href:"https://github.com/epam/ai-dial-chat/blob/development/apps/chat/README.md#environment-variables",children:"Chat"})," to view the complete list of environment variables."]}),"\n"]}),"\n",(0,o.jsxs)(t.ol,{start:"3",children:["\n",(0,o.jsxs)(t.li,{children:["Launch AI DIAL Chat. Refer to ",(0,o.jsx)(t.a,{href:"https://github.com/epam/ai-dial-helm/tree/main/charts/dial/examples/generic/simple",children:"Deployment"})," to learn how to launch AI DIAL."]}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>s,a:()=>r});var o=n(7294);const i={},a=o.createContext(i);function r(e){const t=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8b91756d.dc4d8005.js b/assets/js/8b91756d.dc4d8005.js new file mode 100644 index 00000000..d896c596 --- /dev/null +++ b/assets/js/8b91756d.dc4d8005.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdial=self.webpackChunkdial||[]).push([[467],{549:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>c,toc:()=>l});var o=n(5893),i=n(1151);const a={},r="How to Enable Authentication with Azure AD",c={id:"tutorials/azure-ad-configuration",title:"How to Enable Authentication with Azure AD",description:"To enable authentication with Azure AD, you can use Chat environment variables.",source:"@site/docs/tutorials/azure-ad-configuration.md",sourceDirName:"tutorials",slug:"/tutorials/azure-ad-configuration",permalink:"/tutorials/azure-ad-configuration",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{}},s={},l=[];function u(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",li:"li",ol:"ol",p:"p",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"how-to-enable-authentication-with-azure-ad",children:"How to Enable Authentication with Azure AD"}),"\n",(0,o.jsx)(t.p,{children:"To enable authentication with Azure AD, you can use Chat environment variables."}),"\n",(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsxs)(t.li,{children:["Register your application via the Microsoft Azure Portal. Refer to ",(0,o.jsx)(t.a,{href:"https://learn.microsoft.com/en-us/azure/healthcare-apis/register-application",children:"Microsoft Documentation"})," to learn how to register a new application."]}),"\n",(0,o.jsxs)(t.li,{children:["Define environment variables for AI DIAL Chat: ",(0,o.jsx)(t.code,{children:"AUTH_AZURE_AD_CLIENT_ID"}),", ",(0,o.jsx)(t.code,{children:"AUTH_AZURE_AD_NAME"}),", ",(0,o.jsx)(t.code,{children:"AUTH_AZURE_AD_SECRET"}),", ",(0,o.jsx)(t.code,{children:"AUTH_AZURE_AD_TENANT_ID"}),", ",(0,o.jsx)(t.code,{children:"AUTH_AZURE_AD_SCOPE"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:["Refer to ",(0,o.jsx)(t.a,{href:"https://github.com/epam/ai-dial-chat/blob/development/apps/chat/README.md#environment-variables",children:"Chat"})," to view the complete list of environment variables."]}),"\n"]}),"\n",(0,o.jsxs)(t.ol,{start:"3",children:["\n",(0,o.jsxs)(t.li,{children:["Launch AI DIAL Chat. Refer to ",(0,o.jsx)(t.a,{href:"https://github.com/epam/ai-dial-helm/tree/main/charts/dial/examples/generic/simple",children:"Deployment"})," to learn how to launch AI DIAL."]}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>r});var o=n(7294);const i={},a=o.createContext(i);function r(e){const t=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.25474792.js b/assets/js/935f2afb.25474792.js deleted file mode 100644 index 488e8291..00000000 --- a/assets/js/935f2afb.25474792.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdial=self.webpackChunkdial||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"CustomSideBar":[{"type":"link","label":"Home","href":"/","docId":"README","unlisted":false},{"type":"link","label":"Quick Start","href":"/quick-start","docId":"quick-start","unlisted":false},{"type":"link","label":"Architecture","href":"/architecture","docId":"architecture","unlisted":false},{"type":"category","label":"Tutorials","items":[{"type":"link","label":"Chat with Application","href":"/tutorials/quick-start-with-application","docId":"tutorials/quick-start-with-application","unlisted":false},{"type":"link","label":"Chat with OpenAI Model","href":"/tutorials/quick-start-model","docId":"tutorials/quick-start-model","unlisted":false},{"type":"link","label":"Chat with Addon","href":"/tutorials/quick-start-with-addon","docId":"tutorials/quick-start-with-addon","unlisted":false},{"type":"link","label":"Roles Management","href":"/tutorials/roles-management","docId":"tutorials/roles-management","unlisted":false},{"type":"link","label":"How to Configure Azure AD","href":"/tutorials/azure-ad-configuration","docId":"tutorials/azure-ad-configuration","unlisted":false},{"type":"link","label":"How to Configure AWS Cognito","href":"/Deployment/idp-configuration/cognito","docId":"Deployment/idp-configuration/cognito","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Chat User Guide","href":"/user-guide","docId":"user-guide","unlisted":false},{"type":"category","label":"Deployment","items":[{"type":"link","label":"Helm Deployment","href":"https://github.com/epam/ai-dial-helm/tree/main/charts/dial/examples/generic/simple"},{"type":"link","label":"Configuration","href":"/Deployment/configuration","docId":"Deployment/configuration","unlisted":false},{"type":"link","label":"OpenAI Model Deployment","href":"/Deployment/OpenAI Model Deployment","docId":"Deployment/OpenAI Model Deployment","unlisted":false},{"type":"link","label":"Vertex Model Deployment","href":"/Deployment/Vertex Model Deployment","docId":"Deployment/Vertex Model Deployment","unlisted":false},{"type":"link","label":"Bedrock Model Deployment","href":"/Deployment/Bedrock Model Deployment","docId":"Deployment/Bedrock Model Deployment","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Cookbook","items":[{"type":"link","label":"How to call text-to-text DIAL applications","href":"/Cookbook/dial-cookbook/examples/how_to_call_text_to_text_applications","docId":"Cookbook/dial-cookbook/examples/how_to_call_text_to_text_applications","unlisted":false},{"type":"link","label":"How to call text-to-image DIAL applications","href":"/Cookbook/dial-cookbook/examples/how_to_call_text_to_image_applications","docId":"Cookbook/dial-cookbook/examples/how_to_call_text_to_image_applications","unlisted":false},{"type":"link","label":"How to call image-to-text DIAL applications","href":"/Cookbook/dial-cookbook/examples/how_to_call_image_to_text_applications","docId":"Cookbook/dial-cookbook/examples/how_to_call_image_to_text_applications","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"API Reference","href":"https://epam-rail.com/dial_api"}]},"docs":{"architecture":{"id":"architecture","title":"Architecture","description":"Our Vision","sidebar":"CustomSideBar"},"Cookbook/dial-cookbook/examples/how_to_call_image_to_text_applications":{"id":"Cookbook/dial-cookbook/examples/how_to_call_image_to_text_applications","title":"How to call image-to-text DIAL applications","description":"From [this","sidebar":"CustomSideBar"},"Cookbook/dial-cookbook/examples/how_to_call_text_to_image_applications":{"id":"Cookbook/dial-cookbook/examples/how_to_call_text_to_image_applications","title":"How to call text-to-image DIAL applications","description":"From [this","sidebar":"CustomSideBar"},"Cookbook/dial-cookbook/examples/how_to_call_text_to_text_applications":{"id":"Cookbook/dial-cookbook/examples/how_to_call_text_to_text_applications","title":"How to call text-to-text DIAL applications","description":"From [this","sidebar":"CustomSideBar"},"Deployment/Bedrock Model Deployment":{"id":"Deployment/Bedrock Model Deployment","title":"Bedrock Model Deployment","description":"In this instruction, you will learn how to create Bedrock model in AWS and use it in AI DIAL config.","sidebar":"CustomSideBar"},"Deployment/configuration":{"id":"Deployment/configuration","title":"configuration","description":"Important: it is assumed that you have a working knowledge of standard Helm chart parameters in order to define them within the configuration file.","sidebar":"CustomSideBar"},"Deployment/idp-configuration/cognito":{"id":"Deployment/idp-configuration/cognito","title":"cognito","description":"Introduction","sidebar":"CustomSideBar"},"Deployment/OpenAI Model Deployment":{"id":"Deployment/OpenAI Model Deployment","title":"OpenAI Model Deployment","description":"From this instruction, you will learn how to create an Azure OpenAI model GPT-3.5-turbo/GPT-4 and use it in AI DIAL config.","sidebar":"CustomSideBar"},"Deployment/Vertex Model Deployment":{"id":"Deployment/Vertex Model Deployment","title":"Vertex Model Deployment","description":"In this instruction, you will learn how to create VertexAI model in Google Cloud Platform and use it in AI DIAL config.","sidebar":"CustomSideBar"},"quick-start":{"id":"quick-start","title":"Quick Start","description":"Follow this tutorial to launch AI DIAL Chat with Echo application. As a result, you will be able to access Chat on http3000/ and use Echo application to mirror your prompts.","sidebar":"CustomSideBar"},"README":{"id":"README","title":"AI DIAL Documentation","description":"Project Overview and Contribution Guide","sidebar":"CustomSideBar"},"tutorials/azure-ad-configuration":{"id":"tutorials/azure-ad-configuration","title":"How to Enable Authentication with Azure AD","description":"To enable authentication with Azure AD, you can use Chat environment variables.","sidebar":"CustomSideBar"},"tutorials/quick-start-model":{"id":"tutorials/quick-start-model","title":"Launch AI DIAL Chat with Azure Model","description":"Introduction","sidebar":"CustomSideBar"},"tutorials/quick-start-with-addon":{"id":"tutorials/quick-start-with-addon","title":"Launch AI DIAL Chat with a Sample Addon","description":"Introduction","sidebar":"CustomSideBar"},"tutorials/quick-start-with-application":{"id":"tutorials/quick-start-with-application","title":"Launch AI DIAL Chat with a Sample Application","description":"Introduction","sidebar":"CustomSideBar"},"tutorials/roles-management":{"id":"tutorials/roles-management","title":"Roles Management Guide","description":"AI DIAL enables assignment of roles to Models, Applications, Addons, and Assistants to restrict the number of tokens that can be transmitted in a specific time frame. These roles and their limitations can be created in external systems and then assigned in AI DIAL\'s configuration.","sidebar":"CustomSideBar"},"user-guide":{"id":"user-guide","title":"Chat User Guide","description":"Interface Components","sidebar":"CustomSideBar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.9d653c97.js b/assets/js/935f2afb.9d653c97.js new file mode 100644 index 00000000..195736ae --- /dev/null +++ b/assets/js/935f2afb.9d653c97.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdial=self.webpackChunkdial||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"CustomSideBar":[{"type":"link","label":"Home","href":"/","docId":"README","unlisted":false},{"type":"link","label":"Quick Start","href":"/quick-start","docId":"quick-start","unlisted":false},{"type":"link","label":"Architecture","href":"/architecture","docId":"architecture","unlisted":false},{"type":"category","label":"Tutorials","items":[{"type":"link","label":"Chat with Application","href":"/tutorials/quick-start-with-application","docId":"tutorials/quick-start-with-application","unlisted":false},{"type":"link","label":"Chat with OpenAI Model","href":"/tutorials/quick-start-model","docId":"tutorials/quick-start-model","unlisted":false},{"type":"link","label":"Chat with Addon","href":"/tutorials/quick-start-with-addon","docId":"tutorials/quick-start-with-addon","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Chat User Guide","href":"/user-guide","docId":"user-guide","unlisted":false},{"type":"category","label":"Deployment","items":[{"type":"link","label":"Helm Deployment","href":"https://github.com/epam/ai-dial-helm/tree/main/charts/dial/examples/generic/simple"},{"type":"link","label":"Configuration","href":"/Deployment/configuration","docId":"Deployment/configuration","unlisted":false},{"type":"category","label":"IDP Configuration","items":[{"type":"link","label":"Auth0","href":"/Deployment/idp-configuration/auth0","docId":"Deployment/idp-configuration/auth0","unlisted":false},{"type":"link","label":"AWS Cognito","href":"/Deployment/idp-configuration/cognito","docId":"Deployment/idp-configuration/cognito","unlisted":false},{"type":"link","label":"Microsoft Entra","href":"/Deployment/idp-configuration/entraID","docId":"Deployment/idp-configuration/entraID","unlisted":false},{"type":"link","label":"Google OAuth2","href":"/Deployment/idp-configuration/google","docId":"Deployment/idp-configuration/google","unlisted":false},{"type":"link","label":"Keycloak","href":"/Deployment/idp-configuration/keycloak","docId":"Deployment/idp-configuration/keycloak","unlisted":false},{"type":"link","label":"Okta","href":"/Deployment/idp-configuration/okta","docId":"Deployment/idp-configuration/okta","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"OpenAI Model Deployment","href":"/Deployment/OpenAI Model Deployment","docId":"Deployment/OpenAI Model Deployment","unlisted":false},{"type":"link","label":"Vertex Model Deployment","href":"/Deployment/Vertex Model Deployment","docId":"Deployment/Vertex Model Deployment","unlisted":false},{"type":"link","label":"Bedrock Model Deployment","href":"/Deployment/Bedrock Model Deployment","docId":"Deployment/Bedrock Model Deployment","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Cookbook","items":[{"type":"link","label":"How to call text-to-text DIAL applications","href":"/Cookbook/dial-cookbook/examples/how_to_call_text_to_text_applications","docId":"Cookbook/dial-cookbook/examples/how_to_call_text_to_text_applications","unlisted":false},{"type":"link","label":"How to call text-to-image DIAL applications","href":"/Cookbook/dial-cookbook/examples/how_to_call_text_to_image_applications","docId":"Cookbook/dial-cookbook/examples/how_to_call_text_to_image_applications","unlisted":false},{"type":"link","label":"How to call image-to-text DIAL applications","href":"/Cookbook/dial-cookbook/examples/how_to_call_image_to_text_applications","docId":"Cookbook/dial-cookbook/examples/how_to_call_image_to_text_applications","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"API Reference","href":"https://epam-rail.com/dial_api"}]},"docs":{"architecture":{"id":"architecture","title":"Architecture","description":"Our Vision","sidebar":"CustomSideBar"},"Cookbook/dial-cookbook/examples/how_to_call_image_to_text_applications":{"id":"Cookbook/dial-cookbook/examples/how_to_call_image_to_text_applications","title":"How to call image-to-text DIAL applications","description":"From [this","sidebar":"CustomSideBar"},"Cookbook/dial-cookbook/examples/how_to_call_text_to_image_applications":{"id":"Cookbook/dial-cookbook/examples/how_to_call_text_to_image_applications","title":"How to call text-to-image DIAL applications","description":"From [this","sidebar":"CustomSideBar"},"Cookbook/dial-cookbook/examples/how_to_call_text_to_text_applications":{"id":"Cookbook/dial-cookbook/examples/how_to_call_text_to_text_applications","title":"How to call text-to-text DIAL applications","description":"From [this","sidebar":"CustomSideBar"},"Deployment/Bedrock Model Deployment":{"id":"Deployment/Bedrock Model Deployment","title":"Bedrock Model Deployment","description":"In this instruction, you will learn how to create Bedrock model in AWS and use it in AI DIAL config.","sidebar":"CustomSideBar"},"Deployment/configuration":{"id":"Deployment/configuration","title":"configuration","description":"Important: it is assumed that you have a working knowledge of standard Helm chart parameters in order to define them within the configuration file.","sidebar":"CustomSideBar"},"Deployment/idp-configuration/auth0":{"id":"Deployment/idp-configuration/auth0","title":"auth0","description":"- Introduction","sidebar":"CustomSideBar"},"Deployment/idp-configuration/cognito":{"id":"Deployment/idp-configuration/cognito","title":"cognito","description":"- Introduction","sidebar":"CustomSideBar"},"Deployment/idp-configuration/entraID":{"id":"Deployment/idp-configuration/entraID","title":"entraID","description":"- Introduction","sidebar":"CustomSideBar"},"Deployment/idp-configuration/google":{"id":"Deployment/idp-configuration/google","title":"google","description":"- Introduction","sidebar":"CustomSideBar"},"Deployment/idp-configuration/keycloak":{"id":"Deployment/idp-configuration/keycloak","title":"keycloak","description":"- Introduction","sidebar":"CustomSideBar"},"Deployment/idp-configuration/okta":{"id":"Deployment/idp-configuration/okta","title":"okta","description":"- Introduction","sidebar":"CustomSideBar"},"Deployment/OpenAI Model Deployment":{"id":"Deployment/OpenAI Model Deployment","title":"OpenAI Model Deployment","description":"From this instruction, you will learn how to create an Azure OpenAI model GPT-3.5-turbo/GPT-4 and use it in AI DIAL config.","sidebar":"CustomSideBar"},"Deployment/Vertex Model Deployment":{"id":"Deployment/Vertex Model Deployment","title":"Vertex Model Deployment","description":"In this instruction, you will learn how to create VertexAI model in Google Cloud Platform and use it in AI DIAL config.","sidebar":"CustomSideBar"},"quick-start":{"id":"quick-start","title":"Quick Start","description":"Follow this tutorial to launch AI DIAL Chat with Echo application. As a result, you will be able to access Chat on http3000/ and use Echo application to mirror your prompts.","sidebar":"CustomSideBar"},"README":{"id":"README","title":"AI DIAL Documentation","description":"Project Overview and Contribution Guide","sidebar":"CustomSideBar"},"tutorials/azure-ad-configuration":{"id":"tutorials/azure-ad-configuration","title":"How to Enable Authentication with Azure AD","description":"To enable authentication with Azure AD, you can use Chat environment variables."},"tutorials/quick-start-model":{"id":"tutorials/quick-start-model","title":"Launch AI DIAL Chat with Azure Model","description":"Introduction","sidebar":"CustomSideBar"},"tutorials/quick-start-with-addon":{"id":"tutorials/quick-start-with-addon","title":"Launch AI DIAL Chat with a Sample Addon","description":"Introduction","sidebar":"CustomSideBar"},"tutorials/quick-start-with-application":{"id":"tutorials/quick-start-with-application","title":"Launch AI DIAL Chat with a Sample Application","description":"Introduction","sidebar":"CustomSideBar"},"tutorials/roles-management":{"id":"tutorials/roles-management","title":"Roles Management Guide","description":"AI DIAL enables assignment of roles to Models, Applications, Addons, and Assistants to restrict the number of tokens that can be transmitted in a specific time frame. These roles and their limitations can be created in external systems and then assigned in AI DIAL\'s configuration."},"user-guide":{"id":"user-guide","title":"Chat User Guide","description":"Interface Components","sidebar":"CustomSideBar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/a097b135.218d9dad.js b/assets/js/a097b135.218d9dad.js new file mode 100644 index 00000000..33059cd3 --- /dev/null +++ b/assets/js/a097b135.218d9dad.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdial=self.webpackChunkdial||[]).push([[343],{7314:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>l,toc:()=>a});var o=i(5893),t=i(1151);const s={},r="How to Set AWS Cognito as Identity Provider",l={id:"Deployment/idp-configuration/cognito",title:"cognito",description:"- Introduction",source:"@site/docs/Deployment/idp-configuration/cognito.md",sourceDirName:"Deployment/idp-configuration",slug:"/Deployment/idp-configuration/cognito",permalink:"/Deployment/idp-configuration/cognito",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"CustomSideBar",previous:{title:"auth0",permalink:"/Deployment/idp-configuration/auth0"},next:{title:"entraID",permalink:"/Deployment/idp-configuration/entraID"}},c={},a=[{value:"Introduction",id:"introduction",level:2},{value:"Configuration Guidelines",id:"configuration-guidelines",level:2},{value:"Configure AWS Cognito",id:"configure-aws-cognito",level:3},{value:"Configure AI DIAL",id:"configure-ai-dial",level:3},{value:"AI DIAL Chat Settings",id:"ai-dial-chat-settings",level:4},{value:"AI DIAL Core Settings",id:"ai-dial-core-settings",level:4},{value:"Assignment of Roles",id:"assignment-of-roles",level:4}];function d(e){const n={a:"a",blockquote:"blockquote",br:"br",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"how-to-set-aws-cognito-as-identity-provider",children:"How to Set AWS Cognito as Identity Provider"}),"\n",(0,o.jsxs)("div",{class:"docusaurus-ignore",children:[(0,o.jsx)(n.h1,{id:"table-of-contents",children:"Table of Contents"}),(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"#introduction",children:"Introduction"})}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"#configuration-guidelines",children:"Configuration Guidelines"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"#configure-aws-cognito",children:"Configure AWS Cognito"})}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"#configure-ai-dial",children:"Configure AI DIAL"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"#ai-dial-chat-settings",children:"AI DIAL Chat Settings"})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"#ai-dial-core-settings",children:"AI DIAL Core Settings"})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"#assignment-of-roles",children:"Assignment of Roles"})}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]})]}),"\n",(0,o.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,o.jsxs)(n.p,{children:["This basic tutorial demonstrates the steps to create a user pool in ",(0,o.jsx)(n.a,{href:"https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html",children:"AWS Cognito"})," and use it as an identity and access management solution for AI DIAL users."]}),"\n",(0,o.jsx)(n.p,{children:"In AI DIAL, you can assign roles to Models, Applications, Addons, and Assistants to restrict the number of tokens that can be transmitted in a specific time frame. These roles and their limitations can be created in external systems and then assigned in AI DIAL's configuration."}),"\n",(0,o.jsx)(n.h2,{id:"configuration-guidelines",children:"Configuration Guidelines"}),"\n",(0,o.jsx)(n.h3,{id:"configure-aws-cognito",children:"Configure AWS Cognito"}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["[!TIP]\nReplace ",(0,o.jsx)(n.code,{children:""})," with the actual address of your AI DIAL Chat application."]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"Follow these steps to configure AWS Cognito:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Create User Pool:"})," refer to ",(0,o.jsx)(n.a,{href:"https://docs.aws.amazon.com/cognito/latest/developerguide/tutorial-create-user-pool.html",children:"AWS documentation"})," for detailed instructions on how to create a User Pool."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Configure Application Client:"})," during the creation of a user pool, navigate to the section ",(0,o.jsx)(n.strong,{children:"Integrate your app"})," (you can access it later under ",(0,o.jsx)(n.strong,{children:"App Integration/Create App Client"}),") and create the following settings. Refer to ",(0,o.jsx)(n.a,{href:"https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-client-apps.html",children:"AWS documentation"})," for details.","\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"App client name"}),": provide a relevant and descriptive name for the client."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Client secret"}),": select the option to ",(0,o.jsx)(n.code,{children:"Generate a client secret"})]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Allowed callback URLs"}),": enter ",(0,o.jsx)(n.code,{children:"https:///api/auth/callback/cognito"})]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Authentication flows"}),": enable ",(0,o.jsx)(n.code,{children:"ALLOW_CUSTOM_AUTH"})," ",(0,o.jsx)(n.code,{children:"ALLOW_REFRESH_TOKEN_AUTH"})," and ",(0,o.jsx)(n.code,{children:"ALLOW_USER_SRP_AUTH"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"OpenID Connect scopes"}),": select ",(0,o.jsx)(n.code,{children:"OpenID"})," ",(0,o.jsx)(n.code,{children:"Email"})," ",(0,o.jsx)(n.code,{children:"Profile"})]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Create Cognito Domain:"})," when setting up a user pool, navigate to the ",(0,o.jsx)(n.strong,{children:"Hosted authentication pages"}),". If the ",(0,o.jsx)(n.strong,{children:"Use the Cognito Hosted UI"})," option is enabled, you'll configure your domain here. Alternatively, you can access this configuration later by going to ",(0,o.jsx)(n.strong,{children:"App Integration/Domain/Actions"}),". Refer to ",(0,o.jsx)(n.a,{href:"https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-userpools-server-contract-reference.html",children:"AWS documentation"})," for details."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Create Users:"})," in the ",(0,o.jsx)(n.strong,{children:"User polls/Users"})," section, create necessary ",(0,o.jsx)(n.a,{href:"https://docs.aws.amazon.com/cognito/latest/developerguide/how-to-create-user-accounts.html#creating-a-new-user-using-the-console",children:"Users"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Collect Configuration Parameters:"})," you will need them for AI DIAL configuration.","\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["In the ",(0,o.jsx)(n.strong,{children:"Amazon Cognito/User pools/Pool name"})," section, record ",(0,o.jsx)(n.strong,{children:"User pool ID"})," and ",(0,o.jsx)(n.strong,{children:"Token signing key URL"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["In ",(0,o.jsx)(n.strong,{children:"App Integration/App client list"}),", click on the specific app client name to obtain the ",(0,o.jsx)(n.strong,{children:"Client ID"})," and",(0,o.jsx)(n.strong,{children:"Client secret"})," - record them as well."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["(Optional) ",(0,o.jsx)(n.strong,{children:"Create and Assign Group:"})," in the ",(0,o.jsx)(n.strong,{children:"User polls/Groups"})," section, create necessary ",(0,o.jsx)(n.a,{href:"https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-user-groups.html#creating-a-new-group-using-the-console",children:"Groups"})," and assign to ",(0,o.jsx)(n.code,{children:"User"})," created in the previous step."]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"configure-ai-dial",children:"Configure AI DIAL"}),"\n",(0,o.jsx)(n.p,{children:"By configuring both AI DIAL Chat and AI DIAL Core with the necessary AWS Cognito environment variables, you will enable them to work together seamlessly with AWS Cognito for authentication and authorization purposes."}),"\n",(0,o.jsx)(n.p,{children:"To configure AI DIAL Chat and AI DIAL Core to work with AWS Cognito, follow these steps:"}),"\n",(0,o.jsx)(n.h4,{id:"ai-dial-chat-settings",children:"AI DIAL Chat Settings"}),"\n",(0,o.jsxs)(n.p,{children:["Add the following environment variables to AI DIAL Chat configuration. Refer to ",(0,o.jsx)(n.a,{href:"https://github.com/epam/ai-dial-chat/blob/development/apps/chat/README.md#environment-variables",children:"AI DIAL Chat"})," to learn more."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'AUTH_COGNITO_CLIENT_ID: ""\nAUTH_COGNITO_HOST: ""\nAUTH_COGNITO_SECRET: ""\n'})}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["[!TIP]",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.code,{children:"cognito_host"})," example: ",(0,o.jsx)(n.code,{children:"https://cognito-idp..amazonaws.com/"})]}),"\n"]}),"\n",(0,o.jsx)(n.h4,{id:"ai-dial-core-settings",children:"AI DIAL Core Settings"}),"\n",(0,o.jsxs)(n.p,{children:["Add the following parameters to AI DIAL Core ",(0,o.jsx)(n.strong,{children:"static"})," settings. Refer to ",(0,o.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core?tab=readme-ov-file#static-settings",children:"AI DIAL Core"})," for more details."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'aidial.identityProviders.cognito.jwksUrl: ""\naidial.identityProviders.cognito.rolePath: "cognito:groups"\naidial.identityProviders.cognito.issuerPattern: \'^https:\\/\\/cognito-idp\\.\\.amazonaws\\.com.+$\'\naidial.identityProviders.cognito.loggingKey: "sub"\naidial.identityProviders.cognito.loggingSalt: "loggingSalt"\n'})}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["[!TIP]\n",(0,o.jsx)(n.code,{children:"cognito_jwks_uri"})," example: ",(0,o.jsx)(n.code,{children:"https://cognito-idp..amazonaws.com//.well-known/jwks.json"})]}),"\n"]}),"\n",(0,o.jsx)(n.h4,{id:"assignment-of-roles",children:"Assignment of Roles"}),"\n",(0,o.jsxs)(n.p,{children:["Once all the above steps are completed, including the ones marked as ",(0,o.jsx)(n.strong,{children:"Optional"}),", you can assign roles to Models, Applications, Addons, and Assistants."]}),"\n",(0,o.jsx)(n.p,{children:"In AI DIAL Core:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core?tab=readme-ov-file#static-settings",children:"Static settings"}),": as value for ",(0,o.jsx)(n.code,{children:"aidial.identityProviders.cognito.rolePath"})," provide a claim from Cognito."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core?tab=readme-ov-file#dynamic-settings",children:"Dynamic settings"}),": for ",(0,o.jsx)(n.code,{children:"userRoles"})," provide a specific group name as a claim value."]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["In this example, ",(0,o.jsx)(n.code,{children:'"cognito-group-name"'})," role from the ",(0,o.jsx)(n.code,{children:'"cognito:groups"'})," claim is configured for ",(0,o.jsx)(n.code,{children:"chat-gpt-35-turbo"})," model:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:' # Dynamic settings of AI DIAL Core\n"models": {\n "chat-gpt-35-turbo": {\n "type": "chat",\n "endpoint" : "http://localhost:7001/v1/openai/deployments/gpt-35-turbo/chat/completions",\n "upstreams": [\n {"endpoint": "http://localhost:7001", "key": "modelKey1"}\n ],\n "userRoles": ["cognito-group-name"]\n }\n}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>l,a:()=>r});var o=i(7294);const t={},s=o.createContext(t);function r(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a097b135.31aab355.js b/assets/js/a097b135.31aab355.js deleted file mode 100644 index e44f53ea..00000000 --- a/assets/js/a097b135.31aab355.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdial=self.webpackChunkdial||[]).push([[343],{7314:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>c});var o=i(5893),t=i(1151);const r={},s="How to Set AWS Cognito as Identity Provider",l={id:"Deployment/idp-configuration/cognito",title:"cognito",description:"Introduction",source:"@site/docs/Deployment/idp-configuration/cognito.md",sourceDirName:"Deployment/idp-configuration",slug:"/Deployment/idp-configuration/cognito",permalink:"/Deployment/idp-configuration/cognito",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"CustomSideBar",previous:{title:"How to Enable Authentication with Azure AD",permalink:"/tutorials/azure-ad-configuration"},next:{title:"Chat User Guide",permalink:"/user-guide"}},a={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Configuration Guidelines",id:"configuration-guidelines",level:2},{value:"Configure AWS Cognito",id:"configure-aws-cognito",level:3},{value:"Configure AI DIAL",id:"configure-ai-dial",level:3},{value:"AI DIAL Chat Settings",id:"ai-dial-chat-settings",level:4},{value:"AI DIAL Core Settings",id:"ai-dial-core-settings",level:4}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"how-to-set-aws-cognito-as-identity-provider",children:"How to Set AWS Cognito as Identity Provider"}),"\n",(0,o.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,o.jsxs)(n.p,{children:["This basic tutorial demonstrates the steps to create a user pool in ",(0,o.jsx)(n.a,{href:"https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html",children:"AWS Cognito"})," and use it as an identity and access management solution for AI DIAL users."]}),"\n",(0,o.jsxs)("div",{class:"docusaurus-ignore",children:[(0,o.jsx)(n.h1,{id:"table-of-contents",children:"Table of Contents"}),(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"#introduction",children:"Introduction"})}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"#configuration-guidelines",children:"Configuration Guidelines"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"#configure-aws-cognito",children:"Configure AWS Cognito"})}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"#configure-ai-dial",children:"Configure AI DIAL"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"#ai-dial-chat-settings",children:"AI DIAL Chat Settings"})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"#ai-dial-core-settings",children:"AI DIAL Core Settings"})}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]})]}),"\n",(0,o.jsx)(n.h2,{id:"configuration-guidelines",children:"Configuration Guidelines"}),"\n",(0,o.jsx)(n.h3,{id:"configure-aws-cognito",children:"Configure AWS Cognito"}),"\n",(0,o.jsx)(n.p,{children:"To configure AWS Cognito, you can follow these steps:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Begin by creating a user pool. You can refer to the official AWS documentation for detailed instructions on how to create a user pool. Here is the link: ",(0,o.jsx)(n.a,{href:"https://docs.aws.amazon.com/cognito/latest/developerguide/tutorial-create-user-pool.html",children:"Create User Pool"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Once the user pool is set up, you can proceed to create users within the pool. The AWS documentation provides guidance on how to sign up users in your application. You can find the instructions here: ",(0,o.jsx)(n.a,{href:"https://docs.aws.amazon.com/cognito/latest/developerguide/signing-up-users-in-your-app.html",children:"Create User"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Next, you will need to create an app client specifically for this user pool. This app client will be responsible for integrating your application with the user pool. The AWS documentation offers detailed instructions on configuring app integration with user pools. You can access the instructions here: ",(0,o.jsx)(n.a,{href:"https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-configuring-app-integration.html",children:"Create App Client for User Pool"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Under the ",(0,o.jsx)(n.strong,{children:"App client settings"})," section, set the following parameters:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Callback URL(s): Enter the callback function URL as follows"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"https:///api/auth/callback/cognito\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Replace ",(0,o.jsx)(n.code,{children:""})," with the actual address of your AI DIAL Chat application."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:'OAuth 2.0 Allowed OAuth Flows: Select "Authorization code grant".'}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"OAuth 2.0 Allowed OAuth Scopes: Enable the following scopes:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"email"}),"\n",(0,o.jsx)(n.li,{children:"openid"}),"\n",(0,o.jsx)(n.li,{children:"profile"}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:'Enabled Identity Providers: Select "Cognito user pool".'}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"configure-ai-dial",children:"Configure AI DIAL"}),"\n",(0,o.jsx)(n.p,{children:"By configuring both AI DIAL Chat and AI DIAL Core with the necessary AWS Cognito environment variables, you will enable them to work together seamlessly with AWS Cognito for authentication and authorization purposes.\nTo configure AI DIAL Chat and AI DIAL Core to work with AWS Cognito, follow these steps:"}),"\n",(0,o.jsx)(n.h4,{id:"ai-dial-chat-settings",children:"AI DIAL Chat Settings"}),"\n",(0,o.jsxs)(n.p,{children:["Add the following environment variables to AI DIAL Chat configuration. Refer to ",(0,o.jsx)(n.a,{href:"https://github.com/epam/ai-dial-chat/blob/development/apps/chat/README.md#environment-variables",children:"AI DIAL Chat"})," to learn more."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'AUTH_COGNITO_CLIENT_ID: "" # client ID of your AWS Cognito app client integration.\nAUTH_COGNITO_HOST: "" # URL consisting of the Cognito Identity endpoint and User Pool ID.\nAUTH_COGNITO_NAME: "" # name of your AWS Cognito app client integration\nAUTH_COGNITO_SECRET: "" # client secret of your AWS Cognito app client integration\n'})}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"cognito_host"})," example: ",(0,o.jsx)(n.code,{children:"https://cognito-idp..amazonaws.com/"})]}),"\n"]}),"\n",(0,o.jsx)(n.h4,{id:"ai-dial-core-settings",children:"AI DIAL Core Settings"}),"\n",(0,o.jsxs)(n.p,{children:["Add the following parameters to AI DIAL Core. Refer to ",(0,o.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core?tab=readme-ov-file#configuration",children:"AI DIAL Core"})," configuration to learn more."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'aidial.identityProviders.cognito.jwksUrl: "" # URL to jwks token\naidial.identityProviders.cognito.rolePath: "roles"\naidial.identityProviders.cognito.issuerPattern: \'^https:\\/\\/cognito-idp\\.\\.amazonaws\\.com.+$\'\naidial.identityProviders.cognito.loggingKey: "email"\naidial.identityProviders.cognito.loggingSalt: "loggingSalt"\n'})}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.code,{children:"token_url"})," example: ",(0,o.jsx)(n.code,{children:"https://cognito-idp..amazonaws.com//.well-known/jwks.json"})]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>l,a:()=>s});var o=i(7294);const t={},r=o.createContext(t);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ba864879.1c31bbeb.js b/assets/js/ba864879.1c31bbeb.js deleted file mode 100644 index ad1f0afc..00000000 --- a/assets/js/ba864879.1c31bbeb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdial=self.webpackChunkdial||[]).push([[620],{1691:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var o=s(5893),t=s(1151);const r={},i="Roles Management Guide",a={id:"tutorials/roles-management",title:"Roles Management Guide",description:"AI DIAL enables assignment of roles to Models, Applications, Addons, and Assistants to restrict the number of tokens that can be transmitted in a specific time frame. These roles and their limitations can be created in external systems and then assigned in AI DIAL's configuration.",source:"@site/docs/tutorials/roles-management.md",sourceDirName:"tutorials",slug:"/tutorials/roles-management",permalink:"/tutorials/roles-management",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"CustomSideBar",previous:{title:"Launch AI DIAL Chat with a Sample Addon",permalink:"/tutorials/quick-start-with-addon"},next:{title:"How to Enable Authentication with Azure AD",permalink:"/tutorials/azure-ad-configuration"}},l={},c=[{value:"KeyCloak",id:"keycloak",level:2},{value:"Step 1: Create groups",id:"step-1-create-groups",level:3},{value:"Step 2: Create roles",id:"step-2-create-roles",level:3},{value:"Step 3: Map roles to groups",id:"step-3-map-roles-to-groups",level:3},{value:"Step 4: Assign groups to users",id:"step-4-assign-groups-to-users",level:3},{value:"Step 5: Assign KeyCloak roles to AI DIAL Core deployments",id:"step-5-assign-keycloak-roles-to-ai-dial-core-deployments",level:3},{value:"Microsoft Azure Active Directory",id:"microsoft-azure-active-directory",level:2},{value:"Step 1: Create groups in Microsoft Azure Active Directory",id:"step-1-create-groups-in-microsoft-azure-active-directory",level:3},{value:"Step 2: Include groups into JWT custom claim",id:"step-2-include-groups-into-jwt-custom-claim",level:3},{value:"Step 3: Assign MS Azure AD groups to AI DIAL Core deployments",id:"step-3-assign-ms-azure-ad-groups-to-ai-dial-core-deployments",level:3}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"roles-management-guide",children:"Roles Management Guide"}),"\n",(0,o.jsx)(n.p,{children:"AI DIAL enables assignment of roles to Models, Applications, Addons, and Assistants to restrict the number of tokens that can be transmitted in a specific time frame. These roles and their limitations can be created in external systems and then assigned in AI DIAL's configuration."}),"\n",(0,o.jsx)(n.p,{children:"This tutorial provides a guide on how to create these roles in both KeyCloak and MS Azure, and how to integrate them into AI DIAL's configuration."}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["Refer to ",(0,o.jsx)(n.a,{href:"/Deployment/configuration#some-of-the-dynamic-parameters",children:"AI DIAL Configuration"})," to learn more abour ",(0,o.jsx)(n.code,{children:"roles"})," and other parameters."]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"keycloak",children:"KeyCloak"}),"\n",(0,o.jsx)(n.p,{children:"In this instruction, you will learn how to create roles in KeyCloak and add them to AI DIAL Models, Applications, Assistants, and Addons."}),"\n",(0,o.jsxs)(n.p,{children:["In KeyCloak ",(0,o.jsx)(n.strong,{children:"target realm"}),":"]}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"Create a group(s)"}),"\n",(0,o.jsx)(n.li,{children:"Create role(s)"}),"\n",(0,o.jsx)(n.li,{children:"Map roles to groups"}),"\n",(0,o.jsx)(n.li,{children:"Assign groups to users"}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"In AI DIAL config:"}),"\n",(0,o.jsxs)(n.ol,{start:"5",children:["\n",(0,o.jsx)(n.li,{children:"Assign roles to AI DIAL Models, Applications, Assistants, and Addons."}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["AI DIAL Core receives the roles assigned to it through user access tokens (JWTs). These roles can be accessed via the path: ",(0,o.jsx)(n.code,{children:"resource_access..roles"})," where ",(0,o.jsx)(n.code,{children:"client-id"})," is a client registered in KeyCloak ",(0,o.jsx)(n.code,{children:"realm"}),", e.g. ",(0,o.jsx)(n.code,{children:"chatbot-ui"}),"."]}),"\n",(0,o.jsx)(n.h3,{id:"step-1-create-groups",children:"Step 1: Create groups"}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["Refer to ",(0,o.jsx)(n.a,{href:"https://www.keycloak.org/docs/latest/server_admin/index.html#proc-managing-groups_server_administration_guide",children:"KeyCloak Documentation"})," to learn how to create groups."]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["In ",(0,o.jsx)(n.strong,{children:"Groups"}),", you can create a hierarchy of groups through admin console, similar to this example:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:" Models\n -> AWS.Bedrock\n -> Stable.Diffusion\n Addons\n -> Wolfram\n"})}),"\n",(0,o.jsx)(n.h3,{id:"step-2-create-roles",children:"Step 2: Create roles"}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["Refer to ",(0,o.jsx)(n.a,{href:"https://www.keycloak.org/docs/latest/server_admin/index.html#con-client-roles_server_administration_guide",children:"KeyCloak Documentation"})," to learn how to create roles."]}),"\n"]}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["In ",(0,o.jsx)(n.strong,{children:"Clients"}),", choose the client ",(0,o.jsx)(n.code,{children:"chatbot-ui"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["In the table ",(0,o.jsx)(n.strong,{children:"Roles"}),", create required roles, for example:"]}),"\n"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"AWS.Bedrock"}),"\n",(0,o.jsx)(n.li,{children:"Stable.Diffusion"}),"\n",(0,o.jsx)(n.li,{children:"Wolfram"}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"step-3-map-roles-to-groups",children:"Step 3: Map roles to groups"}),"\n",(0,o.jsxs)(n.p,{children:["In ",(0,o.jsx)(n.strong,{children:"Groups"}),", do the roles mapping for each group:"]}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Open the tab ",(0,o.jsx)(n.strong,{children:"Role Mapping"})]}),"\n",(0,o.jsxs)(n.li,{children:["Press the button ",(0,o.jsx)(n.strong,{children:"Assign role"})," and choose a role you want to assign to a group"]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"step-4-assign-groups-to-users",children:"Step 4: Assign groups to users"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["In ",(0,o.jsx)(n.strong,{children:"Groups"}),", choose a group you want to work with"]}),"\n",(0,o.jsxs)(n.li,{children:["In ",(0,o.jsx)(n.strong,{children:"Members"}),", press the button ",(0,o.jsx)(n.strong,{children:"Add member"})]}),"\n",(0,o.jsx)(n.li,{children:"Select a member you want to assign to a group"}),"\n"]}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["Refer to ",(0,o.jsx)(n.a,{href:"https://www.keycloak.org/docs/latest/server_admin/index.html#proc-managing-groups_server_administration_guide",children:"KeyCloak Documentation"})," for the detailed info about group assignments."]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"step-5-assign-keycloak-roles-to-ai-dial-core-deployments",children:"Step 5: Assign KeyCloak roles to AI DIAL Core deployments"}),"\n",(0,o.jsx)(n.p,{children:"The last step is to assign KeyCloak roles to AI DIAL core deployments: Applications, Addons, Assistants and Models."}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["Refer to ",(0,o.jsx)(n.a,{href:"/Deployment/configuration#some-of-the-dynamic-parameters",children:"AI DIAL Configuration"})," to learn more."]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'"addons": {\n "search": {\n "endpoint": "http://localhost:7010/search",\n "displayName": "Search",\n "userRoles": ["keycloak-role1"]\n }\n }\n\n...\n\n"applications": {\n "app": {\n "endpoint": "http://localhost:7001/openai/deployments/app/chat/completions",\n "userRoles": ["keycloak-role2"]\n }\n }\n\n...\n\n"assistant": {\n "endpoint": "http://assistant.dial-development/openai/deployments/assistant/chat/completions",\n "assistants": {\n "assistant-1": {\n "prompt": "Your system prompt.",\n "addons": [\n "addon-1",\n "addon-2"\n ],\n "userRoles": ["keycloak-role1"]\n }\n }\n }\n\n...\n\n"models": {\n "chat-gpt-35-turbo": {\n "type": "chat",\n "endpoint" : "http://localhost:7001/v1/openai/deployments/gpt-35-turbo/chat/completions",\n "upstreams": [\n {"endpoint": "http://localhost:7001", "key": "modelKey1"},\n {"endpoint": "http://localhost:7002", "key": "modelKey2"},\n {"endpoint": "http://localhost:7003", "key": "modelKey3"}\n ],\n "userRoles": ["keycloak-role2"]\n }\n}\n'})}),"\n",(0,o.jsx)(n.h2,{id:"microsoft-azure-active-directory",children:"Microsoft Azure Active Directory"}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["Refer to ",(0,o.jsx)(n.a,{href:"/tutorials/azure-ad-configuration",children:"Azure AD Configuration"})," to learn how to enable authentication with Azure AD for AI DIAL."]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"In this instruction, you will learn how to create roles in MS Azure Active Directory and add them to AI DIAL Models, Applications, Assistants, and Addons."}),"\n",(0,o.jsx)(n.p,{children:"Group management process is consisted of three steps:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"Create groups in Microsoft Azure Active Directory"}),"\n",(0,o.jsxs)(n.li,{children:["Include groups into JWT custom ",(0,o.jsx)(n.code,{children:"claim"})]}),"\n",(0,o.jsx)(n.li,{children:"Assign roles to AI DIAL Models, Applications, Assistants, and Addons"}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["The roles are provided to AI DIAL Core via user access token(JWT) by MS Azure AD and are available via the path: ",(0,o.jsx)(n.code,{children:"groups"}),"."]}),"\n",(0,o.jsx)(n.h3,{id:"step-1-create-groups-in-microsoft-azure-active-directory",children:"Step 1: Create groups in Microsoft Azure Active Directory"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["In ",(0,o.jsx)(n.strong,{children:"Groups"}),", you can create groups that you need"]}),"\n",(0,o.jsx)(n.li,{children:"Add members for each group"}),"\n"]}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["Refer to ",(0,o.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/entra/fundamentals/how-to-manage-groups",children:"MS Documentation"})," to view the detailed info about group management."]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"step-2-include-groups-into-jwt-custom-claim",children:"Step 2: Include groups into JWT custom claim"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["In Microsoft Entra ID, open the item ",(0,o.jsx)(n.strong,{children:"App Registrations"})]}),"\n",(0,o.jsx)(n.li,{children:"Open the application you want to configure groups for"}),"\n",(0,o.jsxs)(n.li,{children:["Go to the item ",(0,o.jsx)(n.strong,{children:"Token Configuration"})]}),"\n",(0,o.jsxs)(n.li,{children:["Press the button ",(0,o.jsx)(n.strong,{children:"Add Groups claim"})," and customize which groups you want to include and where (access, ID token)"]}),"\n",(0,o.jsxs)(n.li,{children:["When customizing the claim ",(0,o.jsx)(n.strong,{children:"groups"}),", you can choose the option ",(0,o.jsx)(n.strong,{children:"sAMAccountName"})," instead of ",(0,o.jsx)(n.strong,{children:"Group ID"})," to include group names instead of group UUIDs in the token"]}),"\n"]}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["Refer to ",(0,o.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-fed-group-claims#important-caveats-for-this-functionality",children:"MS Documentation"})," to view the detailed info about configuration of group claims for applications."]}),"\n"]}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Note"}),": by default, the claim ",(0,o.jsx)(n.strong,{children:"groups"})," is not included into the access token. You should add an application ",(0,o.jsx)(n.strong,{children:"scope"})," to the authorization request to obtain the claim from an access token.\nThe ",(0,o.jsx)(n.strong,{children:"claim"})," is available in the ID token only.\nRefer to ",(0,o.jsx)(n.a,{href:"https://stackoverflow.com/questions/70542675/azure-ad-access-token-does-not-contain-groups-claim",children:"stackoverflow"})," to read more about this case.\n",(0,o.jsx)(n.strong,{children:"Note"}),"*. The application ",(0,o.jsx)(n.strong,{children:"scope"})," is required to validate signature of the access token.\nRefer to ",(0,o.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/answers/questions/318741/graphapi-cannot-validate-access-token-signature",children:"Microsoft Portal"})," to read more about this case."]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["How to create a custom ",(0,o.jsx)(n.strong,{children:"scope"}),":"]}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Go to ",(0,o.jsx)(n.strong,{children:"Expose an API"})]}),"\n",(0,o.jsxs)(n.li,{children:["Set ",(0,o.jsx)(n.strong,{children:"Application ID URI"})," to something meaningful, e.g ",(0,o.jsx)(n.code,{children:"api://chatbot-ui"})]}),"\n",(0,o.jsxs)(n.li,{children:["Press the button ",(0,o.jsx)(n.strong,{children:"Add a scope"})]}),"\n",(0,o.jsxs)(n.li,{children:["Fill the required fields in the form to create a new scope. Make sure ",(0,o.jsx)(n.strong,{children:"Who can consent?"})," is set to ",(0,o.jsx)(n.strong,{children:"Admin and users"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Add the ",(0,o.jsx)(n.strong,{children:"scope"})," to the authorization request in ",(0,o.jsx)(n.code,{children:"params"}),":"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"AzureProvider({\n clientId: process.env.AUTH_AZURE_AD_CLIENT_ID,\n clientSecret: process.env.AUTH_AZURE_AD_SECRET,\n tenantId: process.env.AUTH_AZURE_AD_TENANT_ID,\n name: process.env.AUTH_AZURE_AD_NAME ?? DEFAULT_NAME,\n authorization: {\n params: { scope: 'api://chatbot-ui/Client.Consumer openid profile user.Read email offline_access' },\n },\n token: tokenConfig,\n }),\n"})}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Note"}),": if the custom ",(0,o.jsx)(n.code,{children:"scope"})," is provided, the rest of ",(0,o.jsx)(n.code,{children:"scopes"})," in the authorization request is ignored by Microsoft Azure AD.\nAs a result, clients who have requested the access token do not have access to MS Azure Graph API for reading user info such as user picture and job title."]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"step-3-assign-ms-azure-ad-groups-to-ai-dial-core-deployments",children:"Step 3: Assign MS Azure AD groups to AI DIAL Core deployments"}),"\n",(0,o.jsx)(n.p,{children:"The last step is to assign Microsoft Azure AD groups to AI DIAL Core deployments: Applications, Addons, Assistants and Models."}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["Refer to ",(0,o.jsx)(n.a,{href:"/Deployment/configuration#some-of-the-dynamic-parameters",children:"AI DIAL Configuration"})," to learn more."]}),"\n"]}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Note"}),": in the example below, MS Azure groups are mapped to AI DIAL Core user roles one to one."]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'"addons": {\n "search": {\n "endpoint": "http://localhost:7010/search",\n "displayName": "Search",\n "userRoles": ["azure-group1"]\n }\n }\n\n...\n\n"applications": {\n "app": {\n "endpoint": "http://localhost:7001/openai/deployments/app/chat/completions",\n "userRoles": ["azure-group2"]\n }\n }\n\n...\n\n"assistant": {\n "endpoint": "http://assistant.dial-development/openai/deployments/assistant/chat/completions",\n "assistants": {\n "assistant-1": {\n "prompt": "Your system prompt.",\n "addons": [\n "addon-1",\n "addon-2"\n ],\n "userRoles": ["azure-group1"]\n }\n }\n }\n\n...\n\n"models": {\n "chat-gpt-35-turbo": {\n "type": "chat",\n "endpoint" : "http://localhost:7001/v1/openai/deployments/gpt-35-turbo/chat/completions",\n "upstreams": [\n {"endpoint": "http://localhost:7001", "key": "modelKey1"},\n {"endpoint": "http://localhost:7002", "key": "modelKey2"},\n {"endpoint": "http://localhost:7003", "key": "modelKey3"}\n ],\n "userRoles": ["azure-group2"]\n }\n}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},1151:(e,n,s)=>{s.d(n,{Z:()=>a,a:()=>i});var o=s(7294);const t={},r=o.createContext(t);function i(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ba864879.a86a763a.js b/assets/js/ba864879.a86a763a.js new file mode 100644 index 00000000..a6e7d39f --- /dev/null +++ b/assets/js/ba864879.a86a763a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdial=self.webpackChunkdial||[]).push([[620],{1691:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var o=s(5893),t=s(1151);const r={},i="Roles Management Guide",a={id:"tutorials/roles-management",title:"Roles Management Guide",description:"AI DIAL enables assignment of roles to Models, Applications, Addons, and Assistants to restrict the number of tokens that can be transmitted in a specific time frame. These roles and their limitations can be created in external systems and then assigned in AI DIAL's configuration.",source:"@site/docs/tutorials/roles-management.md",sourceDirName:"tutorials",slug:"/tutorials/roles-management",permalink:"/tutorials/roles-management",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{}},l={},c=[{value:"KeyCloak",id:"keycloak",level:2},{value:"Step 1: Create groups",id:"step-1-create-groups",level:3},{value:"Step 2: Create roles",id:"step-2-create-roles",level:3},{value:"Step 3: Map roles to groups",id:"step-3-map-roles-to-groups",level:3},{value:"Step 4: Assign groups to users",id:"step-4-assign-groups-to-users",level:3},{value:"Step 5: Assign KeyCloak roles to AI DIAL Core deployments",id:"step-5-assign-keycloak-roles-to-ai-dial-core-deployments",level:3},{value:"Microsoft Azure Active Directory",id:"microsoft-azure-active-directory",level:2},{value:"Step 1: Create groups in Microsoft Azure Active Directory",id:"step-1-create-groups-in-microsoft-azure-active-directory",level:3},{value:"Step 2: Include groups into JWT custom claim",id:"step-2-include-groups-into-jwt-custom-claim",level:3},{value:"Step 3: Assign MS Azure AD groups to AI DIAL Core deployments",id:"step-3-assign-ms-azure-ad-groups-to-ai-dial-core-deployments",level:3}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"roles-management-guide",children:"Roles Management Guide"}),"\n",(0,o.jsx)(n.p,{children:"AI DIAL enables assignment of roles to Models, Applications, Addons, and Assistants to restrict the number of tokens that can be transmitted in a specific time frame. These roles and their limitations can be created in external systems and then assigned in AI DIAL's configuration."}),"\n",(0,o.jsx)(n.p,{children:"This tutorial provides a guide on how to create these roles in both KeyCloak and MS Azure, and how to integrate them into AI DIAL's configuration."}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["Refer to ",(0,o.jsx)(n.a,{href:"/Deployment/configuration#some-of-the-dynamic-parameters",children:"AI DIAL Configuration"})," to learn more abour ",(0,o.jsx)(n.code,{children:"roles"})," and other parameters."]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"keycloak",children:"KeyCloak"}),"\n",(0,o.jsx)(n.p,{children:"In this instruction, you will learn how to create roles in KeyCloak and add them to AI DIAL Models, Applications, Assistants, and Addons."}),"\n",(0,o.jsxs)(n.p,{children:["In KeyCloak ",(0,o.jsx)(n.strong,{children:"target realm"}),":"]}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"Create a group(s)"}),"\n",(0,o.jsx)(n.li,{children:"Create role(s)"}),"\n",(0,o.jsx)(n.li,{children:"Map roles to groups"}),"\n",(0,o.jsx)(n.li,{children:"Assign groups to users"}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"In AI DIAL config:"}),"\n",(0,o.jsxs)(n.ol,{start:"5",children:["\n",(0,o.jsx)(n.li,{children:"Assign roles to AI DIAL Models, Applications, Assistants, and Addons."}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["AI DIAL Core receives the roles assigned to it through user access tokens (JWTs). These roles can be accessed via the path: ",(0,o.jsx)(n.code,{children:"resource_access..roles"})," where ",(0,o.jsx)(n.code,{children:"client-id"})," is a client registered in KeyCloak ",(0,o.jsx)(n.code,{children:"realm"}),", e.g. ",(0,o.jsx)(n.code,{children:"chatbot-ui"}),"."]}),"\n",(0,o.jsx)(n.h3,{id:"step-1-create-groups",children:"Step 1: Create groups"}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["Refer to ",(0,o.jsx)(n.a,{href:"https://www.keycloak.org/docs/latest/server_admin/index.html#proc-managing-groups_server_administration_guide",children:"KeyCloak Documentation"})," to learn how to create groups."]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["In ",(0,o.jsx)(n.strong,{children:"Groups"}),", you can create a hierarchy of groups through admin console, similar to this example:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:" Models\n -> AWS.Bedrock\n -> Stable.Diffusion\n Addons\n -> Wolfram\n"})}),"\n",(0,o.jsx)(n.h3,{id:"step-2-create-roles",children:"Step 2: Create roles"}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["Refer to ",(0,o.jsx)(n.a,{href:"https://www.keycloak.org/docs/latest/server_admin/index.html#con-client-roles_server_administration_guide",children:"KeyCloak Documentation"})," to learn how to create roles."]}),"\n"]}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["In ",(0,o.jsx)(n.strong,{children:"Clients"}),", choose the client ",(0,o.jsx)(n.code,{children:"chatbot-ui"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["In the table ",(0,o.jsx)(n.strong,{children:"Roles"}),", create required roles, for example:"]}),"\n"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"AWS.Bedrock"}),"\n",(0,o.jsx)(n.li,{children:"Stable.Diffusion"}),"\n",(0,o.jsx)(n.li,{children:"Wolfram"}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"step-3-map-roles-to-groups",children:"Step 3: Map roles to groups"}),"\n",(0,o.jsxs)(n.p,{children:["In ",(0,o.jsx)(n.strong,{children:"Groups"}),", do the roles mapping for each group:"]}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Open the tab ",(0,o.jsx)(n.strong,{children:"Role Mapping"})]}),"\n",(0,o.jsxs)(n.li,{children:["Press the button ",(0,o.jsx)(n.strong,{children:"Assign role"})," and choose a role you want to assign to a group"]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"step-4-assign-groups-to-users",children:"Step 4: Assign groups to users"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["In ",(0,o.jsx)(n.strong,{children:"Groups"}),", choose a group you want to work with"]}),"\n",(0,o.jsxs)(n.li,{children:["In ",(0,o.jsx)(n.strong,{children:"Members"}),", press the button ",(0,o.jsx)(n.strong,{children:"Add member"})]}),"\n",(0,o.jsx)(n.li,{children:"Select a member you want to assign to a group"}),"\n"]}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["Refer to ",(0,o.jsx)(n.a,{href:"https://www.keycloak.org/docs/latest/server_admin/index.html#proc-managing-groups_server_administration_guide",children:"KeyCloak Documentation"})," for the detailed info about group assignments."]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"step-5-assign-keycloak-roles-to-ai-dial-core-deployments",children:"Step 5: Assign KeyCloak roles to AI DIAL Core deployments"}),"\n",(0,o.jsx)(n.p,{children:"The last step is to assign KeyCloak roles to AI DIAL core deployments: Applications, Addons, Assistants and Models."}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["Refer to ",(0,o.jsx)(n.a,{href:"/Deployment/configuration#some-of-the-dynamic-parameters",children:"AI DIAL Configuration"})," to learn more."]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'"addons": {\n "search": {\n "endpoint": "http://localhost:7010/search",\n "displayName": "Search",\n "userRoles": ["keycloak-role1"]\n }\n }\n\n...\n\n"applications": {\n "app": {\n "endpoint": "http://localhost:7001/openai/deployments/app/chat/completions",\n "userRoles": ["keycloak-role2"]\n }\n }\n\n...\n\n"assistant": {\n "endpoint": "http://assistant.dial-development/openai/deployments/assistant/chat/completions",\n "assistants": {\n "assistant-1": {\n "prompt": "Your system prompt.",\n "addons": [\n "addon-1",\n "addon-2"\n ],\n "userRoles": ["keycloak-role1"]\n }\n }\n }\n\n...\n\n"models": {\n "chat-gpt-35-turbo": {\n "type": "chat",\n "endpoint" : "http://localhost:7001/v1/openai/deployments/gpt-35-turbo/chat/completions",\n "upstreams": [\n {"endpoint": "http://localhost:7001", "key": "modelKey1"},\n {"endpoint": "http://localhost:7002", "key": "modelKey2"},\n {"endpoint": "http://localhost:7003", "key": "modelKey3"}\n ],\n "userRoles": ["keycloak-role2"]\n }\n}\n'})}),"\n",(0,o.jsx)(n.h2,{id:"microsoft-azure-active-directory",children:"Microsoft Azure Active Directory"}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["Refer to ",(0,o.jsx)(n.a,{href:"/tutorials/azure-ad-configuration",children:"Azure AD Configuration"})," to learn how to enable authentication with Azure AD for AI DIAL."]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"In this instruction, you will learn how to create roles in MS Azure Active Directory and add them to AI DIAL Models, Applications, Assistants, and Addons."}),"\n",(0,o.jsx)(n.p,{children:"Group management process is consisted of three steps:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"Create groups in Microsoft Azure Active Directory"}),"\n",(0,o.jsxs)(n.li,{children:["Include groups into JWT custom ",(0,o.jsx)(n.code,{children:"claim"})]}),"\n",(0,o.jsx)(n.li,{children:"Assign roles to AI DIAL Models, Applications, Assistants, and Addons"}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["The roles are provided to AI DIAL Core via user access token(JWT) by MS Azure AD and are available via the path: ",(0,o.jsx)(n.code,{children:"groups"}),"."]}),"\n",(0,o.jsx)(n.h3,{id:"step-1-create-groups-in-microsoft-azure-active-directory",children:"Step 1: Create groups in Microsoft Azure Active Directory"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["In ",(0,o.jsx)(n.strong,{children:"Groups"}),", you can create groups that you need"]}),"\n",(0,o.jsx)(n.li,{children:"Add members for each group"}),"\n"]}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["Refer to ",(0,o.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/entra/fundamentals/how-to-manage-groups",children:"MS Documentation"})," to view the detailed info about group management."]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"step-2-include-groups-into-jwt-custom-claim",children:"Step 2: Include groups into JWT custom claim"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["In Microsoft Entra ID, open the item ",(0,o.jsx)(n.strong,{children:"App Registrations"})]}),"\n",(0,o.jsx)(n.li,{children:"Open the application you want to configure groups for"}),"\n",(0,o.jsxs)(n.li,{children:["Go to the item ",(0,o.jsx)(n.strong,{children:"Token Configuration"})]}),"\n",(0,o.jsxs)(n.li,{children:["Press the button ",(0,o.jsx)(n.strong,{children:"Add Groups claim"})," and customize which groups you want to include and where (access, ID token)"]}),"\n",(0,o.jsxs)(n.li,{children:["When customizing the claim ",(0,o.jsx)(n.strong,{children:"groups"}),", you can choose the option ",(0,o.jsx)(n.strong,{children:"sAMAccountName"})," instead of ",(0,o.jsx)(n.strong,{children:"Group ID"})," to include group names instead of group UUIDs in the token"]}),"\n"]}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["Refer to ",(0,o.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-fed-group-claims#important-caveats-for-this-functionality",children:"MS Documentation"})," to view the detailed info about configuration of group claims for applications."]}),"\n"]}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Note"}),": by default, the claim ",(0,o.jsx)(n.strong,{children:"groups"})," is not included into the access token. You should add an application ",(0,o.jsx)(n.strong,{children:"scope"})," to the authorization request to obtain the claim from an access token.\nThe ",(0,o.jsx)(n.strong,{children:"claim"})," is available in the ID token only.\nRefer to ",(0,o.jsx)(n.a,{href:"https://stackoverflow.com/questions/70542675/azure-ad-access-token-does-not-contain-groups-claim",children:"stackoverflow"})," to read more about this case.\n",(0,o.jsx)(n.strong,{children:"Note"}),"*. The application ",(0,o.jsx)(n.strong,{children:"scope"})," is required to validate signature of the access token.\nRefer to ",(0,o.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/answers/questions/318741/graphapi-cannot-validate-access-token-signature",children:"Microsoft Portal"})," to read more about this case."]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["How to create a custom ",(0,o.jsx)(n.strong,{children:"scope"}),":"]}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Go to ",(0,o.jsx)(n.strong,{children:"Expose an API"})]}),"\n",(0,o.jsxs)(n.li,{children:["Set ",(0,o.jsx)(n.strong,{children:"Application ID URI"})," to something meaningful, e.g ",(0,o.jsx)(n.code,{children:"api://chatbot-ui"})]}),"\n",(0,o.jsxs)(n.li,{children:["Press the button ",(0,o.jsx)(n.strong,{children:"Add a scope"})]}),"\n",(0,o.jsxs)(n.li,{children:["Fill the required fields in the form to create a new scope. Make sure ",(0,o.jsx)(n.strong,{children:"Who can consent?"})," is set to ",(0,o.jsx)(n.strong,{children:"Admin and users"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Add the ",(0,o.jsx)(n.strong,{children:"scope"})," to the authorization request in ",(0,o.jsx)(n.code,{children:"params"}),":"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"AzureProvider({\n clientId: process.env.AUTH_AZURE_AD_CLIENT_ID,\n clientSecret: process.env.AUTH_AZURE_AD_SECRET,\n tenantId: process.env.AUTH_AZURE_AD_TENANT_ID,\n name: process.env.AUTH_AZURE_AD_NAME ?? DEFAULT_NAME,\n authorization: {\n params: { scope: 'api://chatbot-ui/Client.Consumer openid profile user.Read email offline_access' },\n },\n token: tokenConfig,\n }),\n"})}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Note"}),": if the custom ",(0,o.jsx)(n.code,{children:"scope"})," is provided, the rest of ",(0,o.jsx)(n.code,{children:"scopes"})," in the authorization request is ignored by Microsoft Azure AD.\nAs a result, clients who have requested the access token do not have access to MS Azure Graph API for reading user info such as user picture and job title."]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"step-3-assign-ms-azure-ad-groups-to-ai-dial-core-deployments",children:"Step 3: Assign MS Azure AD groups to AI DIAL Core deployments"}),"\n",(0,o.jsx)(n.p,{children:"The last step is to assign Microsoft Azure AD groups to AI DIAL Core deployments: Applications, Addons, Assistants and Models."}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["Refer to ",(0,o.jsx)(n.a,{href:"/Deployment/configuration#some-of-the-dynamic-parameters",children:"AI DIAL Configuration"})," to learn more."]}),"\n"]}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Note"}),": in the example below, MS Azure groups are mapped to AI DIAL Core user roles one to one."]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'"addons": {\n "search": {\n "endpoint": "http://localhost:7010/search",\n "displayName": "Search",\n "userRoles": ["azure-group1"]\n }\n }\n\n...\n\n"applications": {\n "app": {\n "endpoint": "http://localhost:7001/openai/deployments/app/chat/completions",\n "userRoles": ["azure-group2"]\n }\n }\n\n...\n\n"assistant": {\n "endpoint": "http://assistant.dial-development/openai/deployments/assistant/chat/completions",\n "assistants": {\n "assistant-1": {\n "prompt": "Your system prompt.",\n "addons": [\n "addon-1",\n "addon-2"\n ],\n "userRoles": ["azure-group1"]\n }\n }\n }\n\n...\n\n"models": {\n "chat-gpt-35-turbo": {\n "type": "chat",\n "endpoint" : "http://localhost:7001/v1/openai/deployments/gpt-35-turbo/chat/completions",\n "upstreams": [\n {"endpoint": "http://localhost:7001", "key": "modelKey1"},\n {"endpoint": "http://localhost:7002", "key": "modelKey2"},\n {"endpoint": "http://localhost:7003", "key": "modelKey3"}\n ],\n "userRoles": ["azure-group2"]\n }\n}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},1151:(e,n,s)=>{s.d(n,{Z:()=>a,a:()=>i});var o=s(7294);const t={},r=o.createContext(t);function i(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c8b71c12.9a9de7ea.js b/assets/js/c8b71c12.9a9de7ea.js new file mode 100644 index 00000000..c3e6f3e3 --- /dev/null +++ b/assets/js/c8b71c12.9a9de7ea.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdial=self.webpackChunkdial||[]).push([[551],{3188:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var i=t(5893),s=t(1151);const r={},o="OpenAI Model Deployment",a={id:"Deployment/OpenAI Model Deployment",title:"OpenAI Model Deployment",description:"From this instruction, you will learn how to create an Azure OpenAI model GPT-3.5-turbo/GPT-4 and use it in AI DIAL config.",source:"@site/docs/Deployment/OpenAI Model Deployment.md",sourceDirName:"Deployment",slug:"/Deployment/OpenAI Model Deployment",permalink:"/Deployment/OpenAI Model Deployment",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"CustomSideBar",previous:{title:"okta",permalink:"/Deployment/idp-configuration/okta"},next:{title:"Vertex Model Deployment",permalink:"/Deployment/Vertex Model Deployment"}},c={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Step 1: Configuring the AI Model",id:"step-1-configuring-the-ai-model",level:2},{value:"Request Access to Models",id:"request-access-to-models",level:3},{value:"Create a Model Deployment",id:"create-a-model-deployment",level:3},{value:"Step 2: Get Access to AI Model",id:"step-2-get-access-to-ai-model",level:2},{value:"Configure Azure OpenAI Model and Get API Key",id:"configure-azure-openai-model-and-get-api-key",level:4},{value:"Configure Kubernetes Service Account",id:"configure-kubernetes-service-account",level:4},{value:"Step 3: Add Model to AI DIAL",id:"step-3-add-model-to-ai-dial",level:2},{value:"Add Model to AI DIAL Core Config",id:"add-model-to-ai-dial-core-config",level:3},{value:"Configure AI DIAL Adapter",id:"configure-ai-dial-adapter",level:3},{value:"Use Adapter with Azure OpenAI API Key",id:"use-adapter-with-azure-openai-api-key",level:4},{value:"Use Kubernetes Service Account Assigned to Azure user-assigned Managed Identity",id:"use-kubernetes-service-account-assigned-to-azure-user-assigned-managed-identity",level:4}];function l(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"openai-model-deployment",children:"OpenAI Model Deployment"}),"\n",(0,i.jsx)(n.p,{children:"From this instruction, you will learn how to create an Azure OpenAI model GPT-3.5-turbo/GPT-4 and use it in AI DIAL config."}),"\n",(0,i.jsxs)("div",{class:"docusaurus-ignore",children:[(0,i.jsx)(n.h1,{id:"table-of-contents",children:"Table of Contents"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#prerequisites",children:"Prerequisites"})}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#step-1-configuring-the-ai-model",children:"Step 1: Configuring the AI Model"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#request-access-to-models",children:"Request Access to Models"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#create-a-model-deployment",children:"Create a Model Deployment"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#step-2-get-access-to-ai-model",children:"Step 2: Get Access to AI Model"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#configure-azure-openai-model-and-get-api-key",children:"Configure Azure OpenAI Model and Get API Key"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#configure-kubernetes-service-account",children:"Configure Kubernetes Service Account"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#step-3-add-model-to-ai-dial",children:"Step 3: Add Model to AI DIAL"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#add-model-to-ai-dial-core-config",children:"Add Model to AI DIAL Core Config"})}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#configure-ai-dial-adapter",children:"Configure AI DIAL Adapter"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#use-adapter-with-azure-openai-api-key",children:"Use Adapter with Azure OpenAI API Key"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#use-kubernetes-service-account-assigned-to-azure-user-assigned-managed-identity",children:"Use Kubernetes Service Account Assigned to Azure user-assigned Managed Identity"})}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]})]}),"\n",(0,i.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Active Azure account"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"step-1-configuring-the-ai-model",children:"Step 1: Configuring the AI Model"}),"\n",(0,i.jsx)(n.h3,{id:"request-access-to-models",children:"Request Access to Models"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Login to the MS Azure portal (",(0,i.jsx)(n.a,{href:"https://portal.azure.com/",children:"https://portal.azure.com/"}),") with your credentials. Create an account if you do not have one."]}),"\n",(0,i.jsxs)(n.li,{children:["Navigate to Azure OpenAI and click ",(0,i.jsx)(n.strong,{children:"Create"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Follow ",(0,i.jsx)(n.a,{href:"https://customervoice.microsoft.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR7en2Ais5pxKtso_Pz4b1_xUNTZBNzRKNlVQSFhZMU9aV09EVzYxWFdORCQlQCN0PWcu",children:"this link"})," in the notification message to request access."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:t(936).Z+"",width:"773",height:"296"})}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Important"}),": you can proceed with model creation only upon receiving the confirmation email."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"create-a-model-deployment",children:"Create a Model Deployment"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Use the search bar to look up ",(0,i.jsx)(n.strong,{children:"Azure OpenAI"})," and click it to navigate to the ",(0,i.jsx)(n.strong,{children:"Azure AI Services|Azure OpenAI"})," page."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:t(7022).Z+"",width:"1392",height:"404"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["You can now find your OpenAI model in the ",(0,i.jsx)(n.strong,{children:"Azure AI services"})," section. Click it to open and then click ",(0,i.jsx)(n.strong,{children:"Go to Azure OpenAI Studio"})," in the top bar."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:t(6305).Z+"",width:"594",height:"211"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["In Azure OpenAI Studio, click ",(0,i.jsx)(n.strong,{children:"Deployment"})," in the navigation menu and click ",(0,i.jsx)(n.strong,{children:"Create new deployment"}),". Fill in the required fields and click ",(0,i.jsx)(n.strong,{children:"Create"})," to create a model."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:t(6283).Z+"",width:"880",height:"445"})}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"It is important to note that certain models may not be accessible for deployment in a particular region. If you need a particular model, you will have to submit a separate request or relocate Azure OpenAI to a different region."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"step-2-get-access-to-ai-model",children:"Step 2: Get Access to AI Model"}),"\n",(0,i.jsx)(n.h4,{id:"configure-azure-openai-model-and-get-api-key",children:"Configure Azure OpenAI Model and Get API Key"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Go back to your model page and click ",(0,i.jsx)(n.strong,{children:"Keys and Endpoint"}),". In this section, you can find your key and endpoint that you will need to provide in AI DIAL configuration file."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:t(9001).Z+"",width:"994",height:"592"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["You can restrict access to your accounts based on a specific subset of networks by configuring network rules, only applications that access data through the designated set of networks are permitted to access the account. You can manage default network access rules for Azure AI services resources in ",(0,i.jsx)(n.strong,{children:"Resource Management/Networking"}),"."]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Refer to ",(0,i.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/azure/ai-services/cognitive-services-virtual-networks?context=%2Fazure%2Fcognitive-services%2Fopenai%2Fcontext%2Fcontext&tabs=portal#manage-default-network-access-rules",children:"Microsoft Documentation"})," to learn more.\nRefer to ",(0,i.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/legal/cognitive-services/openai/data-privacy",children:"Microsoft Data Privacy Policy"})," to learn how data provided by you to the Azure OpenAI service is processed, used, and stored."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:t(9382).Z+"",width:"1251",height:"382"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"configure-kubernetes-service-account",children:"Configure Kubernetes Service Account"}),"\n",(0,i.jsx)(n.p,{children:"In case your cluster is located at Azure, the best practise for using Azure OpenAI is to assign an Azure user-assigned managed identity to Kubernetes Service Account. You can do this using Microsoft Entra Workload ID with Azure Kubernetes Service."}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Refer to ",(0,i.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/azure/aks/workload-identity-overview",children:"Azure Documentation"})," to learn how to configure Microsoft Entra Workload ID with Azure Kubernetes Service."]}),"\n"]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Refer to ",(0,i.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/azure/aks/open-ai-secure-access-quickstart",children:"Azure Documentation"})," to learn how to configure a secure access to Azure OpenAI from Azure Kubernetes Service."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"step-3-add-model-to-ai-dial",children:"Step 3: Add Model to AI DIAL"}),"\n",(0,i.jsx)(n.p,{children:"To deploy a model to AI DIAL, it is necessary to add it to config and configure an adapter for it."}),"\n",(0,i.jsx)(n.h3,{id:"add-model-to-ai-dial-core-config",children:"Add Model to AI DIAL Core Config"}),"\n",(0,i.jsxs)(n.p,{children:["Add your model with its parameters in the ",(0,i.jsx)(n.code,{children:"models"})," section."]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Refer to ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core/blob/development/sample/aidial.config.json#L30",children:"AI DIAL Core Configuration"})," to view an example."]}),"\n"]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Refer to ",(0,i.jsx)(n.a,{href:"/Deployment/configuration#core-parameters",children:"Configure core config"})," to view the configuration of AI DIAL core parameters in the helm-based installation."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"configure-ai-dial-adapter",children:"Configure AI DIAL Adapter"}),"\n",(0,i.jsxs)(n.p,{children:["To work with models, we use applications called Adapters. You can configure OpenAI Adapter via ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-adapter-openai#environment-variables",children:"environment variables"}),"."]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Refer to ",(0,i.jsx)(n.a,{href:"https://github.com/epam/ai-dial-adapter-openai",children:"Adapter for OpenAI"})," to view documentation for a OpenAI AI DIAL Adapter."]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"use-adapter-with-azure-openai-api-key",children:"Use Adapter with Azure OpenAI API Key"}),"\n",(0,i.jsx)(n.p,{children:"In this scenario, it's enough to enable the adapter. Azure Open AI keys are located in the configuration file of AI DIAL Core. Any other configuration of the adapter is not required."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"openai:\n enabled: true\n\n"})}),"\n",(0,i.jsx)(n.h4,{id:"use-kubernetes-service-account-assigned-to-azure-user-assigned-managed-identity",children:"Use Kubernetes Service Account Assigned to Azure user-assigned Managed Identity"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Before taking this step, configure ",(0,i.jsx)(n.a,{href:"#configure-kubernetes-service-account",children:"Microsoft Entra Workload ID with Azure Kubernetes Service"}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"In this scenario, the adapter uses Azure user-assigned managed identity. In such a configuration, there's no need to setting the Azure OpenAI API key in the AI DIAL Core configuration file. Authentication takes place on the adapter level."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:'openai:\n enabled: true\n\n podLabels:\n azure.workload.identity/use: "true"\n \nserviceAccount:\n create: true\n annotations:\n azure.workload.identity/client-id: "client-id"\n'})})]})}function u(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},9001:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/step13-8f076c41b399277b7c01f06f423867c3.jpg"},7022:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/step2-e83a4f275333f4b35994e49b503388a5.jpg"},936:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/step5-d7bbb290c06c5dcd7539c0ce15e3de5d.jpg"},6305:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/step8-ceeb082b7c380cbaaa31dadc2b70db95.jpg"},6283:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/step9-7be1fbb3bc3da4a5381d72e900d20d8d.jpg"},9382:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/whitelisting-e4d14b12d9feaf40e2b21d654cbaa232.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>o});var i=t(7294);const s={},r=i.createContext(s);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c8b71c12.db677550.js b/assets/js/c8b71c12.db677550.js deleted file mode 100644 index d680a457..00000000 --- a/assets/js/c8b71c12.db677550.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdial=self.webpackChunkdial||[]).push([[551],{3188:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>d});var t=i(5893),r=i(1151);const s={},o="OpenAI Model Deployment",a={id:"Deployment/OpenAI Model Deployment",title:"OpenAI Model Deployment",description:"From this instruction, you will learn how to create an Azure OpenAI model GPT-3.5-turbo/GPT-4 and use it in AI DIAL config.",source:"@site/docs/Deployment/OpenAI Model Deployment.md",sourceDirName:"Deployment",slug:"/Deployment/OpenAI Model Deployment",permalink:"/Deployment/OpenAI Model Deployment",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"CustomSideBar",previous:{title:"configuration",permalink:"/Deployment/configuration"},next:{title:"Vertex Model Deployment",permalink:"/Deployment/Vertex Model Deployment"}},c={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Step 1: Configuring the AI Model",id:"step-1-configuring-the-ai-model",level:2},{value:"Request Access to Models",id:"request-access-to-models",level:3},{value:"Create a Model Deployment",id:"create-a-model-deployment",level:3},{value:"Step 2: Get Access to AI Model",id:"step-2-get-access-to-ai-model",level:2},{value:"Configure Azure OpenAI Model and Get API Key",id:"configure-azure-openai-model-and-get-api-key",level:4},{value:"Configure Kubernetes Service Account",id:"configure-kubernetes-service-account",level:4},{value:"Step 3: Add Model to AI DIAL",id:"step-3-add-model-to-ai-dial",level:2},{value:"Add Model to AI DIAL Core Config",id:"add-model-to-ai-dial-core-config",level:3},{value:"Configure AI DIAL Adapter",id:"configure-ai-dial-adapter",level:3},{value:"Use Adapter with Azure OpenAI API Key",id:"use-adapter-with-azure-openai-api-key",level:4},{value:"Use Kubernetes Service Account Assigned to Azure user-assigned Managed Identity",id:"use-kubernetes-service-account-assigned-to-azure-user-assigned-managed-identity",level:4}];function l(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"openai-model-deployment",children:"OpenAI Model Deployment"}),"\n",(0,t.jsx)(n.p,{children:"From this instruction, you will learn how to create an Azure OpenAI model GPT-3.5-turbo/GPT-4 and use it in AI DIAL config."}),"\n",(0,t.jsxs)("div",{class:"docusaurus-ignore",children:[(0,t.jsx)(n.h1,{id:"table-of-contents",children:"Table of Contents"}),(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#prerequisites",children:"Prerequisites"})}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"#step-1-configuring-the-ai-model",children:"Step 1: Configuring the AI Model"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#request-access-to-models",children:"Request Access to Models"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#create-a-model-deployment",children:"Create a Model Deployment"})}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"#step-2-get-access-to-ai-model",children:"Step 2: Get Access to AI Model"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#configure-azure-openai-model-and-get-api-key",children:"Configure Azure OpenAI Model and Get API Key"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#configure-kubernetes-service-account",children:"Configure Kubernetes Service Account"})}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"#step-3-add-model-to-ai-dial",children:"Step 3: Add Model to AI DIAL"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#add-model-to-ai-dial-core-config",children:"Add Model to AI DIAL Core Config"})}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"#configure-ai-dial-adapter",children:"Configure AI DIAL Adapter"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#use-adapter-with-azure-openai-api-key",children:"Use Adapter with Azure OpenAI API Key"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#use-kubernetes-service-account-assigned-to-azure-user-assigned-managed-identity",children:"Use Kubernetes Service Account Assigned to Azure user-assigned Managed Identity"})}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]})]}),"\n",(0,t.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Active Azure account"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"step-1-configuring-the-ai-model",children:"Step 1: Configuring the AI Model"}),"\n",(0,t.jsx)(n.h3,{id:"request-access-to-models",children:"Request Access to Models"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Login to the MS Azure portal (",(0,t.jsx)(n.a,{href:"https://portal.azure.com/",children:"https://portal.azure.com/"}),") with your credentials. Create an account if you do not have one."]}),"\n",(0,t.jsxs)(n.li,{children:["Navigate to Azure OpenAI and click ",(0,t.jsx)(n.strong,{children:"Create"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Follow ",(0,t.jsx)(n.a,{href:"https://customervoice.microsoft.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR7en2Ais5pxKtso_Pz4b1_xUNTZBNzRKNlVQSFhZMU9aV09EVzYxWFdORCQlQCN0PWcu",children:"this link"})," in the notification message to request access."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{src:i(936).Z+"",width:"773",height:"296"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Important"}),": you can proceed with model creation only upon receiving the confirmation email."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"create-a-model-deployment",children:"Create a Model Deployment"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Use the search bar to look up ",(0,t.jsx)(n.strong,{children:"Azure OpenAI"})," and click it to navigate to the ",(0,t.jsx)(n.strong,{children:"Azure AI Services|Azure OpenAI"})," page."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{src:i(7022).Z+"",width:"1392",height:"404"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["You can now find your OpenAI model in the ",(0,t.jsx)(n.strong,{children:"Azure AI services"})," section. Click it to open and then click ",(0,t.jsx)(n.strong,{children:"Go to Azure OpenAI Studio"})," in the top bar."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{src:i(6305).Z+"",width:"594",height:"211"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["In Azure OpenAI Studio, click ",(0,t.jsx)(n.strong,{children:"Deployment"})," in the navigation menu and click ",(0,t.jsx)(n.strong,{children:"Create new deployment"}),". Fill in the required fields and click ",(0,t.jsx)(n.strong,{children:"Create"})," to create a model."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{src:i(6283).Z+"",width:"880",height:"445"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"It is important to note that certain models may not be accessible for deployment in a particular region. If you need a particular model, you will have to submit a separate request or relocate Azure OpenAI to a different region."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"step-2-get-access-to-ai-model",children:"Step 2: Get Access to AI Model"}),"\n",(0,t.jsx)(n.h4,{id:"configure-azure-openai-model-and-get-api-key",children:"Configure Azure OpenAI Model and Get API Key"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Go back to your model page and click ",(0,t.jsx)(n.strong,{children:"Keys and Endpoint"}),". In this section, you can find your key and endpoint that you will need to provide in AI DIAL configuration file."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{src:i(9001).Z+"",width:"994",height:"592"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["You can restrict access to your accounts based on a specific subset of networks by configuring network rules, only applications that access data through the designated set of networks are permitted to access the account. You can manage default network access rules for Azure AI services resources in ",(0,t.jsx)(n.strong,{children:"Resource Management/Networking"}),"."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Refer to ",(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/azure/ai-services/cognitive-services-virtual-networks?context=%2Fazure%2Fcognitive-services%2Fopenai%2Fcontext%2Fcontext&tabs=portal#manage-default-network-access-rules",children:"Microsoft Documentation"})," to learn more.\nRefer to ",(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/legal/cognitive-services/openai/data-privacy",children:"Microsoft Data Privacy Policy"})," to learn how data provided by you to the Azure OpenAI service is processed, used, and stored."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{src:i(9382).Z+"",width:"1251",height:"382"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"configure-kubernetes-service-account",children:"Configure Kubernetes Service Account"}),"\n",(0,t.jsx)(n.p,{children:"In case your cluster is located at Azure, the best practise for using Azure OpenAI is to assign an Azure user-assigned managed identity to Kubernetes Service Account. You can do this using Microsoft Entra Workload ID with Azure Kubernetes Service."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Refer to ",(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/azure/aks/workload-identity-overview",children:"Azure Documentation"})," to learn how to configure Microsoft Entra Workload ID with Azure Kubernetes Service."]}),"\n"]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Refer to ",(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/azure/aks/open-ai-secure-access-quickstart",children:"Azure Documentation"})," to learn how to configure a secure access to Azure OpenAI from Azure Kubernetes Service."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"step-3-add-model-to-ai-dial",children:"Step 3: Add Model to AI DIAL"}),"\n",(0,t.jsx)(n.p,{children:"To deploy a model to AI DIAL, it is necessary to add it to config and configure an adapter for it."}),"\n",(0,t.jsx)(n.h3,{id:"add-model-to-ai-dial-core-config",children:"Add Model to AI DIAL Core Config"}),"\n",(0,t.jsxs)(n.p,{children:["Add your model with its parameters in the ",(0,t.jsx)(n.code,{children:"models"})," section."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Refer to ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial-core/blob/development/sample/aidial.config.json#L30",children:"AI DIAL Core Configuration"})," to view an example."]}),"\n"]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Refer to ",(0,t.jsx)(n.a,{href:"/Deployment/configuration#core-parameters",children:"Configure core config"})," to view the configuration of AI DIAL core parameters in the helm-based installation."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"configure-ai-dial-adapter",children:"Configure AI DIAL Adapter"}),"\n",(0,t.jsxs)(n.p,{children:["To work with models, we use applications called Adapters. You can configure OpenAI Adapter via ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial-adapter-openai#environment-variables",children:"environment variables"}),"."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Refer to ",(0,t.jsx)(n.a,{href:"https://github.com/epam/ai-dial-adapter-openai",children:"Adapter for OpenAI"})," to view documentation for a OpenAI AI DIAL Adapter."]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"use-adapter-with-azure-openai-api-key",children:"Use Adapter with Azure OpenAI API Key"}),"\n",(0,t.jsx)(n.p,{children:"In this scenario, it's enough to enable the adapter. Azure Open AI keys are located in the configuration file of AI DIAL Core. Any other configuration of the adapter is not required."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"openai:\n enabled: true\n\n"})}),"\n",(0,t.jsx)(n.h4,{id:"use-kubernetes-service-account-assigned-to-azure-user-assigned-managed-identity",children:"Use Kubernetes Service Account Assigned to Azure user-assigned Managed Identity"}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Before taking this step, configure ",(0,t.jsx)(n.a,{href:"#configure-kubernetes-service-account",children:"Microsoft Entra Workload ID with Azure Kubernetes Service"}),"."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"In this scenario, the adapter uses Azure user-assigned managed identity. In such a configuration, there's no need to setting the Azure OpenAI API key in the AI DIAL Core configuration file. Authentication takes place on the adapter level."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'openai:\n enabled: true\n\n podLabels:\n azure.workload.identity/use: "true"\n \nserviceAccount:\n create: true\n annotations:\n azure.workload.identity/client-id: "client-id"\n'})})]})}function u(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},9001:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/step13-8f076c41b399277b7c01f06f423867c3.jpg"},7022:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/step2-e83a4f275333f4b35994e49b503388a5.jpg"},936:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/step5-d7bbb290c06c5dcd7539c0ce15e3de5d.jpg"},6305:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/step8-ceeb082b7c380cbaaa31dadc2b70db95.jpg"},6283:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/step9-7be1fbb3bc3da4a5381d72e900d20d8d.jpg"},9382:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/whitelisting-e4d14b12d9feaf40e2b21d654cbaa232.png"},1151:(e,n,i)=>{i.d(n,{Z:()=>a,a:()=>o});var t=i(7294);const r={},s=t.createContext(r);function o(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.52f1b1fe.js b/assets/js/main.52f1b1fe.js new file mode 100644 index 00000000..a75a409e --- /dev/null +++ b/assets/js/main.52f1b1fe.js @@ -0,0 +1,2 @@ +/*! For license information please see main.52f1b1fe.js.LICENSE.txt */ +(self.webpackChunkdial=self.webpackChunkdial||[]).push([[179],{830:(e,t,n)=>{"use strict";n.d(t,{W:()=>o});var r=n(7294);function o(){return r.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},r.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}},723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});n(7294);var r=n(8356),o=n.n(r),a=n(6887);const i={"07d3d972":[()=>n.e(372).then(n.bind(n,1904)),"@site/docs/Deployment/idp-configuration/keycloak.md",1904],"0a0492db":[()=>n.e(310).then(n.bind(n,5358)),"@site/docs/tutorials/quick-start-with-addon.md",5358],"0eef0f8a":[()=>n.e(255).then(n.t.bind(n,7085,19)),"/home/runner/work/ai-dial/ai-dial/.docusaurus/docusaurus-theme-search-algolia/default/plugin-route-context-module-100.json",7085],17896441:[()=>Promise.all([n.e(532),n.e(918)]).then(n.bind(n,7854)),"@theme/DocItem",7854],"1a4e3797":[()=>Promise.all([n.e(532),n.e(920)]).then(n.bind(n,6675)),"@theme/SearchPage",6675],"1db65d89":[()=>n.e(659).then(n.bind(n,7925)),"@site/docs/user-guide.md",7925],"23374ca6":[()=>n.e(421).then(n.bind(n,466)),"@site/docs/README.md",466],"2e7f61df":[()=>n.e(184).then(n.bind(n,2850)),"@site/docs/Deployment/idp-configuration/entraID.md",2850],"32f50ce0":[()=>n.e(457).then(n.bind(n,1502)),"@site/docs/Cookbook/dial-cookbook/examples/how_to_call_text_to_image_applications.mdx",1502],"3392dc53":[()=>n.e(410).then(n.bind(n,3547)),"@site/docs/Deployment/idp-configuration/okta.md",3547],"3822d5df":[()=>n.e(605).then(n.bind(n,9655)),"@site/docs/Deployment/idp-configuration/auth0.md",9655],"3cda4e15":[()=>n.e(122).then(n.bind(n,7577)),"@site/docs/Deployment/configuration.md",7577],"46ba9cd8":[()=>n.e(924).then(n.bind(n,1294)),"@site/docs/Cookbook/dial-cookbook/examples/how_to_call_text_to_text_applications.mdx",1294],"51686d2b":[()=>n.e(162).then(n.bind(n,3728)),"@site/docs/Deployment/idp-configuration/google.md",3728],"5281b7a2":[()=>n.e(927).then(n.bind(n,2589)),"@site/docs/architecture.md",2589],"5e95c892":[()=>n.e(661).then(n.bind(n,1892)),"@theme/DocsRoot",1892],"6c15c11a":[()=>n.e(114).then(n.bind(n,3252)),"@site/docs/tutorials/quick-start-model.md",3252],"72e14192":[()=>n.e(239).then(n.bind(n,4363)),"@site/docs/quick-start.md",4363],"7a319521":[()=>n.e(362).then(n.bind(n,1859)),"@site/docs/tutorials/quick-start-with-application.md",1859],"7d0ffb52":[()=>n.e(668).then(n.t.bind(n,3769,19)),"/home/runner/work/ai-dial/ai-dial/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"8a489d04":[()=>n.e(154).then(n.bind(n,6589)),"@site/docs/Cookbook/dial-cookbook/examples/how_to_call_image_to_text_applications.mdx",6589],"8b91756d":[()=>n.e(467).then(n.bind(n,549)),"@site/docs/tutorials/azure-ad-configuration.md",549],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],a097b135:[()=>n.e(343).then(n.bind(n,7314)),"@site/docs/Deployment/idp-configuration/cognito.md",7314],a7bd4aaa:[()=>n.e(518).then(n.bind(n,8564)),"@theme/DocVersionRoot",8564],a94703ab:[()=>Promise.all([n.e(532),n.e(368)]).then(n.bind(n,2674)),"@theme/DocRoot",2674],b232fa30:[()=>n.e(833).then(n.bind(n,971)),"@site/docs/Deployment/Bedrock Model Deployment.md",971],ba864879:[()=>n.e(620).then(n.bind(n,1691)),"@site/docs/tutorials/roles-management.md",1691],c8b71c12:[()=>n.e(551).then(n.bind(n,3188)),"@site/docs/Deployment/OpenAI Model Deployment.md",3188],ed886c21:[()=>n.e(941).then(n.bind(n,2551)),"@site/docs/Deployment/Vertex Model Deployment.md",2551]};var l=n(5893);function s(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,l.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,l.jsx)("p",{children:String(t)}),(0,l.jsx)("div",{children:(0,l.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,l.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,l.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,l.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,l.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var u=n(9670),c=n(226);function d(e,t){if("*"===e)return o()({loading:s,loader:()=>n.e(772).then(n.bind(n,1772)),modules:["@theme/NotFound"],webpack:()=>[1772],render(e,t){const n=e.default;return(0,l.jsx)(c.z,{value:{plugin:{name:"native",id:"default"}},children:(0,l.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},p=[],f=[],m=(0,u.Z)(r);return Object.entries(m).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),o().Map({loading:s,loader:d,modules:p,webpack:()=>f,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const l=n.split(".");l.slice(0,-1).forEach((e=>{i=i[e]})),i[l[l.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;return delete o.__context,(0,l.jsx)(c.z,{value:i,children:(0,l.jsx)(a,{...o,...n})})}})}const p=[{path:"/search",component:d("/search","fa9"),exact:!0},{path:"/",component:d("/","c0b"),routes:[{path:"/",component:d("/","902"),routes:[{path:"/",component:d("/","04f"),routes:[{path:"/architecture",component:d("/architecture","e17"),exact:!0,sidebar:"CustomSideBar"},{path:"/Cookbook/dial-cookbook/examples/how_to_call_image_to_text_applications",component:d("/Cookbook/dial-cookbook/examples/how_to_call_image_to_text_applications","648"),exact:!0,sidebar:"CustomSideBar"},{path:"/Cookbook/dial-cookbook/examples/how_to_call_text_to_image_applications",component:d("/Cookbook/dial-cookbook/examples/how_to_call_text_to_image_applications","418"),exact:!0,sidebar:"CustomSideBar"},{path:"/Cookbook/dial-cookbook/examples/how_to_call_text_to_text_applications",component:d("/Cookbook/dial-cookbook/examples/how_to_call_text_to_text_applications","ba8"),exact:!0,sidebar:"CustomSideBar"},{path:"/Deployment/Bedrock Model Deployment",component:d("/Deployment/Bedrock Model Deployment","98e"),exact:!0,sidebar:"CustomSideBar"},{path:"/Deployment/configuration",component:d("/Deployment/configuration","20b"),exact:!0,sidebar:"CustomSideBar"},{path:"/Deployment/idp-configuration/auth0",component:d("/Deployment/idp-configuration/auth0","734"),exact:!0,sidebar:"CustomSideBar"},{path:"/Deployment/idp-configuration/cognito",component:d("/Deployment/idp-configuration/cognito","02d"),exact:!0,sidebar:"CustomSideBar"},{path:"/Deployment/idp-configuration/entraID",component:d("/Deployment/idp-configuration/entraID","2d2"),exact:!0,sidebar:"CustomSideBar"},{path:"/Deployment/idp-configuration/google",component:d("/Deployment/idp-configuration/google","4c4"),exact:!0,sidebar:"CustomSideBar"},{path:"/Deployment/idp-configuration/keycloak",component:d("/Deployment/idp-configuration/keycloak","a74"),exact:!0,sidebar:"CustomSideBar"},{path:"/Deployment/idp-configuration/okta",component:d("/Deployment/idp-configuration/okta","c67"),exact:!0,sidebar:"CustomSideBar"},{path:"/Deployment/OpenAI Model Deployment",component:d("/Deployment/OpenAI Model Deployment","b39"),exact:!0,sidebar:"CustomSideBar"},{path:"/Deployment/Vertex Model Deployment",component:d("/Deployment/Vertex Model Deployment","d9a"),exact:!0,sidebar:"CustomSideBar"},{path:"/quick-start",component:d("/quick-start","4b6"),exact:!0,sidebar:"CustomSideBar"},{path:"/tutorials/azure-ad-configuration",component:d("/tutorials/azure-ad-configuration","0da"),exact:!0},{path:"/tutorials/quick-start-model",component:d("/tutorials/quick-start-model","b4f"),exact:!0,sidebar:"CustomSideBar"},{path:"/tutorials/quick-start-with-addon",component:d("/tutorials/quick-start-with-addon","033"),exact:!0,sidebar:"CustomSideBar"},{path:"/tutorials/quick-start-with-application",component:d("/tutorials/quick-start-with-application","6d1"),exact:!0,sidebar:"CustomSideBar"},{path:"/tutorials/roles-management",component:d("/tutorials/roles-management","346"),exact:!0},{path:"/user-guide",component:d("/user-guide","307"),exact:!0,sidebar:"CustomSideBar"},{path:"/",component:d("/","720"),exact:!0,sidebar:"CustomSideBar"}]}]}]},{path:"*",component:d("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>i});var r=n(7294),o=n(5893);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},7221:(e,t,n)=>{"use strict";var r=n(7294),o=n(745),a=n(3727),i=n(405),l=n(412);const s=[n(6657),n(2497),n(3310),n(8320),n(2295),n(8203)];var u=n(723),c=n(6550),d=n(8790),p=n(5893);function f(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var m=n(5742),h=n(2263),g=n(4996),y=n(6668),b=n(833),v=n(4711),w=n(9727),k=n(3320),x=n(8780),S=n(197);function E(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,h.Z)(),r=(0,v.l)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,p.jsxs)(m.Z,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,p.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function _(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.Z)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,h.Z)(),{pathname:r}=(0,c.TH)();return e+(0,x.applyTrailingSlash)((0,g.Z)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,p.jsxs)(m.Z,{children:[(0,p.jsx)("meta",{property:"og:url",content:o}),(0,p.jsx)("link",{rel:"canonical",href:o})]})}function C(){const{i18n:{currentLocale:e}}=(0,h.Z)(),{metadata:t,image:n}=(0,y.L)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(m.Z,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:w.h})]}),n&&(0,p.jsx)(b.d,{image:n}),(0,p.jsx)(_,{}),(0,p.jsx)(E,{}),(0,p.jsx)(S.Z,{tag:k.HX,locale:e}),(0,p.jsx)(m.Z,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const T=new Map;function A(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,d.f)(u.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}var j=n(8934),L=n(8940),R=n(469);function O(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const P=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,R.Z)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),O("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function N(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(u.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class D extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?O("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=O("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),N(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,p.jsx)(P,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(c.AW,{location:t,render:()=>e})})}}const I=D,M="__docusaurus-base-url-issue-banner-container",F="__docusaurus-base-url-issue-banner",z="__docusaurus-base-url-issue-banner-suggestion-container";function B(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${M}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var Q=n(9670);const Y=new Set,X=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!X.has(e)&&!Y.has(e))(e))return!1;Y.add(e);const t=(0,d.f)(u.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(W).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Q.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?K(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!X.has(e))(e)&&(X.add(e),N(e))},te=Object.freeze(ee),ne=Boolean(!0);if(l.Z.canUseDOM){window.docusaurus=te;const e=document.getElementById("__docusaurus"),t=(0,p.jsx)(i.B6,{children:(0,p.jsx)(a.VK,{children:(0,p.jsx)(V,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},l=()=>{if(ne)r.startTransition((()=>{o.hydrateRoot(e,t,{onRecoverableError:n})}));else{const a=o.createRoot(e,{onRecoverableError:n});r.startTransition((()=>{a.render(t)}))}};N(window.location.pathname).then(l)}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>d,M:()=>p});var r=n(7294),o=n(6809);const a=JSON.parse('{"docusaurus-plugin-google-gtag":{"default":{"trackingID":["G-GVY5VWYV1E"],"anonymizeIP":false,"id":"default"}},"docusaurus-plugin-content-docs":{"default":{"path":"/","versions":[{"name":"current","label":"Next","isLast":true,"path":"/","mainDocId":"README","docs":[{"id":"architecture","path":"/architecture","sidebar":"CustomSideBar"},{"id":"Cookbook/dial-cookbook/examples/how_to_call_image_to_text_applications","path":"/Cookbook/dial-cookbook/examples/how_to_call_image_to_text_applications","sidebar":"CustomSideBar"},{"id":"Cookbook/dial-cookbook/examples/how_to_call_text_to_image_applications","path":"/Cookbook/dial-cookbook/examples/how_to_call_text_to_image_applications","sidebar":"CustomSideBar"},{"id":"Cookbook/dial-cookbook/examples/how_to_call_text_to_text_applications","path":"/Cookbook/dial-cookbook/examples/how_to_call_text_to_text_applications","sidebar":"CustomSideBar"},{"id":"Deployment/Bedrock Model Deployment","path":"/Deployment/Bedrock Model Deployment","sidebar":"CustomSideBar"},{"id":"Deployment/configuration","path":"/Deployment/configuration","sidebar":"CustomSideBar"},{"id":"Deployment/idp-configuration/auth0","path":"/Deployment/idp-configuration/auth0","sidebar":"CustomSideBar"},{"id":"Deployment/idp-configuration/cognito","path":"/Deployment/idp-configuration/cognito","sidebar":"CustomSideBar"},{"id":"Deployment/idp-configuration/entraID","path":"/Deployment/idp-configuration/entraID","sidebar":"CustomSideBar"},{"id":"Deployment/idp-configuration/google","path":"/Deployment/idp-configuration/google","sidebar":"CustomSideBar"},{"id":"Deployment/idp-configuration/keycloak","path":"/Deployment/idp-configuration/keycloak","sidebar":"CustomSideBar"},{"id":"Deployment/idp-configuration/okta","path":"/Deployment/idp-configuration/okta","sidebar":"CustomSideBar"},{"id":"Deployment/OpenAI Model Deployment","path":"/Deployment/OpenAI Model Deployment","sidebar":"CustomSideBar"},{"id":"Deployment/Vertex Model Deployment","path":"/Deployment/Vertex Model Deployment","sidebar":"CustomSideBar"},{"id":"quick-start","path":"/quick-start","sidebar":"CustomSideBar"},{"id":"README","path":"/","sidebar":"CustomSideBar"},{"id":"tutorials/azure-ad-configuration","path":"/tutorials/azure-ad-configuration"},{"id":"tutorials/quick-start-model","path":"/tutorials/quick-start-model","sidebar":"CustomSideBar"},{"id":"tutorials/quick-start-with-addon","path":"/tutorials/quick-start-with-addon","sidebar":"CustomSideBar"},{"id":"tutorials/quick-start-with-application","path":"/tutorials/quick-start-with-application","sidebar":"CustomSideBar"},{"id":"tutorials/roles-management","path":"/tutorials/roles-management"},{"id":"user-guide","path":"/user-guide","sidebar":"CustomSideBar"}],"draftIds":[],"sidebars":{"CustomSideBar":{"link":{"path":"/","label":"Home"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var l=n(7529);const s=JSON.parse('{"docusaurusVersion":"3.0.0","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.0.0"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.0.0"},"docusaurus-plugin-google-gtag":{"type":"package","name":"@docusaurus/plugin-google-gtag","version":"3.0.0"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.0.0"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.0.0"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"3.0.0"},"docusaurus-plugin-image-zoom":{"type":"package","name":"docusaurus-plugin-image-zoom","version":"1.0.1"}}}');var u=n(5893);const c={siteConfig:o.default,siteMetadata:s,globalData:a,i18n:i,codeTranslations:l},d=r.createContext(c);function p(e){let{children:t}=e;return(0,u.jsx)(d.Provider,{value:c,children:t})}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),o=n(412),a=n(5742),i=n(8780),l=n(7452),s=n(5893);function u(e){let{error:t,tryAgain:n}=e;return(0,s.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,s.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,s.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,s.jsx)(c,{error:t})]})}function c(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,s.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function d(e){let{error:t,tryAgain:n}=e;return(0,s.jsxs)(f,{fallback:()=>(0,s.jsx)(u,{error:t,tryAgain:n}),children:[(0,s.jsx)(a.Z,{children:(0,s.jsx)("title",{children:"Page Error"})}),(0,s.jsx)(l.Z,{children:(0,s.jsx)(u,{error:t,tryAgain:n})})]})}const p=e=>(0,s.jsx)(d,{...e});class f extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??p)(e)}return e??null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});n(7294);var r=n(405),o=n(5893);function a(e){return(0,o.jsx)(r.ql,{...e})}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),o=n(3727),a=n(8780),i=n(2263),l=n(3919),s=n(412),u=n(5893);const c=r.createContext({collectLink:()=>{}});var d=n(4996);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:m,isActive:h,"data-noBrokenLinkCheck":g,autoAddBaseUrl:y=!0,...b}=e;const{siteConfig:{trailingSlash:v,baseUrl:w}}=(0,i.Z)(),{withBaseUrl:k}=(0,d.C)(),x=(0,r.useContext)(c),S=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>S.current));const E=p||f;const _=(0,l.Z)(E),C=E?.replace("pathname://","");let T=void 0!==C?(A=C,y&&(e=>e.startsWith("/"))(A)?k(A):A):void 0;var A;T&&_&&(T=(0,a.applyTrailingSlash)(T,{trailingSlash:v,baseUrl:w}));const j=(0,r.useRef)(!1),L=n?o.OL:o.rU,R=s.Z.canUseIntersectionObserver,O=(0,r.useRef)(),P=()=>{j.current||null==T||(window.docusaurus.preload(T),j.current=!0)};(0,r.useEffect)((()=>(!R&&_&&null!=T&&window.docusaurus.prefetch(T),()=>{R&&O.current&&O.current.disconnect()})),[O,T,R,_]);const N=T?.startsWith("#")??!1,D=!T||!_||N;return D||g||x.collectLink(T),D?(0,u.jsx)("a",{ref:S,href:T,...E&&!_&&{target:"_blank",rel:"noopener noreferrer"},...b}):(0,u.jsx)(L,{...b,onMouseEnter:P,onTouchStart:P,innerRef:e=>{S.current=e,R&&e&&_&&(O.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(O.current.unobserve(e),O.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),O.current.observe(e))},to:T,...n&&{isActive:h,activeClassName:m}})}const f=r.forwardRef(p)},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u,I:()=>s});var r=n(7294),o=n(5893);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(7529);function l(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function s(e,t){let{message:n,id:r}=e;return a(l({message:n,id:r}),t)}function u(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const i=l({message:t,id:n});return(0,o.jsx)(o.Fragment,{children:a(i,r)})}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>o,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>l});var r=n(7294),o=n(2263),a=n(3919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,o.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:o=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,a.b)(n))return n;if(o)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294),o=n(8940);function a(){return(0,r.useContext)(o._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294),o=n(8934);function a(){return(0,r.useContext)(o._)}},469:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294);const o=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function o(e){const t={};return function e(n,o){Object.entries(n).forEach((n=>{let[a,i]=n;const l=o?`${o}.${a}`:a;r(i)?e(i,l):t[l]=i}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>i});var r=n(7294),o=n(5893);const a=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(a),l=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,o.jsx)(a.Provider,{value:l,children:t})}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>y,gA:()=>f,WS:()=>m,_r:()=>d,Jo:()=>b,zh:()=>p,yW:()=>g,gB:()=>h});var r=n(6550),o=n(2263),a=n(9935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,o.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}function u(e,t){const n=s(e,t),o=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(o.id):{}}}const c={},d=()=>i("docusaurus-plugin-content-docs")??c,p=e=>function(e,t,n){void 0===t&&(t=a.m),void 0===n&&(n={});const r=i(e),o=r?.[t];if(!o&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return o}("docusaurus-plugin-content-docs",e,{failfast:!0});function f(e){void 0===e&&(e={});const t=d(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const o=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),a=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!a&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return a}(t,n,e)}function m(e){void 0===e&&(e={});const t=f(e),{pathname:n}=(0,r.TH)();if(!t)return;return{activePlugin:t,activeVersion:s(t.pluginData,n)}}function h(e){return p(e).versions}function g(e){const t=p(e);return l(t)}function y(e){const t=p(e),{pathname:n}=(0,r.TH)();return u(t,n)}function b(e){const t=p(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=l(e);return{latestDocSuggestion:u(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},6657:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={onRouteDidUpdate(e){let{location:t,previousLocation:n}=e;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||setTimeout((()=>{window.gtag("set","page_path",t.pathname+t.search+t.hash),window.gtag("event","page_view")}))}}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(4865),o=n.n(r);o().configure({showSpinner:!1});const a={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{o().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(2573),o=n(6809);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(6854),n(6726)(`./prism-${e}`)})),delete globalThis.Prism}(r.p1)},2503:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});n(7294);var r=n(6010),o=n(5999),a=n(6668),i=n(9960);const l={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var s=n(5893);function u(e){let{as:t,id:n,...u}=e;const{navbar:{hideOnScroll:c}}=(0,a.L)();if("h1"===t||!n)return(0,s.jsx)(t,{...u,id:void 0});const d=(0,o.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return(0,s.jsxs)(t,{...u,className:(0,r.Z)("anchor",c?l.anchorWithHideOnScrollNavbar:l.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,s.jsx)(i.Z,{className:"hash-link",to:`#${n}`,"aria-label":d,title:d,children:"\u200b"})]})}},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});n(7294);const r={iconExternalLink:"iconExternalLink_nPIU"};var o=n(5893);function a(e){let{width:t=13.5,height:n=13.5}=e;return(0,o.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,o.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},7452:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Rt});var r=n(7294),o=n(6010),a=n(4763),i=n(833),l=n(6550),s=n(5999),u=n(5936),c=n(5893);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,l.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,u.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const m=(0,s.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){const t=e.children??m,{containerRef:n,onClick:r}=f();return(0,c.jsx)("div",{ref:n,role:"region","aria-label":m,children:(0,c.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var g=n(5281),y=n(9727);const b={skipToContent:"skipToContent_fXgn"};function v(){return(0,c.jsx)(h,{className:b.skipToContent})}var w=n(6668),k=n(9689);function x(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:a,...i}=e;return(0,c.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,c.jsx)("g",{stroke:r,strokeWidth:o,children:(0,c.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const S={closeButton:"closeButton_CVFx"};function E(e){return(0,c.jsx)("button",{type:"button","aria-label":(0,s.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,o.Z)("clean-btn close",S.closeButton,e.className),children:(0,c.jsx)(x,{width:14,height:14,strokeWidth:3.1})})}const _={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return(0,c.jsx)("div",{...e,className:(0,o.Z)(_.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function A(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,k.nT)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:a}=e;return(0,c.jsxs)("div",{className:T.announcementBar,style:{backgroundColor:r,color:o},role:"banner",children:[a&&(0,c.jsx)("div",{className:T.announcementBarPlaceholder}),(0,c.jsx)(C,{className:T.announcementBarContent}),a&&(0,c.jsx)(E,{onClick:n,className:T.announcementBarClose})]})}var j=n(3163),L=n(2466);var R=n(902),O=n(3102);const P=r.createContext(null);function N(e){let{children:t}=e;const n=function(){const e=(0,j.e)(),t=(0,O.HY)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,R.D9)(a);return(0,r.useEffect)((()=>{a&&!i&&o(!0)}),[a,i]),(0,r.useEffect)((()=>{a?e.shown||o(!0):o(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,o]),[n])}();return(0,c.jsx)(P.Provider,{value:n,children:t})}function D(e){if(e.component){const t=e.component;return(0,c.jsx)(t,{...e.props})}}function I(){const e=(0,r.useContext)(P);if(!e)throw new R.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,O.HY)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:D(a)})),[o,a,t])}function M(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:a}=I();return(0,c.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,c.jsxs)("div",{className:(0,o.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":a}),children:[(0,c.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,c.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var F=n(2949),z=n(2389);function B(e){return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,c.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function U(e){return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,c.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const $={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:r,onChange:a}=e;const i=(0,z.Z)(),l=(0,s.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,s.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,s.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,c.jsx)("div",{className:(0,o.Z)($.toggle,t),children:(0,c.jsxs)("button",{className:(0,o.Z)("clean-btn",$.toggleButton,!i&&$.toggleButtonDisabled,n),type:"button",onClick:()=>a("dark"===r?"light":"dark"),disabled:!i,title:l,"aria-label":l,"aria-live":"polite",children:[(0,c.jsx)(B,{className:(0,o.Z)($.toggleIcon,$.lightToggleIcon)}),(0,c.jsx)(U,{className:(0,o.Z)($.toggleIcon,$.darkToggleIcon)})]})})}const H=r.memo(q),Z={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function G(e){let{className:t}=e;const n=(0,w.L)().navbar.style,r=(0,w.L)().colorMode.disableSwitch,{colorMode:o,setColorMode:a}=(0,F.I)();return r?null:(0,c.jsx)(H,{className:t,buttonClassName:"dark"===n?Z.darkNavbarColorModeToggle:void 0,value:o,onChange:a})}var V=n(1327);function W(){return(0,c.jsx)(V.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function K(){const e=(0,j.e)();return(0,c.jsx)("button",{type:"button","aria-label":(0,s.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,c.jsx)(x,{color:"var(--ifm-color-emphasis-600)"})})}function Q(){return(0,c.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,c.jsx)(W,{}),(0,c.jsx)(G,{className:"margin-right--md"}),(0,c.jsx)(K,{})]})}var Y=n(9960),X=n(4996),J=n(3919),ee=n(8022),te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:a,html:i,isDropdownLink:l,prependBaseUrlToHref:s,...u}=e;const d=(0,X.Z)(r),p=(0,X.Z)(t),f=(0,X.Z)(o,{forcePrependBaseUrl:!0}),m=a&&o&&!(0,J.Z)(o),h=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,c.jsxs)(c.Fragment,{children:[a,m&&(0,c.jsx)(te.Z,{...l&&{width:12,height:12}})]})};return o?(0,c.jsx)(Y.Z,{href:s?f:o,...u,...h}):(0,c.jsx)(Y.Z,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?(0,ee.F)(n,t.pathname):t.pathname.startsWith(p)},...u,...h})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const a=(0,c.jsx)(ne,{className:(0,o.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,c.jsx)("li",{children:a}):a}function oe(e){let{className:t,isDropdownItem:n,...r}=e;return(0,c.jsx)("li",{className:"menu__list-item",children:(0,c.jsx)(ne,{className:(0,o.Z)("menu__link",t),...r})})}function ae(e){let{mobile:t=!1,position:n,...r}=e;const o=t?oe:re;return(0,c.jsx)(o,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(6043),le=n(8596),se=n(2263);function ue(e,t){return e.some((e=>function(e,t){return!!(0,le.Mg)(e.to,t)||!!(0,ee.F)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ce(e){let{items:t,position:n,className:a,onClick:i,...l}=e;const s=(0,r.useRef)(null),[u,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{s.current&&!s.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[s]),(0,c.jsxs)("div",{ref:s,className:(0,o.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":u}),children:[(0,c.jsx)(ne,{"aria-haspopup":"true","aria-expanded":u,role:"button",href:l.to?void 0:"#",className:(0,o.Z)("navbar__link",a),...l,onClick:l.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!u))},children:l.children??l.label}),(0,c.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(qe,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function de(e){let{items:t,className:n,position:a,onClick:i,...s}=e;const u=function(){const{siteConfig:{baseUrl:e}}=(0,se.Z)(),{pathname:t}=(0,l.TH)();return t.replace(e,"/")}(),d=ue(t,u),{collapsed:p,toggleCollapsed:f,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[u,d,m]),(0,c.jsxs)("li",{className:(0,o.Z)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,c.jsx)(ne,{role:"button",className:(0,o.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n),...s,onClick:e=>{e.preventDefault(),f()},children:s.children??s.label}),(0,c.jsx)(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(qe,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function pe(e){let{mobile:t=!1,...n}=e;const r=t?de:ce;return(0,c.jsx)(r,{...n})}var fe=n(4711);function me(e){let{width:t=20,height:n=20,...r}=e;return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,c.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const he="iconLanguage_nlXk";function ge(){return r.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},r.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}var ye=n(830),be=["translations"];function ve(){return ve=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var Se="Ctrl";var Ee=r.forwardRef((function(e,t){var n=e.translations,o=void 0===n?{}:n,a=xe(e,be),i=o.buttonText,l=void 0===i?"Search":i,s=o.buttonAriaLabel,u=void 0===s?"Search":s,c=we((0,r.useState)(null),2),d=c[0],p=c[1];return(0,r.useEffect)((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?p("\u2318"):p(Se))}),[]),r.createElement("button",ve({type:"button",className:"DocSearch DocSearch-Button","aria-label":u},a,{ref:t}),r.createElement("span",{className:"DocSearch-Button-Container"},r.createElement(ye.W,null),r.createElement("span",{className:"DocSearch-Button-Placeholder"},l)),r.createElement("span",{className:"DocSearch-Button-Keys"},null!==d&&r.createElement(r.Fragment,null,r.createElement("kbd",{className:"DocSearch-Button-Key"},d===Se?r.createElement(ge,null):d),r.createElement("kbd",{className:"DocSearch-Button-Key"},"K"))))})),_e=n(5742),Ce=n(6177),Te=n(239),Ae=n(3320);var je=n(3935);const Le={button:{buttonText:(0,s.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,s.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,s.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,s.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,s.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,s.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,s.I)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,s.I)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,s.I)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,s.I)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,s.I)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,s.I)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,s.I)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,s.I)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,s.I)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,s.I)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,s.I)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,s.I)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,s.I)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,s.I)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,s.I)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,s.I)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,s.I)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,s.I)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,s.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,s.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,s.I)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let Re=null;function Oe(e){let{hit:t,children:n}=e;return(0,c.jsx)(Y.Z,{to:t.url,children:n})}function Pe(e){let{state:t,onClose:n}=e;const r=(0,Ce.M)();return(0,c.jsx)(Y.Z,{to:r(t.query),onClick:n,children:(0,c.jsx)(s.Z,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits},children:"See all {count} results"})})}function Ne(e){let{contextualSearch:t,externalUrlRegex:o,...a}=e;const{siteMetadata:i}=(0,se.Z)(),s=(0,Te.l)(),u=function(){const{locale:e,tags:t}=(0,Ae._q)();return[`language:${e}`,t.map((e=>`docusaurus_tag:${e}`))]}(),d=a.searchParameters?.facetFilters??[],p=t?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(u,d):d,f={...a.searchParameters,facetFilters:p},m=(0,l.k6)(),h=(0,r.useRef)(null),g=(0,r.useRef)(null),[y,b]=(0,r.useState)(!1),[v,w]=(0,r.useState)(void 0),k=(0,r.useCallback)((()=>Re?Promise.resolve():Promise.all([n.e(426).then(n.bind(n,1426)),Promise.all([n.e(532),n.e(945)]).then(n.bind(n,6945)),Promise.all([n.e(532),n.e(894)]).then(n.bind(n,8894))]).then((e=>{let[{DocSearchModal:t}]=e;Re=t}))),[]),x=(0,r.useCallback)((()=>{k().then((()=>{h.current=document.createElement("div"),document.body.insertBefore(h.current,document.body.firstChild),b(!0)}))}),[k,b]),S=(0,r.useCallback)((()=>{b(!1),h.current?.remove()}),[b]),E=(0,r.useCallback)((e=>{k().then((()=>{b(!0),w(e.key)}))}),[k,b,w]),_=(0,r.useRef)({navigate(e){let{itemUrl:t}=e;(0,ee.F)(o,t)?window.location.href=t:m.push(t)}}).current,C=(0,r.useRef)((e=>a.transformItems?a.transformItems(e):e.map((e=>({...e,url:s(e.url)}))))).current,T=(0,r.useMemo)((()=>e=>(0,c.jsx)(Pe,{...e,onClose:S})),[S]),A=(0,r.useCallback)((e=>(e.addAlgoliaAgent("docusaurus",i.docusaurusVersion),e)),[i.docusaurusVersion]);return function(e){var t=e.isOpen,n=e.onOpen,o=e.onClose,a=e.onInput,i=e.searchButtonRef;r.useEffect((function(){function e(e){var r;(27===e.keyCode&&t||"k"===(null===(r=e.key)||void 0===r?void 0:r.toLowerCase())&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)&&(e.preventDefault(),t?o():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&a&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&a(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,o,a,i])}({isOpen:y,onOpen:x,onClose:S,onInput:E,searchButtonRef:g}),(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(_e.Z,{children:(0,c.jsx)("link",{rel:"preconnect",href:`https://${a.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})}),(0,c.jsx)(Ee,{onTouchStart:k,onFocus:k,onMouseOver:k,onClick:x,ref:g,translations:Le.button}),y&&Re&&h.current&&(0,je.createPortal)((0,c.jsx)(Re,{onClose:S,initialScrollY:window.scrollY,initialQuery:v,navigator:_,transformItems:C,hitComponent:Oe,transformSearchClient:A,...a.searchPagePath&&{resultsFooterComponent:T},...a,searchParameters:f,placeholder:Le.placeholder,translations:Le.modal}),h.current)]})}function De(){const{siteConfig:e}=(0,se.Z)();return(0,c.jsx)(Ne,{...e.themeConfig.algolia})}const Ie={navbarSearchContainer:"navbarSearchContainer_Bca1"};function Me(e){let{children:t,className:n}=e;return(0,c.jsx)("div",{className:(0,o.Z)(n,Ie.navbarSearchContainer),children:t})}var Fe=n(143),ze=n(2802);var Be=n(373);const Ue=e=>e.docs.find((t=>t.id===e.mainDocId));const $e={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:o="",...a}=e;const{i18n:{currentLocale:i,locales:u,localeConfigs:d}}=(0,se.Z)(),p=(0,fe.l)(),{search:f,hash:m}=(0,l.TH)(),h=[...n,...u.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${m}${o}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],g=t?(0,s.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,c.jsx)(pe,{...a,mobile:t,label:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(me,{className:he}),g]}),items:h})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,c.jsx)(Me,{className:n,children:(0,c.jsx)(De,{})})},dropdown:pe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:a=!1}=e;const i=a?"li":"div";return(0,c.jsx)(i,{className:(0,o.Z)({navbar__item:!r&&!a,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,Fe.Iw)(r),i=(0,ze.vY)(t,r),l=a?.path===i?.path;return null===i||i.unlisted&&!l?null:(0,c.jsx)(ae,{exact:!0,...o,isActive:()=>l||!!a?.sidebar&&a.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,Fe.Iw)(r),i=(0,ze.oz)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,c.jsx)(ae,{exact:!0,...o,isActive:()=>a?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...o}=e;const a=(0,ze.lO)(r)[0],i=t??a.label,l=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(a).path;return(0,c.jsx)(ae,{...o,label:i,to:l})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:a,...i}=e;const{search:u,hash:d}=(0,l.TH)(),p=(0,Fe.Iw)(n),f=(0,Fe.gB)(n),{savePreferredVersionName:m}=(0,Be.J)(n),h=[...o,...f.map((e=>{const t=p.alternateDocVersions[e.name]??Ue(e);return{label:e.label,to:`${t.path}${u}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>m(e.name)}})),...a],g=(0,ze.lO)(n)[0],y=t&&h.length>1?(0,s.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):g.label,b=t&&h.length>1?void 0:Ue(g).path;return h.length<=1?(0,c.jsx)(ae,{...i,mobile:t,label:y,to:b,isActive:r?()=>!1:void 0}):(0,c.jsx)(pe,{...i,mobile:t,label:y,to:b,items:h,isActive:r?()=>!1:void 0})}};function qe(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=$e[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,c.jsx)(o,{...n})}function He(){const e=(0,j.e)(),t=(0,w.L)().navbar.items;return(0,c.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(qe,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ze(e){return(0,c.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,c.jsx)(s.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function Ge(){const e=0===(0,w.L)().navbar.items.length,t=I();return(0,c.jsxs)(c.Fragment,{children:[!e&&(0,c.jsx)(Ze,{onClick:()=>t.hide()}),t.content]})}function Ve(){const e=(0,j.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,c.jsx)(M,{header:(0,c.jsx)(Q,{}),primaryMenu:(0,c.jsx)(He,{}),secondaryMenu:(0,c.jsx)(Ge,{})}):null}const We={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ke(e){return(0,c.jsx)("div",{role:"presentation",...e,className:(0,o.Z)("navbar-sidebar__backdrop",e.className)})}function Qe(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,w.L)(),i=(0,j.e)(),{navbarRef:l,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return(0,L.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+u{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return o.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,c.jsxs)("nav",{ref:l,"aria-label":(0,s.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.Z)("navbar","navbar--fixed-top",n&&[We.navbarHideable,!d&&We.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown}),children:[t,(0,c.jsx)(Ke,{onClick:i.toggle}),(0,c.jsx)(Ve,{})]})}var Ye=n(8780);const Xe={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function Je(e){return(0,c.jsx)("button",{type:"button",...e,children:(0,c.jsx)(s.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function et(e){let{error:t}=e;const n=(0,Ye.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{className:Xe.errorBoundaryError,children:n})}class tt extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const nt="right";function rt(e){let{width:t=30,height:n=30,className:r,...o}=e;return(0,c.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...o,children:(0,c.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function ot(){const{toggle:e,shown:t}=(0,j.e)();return(0,c.jsx)("button",{onClick:e,"aria-label":(0,s.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,c.jsx)(rt,{})})}const at={colorModeToggle:"colorModeToggle_DEke"};function it(e){let{items:t}=e;return(0,c.jsx)(c.Fragment,{children:t.map(((e,t)=>(0,c.jsx)(tt,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,c.jsx)(qe,{...e})},t)))})}function lt(e){let{left:t,right:n}=e;return(0,c.jsxs)("div",{className:"navbar__inner",children:[(0,c.jsx)("div",{className:"navbar__items",children:t}),(0,c.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function st(){const e=(0,j.e)(),t=(0,w.L)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??nt)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return(0,c.jsx)(lt,{left:(0,c.jsxs)(c.Fragment,{children:[!e.disabled&&(0,c.jsx)(ot,{}),(0,c.jsx)(W,{}),(0,c.jsx)(it,{items:n})]}),right:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(it,{items:r}),(0,c.jsx)(G,{className:at.colorModeToggle}),!o&&(0,c.jsx)(Me,{children:(0,c.jsx)(De,{})})]})})}function ut(){return(0,c.jsx)(Qe,{children:(0,c.jsx)(st,{})})}function ct(e){let{item:t}=e;const{to:n,href:r,label:o,prependBaseUrlToHref:a,...i}=t,l=(0,X.Z)(n),s=(0,X.Z)(r,{forcePrependBaseUrl:!0});return(0,c.jsxs)(Y.Z,{className:"footer__link-item",...r?{href:a?s:r}:{to:l},...i,children:[o,r&&!(0,J.Z)(r)&&(0,c.jsx)(te.Z,{})]})}function dt(e){let{item:t}=e;return t.html?(0,c.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,c.jsx)("li",{className:"footer__item",children:(0,c.jsx)(ct,{item:t})},t.href??t.to)}function pt(e){let{column:t}=e;return(0,c.jsxs)("div",{className:"col footer__col",children:[(0,c.jsx)("div",{className:"footer__title",children:t.title}),(0,c.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,c.jsx)(dt,{item:e},t)))})]})}function ft(e){let{columns:t}=e;return(0,c.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,c.jsx)(pt,{column:e},t)))})}function mt(){return(0,c.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function ht(e){let{item:t}=e;return t.html?(0,c.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,c.jsx)(ct,{item:t})}function gt(e){let{links:t}=e;return(0,c.jsx)("div",{className:"footer__links text--center",children:(0,c.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,c.jsxs)(r.Fragment,{children:[(0,c.jsx)(ht,{item:e}),t.length!==n+1&&(0,c.jsx)(mt,{})]},n)))})})}function yt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,c.jsx)(ft,{columns:t}):(0,c.jsx)(gt,{links:t})}var bt=n(9965);const vt={footerLogoLink:"footerLogoLink_BH7S"};function wt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.C)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,c.jsx)(bt.Z,{className:(0,o.Z)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function kt(e){let{logo:t}=e;return t.href?(0,c.jsx)(Y.Z,{href:t.href,className:vt.footerLogoLink,target:t.target,children:(0,c.jsx)(wt,{logo:t})}):(0,c.jsx)(wt,{logo:t})}function xt(e){let{copyright:t}=e;return(0,c.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function St(e){let{style:t,links:n,logo:r,copyright:a}=e;return(0,c.jsx)("footer",{className:(0,o.Z)("footer",{"footer--dark":"dark"===t}),children:(0,c.jsxs)("div",{className:"container container-fluid",children:[n,(r||a)&&(0,c.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,c.jsx)("div",{className:"margin-bottom--sm",children:r}),a]})]})})}function Et(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return(0,c.jsx)(St,{style:o,links:n&&n.length>0&&(0,c.jsx)(yt,{links:n}),logo:r&&(0,c.jsx)(kt,{logo:r}),copyright:t&&(0,c.jsx)(xt,{copyright:t})})}const _t=r.memo(Et),Ct=(0,R.Qc)([F.S,k.pl,L.OC,Be.L5,i.VC,function(e){let{children:t}=e;return(0,c.jsx)(O.n2,{children:(0,c.jsx)(j.M,{children:(0,c.jsx)(N,{children:t})})})}]);function Tt(e){let{children:t}=e;return(0,c.jsx)(Ct,{children:t})}var At=n(2503);function jt(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)("main",{className:"container margin-vert--xl",children:(0,c.jsx)("div",{className:"row",children:(0,c.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,c.jsx)(At.Z,{as:"h1",className:"hero__title",children:(0,c.jsx)(s.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,c.jsx)("div",{className:"margin-vert--lg",children:(0,c.jsx)(Je,{onClick:n,className:"button button--primary shadow--lw"})}),(0,c.jsx)("hr",{}),(0,c.jsx)("div",{className:"margin-vert--md",children:(0,c.jsx)(et,{error:t})})]})})})}const Lt={mainWrapper:"mainWrapper_z2l0"};function Rt(e){const{children:t,noFooter:n,wrapperClassName:r,title:l,description:s}=e;return(0,y.t)(),(0,c.jsxs)(Tt,{children:[(0,c.jsx)(i.d,{title:l,description:s}),(0,c.jsx)(v,{}),(0,c.jsx)(A,{}),(0,c.jsx)(ut,{}),(0,c.jsx)("div",{id:d,className:(0,o.Z)(g.k.wrapper.main,Lt.mainWrapper,r),children:(0,c.jsx)(a.Z,{fallback:e=>(0,c.jsx)(jt,{...e}),children:t})}),!n&&(0,c.jsx)(_t,{})]})}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});n(7294);var r=n(9960),o=n(4996),a=n(2263),i=n(6668),l=n(9965),s=n(5893);function u(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,o.Z)(t.src),dark:(0,o.Z)(t.srcDark||t.src)},i=(0,s.jsx)(l.Z,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,s.jsx)("div",{className:r,children:i}):i}function c(e){const{siteConfig:{title:t}}=(0,a.Z)(),{navbar:{title:n,logo:l}}=(0,i.L)(),{imageClassName:c,titleClassName:d,...p}=e,f=(0,o.Z)(l?.href||"/"),m=n?"":t,h=l?.alt??m;return(0,s.jsxs)(r.Z,{to:f,...p,...l?.target&&{target:l.target},children:[l&&(0,s.jsx)(u,{logo:l,alt:h,imageClassName:c}),null!=n&&(0,s.jsx)("b",{className:d,children:n})]})}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});n(7294);var r=n(5742),o=n(5893);function a(e){let{locale:t,version:n,tag:a}=e;const i=t;return(0,o.jsxs)(r.Z,{children:[t&&(0,o.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,o.jsx)("meta",{name:"docusaurus_version",content:n}),a&&(0,o.jsx)("meta",{name:"docusaurus_tag",content:a}),i&&(0,o.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,o.jsx)("meta",{name:"docsearch:version",content:n}),a&&(0,o.jsx)("meta",{name:"docsearch:docusaurus_tag",content:a})]})}},9965:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(7294),o=n(6010),a=n(2389),i=n(2949);const l={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var s=n(5893);function u(e){let{className:t,children:n}=e;const u=(0,a.Z)(),{colorMode:c}=(0,i.I)();return(0,s.jsx)(s.Fragment,{children:(u?"dark"===c?["dark"]:["light"]:["light","dark"]).map((e=>{const a=n({theme:e,className:(0,o.Z)(t,l.themedComponent,l[`themedComponent--${e}`])});return(0,s.jsx)(r.Fragment,{children:a},e)}))})}function c(e){const{sources:t,className:n,alt:r,...o}=e;return(0,s.jsx)(u,{className:n,children:e=>{let{theme:n,className:a}=e;return(0,s.jsx)("img",{src:t[n],alt:r,className:a,...o})}})}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>u,z:()=>y});var r=n(7294),o=n(412),a=n(469),i=n(1442),l=n(5893);const s="ease-in-out";function u(e){let{initialState:t}=e;const[n,o]=(0,r.useState)(t??!1),a=(0,r.useCallback)((()=>{o((e=>!e))}),[]);return{collapsed:n,setCollapsed:o,toggleCollapsed:a}}const c={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function p(e,t){const n=t?c:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:o}=e;const a=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=o?.duration??function(e){if((0,i.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${o?.easing??s}`,height:`${t}px`}}function l(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return p(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(l(),requestAnimationFrame((()=>{e.style.height=c.height,e.style.overflow=c.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{l()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,o])}function m(e){if(!o.Z.canUseDOM)return e?c:d}function h(e){let{as:t="div",collapsed:n,children:o,animation:a,onCollapseTransitionEnd:i,className:s,disableSSRStyle:u}=e;const c=(0,r.useRef)(null);return f({collapsibleRef:c,collapsed:n,animation:a}),(0,l.jsx)(t,{ref:c,style:u?void 0:m(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(c.current,n),i?.(n))},className:s,children:o})}function g(e){let{collapsed:t,...n}=e;const[o,i]=(0,r.useState)(!t),[s,u]=(0,r.useState)(t);return(0,a.Z)((()=>{t||i(!0)}),[t]),(0,a.Z)((()=>{o&&u(t)}),[o,t]),o?(0,l.jsx)(h,{...n,collapsed:s}):null}function y(e){let{lazy:t,...n}=e;const r=t?g:h;return(0,l.jsx)(r,{...n})}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>h,pl:()=>m});var r=n(7294),o=n(2389),a=n(12),i=n(902),l=n(6668),s=n(5893);const u=(0,a.WA)("docusaurus.announcement.dismiss"),c=(0,a.WA)("docusaurus.announcement.id"),d=()=>"true"===u.get(),p=e=>u.set(String(e)),f=r.createContext(null);function m(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.L)(),t=(0,o.Z)(),[n,a]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{a(d())}),[]);const i=(0,r.useCallback)((()=>{p(!0),a(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=c.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;c.set(t),r&&p(!1),!r&&d()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,s.jsx)(f.Provider,{value:n,children:t})}function h(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>y,S:()=>g});var r=n(7294),o=n(412),a=n(902),i=n(12),l=n(6668),s=n(5893);const u=r.createContext(void 0),c="theme",d=(0,i.WA)(c),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,m=e=>o.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),h=e=>{d.set(f(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.L)(),[o,a]=(0,r.useState)(m(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:o=!0}=r;t?(a(t),o&&h(t)):(a(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==c)return;const t=d.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const s=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||s.current?s.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:i,get isDarkTheme(){return o===p.dark},setLightTheme(){i(p.light)},setDarkTheme(){i(p.dark)}})),[o,i])}();return(0,s.jsx)(u.Provider,{value:n,children:t})}function y(){const e=(0,r.useContext)(u);if(null==e)throw new a.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>v,L5:()=>y,Oh:()=>w});var r=n(7294),o=n(143),a=n(9935),i=n(6668),l=n(2802),s=n(902),u=n(12),c=n(5893);const d=e=>`docs-preferred-version-${e}`,p={save:(e,t,n)=>{(0,u.WA)(d(e),{persistence:t}).set(n)},read:(e,t)=>(0,u.WA)(d(e),{persistence:t}).get(),clear:(e,t)=>{(0,u.WA)(d(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const m=r.createContext(null);function h(){const e=(0,o._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,l]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(e){const t=p.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,o(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[a,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){p.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=h();return(0,c.jsx)(m.Provider,{value:n,children:t})}function y(e){let{children:t}=e;return l.cE?(0,c.jsx)(g,{children:t}):(0,c.jsx)(c.Fragment,{children:t})}function b(){const e=(0,r.useContext)(m);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=a.m);const t=(0,o.zh)(e),[n,i]=b(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function w(){const e=(0,o._r)(),[t]=b();function n(n){const r=e[n],{preferredVersionName:o}=t[n];return r.versions.find((e=>e.name===o))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>u,b:()=>s});var r=n(7294),o=n(902),a=n(5893);const i=Symbol("EmptyContext"),l=r.createContext(i);function s(e){let{children:t,name:n,items:o}=e;const i=(0,r.useMemo)((()=>n&&o?{name:n,items:o}:null),[n,o]);return(0,a.jsx)(l.Provider,{value:i,children:t})}function u(){const e=(0,r.useContext)(l);if(e===i)throw new o.i6("DocsSidebarProvider");return e}},4477:(e,t,n)=>{"use strict";n.d(t,{E:()=>s,q:()=>l});var r=n(7294),o=n(902),a=n(5893);const i=r.createContext(null);function l(e){let{children:t,version:n}=e;return(0,a.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(null===e)throw new o.i6("DocsVersionProvider");return e}},3163:(e,t,n)=>{"use strict";n.d(t,{M:()=>p,e:()=>f});var r=n(7294),o=n(3102),a=n(7524),i=n(1980),l=n(6668),s=n(902),u=n(5893);const c=r.createContext(void 0);function d(){const e=function(){const e=(0,o.HY)(),{items:t}=(0,l.L)().navbar;return 0===t.length&&!e.component}(),t=(0,a.i)(),n=!e&&"mobile"===t,[s,u]=(0,r.useState)(!1);(0,i.Rb)((()=>{if(s)return u(!1),!1}));const c=(0,r.useCallback)((()=>{u((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&u(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:s})),[e,n,c,s])}function p(e){let{children:t}=e;const n=d();return(0,u.jsx)(c.Provider,{value:n,children:t})}function f(){const e=r.useContext(c);if(void 0===e)throw new s.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>s,Zo:()=>u,n2:()=>l});var r=n(7294),o=n(902),a=n(5893);const i=r.createContext(null);function l(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,a.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(!e)throw new o.i6("NavbarSecondaryMenuContentProvider");return e[0]}function u(e){let{component:t,props:n}=e;const a=(0,r.useContext)(i);if(!a)throw new o.i6("NavbarSecondaryMenuContentProvider");const[,l]=a,s=(0,o.Ql)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>o,t:()=>a});var r=n(7294);const o="navigation-with-keyboard";function a(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},6177:(e,t,n)=>{"use strict";n.d(t,{K:()=>l,M:()=>s});var r=n(7294),o=n(2263),a=n(1980);const i="q";function l(){return(0,a.Nc)(i)}function s(){const{siteConfig:{baseUrl:e,themeConfig:t}}=(0,o.Z)(),{algolia:{searchPagePath:n}}=t;return(0,r.useCallback)((t=>`${e}${n}?${i}=${encodeURIComponent(t)}`),[e,n])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>l});var r=n(7294),o=n(412);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function l(){const[e,t]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){t(function(){if(!o.Z.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>i?a.desktop:a.mobile}())}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[]),e}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},1442:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},2802:(e,t,n)=>{"use strict";n.d(t,{LM:()=>f,_F:()=>g,cE:()=>p,SN:()=>E,lO:()=>k,vY:()=>S,oz:()=>x,s1:()=>w,f:()=>b});var r=n(7294),o=n(6550),a=n(8790),i=n(143),l=n(373),s=n(4477),u=n(1116);function c(e){return Array.from(new Set(e))}var d=n(8596);const p=!!i._r;function f(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=f(t);if(e)return e}}(e):void 0:e.href}const m=(e,t)=>void 0!==e&&(0,d.Mg)(e,t),h=(e,t)=>e.some((e=>g(e,t)));function g(e,t){return"link"===e.type?m(e.href,t):"category"===e.type&&(m(e.href,t)||h(e.items,t))}function y(e,t){switch(e.type){case"category":return g(e,t)||e.items.some((e=>y(e,t)));case"link":return!e.unlisted||g(e,t);default:return!1}}function b(e,t){return(0,r.useMemo)((()=>e.filter((e=>y(e,t)))),[e,t])}function v(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const o=[];return function e(t){for(const a of t)if("category"===a.type&&((0,d.Mg)(a.href,n)||e(a.items))||"link"===a.type&&(0,d.Mg)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function w(){const e=(0,u.V)(),{pathname:t}=(0,o.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?v({sidebarItems:e.items,pathname:t}):null}function k(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,l.J)(e),o=(0,i.yW)(e);return(0,r.useMemo)((()=>c([t,n,o].filter(Boolean))),[t,n,o])}function x(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function S(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${c(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function E(e){let{route:t}=e;const n=(0,o.TH)(),r=(0,s.E)(),i=t.routes,l=i.find((e=>(0,o.LX)(n.pathname,e)));if(!l)return null;const u=l.sidebar,c=u?r.docsSidebars[u]:void 0;return{docElement:(0,a.H)(i),sidebarName:u,sidebarItems:c}}},2128:(e,t,n)=>{"use strict";n.d(t,{p:()=>o});var r=n(2263);function o(e){const{siteConfig:t}=(0,r.Z)(),{title:n,titleDelimiter:o}=t;return e?.trim().length?`${e.trim()} ${o} ${n}`:n}},1980:(e,t,n)=>{"use strict";n.d(t,{Nc:()=>s,Rb:()=>i});var r=n(7294),o=n(6550),a=n(902);function i(e){!function(e){const t=(0,o.k6)(),n=(0,a.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function l(e){return function(e){const t=(0,o.k6)();return(0,r.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}function s(e){const t=l(e)??"",n=function(){const e=(0,o.k6)();return(0,r.useCallback)(((t,n,r)=>{const o=new URLSearchParams(e.location.search);n?o.set(t,n):o.delete(t),(r?.push?e.push:e.replace)({search:o.toString()})}),[e])}();return[t,(0,r.useCallback)(((t,r)=>{n(e,t,r)}),[n,e])]}},833:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>d,VC:()=>m});var r=n(7294),o=n(6010),a=n(5742),i=n(226);function l(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(4996),u=n(2128),c=n(5893);function d(e){let{title:t,description:n,keywords:r,image:o,children:i}=e;const l=(0,u.p)(t),{withBaseUrl:d}=(0,s.C)(),p=o?d(o,{absolute:!0}):void 0;return(0,c.jsxs)(a.Z,{children:[t&&(0,c.jsx)("title",{children:l}),t&&(0,c.jsx)("meta",{property:"og:title",content:l}),n&&(0,c.jsx)("meta",{name:"description",content:n}),n&&(0,c.jsx)("meta",{property:"og:description",content:n}),r&&(0,c.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,c.jsx)("meta",{property:"og:image",content:p}),p&&(0,c.jsx)("meta",{name:"twitter:image",content:p}),i]})}const p=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(p),l=(0,o.Z)(i,t);return(0,c.jsxs)(p.Provider,{value:l,children:[(0,c.jsx)(a.Z,{children:(0,c.jsx)("html",{className:l})}),n]})}function m(e){let{children:t}=e;const n=l(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const a=`plugin-id-${n.plugin.id}`;return(0,c.jsx)(f,{className:(0,o.Z)(r,a),children:t})}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>l,Qc:()=>c,Ql:()=>u,i6:()=>s,zX:()=>i});var r=n(7294),o=n(469),a=n(5893);function i(e){const t=(0,r.useRef)(e);return(0,o.Z)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function l(e){const t=(0,r.useRef)();return(0,o.Z)((()=>{t.current=e})),t.current}class s extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function u(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function c(e){return t=>{let{children:n}=t;return(0,a.jsx)(a.Fragment,{children:e.reduceRight(((e,t)=>(0,a.jsx)(t,{children:e})),n)})}}},8022:(e,t,n)=>{"use strict";function r(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}n.d(t,{F:()=>r})},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>l});var r=n(7294),o=n(723),a=n(2263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,a.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function o(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(o).flatMap((e=>e.routes??[])))}(n)}({routes:o.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>f,OC:()=>u,RF:()=>p});var r=n(7294),o=n(412),a=n(2389),i=(n(469),n(902)),l=n(5893);const s=r.createContext(void 0);function u(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,l.jsx)(s.Provider,{value:n,children:t})}function c(){const e=(0,r.useContext)(s);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const d=()=>o.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function p(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=c(),o=(0,r.useRef)(d()),a=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=d();a(e,o.current),o.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[a,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,a.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const o=document.documentElement.scrollTop;(n&&o>e||!n&&ot&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>i,_q:()=>s,os:()=>l});var r=n(143),o=n(2263),a=n(373);const i="default";function l(e,t){return`docs-${e}-${t}`}function s(){const{i18n:e}=(0,o.Z)(),t=(0,r._r)(),n=(0,r.WS)(),s=(0,a.Oh)();const u=[i,...Object.keys(t).map((function(e){const r=n?.activePlugin.pluginId===e?n.activeVersion:void 0,o=s[e],a=t[e].versions.find((e=>e.isLast));return l(e,(r??o??a).name)}))];return{locale:e.currentLocale,tags:u}}},12:(e,t,n)=>{"use strict";n.d(t,{WA:()=>s});n(7294);const r="localStorage";function o(e){let{key:t,oldValue:n,newValue:r,storage:o}=e;if(n===r)return;const a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,o),window.dispatchEvent(a)}function a(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,i||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),i=!0),null}var t}let i=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function s(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=a(t?.persistence);return null===n?l:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),o({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),o({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>i});var r=n(2263),o=n(6550),a=n(8780);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:l}}=(0,r.Z)(),{pathname:s}=(0,o.TH)(),u=(0,a.applyTrailingSlash)(s,{trailingSlash:n,baseUrl:e}),c=l===i?e:e.replace(`/${l}/`,"/"),d=u.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${c}`:`${c}${e}/`}(n)}${d}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),o=n(6550),a=n(902);function i(e){const t=(0,o.TH)(),n=(0,a.D9)(t),i=(0,a.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>o});var r=n(2263);function o(){return(0,r.Z)().siteConfig.themeConfig}},6278:(e,t,n)=>{"use strict";n.d(t,{L:()=>o});var r=n(2263);function o(){const{siteConfig:{themeConfig:e}}=(0,r.Z)();return e}},239:(e,t,n)=>{"use strict";n.d(t,{l:()=>l});var r=n(7294),o=n(8022),a=n(4996),i=n(6278);function l(){const{withBaseUrl:e}=(0,a.C)(),{algolia:{externalUrlRegex:t,replaceSearchResultPathname:n}}=(0,i.L)();return(0,r.useCallback)((r=>{const a=new URL(r);if((0,o.F)(t,a.href))return r;const i=`${a.pathname+a.hash}`;return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(i,n))}),[e,t,n])}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[o]=e.split(/[#?]/),a="/"===o||o===r?o:(i=o,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(o,a)}},4143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},8780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var o=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(o).default}});var a=n(4143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return a.getErrorCausalChain}})},8203:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(7582),o=r.__importDefault(n(6809)),a=r.__importDefault(n(2557)),{themeConfig:i}=o.default;function l(e){var t,n;return document.querySelector('html[data-theme="dark"]')?(null===(t=e.background)||void 0===t?void 0:t.dark)||"rgb(50, 50, 50)":(null===(n=e.background)||void 0===n?void 0:n.light)||"rgb(255, 255, 255)"}t.default=function(){if("undefined"==typeof window)return null;let e;const{zoom:t}=i,{selector:n=".markdown img",config:r={}}=t||{};if(!t)return null;r.background=l(t);var o=new MutationObserver((function(){e&&e.update({background:l(t)})}));const s=document.querySelector("html");return o.observe(s,{attributes:!0,attributeFilter:["data-theme"]}),setTimeout((()=>{e&&e.detach(),e=(0,a.default)(n,r)}),1e3),{onRouteUpdate(){setTimeout((()=>{e&&e.detach(),e=(0,a.default)(n,r)}),1e3)}}}()},6010:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;to});const o=function(){for(var e,t,n=0,o="";n{"use strict";n.d(t,{lX:()=>w,q_:()=>C,ob:()=>f,PP:()=>A,Ep:()=>p});var r=n(7462);function o(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,o=e.length;r=0;p--){var f=i[p];"."===f?a(i,p):".."===f?(a(i,p),d++):d&&(a(i,p),d--)}if(!u)for(;d--;d)i.unshift("..");!u||""===i[0]||i[0]&&o(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var l=n(8776);function s(e){return"/"===e.charAt(0)?e:"/"+e}function u(e){return"/"===e.charAt(0)?e.substr(1):e}function c(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function f(e,t,n,o){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),a.state=t):(void 0===(a=(0,r.Z)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=i(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,o):n.push(o),d({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=f(e,t,h(),w.location);c.confirmTransitionTo(o,r,n,(function(e){e&&(w.entries[w.index]=o,d({action:r,location:o}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(9864),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||o}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var o=f(n);o&&o!==m&&e(t,o,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var l=s(t),h=s(n),g=0;g{"use strict";e.exports=function(e,t,n,r,o,a,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,o,a,i,l],c=0;(s=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},2557:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>u});var r=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{},o=window.Promise||function(e){function t(){}e(t,t)},u=function(){for(var e=arguments.length,t=Array(e),n=0;n0&&void 0!==arguments[0]?arguments[0]:{}).target,t=function(){var e={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},t=void 0,n=void 0;if(y.container)if(y.container instanceof Object)t=(e=r({},e,y.container)).width-e.left-e.right-2*y.margin,n=e.height-e.top-e.bottom-2*y.margin;else{var o=(a(y.container)?y.container:document.querySelector(y.container)).getBoundingClientRect(),l=o.width,s=o.height,u=o.left,c=o.top;e=r({},e,{width:l,height:s,left:u,top:c})}t=t||e.width-2*y.margin,n=n||e.height-2*y.margin;var d=b.zoomedHd||b.original,p=i(d)?t:d.naturalWidth||t,f=i(d)?n:d.naturalHeight||n,m=d.getBoundingClientRect(),h=m.top,g=m.left,v=m.width,w=m.height,k=Math.min(Math.max(v,p),t)/v,x=Math.min(Math.max(w,f),n)/w,S=Math.min(k,x),E="scale("+S+") translate3d("+((t-v)/2-g+y.margin+e.left)/S+"px, "+((n-w)/2-h+y.margin+e.top)/S+"px, 0)";b.zoomed.style.transform=E,b.zoomedHd&&(b.zoomedHd.style.transform=E)};return new o((function(n){if(e&&-1===f.indexOf(e))n(w);else{if(b.zoomed)n(w);else{if(e)b.original=e;else{if(!(f.length>0))return void n(w);var r=f;b.original=r[0]}if(b.original.dispatchEvent(s("medium-zoom:open",{detail:{zoom:w}})),g=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,h=!0,b.zoomed=function(e){var t=e.getBoundingClientRect(),n=t.top,r=t.left,o=t.width,a=t.height,i=e.cloneNode(),l=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,s=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0;return i.removeAttribute("id"),i.style.position="absolute",i.style.top=n+l+"px",i.style.left=r+s+"px",i.style.width=o+"px",i.style.height=a+"px",i.style.transform="",i}(b.original),document.body.appendChild(v),y.template){var o=a(y.template)?y.template:document.querySelector(y.template);b.template=document.createElement("div"),b.template.appendChild(o.content.cloneNode(!0)),document.body.appendChild(b.template)}if(b.original.parentElement&&"PICTURE"===b.original.parentElement.tagName&&b.original.currentSrc&&(b.zoomed.src=b.original.currentSrc),document.body.appendChild(b.zoomed),window.requestAnimationFrame((function(){document.body.classList.add("medium-zoom--opened")})),b.original.classList.add("medium-zoom-image--hidden"),b.zoomed.classList.add("medium-zoom-image--opened"),b.zoomed.addEventListener("click",d),b.zoomed.addEventListener("transitionend",(function e(){h=!1,b.zoomed.removeEventListener("transitionend",e),b.original.dispatchEvent(s("medium-zoom:opened",{detail:{zoom:w}})),n(w)})),b.original.getAttribute("data-zoom-src")){b.zoomedHd=b.zoomed.cloneNode(),b.zoomedHd.removeAttribute("srcset"),b.zoomedHd.removeAttribute("sizes"),b.zoomedHd.removeAttribute("loading"),b.zoomedHd.src=b.zoomed.getAttribute("data-zoom-src"),b.zoomedHd.onerror=function(){clearInterval(i),console.warn("Unable to reach the zoom image target "+b.zoomedHd.src),b.zoomedHd=null,t()};var i=setInterval((function(){b.zoomedHd.complete&&(clearInterval(i),b.zoomedHd.classList.add("medium-zoom-image--opened"),b.zoomedHd.addEventListener("click",d),document.body.appendChild(b.zoomedHd),t())}),10)}else if(b.original.hasAttribute("srcset")){b.zoomedHd=b.zoomed.cloneNode(),b.zoomedHd.removeAttribute("sizes"),b.zoomedHd.removeAttribute("loading");var l=b.zoomedHd.addEventListener("load",(function(){b.zoomedHd.removeEventListener("load",l),b.zoomedHd.classList.add("medium-zoom-image--opened"),b.zoomedHd.addEventListener("click",d),document.body.appendChild(b.zoomedHd),t()}))}else t()}}}))},d=function(){return new o((function(e){if(!h&&b.original){h=!0,document.body.classList.remove("medium-zoom--opened"),b.zoomed.style.transform="",b.zoomedHd&&(b.zoomedHd.style.transform=""),b.template&&(b.template.style.transition="opacity 150ms",b.template.style.opacity=0),b.original.dispatchEvent(s("medium-zoom:close",{detail:{zoom:w}})),b.zoomed.addEventListener("transitionend",(function t(){b.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(b.zoomed),b.zoomedHd&&document.body.removeChild(b.zoomedHd),document.body.removeChild(v),b.zoomed.classList.remove("medium-zoom-image--opened"),b.template&&document.body.removeChild(b.template),h=!1,b.zoomed.removeEventListener("transitionend",t),b.original.dispatchEvent(s("medium-zoom:closed",{detail:{zoom:w}})),b.original=null,b.zoomed=null,b.zoomedHd=null,b.template=null,e(w)}))}else e(w)}))},p=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).target;return b.original?d():c({target:e})},f=[],m=[],h=!1,g=0,y=n,b={original:null,zoomed:null,zoomedHd:null,template:null};"[object Object]"===Object.prototype.toString.call(t)?y=t:(t||"string"==typeof t)&&u(t);var v=function(e){var t=document.createElement("div");return t.classList.add("medium-zoom-overlay"),t.style.background=e,t}((y=r({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},y)).background);document.addEventListener("click",(function(e){var t=e.target;t!==v?-1!==f.indexOf(t)&&p({target:t}):d()})),document.addEventListener("keyup",(function(e){var t=e.key||e.keyCode;"Escape"!==t&&"Esc"!==t&&27!==t||d()})),document.addEventListener("scroll",(function(){if(!h&&b.original){var e=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(g-e)>y.scrollOffset&&setTimeout(d,150)}})),window.addEventListener("resize",d);var w={open:c,close:d,toggle:p,update:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e;if(e.background&&(v.style.background=e.background),e.container&&e.container instanceof Object&&(t.container=r({},y.container,e.container)),e.template){var n=a(e.template)?e.template:document.querySelector(e.template);t.template=n}return y=r({},y,t),f.forEach((function(e){e.dispatchEvent(s("medium-zoom:update",{detail:{zoom:w}}))})),w},clone:function(){return e(r({},y,arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}))},attach:u,detach:function(){for(var e=arguments.length,t=Array(e),n=0;n0?t.reduce((function(e,t){return[].concat(e,l(t))}),[]):f;return r.forEach((function(e){e.classList.remove("medium-zoom-image"),e.dispatchEvent(s("medium-zoom:detach",{detail:{zoom:w}}))})),f=f.filter((function(e){return-1===r.indexOf(e)})),w},on:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return f.forEach((function(r){r.addEventListener("medium-zoom:"+e,t,n)})),m.push({type:"medium-zoom:"+e,listener:t,options:n}),w},off:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return f.forEach((function(r){r.removeEventListener("medium-zoom:"+e,t,n)})),m=m.filter((function(n){return!(n.type==="medium-zoom:"+e&&n.listener.toString()===t.toString())})),w},getOptions:function(){return y},getImages:function(){return f},getZoomedImage:function(){return b.original}};return w}},2497:(e,t,n)=>{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,o;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function o(e,t,n){return en?n:e}function a(e){return 100*(-1+e)}function i(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),u=a.querySelector(r.barSelector),c=r.speed,d=r.easing;return a.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,i(e,c,d)),1===e?(s(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){s(a,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,i=t.querySelector(r.barSelector),l=e?"-100":a(n.status||0),u=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&f(o),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[2])}}();function u(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=p(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);u(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},4779:(e,t,n)=>{var r=n(5826);e.exports=f,e.exports.parse=a,e.exports.compile=function(e,t){return l(a(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=p;var o=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function a(e,t){for(var n,r=[],a=0,i=0,l="",c=t&&t.delimiter||"/";null!=(n=o.exec(e));){var d=n[0],p=n[1],f=n.index;if(l+=e.slice(i,f),i=f+d.length,p)l+=p[1];else{var m=e[i],h=n[2],g=n[3],y=n[4],b=n[5],v=n[6],w=n[7];l&&(r.push(l),l="");var k=null!=h&&null!=m&&m!==h,x="+"===v||"*"===v,S="?"===v||"*"===v,E=n[2]||c,_=y||b;r.push({name:g||a++,prefix:h||"",delimiter:E,optional:S,repeat:x,partial:k,asterisk:!!w,pattern:_?u(_):w?".*":"[^"+s(E)+"]+?"})}}return i{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const r=n(9901),o=n(9642),a=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...a,...Object.keys(Prism.languages)];o(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(6500).resolve(t)],delete Prism.languages[e],n(6500)(t),a.add(e)}))}i.silent=!1,e.exports=i},6854:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,l=i.length;-1!==n.code.indexOf(o=t(r,l));)++l;return i[l]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=a.length);s++){var u=l[s];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=a[o],d=n.tokenStack[c],p="string"==typeof u?u:u.content,f=t(r,c),m=p.indexOf(f);if(m>-1){++o;var h=p.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),y=p.substring(m+f.length),b=[];h&&b.push.apply(b,i([h])),b.push(g),y&&b.push.apply(b,i([y])),"string"==typeof u?l.splice.apply(l,[s,1].concat(b)):u.content=b}}else u.content&&i(u.content)}return l}(n.tokens)}}}})}(Prism)},6726:(e,t,n)=>{var r={"./":2885};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=6726},6500:(e,t,n)=>{var r={"./":2885};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=6500},9642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n "));var l={},s=e[r];if(s){function u(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in l))for(var i in o(t,a),l[t]=!0,n[t])l[i]=!0}t(s.require,u),t(s.optional,u),t(s.modify,u)}n[r]=l,a.pop()}}return function(e){var t=n[e];return t||(o(e,r),t=n[e]),t}}function o(e){for(var t in e)return!0;return!1}return function(a,i,l){var s=function(e){var t={};for(var n in e){var r=e[n];for(var o in r)if("meta"!=o){var a=r[o];t[o]="string"==typeof a?{title:a}:a}}return t}(a),u=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var o in n={},e){var a=e[o];t(a&&a.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+o+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+o+" because it is a component.");n[t]=o}))}return n[r]||r}}(s);i=i.map(u),l=(l||[]).map(u);var c=n(i),d=n(l);i.forEach((function e(n){var r=s[n];t(r&&r.require,(function(t){t in d||(c[t]=!0,e(t))}))}));for(var p,f=r(s),m=c;o(m);){for(var h in p={},m){var g=s[h];t(g&&g.modify,(function(e){e in d&&(p[e]=!0)}))}for(var y in d)if(!(y in c))for(var b in f(y))if(b in c){p[y]=!0;break}for(var v in m=p)c[v]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,o){var a=o?o.series:void 0,i=o?o.parallel:e,l={},s={};function u(e){if(e in l)return l[e];s[e]=!0;var o,c=[];for(var d in t(e))d in n&&c.push(d);if(0===c.length)o=r(e);else{var p=i(c.map((function(e){var t=u(e);return delete s[e],t})));a?o=a(p,(function(){return r(e)})):r(e)}return l[e]=o}for(var c in n)u(c);var d=[];for(var p in s)d.push(l[p]);return i(d)}(f,c,t,n)}};return w}}();e.exports=t},2703:(e,t,n)=>{"use strict";var r=n(414);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),o=n(3840);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n