OpenAI函数调用指南:Python正确提交方法
对于一个文章开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《OpenAI Assistant函数调用指南:Python工具输出正确提交方法》,主要介绍了,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

本文详细阐述了在OpenAI Assistant API中处理函数调用并正确提交工具输出的方法。针对常见的`BadRequestError`问题,文章深入分析了错误原因,并提供了使用`client.beta.threads.runs.submit_tool_outputs`的正确解决方案。通过完整的Python代码示例和注意事项,旨在帮助开发者高效、准确地实现Assistant的函数调用功能,确保API交互的顺畅与可靠。
理解OpenAI Assistant的函数调用机制
OpenAI Assistant API提供了一个强大的功能,允许助手在对话过程中调用外部工具或函数来获取信息或执行操作。当助手需要调用某个函数时,它会将对话状态从“in_progress”转换为“requires_action”,并在run.required_action.submit_tool_outputs.tool_calls中提供需要调用的函数信息,包括函数名和参数。开发者的任务是执行这些函数,并将结果反馈给助手,以便其继续生成响应。
常见的错误与原因分析
许多开发者在首次尝试向Assistant提交函数执行结果时,可能会遇到类似于以下代码片段所示的错误:
# 错误的尝试
message = client.beta.threads.messages.create(
thread_id=thread.id,
role="tool", # 错误:此角色不适用于创建新消息来提交工具输出
content=ret,
)当尝试使用client.beta.threads.messages.create方法并指定role="tool"来提交函数执行结果时,API会返回openai.BadRequestError: Error code: 400 - {'error': {'message': "1 validation error for Request\nbody -> role\n value is not a valid enumeration member; permitted: 'user' (type=type_error.enum; enum_values=[
这个错误清晰地表明,client.beta.threads.messages.create方法中的role参数仅接受"user"(用户消息)或"assistant"(助手消息)。它并不是用来提交工具函数执行结果的接口。工具函数的结果需要通过专门的机制来通知Assistant,而不是作为普通对话消息的一部分。
正确的函数结果提交方法
OpenAI Assistant API为提交工具函数执行结果提供了专用的方法:client.beta.threads.runs.submit_tool_outputs。这个方法允许你将一个或多个工具调用的输出结果与特定的运行(Run)关联起来,从而让Assistant能够获取这些结果并继续处理。
其基本用法如下:
run = client.beta.threads.runs.submit_tool_outputs(
thread_id=thread.id,
run_id=run.id,
tool_outputs=[
{
"tool_call_id": tool_call_id,
"output": "your_function_output_string_here",
},
# 如果有多个工具调用,可以在这里添加更多字典
]
)- thread_id: 当前会话的线程ID。
- run_id: 当前处于requires_action状态的运行ID。
- tool_outputs: 一个列表,包含所有需要提交的工具输出。每个输出是一个字典,必须包含:
- tool_call_id: 助手在run.required_action.submit_tool_outputs.tool_calls中提供的具体工具调用的ID。这个ID用于将输出与助手请求的特定函数调用进行匹配。
- output: 对应工具函数执行后的结果字符串。
完整的示例代码
下面是一个完整的Python示例,演示了如何正确地处理Assistant的函数调用并提交结果:
from openai import OpenAI
import time
import os
import json # 导入json库,用于处理函数参数
# 初始化OpenAI客户端
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY")) # 建议从环境变量获取API_KEY
# 假设你已经创建并配置了一个Assistant,其ID存储在环境变量中
# 并添加了名为 'funnyfunc' 的工具
# 例如:assistant = client.beta.assistants.create(
# name="Function Caller Assistant",
# instructions="You are a helpful assistant that can call the funnyfunc.",
# model="gpt-4-turbo",
# tools=[{"type": "function", "function": {"name": "funnyfunc", "description": "Returns a funny value."}}]
# )
# 然后将 assistant.id 存储到环境变量 ALEXA_ASSISTANT_ID_OPENAI 中
assistant_id = os.environ.get("ALEXA_ASSISTANT_ID_OPENAI")
if not assistant_id:
raise ValueError("请设置环境变量 ALEXA_ASSISTANT_ID_OPENAI 为您的Assistant ID")
# 创建一个新的线程
thread = client.beta.threads.create()
# 辅助函数:等待Run完成
def wait_on_run(run_obj, thread_obj):
"""
等待Run对象完成执行,并返回最新的Run状态。
"""
while run_obj.status in ["queued", "in_progress", "cancelling"]:
time.sleep(0.5) # 适当增加等待时间以减少API调用频率
run_obj = client.beta.threads.runs.retrieve(
thread_id=thread_obj.id,
run_id=run_obj.id,
)
return run_obj
# 模拟自定义函数
def funnyfunc():
"""一个简单的模拟函数,返回一个字符串。"""
print("Executing funnyfunc...")
return "The funniest number is five!"
# 核心函数:向Assistant提问并处理函数调用
def ask_question_and_handle_tools(question_content):
"""
向Assistant提问,并处理可能的函数调用。
"""
# 1. 向线程添加用户消息
client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content=question_content,
)
# 2. 创建并运行Assistant
run = client.beta.threads.runs.create(
thread_id=thread.id,
assistant_id=assistant_id,
)
# 3. 等待Run完成或需要动作
run = wait_on_run(run, thread)
# 4. 循环处理 'requires_action' 状态
while run.status == 'requires_action':
if run.required_action.type == 'submit_tool_outputs':
tool_outputs_to_submit = []
for tool_call in run.required_action.submit_tool_outputs.tool_calls:
function_name = tool_call.function.name
tool_call_id = tool_call.id
# 假设我们只处理 'funnyfunc'
if function_name == 'funnyfunc':
# 在实际应用中,这里会解析 tool_call.function.arguments 并传递给实际函数
# 例如:args = json.loads(tool_call.function.arguments)
# result = funnyfunc(**args)
result = funnyfunc() # 调用模拟函数
tool_outputs_to_submit.append({
"tool_call_id": tool_call_id,
"output": result,
})
else:
# 对于未实现的函数,可以返回一个错误或默认值
print(f"Warning: Unimplemented function called: {function_name}")
tool_outputs_to_submit.append({
"tool_call_id": tool_call_id,
"output": f"Error: Function '{function_name}' not implemented.",
})
# 提交工具输出
run = client.beta.threads.runs.submit_tool_outputs(
thread_id=thread.id,
run_id=run.id,
tool_outputs=tool_outputs_to_submit
)
# 提交后,需要再次等待Run完成
run = wait_on_run(run, thread)
else:
raise NotImplementedError(f"Unhandled required action type: {run.required_action.type}")
# 5. Run完成后,获取Assistant的响应
if run.status == 'completed':
messages = client.beta.threads.messages.list(
thread_id=thread.id,
order="desc", # 获取最新消息
limit=1 # 只获取一条
)
# 查找最新的Assistant消息
for message in messages.data:
if message.role == "assistant":
for content_block in message.content:
if content_block.type == "text":
return content_block.text.value
return "No assistant response found."
else:
return f"Run finished with status: {run.status}"
# 提问并打印结果
response = ask_question_and_handle_tools("What is funnyfunc() equal to right now?")
print("\nAssistant's final response:")
print(response)
运行前请确保:
- 你已设置 OPENAI_API_KEY 环境变量。
- 你已创建了一个OpenAI Assistant,并为其添加了名为 funnyfunc 的Function Tool。
- 将你的Assistant ID赋值给 ALEXA_ASSISTANT_ID_OPENAI 环境变量。
注意事项
- 错误处理与重试机制:在生产环境中,wait_on_run函数应包含更健壮的错误处理和指数退避重试机制,以应对API调用失败或暂时性服务问题。
- 多工具调用:如果Assistant在一个requires_action状态下请求调用多个工具,run.required_action.submit_tool_outputs.tool_calls将是一个列表。你的代码需要遍历这个列表,为每个工具调用执行相应的函数,并收集所有结果,然后一次性通过submit_tool_outputs提交。
- 函数参数解析:当Assistant调用函数时,tool_call.function.arguments会包含函数参数的JSON字符串。你需要使用json.loads()来解析这些参数,并将其传递给你的实际函数。
- 状态管理:Assistant API是异步的。每次提交工具输出后,都需要再次等待Run完成或进入下一个requires_action状态。
- API版本:请确保你的openai Python库是最新版本,以兼容OpenAI Assistant API的最新功能和行为。
总结
正确处理OpenAI Assistant的函数调用是构建智能对话系统的关键一步。核心在于理解client.beta.threads.messages.create与client.beta.threads.runs.submit_tool_outputs之间的区别。前者用于常规的对话消息,而后者则是专门用于向Assistant反馈外部工具或函数执行结果的接口。通过遵循本文提供的指南和示例代码,开发者可以有效避免常见的BadRequestError,并成功地将外部功能集成到OpenAI Assistant中,从而实现更丰富、更强大的交互体验。
好了,本文到此结束,带大家了解了《OpenAI函数调用指南:Python正确提交方法》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多文章知识!
JS闭包是什么?怎么使用?
- 上一篇
- JS闭包是什么?怎么使用?
- 下一篇
- Win8系统日志查看教程详解
-
- 文章 · python教程 | 22分钟前 |
- Python如何统计用户数据?
- 101浏览 收藏
-
- 文章 · python教程 | 49分钟前 |
- ACADOS非线性成本配置详解
- 284浏览 收藏
-
- 文章 · python教程 | 1小时前 | Python Reload
- Pythonreload函数怎么用
- 254浏览 收藏
-
- 文章 · python教程 | 2小时前 | 多线程 返回值
- Python多线程获取结果的几种方法
- 206浏览 收藏
-
- 文章 · python教程 | 2小时前 |
- 图像处理预测分析全流程教程
- 105浏览 收藏
-
- 文章 · python教程 | 2小时前 | Python Python编程
- Python连接Redshift的SQLAlchemy教程
- 224浏览 收藏
-
- 文章 · python教程 | 2小时前 |
- PythonAPI嵌套循环解析方法
- 370浏览 收藏
-
- 文章 · python教程 | 4小时前 |
- Python图像识别开发实战技巧
- 253浏览 收藏
-
- 文章 · python教程 | 4小时前 |
- 实时数据流中动态最值查找技巧
- 490浏览 收藏
-
- 文章 · python教程 | 5小时前 |
- 自动化CSV传输教程:电商数据集成方法
- 356浏览 收藏
-
- 文章 · python教程 | 6小时前 |
- PythonNLP模型训练与微调教程
- 484浏览 收藏
-
- 文章 · python教程 | 6小时前 |
- A寻路算法陷阱:节点中断解决技巧
- 395浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3344次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3556次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3588次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4713次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3961次使用
-
- Flask框架安装技巧:让你的开发更高效
- 2024-01-03 501浏览
-
- Django框架中的并发处理技巧
- 2024-01-22 501浏览
-
- 提升Python包下载速度的方法——正确配置pip的国内源
- 2024-01-17 501浏览
-
- Python与C++:哪个编程语言更适合初学者?
- 2024-03-25 501浏览
-
- 品牌建设技巧
- 2024-04-06 501浏览

