<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Azure Tech]]></title><description><![CDATA[Azure Tech]]></description><link>https://azure-tech.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 16:35:52 GMT</lastBuildDate><atom:link href="https://azure-tech.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Centralised AI Model Management with Azure Foundry AI Model Gateway Connections]]></title><description><![CDATA[Microsoft Azure now offers a capability to link an Azure Foundry project to another via an AI Gateway.This provides a pattern with which AI models can be centralised and then shared with governance an]]></description><link>https://azure-tech.hashnode.dev/centralised-ai-model-management-with-azure-foundry-ai-model-gateway-connections</link><guid isPermaLink="true">https://azure-tech.hashnode.dev/centralised-ai-model-management-with-azure-foundry-ai-model-gateway-connections</guid><category><![CDATA[azure-foundry]]></category><category><![CDATA[ai gateway]]></category><category><![CDATA[model gateway connection]]></category><dc:creator><![CDATA[AzureEngBR]]></dc:creator><pubDate>Mon, 04 May 2026 21:09:59 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6729f84aaa53eae084a70587/ee0ea492-296d-4f06-a0a5-572b3b26ab61.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Microsoft Azure now offers a capability to link an Azure Foundry project to another via an AI Gateway.<br />This provides a pattern with which AI models can be centralised and then shared with governance and monitoring to other consuming Azure Foundry projects.</p>
<p>Previously, the lack of this capability has resulted in large organisations and enterprises needing to centrally govern Azure AI model usage via an AI gateway for compliance, governance and monitoring purposes having limited capabilities to do so.<br />This also prevented organisations using AI gateways from accessing the benefits of rapid prototyping and producing proof-of-concept solutions at pace using Azure Foundry no-code or low-code functionality.</p>
<h2>The Pattern</h2>
<img alt="" style="display:block;margin:0 auto" />

<p>The usage pattern has the three following components (from right to left):</p>
<ul>
<li><p><strong>Azure Foundry - Core Instance and Project</strong><br />This is the centrally governed Azure Foundry item. It is where models are setup and managed and governance configuration is setup.</p>
</li>
<li><p><strong>Azure API Management</strong><br />This is an Azure API management instance configured to function as an AI Gateway, managing and monitoring AI inference access to the core Azure Foundry instance.</p>
</li>
<li><p><strong>Azure Foundry - Client Instance and Project</strong><br />This is the client Azure Foundry instance that could be used for a variety of purposes within the organisation such as solution development.<br />It does not have any models deployed directly within it.</p>
<p>The Client Azure Foundry instance &amp; project has a model gateway connection configured within it which redirects internal model calls to the Azure API Management service. The Azure API management service in turn redirects calls back and forth with the Azure Foundry core instance.</p>
</li>
</ul>
<h2>Example Implementation</h2>
<p>Details for an example implementation using Model Gateway Connection functionality with a self-managed APIM instance can be found here:</p>
<p><a href="https://github.com/bdazuretech/foundry-apim-mg-example">bdazuretech/foundry-apim-mg-example: An example foundry API Management AI Gateway implementation using model gateway configuration</a></p>
<h2>Further Information</h2>
<p>The following resources provide further details for Azure Foundry Model Gateway Connection setup and usage.</p>
<ul>
<li><p><a href="https://learn.microsoft.com/en-us/azure/foundry/agents/how-to/ai-gateway?tabs=other-sources&amp;pivots=foundry-portal">Bring Your Own Model to Foundry Agent Service - Microsoft Foundry | Microsoft Learn</a></p>
</li>
<li><p><a href="https://github.com/microsoft-foundry/foundry-samples/blob/main/infrastructure/infrastructure-setup-bicep/01-connections/apim-and-modelgateway-integration-guide.md">foundry-samples/infrastructure/infrastructure-setup-bicep/01-connections/</a><a href="http://apim-and-modelgateway-integration-guide.md">apim-and-modelgateway-integration-guide.md</a> <a href="https://github.com/microsoft-foundry/foundry-samples/blob/main/infrastructure/infrastructure-setup-bicep/01-connections/apim-and-modelgateway-integration-guide.md">at main · microsoft-foundry/foundry-samples</a></p>
</li>
<li><p><a href="https://github.com/microsoft-foundry/foundry-samples/blob/main/infrastructure/infrastructure-setup-bicep/01-connections/model-gateway/README.md">foundry-samples/infrastructure/infrastructure-setup-bicep/01-connections/model-gateway/</a><a href="http://README.md">README.md</a> <a href="https://github.com/microsoft-foundry/foundry-samples/blob/main/infrastructure/infrastructure-setup-bicep/01-connections/model-gateway/README.md">at main · microsoft-foundry/foundry-samples</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Unlocking the Power of Azure: Azure AI Search Integrated Vectorisation with API Management and Azure Open AI]]></title><description><![CDATA[Currently Azure AI Search includes functionality to autonomously index documents and generate embeddings for use within Azure Open AI queries.However, there is not currently built-in functionality to ]]></description><link>https://azure-tech.hashnode.dev/unlocking-the-power-of-azure-azure-ai-search-integrated-vectorisation-with-api-management-and-azure-open-ai</link><guid isPermaLink="true">https://azure-tech.hashnode.dev/unlocking-the-power-of-azure-azure-ai-search-integrated-vectorisation-with-api-management-and-azure-open-ai</guid><category><![CDATA[Azure]]></category><category><![CDATA[Azure OpenAI]]></category><category><![CDATA[Azure API Management]]></category><dc:creator><![CDATA[AzureEngBR]]></dc:creator><pubDate>Wed, 07 May 2025 20:44:49 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1746651014141/7f3d401a-3953-4d6e-9326-d5c583e9954f.avif" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Currently Azure AI Search includes functionality to autonomously index documents and generate embeddings for use within Azure Open AI queries.<br />However, there is not currently built-in functionality to autonomously ‘enrich‘ document data within Azure AI Search where API Management is governing access to Azure Open AI.</p>
<p>Many enterprises are looking for patterns to govern and manage access to their Azure Open AI resources, one such pattern is to place Azure API Management in front of Azure Open AI providing a governance gateway.<br />Solutions requiring access to Azure Open AI for embedding and completion operations must therefore communicate via Azure API Management, including Azure AI Search.</p>
<p>This blog covers a pattern that allows Azure AI Search Integrated Vectorisation to undertake the generation of document embedding data using Azure Open AI where Azure API Management is present as middleware.</p>
<h1>The Pattern</h1>
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732222085258/356177fc-dec0-4f78-ab8e-d9488ba2e376.png" alt="" style="display:block;margin:0 auto" />

