diff --git a/.github/workflows/azure-dev.yml b/.github/workflows/azure-dev.yml index fa99f45a9e..b450ec8c64 100644 --- a/.github/workflows/azure-dev.yml +++ b/.github/workflows/azure-dev.yml @@ -26,6 +26,7 @@ jobs: AZURE_CLIENT_ID: ${{ vars.AZURE_CLIENT_ID }} AZURE_TENANT_ID: ${{ vars.AZURE_TENANT_ID }} AZURE_SUBSCRIPTION_ID: ${{ vars.AZURE_SUBSCRIPTION_ID }} + AZURE_RESOURCE_GROUP: ${{ vars.AZURE_RESOURCE_GROUP }} AZURE_ENV_NAME: ${{ vars.AZURE_ENV_NAME }} AZURE_LOCATION: ${{ vars.AZURE_LOCATION }} # project specific @@ -95,7 +96,7 @@ jobs: USE_SPEECH_OUTPUT_BROWSER: ${{ vars.USE_SPEECH_OUTPUT_BROWSER }} USE_SPEECH_OUTPUT_AZURE: ${{ vars.USE_SPEECH_OUTPUT_AZURE }} AZURE_SPEECH_SERVICE: ${{ vars.AZURE_SPEECH_SERVICE }} - AZURE_SPEECH_SERVICE_RESOURCE_GROUP: ${{ vars.AZURE_SPEECH_RESOURCE_GROUP }} + AZURE_SPEECH_SERVICE_RESOURCE_GROUP: ${{ vars.AZURE_SPEECH_SERVICE_RESOURCE_GROUP }} AZURE_SPEECH_SERVICE_LOCATION: ${{ vars.AZURE_SPEECH_SERVICE_LOCATION }} AZURE_SPEECH_SERVICE_SKU: ${{ vars.AZURE_SPEECH_SERVICE_SKU }} AZURE_SPEECH_SERVICE_VOICE: ${{ vars.AZURE_SPEECH_SERVICE_VOICE }} @@ -116,6 +117,7 @@ jobs: USE_CHAT_HISTORY_BROWSER: ${{ vars.USE_CHAT_HISTORY_BROWSER }} USE_MEDIA_DESCRIBER_AZURE_CU: ${{ vars.USE_MEDIA_DESCRIBER_AZURE_CU }} USE_AI_PROJECT: ${{ vars.USE_AI_PROJECT }} + SERVICE_WEB_RESOURCE_EXISTS: ${{ vars.SERVICE_WEB_RESOURCE_EXISTS }} steps: - name: Checkout uses: actions/checkout@v4 @@ -126,7 +128,7 @@ jobs: - name: Install Nodejs uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 - name: Log in with Azure (Federated Credentials) if: ${{ env.AZURE_CLIENT_ID != '' }} @@ -151,6 +153,25 @@ jobs: env: AZURE_CREDENTIALS: ${{ secrets.AZURE_CREDENTIALS }} + - name: Set default resource group variables + run: | + DEFAULT_RG="$AZURE_RESOURCE_GROUP" + for var in \ + AZURE_OPENAI_RESOURCE_GROUP \ + AZURE_DOCUMENTINTELLIGENCE_RESOURCE_GROUP \ + AZURE_COMPUTER_VISION_RESOURCE_GROUP \ + AZURE_CONTENT_UNDERSTANDING_RESOURCE_GROUP \ + AZURE_SEARCH_SERVICE_RESOURCE_GROUP \ + AZURE_STORAGE_RESOURCE_GROUP \ + AZURE_SPEECH_SERVICE_RESOURCE_GROUP \ + AZURE_COSMOSDB_RESOURCE_GROUP; do + if [ -z "${!var}" ]; then + echo "Setting $var to default $DEFAULT_RG" + echo "$var=$DEFAULT_RG" >> "$GITHUB_ENV" + fi + done + shell: bash + - name: Provision Infrastructure run: azd provision --no-prompt env: diff --git a/.gitignore b/.gitignore index 185ad0f3ef..c9f96e553e 100644 --- a/.gitignore +++ b/.gitignore @@ -148,5 +148,6 @@ node_modules static/ data/**/*.md5 +data .DS_Store diff --git a/app/backend/approaches/prompts/ask_answer_question.prompty b/app/backend/approaches/prompts/ask_answer_question.prompty index 7ff73d232f..bfd46ec06e 100644 --- a/app/backend/approaches/prompts/ask_answer_question.prompty +++ b/app/backend/approaches/prompts/ask_answer_question.prompty @@ -4,8 +4,9 @@ description: Answer a single question (with no chat history) using solely text s model: api: chat sample: - user_query: What does a product manager do? + user_query: Which metrics should I track for Premium Capacity in Fabric? text_sources: + - "7 - Monitoring.md#L210-L245: Premium capacity KPIs include CPU utilization, memory consumption, query duration, dataset refresh times, and concurrency slots." - "role_library.pdf#page=29: The Manager of Product Management will collaborate with internal teams, such as engineering, sales, marketing, and finance, as well as external partners, suppliers, and customers to ensure successful product execution. Responsibilities: · Lead the product management team and provide guidance on product strategy, design, development, and launch. · Develop and implement product life-cycle management processes. · Monitor and analyze industry trends to identify opportunities for new products. · Develop product marketing plans and go-to-market strategies. · Research customer needs and develop customer-centric product roadmaps. · Collaborate with internal teams to ensure product execution and successful launch. · Develop pricing strategies and cost models. · Oversee product portfolio and performance metrics. · Manage product development budget. · Analyze product performance and customer feedback to identify areas for improvement. Qualifications: · Bachelor's degree in business, engineering, or a related field. · At least 5 years of experience in product management. · Proven track record of successful product launches." - "role_library.pdf#page=23: Company: Contoso Electronics Location: Anywhere Job Type: Full-Time Salary: Competitive, commensurate with experience Job Summary: The Senior Manager of Product Management will be responsible for leading the product management team at Contoso Electronics. This role includes developing strategies, plans and objectives for the product management team and managing the day-to-day operations. The Senior Manager of Product Management will be responsible for the successful launch of new products and the optimization of existing products. Responsibilities: · Develop and implement product management strategies, plans and objectives to maximize team performance. · Analyze competitive landscape and market trends to develop product strategies. · Lead the product management team in the development of product plans, roadmaps and launch plans. · Monitor the performance of product management team, analyze results and implement corrective action as needed. · Manage the product lifecycle, including product development, launch, and end of life. · Ensure product features and benefits meet customer requirements. · Establish and maintain relationships with key customers, partners, and vendors." - "role_library.pdf#page=28: · 7+ years of experience in research and development in the electronics sector. · Proven track record of successfully designing, testing, and optimizing products. · Experience leading a team of researchers and engineers. · Excellent problem-solving and analytical skills. · Ability to work in a fast-paced environment and meet tight deadlines.· Knowledge of industry trends, technologies, and regulations. · Excellent communication and presentation skills. Manager of Product Management Job Title: Manager of Product Management, Contoso Electronics Job Summary: The Manager of Product Management is responsible for overseeing the product management team, driving product development and marketing strategy for Contoso Electronics. This individual will be accountable for the successful launch of new products and the implementation of product life-cycle management processes. The Manager of Product Management will collaborate with internal teams, such as engineering, sales, marketing, and finance, as well as external partners, suppliers, and customers to ensure successful product execution." @@ -14,11 +15,12 @@ system: {% if override_prompt %} {{ override_prompt }} {% else %} -You are an intelligent assistant helping Contoso Inc employees with their healthcare plan questions and employee handbook questions. +You are 3Cloud's Solution-Objects Assistant. You help consultants, engineers, and sales teams locate, explain, and compare 3Cloud Solution Objects (architecture decks, runbooks, pricing guides, security practices, etc.) and related internal resources (Employee Handbook, Benefits, Career paths). Use 'you' to refer to the individual asking the questions even if they ask with 'I'. +Provide succinct but complete answers. Answer the following question using only the data provided in the sources below. Each source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. -If you cannot answer using the sources below, say you don't know. Use below example to answer +If you cannot answer using the sources below, say you don't know. {{ injected_prompt }} {% endif %} @@ -34,6 +36,15 @@ info4.pdf: In-network institutions include Overlake, Swedish and others in the r assistant: In-network deductibles are $500 for employee and $1000 for family [info1.txt] and Overlake is in-network for the employee plan [info2.pdf][info4.pdf]. +user: +Which metrics should I track for Premium Capacity in Fabric? + +Sources: +7 - Monitoring.md#L210-L245: Premium capacity KPIs include CPU utilization, memory consumption, query duration, dataset refresh times, and concurrency slots. + +assistant: +Track CPU utilization, memory consumption, query duration, dataset refresh times, and concurrency slots to effectively monitor Premium Capacity performance [7 - Monitoring.md#L210-L245]. + user: {{ user_query }} Sources: diff --git a/app/backend/approaches/prompts/ask_answer_question_vision.prompty b/app/backend/approaches/prompts/ask_answer_question_vision.prompty index 25ab9656a7..5493a03a33 100644 --- a/app/backend/approaches/prompts/ask_answer_question_vision.prompty +++ b/app/backend/approaches/prompts/ask_answer_question_vision.prompty @@ -8,7 +8,8 @@ system: {% if override_prompt %} {{ override_prompt }} {% else %} -You are an intelligent assistant helping analyze the Annual Financial Report of Contoso Ltd., The documents contain text, graphs, tables and images. +You are 3Cloud's Solution-Objects Assistant. You help consultants, engineers, and sales teams locate, explain, and compare 3Cloud Solution Objects (architecture decks, runbooks, pricing guides, security practices, etc.) and related internal resources (Employee Handbook, Benefits, Career paths). +Provide succinct but complete answers. Each image source has the file name in the top left corner of the image with coordinates (10,10) pixels and is in the format SourceFileName:. Each text source starts in a new line and has the file name followed by colon and the actual information. Always include the source name from the image or text for each fact you use in the response in the format: [filename]. diff --git a/app/backend/approaches/prompts/chat_answer_question.prompty b/app/backend/approaches/prompts/chat_answer_question.prompty index 3dcb05ae21..0daf99991b 100644 --- a/app/backend/approaches/prompts/chat_answer_question.prompty +++ b/app/backend/approaches/prompts/chat_answer_question.prompty @@ -20,7 +20,7 @@ system: {% if override_prompt %} {{ override_prompt }} {% else %} -Assistant helps the company employees with their healthcare plan questions, and questions about the employee handbook. Be brief in your answers. +You are 3Cloud's Solution-Objects Assistant. You help consultants, engineers, and sales teams locate, explain, and compare 3Cloud Solution Objects (architecture decks, runbooks, pricing guides, security practices, etc.) and related internal resources (Employee Handbook, Benefits, Career paths). Provide succinct but complete answers. Answer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question. If the question is not in English, answer in the language used in the question. Each source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, for example [info1.txt]. Don't combine sources, list each source separately, for example [info1.txt][info2.pdf]. @@ -30,9 +30,9 @@ Each source has a name followed by colon and the actual information, always incl {% if include_follow_up_questions %} Generate 3 very brief follow-up questions that the user would likely ask next. Enclose the follow-up questions in double angle brackets. Example: -<> -<> -<> +<> +<> +<> Do not repeat questions that have already been asked. Make sure the last question ends with ">>". {% endif %} diff --git a/app/backend/approaches/prompts/chat_answer_question_vision.prompty b/app/backend/approaches/prompts/chat_answer_question_vision.prompty index 58b3624121..8014ed2b12 100644 --- a/app/backend/approaches/prompts/chat_answer_question_vision.prompty +++ b/app/backend/approaches/prompts/chat_answer_question_vision.prompty @@ -8,13 +8,13 @@ system: {% if override_prompt %} {{ override_prompt }} {% else %} -You are an intelligent assistant helping analyze the Annual Financial Report of Contoso Ltd., The documents contain text, graphs, tables and images. +You are 3Cloud's Solution-Objects Assistant. You help consultants, engineers, and sales teams locate, explain, and compare 3Cloud Solution Objects (architecture decks, runbooks, pricing guides, security practices, etc.) and related internal resources (Employee Handbook, Benefits, Career paths). Provide succinct but complete answers. Each image source has the file name in the top left corner of the image with coordinates (10,10) pixels and is in the format SourceFileName: Each text source starts in a new line and has the file name followed by colon and the actual information Always include the source name from the image or text for each fact you use in the response in the format: [filename] Answer the following question using only the data provided in the sources below. If asking a clarifying question to the user would help, ask the question. -Be brief in your answers. + The text and image source can be the same file name, don't use the image title when citing the image source, only use the file name as mentioned If you cannot answer using the sources below, say you don't know. Return just the answer without any input texts. {{injected_prompt}} @@ -23,9 +23,9 @@ If you cannot answer using the sources below, say you don't know. Return just th {% if include_follow_up_questions %} Generate 3 very brief follow-up questions that the user would likely ask next. Enclose the follow-up questions in double angle brackets. Example: -<> -<> -<> +<> +<> +<> Do not repeat questions that have already been asked. Make sure the last question ends with ">>". {% endif %} diff --git a/app/frontend/src/api/api.ts b/app/frontend/src/api/api.ts index df95f801b5..a0f136bd47 100644 --- a/app/frontend/src/api/api.ts +++ b/app/frontend/src/api/api.ts @@ -79,7 +79,11 @@ export async function getSpeechApi(text: string): Promise { } export function getCitationFilePath(citation: string): string { - return `${BACKEND_URI}/content/${citation}`; + // Encode the actual file path so spaces and other unsafe characters are handled, + // but keep any page fragment (e.g. "#page=3") intact so the PDF opens on the correct page. + const [pathPart, fragment] = citation.split("#"); + const encodedPath = encodeURIComponent(pathPart); + return `${BACKEND_URI}/content/${encodedPath}${fragment ? `#${fragment}` : ""}`; } export async function uploadFileApi(request: FormData, idToken: string): Promise { diff --git a/app/frontend/src/components/Answer/AnswerParser.tsx b/app/frontend/src/components/Answer/AnswerParser.tsx index 3807592f6d..fb6bc71e9e 100644 --- a/app/frontend/src/components/Answer/AnswerParser.tsx +++ b/app/frontend/src/components/Answer/AnswerParser.tsx @@ -8,12 +8,13 @@ type HtmlParsedAnswer = { // Function to validate citation format and check if dataPoint starts with possible citation function isCitationValid(contextDataPoints: any, citationCandidate: string): boolean { - const regex = /.+\.\w{1,}(?:#\S*)?$/; - if (!regex.test(citationCandidate)) { + const trimmed = citationCandidate.trim(); + const regex = /.+\.[A-Za-z0-9]{1,}(?:#\S*)?$/; + if (!regex.test(trimmed)) { return false; } - // Check if contextDataPoints is an object with a text property that is an array + // Determine the array of data points let dataPointsArray: string[]; if (Array.isArray(contextDataPoints)) { dataPointsArray = contextDataPoints; @@ -23,11 +24,7 @@ function isCitationValid(contextDataPoints: any, citationCandidate: string): boo return false; } - const isValidCitation = dataPointsArray.some(dataPoint => { - return dataPoint.startsWith(citationCandidate); - }); - - return isValidCitation; + return dataPointsArray.some(dp => dp.startsWith(trimmed)); } export function parseAnswerToHtml(answer: ChatAppResponse, isStreaming: boolean, onCitationClicked: (citationFilePath: string) => void): HtmlParsedAnswer { diff --git a/app/frontend/src/components/Settings/Settings.tsx b/app/frontend/src/components/Settings/Settings.tsx index a1c4f46632..e82c32b72a 100644 --- a/app/frontend/src/components/Settings/Settings.tsx +++ b/app/frontend/src/components/Settings/Settings.tsx @@ -269,8 +269,9 @@ export const Settings = ({ onChange={(_ev?: React.FormEvent, option?: IDropdownOption) => onChange("includeCategory", option?.key || "")} aria-labelledby={includeCategoryId} options={[ - { key: "", text: t("labels.includeCategoryOptions.all") } - // { key: "example", text: "Example Category" } // Add more categories as needed + { key: "", text: t("labels.includeCategoryOptions.all") }, + { key: "Solution Object", text: t("labels.includeCategoryOptions.solutionObjects") }, + { key: "Employee Info", text: t("labels.includeCategoryOptions.employeeInfo") } ]} onRenderLabel={props => renderLabel(props, includeCategoryId, includeCategoryFieldId, t("helpTexts.includeCategory"))} /> diff --git a/app/frontend/src/locales/en/translation.json b/app/frontend/src/locales/en/translation.json index 8445407290..834e4b46c1 100644 --- a/app/frontend/src/locales/en/translation.json +++ b/app/frontend/src/locales/en/translation.json @@ -37,17 +37,17 @@ "chatEmptyStateTitle": "Chat with your data", "chatEmptyStateSubtitle": "Ask anything or try an example", "defaultExamples": { - "1": "What is included in my Northwind Health Plus plan that is not in standard?", - "2": "What happens in a performance review?", - "3": "What does a Product Manager do?", - "placeholder": "Type a new question (e.g. does my plan cover annual eye exams?)" + "1": "What deployment options are available for this solution?", + "2": "What security controls should I consider for a BI service?", + "3": "Which career path levels relate to data engineering?", + "placeholder": "Example: Which document covers on-premises gateway setup?" }, "askTitle": "Ask your data", "gpt4vExamples": { - "1": "Compare the impact of interest rates and GDP in financial markets.", - "2": "What is the expected trend for the S&P 500 index over the next five years? Compare it to the past S&P 500 performance", - "3": "Can you identify any correlation between oil prices and stock market trends?", - "placeholder": "Example: Does my plan cover annual eye exams?" + "1": "Summarise a typical architecture diagram for cloud analytics.", + "2": "Compare common cost models such as pay-as-you-go and reserved capacity.", + "3": "What governance responsibilities apply to a data platform implementation?", + "placeholder": "Example: What insights can a capacity planning heatmap provide?" }, "generatingAnswer": "Generating answer", "citationWithColon": "Citation:", @@ -91,7 +91,9 @@ }, "includeCategory": "Include category", "includeCategoryOptions": { - "all": "All" + "all": "All", + "solutionObjects": "Solution Objects", + "employeeInfo": "3Cloud" }, "excludeCategory": "Exclude category", "useSemanticRanker": "Use semantic ranker for retrieval", diff --git a/azure.yaml b/azure.yaml index f77bfb5828..ad0bb7652f 100644 --- a/azure.yaml +++ b/azure.yaml @@ -8,11 +8,11 @@ services: project: ./app/backend language: py # Please check docs/azure_container_apps.md for more information on how to deploy to Azure Container Apps - host: containerapp + # host: containerapp docker: remoteBuild: true # Please check docs/azure_app_service.md for more information on how to deploy to Azure App Service - # host: appservice + host: appservice hooks: # This hook is called when App Service is the host prepackage: @@ -122,11 +122,13 @@ pipeline: - AZURE_ADLS_GEN2_STORAGE_ACCOUNT - AZURE_ADLS_GEN2_FILESYSTEM_PATH - AZURE_ADLS_GEN2_FILESYSTEM + - AZURE_RESOURCE_GROUP - DEPLOYMENT_TARGET - AZURE_CONTAINER_APPS_WORKLOAD_PROFILE - USE_CHAT_HISTORY_BROWSER - USE_MEDIA_DESCRIBER_AZURE_CU - USE_AI_PROJECT + - SERVICE_WEB_RESOURCE_EXISTS secrets: - AZURE_SERVER_APP_SECRET - AZURE_CLIENT_APP_SECRET diff --git a/configure_demo.sh b/configure_demo.sh new file mode 100755 index 0000000000..3cf892a94b --- /dev/null +++ b/configure_demo.sh @@ -0,0 +1,97 @@ +#!/usr/bin/env bash +# configure_demo.sh – prepares azd environment for the public demo using existing resource group & storage account +set -euo pipefail + +# ----- parameters you may tweak ----- +RG="rg-jacob-paul-rag" # existing resource group +SUB="6c8e23df-4aec-4ed5-bec5-79853ea6c6c6" # subscription id +LOC="eastus2" # default location +ENV_NAME="demo" # azd env folder name +STORAGE_ACCT="stinternalrag001" # existing ADLS Gen2 account + +# fixed resource names following pattern -internal-3c-rag +SEARCH="srch-internal-3c-rag" +OPENAI="oai-internal-3c-rag" +DOCINT="di-internal-3c-rag" +SPEECH="spch-internal-3c-rag" +PLAN="asp-internal-3c-rag" +WEBAPP="app-internal-3c-rag" +COSMOS="cosmosinternal3crag" # Cosmos account names cannot have hyphens + +# ----- create / switch azd env ----- +# create or switch to environment +if azd env list --output json | grep -q "\"$ENV_NAME\""; then + echo "Selecting existing environment $ENV_NAME" + azd env select "$ENV_NAME" +else + azd env new "$ENV_NAME" --subscription "$SUB" --location "$LOC" +fi +# pin to existing resource group +azd env set AZURE_RESOURCE_GROUP "$RG" + +# ----- hosting SKUs / flags ----- +azd env set DEPLOYMENT_TARGET appservice +azd env set AZURE_APP_SERVICE_SKU P0v3 +azd env set AZURE_SEARCH_SERVICE_SKU standard +azd env set SERVICE_WEB_RESOURCE_EXISTS true + +# ----- explicit resource names ----- +azd env set AZURE_STORAGE_ACCOUNT "$STORAGE_ACCT" +azd env set AZURE_STORAGE_CONTAINER "content" +azd env set AZURE_STORAGE_RESOURCE_GROUP "$RG" +azd env set AZURE_APPLICATION_INSIGHTS "appi-internal-3c-rag" +azd env set AZURE_APPLICATION_INSIGHTS_DASHBOARD "dash-internal-3c-rag" +azd env set AZURE_LOG_ANALYTICS "log-internal-3c-rag" +azd env set AZURE_SEARCH_SERVICE "$SEARCH" +azd env set AZURE_OPENAI_SERVICE "$OPENAI" +azd env set AZURE_DOCUMENTINTELLIGENCE_SERVICE "$DOCINT" +azd env set AZURE_SPEECH_SERVICE "$SPEECH" +azd env set AZURE_APP_SERVICE_PLAN "$PLAN" +azd env set AZURE_APP_SERVICE "$WEBAPP" +azd env set AZURE_COSMOSDB_ACCOUNT "$COSMOS" + +# ----- model / vision ----- +azd env set AZURE_OPENAI_EMB_MODEL_NAME text-embedding-3-large +azd env set AZURE_OPENAI_EMB_DIMENSIONS 3072 +# Enable GPT-4 Vision feature flag expected by template +azd env set USE_GPT4V true +# Optional: set the GPT-4V deployment/model names (can be blank to let template default) +azd env set AZURE_OPENAI_GPT4V_MODEL gpt-4o +azd env set AZURE_OPENAI_GPT4V_DEPLOYMENT gpt4v +azd env set USE_MEDIA_DESCRIBER_AZURE_CU false + +# ----- retrieval options ----- +azd env set AZURE_SEARCH_SEMANTIC_RANKER standard +azd env set AZURE_SEARCH_QUERY_REWRITING true + +# ----- chat history ----- +azd env set USE_CHAT_HISTORY_COSMOS true + +# ----- speech ----- +azd env set USE_SPEECH_INPUT_BROWSER true +azd env set USE_SPEECH_OUTPUT_AZURE true +azd env set AZURE_SPEECH_SERVICE_VOICE en-US-AndrewMultilingualNeural + +# ----- security & uploads ----- +azd env set AZURE_USE_AUTHENTICATION true +TENANT_ID=$(az account show --query tenantId -o tsv 2>/dev/null || echo "") +if [ -n "$TENANT_ID" ]; then + azd env set AZURE_AUTH_TENANT_ID "$TENANT_ID" + azd env set AZURE_TENANT_ID "$TENANT_ID" +fi +azd env set USE_USER_UPLOAD true + +# content understanding (Azure AI Foundry account) +azd env set AZURE_COMPUTER_VISION_SERVICE "cu-internal-3c-rag" + +# user-upload storage account (ADLS Gen2) +azd env set AZURE_ADLS_GEN2_STORAGE_ACCOUNT "userstinternal3crag" +azd env set AZURE_ADLS_GEN2_FILESYSTEM "user-content" +azd env set AZURE_ADLS_GEN2_FILESYSTEM_PATH "" + +# ----- regional parameters to avoid interactive prompts ----- +# keep required uppercase vars +azd env set AZURE_OPENAI_LOCATION "$LOC" +azd env set AZURE_DOCUMENTINTELLIGENCE_LOCATION "eastus" + +echo "✔ Demo environment configured. Run 'azd up' next." \ No newline at end of file diff --git a/data/Benefit_Options.pdf b/data/Benefit_Options.pdf deleted file mode 100644 index 6a4c07dc94..0000000000 Binary files a/data/Benefit_Options.pdf and /dev/null differ diff --git a/data/Contoso_Electronics_Company_Overview.md b/data/Contoso_Electronics_Company_Overview.md deleted file mode 100644 index 033d7dd84a..0000000000 --- a/data/Contoso_Electronics_Company_Overview.md +++ /dev/null @@ -1,48 +0,0 @@ -# Contoso Electronics - -*Disclaimer: This content is generated by AI and may not accurately represent factual information about any real entity. Use this information with caution and verify details from reliable sources.* - -## History - -Contoso Electronics, a pioneering force in the tech industry, was founded in 1985 by visionary entrepreneurs with a passion for innovation. Over the years, the company has played a pivotal role in shaping the landscape of consumer electronics. - -| Year | Milestone | -|------|-----------| -| 1985 | Company founded with a focus on cutting-edge technology | -| 1990 | Launched the first-ever handheld personal computer | -| 2000 | Introduced groundbreaking advancements in AI and robotics | -| 2015 | Expansion into sustainable and eco-friendly product lines | - -## Company Overview - -At Contoso Electronics, we take pride in fostering a dynamic and inclusive workplace. Our dedicated team of experts collaborates to create innovative solutions that empower and connect people globally. - -### Core Values - -- **Innovation:** Constantly pushing the boundaries of technology. -- **Diversity:** Embracing different perspectives for creative excellence. -- **Sustainability:** Committed to eco-friendly practices in our products. - -## Vacation Perks - -We believe in work-life balance and understand the importance of well-deserved breaks. Our vacation perks are designed to help our employees recharge and return with renewed enthusiasm. - -| Vacation Tier | Duration | Additional Benefits | -|---------------|----------|---------------------| -| Standard | 2 weeks | Health and wellness stipend | -| Senior | 4 weeks | Travel vouchers for a dream destination | -| Executive | 6 weeks | Luxury resort getaway with family | - -## Employee Recognition - -Recognizing the hard work and dedication of our employees is at the core of our culture. Here are some ways we celebrate achievements: - -- Monthly "Innovator of the Month" awards -- Annual gala with awards for outstanding contributions -- Team-building retreats for high-performing departments - -## Join Us! - -Contoso Electronics is always on the lookout for talented individuals who share our passion for innovation. If you're ready to be part of a dynamic team shaping the future of technology, check out our [careers page](http://www.contoso.com) for exciting opportunities. - -[Learn more about Contoso Electronics!](http://www.contoso.com) diff --git a/data/GPT4V_Examples/Financial Market Analysis Report 2023.pdf b/data/GPT4V_Examples/Financial Market Analysis Report 2023.pdf deleted file mode 100644 index eef17aad75..0000000000 Binary files a/data/GPT4V_Examples/Financial Market Analysis Report 2023.pdf and /dev/null differ diff --git a/data/Json_Examples/2189.json b/data/Json_Examples/2189.json deleted file mode 100644 index d7066c9fbd..0000000000 --- a/data/Json_Examples/2189.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "AreaPath": "SmartHotel360", - "AssignedTo": null, - "Categories": null, - "ChangedDate": "2023-12-13T23:08:38.69Z", - "ClosedDate": null, - "CreatedDate": "2023-12-13T23:08:38.69Z", - "Description": "As a customer, I would like to reserve a conference room such that:

