<policies>
  <inbound>
    <base />
    <set-variable name="attemptCount" value="@(0)" />
    <rewrite-uri template="/openai/v1/responses" copy-unmatched-params="false" />
    <set-header name="api-key" exists-action="delete" />
    <set-header name="Ocp-Apim-Subscription-Key" exists-action="delete" />
    <set-header name="Cookie" exists-action="delete" />
    <set-header name="x-ms-client-request-id" exists-action="override"><value>@(context.RequestId.ToString())</value></set-header>
    <authentication-managed-identity resource="https://cognitiveservices.azure.com" ignore-error="false" />
  </inbound>
  <backend>
    <retry condition="@(true &amp;&amp; context.Response != null &amp;&amp; context.Response.StatusCode == 429)" count="1" interval="1" first-fast-retry="false">
      <set-variable name="attemptCount" value="@(context.Variables.GetValueOrDefault&lt;int&gt;(&quot;attemptCount&quot;, 0) + 1)" />
      <set-backend-service backend-id="YOUR_POOL_ID" />
      <forward-request timeout="60" http-version="1" follow-redirects="false" buffer-request-body="true" buffer-response="false" fail-on-error-status-code="false" />
      <trace source="YOUR_TRACE_SOURCE" severity="information">
        <message>backend-attempt</message>
        <metadata name="requestId" value="@(context.RequestId.ToString())" />
        <metadata name="operation" value="@(context.Operation.Id)" />
        <metadata name="attempt" value="@(context.Variables.GetValueOrDefault&lt;int&gt;(&quot;attemptCount&quot;, 0).ToString())" />
        <metadata name="configuredBackend" value="YOUR_POOL_ID" />
        <metadata name="backendId" value="@(context.Backend.Id)" />
        <metadata name="backendHost" value="@(context.Request.Url.Host)" />
        <metadata name="status" value="@(context.Response.StatusCode.ToString())" />
        <metadata name="elapsedMs" value="@(context.Elapsed.TotalMilliseconds.ToString())" />
        <metadata name="retryAfter" value="@{ var header = context.Response.Headers.GetValueOrDefault(&quot;Retry-After&quot;, &quot;&quot;); return string.IsNullOrWhiteSpace(header) ? &quot;not-present&quot; : header; }" />
        <metadata name="retryAfterMs" value="@{ var header = context.Response.Headers.GetValueOrDefault(&quot;retry-after-ms&quot;, &quot;&quot;); return string.IsNullOrWhiteSpace(header) ? &quot;not-present&quot; : header; }" />
      </trace>
    </retry>
  </backend>
  <outbound>
    <base />
    <set-header name="X-PoC-Request-Id" exists-action="override"><value>@(context.RequestId.ToString())</value></set-header>
    <set-header name="X-PoC-Attempts" exists-action="override"><value>@(context.Variables.GetValueOrDefault&lt;int&gt;("attemptCount", 0).ToString())</value></set-header>
    <set-header name="X-PoC-Backend-Host" exists-action="override"><value>@(context.Request.Url.Host)</value></set-header>
    <set-header name="X-PoC-Backend-Id" exists-action="override"><value>@(context.Backend.Id)</value></set-header>
    <set-header name="X-PoC-Error-Source" exists-action="override"><value>@(context.Response.StatusCode == 429 ? "backend" : "none")</value></set-header>
  </outbound>
  <on-error>
    <base />
    <set-header name="X-PoC-Request-Id" exists-action="override"><value>@(context.RequestId.ToString())</value></set-header>
    <set-header name="X-PoC-Attempts" exists-action="override"><value>@(context.Variables.GetValueOrDefault&lt;int&gt;("attemptCount", 0).ToString())</value></set-header>
    <set-header name="X-PoC-Error-Source" exists-action="override"><value>gateway</value></set-header>
  </on-error>
</policies>
