Skip to content

Releases: Azure-Samples/azure-search-openai-demo

2026-02-06: Port from Prompty to Jinja2 for prompt templating

06 Feb 17:01
fd6853c

Choose a tag to compare

We were previously using Prompty for prompt templating. We have moved from Prompty to Jinja2 since we are preparing to move from Chat Completions to Responses (which Prompty does not support), plus Prompty did not achieve wide community adoption. Jinja2 is a widely supported templating framework, and Prompty was based off Jinja2, so the prompt templates look similar. However, we are only using Jinja2 to template individual messages, not the entire conversation like before.

What's Changed

  • Fix multimodal image download from non-default blob container by @pamelafox in #2951
  • Bump certifi from 2024.7.4 to 2026.1.4 by @dependabot[bot] in #2949
  • Bump pyjwt from 2.10.1 to 2.11.0 by @dependabot[bot] in #2948
  • Revert Yarn GPG workaround and use built-in devcontainer image by @Copilot in #2956
  • Fix ty type checker errors breaking nightly jobs by @Copilot in #2958
  • Migrate from Prompty to Jinja2 for prompt templates by @pamelafox in #2953

Full Changelog: 2026-01-27...2026-02-06

ACL support for cloud ingestion pipeline

27 Jan 18:11
2e8185b

Choose a tag to compare

This release adds Access Control List (ACL) support for the cloud ingestion pipeline, enabling document-level security filtering in Azure AI Search. Documents stored in Azure Data Lake Storage Gen2 can now have their ACLs automatically extracted during indexing.

Screenshot 2026-01-27 at 10 48 43 AM

⚠️ Breaking change: ADLS local file strategy removed

IMPORTANT: The previous "ADLS local file strategy" (using prepdocs directly against Azure Data Lake Storage) has been deprecated and removed. If you were using that approach in earlier versions of this sample, you must migrate to the cloud ingestion flow described in Cloud ingestion with Azure Data Lake Storage Gen2, which runs ingestion in Azure Functions and the Azure AI Search indexer instead of on the client machine.

How it works

Cloud ingestion with ACLs

  • Automatic ACL extraction from ADLS Gen2 files during indexing
  • Extracts user IDs (oids) and group IDs (groups) with read permission
  • Supports global document access via the ADLS "other" ACL entry when AZURE_ENABLE_GLOBAL_DOCUMENT_ACCESS=true
  • Indexes document chunks in Azure AI Search with oids and groups fields

Bring Your Own (BYO) ADLS Storage Account

  • Use an existing ADLS Gen2 account instead of provisioning a new one
  • Support for ADLS accounts in different resource groups
  • Automatic RBAC role assignment at the storage account level

New environment variables

Variable Description
USE_CLOUD_INGESTION_ACLS Enable ACL extraction from ADLS Gen2 (requires USE_CLOUD_INGESTION=true)
USE_EXISTING_ADLS_STORAGE Use an existing ADLS account instead of provisioning a new one
AZURE_ADLS_GEN2_STORAGE_ACCOUNT Name of the ADLS storage account (required when USE_EXISTING_ADLS_STORAGE=true)
AZURE_ADLS_GEN2_STORAGE_RESOURCE_GROUP Resource group for BYO ADLS (optional, defaults to main resource group)

Migration guide

If you were previously using the ADLS local file strategy:

  1. Set USE_CLOUD_INGESTION=true and USE_CLOUD_INGESTION_ACLS=true
  2. Un-comment the function lines in azure.yaml.
  3. Run azd up to deploy the cloud ingestion Azure Functions
  4. Upload documents to the ADLS storage account (check AZURE_ADLS_STORAGE_ACCOUNT output)
  5. Set ACLs on files using Azure Storage Explorer
  6. Run setup_cloud_ingestion.sh to trigger the indexer
  7. Run scripts/verify_search_index_acls.py to verify ACL filtering is working correctly.

See the updated login_and_acl.md for complete setup instructions.

What's changed

Full Changelog: 2026-01-26...2026-01-27

2026-01-26: "Stop" button in chat frontend

27 Jan 07:23
8292fbe

Choose a tag to compare

