Commit ff751ab6

Evan Morikawa <em@openai.com>
2021-03-04 08:44:49
Add /fine-tunes endpoint to the CLI (#5) tag: v0.4.0
* Add /fine-tunes endpoint to the CLI * address comments
1 parent f00f489
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.*"]),