import argparse from pathlib import Path from itertools import zip_longest from ..configuration import Config from ..chat import ChatDB from ..message import Message, Question from ..ai_factory import create_ai from ..ai import AI, AIResponse def create_message(chat: ChatDB, args: argparse.Namespace) -> Message: """ Creates (and writes) a new message from the given arguments. """ question_parts = [] question_list = args.ask if args.ask is not None else [] source_list = args.source if args.source is not None else [] code_list = args.source_code if args.source_code is not None else [] for question, source, code in zip_longest(question_list, source_list, code_list, fillvalue=None): if question is not None and len(question.strip()) > 0: question_parts.append(question) if source is not None and len(source) > 0: with open(source) as r: content = r.read().strip() if len(content) > 0: question_parts.append(content) if code is not None and len(code) > 0: with open(code) as r: content = r.read().strip() if len(content) > 0: question_parts.append(f"```\n{content}\n```") full_question = '\n\n'.join(question_parts) message = Message(question=Question(full_question), tags=args.output_tags, # FIXME ai=args.AI, model=args.model) chat.add_to_cache([message]) return message def question_cmd(args: argparse.Namespace, config: Config) -> None: """ Handler for the 'question' command. """ chat = ChatDB.from_dir(cache_path=Path('.'), db_path=Path(config.db)) # if it's a new question, create and store it immediately if args.ask or args.create: message = create_message(chat, args) if args.create: return # create the correct AI instance ai: AI = create_ai(args, config) if args.ask: response: AIResponse = ai.request(message, chat, args.num_answers, # FIXME args.output_tags) # FIXME assert response # TODO: # * add answer to the message above (and create # more messages for any additional answers) pass elif args.repeat: 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 elif args.process: # TODO: process either all questions without an # answer or the one(s) given in 'args.process' pass