Skip to content

Commit 250c33d

Browse files
authored
Support model-based (/engineless) completions in openai cli (#20)
* Support model-based (/engineless) completions in openai cli (#31) * Engineless completions in the SDK * Cosmetic improvements to fine tuning CLI * Remove done TODO * Raise error if neither engine nor model provided * Undocument the `timeout` parameter on completions, because it doesn't do anything and causes user confusion. * Move things around * Update message * Some day we should care about versions * Minor version bump
1 parent 40c32f9 commit 250c33d

File tree

4 files changed

+54
-32
lines changed

4 files changed

+54
-32
lines changed

openai/api_resources/abstract/engine_api_resource.py

-6
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,6 @@ def create(
3737
organization=None,
3838
**params,
3939
):
40-
"""
41-
Create a new instance of this model.
42-
43-
Parameters:
44-
timeout (float): the number of seconds to wait on the promise returned by the API, where 0 means wait forever.
45-
"""
4640
engine = params.pop("engine", None)
4741
timeout = params.pop("timeout", None)
4842
stream = params.get("stream", False)

openai/api_resources/completion.py

+16-3
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,29 @@
33
from openai import util
44
from openai.api_resources.abstract import DeletableAPIResource, ListableAPIResource
55
from openai.api_resources.abstract.engine_api_resource import EngineAPIResource
6-
from openai.error import TryAgain
6+
from openai.error import TryAgain, InvalidRequestError
77

88

99
class Completion(EngineAPIResource, ListableAPIResource, DeletableAPIResource):
10-
engine_required = True
10+
engine_required = False
1111
OBJECT_NAME = "completion"
1212

1313
@classmethod
14-
def create(cls, *args, timeout=None, **kwargs):
14+
def create(cls, *args, **kwargs):
15+
"""
16+
Creates a new completion for the provided prompt and parameters.
17+
18+
See https://beta.openai.com/docs/api-reference/completions/create for a list
19+
of valid parameters.
20+
"""
1521
start = time.time()
22+
timeout = kwargs.get("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 Completion.",
26+
param="engine",
27+
)
28+
1629
while True:
1730
try:
1831
return super().create(*args, **kwargs)

openai/cli.py

+37-22
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,14 @@ def create(cls, args):
138138
if args.n is not None and args.n > 1 and args.stream:
139139
raise ValueError("Can't stream completions with n>1 with the current CLI")
140140

141+
if args.engine and args.model:
142+
warnings.warn(
143+
"In most cases, you should not be specifying both engine and model."
144+
)
145+
141146
resp = openai.Completion.create(
142147
engine=args.engine,
148+
model=args.model,
143149
n=args.n,
144150
max_tokens=args.max_tokens,
145151
logprobs=args.logprobs,
@@ -253,30 +259,14 @@ def create(cls, args):
253259
return
254260

255261
sys.stdout.write(
256-
"Created job: {job_id}\n"
257-
"Streaming events until the job is complete...\n\n"
258-
"(Ctrl-C will interrupt the stream, but not cancel the job)\n".format(
262+
"Created fine-tune: {job_id}\n"
263+
"Streaming events until fine-tuning is complete...\n\n"
264+
"(Ctrl-C will interrupt the stream, but not cancel the fine-tune)\n".format(
259265
job_id=resp["id"]
260266
)
261267
)
262268
cls._stream_events(resp["id"])
263269

264-
resp = openai.FineTune.retrieve(id=resp["id"])
265-
status = resp["status"]
266-
sys.stdout.write("\nJob complete! Status: {status}".format(status=status))
267-
if status == "succeeded":
268-
sys.stdout.write(" 🎉")
269-
sys.stdout.write(
270-
"\nTry out your fine-tuned model: {model}\n"
271-
"(Pass this as the model parameter to a completion request)".format(
272-
model=resp["fine_tuned_model"]
273-
)
274-
)
275-
# TODO(rachel): Print instructions on how to use the model here.
276-
elif status == "failed":
277-
sys.stdout.write("\nPlease contact [email protected] for assistance.")
278-
sys.stdout.write("\n")
279-
280270
@classmethod
281271
def get(cls, args):
282272
resp = openai.FineTune.retrieve(id=args.id)
@@ -296,8 +286,8 @@ def signal_handler(sig, frame):
296286
status = openai.FineTune.retrieve(job_id).status
297287
sys.stdout.write(
298288
"\nStream interrupted. Job is still {status}. "
299-
"To cancel your job, run:\n"
300-
"`openai api fine_tunes.cancel -i {job_id}`\n".format(
289+
"To cancel your job, run:\n\n"
290+
"openai api fine_tunes.cancel -i {job_id}\n".format(
301291
status=status, job_id=job_id
302292
)
303293
)
@@ -318,6 +308,22 @@ def signal_handler(sig, frame):
318308
sys.stdout.write("\n")
319309
sys.stdout.flush()
320310

311+
resp = openai.FineTune.retrieve(id=job_id)
312+
status = resp["status"]
313+
if status == "succeeded":
314+
sys.stdout.write("\nJob complete! Status: succeeded 🎉")
315+
sys.stdout.write(
316+
"\nTry out your fine-tuned model:\n\n"
317+
"openai api completions.create -m {model} -p <YOUR_PROMPT>".format(
318+
model=resp["fine_tuned_model"]
319+
)
320+
)
321+
elif status == "failed":
322+
sys.stdout.write(
323+
"\nJob failed. Please contact [email protected] if you need assistance."
324+
)
325+
sys.stdout.write("\n")
326+
321327
@classmethod
322328
def cancel(cls, args):
323329
resp = openai.FineTune.cancel(id=args.id)
@@ -422,7 +428,16 @@ def help(args):
422428

423429
# Completions
424430
sub = subparsers.add_parser("completions.create")
425-
sub.add_argument("-e", "--engine", required=True, help="The engine to use")
431+
sub.add_argument(
432+
"-e",
433+
"--engine",
434+
help="The engine to use. See https://beta.openai.com/docs/engines for more about what engines are available.",
435+
)
436+
sub.add_argument(
437+
"-m",
438+
"--model",
439+
help="The model to use. At most one of `engine` or `model` should be specified.",
440+
)
426441
sub.add_argument(
427442
"--stream", help="Stream tokens as they're ready.", action="store_true"
428443
)

openai/version.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
VERSION = "0.7.0"
1+
VERSION = "0.8.0"

0 commit comments

Comments
 (0)