Skip to content

Commit 120f2b1

Browse files
stainless-botRobertCraigie
authored andcommitted
feat(cli): add tools fine_tunes.prepare_data
1 parent aef2c55 commit 120f2b1

File tree

4 files changed

+878
-3
lines changed

4 files changed

+878
-3
lines changed

src/openai/cli/_cli.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,8 @@ def help() -> None:
9090

9191
register_commands(sub_api)
9292

93-
_tools.register_commands(subparsers)
93+
sub_tools = subparsers.add_parser("tools", help="Client side tools for convenience")
94+
_tools.register_commands(sub_tools, subparsers)
9495

9596
return parser
9697

src/openai/cli/_tools/_main.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,15 @@
33
from typing import TYPE_CHECKING
44
from argparse import ArgumentParser
55

6-
from . import migrate
6+
from . import migrate, fine_tunes
77

88
if TYPE_CHECKING:
99
from argparse import _SubParsersAction
1010

1111

12-
def register_commands(subparser: _SubParsersAction[ArgumentParser]) -> None:
12+
def register_commands(parser: ArgumentParser, subparser: _SubParsersAction[ArgumentParser]) -> None:
1313
migrate.register(subparser)
14+
15+
namespaced = parser.add_subparsers(title="Tools", help="Convenience client side tools")
16+
17+
fine_tunes.register(namespaced)

src/openai/cli/_tools/fine_tunes.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
from __future__ import annotations
2+
3+
import sys
4+
from typing import TYPE_CHECKING
5+
from argparse import ArgumentParser
6+
7+
from .._models import BaseModel
8+
from ...lib._validators import (
9+
get_validators,
10+
write_out_file,
11+
read_any_format,
12+
apply_validators,
13+
apply_necessary_remediation,
14+
)
15+
16+
if TYPE_CHECKING:
17+
from argparse import _SubParsersAction
18+
19+
20+
def register(subparser: _SubParsersAction[ArgumentParser]) -> None:
21+
sub = subparser.add_parser("fine_tunes.prepare_data")
22+
sub.add_argument(
23+
"-f",
24+
"--file",
25+
required=True,
26+
help="JSONL, JSON, CSV, TSV, TXT or XLSX file containing prompt-completion examples to be analyzed."
27+
"This should be the local file path.",
28+
)
29+
sub.add_argument(
30+
"-q",
31+
"--quiet",
32+
required=False,
33+
action="store_true",
34+
help="Auto accepts all suggestions, without asking for user input. To be used within scripts.",
35+
)
36+
sub.set_defaults(func=prepare_data, args_model=PrepareDataArgs)
37+
38+
39+
class PrepareDataArgs(BaseModel):
40+
file: str
41+
42+
quiet: bool
43+
44+
45+
def prepare_data(args: PrepareDataArgs) -> None:
46+
sys.stdout.write("Analyzing...\n")
47+
fname = args.file
48+
auto_accept = args.quiet
49+
df, remediation = read_any_format(fname)
50+
apply_necessary_remediation(None, remediation)
51+
52+
validators = get_validators()
53+
54+
assert df is not None
55+
56+
apply_validators(
57+
df,
58+
fname,
59+
remediation,
60+
validators,
61+
auto_accept,
62+
write_out_file_func=write_out_file,
63+
)

0 commit comments

Comments
 (0)