AGIの入り口の前:ソースコード:main.py

streamlitはmain関数を何度も呼び出してくれる。ただ、そのため何度も初期化コードが呼ばれやすく、AiAgetntの初期化がむつかしい。

RoleAssignmentOfficerを単純な分配人として、メモリを1回ごとに初期化しているが、現在あまりうまくいっていない。調整が必要。もともとはマネージャーとしてもっと複雑なことをやらせていたが、それはそれでうまくいかなかった。

respons_programe_checkでpythonプログラムがエラーを出す間は、直させる処理をしている。


import os
import streamlit as st
from langchain_community.callbacks import StreamlitCallbackHandler

# custom tools
from tools.command_list import set_work_space
from tools.command_list import load_ai_agent_name_list
from tools.command_list import get_ai_agent
from tools.command_list import get_tool_list
from tools.command_list import get_next_agent
import tools.command_list 
import tools.fllow_controller
from tools.AIAgent import AIAgent
import msvcrt
################################################
##########################################################
def init_page():
    st.set_page_config(
        page_title="In front of AGI start gate.",
        page_icon=""
    )
    st.header("In front of AGI start gate.")
    st.sidebar.title("Options")


def init_messages(ai_agent):
    clear_button = st.sidebar.button("Clear Conversation", key="clear")
    if clear_button or "messages" not in st.session_state:
        st.session_state.messages = [
            {"role": "assistant", "content": "入力してください。"}
        ]
        ai_agent.clear_memory()


def create_ai_agent(name, private_memory=False):
    return AIAgent(name, get_ai_agent(name), get_tool_list(), private_memory)


def cange_agent(agent, name):
    agent.update_system_prompt(get_ai_agent(name))


def think_agent(ai_agent, name, prompt):
    tools.command_list.g_time_keeper.wait()
    # AIエージェントの思考
    print("think_agent name", name, prompt)
    with st.chat_message(name):
        # コールバック関数の設定 (エージェントの動作の可視化用)
        st_cb = StreamlitCallbackHandler(
            st.container(), expand_new_thoughts=True)
        # エージェントを実行
        response = ai_agent.get_respons(prompt, st_cb)
        st.write(response["output"])
        print("response", response["output"])
    return response["output"]


def respons_programe_check(ai_agent, agent_name, check_prompt):
    # 次の作業者を決定。
    count = 0
    respons_text = check_prompt
    # pythonで エラーが出るようなら自動で作りなおしを依頼。
    while True:
        error_respons = tools.fllow_controller.python_error_check(respons_text)
        if False is tools.fllow_controller.get_code_error():
            error_respons = ""
            return error_respons, respons_text
        if 3 <= count:
            error_respons = "3回以上やり直してもエラーを修正しきれませんでした。"
            return error_respons, respons_text
        print(error_respons)

        respons_text = think_agent(ai_agent, agent_name, error_respons+"\r\n直してください。")
        count += 1


def assign_roles(ra_ai_agent, work_prompt):
    # 次の作業者を決定。
    ra_ai_agent.clear_memory()
    think_agent(ra_ai_agent, "RoleAssignmentOfficer",
                work_prompt + "\r\n この作業の続きをだれに作業させるのがいいですか?")

    next_agent = get_next_agent()
    if None is next_agent:
        # 見つからなければもう一度だけ確認
        think_agent(ra_ai_agent, "RoleAssignmentOfficer", "該当するエージェントが見つかりませんでした。get_agent_name_listの機能で確認してください。")
        next_agent = get_next_agent()
    else:
        pass
    return next_agent, work_prompt


def get_next_agent_program_check(ai_agent, ra_ai_agent, agent_name, respons):
    # 次の作業者を決定。
    r_prompt, respons = respons_programe_check(ai_agent, agent_name, respons)

    next_agent, respons = assign_roles(ra_ai_agent, respons)
    return next_agent, respons


