.NET中如何处理Azure OpenAIClient.GetChatCompletionsAsync内容过滤异常?
捕获Azure OpenAI内容过滤的特定异常类型
在使用Azure.AI.OpenAI SDK的GetChatCompletionsAsync方法时,无需通过通用Exception捕获后解析字符串,可通过以下方式直接获取结构化的内容过滤异常信息:
步骤说明
确保使用最新版SDK
确认项目引用Azure.AI.OpenAINuGet包(版本1.0.0及以上),该版本开始提供结构化的异常及错误模型。捕获特定异常类型
内容过滤触发的异常属于Azure SDK通用的RequestFailedException类型,直接捕获该异常而非通用Exception。解析结构化错误信息
RequestFailedException的Content属性包含序列化的错误响应,可反序列化为SDK内置的ChatCompletionsErrorResponse对象,从中提取内容过滤的具体细节(类别、等级、是否过滤等)。
代码示例
using Azure; using Azure.AI.OpenAI; using System.Text.Json; try { // 初始化客户端 var client = new OpenAIClient( new Uri("你的Azure OpenAI端点"), new AzureKeyCredential("你的API密钥") ); // 构建请求参数 var chatOptions = new ChatCompletionsOptions { DeploymentName = "你的部署名称", Messages = { new ChatMessage(ChatRole.User, "违反内容政策的提示词") } }; // 调用接口 var response = await client.GetChatCompletionsAsync(chatOptions); } catch (RequestFailedException ex) { // 基础错误信息 Console.WriteLine($"HTTP状态码: {ex.Status}"); Console.WriteLine($"错误摘要: {ex.Message}"); // 解析结构化内容过滤信息 if (!string.IsNullOrWhiteSpace(ex.Content)) { var errorResponse = JsonSerializer.Deserialize<ChatCompletionsErrorResponse>(ex.Content); if (errorResponse?.Error?.Details != null) { foreach (var detail in errorResponse.Error.Details) { if (detail is ContentFilterResult filterResult) { Console.WriteLine($"过滤类别: {filterResult.Category}"); Console.WriteLine($"过滤等级: {filterResult.Severity}"); Console.WriteLine($"是否被过滤: {filterResult.Filtered}"); } } } } }
关键说明
ChatCompletionsErrorResponse和ContentFilterResult都是Azure.AI.OpenAI命名空间下的内置类,无需自定义。- 如果错误详情未自动强转为
ContentFilterResult,也可直接解析JSON对象的category、severity等键值对获取信息。
内容的提问来源于stack exchange,提问作者ms3300
相关产品推荐
相关产品推荐

