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.question if args.question is not None else [] source_list = args.source if args.source is not None else [] # FIXME: don't surround all sourced files with ``` # -> do it only if '--source-code-only' is True and no source code # could be extracted from that file for question, source in zip_longest(question_list, source_list, fillvalue=None): if question is not None and source is not None: with open(source) as r: question_parts.append(f"{question}\n\n```\n{r.read().strip()}\n```") elif question is not None: question_parts.append(question) elif source is not None: with open(source) as r: question_parts.append(f"```\n{r.read().strip()}\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.otags) # 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