You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Semantic Kernel中OpenAIAssistantAgent组聊InvokeStreamingAsync空引用异常求助

问题描述
  • 环境:使用Semantic Kernel(.NET)通过APIM访问部署在瑞典中心(swedencentral)区域Azure AI Service的GPT-4o模型
  • 异常现象:创建包含多个OpenAIAssistantAgent的组聊天时,调用InvokeStreamingAsync方法抛出NullReferenceException,但调用InvokeAsync方法可正常运行
  • 区域差异:相同架构在法国中心(francecentral)区域可正常运行,瑞典中心区域服务更新更早
  • 排查情况:已配置所有资源的诊断设置,未捕获到错误;日志显示助手创建、线程启动、用户消息添加均完成,最后执行到threads/thread_..../runs步骤;已尝试Semantic Kernel 1.45和1.47版本

核心代码示例

AssistantClient assistantClient = OpenAIAssistantAgent.CreateAzureOpenAIClient(
    new ApiKeyCredential(apiKey),
    new Uri(endpoint),
    httpClient: httpClient).GetAssistantClient();

Assistant agentReviewer = await assistantClient.CreateAssistantAsync(
    deploymentName, new AssistantCreationOptions()
    {
        Name = ReviewerName,
        Instructions =
            """
            ...
            """,
        Description = "Your responsibility is to review and identify how to improve user provided content.",
        
    });

OpenAIAssistantAgent assistantAgentReviewer = new OpenAIAssistantAgent(
    agentReviewer,
    assistantClient);

异常调用栈

System.NullReferenceException: Object reference not set to an instance of an object.
   at OpenAI.AsyncSseUpdateCollection`1.AsyncSseUpdateEnumerator`1.System.Collections.Generic.IAsyncEnumerator<U>.MoveNextAsync()
   at OpenAI.AsyncSseUpdateCollection`1.GetValuesFromPageAsync(ClientResult page)+MoveNext()
   at OpenAI.AsyncSseUpdateCollection`1.GetValuesFromPageAsync(ClientResult page)+MoveNext()
   at OpenAI.AsyncSseUpdateCollection`1.GetValuesFromPageAsync(ClientResult page)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
   at System.ClientModel.AsyncCollectionResult`1.GetAsyncEnumerator(CancellationToken cancellationToken)+MoveNext()
   at System.ClientModel.AsyncCollectionResult`1.GetAsyncEnumerator(CancellationToken cancellationToken)+MoveNext()
   at System.ClientModel.AsyncCollectionResult`1.GetAsyncEnumerator(CancellationToken cancellationToken)+MoveNext()
   at System.ClientModel.AsyncCollectionResult`1.GetAsyncEnumerator(CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
   at Microsoft.SemanticKernel.Agents.OpenAI.Internal.AssistantThreadActions.InvokeStreamingAsync(OpenAIAssistantAgent agent, AssistantClient client, String threadId, IList`1 messages, RunCreationOptions invocationOptions, ILogger logger, Kernel kernel, KernelArguments arguments, CancellationToken cancellationToken)+MoveNext()
   at Microsoft.SemanticKernel.Agents.OpenAI.Internal.AssistantThreadActions.InvokeStreamingAsync(OpenAIAssistantAgent agent, AssistantClient client, String threadId, IList`1 messages, RunCreationOptions invocationOptions, ILogger logger, Kernel kernel, KernelArguments arguments, CancellationToken cancellationToken)+MoveNext()
   at Microsoft.SemanticKernel.Agents.OpenAI.Internal.AssistantThreadActions.InvokeStreamingAsync(OpenAIAssistantAgent agent, AssistantClient client, String threadId, IList`1 messages, RunCreationOptions invocationOptions, ILogger logger, Kernel kernel, KernelArguments arguments, CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
   at Microsoft.SemanticKernel.Diagnostics.ActivityExtensions.RunWithActivityAsync[TResult](Func`1 getActivity, Func`1 operation, CancellationToken cancellationToken)+MoveNext()
   at Microsoft.SemanticKernel.Diagnostics.ActivityExtensions.RunWithActivityAsync[TResult](Func`1 getActivity, Func`1 operation, CancellationToken cancellationToken)+MoveNext()
   at Microsoft.SemanticKernel.Diagnostics.ActivityExtensions.RunWithActivityAsync[TResult](Func`1 getActivity, Func`1 operation, CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
   at Microsoft.SemanticKernel.Agents.AgentChat.InvokeStreamingAgentAsync(Agent agent, CancellationToken cancellationToken)+MoveNext()
   at Microsoft.SemanticKernel.Agents.AgentChat.InvokeStreamingAgentAsync(Agent agent, CancellationToken cancellationToken)+MoveNext()
   at Microsoft.SemanticKernel.Agents.AgentChat.InvokeStreamingAgentAsync(Agent agent, CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
   at Microsoft.SemanticKernel.Agents.AgentGroupChat.InvokeStreamingAsync(Agent agent, CancellationToken cancellationToken)+MoveNext()
   at Microsoft.SemanticKernel.Agents.AgentGroupChat.InvokeStreamingAsync(Agent agent, CancellationToken cancellationToken)+MoveNext()
   at Microsoft.SemanticKernel.Agents.AgentGroupChat.InvokeStreamingAsync(Agent agent, CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
   at Microsoft.SemanticKernel.Agents.AgentGroupChat.InvokeStreamingAsync(CancellationToken cancellationToken)+MoveNext()
   at Microsoft.SemanticKernel.Agents.AgentGroupChat.InvokeStreamingAsync(CancellationToken cancellationToken)+MoveNext()
   at Microsoft.SemanticKernel.Agents.AgentGroupChat.InvokeStreamingAsync(CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
解决思路
  • 升级OpenAI .NET SDK版本:异常根因在OpenAI的SSE响应解析组件,旧版本SDK可能对瑞典中心区更新后的SSE响应格式兼容性不足。检查项目依赖的OpenAI包版本,升级到最新稳定版,确保与当前使用的Semantic Kernel版本兼容。
  • 排查APIM代理配置:APIM可能对SSE流式响应做了修改(如截断内容、修改HTTP头、启用缓存),导致SDK解析失败。尝试绕过APIM直接调用Azure AI端点测试,确认是否是APIM策略问题;同时检查APIM是否保留了text/event-stream类型的Content-Type头,以及是否禁用了流式响应的缓存策略。
  • 捕获原始SSE响应:在自定义HttpClient中添加请求拦截器,记录流式调用的原始响应内容,检查是否存在异常的SSE事件(如空data字段、格式错误的事件),定位解析失败的具体原因。
  • 核对流式调用参数:确认InvokeStreamingAsync使用的RunCreationOptions与InvokeAsync完全一致,特别是Stream参数是否被正确设置为true,避免参数差异导致的响应格式问题。
  • 提交官方Issue:若上述方法无效,将异常栈、区域信息、代码片段提交到Semantic Kernel或OpenAI .NET SDK的官方GitHub仓库,这可能是区域特定的服务兼容性bug。

内容的提问来源于stack exchange,提问作者Haiko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 06:37:35