Azure OpenAI Provider

InfraPrism supports Azure OpenAI deployments, enabling cost tracking for organizations using Microsoft’s Azure-hosted OpenAI models.

Installation

pip install infraprism

Configuration

Azure OpenAI requires additional configuration for your deployment:

from infraprism import InfraPrismAzureOpenAI

client = InfraPrismAzureOpenAI(
    azure_endpoint="https://your-resource.openai.azure.com",
    api_key="your-azure-api-key",
    api_version="2024-02-01",
    infraprism_api_key="ip-...",
)

Environment Variables

You can also use environment variables:

export AZURE_OPENAI_ENDPOINT="https://your-resource.openai.azure.com"
export AZURE_OPENAI_API_KEY="your-azure-api-key"
export AZURE_OPENAI_API_VERSION="2024-02-01"
export INFRAPRISM_API_KEY="ip-..."
from infraprism import InfraPrismAzureOpenAI

client = InfraPrismAzureOpenAI()  # Reads from environment

Basic Usage

Use your Azure deployment name as the model:

response = client.chat.completions.create(
    model="my-gpt4-deployment",  # Your deployment name
    messages=[{"role": "user", "content": "Hello!"}],
    entity_type="customer",
    entity_id="acme-corp",
)
print(response.choices[0].message.content)

Cost Attribution

Add entity parameters just like the standard OpenAI provider:

response = client.chat.completions.create(
    model="my-gpt4-deployment",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Explain cloud computing"}
    ],
    entity_type="team",
    entity_id="infrastructure",
    tags={"region": "eastus", "env": "production"},
)

Model Mapping

Azure deployments use custom names. InfraPrism automatically maps deployment names to base models for cost calculation. If you’re using custom deployment names, specify the underlying model:

client = InfraPrismAzureOpenAI(
    azure_endpoint="https://your-resource.openai.azure.com",
    api_key="your-azure-api-key",
    api_version="2024-02-01",
    infraprism_api_key="ip-...",
    infraprism_model_mapping={
        "my-gpt4-deployment": "gpt-4",
        "my-gpt35-deployment": "gpt-3.5-turbo",
        "my-embedding-deployment": "text-embedding-ada-002",
    },
)

Streaming

Streaming is fully supported:

stream = client.chat.completions.create(
    model="my-gpt4-deployment",
    messages=[{"role": "user", "content": "Write a story"}],
    stream=True,
    entity_type="project",
    entity_id="storytelling",
)

for chunk in stream:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="")

Async Support

from infraprism import AsyncInfraPrismAzureOpenAI
import asyncio

async def main():
    client = AsyncInfraPrismAzureOpenAI(
        azure_endpoint="https://your-resource.openai.azure.com",
        api_key="your-azure-api-key",
        api_version="2024-02-01",
    )

    response = await client.chat.completions.create(
        model="my-gpt4-deployment",
        messages=[{"role": "user", "content": "Hello!"}],
        entity_type="customer",
        entity_id="acme-corp",
    )
    print(response.choices[0].message.content)

asyncio.run(main())

Embeddings

Track embedding costs from Azure deployments:

response = client.embeddings.create(
    model="my-embedding-deployment",
    input="The quick brown fox",
    entity_type="project",
    entity_id="search-index",
)

Multiple Deployments

You can create multiple clients for different Azure resources:

# US East deployment
client_east = InfraPrismAzureOpenAI(
    azure_endpoint="https://my-resource-eastus.openai.azure.com",
    api_key="key-east",
    infraprism_api_key="ip-...",
)

# EU West deployment
client_west = InfraPrismAzureOpenAI(
    azure_endpoint="https://my-resource-westeu.openai.azure.com",
    api_key="key-west",
    infraprism_api_key="ip-...",
)

# Track which region is used
response = client_east.chat.completions.create(
    model="gpt4-deployment",
    messages=[{"role": "user", "content": "Hello"}],
    entity_type="customer",
    entity_id="acme-corp",
    tags={"region": "eastus"},
)

Azure AD Authentication

For Azure AD authentication, use the azure_ad_token_provider:

from azure.identity import DefaultAzureCredential, get_bearer_token_provider
from infraprism import InfraPrismAzureOpenAI

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(),
    "https://cognitiveservices.azure.com/.default"
)

client = InfraPrismAzureOpenAI(
    azure_endpoint="https://your-resource.openai.azure.com",
    azure_ad_token_provider=token_provider,
    api_version="2024-02-01",
    infraprism_api_key="ip-...",
)

Pricing

Azure OpenAI pricing varies by region and commitment tier. InfraPrism uses standard Azure pricing by default. For custom pricing (e.g., PTU commitments), contact us to configure custom rates.

Error Handling

Azure-specific errors are passed through:

from openai import AzureOpenAIError

try:
    response = client.chat.completions.create(
        model="my-deployment",
        messages=[{"role": "user", "content": "Hello"}],
        entity_type="customer",
        entity_id="acme-corp",
    )
except AzureOpenAIError as e:
    print(f"Azure error: {e}")

Next Steps