1. It should display available date and time slots
2. Give an option to reserve a conference room for X hours
3. One can reserve a conference room for max 4 hours per day
", - "Id": 2189, - "State": "New", - "StateChangeDate": "2023-12-13T23:08:38.69Z", - "Tags": "Reservation", - "Title": "As a customer, I would like to reserve a conference room" -} diff --git a/data/Json_Examples/2190.json b/data/Json_Examples/2190.json deleted file mode 100644 index 5a45f1158f..0000000000 --- a/data/Json_Examples/2190.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "AreaPath": "SmartHotel360", - "AssignedTo": null, - "Categories": null, - "ChangedDate": "2023-12-13T23:08:38.997Z", - "ClosedDate": null, - "CreatedDate": "2023-12-13T23:08:38.997Z", - "Description": "

Enter the guest's name to whom you would\nlike to send a confirmation, display the company, contact, source\nand agent associated\nwith the reservation.

", - "Id": 2190, - "State": "New", - "StateChangeDate": "2023-12-13T23:08:38.997Z", - "Tags": "Notification", - "Title": "As a reservation agent, I would like to send confirmations to guest" -} diff --git a/data/Json_Examples/2191.json b/data/Json_Examples/2191.json deleted file mode 100644 index 455e4c9a24..0000000000 --- a/data/Json_Examples/2191.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "AreaPath": "SmartHotel360", - "AssignedTo": null, - "Categories": null, - "ChangedDate": "2023-12-13T23:08:39.17Z", - "ClosedDate": null, - "CreatedDate": "2023-12-13T23:08:39.17Z", - "Description": "

