Commit 64c45330

hallacy <hallacy@openai.com>
2022-05-25 07:51:52
V0.19.0: Support engineless and adds openai.Search.create (#97) tag: v0.19.0
* Remove engine requirement for embeddings (#131) * Add search helper (#130) * Add search helper * Move to default plurals * Remove bad imports * Add cli support and remove create_alpha * Bump version
1 parent 4d2cab1
openai/api_resources/abstract/api_resource.py
@@ -33,8 +33,8 @@ class APIResource(OpenAIObject):
         # with forward slashes (/), so replace the former with the latter.
         base = cls.OBJECT_NAME.replace(".", "/")  # type: ignore
         if cls.api_prefix:
-            return "/%s/%ss" % (cls.api_prefix, base)
-        return "/%ss" % (base)
+            return "/%s/%s" % (cls.api_prefix, base)
+        return "/%s" % (base)
 
     def instance_url(self, operation=None):
         id = self.get("id")
openai/api_resources/abstract/engine_api_resource.py
@@ -41,7 +41,7 @@ class EngineAPIResource(APIResource):
                     "You must provide the deployment name in the 'engine' parameter to access the Azure OpenAI service"
                 )
             extn = quote_plus(engine)
-            return "/%s/%s/%s/%ss?api-version=%s" % (
+            return "/%s/%s/%s/%s?api-version=%s" % (
                 cls.azure_api_prefix,
                 cls.azure_deployments_prefix,
                 extn,
@@ -51,10 +51,10 @@ class EngineAPIResource(APIResource):
 
         elif typed_api_type == ApiType.OPEN_AI:
             if engine is None:
-                return "/%ss" % (base)
+                return "/%s" % (base)
 
             extn = quote_plus(engine)
-            return "/engines/%s/%ss" % (extn, base)
+            return "/engines/%s/%s" % (extn, base)
 
         else:
             raise error.InvalidAPIType("Unsupported API type %s" % api_type)
@@ -153,7 +153,7 @@ class EngineAPIResource(APIResource):
                     "An API version is required for the Azure API type."
                 )
             base = self.OBJECT_NAME.replace(".", "/")
-            url = "/%s/%s/%s/%ss/%s?api-version=%s" % (
+            url = "/%s/%s/%s/%s/%s?api-version=%s" % (
                 self.azure_api_prefix,
                 self.azure_deployments_prefix,
                 self.engine,
openai/api_resources/experimental/completion_config.py
@@ -8,4 +8,4 @@ from openai.api_resources.abstract import (
 class CompletionConfig(
     CreateableAPIResource, ListableAPIResource, DeletableAPIResource
 ):
-    OBJECT_NAME = "experimental.completion_config"
+    OBJECT_NAME = "experimental.completion_configs"
openai/api_resources/completion.py
@@ -8,7 +8,7 @@ from openai.error import InvalidRequestError, TryAgain
 
 class Completion(EngineAPIResource, ListableAPIResource, DeletableAPIResource):
     engine_required = False
-    OBJECT_NAME = "completion"
+    OBJECT_NAME = "completions"
 
     @classmethod
     def create(cls, *args, **kwargs):
openai/api_resources/deployment.py
@@ -5,7 +5,7 @@ from openai.error import InvalidRequestError, APIError
 
 class Deployment(CreateableAPIResource, ListableAPIResource, DeletableAPIResource):
     engine_required = False
-    OBJECT_NAME = "deployment"
+    OBJECT_NAME = "deployments"
 
     @classmethod
     def create(cls, *args, **kwargs):
openai/api_resources/edit.py
@@ -7,7 +7,7 @@ from openai.error import InvalidRequestError, TryAgain
 
 class Edit(EngineAPIResource):
     engine_required = False
-    OBJECT_NAME = "edit"
+    OBJECT_NAME = "edits"
 
     @classmethod
     def create(cls, *args, **kwargs):
openai/api_resources/embedding.py
@@ -10,8 +10,8 @@ from openai.error import InvalidRequestError, TryAgain
 
 
 class Embedding(EngineAPIResource, ListableAPIResource, DeletableAPIResource):
-    engine_required = True
-    OBJECT_NAME = "embedding"
+    engine_required = False
+    OBJECT_NAME = "embeddings"
 
     @classmethod
     def create(cls, *args, **kwargs):
openai/api_resources/engine.py
@@ -8,7 +8,7 @@ from openai.util import ApiType
 
 
 class Engine(ListableAPIResource, UpdateableAPIResource):
-    OBJECT_NAME = "engine"
+    OBJECT_NAME = "engines"
 
     def generate(self, timeout=None, **params):
         start = time.time()
openai/api_resources/file.py
@@ -9,7 +9,7 @@ from openai.util import ApiType
 
 
 class File(ListableAPIResource, DeletableAPIResource):
-    OBJECT_NAME = "file"
+    OBJECT_NAME = "files"
 
     @classmethod
     def create(
openai/api_resources/fine_tune.py
@@ -13,7 +13,7 @@ from openai.util import ApiType
 
 @nested_resource_class_methods("event", operations=["list"])
 class FineTune(ListableAPIResource, CreateableAPIResource, DeletableAPIResource):
-    OBJECT_NAME = "fine-tune"
+    OBJECT_NAME = "fine-tunes"
 
     @classmethod
     def cancel(
openai/api_resources/model.py
@@ -3,4 +3,4 @@ from openai.api_resources.abstract import DeletableAPIResource, ListableAPIResou
 
 class Model(ListableAPIResource, DeletableAPIResource):
     engine_required = False
-    OBJECT_NAME = "model"
+    OBJECT_NAME = "models"
openai/api_resources/search.py
@@ -1,12 +1,36 @@
-from openai.api_resources.abstract.api_resource import APIResource
+import time
 
+from openai import util
+from openai.api_resources.abstract.engine_api_resource import EngineAPIResource
+from openai.error import InvalidRequestError, TryAgain
 
-class Search(APIResource):
-    @classmethod
-    def class_url(cls):
-        return "/search_indices/search"
+
+class Search(EngineAPIResource):
+    engine_required = False
+    OBJECT_NAME = "search"
 
     @classmethod
-    def create_alpha(cls, **params):
-        instance = cls()
-        return instance.request("post", cls.class_url(), params)
+    def create(cls, *args, **kwargs):
+        """
+        Creates a new search for the provided input and parameters.
+
+        See https://beta.openai.com/docs/api-reference/search for a list
+        of valid parameters.
+        """
+
+        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:
+                return super().create(*args, **kwargs)
+            except TryAgain as e:
+                if timeout is not None and time.time() > start + timeout:
+                    raise
+
+                util.log_info("Waiting for model to warm up", error=e)
openai/cli.py
@@ -266,11 +266,11 @@ class Search:
         )
 
     @classmethod
-    def create_alpha(cls, args):
-        resp = openai.Search.create_alpha(
-            query=[args.query],
-            max_documents=args.max_documents,
-            file_id=args.file,
+    def create(cls, args):
+        resp = openai.Search.create(
+            query=args.query,
+            documents=args.documents,
+            model=args.model,
         )
         print(resp)
 
@@ -827,20 +827,14 @@ Mutually exclusive with `top_p`.""",
     sub.set_defaults(func=File.list)
 
     # Search
-    sub = subparsers.add_parser("search.create_alpha")
+    sub = subparsers.add_parser("search.create")
 
     sub.add_argument(
-        "-f",
-        "--file",
-        required=True,
-        help="ID for previously uploaded file that contains the documents you want to search",
-    )
-    sub.add_argument(
-        "-m",
-        "--max_documents",
-        help="The maximum number of documents to return",
-        type=int,
-        default=200,
+        "-d",
+        "--documents",
+        help="Documents to search over",
+        type=str,
+        nargs="+",
     )
     sub.add_argument(
         "-q",
@@ -848,7 +842,12 @@ Mutually exclusive with `top_p`.""",
         required=True,
         help="Search query",
     )
-    sub.set_defaults(func=Search.create_alpha)
+    sub.add_argument(
+        "-m",
+        "--model",
+        help="The model to search with",
+    )
+    sub.set_defaults(func=Search.create)
 
     # Finetune
     sub = subparsers.add_parser("fine_tunes.list")
openai/version.py
@@ -1,1 +1,1 @@
-VERSION = "0.18.1"
+VERSION = "0.19.0"