# Azure Access AI models through Microsoft Azure's enterprise cloud platform. Supports OpenAI models (GPT-4, GPT-4o, o1, o3 series) and Anthropic Claude models with full tool calling and streaming support. ## Configuration Azure uses API key authentication with deployment-based routing. ### Environment Variables ```bash AZURE_OPENAI_API_KEY=your-api-key ``` ### Provider Options ```elixir ReqLLM.generate_text( "azure:gpt-4o", "Hello", base_url: "https://my-resource.openai.azure.com/openai", deployment: "my-gpt4-deployment" ) ``` ## Model Specs For the full model-spec workflow, see [Model Specs](model-specs.md). Azure is a strong fit for the full explicit model specification path because `base_url` is part of the model metadata. Use exact Azure model IDs from [LLMDB.xyz](https://llmdb.xyz) when possible, and use `ReqLLM.model!/1` when you need to pin `base_url` or work ahead of the registry. `deployment` remains a request option. ## Key Differences from Direct Provider APIs 1. **Custom endpoints**: Each Azure resource has a unique base URL (`https://{resource}.openai.azure.com/openai`) 2. **Deployment-based routing**: Models are accessed via deployments, not model names. - OpenAI: `/deployments/{deployment}/chat/completions?api-version={version}` - Anthropic: `/v1/messages` (model specified in body, like native Anthropic API) 3. **API key authentication**: Uses `api-key` header for all model families 4. **No model field in body**: The deployment ID in the URL determines the model ## Provider Options Passed via `:provider_options` keyword or as top-level options: ### `base_url` (Required) - **Type**: String - **Purpose**: Azure resource endpoint - **Format**: `https://{resource-name}.openai.azure.com/openai` - **Example**: `base_url: "https://my-company.openai.azure.com/openai"` - **Note**: Must be customized for your Azure resource ### `deployment` - **Type**: String - **Default**: Uses `model.id` (e.g., `gpt-4o`) - **Purpose**: Azure deployment name that determines which model is used - **Example**: `deployment: "my-gpt4-deployment"` - **Note**: The deployment name is configured when you deploy a model in Azure ### `api_version` - **Type**: String - **Default**: `"2025-04-01-preview"` - **Purpose**: Azure API version - **Example**: `provider_options: [api_version: "2024-10-01-preview"]` - **Note**: Check Azure documentation for supported versions ### `api_key` - **Type**: String - **Purpose**: Azure API key - **Fallback**: `AZURE_OPENAI_API_KEY` env var - **Example**: `api_key: "your-api-key"` ## Examples ### Basic Usage (OpenAI) ```elixir {:ok, response} = ReqLLM.generate_text( "azure:gpt-4o", "What is Elixir?", base_url: "https://my-resource.openai.azure.com/openai", deployment: "my-gpt4-deployment" ) ``` ### Basic Usage (Anthropic Claude) ```elixir {:ok, response} = ReqLLM.generate_text( "azure:claude-3-sonnet", "What is Elixir?", base_url: "https://my-resource.openai.azure.com/openai", deployment: "my-claude-deployment" ) ``` ### Streaming ```elixir {:ok, response} = ReqLLM.stream_text( "azure:gpt-4o", "Tell me a story", base_url: "https://my-resource.openai.azure.com/openai", deployment: "my-gpt4-deployment" ) ReqLLM.StreamResponse.tokens(response) |> Stream.each(&IO.write/1) |> Stream.run() ``` ### Tool Calling ```elixir tools = [ ReqLLM.tool( name: "get_weather", description: "Get weather for a location", parameter_schema: [location: [type: :string, required: true]], callback: &MyApp.Weather.fetch/1 ) ] {:ok, response} = ReqLLM.generate_text( "azure:gpt-4o", "What's the weather in Paris?", base_url: "https://my-resource.openai.azure.com/openai", deployment: "my-gpt4-deployment", tools: tools ) ``` ### Embeddings ```elixir {:ok, embedding} = ReqLLM.generate_embedding( "azure:text-embedding-3-small", "Hello world", base_url: "https://my-resource.openai.azure.com/openai", deployment: "my-embedding-deployment" ) ``` ### Structured Output ```elixir schema = [ name: [type: :string, required: true], age: [type: :pos_integer, required: true] ] {:ok, person} = ReqLLM.generate_object( "azure:gpt-4o", "Generate a fictional person", schema, base_url: "https://my-resource.openai.azure.com/openai", deployment: "my-gpt4-deployment" ) ``` ### Extended Thinking (Claude) ```elixir {:ok, response} = ReqLLM.generate_text( "azure:claude-3-sonnet", "Solve this complex problem step by step", base_url: "https://my-resource.openai.azure.com/openai", deployment: "my-claude-deployment", reasoning_effort: :medium ) ``` ## Supported Models ### OpenAI GPT-4 Family - `azure:gpt-4o` - Latest multimodal model - `azure:gpt-4o-mini` - Smaller, faster variant - `azure:gpt-4` - Original GPT-4 - `azure:gpt-4-turbo` - Faster GPT-4 variant ### OpenAI Reasoning Models - `azure:o1` - Advanced reasoning model - `azure:o1-mini` - Smaller reasoning model - `azure:o3` - Latest reasoning model - `azure:o3-mini` - Smaller o3 variant **Note**: Reasoning models use `max_completion_tokens` instead of `max_tokens`. ReqLLM handles this translation automatically. ### OpenAI Embedding Models - `azure:text-embedding-3-small` - Small, efficient embeddings - `azure:text-embedding-3-large` - Higher quality embeddings - `azure:text-embedding-ada-002` - Legacy embedding model ### Anthropic Claude Models - `azure:claude-3-opus` - Most capable Claude model - `azure:claude-3-sonnet` - Balanced performance - `azure:claude-3-haiku` - Fast, efficient model - `azure:claude-3-5-sonnet` - Latest Claude 3.5 Sonnet **Note**: Claude models support extended thinking via `reasoning_effort` option. ## Wire Format Notes ### OpenAI Models - **Endpoint**: `/deployments/{deployment}/chat/completions` - **API**: OpenAI Chat Completions format (model field omitted) ### Anthropic Models - **Endpoint**: `/v1/messages` (model specified in request body) - **API**: Anthropic Messages format - **Headers**: Includes `anthropic-version: 2023-06-01` and `x-api-key` ### Common - **Authentication**: `api-key` header for all model families - **Streaming**: Standard Server-Sent Events (SSE) - **API Version**: Required query parameter on all requests All differences handled automatically by ReqLLM. ## Error Handling Common error scenarios: - **Missing API key**: Set `AZURE_OPENAI_API_KEY` or pass `api_key` option - **Invalid deployment**: Ensure the deployment name matches your Azure resource - **Placeholder base_url**: Must provide your actual resource URL - **Unsupported API version**: Check Azure documentation for supported versions ## Resources - [Azure OpenAI Service Documentation](https://learn.microsoft.com/en-us/azure/ai-services/openai/) - [Azure OpenAI REST API Reference](https://learn.microsoft.com/en-us/azure/ai-services/openai/reference) - [Quickstart: Get started with Azure OpenAI](https://learn.microsoft.com/en-us/azure/ai-services/openai/quickstart)