<p>The goal of this pattern is to enable the Azure Search Indexer to generate embeddings using a skillset definition that points to Azure API Management.<br />The Azure API Management method in-turn relays the embeddings requests back and forth to Azure Open AI. The indexer then places the embedding vector data into the AI Search Index.<br />The steps within the process are listed in more detail below:</p>
<ol>
<li><p>An Azure AI Search Indexer run is initiated, reading a document from the configured Data Source.<br /> The Skillset attached to the indexer has a ‘CustomWebAPISkill’ defined to generate embeddings, with a URI and credentials pointing to the API Management ‘Embeddings for Azure Search‘ endpoint.<br /> JSON data is sent to the API Management method by the Indexer.</p>
</li>
<li><p>The API Management endpoint ‘Embeddings for Azure Search‘ receives the strings to have embeddings generated for, records the ‘recordId’ values, transforms the JSON body to that expected by Azure Open AI and forwards on the request to Azure Open AI.</p>
</li>
<li><p>Azure Open AI receives the embedding request from API Management, generates the embedding data and sends the response back to the API Management resource.</p>
</li>
<li><p>The API Management resource receives and transforms the embedding data from Azure Open AI, placing the ‘recordId’s’ from the original input back onto the collection elements, ensuring the JSON schema is of a format expected by the Azure Search indexer.<br /> The response is then forwarded back to the indexer which stores the embedding data, along with the document metadata into the AI Search Index.</p>
</li>
</ol>
<h2>Challenges and Solutions</h2>
<ol>
<li><p>Azure AI Search indexers have no built-in support for generating embedded data where API Management is governing access to Azure Open AI.</p>
</li>
<li><p>An Azure AI Search Skillset can be pointed to an API Management method, however a ‘CustomWebAPISkill’ is required.</p>
</li>
<li><p>An Azure AI Search Skillset using a ‘CustomWebAPISkill’ for enrichment has a fixed input and output JSON schema that significantly differs from that used by Azure Open AI embeddings. Manipulation of the body data within API Management is required inbound and outbound.</p>
</li>
<li><p>The Azure AI Search Indexer passes ‘recordId’ values for each item within the JSON body which should be relayed back onto the same data blocks after Azure Open AI has generated the embedding values. This ensures existing enriched data can be updated. API Management processing must handle this ID mapping.</p>
</li>
<li><p>Azure API Management requires unique method names for it’s inputs and replays the method name to the output. Adding a new method e.g. ‘embeddingsForSearch’ would result in the request being sent to Azure Open AI at the same address which Azure Open AI does not support.<br /> The API Management resource must therefore be configured to ‘Rewrite’ the URL to simply be ‘embeddings‘ for the backend Azure Open AI call.</p>
</li>
</ol>
<h2>Implementation</h2>
<p><em><strong>Note: The examples shown below are provided ‘as-is’ as a proof-of-concept and should not be considered for production use.</strong></em></p>
<h3>Assumptions</h3>
<ol>
<li><p>Azure AI Search, Azure APIM and Azure Open AI Services have been deployed.</p>
</li>
<li><p>Azure APIM has been configured with the built-in Azure Open AI configuration.</p>
</li>
<li><p>Azure Open AI has the ‘text-embedding-ada-002‘ model deployed.</p>
</li>
</ol>
<h3>Azure AI Search Configuration</h3>
<p><strong>Skillset</strong></p>
<pre><code class="language-json">{
    "name": "test-skillset",
    "description": "Skillset to chunk documents and generate embeddings",
    "skills": [
    {
        "@odata.type": "#Microsoft.Skills.Text.SplitSkill",
        "name": "#1",
        "description": "Split skill to chunk documents",
        "context": "/document",
        "inputs": [
         {
            "name": "text",
            "source": "/document/content",
            "inputs": []
         }
        ],
        "outputs": [
         {
            "name": "textItems",
            "targetName": "pages"
         }
        ],
        "defaultLanguageCode": "en",
        "textSplitMode": "pages",
        "maximumPageLength": 200,
        "pageOverlapLength": 5,
        "unit": "characters"
    },
    {
        "@odata.type": "#Microsoft.Skills.Custom.WebApiSkill",
        "name": "#2",
        "description": "APIM Embedding",
        "context": "/document/pages/*",
        "inputs": [
         {
            "name": "text",
            "source": "/document/pages/*",
            "inputs": []
         },
        "outputs": [
          {
            "name": "vector",
            "targetName": "vector"
           }
        ],
        "uri": "https://{APIMSERVICENAME}.azure-api.net/openai/deployments/text-embedding-ada-002/embeddings-ai-search?api-version=2023-05-15",
        "httpHeaders": {
            "{APIMHEADERKEYNAME}": "{APIMHEADERKEYVALUE}"
        },
        "httpMethod": "POST",
        "timeout": "PT30S",
        "batchSize": 5
     }
    ],
    "@odata.etag": "\"0x8DCFCEB6F53B10F\"",
    "indexProjections": {
     "selectors": [
      {
        "targetIndexName": "index1",
        "parentKeyFieldName": "parent_id",
        "sourceContext": "/document/pages/*",
        "mappings": [
         {
            "name": "vector",
            "source": "/document/pages/*/vector"
         },
         {
            "name": "chunk",
            "source": "/document/pages/*"
         },
         {
            "name": "metadata_storage_path",
            "source": "/document/metadata_storage_path"
         },
         {
            "name": "title",
            "source": "/document/title"
         }
        ]
        }
    ],
    "parameters": {
        "projectionMode": "skipIndexingParentDocuments"
    }
  }
}
</code></pre>
<p>Parameters</p>
<ul>
<li><p>{APIMSERVICENAME} - The name of the APIM service that forms part of the URL to access it.</p>
</li>
<li><p>{APIMHEADERKEYNAME} - The APIM header key name used for authentication.</p>
</li>
<li><p>{APIMHEADERKEYVALUE} - The APIM header key value used for authentication.</p>
</li>
</ul>
<p><strong>Index</strong></p>
<p><strong>Indexer</strong></p>
<pre><code class="language-json">{
    "@odata.context":"https://{CONTEXTNAME}/\(metadata#indexers/\)entity",
    "@odata.etag":"\"0x8DCFCEBAA8B8DFC\"",
    "name":"indexer1",
    "description":null,
    "dataSourceName":"{DATASOURCENAME}",
    "skillsetName":"{SKILLSETNAME}",
    "targetIndexName":"{INDEXNAME}",
    "disabled":null
    "schedule":null,
    "parameters":{
     "batchSize":1,
     "maxFailedItems":null,
     "maxFailedItemsPerBatch":null,
     "base64EncodeKeys":null,
     "configuration":{
        "dataToExtract":"contentAndMetadata",
        "parsingMode":"default"
     }
    },
    "fieldMappings":[
     {
        "sourceFieldName":"metadata_storage_name",
        "targetFieldName":"title",
        "mappingFunction":null
     }
    ],
    "outputFieldMappings":[
     {
        "sourceFieldName":"/docemnt/pages/*/vector",
        "targetFieldName":"vector",
        "mappingFunction":null
     }
    ],
    "cache":null,
    "encryptionKey":null
}
</code></pre>
<h1>References</h1>
<p><a href="https://learn.microsoft.com/en-us/azure/search/cognitive-search-custom-skill-web-api">Custom Web API skill in an Azure AI Search enrichment pipeline</a></p>
<p><a href="https://learn.microsoft.com/en-us/azure/ai-services/openai/reference#embeddings">Azure Open AI REST API - Embeddings</a></p>
]]></content:encoded></item></channel></rss>