diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 457b35fba..0cc98ccfd 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -32,9 +32,9 @@
]
}
},
- "postCreateCommand": "bash ./.devcontainer/setup_env.sh",
+ "postCreateCommand": "sed -i 's/\\r$//' ./.devcontainer/setup_env.sh && find ./infra -type f -name \"*.sh\" -exec sed -i 's/\\r$//' {} \\; && bash ./.devcontainer/setup_env.sh",
"remoteUser": "vscode",
"hostRequirements": {
"memory": "4gb"
}
-}
+}
\ No newline at end of file
diff --git a/.github/workflows/CAdeploy.yml b/.github/workflows/CAdeploy.yml
index 0706f5061..67752116c 100644
--- a/.github/workflows/CAdeploy.yml
+++ b/.github/workflows/CAdeploy.yml
@@ -7,6 +7,10 @@ on:
schedule:
- cron: '0 6,18 * * *' # Runs at 6:00 AM and 6:00 PM GMT
+env:
+ GPT_MIN_CAPACITY: 10
+ TEXT_EMBEDDING_MIN_CAPACITY: 10
+
jobs:
deploy:
runs-on: ubuntu-latest
@@ -22,8 +26,8 @@ jobs:
export AZURE_TENANT_ID=${{ secrets.AZURE_TENANT_ID }}
export AZURE_CLIENT_SECRET=${{ secrets.AZURE_CLIENT_SECRET }}
export AZURE_SUBSCRIPTION_ID="${{ secrets.AZURE_SUBSCRIPTION_ID }}"
- export GPT_MIN_CAPACITY="11"
- export TEXT_EMBEDDING_MIN_CAPACITY="45"
+ export GPT_MIN_CAPACITY=${{ env.GPT_MIN_CAPACITY }}
+ export TEXT_EMBEDDING_MIN_CAPACITY=${{ env.TEXT_EMBEDDING_MIN_CAPACITY }}
export AZURE_REGIONS="${{ vars.AZURE_REGIONS_CA }}"
chmod +x infra/scripts/checkquota.sh
@@ -77,7 +81,7 @@ jobs:
id: generate_rg_name
run: |
echo "Generating a unique resource group name..."
- ACCL_NAME="cabyoc" # Account name as specified
+ ACCL_NAME="ca" # Account name as specified
SHORT_UUID=$(uuidgen | cut -d'-' -f1)
UNIQUE_RG_NAME="arg-${ACCL_NAME}-${SHORT_UUID}"
echo "RESOURCE_GROUP_NAME=${UNIQUE_RG_NAME}" >> $GITHUB_ENV
@@ -115,18 +119,26 @@ jobs:
az deployment group create \
--resource-group ${{ env.RESOURCE_GROUP_NAME }} \
--template-file infra/main.bicep \
- --parameters AzureOpenAILocation=${{ env.AZURE_LOCATION }} environmentName=${{ env.SOLUTION_PREFIX }} cosmosLocation=eastus2
+ --parameters AzureOpenAILocation=${{ env.AZURE_LOCATION }} environmentName=${{ env.SOLUTION_PREFIX }} cosmosLocation=eastus2 gptDeploymentCapacity=${{ env.GPT_MIN_CAPACITY }} embeddingDeploymentCapacity=${{ env.TEXT_EMBEDDING_MIN_CAPACITY }} \
- name: Get AI Services name and store in variable
+ if: always() && steps.check_create_rg.outcome == 'success'
id: get_ai_services_name
run: |
set -e
echo "Getting AI Services name..."
- # Get the AI Services name from the deployment output
+ # Get the AI Services name
ai_services_name=$(az cognitiveservices account list -g ${{ env.RESOURCE_GROUP_NAME }} --query "[0].name" -o tsv)
- echo "AI_SERVICES_NAME=${ai_services_name}" >> $GITHUB_ENV
+ if [ -z "$ai_services_name" ]; then
+ echo "No AI Services resource found in the resource group."
+ echo "AI_SERVICES_NAME=" >> $GITHUB_ENV
+ else
+ echo "AI_SERVICES_NAME=${ai_services_name}" >> $GITHUB_ENV
+ echo "Found AI Services resource: $ai_services_name"
+ fi
- name: List KeyVaults and Store in Array
+ if: always() && steps.check_create_rg.outcome == 'success'
id: list_keyvaults
run: |
@@ -180,7 +192,7 @@ jobs:
# echo "Power BI URL updated successfully for application: $application_name."
- name: Delete Bicep Deployment
- if: success()
+ if: always()
run: |
set -e
echo "Checking if resource group exists..."
@@ -197,6 +209,7 @@ jobs:
fi
- name: Wait for resource deletion to complete
+ if: always() && steps.check_create_rg.outcome == 'success'
run: |
# List of keyvaults
@@ -256,7 +269,7 @@ jobs:
done
- name: Purging the Resources
- if: success()
+ if: always() && steps.check_create_rg.outcome == 'success'
run: |
set -e
diff --git a/README.md b/README.md
index a5ac4e09d..d1b13d909 100644
--- a/README.md
+++ b/README.md
@@ -1,97 +1,165 @@
-# Build your own copilot Solution Accelerator
+# Build your own copilot solution accelerator
-MENU: [**USER STORY**](#user-story) \| [**QUICK DEPLOY**](#quick-deploy) \| [**SUPPORTING DOCUMENTS**](#supporting-documents) \|
-[**CUSTOMER TRUTH**](#customer-truth)
+This solution accelerator is a powerful tool that helps you create your own copilots. The accelerator can be used by any customer looking for reusable architecture and code snippets to build custom copilots with their own enterprise data.
+
+
+
+
+[**SOLUTION OVERVIEW**](#solution-overview) \| [**QUICK DEPLOY**](#quick-deploy) \| [**BUSINESS USE CASE**](#business-use-case) \| [**SUPPORTING DOCUMENTATION**](#supporting-documentation)
-
+
-User story
+
+
+Solution overview
-**Solution accelerator overview**
-This solution accelerator is a powerful tool that helps you create your own copilots. The accelerator can be used by any customer looking for reusable architecture and code snippets to build custom copilots with their own enterprise data.
+Leverages Azure OpenAI Service and Azure AI Search, this solution streamlines daily tasks and customer meeting preparation for customer-facing roles. As a result, this helps to improve client retention and customer satisfaction. By increasing employee productivity and improving customer conversations, our solution enables organizations to serve more customers and drive increased revenue for the entire company.
-It leverages Azure OpenAI Service, Azure AI Search and Microsoft Fabric, to streamline daily tasks and customer meeting preparation for customer-facing roles. As a result, this helps to improve client retention and customer satisfaction. By increasing employee productivity and improving customer conversations, our solution enables organizations to serve more customers and drive increased revenue for the entire company.
+### Solution architecture
+||
+|---|
-> Note: Some features contained in this repository are in private preview. Certain features might not be supported or might have constrained capabilities. For more information, see [Supplemental Terms of Use for Microsoft Azure Previews](https://azure.microsoft.com/en-us/support/legal/preview-supplemental-terms).
->**Version history:**
->An updated version of the **Build Your Own Copilot** solution accelerator was published on **[04/24/2025]**. If you deployed the accelerator prior to that date, please see the “Version history” in the [Version History](#version-history) section for details.
+
+
+### Additional resources
-**Technical Key Features**
+[Getting started with sample questions](./docs/SampleQuestions.md)
-
+⚠️ [Version history & researcher use case](#version-history)
-**Use Case / Scenario**
-A Woodgrove Bank Client Advisor is preparing for upcoming client meetings. He wants insight into his scheduled client meetings, access to portfolio information, a comprehensive understanding of previous meetings, and the ability to ask questions about client’s financial details and interests.
-
-This solution with an integrated copilot helps Client Advisors to save time and prepare relevant discussion topics for scheduled meetings. It provides an overview of daily client meetings with seamless navigation between viewing client profiles and chatting with data. Altogether, these features streamline meeting preparation for client advisors and result in more productive conversations with clients.
-The sample data used in this repository is synthetic and generated using Azure OpenAI service. The data is intended for use as sample data only.
+### Key features
+
+ Click to learn more about the key features this solution enables
-
+ - **Data processing**
+ Process past conversations at scale to add to AI search index with vector embeddings.
+
+ - **Semantic search**
+ Azure AI Search enabled RAG and grounding of the application on the processed datasets.
-**Below is an image of the solution accelerator.**
+ - **Seummarization**
+ Azure OpenAI Service helps to summarize the conversations and actions for the next meeting.
-
+ - **Chat with data**
+ Azure OpenAI Service helpsenable chat with structured and unstructured data using Semantic Kernel autonomous function calling.
+
+
-### Solution accelerator architecture
-
-
-
-QUICK DEPLOY
+
+
+
+Quick deploy
-Follow the quick deploy steps on the deployment guide to deploy this solution to your own Azure subscription.
+### How to install or deploy
+Follow the quick deploy steps on the deployment guide to deploy this solution to your own Azure subscription.
[Click here to launch the deployment guide](./docs/DeploymentGuide.md)
+
-| [](https://github.com/codespaces/new?repo=microsoft/Build-your-own-copilot-Solution-Accelerator) | [](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/microsoft/Build-your-own-copilot-Solution-Accelerator) |
+| [](https://codespaces.new/microsoft/Build-your-own-copilot-Solution-Accelerator) | [](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/microsoft/Build-your-own-copilot-Solution-Accelerator) |
|---|---|
-> ⚠️ **Important: Check Azure OpenAI Quota Availability**
To ensure sufficient quota is available in your subscription, please follow [quota check instructions guide](./docs/quota_check.md) before you deploy the solution.
+
-
+> ⚠️ **Important: Check Azure OpenAI Quota Availability**
+
To ensure sufficient quota is available in your subscription, please follow [quota check instructions guide](./docs/QuotaCheck.md) before you deploy the solution.
-
+
+### Prerequisites and costs
+
+To deploy this solution accelerator, ensure you have access to an [Azure subscription](https://azure.microsoft.com/free/) with the necessary permissions to create **resource groups, resources, app registrations, and assign roles at the resource group level**. This should include Contributor role at the subscription level and Role Based Access Control role on the subscription and/or resource group level. Follow the steps in [Azure Account Set Up](./docs/AzureAccountSetUp.md).
+
+Here are some example regions where the services are available: East US, East US2, Australia East, UK South, France Central.
+
+Check the [Azure Products by Region](https://azure.microsoft.com/en-us/explore/global-infrastructure/products-by-region/?products=all®ions=all) page and select a **region** where the following services are available.
+
+Pricing varies per region and usage, so it isn't possible to predict exact costs for your usage. The majority of the Azure resources used in this infrastructure are on usage-based pricing tiers. However, Azure Container Registry has a fixed cost per registry per day.
+
+Use the [Azure pricing calculator](https://azure.microsoft.com/en-us/pricing/calculator) to calculate the cost of this solution in your subscription.
+
+Review a [sample pricing sheet](https://azure.com/e/2ed9283e797f40958d59cdad556560f3) in the event you want to customize and scale usage.
+
+_Note: This is not meant to outline all costs as selected SKUs, scaled use, customizations, and integrations into your own tenant can affect the total consumption of this sample solution. The sample pricing sheet is meant to give you a starting point to customize the estimate for your specific needs._
-
-
+
+
+| Product | Description | Cost |
+|---|---|---|
+| [Azure AI Foundry](https://learn.microsoft.com/en-us/azure/ai-foundry/) | Free tier. | [Pricing](https://azure.microsoft.com/pricing/details/ai-studio/) |
+| [Azure Storage Account for AI Foundry](https://learn.microsoft.com/en-us/azure/storage/) | Standard tier, LRS. Pricing is based on storage and operations. | [Pricing](https://azure.microsoft.com/pricing/details/storage/blobs/) |
+| [Azure Key Vault](https://learn.microsoft.com/en-us/azure/key-vault/general/) | Standard tier. Pricing is based on the number of operations. | [Pricing](https://azure.microsoft.com/pricing/details/key-vault/) |
+| [Azure Storage Account for application](https://learn.microsoft.com/en-us/azure/storage/) | Standard tier, LRS. Pricing is based on storage and operations. | [Pricing](https://azure.microsoft.com/pricing/details/storage/blobs/) |
+| [Azure AI Services](https://learn.microsoft.com/en-us/azure/ai-services/what-are-ai-services) | S0 tier, defaults to gpt-4o-mini. Pricing is based on token count. | [Pricing](https://azure.microsoft.com/pricing/details/cognitive-services/) |
+| [Azure AI Search](https://learn.microsoft.com/en-us/azure/search/) | Basic tier. Vectorized data store. | [Pricing](https://azure.microsoft.com/en-us/pricing/details/search/) |
+| [Azure Container Registry](https://learn.microsoft.com/en-us/azure/container-registry/) | Basic tier. Hosting container images. | [Pricing](https://azure.microsoft.com/pricing/details/container-registry/) |pricing/details/container-registry/) |
+| [Azure Container App](https://learn.microsoft.com/en-us/azure/container-apps/) | Consumption tier with 4 CPU, 8GiB memory/storage. Pricing is based on resource allocation, and each month allows for a certain amount of free usage. | [Pricing](https://azure.microsoft.com/pricing/details/container-apps/) |
+| [Log analytics](https://learn.microsoft.com/en-us/azure/azure-monitor/logs/log-analytics-overview) | Pay-as-you-go tier. Costs based on data ingested. | [Pricing](https://azure.microsoft.com/pricing/details/monitor/) |
+| [Azure SQL DB](https://learn.microsoft.com/en-us/azure/azure-sql/database/) | General purpose, Serverless Gen5, 2 vCores. Structured data storage. | [Pricing](https://azure.microsoft.com/en-us/pricing/details/azure-sql-database/single/) |
+| [Azure Cosmos DB](https://learn.microsoft.com/en-us/azure/cosmos-db/) | Chat history data storage. | [Pricing](https://azure.microsoft.com/en-us/pricing/details/cosmos-db/autoscale-provisioned/) |
+
-Supporting Documentation
+
+>⚠️ **Important:** To avoid unnecessary costs, remember to take down your app if it's no longer in use,
+either by deleting the resource group in the Portal or running `azd down`.
+
+
+
+Business Use Case
-### Costs
-Pricing varies per region and usage, so it isn't possible to predict exact costs for your usage.
-The majority of the Azure resources used in this infrastructure are on usage-based pricing tiers.
-However, Azure Container Registry has a fixed cost per registry per day.
+||
+|---|
+
+
-You can try the [Azure pricing calculator](https://azure.microsoft.com/en-us/pricing/calculator) for the resources:
+A Woodgrove Bank Client Advisor is preparing for upcoming client meetings. He wants insight into his scheduled client meetings, access to portfolio information, a comprehensive understanding of previous meetings, and the ability to ask questions about client’s financial details and interests.
-* Azure AI Foundry: Free tier. [Pricing](https://azure.microsoft.com/pricing/details/ai-studio/)
- * Azure Storage Account for AI Foundry: Standard tier, LRS. Pricing is based on storage and operations. [Pricing](https://azure.microsoft.com/pricing/details/storage/blobs/)
- * Azure Key Vault: Standard tier. Pricing is based on the number of operations. [Pricing](https://azure.microsoft.com/pricing/details/key-vault/)
-* Azure Storage Account for Content Processing Application: Standard tier, LRS. Pricing is based on storage and operations. [Pricing](https://azure.microsoft.com/pricing/details/storage/blobs/)
-* Azure AI Services: S0 tier, defaults to gpt-4o-mini. Pricing is based on token count. [Pricing](https://azure.microsoft.com/pricing/details/cognitive-services/)
-* Azure Container App: Consumption tier with 4 CPU, 8GiB memory/storage. Pricing is based on resource allocation, and each month allows for a certain amount of free usage. [Pricing](https://azure.microsoft.com/pricing/details/container-apps/)
-* Azure Container Registry: Basic tier. [Pricing](https://azure.microsoft.com/pricing/details/container-registry/)
-* Log analytics: Pay-as-you-go tier. Costs based on data ingested. [Pricing](https://azure.microsoft.com/pricing/details/monitor/)
-* Azure Cosmos DB: [Pricing](https://azure.microsoft.com/en-us/pricing/details/cosmos-db/autoscale-provisioned/)
+This solution has an integrated copilot that helps Client Advisors to save time and prepare relevant discussion topics for scheduled meetings. It provides an overview of daily client meetings with seamless navigation between viewing client profiles and chatting with data. Altogether, these features streamline meeting preparation for client advisors and result in more productive conversations with clients.
+⚠️ The sample data used in this repository is synthetic and generated using Azure OpenAI service. The data is intended for use as sample data only.
-> ⚠️ To avoid unnecessary costs, remember to take down your app if it's no longer in use,
-either by deleting the resource group in the Portal or running `azd down`.
+
+### Business value
+
+ Click to learn more about what value this solution provides
+
+ - **Reduce expenses, increase revenue**
+ Copilots can reduce operational costs, enhance revenue, and maintain competitiveness.
+
+ - **Enhance productivity**
+ Copilots save professionals time in the meeting preparation process which enables them to handle more tasks and increase customer satisfaction.
+
+ - **Talent retention**
+ Organizations can empower employees to deliver the best customer experiences with a focus on relationships, resulting in higher morale and the retention of top talent.
+
+ - **Enhance customer engagement**
+ Copilots can support improved customer interactions for enhanced satisfaction, and enabling professionals to serve a greater number of customers.
+
+ - **Optimize daily tasks**
+ Copilots can streamline workflows by providing intelligent summaries, recommended action items, integrated client views, and immediate support through conversational interfaces.
+
+
+
+
+
+
+
+Supporting documentation
+
### Security guidelines
@@ -103,40 +171,46 @@ To ensure continued best practices in your own repository, we recommend that any
You may want to consider additional security measures, such as:
-* Enabling Microsoft Defender for Cloud to [secure your Azure resources](https://learn.microsoft.com/azure/security-center/defender-for-cloud).
+* Enabling Microsoft Defender for Cloud to [secure your Azure resources](https://learn.microsoft.com/en-us/azure/defender-for-cloud/).
* Protecting the Azure Container Apps instance with a [firewall](https://learn.microsoft.com/azure/container-apps/waf-app-gateway) and/or [Virtual Network](https://learn.microsoft.com/azure/container-apps/networking?tabs=workload-profiles-env%2Cazure-cli).
-Supporting documents coming soon.
+
-
-
-Version History
-
-An updated version of the **Build Your Own Copilot** solution accelerator was published on **[04/24/2025]**. If you deployed the accelerator prior to that date, please note the following changes:
+
+
+
+### Version history
+
+An updated version of the **Build Your Own Copilot** solution accelerator was published on `04/24/2025`. If you deployed the accelerator prior to that date, please note the following changes:
- The **Research Assistant** project has been moved to a separate branch. You can access it here: [**Research Assistant Branch**](https://github.com/microsoft/Build-your-own-copilot-Solution-Accelerator/tree/byoc-researcher).
- This repository now focuses exclusively on the **Client Advisor** solution scenario.
- The previous folder structure containing both `research-assistant/` and `client-advisor/` directories has been removed.
- The **Client Advisor** solution accelerator is now featured directly on the main landing page, with no additional folders associated.
+
-
-
-Responsible AI Transparency FAQ
-
-Please refer to [Transparency FAQ](../TRANSPARENCY_FAQ.md) for responsible AI transparency details of this solution accelerator.
+## Provide feedback
+
+Have questions, find a bug, or want to request a feature? [Submit a new issue](https://github.com/microsoft/Build-your-own-copilot-Solution-Accelerator/issues) on this repo and we'll connect.
+
+## Responsible AI Transparency FAQ
+Please refer to [Transparency FAQ](./TRANSPARENCY_FAQ.md) for responsible AI transparency details of this solution accelerator.
+
## Disclaimers
@@ -161,4 +235,4 @@ You acknowledge that the Software and Microsoft Products and Services (1) are no
You acknowledge the Software is not subject to SOC 1 and SOC 2 compliance audits. No Microsoft technology, nor any of its component technologies, including the Software, is intended or made available as a substitute for the professional advice, opinion, or judgement of a certified financial services professional. Do not use the Software to replace, substitute, or provide professional financial advice or judgment.
-BY ACCESSING OR USING THE SOFTWARE, YOU ACKNOWLEDGE THAT THE SOFTWARE IS NOT DESIGNED OR INTENDED TO SUPPORT ANY USE IN WHICH A SERVICE INTERRUPTION, DEFECT, ERROR, OR OTHER FAILURE OF THE SOFTWARE COULD RESULT IN THE DEATH OR SERIOUS BODILY INJURY OF ANY PERSON OR IN PHYSICAL OR ENVIRONMENTAL DAMAGE (COLLECTIVELY, “HIGH-RISK USE”), AND THAT YOU WILL ENSURE THAT, IN THE EVENT OF ANY INTERRUPTION, DEFECT, ERROR, OR OTHER FAILURE OF THE SOFTWARE, THE SAFETY OF PEOPLE, PROPERTY, AND THE ENVIRONMENT ARE NOT REDUCED BELOW A LEVEL THAT IS REASONABLY, APPROPRIATE, AND LEGAL, WHETHER IN GENERAL OR IN A SPECIFIC INDUSTRY. BY ACCESSING THE SOFTWARE, YOU FURTHER ACKNOWLEDGE THAT YOUR HIGH-RISK USE OF THE SOFTWARE IS AT YOUR OWN RISK.
+BY ACCESSING OR USING THE SOFTWARE, YOU ACKNOWLEDGE THAT THE SOFTWARE IS NOT DESIGNED OR INTENDED TO SUPPORT ANY USE IN WHICH A SERVICE INTERRUPTION, DEFECT, ERROR, OR OTHER FAILURE OF THE SOFTWARE COULD RESULT IN THE DEATH OR SERIOUS BODILY INJURY OF ANY PERSON OR IN PHYSICAL OR ENVIRONMENTAL DAMAGE (COLLECTIVELY, “HIGH-RISK USE”), AND THAT YOU WILL ENSURE THAT, IN THE EVENT OF ANY INTERRUPTION, DEFECT, ERROR, OR OTHER FAILURE OF THE SOFTWARE, THE SAFETY OF PEOPLE, PROPERTY, AND THE ENVIRONMENT ARE NOT REDUCED BELOW A LEVEL THAT IS REASONABLY, APPROPRIATE, AND LEGAL, WHETHER IN GENERAL OR IN A SPECIFIC INDUSTRY. BY ACCESSING THE SOFTWARE, YOU FURTHER ACKNOWLEDGE THAT YOUR HIGH-RISK USE OF THE SOFTWARE IS AT YOUR OWN RISK.
\ No newline at end of file
diff --git a/TRANSPARENCY_FAQ.md b/TRANSPARENCY_FAQ.md
index d5baad0d1..17f353d0b 100644
--- a/TRANSPARENCY_FAQ.md
+++ b/TRANSPARENCY_FAQ.md
@@ -7,7 +7,7 @@
The sample solution for research assistant focuses on a researcher who wants to explore relevant articles and grants to accelerate submission of a grant proposal. The sample data is sourced from a select set of research and grants published on PubMed and NIH. The documents are intended for use as sample data only. The sample solution takes user input in text format and returns LLM responses in text format up to 800 tokens.
It uses prompt flow to search data from AI search vector store, summarize the retrieved documents with Azure OpenAI.
- The sample solution for client advisor focuses on an advisor to save time and prepare relevant discussion topics for scheduled meetings. It provides an overview of daily client meetings with seamless navigation between viewing client profiles and chatting with data. The sample data is synthetic and is generated using ficticious names. This data intended for use as sample data only. The sample solution takes user input in text format and returns LLM responses in text format up to 800 tokens.
+ The sample solution for client advisor focuses on an advisor to save time and prepare relevant discussion topics for scheduled meetings. It provides an overview of daily client meetings with seamless navigation between viewing client profiles and chatting with data. The sample data is synthetic and is generated using fictitious names. This data intended for use as sample data only. The sample solution takes user input in text format and returns LLM responses in text format up to 800 tokens.
It uses semantic kernel to search data from AI search vector store and Azure SQL Database, summarize the results using Azure OpenAI.
- ### What is/are Build your own copilot Solution Accelerator’s intended use(s)?
diff --git a/docs/DeploymentGuide.md b/docs/DeploymentGuide.md
index a580e3ed9..96362bb6a 100644
--- a/docs/DeploymentGuide.md
+++ b/docs/DeploymentGuide.md
@@ -10,7 +10,6 @@ Check the [Azure Products by Region](https://azure.microsoft.com/en-us/explore/g
- [Azure AI Search](https://learn.microsoft.com/en-us/azure/search/)
- [Azure App Service](https://learn.microsoft.com/en-us/azure/app-service/)
- [Azure SQL Database](https://learn.microsoft.com/en-us/azure/azure-sql/)
-- [Microsoft Fabric](https://learn.microsoft.com/en-us/fabric/)
- [Azure Semantic Search](AzureSemanticSearchRegion.md)
Here are some example regions where the services are available: East US, East US2, Australia East, UK South, France Central.
@@ -18,17 +17,16 @@ Here are some example regions where the services are available: East US, East US
### **Important: Check Azure OpenAI Quota Availability**
-⚠️ To ensure sufficient quota is available in your subscription, please follow [quota check instructions guide](./quota_check.md) before you deploy the solution.
+⚠️ To ensure sufficient quota is available in your subscription, please follow [quota check instructions guide](./QuotaCheck.md) before you deploy the solution.
### [Optional] Quota Recommendations
-By default, the **Gpt-4o-mini model capacity** in deployment is set to **30k tokens**, so we recommend
+By default, the **Gpt-4o-mini model capacity** in deployment is set to **30k tokens**, so we recommend updating the following:
> **For Global Standard | GPT-4o-mini - increase the capacity to at least 150k tokens post-deployment for optimal performance.**
-To adjust quota settings, follow these [steps](AzureGPTQuotaSettings.md)
-
-
+Depending on your subscription quota and capacity, you can [adjust quota settings](AzureGPTQuotaSettings.md) to better meet your specific needs. You can also [adjust the deployment parameters](CustomizingAzdParameters.md) for additional optimization.
+
## Deployment Options & Steps
Pick from the options below to see step-by-step instructions for GitHub Codespaces, VS Code Dev Containers, and Local Environments.
@@ -211,10 +209,6 @@ This will rebuild the source code, package it into a container, and push it to t
2. **Add Authentication Provider**
- Follow steps in [App Authentication](./AppAuthentication.md) to configure authenitcation in app service. Note that Authentication changes can take up to 10 minutes.
-3. **Fabric Configuration**,
- - Follow steps in [Fabric Deployment guide](FabricDeployment.md) to set up the data processing pipelines and Power BI report in Fabric.
-4. **Teams App Configuration**
- - *(Optional)* Follow steps in [Teams Tab App guide](TeamsAppDeployment.md) to add the Client Advisor app to Microsoft Teams.
-5. **Deleting Resources After a Failed Deployment**
+3. **Deleting Resources After a Failed Deployment**
- Follow steps in [Delete Resource Group](DeleteResourceGroup.md) if your deployment fails and/or you need to clean up the resources.
diff --git a/docs/FabricDeployment.md b/docs/FabricDeployment.md
index 2ec187e72..5e95f4b5f 100644
--- a/docs/FabricDeployment.md
+++ b/docs/FabricDeployment.md
@@ -12,7 +12,7 @@
## Step 2: Deploy Fabric resources and artifacts
1. Navigate to ([Azure Portal](https://portal.azure.com/))
2. Click on Azure Cloud Shell in the top right of navigation Menu (add image)
-3. Run the run the following commands:
+3. Run the following commands:
- ```az login```
- ```rm -rf Build-your-own-copilot-Solution-Accelerator```
- ```git clone https://github.com/microsoft/Build-your-own-copilot-Solution-Accelerator```
diff --git a/docs/quota_check.md b/docs/QuotaCheck.md
similarity index 98%
rename from docs/quota_check.md
rename to docs/QuotaCheck.md
index b0b3639a5..872106410 100644
--- a/docs/quota_check.md
+++ b/docs/QuotaCheck.md
@@ -55,7 +55,7 @@ eastus, uksouth, eastus2, northcentralus, swedencentral, westus, westus2, southc
### **Sample Output**
The final table lists regions with available quota. You can select any of these regions for deployment.
-
+
---
### **If using Azure Portal and Cloud Shell**
diff --git a/docs/SampleQuestions.md b/docs/SampleQuestions.md
index 57a08eeb5..4a94b6e1f 100644
--- a/docs/SampleQuestions.md
+++ b/docs/SampleQuestions.md
@@ -5,8 +5,8 @@ To help you get started, here are some **Sample Prompts** you can ask after sele
1. Click on **Karen Berg** client.
2. Ask the following questions:
- What were Karen's concerns during our last meeting?
- - Did karen express any concerns over market fluctuations in prior meetings?
- - What type of asset does karen own ?
+ - Did Karen express any concerns over market fluctuations in prior meetings?
+ - What type of asset does Karen own ?
- Show latest asset value by asset type?
- How did equities asset value change in the last six months?
diff --git a/docs/images/DeleteRG.png b/docs/images/DeleteRG.png
new file mode 100644
index 000000000..75a0c5e45
Binary files /dev/null and b/docs/images/DeleteRG.png differ
diff --git a/docs/images/deleteservices.png b/docs/images/deleteservices.png
new file mode 100644
index 000000000..1885633b1
Binary files /dev/null and b/docs/images/deleteservices.png differ
diff --git a/docs/images/readMe/architecture.png b/docs/images/readMe/architecture.png
deleted file mode 100644
index 20a72817c..000000000
Binary files a/docs/images/readMe/architecture.png and /dev/null differ
diff --git a/docs/images/readMe/customerTruth.png b/docs/images/readMe/customerTruth.png
deleted file mode 100644
index 20cc799b1..000000000
Binary files a/docs/images/readMe/customerTruth.png and /dev/null differ
diff --git a/docs/images/readMe/keyfeatures.png b/docs/images/readMe/keyfeatures.png
deleted file mode 100644
index d13c0ed66..000000000
Binary files a/docs/images/readMe/keyfeatures.png and /dev/null differ
diff --git a/docs/images/readMe/quickDeploy.png b/docs/images/readMe/quickDeploy.png
deleted file mode 100644
index 846e0e1fb..000000000
Binary files a/docs/images/readMe/quickDeploy.png and /dev/null differ
diff --git a/docs/images/readMe/supportingDocuments.png b/docs/images/readMe/supportingDocuments.png
deleted file mode 100644
index 0a4d4b3dc..000000000
Binary files a/docs/images/readMe/supportingDocuments.png and /dev/null differ
diff --git a/docs/images/readMe/userStory.png b/docs/images/readMe/userStory.png
deleted file mode 100644
index ba485f545..000000000
Binary files a/docs/images/readMe/userStory.png and /dev/null differ
diff --git a/docs/images/readMe/Demo_Button.png b/docs/images/readme/Demo_Button.png
similarity index 100%
rename from docs/images/readMe/Demo_Button.png
rename to docs/images/readme/Demo_Button.png
diff --git a/docs/images/readMe/armDeployment.png b/docs/images/readme/armDeployment.png
similarity index 100%
rename from docs/images/readMe/armDeployment.png
rename to docs/images/readme/armDeployment.png
diff --git a/docs/images/readme/business-scenario.png b/docs/images/readme/business-scenario.png
new file mode 100644
index 000000000..017032cce
Binary files /dev/null and b/docs/images/readme/business-scenario.png differ
diff --git a/docs/images/readMe/image.png b/docs/images/readme/image.png
similarity index 100%
rename from docs/images/readMe/image.png
rename to docs/images/readme/image.png
diff --git a/docs/images/readme/quick-deploy.png b/docs/images/readme/quick-deploy.png
new file mode 100644
index 000000000..421c0c1fa
Binary files /dev/null and b/docs/images/readme/quick-deploy.png differ
diff --git a/docs/images/readMe/quota-check-output.png b/docs/images/readme/quota-check-output.png
similarity index 100%
rename from docs/images/readMe/quota-check-output.png
rename to docs/images/readme/quota-check-output.png
diff --git a/docs/images/readme/solution-architecture.png b/docs/images/readme/solution-architecture.png
new file mode 100644
index 000000000..e35a6a2ca
Binary files /dev/null and b/docs/images/readme/solution-architecture.png differ
diff --git a/docs/images/readme/solution-overview.png b/docs/images/readme/solution-overview.png
new file mode 100644
index 000000000..483dbfcd2
Binary files /dev/null and b/docs/images/readme/solution-overview.png differ
diff --git a/docs/images/readme/supporting-documentation.png b/docs/images/readme/supporting-documentation.png
new file mode 100644
index 000000000..b498805cd
Binary files /dev/null and b/docs/images/readme/supporting-documentation.png differ
diff --git a/docs/images/readMe/landing_page.png b/docs/images/readme/ui.png
similarity index 100%
rename from docs/images/readMe/landing_page.png
rename to docs/images/readme/ui.png
diff --git a/docs/images/resource-groups.png b/docs/images/resource-groups.png
new file mode 100644
index 000000000..9694f6695
Binary files /dev/null and b/docs/images/resource-groups.png differ
diff --git a/docs/images/resourcegroup.png b/docs/images/resourcegroup.png
new file mode 100644
index 000000000..67b058bcc
Binary files /dev/null and b/docs/images/resourcegroup.png differ
diff --git a/infra/deploy_ai_foundry.bicep b/infra/deploy_ai_foundry.bicep
index 48b645a68..d6a8c611b 100644
--- a/infra/deploy_ai_foundry.bicep
+++ b/infra/deploy_ai_foundry.bicep
@@ -2,12 +2,12 @@
param solutionName string
param solutionLocation string
param keyVaultName string
-param deploymentType string
+param deploymentType string
param gptModelName string
param azureOpenaiAPIVersion string
param gptDeploymentCapacity int
param embeddingModel string
-param embeddingDeploymentCapacity int
+param embeddingDeploymentCapacity int
param managedIdentityObjectId string
// Load the abbrevations file required to name the azure resources.
@@ -85,7 +85,6 @@ resource logAnalytics 'Microsoft.OperationalInsights/workspaces@2023-09-01' = {
// }
// }
-
resource applicationInsights 'Microsoft.Insights/components@2020-02-02' = {
name: applicationInsightsName
location: location
@@ -98,7 +97,6 @@ resource applicationInsights 'Microsoft.Insights/components@2020-02-02' = {
}
}
-
resource containerRegistry 'Microsoft.ContainerRegistry/registries@2021-09-01' = {
name: containerRegistryNameCleaned
location: location
@@ -130,10 +128,9 @@ resource containerRegistry 'Microsoft.ContainerRegistry/registries@2021-09-01' =
}
}
-
var storageNameCleaned = replace(storageName, '-', '')
-resource aiServices 'Microsoft.CognitiveServices/accounts@2021-10-01' = {
+resource aiServices 'Microsoft.CognitiveServices/accounts@2024-04-01-preview' = {
name: aiServicesName
location: location
sku: {
@@ -142,56 +139,72 @@ resource aiServices 'Microsoft.CognitiveServices/accounts@2021-10-01' = {
kind: 'AIServices'
properties: {
customSubDomainName: aiServicesName
- apiProperties: {
- statisticsEnabled: false
- }
+ // apiProperties: {
+ // statisticsEnabled: false
+ // }
publicNetworkAccess: 'Enabled'
}
}
-
+// resource aiServices 'Microsoft.CognitiveServices/accounts@2021-10-01' = {
+// name: aiServicesName
+// location: location
+// sku: {
+// name: 'S0'
+// }
+// kind: 'AIServices'
+// properties: {
+// customSubDomainName: aiServicesName
+// // apiProperties: {
+// // statisticsEnabled: false
+// // }
+// publicNetworkAccess: 'Enabled'
+// }
+// }
@batchSize(1)
-resource aiServicesDeployments 'Microsoft.CognitiveServices/accounts/deployments@2023-05-01' = [for aiModeldeployment in aiModelDeployments: {
- parent: aiServices //aiServices_m
- name: aiModeldeployment.name
- properties: {
- model: {
- format: 'OpenAI'
- name: aiModeldeployment.model
+resource aiServicesDeployments 'Microsoft.CognitiveServices/accounts/deployments@2023-05-01' = [
+ for aiModeldeployment in aiModelDeployments: {
+ parent: aiServices //aiServices_m
+ name: aiModeldeployment.name
+ properties: {
+ model: {
+ format: 'OpenAI'
+ name: aiModeldeployment.model
+ }
+ raiPolicyName: aiModeldeployment.raiPolicyName
+ }
+ sku: {
+ name: aiModeldeployment.sku.name
+ capacity: aiModeldeployment.sku.capacity
}
- raiPolicyName: aiModeldeployment.raiPolicyName
- }
- sku:{
- name: aiModeldeployment.sku.name
- capacity: aiModeldeployment.sku.capacity
}
-}]
+]
resource aiSearch 'Microsoft.Search/searchServices@2023-11-01' = {
- name: aiSearchName
- location: solutionLocation
- sku: {
- name: 'basic'
+ name: aiSearchName
+ location: solutionLocation
+ sku: {
+ name: 'basic'
+ }
+ properties: {
+ replicaCount: 1
+ partitionCount: 1
+ hostingMode: 'default'
+ publicNetworkAccess: 'enabled'
+ networkRuleSet: {
+ ipRules: []
}
- properties: {
- replicaCount: 1
- partitionCount: 1
- hostingMode: 'default'
- publicNetworkAccess: 'enabled'
- networkRuleSet: {
- ipRules: []
- }
- encryptionWithCmk: {
- enforcement: 'Unspecified'
- }
- disableLocalAuth: false
- authOptions: {
- apiKeyOnly: {}
- }
- semanticSearch: 'free'
+ encryptionWithCmk: {
+ enforcement: 'Unspecified'
+ }
+ disableLocalAuth: false
+ authOptions: {
+ apiKeyOnly: {}
}
+ semanticSearch: 'free'
}
+}
resource storage 'Microsoft.Storage/storageAccounts@2022-09-01' = {
name: storageNameCleaned
@@ -242,7 +255,6 @@ resource storage 'Microsoft.Storage/storageAccounts@2022-09-01' = {
}
}
-
@description('This is the built-in Storage Blob Data Contributor.')
resource blobDataContributor 'Microsoft.Authorization/roleDefinitions@2018-01-01-preview' existing = {
scope: resourceGroup()
@@ -253,8 +265,8 @@ resource storageroleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-
name: guid(resourceGroup().id, managedIdentityObjectId, blobDataContributor.id)
properties: {
principalId: managedIdentityObjectId
- roleDefinitionId:blobDataContributor.id
- principalType: 'ServicePrincipal'
+ roleDefinitionId: blobDataContributor.id
+ principalType: 'ServicePrincipal'
}
}
@@ -293,10 +305,11 @@ resource aiHub 'Microsoft.MachineLearningServices/workspaces@2023-08-01-preview'
}
}
dependsOn: [
- aiServicesDeployments,aiSearch
+ aiServicesDeployments
+ aiSearch
]
}
-
+
resource aiSearchConnection 'connections@2024-07-01-preview' = {
name: '${aiHubName}-connection-AzureAISearch'
properties: {
@@ -308,16 +321,17 @@ resource aiHub 'Microsoft.MachineLearningServices/workspaces@2023-08-01-preview'
key: aiSearch.listAdminKeys().primaryKey
}
metadata: {
- type:'azure_ai_search'
+ type: 'azure_ai_search'
ApiType: 'Azure'
ResourceId: aiSearch.id
- ApiVersion:'2024-05-01-preview'
- DeploymentApiVersion:'2023-11-01'
+ ApiVersion: '2024-05-01-preview'
+ DeploymentApiVersion: '2023-11-01'
}
}
}
dependsOn: [
- aiServicesDeployments,aiSearch
+ aiServicesDeployments
+ aiSearch
]
}
@@ -334,7 +348,6 @@ resource aiHubProject 'Microsoft.MachineLearningServices/workspaces@2024-01-01-p
}
}
-
resource tenantIdEntry 'Microsoft.KeyVault/vaults/secrets@2021-11-01-preview' = {
parent: keyVault
name: 'TENANT-ID'
@@ -343,7 +356,6 @@ resource tenantIdEntry 'Microsoft.KeyVault/vaults/secrets@2021-11-01-preview' =
}
}
-
resource azureOpenAIApiKeyEntry 'Microsoft.KeyVault/vaults/secrets@2021-11-01-preview' = {
parent: keyVault
name: 'AZURE-OPENAI-KEY'
@@ -364,7 +376,7 @@ resource azureOpenAIApiVersionEntry 'Microsoft.KeyVault/vaults/secrets@2021-11-0
parent: keyVault
name: 'AZURE-OPENAI-PREVIEW-API-VERSION'
properties: {
- value: azureOpenaiAPIVersion //'2024-07-18'
+ value: azureOpenaiAPIVersion //'2024-07-18'
}
}
@@ -384,7 +396,6 @@ resource azureAIProjectConnectionStringEntry 'Microsoft.KeyVault/vaults/secrets@
}
}
-
resource azureSearchAdminKeyEntry 'Microsoft.KeyVault/vaults/secrets@2021-11-01-preview' = {
parent: keyVault
name: 'AZURE-SEARCH-KEY'
diff --git a/src/App/backend/chat_logic_handler.py b/src/App/backend/chat_logic_handler.py
index 75fdc2c34..2b992d0aa 100644
--- a/src/App/backend/chat_logic_handler.py
+++ b/src/App/backend/chat_logic_handler.py
@@ -86,7 +86,7 @@ def greeting(self, input: Annotated[str, "the question"]) -> Annotated[str, "The
answer = f"Error retrieving greeting response: {str(e)}"
return answer
- @kernel_function(name="ChatWithSQLDatabase", description="Given a query about client assets, investements and meeting dates or times, get details from the database based on the provided question and client id")
+ @kernel_function(name="ChatWithSQLDatabase", description="Given a query about client assets, investments and meeting scheduled (including upcoming or next meeting dates/times), get details from the database based on the provided question and client id")
def get_SQL_Response(
self,
input: Annotated[str, "the question"],
diff --git a/src/App/frontend/src/components/Answer/Answer.test.tsx b/src/App/frontend/src/components/Answer/Answer.test.tsx
index 5547f1f44..b49155067 100644
--- a/src/App/frontend/src/components/Answer/Answer.test.tsx
+++ b/src/App/frontend/src/components/Answer/Answer.test.tsx
@@ -129,7 +129,7 @@ describe('Answer Component', () => {
expect(screen.getByText(/This is an example answer with citations/i)).toBeInTheDocument();
});
- it('should show "1 reference" when citations lenght is one', () => {
+ it('should show "1 reference" when citations length is one', () => {
const answerWithMissingFeedback = {
...mockAnswerProps,
diff --git a/src/App/frontend/src/pages/layout/Layout.test.tsx b/src/App/frontend/src/pages/layout/Layout.test.tsx
index 697de245c..a94e881fb 100644
--- a/src/App/frontend/src/pages/layout/Layout.test.tsx
+++ b/src/App/frontend/src/pages/layout/Layout.test.tsx
@@ -295,7 +295,7 @@ describe('Layout Component', () => {
})
})
- test('should log error when getUderInfo fails', async () => {
+ test('should log error when getUserInfo fails', async () => {
;(getUserInfo as jest.Mock).mockRejectedValue(new Error())
const consoleErrorMock = jest.spyOn(console, 'error').mockImplementation(() => {})