If you have not picked up\nyour vehicle you can remove or cancel your reservation by clicking here.


1. Car reserved should have an option to cancel the request
2. Car driver should receive a notification about cancellation
", - "Id": 2191, - "State": "New", - "StateChangeDate": "2023-12-13T23:08:39.17Z", - "Tags": "Reservation", - "Title": "As a customer, I should be able to remove a car reservation " -} diff --git a/data/Json_Examples/2192.json b/data/Json_Examples/2192.json deleted file mode 100644 index d2e489f317..0000000000 --- a/data/Json_Examples/2192.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "AreaPath": "SmartHotel360", - "AssignedTo": null, - "Categories": null, - "ChangedDate": "2023-12-13T23:08:39.383Z", - "ClosedDate": null, - "CreatedDate": "2023-12-13T23:08:39.383Z", - "Description": "As a courtesy, grant an\nextra hour or two to leave the room, especially if it isn't booked\nfor the upcoming evening. But customer must call the front desk\nin advance and request a late checkout.


1. Late Check-in time should be displayed
2. Request should be sent to front-desk 
3. Any extra charge should be displayed
", - "Id": 2192, - "State": "New", - "StateChangeDate": "2023-12-13T23:08:39.383Z", - "Tags": "Front-desk; Members; Reservation", - "Title": "As a customer, I should be able to request hotel for late Check-out" -} diff --git a/data/Json_Examples/query.json b/data/Json_Examples/query.json deleted file mode 100644 index ceb9dc1a6f..0000000000 --- a/data/Json_Examples/query.json +++ /dev/null @@ -1,244 +0,0 @@ -[ - { - "fields": { - "System.Id": 2348, - "System.State": "New", - "System.Title": "Provide related items or frequently bought together section when people browse or search", - "System.WorkItemType": "Product Backlog Item" - }, - "id": 2348, - "relations": null, - "rev": 1, - "url": "https://dev.azure.com/codebytes/_apis/wit/workItems/2348" - }, - { - "fields": { - "System.Id": 2349, - "System.State": "New", - "System.Title": "As tester, I need to test the website on all the relevant broswers and devices and be sure that it can handle our load.", - "System.WorkItemType": "Product Backlog Item" - }, - "id": 2349, - "relations": null, - "rev": 1, - "url": "https://dev.azure.com/codebytes/_apis/wit/workItems/2349" - }, - { - "fields": { - "System.Id": 2350, - "System.State": "New", - "System.Title": "As a customer, I should be able to put items to shopping cart", - "System.WorkItemType": "Product Backlog Item" - }, - "id": 2350, - "relations": null, - "rev": 1, - "url": "https://dev.azure.com/codebytes/_apis/wit/workItems/2350" - }, - { - "fields": { - "System.Id": 2351, - "System.State": "New", - "System.Title": "As a customer, I should be able to print my purchase order", - "System.WorkItemType": "Product Backlog Item" - }, - "id": 2351, - "relations": null, - "rev": 1, - "url": "https://dev.azure.com/codebytes/_apis/wit/workItems/2351" - }, - { - "fields": { - "System.Id": 2352, - "System.State": "New", - "System.Title": "As a customer, I would like to have a sort capabaility by price and customer ratings", - "System.WorkItemType": "Product Backlog Item" - }, - "id": 2352, - "relations": null, - "rev": 1, - "url": "https://dev.azure.com/codebytes/_apis/wit/workItems/2352" - }, - { - "fields": { - "System.Id": 2353, - "System.State": "New", - "System.Title": "Recommended products must be based on customer purchase pattern history", - "System.WorkItemType": "Product Backlog Item" - }, - "id": 2353, - "relations": null, - "rev": 1, - "url": "https://dev.azure.com/codebytes/_apis/wit/workItems/2353" - }, - { - "fields": { - "System.Id": 2354, - "System.State": "New", - "System.Title": "As a customer, I would like to save my addresses so that I can easily select the address for delivery", - "System.WorkItemType": "Product Backlog Item" - }, - "id": 2354, - "relations": null, - "rev": 1, - "url": "https://dev.azure.com/codebytes/_apis/wit/workItems/2354" - }, - { - "fields": { - "System.Id": 2355, - "System.State": "New", - "System.Title": "As marketer, I want to run an A|B test on alternative Web Sites using Application Insights.", - "System.WorkItemType": "Product Backlog Item" - }, - "id": 2355, - "relations": null, - "rev": 1, - "url": "https://dev.azure.com/codebytes/_apis/wit/workItems/2355" - }, - { - "fields": { - "System.AssignedTo": { - "_links": { - "avatar": { - "href": "https://dev.azure.com/codebytes/_apis/GraphProfile/MemberAvatars/aad.ZDlhOGEyZjktMGZmZS03YjY4LTlkYjctNjk1ZWZiNGY2Nzg0" - } - }, - "descriptor": "aad.ZDlhOGEyZjktMGZmZS03YjY4LTlkYjctNjk1ZWZiNGY2Nzg0", - "displayName": "Chris Ayers", - "id": "cd8258ec-ad87-4c0d-9026-e5e343447185", - "imageUrl": "https://dev.azure.com/codebytes/_apis/GraphProfile/MemberAvatars/aad.ZDlhOGEyZjktMGZmZS03YjY4LTlkYjctNjk1ZWZiNGY2Nzg0", - "uniqueName": "chrisayers@microsoft.com", - "url": "https://spsprodeus27.vssps.visualstudio.com/A6b854e9d-a8be-405d-a4cc-5eb8e7027155/_apis/Identities/cd8258ec-ad87-4c0d-9026-e5e343447185" - }, - "System.Id": 2356, - "System.State": "Done", - "System.Title": "Provide customers the ability to track status of the package", - "System.WorkItemType": "Product Backlog Item" - }, - "id": 2356, - "relations": null, - "rev": 1, - "url": "https://dev.azure.com/codebytes/_apis/wit/workItems/2356" - }, - { - "fields": { - "System.AssignedTo": { - "_links": { - "avatar": { - "href": "https://dev.azure.com/codebytes/_apis/GraphProfile/MemberAvatars/aad.ZDlhOGEyZjktMGZmZS03YjY4LTlkYjctNjk1ZWZiNGY2Nzg0" - } - }, - "descriptor": "aad.ZDlhOGEyZjktMGZmZS03YjY4LTlkYjctNjk1ZWZiNGY2Nzg0", - "displayName": "Chris Ayers", - "id": "cd8258ec-ad87-4c0d-9026-e5e343447185", - "imageUrl": "https://dev.azure.com/codebytes/_apis/GraphProfile/MemberAvatars/aad.ZDlhOGEyZjktMGZmZS03YjY4LTlkYjctNjk1ZWZiNGY2Nzg0", - "uniqueName": "chrisayers@microsoft.com", - "url": "https://spsprodeus27.vssps.visualstudio.com/A6b854e9d-a8be-405d-a4cc-5eb8e7027155/_apis/Identities/cd8258ec-ad87-4c0d-9026-e5e343447185" - }, - "System.Id": 2357, - "System.State": "Done", - "System.Title": "As a customer, I would like to have the ability to send my items as gift", - "System.WorkItemType": "Product Backlog Item" - }, - "id": 2357, - "relations": null, - "rev": 2, - "url": "https://dev.azure.com/codebytes/_apis/wit/workItems/2357" - }, - { - "fields": { - "System.Id": 2358, - "System.State": "Committed", - "System.Title": "As a customer, I would like to store my credit card details securely", - "System.WorkItemType": "Product Backlog Item" - }, - "id": 2358, - "relations": null, - "rev": 1, - "url": "https://dev.azure.com/codebytes/_apis/wit/workItems/2358" - }, - { - "fields": { - "System.Id": 2359, - "System.State": "Committed", - "System.Title": "As a customer, I should be able to select different shipping option", - "System.WorkItemType": "Product Backlog Item" - }, - "id": 2359, - "relations": null, - "rev": 1, - "url": "https://dev.azure.com/codebytes/_apis/wit/workItems/2359" - }, - { - "fields": { - "System.Id": 2360, - "System.State": "Committed", - "System.Title": "As developer, I want to use Azure Machine Learning to provide a recommendations engine behind the website.", - "System.WorkItemType": "Product Backlog Item" - }, - "id": 2360, - "relations": null, - "rev": 1, - "url": "https://dev.azure.com/codebytes/_apis/wit/workItems/2360" - }, - { - "fields": { - "System.Id": 2361, - "System.State": "Committed", - "System.Title": "Provide tentative duration for shipping.", - "System.WorkItemType": "Product Backlog Item" - }, - "id": 2361, - "relations": null, - "rev": 1, - "url": "https://dev.azure.com/codebytes/_apis/wit/workItems/2361" - }, - { - "fields": { - "System.Id": 2362, - "System.State": "Approved", - "System.Title": "Notify the user about any changes made to the order", - "System.WorkItemType": "Product Backlog Item" - }, - "id": 2362, - "relations": null, - "rev": 1, - "url": "https://dev.azure.com/codebytes/_apis/wit/workItems/2362" - }, - { - "fields": { - "System.Id": 2363, - "System.State": "Approved", - "System.Title": "As a admin, I should be able to update prices on ad-hoc condition", - "System.WorkItemType": "Product Backlog Item" - }, - "id": 2363, - "relations": null, - "rev": 1, - "url": "https://dev.azure.com/codebytes/_apis/wit/workItems/2363" - }, - { - "fields": { - "System.Id": 2364, - "System.State": "Approved", - "System.Title": "As a customer, I would like to provide my feedback on items that I have purchased", - "System.WorkItemType": "Product Backlog Item" - }, - "id": 2364, - "relations": null, - "rev": 1, - "url": "https://dev.azure.com/codebytes/_apis/wit/workItems/2364" - }, - { - "fields": { - "System.Id": 2365, - "System.State": "Approved", - "System.Title": "As a customer, I would like to have a wishlist where I can add items for future purchase", - "System.WorkItemType": "Product Backlog Item" - }, - "id": 2365, - "relations": null, - "rev": 1, - "url": "https://dev.azure.com/codebytes/_apis/wit/workItems/2365" - } -] diff --git a/data/Northwind_Health_Plus_Benefits_Details.pdf b/data/Northwind_Health_Plus_Benefits_Details.pdf deleted file mode 100644 index 97579a4fb5..0000000000 Binary files a/data/Northwind_Health_Plus_Benefits_Details.pdf and /dev/null differ diff --git a/data/Northwind_Standard_Benefits_Details.pdf b/data/Northwind_Standard_Benefits_Details.pdf deleted file mode 100644 index 7d50ff8c02..0000000000 Binary files a/data/Northwind_Standard_Benefits_Details.pdf and /dev/null differ diff --git a/data/PerksPlus.pdf b/data/PerksPlus.pdf deleted file mode 100644 index 2e167a2a6a..0000000000 Binary files a/data/PerksPlus.pdf and /dev/null differ diff --git a/data/employee_handbook.pdf b/data/employee_handbook.pdf deleted file mode 100644 index 878f36f7dd..0000000000 Binary files a/data/employee_handbook.pdf and /dev/null differ diff --git a/data/role_library.pdf b/data/role_library.pdf deleted file mode 100644 index ff70c65651..0000000000 Binary files a/data/role_library.pdf and /dev/null differ diff --git a/infra/core/host/appservice.bicep b/infra/core/host/appservice.bicep index 4bf13b3cb3..c5cae2370e 100644 --- a/infra/core/host/appservice.bicep +++ b/infra/core/host/appservice.bicep @@ -83,7 +83,17 @@ var appServiceProperties = { publicNetworkAccess: publicNetworkAccess } -resource appService 'Microsoft.Web/sites@2022-03-01' = { +// add flag to indicate the App Service already exists and should not be re-created +@description('If true the module will reference an existing App Service instead of creating a new one.') +param exists bool = false + +// Reference existing site when `exists` is true +resource appServiceExisting 'Microsoft.Web/sites@2022-03-01' existing = if (exists) { + name: name +} + +// Create or update site only when it doesn't already exist +resource appService 'Microsoft.Web/sites@2022-03-01' = if (!exists) { name: name location: location tags: tags @@ -91,7 +101,7 @@ resource appService 'Microsoft.Web/sites@2022-03-01' = { properties: appServiceProperties identity: { type: managedIdentity ? 'SystemAssigned' : 'None' } - resource configAppSettings 'config' = { + resource configAppSettings 'config' = if (!exists) { name: 'appsettings' properties: union(appSettings, { @@ -103,7 +113,7 @@ resource appService 'Microsoft.Web/sites@2022-03-01' = { !empty(keyVaultName) ? { AZURE_KEY_VAULT_ENDPOINT: keyVault.properties.vaultUri } : {}) } - resource configLogs 'config' = { + resource configLogs 'config' = if (!exists) { name: 'logs' properties: { applicationLogs: { fileSystem: { level: 'Verbose' } } @@ -116,21 +126,21 @@ resource appService 'Microsoft.Web/sites@2022-03-01' = { ] } - resource basicPublishingCredentialsPoliciesFtp 'basicPublishingCredentialsPolicies' = { + resource basicPublishingCredentialsPoliciesFtp 'basicPublishingCredentialsPolicies' = if (!exists) { name: 'ftp' properties: { allow: false } } - resource basicPublishingCredentialsPoliciesScm 'basicPublishingCredentialsPolicies' = { + resource basicPublishingCredentialsPoliciesScm 'basicPublishingCredentialsPolicies' = if (!exists) { name: 'scm' properties: { allow: false } } - resource configAuth 'config' = if (!(empty(clientAppId)) && !disableAppServicesAuthentication) { + resource configAuth 'config' = if (!exists && !(empty(clientAppId)) && !disableAppServicesAuthentication) { name: 'authsettingsV2' properties: { globalValidation: { @@ -174,7 +184,10 @@ resource applicationInsights 'Microsoft.Insights/components@2020-02-02' existing name: applicationInsightsName } -output id string = appService.id -output identityPrincipalId string = managedIdentity ? appService.identity.principalId : '' -output name string = appService.name -output uri string = 'https://${appService.properties.defaultHostName}' +// Choose correct reference for outputs +var appRef = exists ? appServiceExisting : appService + +output id string = resourceId('Microsoft.Web/sites', name) +output identityPrincipalId string = managedIdentity ? appRef.identity.principalId : '' +output name string = name +output uri string = 'https://${appRef.properties.defaultHostName}' diff --git a/infra/core/security/documentdb-sql-role.bicep b/infra/core/security/documentdb-sql-role.bicep index 3a8c2f74d1..beb9e75dc0 100644 --- a/infra/core/security/documentdb-sql-role.bicep +++ b/infra/core/security/documentdb-sql-role.bicep @@ -14,7 +14,7 @@ resource databaseAccount 'Microsoft.DocumentDB/databaseAccounts@2023-04-15' exis name: databaseAccountName } -resource sqlRoleAssignment 'Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments@2023-04-15' = { +resource sqlRoleAssignment 'Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments@2023-04-15' = if (!empty(principalId)) { name: guid(databaseAccount.id, principalId, roleDefinitionId) parent: databaseAccount properties: { diff --git a/infra/core/security/role.bicep b/infra/core/security/role.bicep index 0b30cfd344..244085ca93 100644 --- a/infra/core/security/role.bicep +++ b/infra/core/security/role.bicep @@ -11,7 +11,7 @@ param principalId string param principalType string = 'ServicePrincipal' param roleDefinitionId string -resource role 'Microsoft.Authorization/roleAssignments@2022-04-01' = { +resource role 'Microsoft.Authorization/roleAssignments@2022-04-01' = if (!empty(principalId)) { name: guid(subscription().id, resourceGroup().id, principalId, roleDefinitionId) properties: { principalId: principalId diff --git a/infra/main.bicep b/infra/main.bicep index da31b2b385..89863f2818 100644 --- a/infra/main.bicep +++ b/infra/main.bicep @@ -481,7 +481,6 @@ module backend 'core/host/appservice.bicep' = if (deploymentTarget == 'appservic name: !empty(backendServiceName) ? backendServiceName : '${abbrs.webSitesAppService}backend-${resourceToken}' location: location tags: union(tags, { 'azd-service-name': 'backend' }) - // Need to check deploymentTarget again due to https://github.com/Azure/bicep/issues/3990 appServicePlanId: deploymentTarget == 'appservice' ? appServicePlan.outputs.id : '' runtimeName: 'python' runtimeVersion: '3.11' @@ -499,6 +498,7 @@ module backend 'core/host/appservice.bicep' = if (deploymentTarget == 'appservic authenticationIssuerUri: authenticationIssuerUri use32BitWorkerProcess: appServiceSkuName == 'F1' alwaysOn: appServiceSkuName != 'F1' + exists: webAppExists appSettings: union(appEnvVariables, { AZURE_SERVER_APP_SECRET: serverAppSecret AZURE_CLIENT_APP_SECRET: clientAppSecret diff --git a/scripts/reindex_local.sh b/scripts/reindex_local.sh new file mode 100755 index 0000000000..f757981f23 --- /dev/null +++ b/scripts/reindex_local.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Directory containing files to index +SO_DIR="data" + +# POSIX extended regex patterns for file-name classification +# Solution Objects: slide decks 1-7, plus other technical assets (Gateway, Monitoring, Security, Fabric, etc.) +SO_PATTERN='((^[1-7] - )|(Premium|Fabric|Gateway|Monitoring|Security|Storage|Data Governance))' +# Employee Info: HR / policy / benefit docs +# Enable case-insensitive regex matching +shopt -s nocasematch +EI_PATTERN='(Employee|Handbook|Enrollment|Bonus|Career|Guide|Benefit|Onboarding|Periodic|Essentials|OE|[Gg]lossary)' + +# Build file lists by inspecting basenames +SO_FILES=() +EI_FILES=() +while IFS= read -r -d '' f; do + base="$(basename "$f")" + if [[ $base =~ ${EI_PATTERN} ]]; then + EI_FILES+=("$f") + else + SO_FILES+=("$f") + fi +done < <(find "$SO_DIR" -maxdepth 1 -type f -print0) + +if [[ ${#SO_FILES[@]} -eq 0 && ${#EI_FILES[@]} -eq 0 ]]; then + echo "No files found in $SO_DIR" >&2 + exit 1 +fi + +PREPDOCS_SCRIPT="app/backend/prepdocs.py" +if [[ ! -f $PREPDOCS_SCRIPT ]]; then + echo "prepdocs.py not found at $PREPDOCS_SCRIPT" >&2 + exit 1 +fi + +# Unset ADLS Gen2 variables to force local ingestion +unset AZURE_ADLS_GEN2_STORAGE_ACCOUNT AZURE_ADLS_GEN2_FILESYSTEM AZURE_ADLS_GEN2_FILESYSTEM_PATH + +# Index Solution Objects one-by-one +for f in "${SO_FILES[@]}"; do + echo "Indexing Solution Object: $f" + env LOADING_MODE_FOR_AZD_ENV_VARS=no-override \ + AZURE_ADLS_GEN2_STORAGE_ACCOUNT="" \ + AZURE_ADLS_GEN2_FILESYSTEM="" \ + AZURE_ADLS_GEN2_FILESYSTEM_PATH="" \ + python "$PREPDOCS_SCRIPT" -v --category "Solution Objects" "$f" +done + +# Index Employee Info one-by-one +for f in "${EI_FILES[@]}"; do + echo "Indexing Employee Info: $f" + env LOADING_MODE_FOR_AZD_ENV_VARS=no-override \ + AZURE_ADLS_GEN2_STORAGE_ACCOUNT="" \ + AZURE_ADLS_GEN2_FILESYSTEM="" \ + AZURE_ADLS_GEN2_FILESYSTEM_PATH="" \ + python "$PREPDOCS_SCRIPT" -v --category "Employee Info" "$f" +done + +echo "Reindexing complete." \ No newline at end of file