diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 11d185f4..a8e71251 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -7,6 +7,8 @@ FROM ghcr.io/astral-sh/uv:$UV_VERSION AS uv # Use Debian-based VS Code Dev Container as base FROM mcr.microsoft.com/vscode/devcontainers/base:$DEBIAN_VERSION +ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0 + # Install dependencies and Node.js 20+ from NodeSource RUN apt-get update \ && apt-get install -y --no-install-recommends \ diff --git a/README.md b/README.md index cfca0ead..271ba273 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ > [!WARNING] > **Important Update** -> We've made major updates to Agentic Content Processing that include breaking changes. If you need the previous version, you can still find it in the [v1 branch](https://github.com/microsoft/content-processing-solution-accelerator/tree/v1). +> We've made major updates to Agentic Content Processing that include breaking changes. If you need the previous version, you can still find it in the [v1 branch](https://github.com/microsoft/content-processing-solution-accelerator/tree/cps-v1). Process multi-document claims by extracting data from each document, applying schemas with confidence scoring, and generating AI-powered summaries and gap analysis across the entire claim. Upload multiple files — invoices, forms, images, contracts — to a single claim, and the solution automatically processes each document through a multi-modal content extraction pipeline, then orchestrates cross-document summarization and gap identification using an Agent Framework Workflow Engine. diff --git a/azure.yaml b/azure.yaml index 860ace84..3f34cb0e 100644 --- a/azure.yaml +++ b/azure.yaml @@ -1,22 +1,22 @@ -# # yaml-language-server: $schema=https://raw.githubusercontent.com/Azure/azure-dev/main/schemas/v1.0/azure.yaml.json -# metadata: -# template: azd-init@1.11.1 -name: content-processing - -requiredVersions: - azd: '>= 1.18.0' - -metadata: - template: content-processing@1.0 - name: content-processinge@1.0 - -hooks: - postprovision: - posix: - shell: sh - run: sed -i 's/\r$//' ./infra/scripts/post_deployment.sh; bash ./infra/scripts/post_deployment.sh - interactive: true - windows: - shell: pwsh - run: ./infra/scripts/post_deployment.ps1 - interactive: true +# # yaml-language-server: $schema=https://raw.githubusercontent.com/Azure/azure-dev/main/schemas/v1.0/azure.yaml.json +# metadata: +# template: azd-init@1.11.1 +name: content-processing + +requiredVersions: + azd: '>= 1.18.0 != 1.23.9' + +metadata: + template: content-processing@1.0 + name: content-processinge@1.0 + +hooks: + postprovision: + posix: + shell: sh + run: sed -i 's/\r$//' ./infra/scripts/post_deployment.sh; bash ./infra/scripts/post_deployment.sh + interactive: true + windows: + shell: pwsh + run: ./infra/scripts/post_deployment.ps1 + interactive: true diff --git a/docs/DeploymentGuide.md b/docs/DeploymentGuide.md index 345c1e88..acd6cf9a 100644 --- a/docs/DeploymentGuide.md +++ b/docs/DeploymentGuide.md @@ -274,6 +274,11 @@ azd auth login --tenant-id ### 4.2 Start Deployment +**NOTE:** If you are running the latest azd version (version 1.23.9), please run the following command. +```bash +azd config set provision.preflight off +``` + ```shell azd up ``` diff --git a/docs/TroubleShootingSteps.md b/docs/TroubleShootingSteps.md index 1673a894..182907fc 100644 --- a/docs/TroubleShootingSteps.md +++ b/docs/TroubleShootingSteps.md @@ -62,6 +62,7 @@ Use these as quick reference guides to unblock your deployments. | **InternalSubscriptionIsOverQuotaForSku/
ManagedEnvironmentProvisioningError** | Subscription quota exceeded for the requested SKU | Quotas are applied per resource group, subscriptions, accounts, and other scopes. For example, your subscription might be configured to limit the number of vCPUs for a region. If you attempt to deploy a virtual machine with more vCPUs than the permitted amount, you receive an error that the quota was exceeded.

For PowerShell, use the `Get-AzVMUsage` cmdlet to find virtual machine quotas:
`Get-AzVMUsage -Location "West US"`

Based on available quota you can deploy application otherwise, you can request for more quota | | **InsufficientQuota** | Not enough quota available in subscription | | | **MaxNumberOfRegionalEnvironmentsInSubExceeded** | Maximum Container App Environments limit reached for region |This error occurs when you attempt to create more **Azure Container App Environments** than the regional quota limit allows for your subscription. Each Azure region has a specific limit on the number of Container App Environments that can be created per subscription.

**Common Causes:**

**Resolution:**

**Reference:**
| +| **SkuNotAvailable** | Requested SKU not available in selected location or zone | This error occurs when the resource SKU you've selected (such as VM size) isn't available for the target location or availability zone.

**In this deployment**, the jumpbox VM defaults to `Standard_D2s_v5`. While this size is available in most regions, certain regions or zones may not support it.

**Resolution:**

