From b87c80aca7f43008ed006376ac2cf9161e63ae5d Mon Sep 17 00:00:00 2001 From: Almo Sutedjo Date: Wed, 29 Jun 2022 13:57:46 +0200 Subject: [PATCH 1/7] Add deployment_id parameter overload for az --- examples/azure/embeddings.ipynb | 2 +- examples/azure/finetuning.ipynb | 2 +- openai/api_resources/abstract/api_resource.py | 2 +- .../abstract/engine_api_resource.py | 5 +++-- openai/api_resources/completion.py | 19 ++++++++++++++----- openai/api_resources/embedding.py | 19 ++++++++++++++----- openai/api_resources/search.py | 19 ++++++++++++++----- openai/util.py | 2 +- 8 files changed, 49 insertions(+), 21 deletions(-) diff --git a/examples/azure/embeddings.ipynb b/examples/azure/embeddings.ipynb index d7deefd9de..a3aac70f39 100644 --- a/examples/azure/embeddings.ipynb +++ b/examples/azure/embeddings.ipynb @@ -141,7 +141,7 @@ "metadata": {}, "outputs": [], "source": [ - "embeddings = openai.Embedding.create(engine=deployment_id,\n", + "embeddings = openai.Embedding.create(deployment_id=deployment_id,\n", " input=\"The food was delicious and the waiter...\")\n", " \n", "print(embeddings)" diff --git a/examples/azure/finetuning.ipynb b/examples/azure/finetuning.ipynb index f691980a92..76ed2f97b4 100644 --- a/examples/azure/finetuning.ipynb +++ b/examples/azure/finetuning.ipynb @@ -414,7 +414,7 @@ "source": [ "print('Sending a test completion job')\n", "start_phrase = 'When I go to the store, I want a'\n", - "response = openai.Completion.create(engine=deployment_id, prompt=start_phrase, max_tokens=4)\n", + "response = openai.Completion.create(deployment_id=deployment_id, prompt=start_phrase, max_tokens=4)\n", "text = response['choices'][0]['text'].replace('\\n', '').replace(' .', '.').strip()\n", "print(f'\"{start_phrase} {text}\"')\n" ] diff --git a/openai/api_resources/abstract/api_resource.py b/openai/api_resources/abstract/api_resource.py index 7324401af9..c5066a1c6e 100644 --- a/openai/api_resources/abstract/api_resource.py +++ b/openai/api_resources/abstract/api_resource.py @@ -110,7 +110,7 @@ def _static_request( ) @classmethod - def _get_api_type_and_version(cls, api_type: str, api_version: str): + def _get_api_type_and_version(cls, api_type: str = None, api_version: str = None): typed_api_type = ApiType.from_str( api_type) if api_type else ApiType.from_str(openai.api_type) typed_api_version = api_version or openai.api_version diff --git a/openai/api_resources/abstract/engine_api_resource.py b/openai/api_resources/abstract/engine_api_resource.py index 3126725e0c..4fbdc61b55 100644 --- a/openai/api_resources/abstract/engine_api_resource.py +++ b/openai/api_resources/abstract/engine_api_resource.py @@ -71,13 +71,14 @@ def create( organization=None, **params, ): - engine = params.pop("engine", None) + deployment_id = params.pop("deployment_id", None) + engine = params.pop("engine", deployment_id) timeout = params.pop("timeout", None) stream = params.get("stream", False) headers = params.pop("headers", None) if engine is None and cls.engine_required: raise error.InvalidRequestError( - "Must provide an 'engine' parameter to create a %s" % cls, "engine" + "Must provide an 'engine' or 'deployment_id' parameter to create a %s" % cls, "engine" ) if timeout is None: diff --git a/openai/api_resources/completion.py b/openai/api_resources/completion.py index d1a0ec1df4..3abf976acb 100644 --- a/openai/api_resources/completion.py +++ b/openai/api_resources/completion.py @@ -20,11 +20,20 @@ def create(cls, *args, **kwargs): """ start = time.time() timeout = kwargs.pop("timeout", None) - if kwargs.get("model", None) is None and kwargs.get("engine", None) is None: - raise InvalidRequestError( - "Must provide an 'engine' or 'model' parameter to create a Completion.", - param="engine", - ) + api_type = kwargs.pop("api_type", None) + typed_api_type = cls._get_api_type_and_version(api_type=api_type)[0] + if typed_api_type in (util.ApiType.AZURE, util.ApiType.AZURE_AD): + if kwargs.get("deployment_id", None) is None and kwargs.get("engine", None) is None: + raise InvalidRequestError( + "Must provide an 'engine' or 'deployment_id' parameter to create a Completion.", + param="engine", + ) + else: + if kwargs.get("model", None) is None and kwargs.get("engine", None) is None: + raise InvalidRequestError( + "Must provide an 'engine' or 'model' parameter to create a Completion.", + param="engine", + ) while True: try: diff --git a/openai/api_resources/embedding.py b/openai/api_resources/embedding.py index 883a5e1744..59d5c80df5 100644 --- a/openai/api_resources/embedding.py +++ b/openai/api_resources/embedding.py @@ -23,11 +23,20 @@ def create(cls, *args, **kwargs): """ start = time.time() timeout = kwargs.pop("timeout", None) - if kwargs.get("model", None) is None and kwargs.get("engine", None) is None: - raise InvalidRequestError( - "Must provide an 'engine' or 'model' parameter to create an Embedding.", - param="engine", - ) + api_type = kwargs.pop("api_type", None) + typed_api_type = cls._get_api_type_and_version(api_type=api_type)[0] + if typed_api_type in (util.ApiType.AZURE, util.ApiType.AZURE_AD): + if kwargs.get("deployment_id", None) is None and kwargs.get("engine", None) is None: + raise InvalidRequestError( + "Must provide an 'engine' or 'deployment_id' parameter to create an Embedding.", + param="engine", + ) + else: + if kwargs.get("model", None) is None and kwargs.get("engine", None) is None: + raise InvalidRequestError( + "Must provide an 'engine' or 'model' parameter to create an Embedding.", + param="engine", + ) user_provided_encoding_format = kwargs.get("encoding_format", None) diff --git a/openai/api_resources/search.py b/openai/api_resources/search.py index e4b32a1f0f..a72ea0455a 100644 --- a/openai/api_resources/search.py +++ b/openai/api_resources/search.py @@ -20,11 +20,20 @@ def create(cls, *args, **kwargs): start = time.time() timeout = kwargs.pop("timeout", None) - if kwargs.get("model", None) is None and kwargs.get("engine", None) is None: - raise InvalidRequestError( - "Must provide an 'engine' or 'model' parameter to create a Search.", - param="engine", - ) + api_type = kwargs.pop("api_type", None) + typed_api_type = cls._get_api_type_and_version(api_type=api_type)[0] + if typed_api_type in (util.ApiType.AZURE, util.ApiType.AZURE_AD): + if kwargs.get("deployment_id", None) is None and kwargs.get("engine", None) is None: + raise InvalidRequestError( + "Must provide an 'engine' or 'deployment_id' parameter to create a Search.", + param="engine", + ) + else: + if kwargs.get("model", None) is None and kwargs.get("engine", None) is None: + raise InvalidRequestError( + "Must provide an 'engine' or 'model' parameter to create a Search.", + param="engine", + ) while True: try: diff --git a/openai/util.py b/openai/util.py index e69fad0903..9cc0ba233e 100644 --- a/openai/util.py +++ b/openai/util.py @@ -40,7 +40,7 @@ def from_str(label): return ApiType.OPEN_AI else: raise openai.error.InvalidAPIType( - "The API type provided in invalid. Please select one of the supported API types: 'azure', 'open_ai'" + "The API type provided in invalid. Please select one of the supported API types: 'azure', 'azure_ad', 'open_ai'" ) From 51249bd0563c3afe2b38a920f2596a4b53768f3b Mon Sep 17 00:00:00 2001 From: Almo Sutedjo Date: Thu, 7 Jul 2022 10:08:59 +0200 Subject: [PATCH 2/7] Refactor error messages into engine_api_resource --- .../abstract/engine_api_resource.py | 18 +++++++++++++----- openai/api_resources/completion.py | 17 +---------------- openai/api_resources/deployment.py | 1 - openai/api_resources/embedding.py | 17 +---------------- openai/api_resources/model.py | 1 - openai/api_resources/search.py | 17 +---------------- 6 files changed, 16 insertions(+), 55 deletions(-) diff --git a/openai/api_resources/abstract/engine_api_resource.py b/openai/api_resources/abstract/engine_api_resource.py index 4fbdc61b55..b480060255 100644 --- a/openai/api_resources/abstract/engine_api_resource.py +++ b/openai/api_resources/abstract/engine_api_resource.py @@ -13,7 +13,6 @@ class EngineAPIResource(APIResource): - engine_required = True plain_old_data = False def __init__(self, engine: Optional[str] = None, **kwargs): @@ -73,13 +72,22 @@ def create( ): deployment_id = params.pop("deployment_id", None) engine = params.pop("engine", deployment_id) + model = params.get("model", None) timeout = params.pop("timeout", None) stream = params.get("stream", False) headers = params.pop("headers", None) - if engine is None and cls.engine_required: - raise error.InvalidRequestError( - "Must provide an 'engine' or 'deployment_id' parameter to create a %s" % cls, "engine" - ) + + typed_api_type = cls._get_api_type_and_version(api_type=api_type)[0] + if typed_api_type in (util.ApiType.AZURE, util.ApiType.AZURE_AD): + if deployment_id is None and engine is None: + raise error.InvalidRequestError( + "Must provide an 'engine' or 'deployment_id' parameter to create a %s" % cls, "engine" + ) + else: + if model is None and engine is None: + raise error.InvalidRequestError( + "Must provide an 'engine' or 'model' parameter to create a %s" % cls, "engine" + ) if timeout is None: # No special timeout handling diff --git a/openai/api_resources/completion.py b/openai/api_resources/completion.py index 3abf976acb..429597b46e 100644 --- a/openai/api_resources/completion.py +++ b/openai/api_resources/completion.py @@ -3,11 +3,10 @@ from openai import util from openai.api_resources.abstract import DeletableAPIResource, ListableAPIResource from openai.api_resources.abstract.engine_api_resource import EngineAPIResource -from openai.error import InvalidRequestError, TryAgain +from openai.error import TryAgain class Completion(EngineAPIResource): - engine_required = False OBJECT_NAME = "completions" @classmethod @@ -20,20 +19,6 @@ def create(cls, *args, **kwargs): """ start = time.time() timeout = kwargs.pop("timeout", None) - api_type = kwargs.pop("api_type", None) - typed_api_type = cls._get_api_type_and_version(api_type=api_type)[0] - if typed_api_type in (util.ApiType.AZURE, util.ApiType.AZURE_AD): - if kwargs.get("deployment_id", None) is None and kwargs.get("engine", None) is None: - raise InvalidRequestError( - "Must provide an 'engine' or 'deployment_id' parameter to create a Completion.", - param="engine", - ) - else: - if kwargs.get("model", None) is None and kwargs.get("engine", None) is None: - raise InvalidRequestError( - "Must provide an 'engine' or 'model' parameter to create a Completion.", - param="engine", - ) while True: try: diff --git a/openai/api_resources/deployment.py b/openai/api_resources/deployment.py index e7a59d91cd..dbc1df765e 100644 --- a/openai/api_resources/deployment.py +++ b/openai/api_resources/deployment.py @@ -4,7 +4,6 @@ class Deployment(CreateableAPIResource, ListableAPIResource, DeletableAPIResource): - engine_required = False OBJECT_NAME = "deployments" @classmethod diff --git a/openai/api_resources/embedding.py b/openai/api_resources/embedding.py index 59d5c80df5..85ede2c088 100644 --- a/openai/api_resources/embedding.py +++ b/openai/api_resources/embedding.py @@ -6,11 +6,10 @@ from openai import util from openai.api_resources.abstract import DeletableAPIResource, ListableAPIResource from openai.api_resources.abstract.engine_api_resource import EngineAPIResource -from openai.error import InvalidRequestError, TryAgain +from openai.error import TryAgain class Embedding(EngineAPIResource): - engine_required = False OBJECT_NAME = "embeddings" @classmethod @@ -23,20 +22,6 @@ def create(cls, *args, **kwargs): """ start = time.time() timeout = kwargs.pop("timeout", None) - api_type = kwargs.pop("api_type", None) - typed_api_type = cls._get_api_type_and_version(api_type=api_type)[0] - if typed_api_type in (util.ApiType.AZURE, util.ApiType.AZURE_AD): - if kwargs.get("deployment_id", None) is None and kwargs.get("engine", None) is None: - raise InvalidRequestError( - "Must provide an 'engine' or 'deployment_id' parameter to create an Embedding.", - param="engine", - ) - else: - if kwargs.get("model", None) is None and kwargs.get("engine", None) is None: - raise InvalidRequestError( - "Must provide an 'engine' or 'model' parameter to create an Embedding.", - param="engine", - ) user_provided_encoding_format = kwargs.get("encoding_format", None) diff --git a/openai/api_resources/model.py b/openai/api_resources/model.py index 6db9bb590e..9785e17fe1 100644 --- a/openai/api_resources/model.py +++ b/openai/api_resources/model.py @@ -2,5 +2,4 @@ class Model(ListableAPIResource, DeletableAPIResource): - engine_required = False OBJECT_NAME = "models" diff --git a/openai/api_resources/search.py b/openai/api_resources/search.py index a72ea0455a..adc113c1c4 100644 --- a/openai/api_resources/search.py +++ b/openai/api_resources/search.py @@ -2,11 +2,10 @@ from openai import util from openai.api_resources.abstract.engine_api_resource import EngineAPIResource -from openai.error import InvalidRequestError, TryAgain +from openai.error import TryAgain class Search(EngineAPIResource): - engine_required = False OBJECT_NAME = "search" @classmethod @@ -20,20 +19,6 @@ def create(cls, *args, **kwargs): start = time.time() timeout = kwargs.pop("timeout", None) - api_type = kwargs.pop("api_type", None) - typed_api_type = cls._get_api_type_and_version(api_type=api_type)[0] - if typed_api_type in (util.ApiType.AZURE, util.ApiType.AZURE_AD): - if kwargs.get("deployment_id", None) is None and kwargs.get("engine", None) is None: - raise InvalidRequestError( - "Must provide an 'engine' or 'deployment_id' parameter to create a Search.", - param="engine", - ) - else: - if kwargs.get("model", None) is None and kwargs.get("engine", None) is None: - raise InvalidRequestError( - "Must provide an 'engine' or 'model' parameter to create a Search.", - param="engine", - ) while True: try: From 8ca13854d54a6092929b907b39cbc09849e39970 Mon Sep 17 00:00:00 2001 From: Almo Sutedjo Date: Thu, 7 Jul 2022 10:09:21 +0200 Subject: [PATCH 3/7] Add unsupported warning for edit --- openai/api_resources/edit.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/openai/api_resources/edit.py b/openai/api_resources/edit.py index 18295c22f4..f17fae3efa 100644 --- a/openai/api_resources/edit.py +++ b/openai/api_resources/edit.py @@ -1,12 +1,11 @@ import time -from openai import util +from openai import util, error from openai.api_resources.abstract.engine_api_resource import EngineAPIResource -from openai.error import InvalidRequestError, TryAgain +from openai.error import TryAgain class Edit(EngineAPIResource): - engine_required = False OBJECT_NAME = "edits" @classmethod @@ -16,11 +15,12 @@ def create(cls, *args, **kwargs): """ start = time.time() timeout = kwargs.pop("timeout", None) - if kwargs.get("model", None) is None and kwargs.get("engine", None) is None: - raise InvalidRequestError( - "Must provide an 'engine' or 'model' parameter to create an Edit.", - param="engine", - ) + + api_type = kwargs.pop("api_type", None) + typed_api_type = cls._get_api_type_and_version(api_type=api_type)[0] + if typed_api_type in (util.ApiType.AZURE, util.ApiType.AZURE_AD): + raise error.InvalidAPIType( + "This operation is not supported by azure yet.") while True: try: From b093f2c4579cd85d45032114b89a2f4d22a0b807 Mon Sep 17 00:00:00 2001 From: Almo Sutedjo Date: Thu, 7 Jul 2022 10:12:18 +0200 Subject: [PATCH 4/7] bump version --- openai/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openai/version.py b/openai/version.py index ccccb9d9b5..0d9ce4b62a 100644 --- a/openai/version.py +++ b/openai/version.py @@ -1 +1 @@ -VERSION = "0.21.0" +VERSION = "0.21.1" From 5a3307487ee3089616e7a34a5445a0b83f7646e0 Mon Sep 17 00:00:00 2001 From: Almo Sutedjo Date: Thu, 7 Jul 2022 10:38:11 +0200 Subject: [PATCH 5/7] Correct optional type annotation --- openai/api_resources/abstract/api_resource.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openai/api_resources/abstract/api_resource.py b/openai/api_resources/abstract/api_resource.py index c5066a1c6e..c1091554ef 100644 --- a/openai/api_resources/abstract/api_resource.py +++ b/openai/api_resources/abstract/api_resource.py @@ -4,6 +4,7 @@ from openai import api_requestor, error, util from openai.openai_object import OpenAIObject from openai.util import ApiType +from typing import Optional class APIResource(OpenAIObject): @@ -110,7 +111,7 @@ def _static_request( ) @classmethod - def _get_api_type_and_version(cls, api_type: str = None, api_version: str = None): + def _get_api_type_and_version(cls, api_type: Optional[str] = None, api_version: Optional[str] = None): typed_api_type = ApiType.from_str( api_type) if api_type else ApiType.from_str(openai.api_type) typed_api_version = api_version or openai.api_version From 4732b87023bd1dd0232a7ace678bcf217759b68e Mon Sep 17 00:00:00 2001 From: Almo Sutedjo Date: Thu, 7 Jul 2022 10:38:24 +0200 Subject: [PATCH 6/7] Rebump version --- openai/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openai/version.py b/openai/version.py index 0d9ce4b62a..a31140d7da 100644 --- a/openai/version.py +++ b/openai/version.py @@ -1 +1 @@ -VERSION = "0.21.1" +VERSION = "0.22.0" From de2ce26b6f8da314df587527a70477aa4134ead5 Mon Sep 17 00:00:00 2001 From: Almo Sutedjo Date: Tue, 12 Jul 2022 16:23:47 +0200 Subject: [PATCH 7/7] Change unsupported method warning message --- openai/api_resources/edit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openai/api_resources/edit.py b/openai/api_resources/edit.py index f17fae3efa..61f1c36aa5 100644 --- a/openai/api_resources/edit.py +++ b/openai/api_resources/edit.py @@ -20,7 +20,7 @@ def create(cls, *args, **kwargs): typed_api_type = cls._get_api_type_and_version(api_type=api_type)[0] if typed_api_type in (util.ApiType.AZURE, util.ApiType.AZURE_AD): raise error.InvalidAPIType( - "This operation is not supported by azure yet.") + "This operation is not supported by the Azure OpenAI API yet.") while True: try: