如何在OpenAI Assistant本地正确处理code_interpreter工具(.NET)
OpenAI .NET客户端中Code Interpreter工具的正确处理方式
背景
我用OpenAI的.NET客户端开发自定义助理,配置了三个工具:自己实现的getNameOfFamilyMemberTool,以及OpenAI系统自带的file_search和code_interpreter。其中系统自带的工具无法自主定制或控制执行逻辑。
处理助理更新时,碰到code_interpreter的RequiredActionUpdate有两种问题情况:
- 完全不处理它:会直接报错“Expected tool outputs for call_ids”
- 返回占位
ToolOutput:能避免报错,但得不到有实际作用的结果
疑问:既然code_interpreter是OpenAI内部逻辑,正确的处理方式是什么?
正确处理方法
如果你的助理开启了code_interpreter工具,触发该工具调用后,不能用占位输出应付,必须交由OpenAI的内部逻辑完成代码解释操作。简单来说,你不需要自己实现代码运行逻辑,只需等待OpenAI处理完调用并返回Run的状态更新,再继续后续流程即可。
在.NET客户端中的核心处理逻辑是:识别到code_interpreter(或file_search这类系统工具)的调用时,不需要手动生成工具输出,直接继续监听Run的状态变化,直到OpenAI完成内部执行并返回结果。
修改后的代码示例
if (update is RequiredActionUpdate requiredActionUpdate) { if (requiredActionUpdate.FunctionName == "code_interpreter" || requiredActionUpdate.FunctionName == "file_search") { // 系统自带工具无需自定义输出,等待OpenAI内部处理完成即可 // 若使用流式更新,持续监听Run状态直到OpenAI返回处理结果 } else { // 处理本地自定义工具,例如getNameOfFamilyMemberTool var result = await _mediator.Send(requiredActionUpdate.GetCommand(), cancellationToken); outputsToSubmit.Add(new ToolOutput(requiredActionUpdate.ToolCallId, result?.ToString())); } } // 仅提交自定义工具的输出,系统工具的输出由OpenAI自行处理 if (outputsToSubmit.Count > 0) { asyncUpdates = _client.SubmitToolOutputsToRunStreamingAsync(currentRun.ThreadId, currentRun.Id, outputsToSubmit, cancellationToken); }
关键要点
code_interpreter和file_search这类系统工具的执行逻辑完全由OpenAI托管,你的代码只需监听Run的状态更新,无需手动生成工具输出。- 只有自定义工具才需要实现执行逻辑并提交输出,给系统工具添加自定义
ToolOutput反而会干扰OpenAI的内部执行流程。 - 若使用流式更新,需持续监听Run状态,直到其进入
completed或其他终止状态,期间OpenAI会自行处理系统工具的执行并返回中间结果。
内容的提问来源于stack exchange,提问作者Ali Ajouz
相关产品推荐
相关产品推荐

