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..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, api_version: str): + 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 diff --git a/openai/api_resources/abstract/engine_api_resource.py b/openai/api_resources/abstract/engine_api_resource.py index 3126725e0c..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): @@ -71,14 +70,24 @@ def create( organization=None, **params, ): - engine = params.pop("engine", None) + 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' 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 d1a0ec1df4..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,11 +19,6 @@ 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", - ) 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/edit.py b/openai/api_resources/edit.py index 18295c22f4..61f1c36aa5 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 the Azure OpenAI API yet.") while True: try: diff --git a/openai/api_resources/embedding.py b/openai/api_resources/embedding.py index 883a5e1744..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,11 +22,6 @@ 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", - ) 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 e4b32a1f0f..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,11 +19,6 @@ 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", - ) 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'" ) diff --git a/openai/version.py b/openai/version.py index ccccb9d9b5..a31140d7da 100644 --- a/openai/version.py +++ b/openai/version.py @@ -1 +1 @@ -VERSION = "0.21.0" +VERSION = "0.22.0"