**Reference:**
| | **SkuNotAvailable** | Requested SKU not available in selected location or zone | This error occurs when the resource SKU you've selected (such as VM size) isn't available for the target location or availability zone.

**In this deployment**, the jumpbox VM defaults to `Standard_D2s_v5`. While this size is available in most regions, certain regions or zones may not support it.

**Resolution:**
| | **Conflict - No available instances to satisfy this request** | Azure App Service has insufficient capacity in the region | This error occurs when Azure App Service doesn't have enough available compute instances in the selected region to provision or scale your app.

**Common Causes:**

**Resolution:**

**Reference:** [Azure App Service Plans](https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans) | @@ -121,6 +122,9 @@ Use these as quick reference guides to unblock your deployments. |-----------------|-------------|------------------| | **NetcfgSubnetRangeOutsideVnet** | Subnet IP range outside virtual network address space | | | **DisableExport_PublicNetworkAccessMustBeDisabled** | Public network access must be disabled when export is disabled | | +| **VMSizeIsNotPermittedToEnableAcceleratedNetworking** | VM size does not support accelerated networking | This error occurs when you attempt to enable accelerated networking on a VM size that does not support it. This deployment's jumpbox VM **requires** accelerated networking.

**Default VM size:** `Standard_D2s_v5` — supports accelerated networking.

**How this error happens:**

**Resolution:**
| +**NetworkSecurityGroupNotCompliantForAzureBastionSubnet** / **SecurityRuleParameterContainsUnsupportedValue** | NSG rules blocking required Azure Bastion ports | This error occurs when the Network Security Group (NSG) attached to `AzureBastionSubnet` explicitly denies inbound TCP ports 443 and/or 4443, which Azure Bastion requires for management and tunneling.

**How to reproduce:**

**Resolution:**
| +| **RouteTableCannotBeAttachedForAzureBastionSubnet** | Route table attached to Azure Bastion subnet | This error occurs because Azure Bastion subnet (`AzureBastionSubnet`) has a platform restriction that prevents route tables from being attached.

**How to reproduce:**

**Resolution:**
| | **VMSizeIsNotPermittedToEnableAcceleratedNetworking** | VM size does not support accelerated networking | This error occurs when you attempt to enable accelerated networking on a VM size that does not support it. This deployment's jumpbox VM **requires** accelerated networking.

**Default VM size:** `Standard_D2s_v5` — supports accelerated networking.

**How this error happens:**

**Resolution:**
| | **NetworkSecurityGroupNotCompliantForAzureBastionSubnet** / **SecurityRuleParameterContainsUnsupportedValue** | NSG rules blocking required Azure Bastion ports | This error occurs when the Network Security Group (NSG) attached to `AzureBastionSubnet` explicitly denies inbound TCP ports 443 and/or 4443, which Azure Bastion requires for management and tunneling.

**How to reproduce:**

