diff --git a/.gitignore b/.gitignore index 76fb0e22a8..a8b3cf4a28 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ __pycache__ /public/dist .idea +.python-version \ No newline at end of file diff --git a/openai/api_resources/__init__.py b/openai/api_resources/__init__.py index 998d72397a..2a77f47097 100644 --- a/openai/api_resources/__init__.py +++ b/openai/api_resources/__init__.py @@ -10,3 +10,4 @@ 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 diff --git a/openai/api_resources/fine_tune.py b/openai/api_resources/fine_tune.py new file mode 100644 index 0000000000..da888a17d8 --- /dev/null +++ b/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 diff --git a/openai/cli.py b/openai/cli.py index c7ab66e350..ba29fe6bc1 100644 --- a/openai/cli.py +++ b/openai/cli.py @@ -195,6 +195,50 @@ def list(cls, args): 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 @@ def help(args): 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) diff --git a/openai/version.py b/openai/version.py index 867e4b14ee..6cc293ea98 100644 --- a/openai/version.py +++ b/openai/version.py @@ -1 +1 @@ -VERSION = "0.3.0" +VERSION = "0.4.0" diff --git a/setup.py b/setup.py index eb240cab2b..e7d07b7c88 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ '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.*"]),