Skip to content

Commit 0bba033

Browse files
stainless-botmegamanics
authored andcommitted
feat(api): add vector stores (openai#1325)
1 parent 8d97261 commit 0bba033

File tree

75 files changed

+4830
-1305
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+4830
-1305
lines changed

.stats.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
configured_endpoints: 55
1+
configured_endpoints: 62

README.md

+15-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ so that your API Key is not stored in source control.
5353

5454
### Polling Helpers
5555

56-
When interacting with the API some actions such as starting a Run may take time to complete. The SDK includes
56+
When interacting with the API some actions such as starting a Run and adding files to vector stores are asynchronous and take time to complete. The SDK includes
5757
helper functions which will poll the status until it reaches a terminal state and then return the resulting object.
5858
If an API method results in an action which could benefit from polling there will be a corresponding version of the
5959
method ending in '\_and_poll'.
@@ -69,6 +69,20 @@ run = client.beta.threads.runs.create_and_poll(
6969

7070
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)
7171

72+
### Bulk Upload Helpers
73+
74+
When creating an interacting with vector stores, you can use the polling helpers to monitor the status of operations.
75+
For convenience, we also provide a bulk upload helper to allow you to simultaneously upload several files at once.
76+
77+
```python
78+
sample_files = [Path("sample-paper.pdf"), ...]
79+
80+
batch = await client.vector_stores.file_batches.upload_and_poll(
81+
store.id,
82+
files=sample_files,
83+
)
84+
```
85+
7286
### Streaming Helpers
7387

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

api.md

+65-40
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,59 @@ Methods:
196196

197197
# Beta
198198

199+
## VectorStores
200+
201+
Types:
202+
203+
```python
204+
from openai.types.beta import VectorStore, VectorStoreDeleted
205+
```
206+
207+
Methods:
208+
209+
- <code title="post /vector_stores">client.beta.vector_stores.<a href="./src/openai/resources/beta/vector_stores/vector_stores.py">create</a>(\*\*<a href="src/openai/types/beta/vector_store_create_params.py">params</a>) -> <a href="./src/openai/types/beta/vector_store.py">VectorStore</a></code>
210+
- <code title="get /vector_stores/{vector_store_id}">client.beta.vector_stores.<a href="./src/openai/resources/beta/vector_stores/vector_stores.py">retrieve</a>(vector_store_id) -> <a href="./src/openai/types/beta/vector_store.py">VectorStore</a></code>
211+
- <code title="post /vector_stores/{vector_store_id}">client.beta.vector_stores.<a href="./src/openai/resources/beta/vector_stores/vector_stores.py">update</a>(vector_store_id, \*\*<a href="src/openai/types/beta/vector_store_update_params.py">params</a>) -> <a href="./src/openai/types/beta/vector_store.py">VectorStore</a></code>
212+
- <code title="get /vector_stores">client.beta.vector_stores.<a href="./src/openai/resources/beta/vector_stores/vector_stores.py">list</a>(\*\*<a href="src/openai/types/beta/vector_store_list_params.py">params</a>) -> <a href="./src/openai/types/beta/vector_store.py">SyncCursorPage[VectorStore]</a></code>
213+
- <code title="delete /vector_stores/{vector_store_id}">client.beta.vector_stores.<a href="./src/openai/resources/beta/vector_stores/vector_stores.py">delete</a>(vector_store_id) -> <a href="./src/openai/types/beta/vector_store_deleted.py">VectorStoreDeleted</a></code>
214+
215+
### Files
216+
217+
Types:
218+
219+
```python
220+
from openai.types.beta.vector_stores import VectorStoreFile, VectorStoreFileDeleted
221+
```
222+
223+
Methods:
224+
225+
- <code title="post /vector_stores/{vector_store_id}/files">client.beta.vector_stores.files.<a href="./src/openai/resources/beta/vector_stores/files.py">create</a>(vector_store_id, \*\*<a href="src/openai/types/beta/vector_stores/file_create_params.py">params</a>) -> <a href="./src/openai/types/beta/vector_stores/vector_store_file.py">VectorStoreFile</a></code>
226+
- <code title="get /vector_stores/{vector_store_id}/files/{file_id}">client.beta.vector_stores.files.<a href="./src/openai/resources/beta/vector_stores/files.py">retrieve</a>(file_id, \*, vector_store_id) -> <a href="./src/openai/types/beta/vector_stores/vector_store_file.py">VectorStoreFile</a></code>
227+
- <code title="get /vector_stores/{vector_store_id}/files">client.beta.vector_stores.files.<a href="./src/openai/resources/beta/vector_stores/files.py">list</a>(vector_store_id, \*\*<a href="src/openai/types/beta/vector_stores/file_list_params.py">params</a>) -> <a href="./src/openai/types/beta/vector_stores/vector_store_file.py">SyncCursorPage[VectorStoreFile]</a></code>
228+
- <code title="delete /vector_stores/{vector_store_id}/files/{file_id}">client.beta.vector_stores.files.<a href="./src/openai/resources/beta/vector_stores/files.py">delete</a>(file_id, \*, vector_store_id) -> <a href="./src/openai/types/beta/vector_stores/vector_store_file_deleted.py">VectorStoreFileDeleted</a></code>
229+
- <code>client.beta.vector_stores.files.<a href="./src/openai/resources/beta/vector_stores/files.py">create_and_poll</a>(\*args) -> VectorStoreFile</code>
230+
- <code>client.beta.vector_stores.files.<a href="./src/openai/resources/beta/vector_stores/files.py">poll</a>(\*args) -> VectorStoreFile</code>
231+
- <code>client.beta.vector_stores.files.<a href="./src/openai/resources/beta/vector_stores/files.py">upload</a>(\*args) -> VectorStoreFile</code>
232+
- <code>client.beta.vector_stores.files.<a href="./src/openai/resources/beta/vector_stores/files.py">upload_and_poll</a>(\*args) -> VectorStoreFile</code>
233+
234+
### FileBatches
235+
236+
Types:
237+
238+
```python
239+
from openai.types.beta.vector_stores import VectorStoreFileBatch
240+
```
241+
242+
Methods:
243+
244+
- <code title="post /vector_stores/{vector_store_id}/file_batches">client.beta.vector_stores.file_batches.<a href="./src/openai/resources/beta/vector_stores/file_batches.py">create</a>(vector_store_id, \*\*<a href="src/openai/types/beta/vector_stores/file_batch_create_params.py">params</a>) -> <a href="./src/openai/types/beta/vector_stores/vector_store_file_batch.py">VectorStoreFileBatch</a></code>
245+
- <code title="get /vector_stores/{vector_store_id}/file_batches/{batch_id}">client.beta.vector_stores.file_batches.<a href="./src/openai/resources/beta/vector_stores/file_batches.py">retrieve</a>(batch_id, \*, vector_store_id) -> <a href="./src/openai/types/beta/vector_stores/vector_store_file_batch.py">VectorStoreFileBatch</a></code>
246+
- <code title="post /vector_stores/{vector_store_id}/file_batches/{batch_id}/cancel">client.beta.vector_stores.file_batches.<a href="./src/openai/resources/beta/vector_stores/file_batches.py">cancel</a>(batch_id, \*, vector_store_id) -> <a href="./src/openai/types/beta/vector_stores/vector_store_file_batch.py">VectorStoreFileBatch</a></code>
247+
- <code title="get /vector_stores/{vector_store_id}/file_batches/{batch_id}/files">client.beta.vector_stores.file_batches.<a href="./src/openai/resources/beta/vector_stores/file_batches.py">list_files</a>(batch_id, \*, vector_store_id, \*\*<a href="src/openai/types/beta/vector_stores/file_batch_list_files_params.py">params</a>) -> <a href="./src/openai/types/beta/vector_stores/vector_store_file.py">SyncCursorPage[VectorStoreFile]</a></code>
248+
- <code>client.beta.vector_stores.file_batches.<a href="./src/openai/resources/beta/vector_stores/file_batches.py">create_and_poll</a>(\*args) -> VectorStoreFileBatch</code>
249+
- <code>client.beta.vector_stores.file_batches.<a href="./src/openai/resources/beta/vector_stores/file_batches.py">poll</a>(\*args) -> VectorStoreFileBatch</code>
250+
- <code>client.beta.vector_stores.file_batches.<a href="./src/openai/resources/beta/vector_stores/file_batches.py">upload_and_poll</a>(\*args) -> VectorStoreFileBatch</code>
251+
199252
## Assistants
200253

201254
Types:
@@ -207,9 +260,9 @@ from openai.types.beta import (
207260
AssistantStreamEvent,
208261
AssistantTool,
209262
CodeInterpreterTool,
263+
FileSearchTool,
210264
FunctionTool,
211265
MessageStreamEvent,
212-
RetrievalTool,
213266
RunStepStreamEvent,
214267
RunStreamEvent,
215268
ThreadStreamEvent,
@@ -218,26 +271,11 @@ from openai.types.beta import (
218271

219272
Methods:
220273

221-
- <code title="post /assistants">client.beta.assistants.<a href="./src/openai/resources/beta/assistants/assistants.py">create</a>(\*\*<a href="src/openai/types/beta/assistant_create_params.py">params</a>) -> <a href="./src/openai/types/beta/assistant.py">Assistant</a></code>
222-
- <code title="get /assistants/{assistant_id}">client.beta.assistants.<a href="./src/openai/resources/beta/assistants/assistants.py">retrieve</a>(assistant_id) -> <a href="./src/openai/types/beta/assistant.py">Assistant</a></code>
223-
- <code title="post /assistants/{assistant_id}">client.beta.assistants.<a href="./src/openai/resources/beta/assistants/assistants.py">update</a>(assistant_id, \*\*<a href="src/openai/types/beta/assistant_update_params.py">params</a>) -> <a href="./src/openai/types/beta/assistant.py">Assistant</a></code>
224-
- <code title="get /assistants">client.beta.assistants.<a href="./src/openai/resources/beta/assistants/assistants.py">list</a>(\*\*<a href="src/openai/types/beta/assistant_list_params.py">params</a>) -> <a href="./src/openai/types/beta/assistant.py">SyncCursorPage[Assistant]</a></code>
225-
- <code title="delete /assistants/{assistant_id}">client.beta.assistants.<a href="./src/openai/resources/beta/assistants/assistants.py">delete</a>(assistant_id) -> <a href="./src/openai/types/beta/assistant_deleted.py">AssistantDeleted</a></code>
226-
227-
### Files
228-
229-
Types:
230-
231-
```python
232-
from openai.types.beta.assistants import AssistantFile, FileDeleteResponse
233-
```
234-
235-
Methods:
236-
237-
- <code title="post /assistants/{assistant_id}/files">client.beta.assistants.files.<a href="./src/openai/resources/beta/assistants/files.py">create</a>(assistant_id, \*\*<a href="src/openai/types/beta/assistants/file_create_params.py">params</a>) -> <a href="./src/openai/types/beta/assistants/assistant_file.py">AssistantFile</a></code>
238-
- <code title="get /assistants/{assistant_id}/files/{file_id}">client.beta.assistants.files.<a href="./src/openai/resources/beta/assistants/files.py">retrieve</a>(file_id, \*, assistant_id) -> <a href="./src/openai/types/beta/assistants/assistant_file.py">AssistantFile</a></code>
239-
- <code title="get /assistants/{assistant_id}/files">client.beta.assistants.files.<a href="./src/openai/resources/beta/assistants/files.py">list</a>(assistant_id, \*\*<a href="src/openai/types/beta/assistants/file_list_params.py">params</a>) -> <a href="./src/openai/types/beta/assistants/assistant_file.py">SyncCursorPage[AssistantFile]</a></code>
240-
- <code title="delete /assistants/{assistant_id}/files/{file_id}">client.beta.assistants.files.<a href="./src/openai/resources/beta/assistants/files.py">delete</a>(file_id, \*, assistant_id) -> <a href="./src/openai/types/beta/assistants/file_delete_response.py">FileDeleteResponse</a></code>
274+
- <code title="post /assistants">client.beta.assistants.<a href="./src/openai/resources/beta/assistants.py">create</a>(\*\*<a href="src/openai/types/beta/assistant_create_params.py">params</a>) -> <a href="./src/openai/types/beta/assistant.py">Assistant</a></code>
275+
- <code title="get /assistants/{assistant_id}">client.beta.assistants.<a href="./src/openai/resources/beta/assistants.py">retrieve</a>(assistant_id) -> <a href="./src/openai/types/beta/assistant.py">Assistant</a></code>
276+
- <code title="post /assistants/{assistant_id}">client.beta.assistants.<a href="./src/openai/resources/beta/assistants.py">update</a>(assistant_id, \*\*<a href="src/openai/types/beta/assistant_update_params.py">params</a>) -> <a href="./src/openai/types/beta/assistant.py">Assistant</a></code>
277+
- <code title="get /assistants">client.beta.assistants.<a href="./src/openai/resources/beta/assistants.py">list</a>(\*\*<a href="src/openai/types/beta/assistant_list_params.py">params</a>) -> <a href="./src/openai/types/beta/assistant.py">SyncCursorPage[Assistant]</a></code>
278+
- <code title="delete /assistants/{assistant_id}">client.beta.assistants.<a href="./src/openai/resources/beta/assistants.py">delete</a>(assistant_id) -> <a href="./src/openai/types/beta/assistant_deleted.py">AssistantDeleted</a></code>
241279

242280
## Threads
243281

@@ -298,11 +336,11 @@ from openai.types.beta.threads.runs import (
298336
CodeInterpreterOutputImage,
299337
CodeInterpreterToolCall,
300338
CodeInterpreterToolCallDelta,
339+
FileSearchToolCall,
340+
FileSearchToolCallDelta,
301341
FunctionToolCall,
302342
FunctionToolCallDelta,
303343
MessageCreationStepDetails,
304-
RetrievalToolCall,
305-
RetrievalToolCallDelta,
306344
RunStep,
307345
RunStepDelta,
308346
RunStepDeltaEvent,
@@ -350,23 +388,10 @@ from openai.types.beta.threads import (
350388

351389
Methods:
352390

353-
- <code title="post /threads/{thread_id}/messages">client.beta.threads.messages.<a href="./src/openai/resources/beta/threads/messages/messages.py">create</a>(thread_id, \*\*<a href="src/openai/types/beta/threads/message_create_params.py">params</a>) -> <a href="./src/openai/types/beta/threads/message.py">Message</a></code>
354-
- <code title="get /threads/{thread_id}/messages/{message_id}">client.beta.threads.messages.<a href="./src/openai/resources/beta/threads/messages/messages.py">retrieve</a>(message_id, \*, thread_id) -> <a href="./src/openai/types/beta/threads/message.py">Message</a></code>
355-
- <code title="post /threads/{thread_id}/messages/{message_id}">client.beta.threads.messages.<a href="./src/openai/resources/beta/threads/messages/messages.py">update</a>(message_id, \*, thread_id, \*\*<a href="src/openai/types/beta/threads/message_update_params.py">params</a>) -> <a href="./src/openai/types/beta/threads/message.py">Message</a></code>
356-
- <code title="get /threads/{thread_id}/messages">client.beta.threads.messages.<a href="./src/openai/resources/beta/threads/messages/messages.py">list</a>(thread_id, \*\*<a href="src/openai/types/beta/threads/message_list_params.py">params</a>) -> <a href="./src/openai/types/beta/threads/message.py">SyncCursorPage[Message]</a></code>
357-
358-
#### Files
359-
360-
Types:
361-
362-
```python
363-
from openai.types.beta.threads.messages import MessageFile
364-
```
365-
366-
Methods:
367-
368-
- <code title="get /threads/{thread_id}/messages/{message_id}/files/{file_id}">client.beta.threads.messages.files.<a href="./src/openai/resources/beta/threads/messages/files.py">retrieve</a>(file_id, \*, thread_id, message_id) -> <a href="./src/openai/types/beta/threads/messages/message_file.py">MessageFile</a></code>
369-
- <code title="get /threads/{thread_id}/messages/{message_id}/files">client.beta.threads.messages.files.<a href="./src/openai/resources/beta/threads/messages/files.py">list</a>(message_id, \*, thread_id, \*\*<a href="src/openai/types/beta/threads/messages/file_list_params.py">params</a>) -> <a href="./src/openai/types/beta/threads/messages/message_file.py">SyncCursorPage[MessageFile]</a></code>
391+
- <code title="post /threads/{thread_id}/messages">client.beta.threads.messages.<a href="./src/openai/resources/beta/threads/messages.py">create</a>(thread_id, \*\*<a href="src/openai/types/beta/threads/message_create_params.py">params</a>) -> <a href="./src/openai/types/beta/threads/message.py">Message</a></code>
392+
- <code title="get /threads/{thread_id}/messages/{message_id}">client.beta.threads.messages.<a href="./src/openai/resources/beta/threads/messages.py">retrieve</a>(message_id, \*, thread_id) -> <a href="./src/openai/types/beta/threads/message.py">Message</a></code>
393+
- <code title="post /threads/{thread_id}/messages/{message_id}">client.beta.threads.messages.<a href="./src/openai/resources/beta/threads/messages.py">update</a>(message_id, \*, thread_id, \*\*<a href="src/openai/types/beta/threads/message_update_params.py">params</a>) -> <a href="./src/openai/types/beta/threads/message.py">Message</a></code>
394+
- <code title="get /threads/{thread_id}/messages">client.beta.threads.messages.<a href="./src/openai/resources/beta/threads/messages.py">list</a>(thread_id, \*\*<a href="src/openai/types/beta/threads/message_list_params.py">params</a>) -> <a href="./src/openai/types/beta/threads/message.py">SyncCursorPage[Message]</a></code>
370395

371396
# Batches
372397

helpers.md

+21
Original file line numberDiff line numberDiff line change
@@ -213,3 +213,24 @@ def get_final_messages(self) -> List[Message]
213213

214214
These methods are provided for convenience to collect information at the end of a stream. Calling these events
215215
will trigger consumption of the stream until completion and then return the relevant accumulated objects.
216+
217+
# Polling Helpers
218+
219+
When interacting with the API some actions such as starting a Run and adding files to vector stores are asynchronous and take time to complete.
220+
The SDK includes helper functions which will poll the status until it reaches a terminal state and then return the resulting object.
221+
If an API method results in an action which could benefit from polling there will be a corresponding version of the
222+
method ending in `_and_poll`.
223+
224+
All methods also allow you to set the polling frequency, how often the API is checked for an update, via a function argument (`poll_interval_ms`).
225+
226+
The polling methods are:
227+
228+
```python
229+
client.beta.threads.create_and_run_poll(...)
230+
client.beta.threads.runs.create_and_poll(...)
231+
client.beta.threads.runs.submit_tool_ouptputs_and_poll(...)
232+
client.beta.vector_stores.files.upload_and_poll(...)
233+
client.beta.vector_stores.files.create_and_poll(...)
234+
client.beta.vector_stores.file_batches.create_and_poll(...)
235+
client.beta.vector_stores.file_batches.upload_and_poll(...)
236+
```

pyproject.toml

+2-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ dev-dependencies = [
6363
"inline-snapshot >=0.7.0",
6464
"azure-identity >=1.14.1",
6565
"types-tqdm > 4",
66-
"types-pyaudio > 0"
66+
"types-pyaudio > 0",
67+
"trio >=0.22.2"
6768
]
6869

6970
[tool.rye.scripts]

requirements-dev.lock

+10
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ argcomplete==3.1.2
1818
asttokens==2.4.1
1919
# via inline-snapshot
2020
attrs==23.1.0
21+
# via outcome
2122
# via pytest
23+
# via trio
2224
azure-core==1.30.1
2325
# via azure-identity
2426
azure-identity==1.15.0
@@ -48,6 +50,7 @@ distro==1.8.0
4850
# via openai
4951
exceptiongroup==1.1.3
5052
# via anyio
53+
# via trio
5154
executing==2.0.1
5255
# via inline-snapshot
5356
filelock==3.12.4
@@ -63,6 +66,7 @@ idna==3.4
6366
# via anyio
6467
# via httpx
6568
# via requests
69+
# via trio
6670
importlib-metadata==7.0.0
6771
iniconfig==2.0.0
6872
# via pytest
@@ -83,6 +87,8 @@ numpy==1.26.3
8387
# via openai
8488
# via pandas
8589
# via pandas-stubs
90+
outcome==1.3.0.post0
91+
# via trio
8692
packaging==23.2
8793
# via black
8894
# via msal-extensions
@@ -136,6 +142,9 @@ sniffio==1.3.0
136142
# via anyio
137143
# via httpx
138144
# via openai
145+
# via trio
146+
sortedcontainers==2.4.0
147+
# via trio
139148
time-machine==2.9.0
140149
toml==0.10.2
141150
# via inline-snapshot
@@ -145,6 +154,7 @@ tomli==2.0.1
145154
# via pytest
146155
tqdm==4.66.1
147156
# via openai
157+
trio==0.22.2
148158
types-pyaudio==0.2.16.20240106
149159
types-pytz==2024.1.0.20240203
150160
# via pandas-stubs

src/openai/resources/beta/__init__.py

+14
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,22 @@
2424
AssistantsWithStreamingResponse,
2525
AsyncAssistantsWithStreamingResponse,
2626
)
27+
from .vector_stores import (
28+
VectorStores,
29+
AsyncVectorStores,
30+
VectorStoresWithRawResponse,
31+
AsyncVectorStoresWithRawResponse,
32+
VectorStoresWithStreamingResponse,
33+
AsyncVectorStoresWithStreamingResponse,
34+
)
2735

2836
__all__ = [
37+
"VectorStores",
38+
"AsyncVectorStores",
39+
"VectorStoresWithRawResponse",
40+
"AsyncVectorStoresWithRawResponse",
41+
"VectorStoresWithStreamingResponse",
42+
"AsyncVectorStoresWithStreamingResponse",
2943
"Assistants",
3044
"AsyncAssistants",
3145
"AssistantsWithRawResponse",

0 commit comments

Comments
 (0)