**Resolution:**
| diff --git a/infra/main.bicep b/infra/main.bicep index affe8ff6..8fa3a1c6 100644 --- a/infra/main.bicep +++ b/infra/main.bicep @@ -829,6 +829,7 @@ module cognitiveServicePrivateEndpoint 'br/public:avm/res/network/private-endpoi } } + module avmAiServices_cu 'br/public:avm/res/cognitive-services/account:0.14.1' = { name: take('avm.res.cognitive-services.account.content-understanding.${solutionSuffix}', 64) diff --git a/src/ContentProcessor/requirements.txt b/src/ContentProcessor/requirements.txt index 58a35767..ad3cdbae 100644 --- a/src/ContentProcessor/requirements.txt +++ b/src/ContentProcessor/requirements.txt @@ -11,7 +11,7 @@ charset-normalizer==3.4.4 click==8.3.1 colorama==0.4.6 coverage==7.13.1 -cryptography==46.0.3 +cryptography==46.0.5 dnspython==2.8.0 idna==3.11 iniconfig==2.3.0 @@ -23,7 +23,7 @@ numpy==2.4.1 packaging==25.0 pandas==2.3.3 pdf2image==1.17.0 -pillow==12.1.0 +pillow==12.1.1 pluggy==1.6.0 poppler-utils==0.1.0 pycparser==2.23 diff --git a/src/ContentProcessorAPI/requirements.txt b/src/ContentProcessorAPI/requirements.txt index b3a315f9..2a3a8f83 100644 --- a/src/ContentProcessorAPI/requirements.txt +++ b/src/ContentProcessorAPI/requirements.txt @@ -40,7 +40,7 @@ pygments==2.19.2 pyjwt==2.10.1 pymongo==4.16.0 python-dotenv==1.2.1 -python-multipart==0.0.21 +python-multipart==0.0.22 pyyaml==6.0.3 requests==2.32.5 rich==14.2.0 diff --git a/src/ContentProcessorWeb/package.json b/src/ContentProcessorWeb/package.json index 2d208d97..7d0a412b 100644 --- a/src/ContentProcessorWeb/package.json +++ b/src/ContentProcessorWeb/package.json @@ -11,7 +11,7 @@ "@fluentui/react-dialog": "^9.16.6", "@fluentui/react-icons": "^2.0.245", "@reduxjs/toolkit": "^2.11.2", - "axios": "^1.13.2", + "axios": "^1.13.5", "babel-preset-react-app": "^10.1.0", "contentprocessor_web": "file:", "cra-template-typescript": "1.3.0", diff --git a/src/ContentProcessorWeb/pnpm-lock.yaml b/src/ContentProcessorWeb/pnpm-lock.yaml index 2cd21bce..49888f65 100644 --- a/src/ContentProcessorWeb/pnpm-lock.yaml +++ b/src/ContentProcessorWeb/pnpm-lock.yaml @@ -37,8 +37,8 @@ importers: specifier: ^2.11.2 version: 2.11.2(react-redux@9.2.0(@types/react@18.3.28)(react@18.3.1)(redux@5.0.1))(react@18.3.1) axios: - specifier: ^1.13.2 - version: 1.13.4 + specifier: ^1.13.5 + version: 1.14.0 babel-preset-react-app: specifier: ^10.1.0 version: 10.1.0 @@ -2569,8 +2569,8 @@ packages: resolution: {integrity: sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==} engines: {node: '>=4'} - axios@1.13.4: - resolution: {integrity: sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==} + axios@1.14.0: + resolution: {integrity: sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==} axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} @@ -5468,8 +5468,9 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} psl@1.15.0: resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} @@ -10206,11 +10207,11 @@ snapshots: axe-core@4.11.1: {} - axios@1.13.4: + axios@1.14.0: dependencies: follow-redirects: 1.15.11 form-data: 4.0.5 - proxy-from-env: 1.1.0 + proxy-from-env: 2.1.0 transitivePeerDependencies: - debug @@ -10601,7 +10602,7 @@ snapshots: '@fluentui/react-dialog': 9.16.6(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) '@fluentui/react-icons': 2.0.318(react@18.3.1) '@reduxjs/toolkit': 2.11.2(react-redux@9.2.0(@types/react@18.3.28)(react@18.3.1)(redux@5.0.1))(react@18.3.1) - axios: 1.13.4 + axios: 1.14.0 babel-preset-react-app: 10.1.0 cra-template-typescript: 1.3.0 i18next: 25.8.4(typescript@4.9.5) @@ -13643,7 +13644,7 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 - proxy-from-env@1.1.0: {} + proxy-from-env@2.1.0: {} psl@1.15.0: dependencies: @@ -13896,7 +13897,7 @@ snapshots: react-tiff@0.0.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - axios: 1.13.4 + axios: 1.14.0 i18next: 22.5.1 react: 18.3.1 react-i18next: 12.3.1(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) diff --git a/src/ContentProcessorWeb/public/favicon.ico b/src/ContentProcessorWeb/public/favicon.ico deleted file mode 100644 index bfe873eb..00000000 Binary files a/src/ContentProcessorWeb/public/favicon.ico and /dev/null differ diff --git a/src/ContentProcessorWeb/public/index.html b/src/ContentProcessorWeb/public/index.html index d742af0e..6f5a3520 100644 --- a/src/ContentProcessorWeb/public/index.html +++ b/src/ContentProcessorWeb/public/index.html @@ -2,7 +2,6 @@ - - - Content Processor diff --git a/src/ContentProcessorWeb/src/Pages/DefaultPage/Components/ProcessQueueGrid/ProcessQueueGrid.tsx b/src/ContentProcessorWeb/src/Pages/DefaultPage/Components/ProcessQueueGrid/ProcessQueueGrid.tsx index fae31bc1..e4f0193f 100644 --- a/src/ContentProcessorWeb/src/Pages/DefaultPage/Components/ProcessQueueGrid/ProcessQueueGrid.tsx +++ b/src/ContentProcessorWeb/src/Pages/DefaultPage/Components/ProcessQueueGrid/ProcessQueueGrid.tsx @@ -17,13 +17,10 @@ import { } from "@fluentui/react-icons"; import { Tooltip, Button } from "@fluentui/react-components"; import { - TableBody, - TableCell, - TableRow, - Table, - TableHeader, - TableHeaderCell, - TableCellLayout, + TableBody, TableCell, TableRow, Table, + TableHeader, TableHeaderCell, TableCellLayout, createTableColumn, useTableFeatures, + useTableSelection, useTableSort, TableColumnId, + TableRowId } from "@fluentui/react-components"; import { useDispatch, useSelector, shallowEqual } from "react-redux"; diff --git a/src/ContentProcessorWeb/src/msal-auth/AuthWrapper.tsx b/src/ContentProcessorWeb/src/msal-auth/AuthWrapper.tsx index 8d4bac08..35ff9023 100644 --- a/src/ContentProcessorWeb/src/msal-auth/AuthWrapper.tsx +++ b/src/ContentProcessorWeb/src/msal-auth/AuthWrapper.tsx @@ -6,7 +6,6 @@ * until the user is authenticated and a token is available. */ import React, { useEffect } from "react"; - import { InteractionStatus } from "@azure/msal-browser"; import useAuth from './useAuth';