def main():
    loop_count_max = 6
    loop_count = 0
    now_agent_name = "programer"
    pre_agent_name = now_agent_name
    load_ai_agent_name_list()
    ra_ai_agent = create_ai_agent("RoleAssignmentOfficer", True)
    ai_agent = create_ai_agent(now_agent_name)

    init_page()
    init_messages(ai_agent)
    set_work_space(os.getcwd())
    print("current folder", os.getcwd())
    for msg in st.session_state['memory'].chat_memory.messages:
        st.chat_message(msg.type).write(msg.content)
    # セッション状態に値がある場合のみテキスト入力欄を表示

    if user_prompt := st.chat_input(placeholder="作業内容を入れてください"):
        st.chat_message("user").write(user_prompt)

        ra_ai_agent.clear_memory()
        think_agent(ra_ai_agent, "RoleAssignmentOfficer",
                    user_prompt + "\r\n この作業をだれに作業させるのがいいですか?")
        now_agent_name = get_next_agent()
        prompt = user_prompt
        if None is not now_agent_name and "User" != now_agent_name:
            while True:
                cange_agent(ai_agent, now_agent_name)

                respons = think_agent(ai_agent, now_agent_name, prompt)
                pre_agent_name = now_agent_name
                # 分配者でないとき
                now_agent_name, respons =\
                    get_next_agent_program_check(ai_agent,
                                                 ra_ai_agent,
                                                 pre_agent_name,
                                                 respons)
                tools.command_list.g_time_keeper.wait()

                if None is now_agent_name:
                    break
                if "User" == now_agent_name:
                    break

                # キー入力があれば、確認。ESCでいったん作業終了
                input_data = msvcrt.getch()
                if input_data == b'\x1b':  # escキー
                    print("escキーが押されました")
                    break

                prompt = now_agent_name + "さん続きをお願い。"
                if loop_count_max <= loop_count:
                    now_agent_name = "User"
                    print("count over")
                    break
                loop_count += 1
                print("loop_count", loop_count)
    print("end_of_main")
if __name__ == '__main__':
    main()

AIによる解説

AGI スタートゲート前:リファレンスマニュアル

このプログラムは、複数のAIエージェントを連携させて、ユーザーの指示に基づいたタスクを実行するシステムです。

システムの概要

  • AIエージェント: それぞれ異なる役割を持つAIエージェントが複数存在します。
  • 役割割り当てオフィサー: ユーザーの指示を受け取り、適切なAIエージェントにタスクを割り当てます。
  • タスク実行: 割り当てられたAIエージェントは、タスクを実行し、結果をユーザーに返します。
  • エラー処理: エージェントがエラーを発生させた場合、自動的に修正を試みます。

使用方法

  1. 作業内容の入力: ユーザーは、作業内容をテキスト入力欄に入力します。
  2. 役割割り当て: 役割割り当てオフィサーが、入力された作業内容に基づいて、適切なAIエージェントを決定します。
  3. タスク実行: 決定されたAIエージェントが、タスクを実行します。
  4. 結果の表示: AIエージェントは、実行結果をユーザーに表示します。
  5. エラー処理: エラーが発生した場合、AIエージェントは自動的に修正を試みます。
  6. 次の作業者の決定: 役割割り当てオフィサーは、次の作業を行うAIエージェントを決定します。
  7. ループ: ステップ3から6を繰り返します。

AIエージェント

  • programer: プログラムを作成します。
  • RoleAssignmentOfficer: ユーザーの指示に基づいて、適切なAIエージェントを決定します。
  • その他: システムに登録されている他のAIエージェント。

コマンド

  • get_ai_agent_name_list: 登録されているAIエージェントの名前一覧を取得します。
  • get_ai_agent: 指定されたAIエージェントの情報を取得します。
  • get_tool_list: AIエージェントが使用できるツールのリストを取得します。
  • get_next_agent: 次の作業を行うAIエージェントを決定します。
  • set_work_space: 作業ディレクトリを設定します。
  • python_error_check: Pythonコードのエラーをチェックします。

注意点

  • エージェントがエラーを発生させた場合、自動的に修正を試みますが、必ずしも成功するとは限りません。
  • エラーが修正できない場合は、ユーザーが手動で修正する必要があります。
  • システムは、ユーザーの指示に基づいて動作します。ユーザーの指示が曖昧な場合、システムは適切な動作を行えない可能性があります。

参考情報

コード例

# AIエージェントの思考
print("think_agent name", name, prompt)
with st.chat_message(name):
    # コールバック関数の設定 (エージェントの動作の可視化用)
    st_cb = StreamlitCallbackHandler(
        st.container(), expand_new_thoughts=True)
    # エージェントを実行
    response = ai_agent.get_respons(prompt, st_cb)
    st.write(response["output"])
    print("response", response["output"])
return response["output"]

まとめ

このプログラムは、複数のAIエージェントを連携させて、ユーザーの指示に基づいたタスクを実行するシステムです。ユーザーは、作業内容を入力するだけで、AIエージェントが自動的にタスクを実行します。エラーが発生した場合、システムは自動的に修正を試みます。