Skip to content

Commit 64c4533

Browse files
authored
V0.19.0: Support engineless and adds openai.Search.create (#97)
* 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 commit 64c4533

14 files changed

+66
-43
lines changed

openai/api_resources/abstract/api_resource.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ def class_url(cls):
3333
# with forward slashes (/), so replace the former with the latter.
3434
base = cls.OBJECT_NAME.replace(".", "/") # type: ignore
3535
if cls.api_prefix:
36-
return "/%s/%ss" % (cls.api_prefix, base)
37-
return "/%ss" % (base)
36+
return "/%s/%s" % (cls.api_prefix, base)
37+
return "/%s" % (base)
3838

3939
def instance_url(self, operation=None):
4040
id = self.get("id")

openai/api_resources/abstract/engine_api_resource.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def class_url(
4141
"You must provide the deployment name in the 'engine' parameter to access the Azure OpenAI service"
4242
)
4343
extn = quote_plus(engine)
44-
return "/%s/%s/%s/%ss?api-version=%s" % (
44+
return "/%s/%s/%s/%s?api-version=%s" % (
4545
cls.azure_api_prefix,
4646
cls.azure_deployments_prefix,
4747
extn,
@@ -51,10 +51,10 @@ def class_url(
5151

5252
elif typed_api_type == ApiType.OPEN_AI:
5353
if engine is None:
54-
return "/%ss" % (base)
54+
return "/%s" % (base)
5555

5656
extn = quote_plus(engine)
57-
return "/engines/%s/%ss" % (extn, base)
57+
return "/engines/%s/%s" % (extn, base)
5858

5959
else:
6060
raise error.InvalidAPIType("Unsupported API type %s" % api_type)
@@ -153,7 +153,7 @@ def instance_url(self):
153153
"An API version is required for the Azure API type."
154154
)
155155
base = self.OBJECT_NAME.replace(".", "/")
156-
url = "/%s/%s/%s/%ss/%s?api-version=%s" % (
156+
url = "/%s/%s/%s/%s/%s?api-version=%s" % (
157157
self.azure_api_prefix,
158158
self.azure_deployments_prefix,
159159
self.engine,

openai/api_resources/completion.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
class Completion(EngineAPIResource, ListableAPIResource, DeletableAPIResource):
1010
engine_required = False
11-
OBJECT_NAME = "completion"
11+
OBJECT_NAME = "completions"
1212

1313
@classmethod
1414
def create(cls, *args, **kwargs):

openai/api_resources/deployment.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
class Deployment(CreateableAPIResource, ListableAPIResource, DeletableAPIResource):
77
engine_required = False
8-
OBJECT_NAME = "deployment"
8+
OBJECT_NAME = "deployments"
99

1010
@classmethod
1111
def create(cls, *args, **kwargs):

openai/api_resources/edit.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
class Edit(EngineAPIResource):
99
engine_required = False
10-
OBJECT_NAME = "edit"
10+
OBJECT_NAME = "edits"
1111

1212
@classmethod
1313
def create(cls, *args, **kwargs):

openai/api_resources/embedding.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010

1111

1212
class Embedding(EngineAPIResource, ListableAPIResource, DeletableAPIResource):
13-
engine_required = True
14-
OBJECT_NAME = "embedding"
13+
engine_required = False
14+
OBJECT_NAME = "embeddings"
1515

1616
@classmethod
1717
def create(cls, *args, **kwargs):

openai/api_resources/engine.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99

1010
class Engine(ListableAPIResource, UpdateableAPIResource):
11-
OBJECT_NAME = "engine"
11+
OBJECT_NAME = "engines"
1212

1313
def generate(self, timeout=None, **params):
1414
start = time.time()

openai/api_resources/experimental/completion_config.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@
88
class CompletionConfig(
99
CreateableAPIResource, ListableAPIResource, DeletableAPIResource
1010
):
11-
OBJECT_NAME = "experimental.completion_config"
11+
OBJECT_NAME = "experimental.completion_configs"

openai/api_resources/file.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010

1111
class File(ListableAPIResource, DeletableAPIResource):
12-
OBJECT_NAME = "file"
12+
OBJECT_NAME = "files"
1313

1414
@classmethod
1515
def create(

openai/api_resources/fine_tune.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
@nested_resource_class_methods("event", operations=["list"])
1515
class FineTune(ListableAPIResource, CreateableAPIResource, DeletableAPIResource):
16-
OBJECT_NAME = "fine-tune"
16+
OBJECT_NAME = "fine-tunes"
1717

1818
@classmethod
1919
def cancel(

openai/api_resources/model.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33

44
class Model(ListableAPIResource, DeletableAPIResource):
55
engine_required = False
6-
OBJECT_NAME = "model"
6+
OBJECT_NAME = "models"

openai/api_resources/search.py

+32-8
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,36 @@
1-
from openai.api_resources.abstract.api_resource import APIResource
1+
import time
22

3+
from openai import util
4+
from openai.api_resources.abstract.engine_api_resource import EngineAPIResource
5+
from openai.error import InvalidRequestError, TryAgain
36

4-
class Search(APIResource):
5-
@classmethod
6-
def class_url(cls):
7-
return "/search_indices/search"
7+
8+
class Search(EngineAPIResource):
9+
engine_required = False
10+
OBJECT_NAME = "search"
811

912
@classmethod
10-
def create_alpha(cls, **params):
11-
instance = cls()
12-
return instance.request("post", cls.class_url(), params)
13+
def create(cls, *args, **kwargs):
14+
"""
15+
Creates a new search for the provided input and parameters.
16+
17+
See https://beta.openai.com/docs/api-reference/search for a list
18+
of valid parameters.
19+
"""
20+
21+
start = time.time()
22+
timeout = kwargs.pop("timeout", None)
23+
if kwargs.get("model", None) is None and kwargs.get("engine", None) is None:
24+
raise InvalidRequestError(
25+
"Must provide an 'engine' or 'model' parameter to create a Search.",
26+
param="engine",
27+
)
28+
29+
while True:
30+
try:
31+
return super().create(*args, **kwargs)
32+
except TryAgain as e:
33+
if timeout is not None and time.time() > start + timeout:
34+
raise
35+
36+
util.log_info("Waiting for model to warm up", error=e)

openai/cli.py

+17-18
Original file line numberDiff line numberDiff line change
@@ -266,11 +266,11 @@ def prepare_data(cls, args, purpose):
266266
)
267267

268268
@classmethod
269-
def create_alpha(cls, args):
270-
resp = openai.Search.create_alpha(
271-
query=[args.query],
272-
max_documents=args.max_documents,
273-
file_id=args.file,
269+
def create(cls, args):
270+
resp = openai.Search.create(
271+
query=args.query,
272+
documents=args.documents,
273+
model=args.model,
274274
)
275275
print(resp)
276276

@@ -827,28 +827,27 @@ def help(args):
827827
sub.set_defaults(func=File.list)
828828

829829
# Search
830-
sub = subparsers.add_parser("search.create_alpha")
830+
sub = subparsers.add_parser("search.create")
831831

832832
sub.add_argument(
833-
"-f",
834-
"--file",
835-
required=True,
836-
help="ID for previously uploaded file that contains the documents you want to search",
837-
)
838-
sub.add_argument(
839-
"-m",
840-
"--max_documents",
841-
help="The maximum number of documents to return",
842-
type=int,
843-
default=200,
833+
"-d",
834+
"--documents",
835+
help="Documents to search over",
836+
type=str,
837+
nargs="+",
844838
)
845839
sub.add_argument(
846840
"-q",
847841
"--query",
848842
required=True,
849843
help="Search query",
850844
)
851-
sub.set_defaults(func=Search.create_alpha)
845+
sub.add_argument(
846+
"-m",
847+
"--model",
848+
help="The model to search with",
849+
)
850+
sub.set_defaults(func=Search.create)
852851

853852
# Finetune
854853
sub = subparsers.add_parser("fine_tunes.list")

openai/version.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
VERSION = "0.18.1"
1+
VERSION = "0.19.0"

0 commit comments

Comments
 (0)