Commit ff751ab6
Changed files (6)
openai/api_resources/__init__.py
@@ -10,3 +10,4 @@ from openai.api_resources.run import Run
from openai.api_resources.snapshot import Snapshot
from openai.api_resources.tag import Tag
from openai.api_resources.update import Update
+from openai.api_resources.fine_tune import FineTune
openai/api_resources/fine_tune.py
@@ -0,0 +1,21 @@
+from openai.api_resources.abstract import (
+ ListableAPIResource,
+ CreateableAPIResource,
+ nested_resource_class_methods,
+)
+from openai.six.moves.urllib.parse import quote_plus
+from openai import util
+
+
+@nested_resource_class_methods("event", operations=["list"])
+class FineTune(ListableAPIResource, CreateableAPIResource):
+ OBJECT_NAME = "fine-tune"
+
+ @classmethod
+ def cancel(cls, id, api_key=None, request_id=None, **params):
+ base = cls.class_url()
+ extn = quote_plus(id)
+ url = "%s/%s/cancel" % (base, extn)
+ instance = cls(id, api_key, **params)
+ headers = util.populate_headers(request_id=request_id)
+ return instance.request("post", url, headers=headers)
\ No newline at end of file
openai/cli.py
@@ -195,6 +195,50 @@ class Tag:
print(tags)
+class FineTuneCLI:
+ @classmethod
+ def list(cls, args):
+ resp = openai.FineTune.list()
+ print(resp)
+
+ @classmethod
+ def create(cls, args):
+ create_args = {
+ "train_file": args.train_file,
+ }
+ if args.test_file:
+ create_args["test_file"] = args.test_file
+ if args.base_model:
+ create_args["base_model"] = args.base_model
+ if args.hparams:
+ try:
+ hparams = json.loads(args.hparams)
+ except json.decoder.JSONDecodeError:
+ sys.stderr.write(
+ "--hparams must be JSON decodable and match the hyperparameter arguments of the API"
+ )
+ sys.exit(1)
+ create_args.update(hparams)
+
+ resp = openai.FineTune.create(**create_args)
+ print(resp)
+
+ @classmethod
+ def get(cls, args):
+ resp = openai.FineTune.retrieve(id=args.id)
+ print(resp)
+
+ @classmethod
+ def events(cls, args):
+ resp = openai.FineTune.list_events(id=args.id)
+ print(resp)
+
+ @classmethod
+ def cancel(cls, args):
+ resp = openai.FineTune.cancel(id=args.id)
+ print(resp)
+
+
def register(parser):
# Engine management
subparsers = parser.add_subparsers(help="All API subcommands")
@@ -379,3 +423,30 @@ Mutually exclusive with `top_p`.""",
sub = subparsers.add_parser("tags.list")
sub.set_defaults(func=Tag.list)
+
+ # /fine-tunes API
+ sub = subparsers.add_parser("fine_tunes.list")
+ sub.set_defaults(func=FineTuneCLI.list)
+
+ sub = subparsers.add_parser("fine_tunes.create")
+ sub.add_argument("-t", "--train_file", required=True, help="File to train")
+ sub.add_argument("--test_file", help="File to test")
+ sub.add_argument(
+ "-b",
+ "--base_model",
+ help="The model name to start the run from",
+ )
+ sub.add_argument("-p", "--hparams", help="Hyperparameter JSON")
+ sub.set_defaults(func=FineTuneCLI.create)
+
+ sub = subparsers.add_parser("fine_tunes.get")
+ sub.add_argument("-i", "--id", required=True, help="The id of the fine-tune job")
+ sub.set_defaults(func=FineTuneCLI.get)
+
+ sub = subparsers.add_parser("fine_tunes.events")
+ sub.add_argument("-i", "--id", required=True, help="The id of the fine-tune job")
+ sub.set_defaults(func=FineTuneCLI.events)
+
+ sub = subparsers.add_parser("fine_tunes.cancel")
+ sub.add_argument("-i", "--id", required=True, help="The id of the fine-tune job")
+ sub.set_defaults(func=FineTuneCLI.cancel)
openai/version.py
@@ -1,1 +1,1 @@
-VERSION = "0.3.0"
+VERSION = "0.4.0"
.gitignore
@@ -2,3 +2,4 @@
__pycache__
/public/dist
.idea
+.python-version
\ No newline at end of file
setup.py
@@ -16,7 +16,7 @@ setup(
'requests >= 2.20; python_version >= "3.0"',
'requests[security] >= 2.20; python_version < "3.0"',
],
- extras_require={},
+ extras_require={"dev": ["black==20.8b1", "pytest==6.*"]},
python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
scripts=["bin/openai"],
packages=find_packages(exclude=["tests", "tests.*"]),