使用Azure OpenAI代码解释器时遭遇'thread.id'未知参数错误
Azure OpenAI代码解释器thread.id参数错误解决方法
问题场景
集成Azure OpenAI代码解释器时,调用create_and_run方法触发thread.id未知参数错误,相关代码及错误信息如下:
原代码
import os from openai import AzureOpenAI, AssistantEventHandler from dotenv import load_dotenv load_dotenv() client = AzureOpenAI( api_key=os.getenv("AZURE_OPENAI_API_KEY"), api_version=os.getenv("AZURE_OPENAI_API_VERSION"), azure_endpoint="2024-07-01-preview" # 此处错误:应为Azure OpenAI端点URL,而非API版本 ) # 上传文件 files = client.files.create( file=open("sum.py", "rb"), purpose="assistants" ) # 创建助手 assistant = client.beta.assistants.create( model="gpt-4o-mini", instructions="分析代码", tool_resources={"code_interpreter": {"file_ids": [files.id]}} ) # 创建线程 thread = client.beta.threads.create() # 发送用户消息 message = client.beta.threads.messages.create( thread_id=thread.id, content=r"编写计算三个数之和的代码", role="user" ) # 运行线程 resp = client.beta.threads.create_and_run( assistant_id=assistant.id, thread=thread, # 此处错误:create_and_run不接受thread对象作为参数 )
sum.py文件内容
def sum(a, b): return a + b tot = sum(10, 11) print(tot)
错误信息
Traceback (most recent call last): File "/home/openai-demos/code_interpreter.py", line 34, in <module> resp = client.beta.threads.create_and_run( File "/home/openai-demos/venv/lib/python3.10/site-packages/openai/_utils/_utils.py", line 274, in wrapper return func(*args, **kwargs) File "/home/openai-demos/venv/lib/python3.10/site-packages/openai/resources/beta/threads/threads.py", line 686, in create_and_run return self._post( File "/home/openai-demos/venv/lib/python3.10/site-packages/openai/_base_client.py", line 1260, in post return cast(ResponseT, self.request(cast_to, opts, stream=stream, stream_cls=stream_cls)) File "/home/openai-demos/venv/lib/python3.10/site-packages/openai/_base_client.py", line 937, in request return self._request( File "/home/openai-demos/venv/lib/python3.10/site-packages/openai/_base_client.py", line 1041, in _request raise self._make_status_error_from_response(err.response) from None openai.BadRequestError: Error code: 400 - {'error': {'message': "Unknown parameter: 'thread.id'.", 'type': 'invalid_request_error', 'param': 'thread.id', 'code': 'unknown_parameter'}}
错误原因
create_and_run参数误用:该方法不支持直接传入thread对象,已有线程时需传入thread_id参数;若无需提前操作线程,可通过messages参数在创建运行时直接生成新线程及消息。- AzureOpenAI初始化错误:
azure_endpoint被错误设置为API版本字符串,实际应为Azure OpenAI的端点URL(格式如https://<你的资源名称>.openai.azure.com/)。
修正后的代码
方案一:使用已创建的线程(传入thread_id)
import os from openai import AzureOpenAI, AssistantEventHandler from dotenv import load_dotenv load_dotenv() client = AzureOpenAI( api_key=os.getenv("AZURE_OPENAI_API_KEY"), api_version=os.getenv("AZURE_OPENAI_API_VERSION"), azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT") # 修正:使用正确的端点URL ) # 上传文件 files = client.files.create( file=open("sum.py", "rb"), purpose="assistants" ) # 创建助手 assistant = client.beta.assistants.create( model="gpt-4o-mini", instructions="分析代码", tool_resources={"code_interpreter": {"file_ids": [files.id]}} ) # 创建线程 thread = client.beta.threads.create() # 发送用户消息 message = client.beta.threads.messages.create( thread_id=thread.id, content=r"编写计算三个数之和的代码", role="user" ) # 运行线程:传入thread_id而非thread对象 resp = client.beta.threads.create_and_run( assistant_id=assistant.id, thread_id=thread.id, )
方案二:直接通过create_and_run创建线程和消息(更简洁)
若无需提前操作线程,可合并线程创建、消息发送和运行步骤:
import os from openai import AzureOpenAI, AssistantEventHandler from dotenv import load_dotenv load_dotenv() client = AzureOpenAI( api_key=os.getenv("AZURE_OPENAI_API_KEY"), api_version=os.getenv("AZURE_OPENAI_API_VERSION"), azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT") ) # 上传文件 files = client.files.create( file=open("sum.py", "rb"), purpose="assistants" ) # 创建助手 assistant = client.beta.assistants.create( model="gpt-4o-mini", instructions="分析代码", tool_resources={"code_interpreter": {"file_ids": [files.id]}} ) # 直接创建线程、发送消息并运行 resp = client.beta.threads.create_and_run( assistant_id=assistant.id, messages=[ { "role": "user", "content": r"编写计算三个数之和的代码" } ] )
额外注意事项
- 确保
.env文件中配置了正确的AZURE_OPENAI_API_KEY、AZURE_OPENAI_API_VERSION(如2024-07-01-preview)和AZURE_OPENAI_ENDPOINT。 - 运行后可通过
resp.id获取运行ID,调用client.beta.threads.runs.retrieve(thread_id=thread.id, run_id=resp.id)查询运行状态和结果。
内容的提问来源于stack exchange,提问作者user15980977
相关产品推荐
相关产品推荐

