Skip to content

Commit 6b427f3

Browse files
feat(api): run polling helpers (#1289)
refactor: rename createAndStream to stream
1 parent 58d6b77 commit 6b427f3

File tree

8 files changed

+610
-31
lines changed

8 files changed

+610
-31
lines changed

README.md

+19-1
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,30 @@ we recommend using [python-dotenv](https://pypi.org/project/python-dotenv/)
5151
to add `OPENAI_API_KEY="My API Key"` to your `.env` file
5252
so that your API Key is not stored in source control.
5353

54+
### Polling Helpers
55+
56+
When interacting with the API some actions such as starting a Run may take time to complete. The SDK includes
57+
helper functions which will poll the status until it reaches a terminal state and then return the resulting object.
58+
If an API method results in an action which could benefit from polling there will be a corresponding version of the
59+
method ending in '\_and_poll'.
60+
61+
For instance to create a Run and poll until it reaches a terminal state you can run:
62+
63+
```python
64+
run = client.beta.threads.runs.create_and_poll(
65+
thread_id=thread.id,
66+
assistant_id=assistant.id,
67+
)
68+
```
69+
70+
More information on the lifecycle of a Run can be found in the [Run Lifecycle Documentation](https://platform.openai.com/docs/assistants/how-it-works/run-lifecycle)
71+
5472
### Streaming Helpers
5573

5674
The SDK also includes helpers to process streams and handle the incoming events.
5775

5876
```python
59-
with client.beta.threads.runs.create_and_stream(
77+
with client.beta.threads.runs.stream(
6078
thread_id=thread.id,
6179
assistant_id=assistant.id,
6280
instructions="Please address the user as Jane Doe. The user has a premium account.",

api.md

+5
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ Methods:
230230
- <code title="post /threads/{thread_id}">client.beta.threads.<a href="./src/openai/resources/beta/threads/threads.py">update</a>(thread_id, \*\*<a href="src/openai/types/beta/thread_update_params.py">params</a>) -> <a href="./src/openai/types/beta/thread.py">Thread</a></code>
231231
- <code title="delete /threads/{thread_id}">client.beta.threads.<a href="./src/openai/resources/beta/threads/threads.py">delete</a>(thread_id) -> <a href="./src/openai/types/beta/thread_deleted.py">ThreadDeleted</a></code>
232232
- <code title="post /threads/runs">client.beta.threads.<a href="./src/openai/resources/beta/threads/threads.py">create_and_run</a>(\*\*<a href="src/openai/types/beta/thread_create_and_run_params.py">params</a>) -> <a href="./src/openai/types/beta/threads/run.py">Run</a></code>
233+
- <code>client.beta.threads.<a href="./src/openai/resources/beta/threads/threads.py">create_and_run_poll</a>(\*args) -> Run</code>
233234
- <code>client.beta.threads.<a href="./src/openai/resources/beta/threads/threads.py">create_and_run_stream</a>(\*args) -> AssistantStreamManager[AssistantEventHandler] | AssistantStreamManager[AssistantEventHandlerT]</code>
234235

235236
### Runs
@@ -248,7 +249,11 @@ Methods:
248249
- <code title="get /threads/{thread_id}/runs">client.beta.threads.runs.<a href="./src/openai/resources/beta/threads/runs/runs.py">list</a>(thread_id, \*\*<a href="src/openai/types/beta/threads/run_list_params.py">params</a>) -> <a href="./src/openai/types/beta/threads/run.py">SyncCursorPage[Run]</a></code>
249250
- <code title="post /threads/{thread_id}/runs/{run_id}/cancel">client.beta.threads.runs.<a href="./src/openai/resources/beta/threads/runs/runs.py">cancel</a>(run_id, \*, thread_id) -> <a href="./src/openai/types/beta/threads/run.py">Run</a></code>
250251
- <code title="post /threads/{thread_id}/runs/{run_id}/submit_tool_outputs">client.beta.threads.runs.<a href="./src/openai/resources/beta/threads/runs/runs.py">submit_tool_outputs</a>(run_id, \*, thread_id, \*\*<a href="src/openai/types/beta/threads/run_submit_tool_outputs_params.py">params</a>) -> <a href="./src/openai/types/beta/threads/run.py">Run</a></code>
252+
- <code>client.beta.threads.runs.<a href="./src/openai/resources/beta/threads/runs/runs.py">create_and_poll</a>(\*args) -> Run</code>
251253
- <code>client.beta.threads.runs.<a href="./src/openai/resources/beta/threads/runs/runs.py">create_and_stream</a>(\*args) -> AssistantStreamManager[AssistantEventHandler] | AssistantStreamManager[AssistantEventHandlerT]</code>
254+
- <code>client.beta.threads.runs.<a href="./src/openai/resources/beta/threads/runs/runs.py">poll</a>(\*args) -> Run</code>
255+
- <code>client.beta.threads.runs.<a href="./src/openai/resources/beta/threads/runs/runs.py">stream</a>(\*args) -> AssistantStreamManager[AssistantEventHandler] | AssistantStreamManager[AssistantEventHandlerT]</code>
256+
- <code>client.beta.threads.runs.<a href="./src/openai/resources/beta/threads/runs/runs.py">submit_tool_outputs_and_poll</a>(\*args) -> Run</code>
252257
- <code>client.beta.threads.runs.<a href="./src/openai/resources/beta/threads/runs/runs.py">submit_tool_outputs_stream</a>(\*args) -> AssistantStreamManager[AssistantEventHandler] | AssistantStreamManager[AssistantEventHandlerT]</code>
253258

254259
#### Steps

examples/assistant.py

+9-18
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import time
21

32
import openai
43

@@ -20,28 +19,20 @@
2019
content="I need to solve the equation `3x + 11 = 14`. Can you help me?",
2120
)
2221

23-
run = client.beta.threads.runs.create(
22+
run = client.beta.threads.runs.create_and_poll(
2423
thread_id=thread.id,
2524
assistant_id=assistant.id,
2625
instructions="Please address the user as Jane Doe. The user has a premium account.",
2726
)
2827

29-
print("checking assistant status. ")
30-
while True:
31-
run = client.beta.threads.runs.retrieve(thread_id=thread.id, run_id=run.id)
28+
print("Run completed with status: " + run.status)
3229

33-
if run.status == "completed":
34-
print("done!")
35-
messages = client.beta.threads.messages.list(thread_id=thread.id)
30+
if run.status == "completed":
31+
messages = client.beta.threads.messages.list(thread_id=thread.id)
3632

37-
print("messages: ")
38-
for message in messages:
39-
assert message.content[0].type == "text"
40-
print({"role": message.role, "message": message.content[0].text.value})
33+
print("messages: ")
34+
for message in messages:
35+
assert message.content[0].type == "text"
36+
print({"role": message.role, "message": message.content[0].text.value})
4137

42-
client.beta.assistants.delete(assistant.id)
43-
44-
break
45-
else:
46-
print("in progress...")
47-
time.sleep(5)
38+
client.beta.assistants.delete(assistant.id)

examples/assistant_stream_helpers.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def main() -> None:
6363
)
6464
print(f"Question: {question}\n")
6565

66-
with client.beta.threads.runs.create_and_stream(
66+
with client.beta.threads.runs.stream(
6767
thread_id=thread.id,
6868
assistant_id=assistant.id,
6969
instructions="Please address the user as Jane Doe. The user has a premium account.",

helpers.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,11 @@ class EventHandler(AssistantEventHandler):
4646
if output.type == "logs":
4747
print(f"\n{output.logs}", flush=True)
4848

49-
# Then, we use the `create_and_stream` SDK helper
49+
# Then, we use the `stream` SDK helper
5050
# with the `EventHandler` class to create the Run
5151
# and stream the response.
5252

53-
with client.beta.threads.runs.create_and_stream(
53+
with client.beta.threads.runs.stream(
5454
thread_id="thread_id",
5555
assistant_id="assistant_id",
5656
event_handler=EventHandler(),
@@ -63,7 +63,7 @@ with client.beta.threads.runs.create_and_stream(
6363
You can also iterate over all the streamed events.
6464

6565
```python
66-
with client.beta.threads.runs.create_and_stream(
66+
with client.beta.threads.runs.stream(
6767
thread_id=thread.id,
6868
assistant_id=assistant.id
6969
) as stream:
@@ -78,7 +78,7 @@ with client.beta.threads.runs.create_and_stream(
7878
You can also iterate over just the text deltas received
7979

8080
```python
81-
with client.beta.threads.runs.create_and_stream(
81+
with client.beta.threads.runs.stream(
8282
thread_id=thread.id,
8383
assistant_id=assistant.id
8484
) as stream:
@@ -91,7 +91,7 @@ with client.beta.threads.runs.create_and_stream(
9191
There are three helper methods for creating streams:
9292

9393
```python
94-
client.beta.threads.runs.create_and_stream()
94+
client.beta.threads.runs.stream()
9595
```
9696

9797
This method can be used to start and stream the response to an existing run with an associated thread

0 commit comments

Comments
 (0)