From 21ecdc25389ca9ba770062f1cc9b84091a2bc6db Mon Sep 17 00:00:00 2001 From: flu0r1ne Date: Fri, 5 May 2023 03:00:02 -0500 Subject: Refactor command structure, add validation for interactive sessions --- src/gpt_chat_cli/argparsing.py | 31 +++++++++++++++++++++++++++---- src/gpt_chat_cli/gcli.py | 40 ++++++++++++++++++++++++---------------- 2 files changed, 51 insertions(+), 20 deletions(-) diff --git a/src/gpt_chat_cli/argparsing.py b/src/gpt_chat_cli/argparsing.py index 4597e84..e9183a9 100644 --- a/src/gpt_chat_cli/argparsing.py +++ b/src/gpt_chat_cli/argparsing.py @@ -19,7 +19,7 @@ def die_validation_err(err : str): print(err, file=sys.stderr) sys.exit(1) -def validate_args(args: argparse.Namespace) -> None: +def validate_args(args: argparse.Namespace, debug : bool = False) -> None: if not 0 <= args.temperature <= 2: die_validation_err("Temperature must be between 0 and 2.") @@ -38,6 +38,16 @@ def validate_args(args: argparse.Namespace) -> None: if args.n_completions < 1: die_validation_err("Number of completions must be greater than or equal to 1.") + if args.interactive and args.n_completions != 1: + die_validation_err("Only a single completion can be used in interactive mode") + + if debug and args.interactive: + + if args.interactive and ( + args.save_response_to_file or args.load_response_from_file + ): + die_validation_err("Save and load operations cannot be used in interactive mode") + @dataclass class CompletionArguments: model: str @@ -66,6 +76,7 @@ class Arguments: display_args: DisplayArguments version: bool list_models: bool + interactive: bool debug_args: Optional[DebugArguments] = None def split_arguments(args: argparse.Namespace) -> Arguments: @@ -96,6 +107,7 @@ def split_arguments(args: argparse.Namespace) -> Arguments: debug_args=debug_args, version=args.version, list_models=args.list_models, + interactive=args.interactive ) def parse_args() -> Arguments: @@ -216,13 +228,20 @@ def parse_args() -> Arguments: help="List models and exit" ) + parser.add_argument( + "-i", + "--interactive", + action="store_true", + help="Start an interactive session" + ) + parser.add_argument( "message", type=str, nargs='?', help=( - "The contents of the message. When used in chat mode, this is the initial " - "message if provided." + "The contents of the message. When in a interactive session, this is " + " the initial prompt provided." ), ) @@ -268,10 +287,14 @@ def parse_args() -> Arguments: else: args.adornments = AutoDetectedOption.OFF + if args.message is None: + if sys.stdin.isatty(): + args.interactive = True + if not debug: args.load_response_from_file = None args.save_response_to_file = None - validate_args(args) + validate_args(args, debug=debug) return split_arguments(args) diff --git a/src/gpt_chat_cli/gcli.py b/src/gpt_chat_cli/gcli.py index a9d36e4..2d40cf2 100644 --- a/src/gpt_chat_cli/gcli.py +++ b/src/gpt_chat_cli/gcli.py @@ -132,22 +132,21 @@ def print_streamed_response( else: print(end='\n', flush=True) -def main(): - args = parse_args() - - if args.version: - print(f'version {VERSION}') - sys.exit(0) +def cmd_version(): + print(f'version {VERSION}') - if args.list_models: +def cmd_list_models(): + for model in list_models(): + print(model) - for model in list_models(): - print(model) +def cmd_interactive(args : Arguments): + COLOR_CODE = get_color_codes(no_color = not args.display_args.color) - sys.exit(0) + print(f'GPT Chat CLI {VERSION}') + print(f'[{COLOR_CODE.WHITE}#{COLOR_CODE.RESET}]', end=' ', flush=True) +def cmd_singleton(args: Arguments): completion_args = args.completion_args - COLOR_CODE = get_color_codes(no_color = not args.display_args.color) debug_args : DebugArguments = args.debug_args @@ -157,11 +156,7 @@ def main(): elif debug_args.load_response_from_file: completion_args, completion = load_response_and_arguments(args) else: - if args.completion_args.message is None: - if sys.stdin.isatty(): - print(f'GPT Chat CLI {VERSION}') - print(f'[{COLOR_CODE.WHITE}#{COLOR_CODE.RESET}]', end=' ', flush=True) - + if completion_args.message is None: completion_args.message = sys.stdin.read() completion = create_chat_completion_from_args(completion_args) @@ -172,5 +167,18 @@ def main(): completion_args.n_completions ) + +def main(): + args = parse_args() + + if args.version: + cmd_version() + elif args.list_models: + cmd_list_models() + elif args.interactive: + cmd_interactive(args) + else: + cmd_singleton(args) + if __name__ == "__main__": main() -- cgit v1.2.3