[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71RDC0QC9FJ86G9F0FJ4DNE":3,"skill-same:01M71RDC0QC9FJ86G9F0FJ4DNE":47},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":14,"categories":15,"keywords":16,"publishedAt":22,"linkOnly":23,"markdownContent":24,"markdownBody":25,"frontMatter":26,"refName":27,"commitSha":28,"skillDirectory":29,"forksCount":12,"repositoryHtmlUrl":30,"repositoryHomepageUrl":6,"ownerHtmlUrl":31,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":32,"install":33,"resources":46},"01M71RDC0QC9FJ86G9F0FJ4DNE","azure-ai-openai-dotnet",null,"javiertarazon\u002Fide-agente-free-jt7-","javiertarazon","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F153141207?v=4","01M71R52TB3S9HXKH6WSNT8A7V","01M71R52VG5KS2DKDDH4GDQ30A",0,"MIT","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fazure-ai-openai-dotnet\u002FSKILL.md",[],[17,18,19,20,21],"dotnet","azure ai","azure","azure ai openai dotnet","openai","2026-11-10 13:02:02",false,"---\nname: azure-ai-openai-dotnet\ndescription: \"|\"\n  Azure OpenAI SDK for .NET. Client library for Azure OpenAI and OpenAI services. Use for chat completions, embeddings, image generation, audio transcription, and assistants. Triggers: \"Azure OpenAI\", \"AzureOpenAIClient\", \"ChatClient\", \"chat completions .NET\", \"GPT-4\", \"embeddings\", \"DALL-E\", \"Whisper\", \"OpenAI .NET\".\npackage: Azure.AI.OpenAI\nrisk: unknown\nsource: community\n---\n\n# Azure.AI.OpenAI (.NET)\n\nClient library for Azure OpenAI Service providing access to OpenAI models including GPT-4, GPT-4o, embeddings, DALL-E, and Whisper.\n\n## Installation\n\n```bash\ndotnet add package Azure.AI.OpenAI\n\n# For OpenAI (non-Azure) compatibility\ndotnet add package OpenAI\n```\n\n**Current Version**: 2.1.0 (stable)\n\n## Environment Variables\n\n```bash\nAZURE_OPENAI_ENDPOINT=https:\u002F\u002F\u003Cresource-name>.openai.azure.com\nAZURE_OPENAI_API_KEY=\u003Capi-key>                    # For key-based auth\nAZURE_OPENAI_DEPLOYMENT_NAME=gpt-4o-mini          # Your deployment name\n```\n\n## Client Hierarchy\n\n```\nAzureOpenAIClient (top-level)\n├── GetChatClient(deploymentName)      → ChatClient\n├── GetEmbeddingClient(deploymentName) → EmbeddingClient\n├── GetImageClient(deploymentName)     → ImageClient\n├── GetAudioClient(deploymentName)     → AudioClient\n└── GetAssistantClient()               → AssistantClient\n```\n\n## Authentication\n\n### API Key Authentication\n\n```csharp\nusing Azure;\nusing Azure.AI.OpenAI;\n\nAzureOpenAIClient client = new(\n    new Uri(Environment.GetEnvironmentVariable(\"AZURE_OPENAI_ENDPOINT\")!),\n    new AzureKeyCredential(Environment.GetEnvironmentVariable(\"AZURE_OPENAI_API_KEY\")!));\n```\n\n### Microsoft Entra ID (Recommended for Production)\n\n```csharp\nusing Azure.Identity;\nusing Azure.AI.OpenAI;\n\nAzureOpenAIClient client = new(\n    new Uri(Environment.GetEnvironmentVariable(\"AZURE_OPENAI_ENDPOINT\")!),\n    new DefaultAzureCredential());\n```\n\n### Using OpenAI SDK Directly with Azure\n\n```csharp\nusing Azure.Identity;\nusing OpenAI;\nusing OpenAI.Chat;\nusing System.ClientModel.Primitives;\n\n#pragma warning disable OPENAI001\n\nBearerTokenPolicy tokenPolicy = new(\n    new DefaultAzureCredential(),\n    \"https:\u002F\u002Fcognitiveservices.azure.com\u002F.default\");\n\nChatClient client = new(\n    model: \"gpt-4o-mini\",\n    authenticationPolicy: tokenPolicy,\n    options: new OpenAIClientOptions()\n    {\n        Endpoint = new Uri(\"https:\u002F\u002FYOUR-RESOURCE.openai.azure.com\u002Fopenai\u002Fv1\")\n    });\n```\n\n## Chat Completions\n\n### Basic Chat\n\n```csharp\nusing Azure.AI.OpenAI;\nusing OpenAI.Chat;\n\nAzureOpenAIClient azureClient = new(\n    new Uri(endpoint),\n    new DefaultAzureCredential());\n\nChatClient chatClient = azureClient.GetChatClient(\"gpt-4o-mini\");\n\nChatCompletion completion = chatClient.CompleteChat(\n[\n    new SystemChatMessage(\"You are a helpful assistant.\"),\n    new UserChatMessage(\"What is Azure OpenAI?\")\n]);\n\nConsole.WriteLine(completion.Content[0].Text);\n```\n\n### Async Chat\n\n```csharp\nChatCompletion completion = await chatClient.CompleteChatAsync(\n[\n    new SystemChatMessage(\"You are a helpful assistant.\"),\n    new UserChatMessage(\"Explain cloud computing in simple terms.\")\n]);\n\nConsole.WriteLine($\"Response: {completion.Content[0].Text}\");\nConsole.WriteLine($\"Tokens used: {completion.Usage.TotalTokenCount}\");\n```\n\n### Streaming Chat\n\n```csharp\nawait foreach (StreamingChatCompletionUpdate update \n    in chatClient.CompleteChatStreamingAsync(messages))\n{\n    if (update.ContentUpdate.Count > 0)\n    {\n        Console.Write(update.ContentUpdate[0].Text);\n    }\n}\n```\n\n### Chat with Options\n\n```csharp\nChatCompletionOptions options = new()\n{\n    MaxOutputTokenCount = 1000,\n    Temperature = 0.7f,\n    TopP = 0.95f,\n    FrequencyPenalty = 0,\n    PresencePenalty = 0\n};\n\nChatCompletion completion = await chatClient.CompleteChatAsync(messages, options);\n```\n\n### Multi-turn Conversation\n\n```csharp\nList\u003CChatMessage> messages = new()\n{\n    new SystemChatMessage(\"You are a helpful assistant.\"),\n    new UserChatMessage(\"Hi, can you help me?\"),\n    new AssistantChatMessage(\"Of course! What do you need help with?\"),\n    new UserChatMessage(\"What's the capital of France?\")\n};\n\nChatCompletion completion = await chatClient.CompleteChatAsync(messages);\nmessages.Add(new AssistantChatMessage(completion.Content[0].Text));\n```\n\n## Structured Outputs (JSON Schema)\n\n```csharp\nusing System.Text.Json;\n\nChatCompletionOptions options = new()\n{\n    ResponseFormat = ChatResponseFormat.CreateJsonSchemaFormat(\n        jsonSchemaFormatName: \"math_reasoning\",\n        jsonSchema: BinaryData.FromBytes(\"\"\"\n            {\n                \"type\": \"object\",\n                \"properties\": {\n                    \"steps\": {\n                        \"type\": \"array\",\n                        \"items\": {\n                            \"type\": \"object\",\n                            \"properties\": {\n                                \"explanation\": { \"type\": \"string\" },\n                                \"output\": { \"type\": \"string\" }\n                            },\n                            \"required\": [\"explanation\", \"output\"],\n                            \"additionalProperties\": false\n                        }\n                    },\n                    \"final_answer\": { \"type\": \"string\" }\n                },\n                \"required\": [\"steps\", \"final_answer\"],\n                \"additionalProperties\": false\n            }\n            \"\"\"u8.ToArray()),\n        jsonSchemaIsStrict: true)\n};\n\nChatCompletion completion = await chatClient.CompleteChatAsync(\n    [new UserChatMessage(\"How can I solve 8x + 7 = -23?\")],\n    options);\n\nusing JsonDocument json = JsonDocument.Parse(completion.Content[0].Text);\nConsole.WriteLine($\"Answer: {json.RootElement.GetProperty(\"final_answer\")}\");\n```\n\n## Reasoning Models (o1, o4-mini)\n\n```csharp\nChatCompletionOptions options = new()\n{\n    ReasoningEffortLevel = ChatReasoningEffortLevel.Low,\n    MaxOutputTokenCount = 100000\n};\n\nChatCompletion completion = await chatClient.CompleteChatAsync(\n[\n    new DeveloperChatMessage(\"You are a helpful assistant\"),\n    new UserChatMessage(\"Explain the theory of relativity\")\n], options);\n```\n\n## Azure AI Search Integration (RAG)\n\n```csharp\nusing Azure.AI.OpenAI.Chat;\n\n#pragma warning disable AOAI001\n\nChatCompletionOptions options = new();\noptions.AddDataSource(new AzureSearchChatDataSource()\n{\n    Endpoint = new Uri(searchEndpoint),\n    IndexName = searchIndex,\n    Authentication = DataSourceAuthentication.FromApiKey(searchKey)\n});\n\nChatCompletion completion = await chatClient.CompleteChatAsync(\n    [new UserChatMessage(\"What health plans are available?\")],\n    options);\n\nChatMessageContext context = completion.GetMessageContext();\nif (context?.Intent is not null)\n{\n    Console.WriteLine($\"Intent: {context.Intent}\");\n}\nforeach (ChatCitation citation in context?.Citations ?? [])\n{\n    Console.WriteLine($\"Citation: {citation.Content}\");\n}\n```\n\n## Embeddings\n\n```csharp\nusing OpenAI.Embeddings;\n\nEmbeddingClient embeddingClient = azureClient.GetEmbeddingClient(\"text-embedding-ada-002\");\n\nOpenAIEmbedding embedding = await embeddingClient.GenerateEmbeddingAsync(\"Hello, world!\");\nReadOnlyMemory\u003Cfloat> vector = embedding.ToFloats();\n\nConsole.WriteLine($\"Embedding dimensions: {vector.Length}\");\n```\n\n### Batch Embeddings\n\n```csharp\nList\u003Cstring> inputs = new()\n{\n    \"First document text\",\n    \"Second document text\",\n    \"Third document text\"\n};\n\nOpenAIEmbeddingCollection embeddings = await embeddingClient.GenerateEmbeddingsAsync(inputs);\n\nforeach (OpenAIEmbedding emb in embeddings)\n{\n    Console.WriteLine($\"Index {emb.Index}: {emb.ToFloats().Length} dimensions\");\n}\n```\n\n## Image Generation (DALL-E)\n\n```csharp\nusing OpenAI.Images;\n\nImageClient imageClient = azureClient.GetImageClient(\"dall-e-3\");\n\nGeneratedImage image = await imageClient.GenerateImageAsync(\n    \"A futuristic city skyline at sunset\",\n    new ImageGenerationOptions\n    {\n        Size = GeneratedImageSize.W1024xH1024,\n        Quality = GeneratedImageQuality.High,\n        Style = GeneratedImageStyle.Vivid\n    });\n\nConsole.WriteLine($\"Image URL: {image.ImageUri}\");\n```\n\n## Audio (Whisper)\n\n### Transcription\n\n```csharp\nusing OpenAI.Audio;\n\nAudioClient audioClient = azureClient.GetAudioClient(\"whisper\");\n\nAudioTranscription transcription = await audioClient.TranscribeAudioAsync(\n    \"audio.mp3\",\n    new AudioTranscriptionOptions\n    {\n        ResponseFormat = AudioTranscriptionFormat.Verbose,\n        Language = \"en\"\n    });\n\nConsole.WriteLine(transcription.Text);\n```\n\n### Text-to-Speech\n\n```csharp\nBinaryData speech = await audioClient.GenerateSpeechAsync(\n    \"Hello, welcome to Azure OpenAI!\",\n    GeneratedSpeechVoice.Alloy,\n    new SpeechGenerationOptions\n    {\n        SpeedRatio = 1.0f,\n        ResponseFormat = GeneratedSpeechFormat.Mp3\n    });\n\nawait File.WriteAllBytesAsync(\"output.mp3\", speech.ToArray());\n```\n\n## Function Calling (Tools)\n\n```csharp\nChatTool getCurrentWeatherTool = ChatTool.CreateFunctionTool(\n    functionName: \"get_current_weather\",\n    functionDescription: \"Get the current weather in a given location\",\n    functionParameters: BinaryData.FromString(\"\"\"\n        {\n            \"type\": \"object\",\n            \"properties\": {\n                \"location\": {\n                    \"type\": \"string\",\n                    \"description\": \"The city and state, e.g. San Francisco, CA\"\n                },\n                \"unit\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"celsius\", \"fahrenheit\"]\n                }\n            },\n            \"required\": [\"location\"]\n        }\n        \"\"\"));\n\nChatCompletionOptions options = new()\n{\n    Tools = { getCurrentWeatherTool }\n};\n\nChatCompletion completion = await chatClient.CompleteChatAsync(\n    [new UserChatMessage(\"What's the weather in Seattle?\")],\n    options);\n\nif (completion.FinishReason == ChatFinishReason.ToolCalls)\n{\n    foreach (ChatToolCall toolCall in completion.ToolCalls)\n    {\n        Console.WriteLine($\"Function: {toolCall.FunctionName}\");\n        Console.WriteLine($\"Arguments: {toolCall.FunctionArguments}\");\n    }\n}\n```\n\n## Key Types Reference\n\n| Type | Purpose |\n|------|---------|\n| `AzureOpenAIClient` | Top-level client for Azure OpenAI |\n| `ChatClient` | Chat completions |\n| `EmbeddingClient` | Text embeddings |\n| `ImageClient` | Image generation (DALL-E) |\n| `AudioClient` | Audio transcription\u002FTTS |\n| `ChatCompletion` | Chat response |\n| `ChatCompletionOptions` | Request configuration |\n| `StreamingChatCompletionUpdate` | Streaming response chunk |\n| `ChatMessage` | Base message type |\n| `SystemChatMessage` | System prompt |\n| `UserChatMessage` | User input |\n| `AssistantChatMessage` | Assistant response |\n| `DeveloperChatMessage` | Developer message (reasoning models) |\n| `ChatTool` | Function\u002Ftool definition |\n| `ChatToolCall` | Tool invocation request |\n\n## Best Practices\n\n1. **Use Entra ID in production** — Avoid API keys; use `DefaultAzureCredential`\n2. **Reuse client instances** — Create once, share across requests\n3. **Handle rate limits** — Implement exponential backoff for 429 errors\n4. **Stream for long responses** — Use `CompleteChatStreamingAsync` for better UX\n5. **Set appropriate timeouts** — Long completions may need extended timeouts\n6. **Use structured outputs** — JSON schema ensures consistent response format\n7. **Monitor token usage** — Track `completion.Usage` for cost management\n8. **Validate tool calls** — Always validate function arguments before execution\n\n## Error Handling\n\n```csharp\nusing Azure;\n\ntry\n{\n    ChatCompletion completion = await chatClient.CompleteChatAsync(messages);\n}\ncatch (RequestFailedException ex) when (ex.Status == 429)\n{\n    Console.WriteLine(\"Rate limited. Retry after delay.\");\n    await Task.Delay(TimeSpan.FromSeconds(10));\n}\ncatch (RequestFailedException ex) when (ex.Status == 400)\n{\n    Console.WriteLine($\"Bad request: {ex.Message}\");\n}\ncatch (RequestFailedException ex)\n{\n    Console.WriteLine($\"Azure OpenAI error: {ex.Status} - {ex.Message}\");\n}\n```\n\n## Related SDKs\n\n| SDK | Purpose | Install |\n|-----|---------|---------|\n| `Azure.AI.OpenAI` | Azure OpenAI client (this SDK) | `dotnet add package Azure.AI.OpenAI` |\n| `OpenAI` | OpenAI compatibility | `dotnet add package OpenAI` |\n| `Azure.Identity` | Authentication | `dotnet add package Azure.Identity` |\n| `Azure.Search.Documents` | AI Search for RAG | `dotnet add package Azure.Search.Documents` |\n\n## Reference Links\n\n| Resource | URL |\n|----------|-----|\n| NuGet Package | https:\u002F\u002Fwww.nuget.org\u002Fpackages\u002FAzure.AI.OpenAI |\n| API Reference | https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Fazure.ai.openai |\n| Migration Guide (1.0→2.0) | https:\u002F\u002Flearn.microsoft.com\u002Fazure\u002Fai-services\u002Fopenai\u002Fhow-to\u002Fdotnet-migration |\n| Quickstart | https:\u002F\u002Flearn.microsoft.com\u002Fazure\u002Fai-services\u002Fopenai\u002Fquickstart |\n| GitHub Source | https:\u002F\u002Fgithub.com\u002FAzure\u002Fazure-sdk-for-net\u002Ftree\u002Fmain\u002Fsdk\u002Fopenai\u002FAzure.AI.OpenAI |\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n","# Azure.AI.OpenAI (.NET)\n\nClient library for Azure OpenAI Service providing access to OpenAI models including GPT-4, GPT-4o, embeddings, DALL-E, and Whisper.\n\n## Installation\n\n```bash\ndotnet add package Azure.AI.OpenAI\n\n# For OpenAI (non-Azure) compatibility\ndotnet add package OpenAI\n```\n\n**Current Version**: 2.1.0 (stable)\n\n## Environment Variables\n\n```bash\nAZURE_OPENAI_ENDPOINT=https:\u002F\u002F\u003Cresource-name>.openai.azure.com\nAZURE_OPENAI_API_KEY=\u003Capi-key>                    # For key-based auth\nAZURE_OPENAI_DEPLOYMENT_NAME=gpt-4o-mini          # Your deployment name\n```\n\n## Client Hierarchy\n\n```\nAzureOpenAIClient (top-level)\n├── GetChatClient(deploymentName)      → ChatClient\n├── GetEmbeddingClient(deploymentName) → EmbeddingClient\n├── GetImageClient(deploymentName)     → ImageClient\n├── GetAudioClient(deploymentName)     → AudioClient\n└── GetAssistantClient()               → AssistantClient\n```\n\n## Authentication\n\n### API Key Authentication\n\n```csharp\nusing Azure;\nusing Azure.AI.OpenAI;\n\nAzureOpenAIClient client = new(\n    new Uri(Environment.GetEnvironmentVariable(\"AZURE_OPENAI_ENDPOINT\")!),\n    new AzureKeyCredential(Environment.GetEnvironmentVariable(\"AZURE_OPENAI_API_KEY\")!));\n```\n\n### Microsoft Entra ID (Recommended for Production)\n\n```csharp\nusing Azure.Identity;\nusing Azure.AI.OpenAI;\n\nAzureOpenAIClient client = new(\n    new Uri(Environment.GetEnvironmentVariable(\"AZURE_OPENAI_ENDPOINT\")!),\n    new DefaultAzureCredential());\n```\n\n### Using OpenAI SDK Directly with Azure\n\n```csharp\nusing Azure.Identity;\nusing OpenAI;\nusing OpenAI.Chat;\nusing System.ClientModel.Primitives;\n\n#pragma warning disable OPENAI001\n\nBearerTokenPolicy tokenPolicy = new(\n    new DefaultAzureCredential(),\n    \"https:\u002F\u002Fcognitiveservices.azure.com\u002F.default\");\n\nChatClient client = new(\n    model: \"gpt-4o-mini\",\n    authenticationPolicy: tokenPolicy,\n    options: new OpenAIClientOptions()\n    {\n        Endpoint = new Uri(\"https:\u002F\u002FYOUR-RESOURCE.openai.azure.com\u002Fopenai\u002Fv1\")\n    });\n```\n\n## Chat Completions\n\n### Basic Chat\n\n```csharp\nusing Azure.AI.OpenAI;\nusing OpenAI.Chat;\n\nAzureOpenAIClient azureClient = new(\n    new Uri(endpoint),\n    new DefaultAzureCredential());\n\nChatClient chatClient = azureClient.GetChatClient(\"gpt-4o-mini\");\n\nChatCompletion completion = chatClient.CompleteChat(\n[\n    new SystemChatMessage(\"You are a helpful assistant.\"),\n    new UserChatMessage(\"What is Azure OpenAI?\")\n]);\n\nConsole.WriteLine(completion.Content[0].Text);\n```\n\n### Async Chat\n\n```csharp\nChatCompletion completion = await chatClient.CompleteChatAsync(\n[\n    new SystemChatMessage(\"You are a helpful assistant.\"),\n    new UserChatMessage(\"Explain cloud computing in simple terms.\")\n]);\n\nConsole.WriteLine($\"Response: {completion.Content[0].Text}\");\nConsole.WriteLine($\"Tokens used: {completion.Usage.TotalTokenCount}\");\n```\n\n### Streaming Chat\n\n```csharp\nawait foreach (StreamingChatCompletionUpdate update \n    in chatClient.CompleteChatStreamingAsync(messages))\n{\n    if (update.ContentUpdate.Count > 0)\n    {\n        Console.Write(update.ContentUpdate[0].Text);\n    }\n}\n```\n\n### Chat with Options\n\n```csharp\nChatCompletionOptions options = new()\n{\n    MaxOutputTokenCount = 1000,\n    Temperature = 0.7f,\n    TopP = 0.95f,\n    FrequencyPenalty = 0,\n    PresencePenalty = 0\n};\n\nChatCompletion completion = await chatClient.CompleteChatAsync(messages, options);\n```\n\n### Multi-turn Conversation\n\n```csharp\nList\u003CChatMessage> messages = new()\n{\n    new SystemChatMessage(\"You are a helpful assistant.\"),\n    new UserChatMessage(\"Hi, can you help me?\"),\n    new AssistantChatMessage(\"Of course! What do you need help with?\"),\n    new UserChatMessage(\"What's the capital of France?\")\n};\n\nChatCompletion completion = await chatClient.CompleteChatAsync(messages);\nmessages.Add(new AssistantChatMessage(completion.Content[0].Text));\n```\n\n## Structured Outputs (JSON Schema)\n\n```csharp\nusing System.Text.Json;\n\nChatCompletionOptions options = new()\n{\n    ResponseFormat = ChatResponseFormat.CreateJsonSchemaFormat(\n        jsonSchemaFormatName: \"math_reasoning\",\n        jsonSchema: BinaryData.FromBytes(\"\"\"\n            {\n                \"type\": \"object\",\n                \"properties\": {\n                    \"steps\": {\n                        \"type\": \"array\",\n                        \"items\": {\n                            \"type\": \"object\",\n                            \"properties\": {\n                                \"explanation\": { \"type\": \"string\" },\n                                \"output\": { \"type\": \"string\" }\n                            },\n                            \"required\": [\"explanation\", \"output\"],\n                            \"additionalProperties\": false\n                        }\n                    },\n                    \"final_answer\": { \"type\": \"string\" }\n                },\n                \"required\": [\"steps\", \"final_answer\"],\n                \"additionalProperties\": false\n            }\n            \"\"\"u8.ToArray()),\n        jsonSchemaIsStrict: true)\n};\n\nChatCompletion completion = await chatClient.CompleteChatAsync(\n    [new UserChatMessage(\"How can I solve 8x + 7 = -23?\")],\n    options);\n\nusing JsonDocument json = JsonDocument.Parse(completion.Content[0].Text);\nConsole.WriteLine($\"Answer: {json.RootElement.GetProperty(\"final_answer\")}\");\n```\n\n## Reasoning Models (o1, o4-mini)\n\n```csharp\nChatCompletionOptions options = new()\n{\n    ReasoningEffortLevel = ChatReasoningEffortLevel.Low,\n    MaxOutputTokenCount = 100000\n};\n\nChatCompletion completion = await chatClient.CompleteChatAsync(\n[\n    new DeveloperChatMessage(\"You are a helpful assistant\"),\n    new UserChatMessage(\"Explain the theory of relativity\")\n], options);\n```\n\n## Azure AI Search Integration (RAG)\n\n```csharp\nusing Azure.AI.OpenAI.Chat;\n\n#pragma warning disable AOAI001\n\nChatCompletionOptions options = new();\noptions.AddDataSource(new AzureSearchChatDataSource()\n{\n    Endpoint = new Uri(searchEndpoint),\n    IndexName = searchIndex,\n    Authentication = DataSourceAuthentication.FromApiKey(searchKey)\n});\n\nChatCompletion completion = await chatClient.CompleteChatAsync(\n    [new UserChatMessage(\"What health plans are available?\")],\n    options);\n\nChatMessageContext context = completion.GetMessageContext();\nif (context?.Intent is not null)\n{\n    Console.WriteLine($\"Intent: {context.Intent}\");\n}\nforeach (ChatCitation citation in context?.Citations ?? [])\n{\n    Console.WriteLine($\"Citation: {citation.Content}\");\n}\n```\n\n## Embeddings\n\n```csharp\nusing OpenAI.Embeddings;\n\nEmbeddingClient embeddingClient = azureClient.GetEmbeddingClient(\"text-embedding-ada-002\");\n\nOpenAIEmbedding embedding = await embeddingClient.GenerateEmbeddingAsync(\"Hello, world!\");\nReadOnlyMemory\u003Cfloat> vector = embedding.ToFloats();\n\nConsole.WriteLine($\"Embedding dimensions: {vector.Length}\");\n```\n\n### Batch Embeddings\n\n```csharp\nList\u003Cstring> inputs = new()\n{\n    \"First document text\",\n    \"Second document text\",\n    \"Third document text\"\n};\n\nOpenAIEmbeddingCollection embeddings = await embeddingClient.GenerateEmbeddingsAsync(inputs);\n\nforeach (OpenAIEmbedding emb in embeddings)\n{\n    Console.WriteLine($\"Index {emb.Index}: {emb.ToFloats().Length} dimensions\");\n}\n```\n\n## Image Generation (DALL-E)\n\n```csharp\nusing OpenAI.Images;\n\nImageClient imageClient = azureClient.GetImageClient(\"dall-e-3\");\n\nGeneratedImage image = await imageClient.GenerateImageAsync(\n    \"A futuristic city skyline at sunset\",\n    new ImageGenerationOptions\n    {\n        Size = GeneratedImageSize.W1024xH1024,\n        Quality = GeneratedImageQuality.High,\n        Style = GeneratedImageStyle.Vivid\n    });\n\nConsole.WriteLine($\"Image URL: {image.ImageUri}\");\n```\n\n## Audio (Whisper)\n\n### Transcription\n\n```csharp\nusing OpenAI.Audio;\n\nAudioClient audioClient = azureClient.GetAudioClient(\"whisper\");\n\nAudioTranscription transcription = await audioClient.TranscribeAudioAsync(\n    \"audio.mp3\",\n    new AudioTranscriptionOptions\n    {\n        ResponseFormat = AudioTranscriptionFormat.Verbose,\n        Language = \"en\"\n    });\n\nConsole.WriteLine(transcription.Text);\n```\n\n### Text-to-Speech\n\n```csharp\nBinaryData speech = await audioClient.GenerateSpeechAsync(\n    \"Hello, welcome to Azure OpenAI!\",\n    GeneratedSpeechVoice.Alloy,\n    new SpeechGenerationOptions\n    {\n        SpeedRatio = 1.0f,\n        ResponseFormat = GeneratedSpeechFormat.Mp3\n    });\n\nawait File.WriteAllBytesAsync(\"output.mp3\", speech.ToArray());\n```\n\n## Function Calling (Tools)\n\n```csharp\nChatTool getCurrentWeatherTool = ChatTool.CreateFunctionTool(\n    functionName: \"get_current_weather\",\n    functionDescription: \"Get the current weather in a given location\",\n    functionParameters: BinaryData.FromString(\"\"\"\n        {\n            \"type\": \"object\",\n            \"properties\": {\n                \"location\": {\n                    \"type\": \"string\",\n                    \"description\": \"The city and state, e.g. San Francisco, CA\"\n                },\n                \"unit\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"celsius\", \"fahrenheit\"]\n                }\n            },\n            \"required\": [\"location\"]\n        }\n        \"\"\"));\n\nChatCompletionOptions options = new()\n{\n    Tools = { getCurrentWeatherTool }\n};\n\nChatCompletion completion = await chatClient.CompleteChatAsync(\n    [new UserChatMessage(\"What's the weather in Seattle?\")],\n    options);\n\nif (completion.FinishReason == ChatFinishReason.ToolCalls)\n{\n    foreach (ChatToolCall toolCall in completion.ToolCalls)\n    {\n        Console.WriteLine($\"Function: {toolCall.FunctionName}\");\n        Console.WriteLine($\"Arguments: {toolCall.FunctionArguments}\");\n    }\n}\n```\n\n## Key Types Reference\n\n| Type | Purpose |\n|------|---------|\n| `AzureOpenAIClient` | Top-level client for Azure OpenAI |\n| `ChatClient` | Chat completions |\n| `EmbeddingClient` | Text embeddings |\n| `ImageClient` | Image generation (DALL-E) |\n| `AudioClient` | Audio transcription\u002FTTS |\n| `ChatCompletion` | Chat response |\n| `ChatCompletionOptions` | Request configuration |\n| `StreamingChatCompletionUpdate` | Streaming response chunk |\n| `ChatMessage` | Base message type |\n| `SystemChatMessage` | System prompt |\n| `UserChatMessage` | User input |\n| `AssistantChatMessage` | Assistant response |\n| `DeveloperChatMessage` | Developer message (reasoning models) |\n| `ChatTool` | Function\u002Ftool definition |\n| `ChatToolCall` | Tool invocation request |\n\n## Best Practices\n\n1. **Use Entra ID in production** — Avoid API keys; use `DefaultAzureCredential`\n2. **Reuse client instances** — Create once, share across requests\n3. **Handle rate limits** — Implement exponential backoff for 429 errors\n4. **Stream for long responses** — Use `CompleteChatStreamingAsync` for better UX\n5. **Set appropriate timeouts** — Long completions may need extended timeouts\n6. **Use structured outputs** — JSON schema ensures consistent response format\n7. **Monitor token usage** — Track `completion.Usage` for cost management\n8. **Validate tool calls** — Always validate function arguments before execution\n\n## Error Handling\n\n```csharp\nusing Azure;\n\ntry\n{\n    ChatCompletion completion = await chatClient.CompleteChatAsync(messages);\n}\ncatch (RequestFailedException ex) when (ex.Status == 429)\n{\n    Console.WriteLine(\"Rate limited. Retry after delay.\");\n    await Task.Delay(TimeSpan.FromSeconds(10));\n}\ncatch (RequestFailedException ex) when (ex.Status == 400)\n{\n    Console.WriteLine($\"Bad request: {ex.Message}\");\n}\ncatch (RequestFailedException ex)\n{\n    Console.WriteLine($\"Azure OpenAI error: {ex.Status} - {ex.Message}\");\n}\n```\n\n## Related SDKs\n\n| SDK | Purpose | Install |\n|-----|---------|---------|\n| `Azure.AI.OpenAI` | Azure OpenAI client (this SDK) | `dotnet add package Azure.AI.OpenAI` |\n| `OpenAI` | OpenAI compatibility | `dotnet add package OpenAI` |\n| `Azure.Identity` | Authentication | `dotnet add package Azure.Identity` |\n| `Azure.Search.Documents` | AI Search for RAG | `dotnet add package Azure.Search.Documents` |\n\n## Reference Links\n\n| Resource | URL |\n|----------|-----|\n| NuGet Package | https:\u002F\u002Fwww.nuget.org\u002Fpackages\u002FAzure.AI.OpenAI |\n| API Reference | https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Fazure.ai.openai |\n| Migration Guide (1.0→2.0) | https:\u002F\u002Flearn.microsoft.com\u002Fazure\u002Fai-services\u002Fopenai\u002Fhow-to\u002Fdotnet-migration |\n| Quickstart | https:\u002F\u002Flearn.microsoft.com\u002Fazure\u002Fai-services\u002Fopenai\u002Fquickstart |\n| GitHub Source | https:\u002F\u002Fgithub.com\u002FAzure\u002Fazure-sdk-for-net\u002Ftree\u002Fmain\u002Fsdk\u002Fopenai\u002FAzure.AI.OpenAI |\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n",{},"release\u002Fv4.2.11-panel-pro","a92ea02bcf7e2b3dbaf46d49696c29a3cb490d4f",".github\u002Fskills\u002Fazure-ai-openai-dotnet","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-","https:\u002F\u002Fgithub.com\u002Fjaviertarazon","2026-07-12 07:10:45",{"source":7,"skillName":5,"commands":34,"prompt":44,"zipAvailable":45},[35,38,41],{"tool":36,"command":37},"npx","npx skills add javiertarazon\u002Fide-agente-free-jt7- --skill azure-ai-openai-dotnet",{"tool":39,"command":40},"bunx","bunx skills add javiertarazon\u002Fide-agente-free-jt7- --skill azure-ai-openai-dotnet",{"tool":42,"command":43},"pnpm","pnpm dlx skills add javiertarazon\u002Fide-agente-free-jt7- --skill azure-ai-openai-dotnet","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fazure-ai-openai-dotnet\u002FSKILL.md",true,[],[48,80,107,127,142,164],{"skillNo":49,"name":50,"nameZh":6,"description":51,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":52,"categories":53,"keywords":59,"publishedAt":22},"01M71TQ7Q6Z10VWF3C2H5X1KW9","zustand-store-ts","Create Zustand stores with TypeScript, subscribeWithSelector middleware, and proper state\u002Faction separation. Use when building React state management, creating global stores, or implementing reacti...","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fzustand-store-ts\u002FSKILL.md",[54],{"categoryNo":55,"categoryName":56,"taxonomyType":57,"taxonomyTypeDesc":58},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",[60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79],"zustand","store","zustand store ts","community","middleware","implementing","use","react state management","when","unknown","react","with","state","create","state management","typescript","action","management","separation","global",{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":89,"publishedAt":22},"01M71TQ5EAR40G6W0MV5ZDVEZT","zoom-automation","Automate Zoom meeting creation, management, recordings, webinars, and participant tracking via Rube MCP (Composio). Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fzoom-automation\u002FSKILL.md",[86],{"categoryNo":87,"categoryName":88,"taxonomyType":57,"taxonomyTypeDesc":58},"01JBSEEDCAT000000000000023","Skill与智能体开发",[90,91,92,63,93,94,95,96,97,69,98,99,100,101,102,103,104,105,77,106],"zoom automation","zoom","automation","creation","for","search","schemas","MCP","first","via","meeting","search tools","tracking","webinars","composio","recordings","Tools",{"skillNo":108,"name":109,"nameZh":6,"description":110,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":114,"publishedAt":22},"01M71TQ29B1EYBCEAP1ZBGXQ1A","zoho-crm-automation","Automate Zoho CRM tasks via Rube MCP (Composio): create\u002Fupdate records, search contacts, manage leads, and convert leads. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fzoho-crm-automation\u002FSKILL.md",[113],{"categoryNo":87,"categoryName":88,"taxonomyType":57,"taxonomyTypeDesc":58},[115,116,92,117,118,119,63,120,121,94,122,95,96,123,97,69,124,125,126,73],"crm automation","zoho crm automation","crm","zoho crm","zoho","leads","manage leads","manage","records","convert","tasks","contacts",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":134,"publishedAt":22},"01M71TPZPMN60DH0XV58KVHY23","zendesk-automation","Automate Zendesk tasks via Rube MCP (Composio): tickets, users, organizations, replies. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fzendesk-automation\u002FSKILL.md",[133],{"categoryNo":87,"categoryName":88,"taxonomyType":57,"taxonomyTypeDesc":58},[135,92,136,63,94,95,96,97,137,69,125,138,139,98,99,140,101,104,106,141],"zendesk automation","zendesk","organizations","replies","users","tickets","automate",{"skillNo":143,"name":144,"nameZh":6,"description":145,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":146,"categories":147,"keywords":148,"publishedAt":22},"01M71TPXDWKHKG4N6TVEPXWD0N","zapier-make-patterns","No-code automation democratizes workflow building. Zapier and Make (formerly Integromat) let non-developers automate business processes without writing code. But no-code doesn't mean no-complexity ...","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fzapier-make-patterns\u002FSKILL.md",[],[149,150,151,152,153,154,155,156,157,92,158,69,159,160,161,162,163,141],"zapier make patterns","zapier","patterns","make","No-Code","complexity","writing","spawner","business","workflow","code","integromat","apache","processes","but",{"skillNo":165,"name":166,"nameZh":6,"description":167,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":168,"categories":169,"keywords":173,"publishedAt":22},"01M71TPT5T10WXNKW9G7ZXZ27W","youtube-summarizer","Extract transcripts from YouTube videos and generate comprehensive, detailed summaries using intelligent analysis frameworks","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fyoutube-summarizer\u002FSKILL.md",[170],{"categoryNo":171,"categoryName":172,"taxonomyType":57,"taxonomyTypeDesc":58},"01JBSEEDCAT000000000000016","图像与多媒体",[174,175,176,177,63,178,179,180,181,182,183,184,159,185,186,187,188,189,190,191],"summarizer","youtube","youtube summarizer","Video","content-analysis","frameworks","copilot","2025","github-copilot","extract transcripts","analysis","codex","cli","summaries","github","generate","summarization","2026"]