""" Creates different AI instances, based on the given configuration. """ import argparse from typing import cast from .configuration import Config, AIConfig, OpenAIConfig from .ai import AI, AIError from .ais.openai import OpenAI def create_ai(args: argparse.Namespace, config: Config) -> AI: # noqa: 11 """ Creates an AI subclass instance from the given arguments and configuration file. If AI has not been set in the arguments, it searches for the ID 'default'. If that is not found, it uses the first AI in the list. """ ai_conf: AIConfig if args.AI: try: ai_conf = config.ais[args.AI] except KeyError: raise AIError(f"AI ID '{args.AI}' does not exist in this configuration") elif 'default' in config.ais: ai_conf = config.ais['default'] else: try: ai_conf = next(iter(config.ais.values())) except StopIteration: raise AIError("No AI found in this configuration") if ai_conf.name == 'openai': ai = OpenAI(cast(OpenAIConfig, ai_conf)) if args.model: ai.config.model = args.model if args.max_tokens: ai.config.max_tokens = args.max_tokens if args.temperature: ai.config.temperature = args.temperature return ai else: raise AIError(f"AI '{args.AI}' is not supported")