import langchain
from langchain_openai import AzureChatOpenAI
from langchain.memory import ConversationBufferMemory, ReadOnlySharedMemory
from langchain.prompts.chat import MessagesPlaceholder

from tech_agents.command import Command, check_command
from tech_agents.dispatcher import MainDispatcherAgent
from tech_agents.template import default_value


class MainAgent:
    llm: AzureChatOpenAI
    memory: ConversationBufferMemory
    chat_history: MessagesPlaceholder
    verbose: bool

    """
    MainAgentクラスは、メインのエージェントを表すクラスです。
    このクラスは、AzureChatOpenAI、ConversationBufferMemory、MessagesPlaceholderなどの属性を持ちます。
    メインエージェントは、指定された入力に対してAgentクラスを実行します。
    """

    def __init__(
        self,
        llm: AzureChatOpenAI = default_value.default_llm,
        memory: ConversationBufferMemory = default_value.default_memory,
        chat_history: MessagesPlaceholder = default_value.default_chat_history,
        verbose: bool = False,
    ):
        """
        MainAgentクラスのコンストラクタです。
        デフォルトの引数を使用して、AzureChatOpenAI、ConversationBufferMemory、MessagesPlaceholder、verboseを初期化します。
        
        インスタンス化
        ------------
        main_agent = MainAgent(
            llm=あなたの使用したいLLM,
            memory=あなたの使用したいメモリ,
            chat_history=あなたの使用したい会話履歴,
            verbose=デバッグモードを有効にするかどうか
        )
        
        実行
        ------------
        message = "こんにちは"
        output = main_agent.run(message)
        print(output)
        
        """

        # 引数の初期化
        self.llm = llm
        self.memory = memory
        self.chat_history = chat_history
        self.verbose = verbose

        # メモリの読み取り専用化
        self.readonly_memory = ReadOnlySharedMemory(memory=self.memory)
        # デバッグモードの設定
        langchain.debug = self.verbose

    def run(self, user_message: str) -> str:
        """
        メインエージェントを実行するメソッドです。
        Agentクラスを生成し、指定された入力を渡して実行します。
        """

        param = check_command(user_message)
        if param.check_command_bool:
            CommandAgent = Command(
                llm=self.llm,
                memory=self.memory,
                readonly_memory=self.readonly_memory,
                chat_history=self.chat_history,
                verbose=self.verbose
            )
            return CommandAgent.run(param.command, user_message)
        
        main_agent = MainDispatcherAgent(
            llm=self.llm,
            memory=self.memory,
            readonly_memory=self.readonly_memory,
            chat_history=self.chat_history,
            verbose=self.verbose
        )
        return main_agent.run(user_message)

langchain.memory.ReadOnlySharedMemory
[((1669, 1709), 'langchain.memory.ReadOnlySharedMemory', 'ReadOnlySharedMemory', ([], {'memory': 'self.memory'}), '(memory=self.memory)\n', (1689, 1709), False, 'from langchain.memory import ConversationBufferMemory, ReadOnlySharedMemory\n'), ((1926, 1953), 'tech_agents.command.check_command', 'check_command', (['user_message'], {}), '(user_message)\n', (1939, 1953), False, 'from tech_agents.command import Command, check_command\n'), ((2341, 2491), 'tech_agents.dispatcher.MainDispatcherAgent', 'MainDispatcherAgent', ([], {'llm': 'self.llm', 'memory': 'self.memory', 'readonly_memory': 'self.readonly_memory', 'chat_history': 'self.chat_history', 'verbose': 'self.verbose'}), '(llm=self.llm, memory=self.memory, readonly_memory=self.\n    readonly_memory, chat_history=self.chat_history, verbose=self.verbose)\n', (2360, 2491), False, 'from tech_agents.dispatcher import MainDispatcherAgent\n'), ((2018, 2156), 'tech_agents.command.Command', 'Command', ([], {'llm': 'self.llm', 'memory': 'self.memory', 'readonly_memory': 'self.readonly_memory', 'chat_history': 'self.chat_history', 'verbose': 'self.verbose'}), '(llm=self.llm, memory=self.memory, readonly_memory=self.\n    readonly_memory, chat_history=self.chat_history, verbose=self.verbose)\n', (2025, 2156), False, 'from tech_agents.command import Command, check_command\n')]