Commit a7e3edf0

t-asutedjo <100279393+t-asutedjo@users.noreply.github.com>
2022-07-21 05:30:45
Add deployment_id parameter for azure (#109)
* Add deployment_id parameter overload for az * Refactor error messages into engine_api_resource * Add unsupported warning for edit * bump version * Correct optional type annotation * Rebump version * Change unsupported method warning message
1 parent 3005ee5
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)"
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"
    ]
openai/api_resources/abstract/api_resource.py
@@ -4,6 +4,7 @@ import openai
 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 @@ class APIResource(OpenAIObject):
         )
 
     @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
openai/api_resources/abstract/engine_api_resource.py
@@ -13,7 +13,6 @@ MAX_TIMEOUT = 20
 
 
 class EngineAPIResource(APIResource):
-    engine_required = True
     plain_old_data = False
 
     def __init__(self, engine: Optional[str] = None, **kwargs):
@@ -71,14 +70,24 @@ class EngineAPIResource(APIResource):
         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
openai/api_resources/completion.py
@@ -3,11 +3,10 @@ import time
 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 @@ class Completion(EngineAPIResource):
         """
         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:
openai/api_resources/deployment.py
@@ -4,7 +4,6 @@ from openai.error import InvalidRequestError, APIError
 
 
 class Deployment(CreateableAPIResource, ListableAPIResource, DeletableAPIResource):
-    engine_required = False
     OBJECT_NAME = "deployments"
 
     @classmethod
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 @@ class Edit(EngineAPIResource):
         """
         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:
openai/api_resources/embedding.py
@@ -6,11 +6,10 @@ import numpy as np
 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 @@ class Embedding(EngineAPIResource):
         """
         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)
 
openai/api_resources/model.py
@@ -2,5 +2,4 @@ from openai.api_resources.abstract import DeletableAPIResource, ListableAPIResou
 
 
 class Model(ListableAPIResource, DeletableAPIResource):
-    engine_required = False
     OBJECT_NAME = "models"
openai/api_resources/search.py
@@ -2,11 +2,10 @@ import time
 
 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 @@ class Search(EngineAPIResource):
 
         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:
openai/util.py
@@ -40,7 +40,7 @@ class ApiType(Enum):
             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'"
             )
 
 
openai/version.py
@@ -1,1 +1,1 @@
-VERSION = "0.21.0"
+VERSION = "0.22.0"