diff --git a/chatmastermind/commands/question.py b/chatmastermind/commands/question.py index d143792..d582396 100644 --- a/chatmastermind/commands/question.py +++ b/chatmastermind/commands/question.py @@ -1,3 +1,4 @@ +import sys import argparse from pathlib import Path from itertools import zip_longest @@ -72,10 +73,26 @@ def create_message(chat: ChatDB, args: argparse.Namespace) -> Message: tags=args.output_tags, # FIXME ai=args.AI, model=args.model) - chat.add_to_cache([message]) + chat.write_cache([message]) return message +def make_request(ai: AI, chat: ChatDB, message: Message, args: argparse.Namespace) -> None: + ai.print() + chat.print(paged=False) + response: AIResponse = ai.request(message, + chat, + args.num_answers, # FIXME + args.output_tags) # FIXME + chat.write_cache(response.messages) + for idx, msg in enumerate(response.messages): + print(f"=== ANSWER {idx+1} ===") + print(msg.answer) + if response.tokens: + print("===============") + print(response.tokens) + + def question_cmd(args: argparse.Namespace, config: Config) -> None: """ Handler for the 'question' command. @@ -94,28 +111,29 @@ def question_cmd(args: argparse.Namespace, config: Config) -> None: # create the correct AI instance ai: AI = create_ai(args, config) + + # === ASK === if args.ask: - ai.print() - chat.print(paged=False) - response: AIResponse = ai.request(message, - chat, - args.num_answers, # FIXME - args.output_tags) # FIXME - chat.update_messages([response.messages[0]]) - chat.add_to_cache(response.messages[1:]) - for idx, msg in enumerate(response.messages): - print(f"=== ANSWER {idx+1} ===") - print(msg.answer) - if response.tokens: - print("===============") - print(response.tokens) + make_request(ai, chat, message, args) + # === REPEAT === elif args.repeat is not None: - lmessage = chat.latest_message() - assert lmessage - # TODO: repeat either the last question or the - # one(s) given in 'args.repeat' (overwrite - # existing ones if 'args.overwrite' is True) - pass + lmessage = chat.latest_message(source='cache') + if lmessage is None: + print("No message found to repeat!") + sys.exit(1) + else: + print(f"Repeating message '{lmessage.msg_id()}':") + # overwrite the latest message if requested or empty + if lmessage.answer is None or args.overwrite is True: + lmessage.clear_answer() + make_request(ai, chat, lmessage, args) + # otherwise create a new one + else: + args.ask = [lmessage.question] + message = create_message(chat, args) + make_request(ai, chat, message, args) + + # === PROCESS === elif args.process is not None: # TODO: process either all questions without an # answer or the one(s) given in 'args.process' diff --git a/chatmastermind/message.py b/chatmastermind/message.py index 8b32ae9..9d48945 100644 --- a/chatmastermind/message.py +++ b/chatmastermind/message.py @@ -540,6 +540,9 @@ class Message(): if self.tags: self.tags = rename_tags(self.tags, tags_rename) + def clear_answer(self) -> None: + self.answer = None + def msg_id(self) -> str: """ Returns an ID that is unique throughout all messages in the same (DB) directory.