Skip to content

Commit aef44d0

Browse files
simonpryddenSimon Prydden
and
Simon Prydden
authored
Make open ai provider compatible with openai>=1.66.0 (apache#47726)
closes: apache#47642 Co-authored-by: Simon Prydden <[email protected]>
1 parent 3bfeb54 commit aef44d0

File tree

6 files changed

+37
-38
lines changed

6 files changed

+37
-38
lines changed

generated/provider_dependencies.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -970,7 +970,7 @@
970970
"openai": {
971971
"deps": [
972972
"apache-airflow>=2.9.0",
973-
"openai[datalib]>=1.32.0,<1.66.0"
973+
"openai[datalib]>=1.66.0"
974974
],
975975
"devel-deps": [],
976976
"plugins": [],

providers/openai/README.rst

+4-4
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,12 @@ The package supports the following python versions: 3.9,3.10,3.11,3.12
5050
Requirements
5151
------------
5252

53-
=================== ====================
53+
=================== ==================
5454
PIP package Version required
55-
=================== ====================
55+
=================== ==================
5656
``apache-airflow`` ``>=2.9.0``
57-
``openai[datalib]`` ``>=1.32.0,<1.66.0``
58-
=================== ====================
57+
``openai[datalib]`` ``>=1.66.0``
58+
=================== ==================
5959

6060
The changelog for the provider package can be found in the
6161
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-openai/1.5.2/changelog.html>`_.

providers/openai/pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ requires-python = "~=3.9"
5858
# After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build``
5959
dependencies = [
6060
"apache-airflow>=2.9.0",
61-
"openai[datalib]>=1.32.0,<1.66.0", # Pinned due to https://github.com/apache/airflow/issues/47642
61+
"openai[datalib]>=1.66.0",
6262
]
6363

6464
[dependency-groups]

providers/openai/src/airflow/providers/openai/get_provider_info.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,6 @@ def get_provider_info():
6464
"connection-type": "openai",
6565
}
6666
],
67-
"dependencies": ["apache-airflow>=2.9.0", "openai[datalib]>=1.32.0,<1.66.0"],
67+
"dependencies": ["apache-airflow>=2.9.0", "openai[datalib]>=1.66.0"],
6868
"devel-dependencies": [],
6969
}

providers/openai/src/airflow/providers/openai/hooks/openai.py

+14-16
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,15 @@
2525
from openai import OpenAI
2626

2727
if TYPE_CHECKING:
28-
from openai.types import FileDeleted, FileObject
29-
from openai.types.batch import Batch
30-
from openai.types.beta import (
31-
Assistant,
32-
AssistantDeleted,
33-
Thread,
34-
ThreadDeleted,
28+
from openai.types import (
29+
FileDeleted,
30+
FileObject,
3531
VectorStore,
3632
VectorStoreDeleted,
3733
)
34+
from openai.types.batch import Batch
35+
from openai.types.beta import Assistant, AssistantDeleted, Thread, ThreadDeleted
3836
from openai.types.beta.threads import Message, Run
39-
from openai.types.beta.vector_stores import VectorStoreFile, VectorStoreFileBatch, VectorStoreFileDeleted
4037
from openai.types.chat import (
4138
ChatCompletionAssistantMessageParam,
4239
ChatCompletionFunctionMessageParam,
@@ -45,6 +42,7 @@
4542
ChatCompletionToolMessageParam,
4643
ChatCompletionUserMessageParam,
4744
)
45+
from openai.types.vector_stores import VectorStoreFile, VectorStoreFileBatch, VectorStoreFileDeleted
4846
from airflow.hooks.base import BaseHook
4947
from airflow.providers.openai.exceptions import OpenAIBatchJobException, OpenAIBatchTimeout
5048

@@ -349,12 +347,12 @@ def delete_file(self, file_id: str) -> FileDeleted:
349347

350348
def create_vector_store(self, **kwargs: Any) -> VectorStore:
351349
"""Create a vector store."""
352-
vector_store = self.conn.beta.vector_stores.create(**kwargs)
350+
vector_store = self.conn.vector_stores.create(**kwargs)
353351
return vector_store
354352

355353
def get_vector_stores(self, **kwargs: Any) -> list[VectorStore]:
356354
"""Return a list of vector stores."""
357-
vector_stores = self.conn.beta.vector_stores.list(**kwargs)
355+
vector_stores = self.conn.vector_stores.list(**kwargs)
358356
return vector_stores.data
359357

360358
def get_vector_store(self, vector_store_id: str) -> VectorStore:
@@ -363,7 +361,7 @@ def get_vector_store(self, vector_store_id: str) -> VectorStore:
363361
364362
:param vector_store_id: The ID of the vector store to retrieve.
365363
"""
366-
vector_store = self.conn.beta.vector_stores.retrieve(vector_store_id=vector_store_id)
364+
vector_store = self.conn.vector_stores.retrieve(vector_store_id=vector_store_id)
367365
return vector_store
368366

369367
def modify_vector_store(self, vector_store_id: str, **kwargs: Any) -> VectorStore:
@@ -372,7 +370,7 @@ def modify_vector_store(self, vector_store_id: str, **kwargs: Any) -> VectorStor
372370
373371
:param vector_store_id: The ID of the vector store to modify.
374372
"""
375-
vector_store = self.conn.beta.vector_stores.update(vector_store_id=vector_store_id, **kwargs)
373+
vector_store = self.conn.vector_stores.update(vector_store_id=vector_store_id, **kwargs)
376374
return vector_store
377375

378376
def delete_vector_store(self, vector_store_id: str) -> VectorStoreDeleted:
@@ -381,7 +379,7 @@ def delete_vector_store(self, vector_store_id: str) -> VectorStoreDeleted:
381379
382380
:param vector_store_id: The ID of the vector store to delete.
383381
"""
384-
response = self.conn.beta.vector_stores.delete(vector_store_id=vector_store_id)
382+
response = self.conn.vector_stores.delete(vector_store_id=vector_store_id)
385383
return response
386384

387385
def upload_files_to_vector_store(
@@ -394,7 +392,7 @@ def upload_files_to_vector_store(
394392
to.
395393
:param files: A list of binary files to upload.
396394
"""
397-
file_batch = self.conn.beta.vector_stores.file_batches.upload_and_poll(
395+
file_batch = self.conn.vector_stores.file_batches.upload_and_poll(
398396
vector_store_id=vector_store_id, files=files
399397
)
400398
return file_batch
@@ -405,7 +403,7 @@ def get_vector_store_files(self, vector_store_id: str) -> list[VectorStoreFile]:
405403
406404
:param vector_store_id:
407405
"""
408-
vector_store_files = self.conn.beta.vector_stores.files.list(vector_store_id=vector_store_id)
406+
vector_store_files = self.conn.vector_stores.files.list(vector_store_id=vector_store_id)
409407
return vector_store_files.data
410408

411409
def delete_vector_store_file(self, vector_store_id: str, file_id: str) -> VectorStoreFileDeleted:
@@ -415,7 +413,7 @@ def delete_vector_store_file(self, vector_store_id: str, file_id: str) -> Vector
415413
:param vector_store_id: The ID of the vector store that the file belongs to.
416414
:param file_id: The ID of the file to delete.
417415
"""
418-
response = self.conn.beta.vector_stores.files.delete(vector_store_id=vector_store_id, file_id=file_id)
416+
response = self.conn.vector_stores.files.delete(vector_store_id=vector_store_id, file_id=file_id)
419417
return response
420418

421419
def create_batch(

providers/openai/tests/unit/openai/hooks/test_openai.py

+16-15
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,19 @@
2121

2222
import pytest
2323
from openai.pagination import SyncCursorPage
24-
from openai.types import Batch, CreateEmbeddingResponse, Embedding, FileDeleted, FileObject
25-
from openai.types.beta import (
26-
Assistant,
27-
AssistantDeleted,
28-
Thread,
29-
ThreadDeleted,
24+
from openai.types import (
25+
Batch,
26+
CreateEmbeddingResponse,
27+
Embedding,
28+
FileDeleted,
29+
FileObject,
3030
VectorStore,
3131
VectorStoreDeleted,
3232
)
33+
from openai.types.beta import Assistant, AssistantDeleted, Thread, ThreadDeleted
3334
from openai.types.beta.threads import Message, Run
34-
from openai.types.beta.vector_stores import VectorStoreFile, VectorStoreFileBatch, VectorStoreFileDeleted
3535
from openai.types.chat import ChatCompletion
36+
from openai.types.vector_stores import VectorStoreFile, VectorStoreFileBatch, VectorStoreFileDeleted
3637

3738
from airflow.models import Connection
3839
from airflow.providers.openai.exceptions import OpenAIBatchJobException, OpenAIBatchTimeout
@@ -458,29 +459,29 @@ def test_delete_file(mock_openai_hook):
458459

459460

460461
def test_create_vector_store(mock_openai_hook, mock_vector_store):
461-
mock_openai_hook.conn.beta.vector_stores.create.return_value = mock_vector_store
462+
mock_openai_hook.conn.vector_stores.create.return_value = mock_vector_store
462463
vector_store = mock_openai_hook.create_vector_store(name=VECTOR_STORE_NAME)
463464
assert vector_store.id == VECTOR_STORE_ID
464465
assert vector_store.name == VECTOR_STORE_NAME
465466

466467

467468
def test_get_vector_store(mock_openai_hook, mock_vector_store):
468-
mock_openai_hook.conn.beta.vector_stores.retrieve.return_value = mock_vector_store
469+
mock_openai_hook.conn.vector_stores.retrieve.return_value = mock_vector_store
469470
vector_store = mock_openai_hook.get_vector_store(vector_store_id=VECTOR_STORE_ID)
470471
assert vector_store.id == VECTOR_STORE_ID
471472
assert vector_store.name == VECTOR_STORE_NAME
472473

473474

474475
def test_get_vector_stores(mock_openai_hook, mock_vector_store_list):
475-
mock_openai_hook.conn.beta.vector_stores.list.return_value = mock_vector_store_list
476+
mock_openai_hook.conn.vector_stores.list.return_value = mock_vector_store_list
476477
vector_stores = mock_openai_hook.get_vector_stores()
477478
assert isinstance(vector_stores, list)
478479

479480

480481
def test_modify_vector_store(mock_openai_hook, mock_vector_store):
481482
new_vector_store_name = "New Vector Store"
482483
mock_vector_store.name = new_vector_store_name
483-
mock_openai_hook.conn.beta.vector_stores.update.return_value = mock_vector_store
484+
mock_openai_hook.conn.vector_stores.update.return_value = mock_vector_store
484485
vector_store = mock_openai_hook.modify_vector_store(
485486
vector_store_id=VECTOR_STORE_ID, name=new_vector_store_name
486487
)
@@ -489,14 +490,14 @@ def test_modify_vector_store(mock_openai_hook, mock_vector_store):
489490

490491
def test_delete_vector_store(mock_openai_hook):
491492
delete_response = VectorStoreDeleted(id=VECTOR_STORE_ID, object="vector_store.deleted", deleted=True)
492-
mock_openai_hook.conn.beta.vector_stores.delete.return_value = delete_response
493+
mock_openai_hook.conn.vector_stores.delete.return_value = delete_response
493494
vector_store_deleted = mock_openai_hook.delete_vector_store(vector_store_id=VECTOR_STORE_ID)
494495
assert vector_store_deleted.deleted
495496

496497

497498
def test_upload_files_to_vector_store(mock_openai_hook, mock_vector_file_store_batch):
498499
files = ["file1.txt", "file2.txt", "file3.txt"]
499-
mock_openai_hook.conn.beta.vector_stores.file_batches.upload_and_poll.return_value = (
500+
mock_openai_hook.conn.vector_stores.file_batches.upload_and_poll.return_value = (
500501
mock_vector_file_store_batch
501502
)
502503
vector_file_store_batch = mock_openai_hook.upload_files_to_vector_store(
@@ -507,7 +508,7 @@ def test_upload_files_to_vector_store(mock_openai_hook, mock_vector_file_store_b
507508

508509

509510
def test_get_vector_store_files(mock_openai_hook, mock_vector_file_store_list):
510-
mock_openai_hook.conn.beta.vector_stores.files.list.return_value = mock_vector_file_store_list
511+
mock_openai_hook.conn.vector_stores.files.list.return_value = mock_vector_file_store_list
511512
vector_file_store_list = mock_openai_hook.get_vector_store_files(vector_store_id=VECTOR_STORE_ID)
512513
assert isinstance(vector_file_store_list, list)
513514

@@ -516,7 +517,7 @@ def test_delete_vector_store_file(mock_openai_hook):
516517
delete_response = VectorStoreFileDeleted(
517518
id="test_file_abc123", object="vector_store.file.deleted", deleted=True
518519
)
519-
mock_openai_hook.conn.beta.vector_stores.files.delete.return_value = delete_response
520+
mock_openai_hook.conn.vector_stores.files.delete.return_value = delete_response
520521
vector_store_file_deleted = mock_openai_hook.delete_vector_store_file(
521522
vector_store_id=VECTOR_STORE_ID, file_id=FILE_ID
522523
)

0 commit comments

Comments
 (0)