This release includes these two changes to the frontend:

  1. Stop button for streaming responses (#2909) - Users can now cancel AI responses mid-generation using a new stop button. Helpful when the response isn't useful or you want to ask a different question.
  2. No more chat input length limit (#2908) - Removed the frontend 1000-character cap on chat input. The text area now auto-grows and scrolls, letting users paste long prompts. Backend context window errors are properly surfaced if limits are reached.

This release makes one bug fix for developers using manageacl.py:

  • ACL management permissions fix (#2912) - Fixed manageacl.py to use x-ms-enable-elevated-read header when querying documents, allowing the script to see documents without ACLs yet.

This release includes these improvements to development tools used with the repo:

  • Migrated from mypy to ty type checker (#2911) - upgraded to the much faster type checker.
  • Updated chat agents configuration (#2907) - Ported VS Code chat modes to the new chat agents format.
  • DevContainer fix (#2931) - Removed Yarn repo with expired GPG key that was breaking devcontainer builds for GitHub Codespaces.

Many packages were also upgraded, per the PRs below.

What's Changed

Full Changelog: 2026-01-12...2026-01-26

2026-01-12: Deprecation of "Ask" tab

12 Jan 17:19
9188793

Choose a tag to compare

Since the beginning of this repo, we've always had two tabs, "Chat" and "Ask". The "Chat" tab was always the most popular, since it allowed for multi-turn conversations. Since the existence of the two tabs greatly complicated the code and many developers deleted the "Ask" tab in their forks, we decided to deprecate the "Ask" tab entirely. This will allow us to focus more on the code that everyone is using.

Note that currently there's still a class hierarchy in the backend code of Approach -> ChatReadRetrieveApproach. We may decide to flatten that hierarchy since there's only sone subclass of Approach now, but that is a larger change, so if we do that, it will be a separate change.

What's Changed

Full Changelog: 2026-01-09...2026-01-12

2026-01-09: Bug fixes and dependency updates

10 Jan 06:48
7a1b6ea

Choose a tag to compare

This release includes several bug fixes and improvements. Key fixes address issues with the web knowledge source (removing unsupported snippet and description fields), the VS Code debug launch configuration on Windows, and role assignments for the free Azure Search SKU. Infrastructure improvements include resolving all Bicep warnings, increasing embedding TPM capacity for cloud ingestion, and changing cloud ingestion to download blobs based on path rather than file data.

The release also includes multiple dependency updates for both backend (aiohttp, werkzeug, pypdf, urllib3) and frontend (react-router-dom) packages, along with documentation updates and a new VS Code for the Web badge in the README.

What's Changed

  • Remove snippet from WebResult since the web source does not provide it by @pamelafox in #2843
  • Remove description from web knowledge source by @pamelafox in #2844
  • Bump the github-actions group with 2 updates by @dependabot[bot] in #2839
  • Increase embedding TPM capacity and add note in cloud ingestion guide by @pamelafox in #2846
  • Update setup instructions in login_and_acl.md by @pamelafox in #2851
  • Resolve all Bicep warnings by @pamelafox in #2854
  • Change cloud ingestion to download blobs based off path versus file data by @pamelafox in #2858
  • Fix last exit code issue by @mattgotteiner in #2873
  • Bump the github-actions group with 2 updates by @dependabot[bot] in #2874
  • Skip role assignments for free Azure Search SKU (#2848) by @bnodir in #2886
  • Restore azure-functions dependency for Azure Functions apps by @pamelafox in #2896
  • Fix VS Code debug launch configuration for Windows by @bf-2026 in #2884
  • Bump aiohttp from 3.12.14 to 3.13.3 in /app/backend by @dependabot[bot] in #2887
  • Bump werkzeug from 3.1.3 to 3.1.5 in /app/backend by @dependabot[bot] in #2890
  • Bump pypdf from 6.1.3 to 6.6.0 in /app/backend by @dependabot[bot] in #2894
  • Bump urllib3 from 2.5.0 to 2.6.3 in /app/backend by @dependabot[bot] in #2888
  • Bump types-html5lib from 1.1.11.20241018 to 1.1.11.20251014 by @dependabot[bot] in #2815
  • Bump isodate from 0.6.1 to 0.7.2 by @dependabot[bot] in #2814
  • Bump zipp from 3.21.0 to 3.23.0 by @dependabot[bot] in #2813
  • Bump mdast-util-to-hast from 13.2.0 to 13.2.1 in /app/frontend by @dependabot[bot] in #2852
  • Bump react-router-dom from 6.28.0 to 7.9.5 in /app/frontend by @dependabot[bot] in #2812
  • Bump react-router and react-router-dom in /app/frontend by @dependabot[bot] in #2897
  • Add VS Code for the Web badge to README by @Copilot in #2871

New Contributors

Full Changelog: 2025-11-18...2026-01-09

2025-11-18: Agentic knowledge base with Bing + SharePoint options

18 Nov 19:30
09dd0ef

Choose a tag to compare

This release upgrades the agentic retrieval feature to use Azure AI Search's new Knowledge Base functionality, which provides enhanced intelligent document retrieval with configurable reasoning levels and support for multiple knowledge sources including web and SharePoint.

Screenshot 2025-11-18 at 11 27 41 AM

Knowledge Base changes

  • Upgraded from Knowledge Agent to Knowledge Base: The feature now uses the new KnowledgeBaseRetrievalClient from Azure AI Search, replacing the legacy KnowledgeAgentRetrievalClient
  • Added multiple reasoning level options: Choose between minimal, low, or medium reasoning effort for retrieval
    • Minimal: Most similar to current search() call, where we bring our own query planning to generate a single query
    • Low: Adds a query planning step that's built into AI Search and can suggest multiple queries for complex queries
    • Medium: Adds an optional iteration step if an AI Search model determines results aren't good enough

The feature supports three kinds of sources:

  • Search Index (default): Searches documents in your Azure AI Search index. We currently only support one index, but you can modify the code to bring in additional indices if desired. We may add a YAML config for multiple indices in future.
  • Web Source (optional): Enables searching the public web for information
    • ⚠️ Requires answer synthesis mode (disables streaming, follow-up questions, and some LLM customizations)
    • ⚠️ Microsoft Data Protection Addendum doesn't apply to data sent to Web Knowledge Source
  • SharePoint Source (optional): Searches SharePoint documents using on-behalf-of flow
    • Requires authentication to be enabled
    • Requires users to have a Microsoft Copilot license

Environment variable changes

New environment variables for deployment configuration:

  • USE_AGENTIC_KNOWLEDGEBASE: Enable the knowledge base feature (replaces USE_AGENTIC_RETRIEVAL)
  • AZURE_SEARCH_KNOWLEDGEBASE_RETRIEVAL_REASONING_EFFORT: Set default reasoning level (minimal, low, or medium)
  • USE_WEB_SOURCE: Enable web knowledge source
  • USE_SHAREPOINT_SOURCE: Enable SharePoint knowledge source
  • AZURE_OPENAI_KNOWLEDGEBASE_DEPLOYMENT: Specify the deployment for knowledge base
  • AZURE_OPENAI_KNOWLEDGEBASE_MODEL: Specify the model (default: gpt-4.1-mini)
  • AZURE_OPENAI_KNOWLEDGEBASE_MODEL_VERSION: Specify the model version

⚠️ If you were using the previous agentic retrieval feature (USE_AGENTIC_RETRIEVAL), you must change USE_AGENTIC_RETRIEVALUSE_AGENTIC_KNOWLEDGEBASE

UI enhancements

  • Developer settings: New options for toggling sources and changing reasoning level.
Screenshot 2025-11-18 at 11 24 18 AM
  • Thought Process: Now includes:
    • Token usage for the planning process
    • Generated search queries
    • Activity details for each source citation
Screenshot 2025-11-18 at 11 23 03 AM

Documentation

See docs/agentic_retrieval.md for complete deployment and configuration instructions.


All changes included in this release

Full Changelog: 2025-11-12...2025-11-18

2025-11-12: Cloud ingestion pipeline with custom skills (Azure Functions)

12 Nov 19:32
eb4b4e2

Choose a tag to compare

We're excited to announce a new cloud ingestion option that enables scalable, automated document processing using Azure Functions as custom skills within an Azure AI Search indexer pipeline. This repo previously supported an "integrated vectorization" strategy that used built-in skills for document extraction and splitting, but this new approach uses custom skills that use our own approach to document extraction and splitting. You can now use either local ingestion or cloud ingestion and get the same results.

This diagram shows the overall ingestion pipeline:

Screenshot 2025-11-12 at 10 28 17 AM

The indexer uses this skill sequence:

  1. Document Extractor - Parses source documents (PDFs, HTML, Office files, images) and extracts text, tables, and figure metadata
  2. Figure Processor - Enriches figures with AI-generated descriptions, uploads images to Blob Storage, and computes embeddings (when multimodal is enabled)
  3. Shaper Skill - Consolidates enriched data from multiple processing paths into a unified document structure
  4. Text Processor - Merges figures with text, performs sentence-aware chunking, and generates embeddings for vector search

The implementation required significant refactoring to maximize code reuse between local and cloud ingestion:

  • Extracted shared setup logic into servicesetup.py
  • Created standalone modules for figure processing (figureprocessor.py) and text processing (textprocessor.py)
  • Bicep templates for Function App deployment with proper authentication

To enable the new feature, see the this guide. Please provide feedback in the issue tracker.

What's Changed

  • Cloud ingestion strategy with prepdocs as custom skillset for Azure AI Search Blob Indexer by @pamelafox in #2819

Full Changelog: 2025-11-03...2025-11-12

2025-11-03: Port from AzureOpenAI to OpenAI constructors

03 Nov 19:44
4d933cc

Choose a tag to compare

Thanks to a recent improvement in the openai Python SDK and changes in the Azure OpenAI endpoint, we can now use OpenAI to connect to AzureOpenAI endpoint. The new Azure OpenAI endpoint is at "/openai/v1/" and does not accept an API version parameter, so we were able to remove the API version parameter entirely from this codebase, and simplify the code to only use the OpenAI() constructor.

If you merge in this change and see an OpenAI connection error locally, please make sure you have upgraded your local openai package version. You must have the version that accepts a token provider callback as the api_key parameter, otherwise you'll get an error about incorrect key/resource.

What's Changed

  • Migrate AzureOpenAI constructors to standard OpenAI client by @Copilot in #2752

Full Changelog: 2025-10-29...2025-11-03

2025-10-29: Support Python 3.14 and drop support for 3.9

29 Oct 19:18
b7a2743

Choose a tag to compare

Python 3.14 is now the default version of Python downloaded from Python.org. We've upgraded all packages so that they should work in Python 3.14 environments. We've dropped 3.9 since it is reaching end-of-life and since many packages dropped 3.9 support when they added 3.14 support (like Pillow). Please update your local development environments to run at least 3.10.

What's Changed

  • Bump flask from 3.0.3 to 3.1.2 by @dependabot[bot] in #2803
  • Bump httpx from 0.27.0 to 0.28.1 by @dependabot[bot] in #2810
  • Bump @types/dom-speech-recognition from 0.0.4 to 0.0.7 in /app/frontend by @dependabot[bot] in #2807
  • Add Python 3.14 support and drop Python 3.9 by @Copilot in #2787
  • Bump click from 8.1.8 to 8.3.0 in the pallets group by @dependabot[bot] in #2808
  • Bump the github-actions group across 1 directory with 4 updates by @dependabot[bot] in #2783

Full Changelog: 2025-10-28...2025-10-29

2025-10-28: Upgraded ACLs to use Azure AI Search Query-time ACL

28 Oct 22:01
b09278d

Choose a tag to compare

This release makes a significant change to our optional ACL feature, which builds on the login feature.

Previously we implemented access controls by storing oids and groups in the search index for each chunk, and dynamically building a search filter based off the oids/groups in the logged in user's token.
Now, Azure AI Search has built-in support to filter documents based off a user's token, so we keep the same index setup, but we delegate the filtering to the AI Search query itself.
If you already have the ACL feature enabled, you should be able to pull in the new changes, run "azd up", and have prepdocs setup the new permission filtering option on the index. If you have the AZURE_ENABLE_GLOBAL_DOCUMENT_ACCESS option enabled, then you'll also need to run the migration script to explicitly add a global identifier to the ACLs for those documents. Please also ensure that your azd environment has AZURE_ENFORCE_ACCESS_CONTROL, as we discovered some code paths weren't requiring that before (but do now).

If you are new to using the feature, please read through the login and ACLs guide to learn more.

What's Changed

New Contributors

Full Changelog: 2025-09-11...2025-10-28