python 访问openai assistant api(一)
目录
一、简介
二、案例
三、消息循环总结
一、简介
使用 Python 访问 OpenAI Assistant API(如 GPT 模型),你需要使用 OpenAI 提供的官方 Python SDK。
官网介绍
https://platform.openai.com/docs/api-reference/assistants
目前只有简短的使用介绍,但是已经涵盖了所有需要注意的要点。
Assistants相关的对象
assistant:定义了assistant的名称,角色,可调用的openai模型和可使用的工具
thread:assistant和user之间的会话环境,可以存储消息列表
message:由assistant和user创建的消息,可以包括文本、图像和其他文件,消息以列表的形式存储在线程上
run:run就是在线程上调用assistant,assistant使用它的配置和线程的thread通过调用模型和工具来执行任务
run step:assistant在运行过程中所采取步骤的详细信息
二、案例
# 导入必要的模块
import os
import time
import json
#from dotenv import load_dotenv
from openai import OpenAI# 加载环境变量
#load_dotenv()#能够访问
import os
os.environ["http_proxy"] = "http://localhost:7890"
os.environ["https_proxy"] = "http://localhost:7890"# 获取 API 密钥
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")# 实例化 OpenAI 客户端
client = OpenAI(api_key=OPENAI_API_KEY)# 上传文件#file = client.files.create(
# file=open("aa.json", "rb"),
# purpose='assistants'
#)# 1. 创建 Assistant
assistant = client.beta.assistants.create(name="程序员励志师",instructions="你是一个程序员励志师,你的职能就是只要有人给你发消息,你就鼓励他 和他说你的代码像银河一样漂亮,越夸张越好",model="gpt-3.5-turbo-0125",tools=[{"type": "file_search"},{'type': 'code_interpreter'},],#=[file.id]
)# 2. 创建 Thread
thread = client.beta.threads.create()# 3. 创建 Message
message = client.beta.threads.messages.create(thread_id=thread.id,role="user",content="我写代码好累啊?"#file_ids=[file.id],
)# 2 & 3
thread = client.beta.threads.create(messages=[{"role": "user","content": "我是c++开发工程师",#"file_ids": [file.id]}])# 4. 创建 Run
run = client.beta.threads.runs.create(thread_id=thread.id,assistant_id=assistant.id,
)# 5. 执行 Run
while True:run = client.beta.threads.runs.retrieve(thread_id=thread.id, run_id=run.id)if run.status not in ["queued", "in_progress"]:breaktime.sleep(1)# 6. 取出 Message
messages = client.beta.threads.messages.list(thread_id=thread.id
)
message = messages.data[0].content[0].text.value
print(message)
运行结果:
gpt-4o模型的回答
三、总结
注意run的生命周期
run 有多个状态: queued, in_progress, requires_action, cancelling, cancelled, failed, completed, expired,这个例子中如果不是 queued 或者 in_progress 状态就代表已经有结果了。requires_action 是智能助手使用 function 工具时才会存在的状态,这个例子不涉及。
状态 | 含义 |
---|---|
queued | 创建run之后 或者 使用function时确定了要调用的function及其参数 之后,就会进入这个状态,这个状态很短,马上会进入 in_progress状态。 |
in_progress | 使用模型或者tools处理消息。 |
completed | 本次运行成功完成,可以读取GPT响应的消息了。 |
requires_action | 使用function时,一旦模型确定要调用的function及其参数,run将进入这个状态。 |
expired | function执行的时间太长或者整个run运行的时间太长,达到了过期阈值(大约10分钟)。 |
cancelling | 可以在queued和in_progress状态时发起取消,将进入这个状态。 |
cancelled | 已成功取消。 |
failed | 您运行失败了,可以在 run.last_error 中获得失败原因。 |
因此获取消息时候,需要循环等待回复
# 执行 Run
while True:run = client.beta.threads.runs.retrieve(thread_id=thread.id, run_id=run.id)if run.status not in ["queued", "in_progress"]:breaktime.sleep(1)
看到另外一种写法,也记录一下。
while run.status == "queued" or run.status == "in_progress":time.sleep(1)run = client.beta.threads.runs.retrieve(thread_id=thread_userjia.id,run_id=run.id,)