From 6ff2e8f921fe047b03d7e6d4f6533c743c18f928 Mon Sep 17 00:00:00 2001
From: thinkwee
Date: Mon, 18 Dec 2023 14:36:34 +0800
Subject: [PATCH] change online_log -> visualizer
---
Dockerfile | 2 +-
README.md | 13 +-
camel/agents/role_playing.py | 4 +-
chatdev/chat_chain.py | 24 +-
chatdev/chat_env.py | 4 +-
chatdev/codes.py | 20 +-
chatdev/composed_phase.py | 6 +-
chatdev/phase.py | 42 +-
chatdev/utils.py | 16 +-
misc/demo.png | Bin 147016 -> 586914 bytes
.../static/replay/logs/20230727204525.log | 3718 -----------------
readme/README-Arabic.md | 10 +-
readme/README-Bahasa-Indonesia.md | 8 +-
readme/README-Chinese.md | 2 +-
readme/README-Dutch.md | 10 +-
readme/README-Filipino.md | 10 +-
readme/README-French.md | 10 +-
readme/README-Hindi.md | 10 +-
readme/README-Japanese.md | 12 +-
readme/README-Korean.md | 2 +-
readme/README-Portuguese.md | 10 +-
readme/README-Slovak.md | 10 +-
readme/README-Spanish.md | 10 +-
readme/README-Turkish.md | 8 +-
{online_log => visualizer}/app.py | 0
.../static/avatars/Chief Creative Officer.png | Bin
.../avatars/Chief Executive Officer.png | Bin
.../avatars/Chief Human Resource Officer.png | Bin
.../static/avatars/Chief Product Officer.png | Bin
.../avatars/Chief Technology Officer.png | Bin
.../static/avatars/Code Reviewer.png | Bin
.../static/avatars/Counselor.png | Bin
.../static/avatars/Programmer.png | Bin
.../static/avatars/Prompt Engineer.png | Bin
.../static/avatars/Software Test Engineer.png | Bin
.../static/avatars/System.png | Bin
.../static/avatars/User.png | Bin
.../static/chain_visualizer.html | 4 +-
.../static/css/style.css | 0
.../static/figures/background.png | Bin
.../static/figures/ceo.png | Bin
.../static/figures/chatdev.png | Bin
.../static/figures/chatdev2.png | Bin
.../static/figures/company.png | Bin
.../static/figures/counselor.png | Bin
.../static/figures/cpo.png | Bin
.../static/figures/cto.png | Bin
.../static/figures/designer.png | Bin
.../static/figures/hr.png | Bin
.../static/figures/left.png | Bin
.../static/figures/pe.png | Bin
.../static/figures/programmer.png | Bin
.../static/figures/reviewer.png | Bin
.../static/figures/right.png | Bin
.../static/figures/tester.png | Bin
.../static/figures/title.png | Bin
.../static/figures/user.png | Bin
{online_log => visualizer}/static/index.html | 46 +-
{online_log => visualizer}/static/js/main.js | 0
{online_log => visualizer}/static/replay.html | 0
.../replay/css/github-markdown-dark.css | 0
.../static/replay/css/use.css | 0
.../static/replay/js/app.js | 0
.../static/replay/js/highlight.js | 0
wiki.md | 20 +-
65 files changed, 178 insertions(+), 3853 deletions(-)
delete mode 100644 online_log/static/replay/logs/20230727204525.log
rename {online_log => visualizer}/app.py (100%)
rename {online_log => visualizer}/static/avatars/Chief Creative Officer.png (100%)
rename {online_log => visualizer}/static/avatars/Chief Executive Officer.png (100%)
rename {online_log => visualizer}/static/avatars/Chief Human Resource Officer.png (100%)
rename {online_log => visualizer}/static/avatars/Chief Product Officer.png (100%)
rename {online_log => visualizer}/static/avatars/Chief Technology Officer.png (100%)
rename {online_log => visualizer}/static/avatars/Code Reviewer.png (100%)
rename {online_log => visualizer}/static/avatars/Counselor.png (100%)
rename {online_log => visualizer}/static/avatars/Programmer.png (100%)
rename {online_log => visualizer}/static/avatars/Prompt Engineer.png (100%)
rename {online_log => visualizer}/static/avatars/Software Test Engineer.png (100%)
rename {online_log => visualizer}/static/avatars/System.png (100%)
rename {online_log => visualizer}/static/avatars/User.png (100%)
rename {online_log => visualizer}/static/chain_visualizer.html (98%)
rename {online_log => visualizer}/static/css/style.css (100%)
rename {online_log => visualizer}/static/figures/background.png (100%)
rename {online_log => visualizer}/static/figures/ceo.png (100%)
rename {online_log => visualizer}/static/figures/chatdev.png (100%)
rename {online_log => visualizer}/static/figures/chatdev2.png (100%)
rename {online_log => visualizer}/static/figures/company.png (100%)
rename {online_log => visualizer}/static/figures/counselor.png (100%)
rename {online_log => visualizer}/static/figures/cpo.png (100%)
rename {online_log => visualizer}/static/figures/cto.png (100%)
rename {online_log => visualizer}/static/figures/designer.png (100%)
rename {online_log => visualizer}/static/figures/hr.png (100%)
rename {online_log => visualizer}/static/figures/left.png (100%)
rename {online_log => visualizer}/static/figures/pe.png (100%)
rename {online_log => visualizer}/static/figures/programmer.png (100%)
rename {online_log => visualizer}/static/figures/reviewer.png (100%)
rename {online_log => visualizer}/static/figures/right.png (100%)
rename {online_log => visualizer}/static/figures/tester.png (100%)
rename {online_log => visualizer}/static/figures/title.png (100%)
rename {online_log => visualizer}/static/figures/user.png (100%)
rename {online_log => visualizer}/static/index.html (64%)
rename {online_log => visualizer}/static/js/main.js (100%)
rename {online_log => visualizer}/static/replay.html (100%)
rename {online_log => visualizer}/static/replay/css/github-markdown-dark.css (100%)
rename {online_log => visualizer}/static/replay/css/use.css (100%)
rename {online_log => visualizer}/static/replay/js/app.js (100%)
rename {online_log => visualizer}/static/replay/js/highlight.js (100%)
diff --git a/Dockerfile b/Dockerfile
index 3a9df3c6d..c480cd1ad 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -17,7 +17,7 @@ RUN pip install --no-cache-dir -r requirements.txt
# (you'll need to provide the actual key when running the container)
ENV OPENAI_API_KEY=your_OpenAI_API_key
-# Expose the port for online_log/app.py
+# Expose the port for visualizer/app.py
EXPOSE 8000
# Set an entry point that runs a shell for interactive mode
diff --git a/README.md b/README.md
index 46bb73085..5dc614a15 100644
--- a/README.md
+++ b/README.md
@@ -8,14 +8,14 @@
【English | Chinese | Japanese | Korean | Filipino | French | Slovak | Portuguese | Spanish | Dutch | Hindi | Bahasa Indonesia】
- 【📚 Wiki | 🚀 Local Demo | 👥 Community Built Software | 🔧 Customization | 👾 Discord】
+ 【📚 Wiki | 🚀 Visualizer | 👥 Community Built Software | 🔧 Customization | 👾 Discord】
## 📖 Overview
- **ChatDev** stands as a **virtual software company** that operates through various **intelligent agents** holding
- different roles, including Chief Executive Officer
, Chief Product Officer
, Chief Technology Officer
, programmer
, reviewer
, tester
, art designer
. These
+ different roles, including Chief Executive Officer
, Chief Product Officer
, Chief Technology Officer
, programmer
, reviewer
, tester
, art designer
. These
agents form a multi-agent organizational structure and are united by a mission to "revolutionize the digital world
through programming." The agents within ChatDev **collaborate** by participating in specialized functional seminars,
including tasks such as designing, coding, testing, and documenting.
@@ -40,16 +40,16 @@
-- September 25, 2023: The **Git** mode is now available, enabling the programmer
to utilize Git for version control. To enable this feature, simply set ``"git_management"`` to ``"True"`` in ``ChatChainConfig.json``. See [guide](wiki.md#git-mode).
+- September 25, 2023: The **Git** mode is now available, enabling the programmer
to utilize Git for version control. To enable this feature, simply set ``"git_management"`` to ``"True"`` in ``ChatChainConfig.json``. See [guide](wiki.md#git-mode).
-- September 20, 2023: The **Human-Agent-Interaction** mode is now available! You can get involved with the ChatDev team by playing the role of reviewer
and making suggestions to the programmer
;
+- September 20, 2023: The **Human-Agent-Interaction** mode is now available! You can get involved with the ChatDev team by playing the role of reviewer
and making suggestions to the programmer
;
try ``python3 run.py --task [description_of_your_idea] --config "Human"``. See [guide](wiki.md#human-agent-interaction) and [example](WareHouse/Gomoku_HumanAgentInteraction_20230920135038).
-- September 1, 2023: The **Art** mode is available now! You can activate the designer agent
to generate images used in the software;
+- September 1, 2023: The **Art** mode is available now! You can activate the designer agent
to generate images used in the software;
try ``python3 run.py --task [description_of_your_idea] --config "Art"``. See [guide](wiki.md#art) and [example](WareHouse/gomokugameArtExample_THUNLP_20230831122822).
- August 28, 2023: The system is publicly available.
- August 17, 2023: The v1.0.0 version was ready for release.
@@ -152,8 +152,7 @@ To get started, follow these steps:
For more detailed information, please refer to our [Wiki](wiki.md), where you can find:
- An introduction to all command run parameters.
-- A straightforward guide for setting up a local web demo, which includes enhanced visualized logs, a replay demo, and a
- simple ChatChain Visualizer.
+- A straightforward guide for setting up a local web visualizer demo, which can visualize real-time logs, replayed logs, and ChatChain.
- An overview of the ChatDev framework.
- A comprehensive introduction to all advanced parameters in ChatChain configuration.
- Guides for customizing ChatDev, including:
diff --git a/camel/agents/role_playing.py b/camel/agents/role_playing.py
index 3d12a1e8a..3844a1a83 100644
--- a/camel/agents/role_playing.py
+++ b/camel/agents/role_playing.py
@@ -23,7 +23,7 @@
from camel.messages import ChatMessage, UserChatMessage
from camel.messages import SystemMessage
from camel.typing import ModelType, RoleType, TaskType, PhaseType
-from chatdev.utils import log_arguments, log_and_print_online
+from chatdev.utils import log_arguments, log_visualize
@log_arguments
@@ -199,7 +199,7 @@ def init_chat(self, phase_type: PhaseType = None,
self.user_agent.update_messages(pseudo_msg)
# here we concatenate to store the real message in the log
- log_and_print_online(self.user_agent.role_name,
+ log_visualize(self.user_agent.role_name,
"**[Start Chat]**\n\n[" + self.assistant_agent.system_message.content + "]\n\n" + content)
return None, user_msg
diff --git a/chatdev/chat_chain.py b/chatdev/chat_chain.py
index 61f5d5f5d..ca02596e0 100644
--- a/chatdev/chat_chain.py
+++ b/chatdev/chat_chain.py
@@ -11,7 +11,7 @@
from camel.typing import TaskType, ModelType
from chatdev.chat_env import ChatEnv, ChatEnvConfig
from chatdev.statistics import get_info
-from chatdev.utils import log_and_print_online, now
+from chatdev.utils import log_visualize, now
def check_bool(s):
@@ -234,7 +234,7 @@ def pre_processing(self):
preprocess_msg += "**Log File**: {}\n\n".format(self.log_filepath)
preprocess_msg += "**ChatDevConfig**:\n{}\n\n".format(self.chat_env.config.__str__())
preprocess_msg += "**ChatGPTConfig**:\n{}\n\n".format(chat_gpt_config)
- log_and_print_online(preprocess_msg)
+ log_visualize(preprocess_msg)
# init task prompt
if check_bool(self.config['self_improve']):
@@ -254,14 +254,14 @@ def post_processing(self):
root = os.path.dirname(filepath)
if self.chat_env_config.git_management:
- git_online_log = "**[Git Information]**\n\n"
+ log_git_info = "**[Git Information]**\n\n"
self.chat_env.codes.version += 1
os.system("cd {}; git add .".format(self.chat_env.env_dict["directory"]))
- git_online_log += "cd {}; git add .\n".format(self.chat_env.env_dict["directory"])
+ log_git_info += "cd {}; git add .\n".format(self.chat_env.env_dict["directory"])
os.system("cd {}; git commit -m \"v{} Final Version\"".format(self.chat_env.env_dict["directory"], self.chat_env.codes.version))
- git_online_log += "cd {}; git commit -m \"v{} Final Version\"\n".format(self.chat_env.env_dict["directory"], self.chat_env.codes.version)
- log_and_print_online(git_online_log)
+ log_git_info += "cd {}; git commit -m \"v{} Final Version\"\n".format(self.chat_env.env_dict["directory"], self.chat_env.codes.version)
+ log_visualize(log_git_info)
git_info = "**[Git Log]**\n\n"
import subprocess
@@ -276,7 +276,7 @@ def post_processing(self):
log_output = "Error when executing " + command
git_info += log_output
- log_and_print_online(git_info)
+ log_visualize(git_info)
post_info = "**[Post Info]**\n\n"
now_time = now()
@@ -300,7 +300,7 @@ def post_processing(self):
shutil.rmtree(file_path, ignore_errors=True)
post_info += "{} Removed.".format(file_path) + "\n\n"
- log_and_print_online(post_info)
+ log_visualize(post_info)
logging.shutdown()
time.sleep(1)
@@ -339,14 +339,14 @@ def self_task_improve(self, task_prompt):
model_type=self.model_type,
)
- # log_and_print_online("System", role_play_session.assistant_sys_msg)
- # log_and_print_online("System", role_play_session.user_sys_msg)
+ # log_visualize("System", role_play_session.assistant_sys_msg)
+ # log_visualize("System", role_play_session.user_sys_msg)
_, input_user_msg = role_play_session.init_chat(None, None, self_task_improve_prompt)
assistant_response, user_response = role_play_session.step(input_user_msg, True)
revised_task_prompt = assistant_response.msg.content.split("")[-1].lower().strip()
- log_and_print_online(role_play_session.assistant_agent.role_name, assistant_response.msg.content)
- log_and_print_online(
+ log_visualize(role_play_session.assistant_agent.role_name, assistant_response.msg.content)
+ log_visualize(
"**[Task Prompt Self Improvement]**\n**Original Task Prompt**: {}\n**Improved Task Prompt**: {}".format(
task_prompt, revised_task_prompt))
return revised_task_prompt
diff --git a/chatdev/chat_env.py b/chatdev/chat_env.py
index 20ccdc629..e2acf1b93 100644
--- a/chatdev/chat_env.py
+++ b/chatdev/chat_env.py
@@ -12,7 +12,7 @@
from chatdev.codes import Codes
from chatdev.documents import Documents
from chatdev.roster import Roster
-from chatdev.utils import log_and_print_online
+from chatdev.utils import log_visualize
class ChatEnvConfig:
@@ -60,7 +60,7 @@ def fix_module_not_found_error(test_reports):
for match in re.finditer(r"No module named '(\S+)'", test_reports, re.DOTALL):
module = match.group(1)
subprocess.Popen("pip install {}".format(module), shell=True).wait()
- log_and_print_online("**[CMD Execute]**\n\n[CMD] pip install {}".format(module))
+ log_visualize("**[CMD Execute]**\n\n[CMD] pip install {}".format(module))
def set_directory(self, directory):
assert len(self.env_dict['directory']) == 0
diff --git a/chatdev/codes.py b/chatdev/codes.py
index 69c4738c4..9c887717c 100644
--- a/chatdev/codes.py
+++ b/chatdev/codes.py
@@ -3,7 +3,7 @@
import re
import subprocess
-from chatdev.utils import log_and_print_online
+from chatdev.utils import log_visualize
class Codes:
@@ -70,7 +70,7 @@ def _update_codes(self, generated_content):
'''\n""" + unified_diff + "\n```"
- log_and_print_online(update_codes_content)
+ log_visualize(update_codes_content)
self.codebooks[key] = new_codes.codebooks[key]
def _rewrite_codes(self, git_management, phase_info=None) -> None:
@@ -91,12 +91,12 @@ def _rewrite_codes(self, git_management, phase_info=None) -> None:
if git_management:
if not phase_info:
phase_info = ""
- git_online_log = "**[Git Information]**\n\n"
+ log_git_info = "**[Git Information]**\n\n"
if self.version == 1.0:
os.system("cd {}; git init".format(self.directory))
- git_online_log += "cd {}; git init\n".format(self.directory)
+ log_git_info += "cd {}; git init\n".format(self.directory)
os.system("cd {}; git add .".format(self.directory))
- git_online_log += "cd {}; git add .\n".format(self.directory)
+ log_git_info += "cd {}; git add .\n".format(self.directory)
# check if there exist diff
completed_process = subprocess.run("cd {}; git status".format(self.directory), shell=True, text=True,
@@ -106,18 +106,18 @@ def _rewrite_codes(self, git_management, phase_info=None) -> None:
return
os.system("cd {}; git commit -m \"v{}\"".format(self.directory, str(self.version) + " " + phase_info))
- git_online_log += "cd {}; git commit -m \"v{}\"\n".format(self.directory,
+ log_git_info += "cd {}; git commit -m \"v{}\"\n".format(self.directory,
str(self.version) + " " + phase_info)
if self.version == 1.0:
os.system("cd {}; git submodule add ./{} {}".format(os.path.dirname(os.path.dirname(self.directory)),
"WareHouse/" + os.path.basename(self.directory),
"WareHouse/" + os.path.basename(self.directory)))
- git_online_log += "cd {}; git submodule add ./{} {}\n".format(
+ log_git_info += "cd {}; git submodule add ./{} {}\n".format(
os.path.dirname(os.path.dirname(self.directory)),
"WareHouse/" + os.path.basename(self.directory),
"WareHouse/" + os.path.basename(self.directory))
- log_and_print_online(rewrite_codes_content)
- log_and_print_online(git_online_log)
+ log_visualize(rewrite_codes_content)
+ log_visualize(log_git_info)
def _get_codes(self) -> str:
content = ""
@@ -134,4 +134,4 @@ def _load_from_hardware(self, directory) -> None:
if filename.endswith(".py"):
code = open(os.path.join(directory, filename), "r", encoding="utf-8").read()
self.codebooks[filename] = self._format_code(code)
- log_and_print_online("{} files read from {}".format(len(self.codebooks.keys()), directory))
+ log_visualize("{} files read from {}".format(len(self.codebooks.keys()), directory))
diff --git a/chatdev/composed_phase.py b/chatdev/composed_phase.py
index a27d4a056..b9d82ce5c 100644
--- a/chatdev/composed_phase.py
+++ b/chatdev/composed_phase.py
@@ -5,7 +5,7 @@
from camel.typing import ModelType
from chatdev.chat_env import ChatEnv
-from chatdev.utils import log_and_print_online
+from chatdev.utils import log_visualize
def check_bool(s):
@@ -142,7 +142,7 @@ def execute(self, chat_env) -> ChatEnv:
max_turn_step = phase_item['max_turn_step']
need_reflect = check_bool(phase_item['need_reflect'])
self.phase_env["cycle_index"] = cycle_index
- log_and_print_online(
+ log_visualize(
f"**[Execute Detail]**\n\nexecute SimplePhase:[{phase}] in ComposedPhase:[{self.phase_name}], cycle {cycle_index}")
if phase in self.phases:
self.phases[phase].phase_env = self.phase_env
@@ -246,7 +246,7 @@ def update_chat_env(self, chat_env):
def break_cycle(self, phase_env) -> bool:
if not phase_env['exist_bugs_flag']:
- log_and_print_online(f"**[Test Info]**\n\nAI User (Software Test Engineer):\nTest Pass!\n")
+ log_visualize(f"**[Test Info]**\n\nAI User (Software Test Engineer):\nTest Pass!\n")
return True
else:
return False
diff --git a/chatdev/phase.py b/chatdev/phase.py
index 476de5f3f..15a6ee426 100644
--- a/chatdev/phase.py
+++ b/chatdev/phase.py
@@ -7,7 +7,7 @@
from camel.typing import TaskType, ModelType
from chatdev.chat_env import ChatEnv
from chatdev.statistics import get_info
-from chatdev.utils import log_and_print_online, log_arguments
+from chatdev.utils import log_visualize, log_arguments
class Phase(ABC):
@@ -105,8 +105,8 @@ def chatting(
model_type=model_type,
)
- # log_and_print_online("System", role_play_session.assistant_sys_msg)
- # log_and_print_online("System", role_play_session.user_sys_msg)
+ # log_visualize("System", role_play_session.assistant_sys_msg)
+ # log_visualize("System", role_play_session.user_sys_msg)
# start the chat
_, input_user_msg = role_play_session.init_chat(None, placeholders, phase_prompt)
@@ -135,8 +135,8 @@ def chatting(
# TODO: max_tokens_exceeded errors here
if isinstance(assistant_response.msg, ChatMessage):
# we log the second interaction here
- log_and_print_online(role_play_session.assistant_agent.role_name,
- conversation_meta + "[" + role_play_session.user_agent.system_message.content + "]\n\n" + assistant_response.msg.content)
+ log_visualize(role_play_session.assistant_agent.role_name,
+ conversation_meta + "[" + role_play_session.user_agent.system_message.content + "]\n\n" + assistant_response.msg.content)
if role_play_session.assistant_agent.info:
seminar_conclusion = assistant_response.msg.content
break
@@ -145,8 +145,8 @@ def chatting(
if isinstance(user_response.msg, ChatMessage):
# here is the result of the second interaction, which may be used to start the next chat turn
- log_and_print_online(role_play_session.user_agent.role_name,
- conversation_meta + "[" + role_play_session.assistant_agent.system_message.content + "]\n\n" + user_response.msg.content)
+ log_visualize(role_play_session.user_agent.role_name,
+ conversation_meta + "[" + role_play_session.assistant_agent.system_message.content + "]\n\n" + user_response.msg.content)
if role_play_session.user_agent.info:
seminar_conclusion = user_response.msg.content
break
@@ -175,7 +175,7 @@ def chatting(
else:
seminar_conclusion = assistant_response.msg.content
- log_and_print_online("**[Seminar Conclusion]**:\n\n {}".format(seminar_conclusion))
+ log_visualize("**[Seminar Conclusion]**:\n\n {}".format(seminar_conclusion))
seminar_conclusion = seminar_conclusion.split("")[-1]
return seminar_conclusion
@@ -354,7 +354,7 @@ def update_chat_env(self, chat_env) -> ChatEnv:
if len(chat_env.codes.codebooks.keys()) == 0:
raise ValueError("No Valid Codes.")
chat_env.rewrite_codes("Finish Coding")
- log_and_print_online(
+ log_visualize(
"**[Software Info]**:\n\n {}".format(get_info(chat_env.env_dict['directory'], self.log_filepath)))
return chat_env
@@ -370,7 +370,7 @@ def update_phase_env(self, chat_env):
def update_chat_env(self, chat_env) -> ChatEnv:
chat_env.proposed_images = chat_env.get_proposed_images_from_message(self.seminar_conclusion)
- log_and_print_online(
+ log_visualize(
"**[Software Info]**:\n\n {}".format(get_info(chat_env.env_dict['directory'], self.log_filepath)))
return chat_env
@@ -391,7 +391,7 @@ def update_chat_env(self, chat_env) -> ChatEnv:
chat_env.update_codes(self.seminar_conclusion)
chat_env.rewrite_codes("Finish Art Integration")
# chat_env.generate_images_from_codes()
- log_and_print_online(
+ log_visualize(
"**[Software Info]**:\n\n {}".format(get_info(chat_env.env_dict['directory'], self.log_filepath)))
return chat_env
@@ -422,7 +422,7 @@ def update_chat_env(self, chat_env) -> ChatEnv:
if len(chat_env.codes.codebooks.keys()) == 0:
raise ValueError("No Valid Codes.")
chat_env.rewrite_codes("Code Complete #" + str(self.phase_env["cycle_index"]) + " Finished")
- log_and_print_online(
+ log_visualize(
"**[Software Info]**:\n\n {}".format(get_info(chat_env.env_dict['directory'], self.log_filepath)))
return chat_env
@@ -461,7 +461,7 @@ def update_chat_env(self, chat_env) -> ChatEnv:
if "```".lower() in self.seminar_conclusion.lower():
chat_env.update_codes(self.seminar_conclusion)
chat_env.rewrite_codes("Review #" + str(self.phase_env["cycle_index"]) + " Finished")
- log_and_print_online(
+ log_visualize(
"**[Software Info]**:\n\n {}".format(get_info(chat_env.env_dict['directory'], self.log_filepath)))
self.phase_env['modification_conclusion'] = self.seminar_conclusion
return chat_env
@@ -482,13 +482,13 @@ def update_chat_env(self, chat_env) -> ChatEnv:
if "```".lower() in self.seminar_conclusion.lower():
chat_env.update_codes(self.seminar_conclusion)
chat_env.rewrite_codes("Human Review #" + str(self.phase_env["cycle_index"]) + " Finished")
- log_and_print_online(
+ log_visualize(
"**[Software Info]**:\n\n {}".format(get_info(chat_env.env_dict['directory'], self.log_filepath)))
return chat_env
def execute(self, chat_env, chat_turn_limit, need_reflect) -> ChatEnv:
self.update_phase_env(chat_env)
- log_and_print_online(
+ log_visualize(
f"**[Human-Agent-Interaction]**\n\n"
f"Now you can participate in the development of the software!\n"
f"The task is: {chat_env.env_dict['task_prompt']}\n"
@@ -507,7 +507,7 @@ def execute(self, chat_env, chat_turn_limit, need_reflect) -> ChatEnv:
break
provided_comments.append(user_input)
self.phase_env["comments"] = '\n'.join(provided_comments)
- log_and_print_online(
+ log_visualize(
f"**[User Provided Comments]**\n\n In the #{self.phase_env['cycle_index']} of total {self.phase_env['cycle_num']} comments: \n\n" +
self.phase_env["comments"])
if self.phase_env["comments"].strip().lower() == "exit":
@@ -544,7 +544,7 @@ def update_phase_env(self, chat_env):
"codes": chat_env.get_codes(),
"test_reports": test_reports,
"exist_bugs_flag": exist_bugs_flag})
- log_and_print_online("**[Test Reports]**:\n\n{}".format(test_reports))
+ log_visualize("**[Test Reports]**:\n\n{}".format(test_reports))
def update_chat_env(self, chat_env) -> ChatEnv:
chat_env.env_dict['error_summary'] = self.seminar_conclusion
@@ -556,13 +556,13 @@ def execute(self, chat_env, chat_turn_limit, need_reflect) -> ChatEnv:
self.update_phase_env(chat_env)
if "ModuleNotFoundError" in self.phase_env['test_reports']:
chat_env.fix_module_not_found_error(self.phase_env['test_reports'])
- log_and_print_online(
+ log_visualize(
f"Software Test Engineer found ModuleNotFoundError:\n{self.phase_env['test_reports']}\n")
pip_install_content = ""
for match in re.finditer(r"No module named '(\S+)'", self.phase_env['test_reports'], re.DOTALL):
module = match.group(1)
pip_install_content += "{}\n```{}\n{}\n```\n".format("cmd", "bash", f"pip install {module}")
- log_and_print_online(f"Programmer resolve ModuleNotFoundError by:\n{pip_install_content}\n")
+ log_visualize(f"Programmer resolve ModuleNotFoundError by:\n{pip_install_content}\n")
self.seminar_conclusion = "nothing need to do"
else:
self.seminar_conclusion = \
@@ -599,7 +599,7 @@ def update_chat_env(self, chat_env) -> ChatEnv:
if "```".lower() in self.seminar_conclusion.lower():
chat_env.update_codes(self.seminar_conclusion)
chat_env.rewrite_codes("Test #" + str(self.phase_env["cycle_index"]) + " Finished")
- log_and_print_online(
+ log_visualize(
"**[Software Info]**:\n\n {}".format(get_info(chat_env.env_dict['directory'], self.log_filepath)))
return chat_env
@@ -618,7 +618,7 @@ def update_phase_env(self, chat_env):
def update_chat_env(self, chat_env) -> ChatEnv:
chat_env._update_requirements(self.seminar_conclusion)
chat_env.rewrite_requirements()
- log_and_print_online(
+ log_visualize(
"**[Software Info]**:\n\n {}".format(get_info(chat_env.env_dict['directory'], self.log_filepath)))
return chat_env
diff --git a/chatdev/utils.py b/chatdev/utils.py
index 0757b189e..4f17947ca 100644
--- a/chatdev/utils.py
+++ b/chatdev/utils.py
@@ -6,14 +6,24 @@
import markdown
import inspect
from camel.messages.system_messages import SystemMessage
-from online_log.app import send_msg
+from visualizer.app import send_msg
def now():
return time.strftime("%Y%m%d%H%M%S", time.localtime())
-def log_and_print_online(role, content=None):
+def log_visualize(role, content=None):
+ """
+ send the role and content to visualizer server to show log on webpage in real-time
+ You can leave the role undefined and just pass the content, i.e. log_visualize("messages"), where the role is "System".
+ Args:
+ role: the agent that sends message
+ content: the content of message
+
+ Returns: None
+
+ """
if not content:
logging.info(role + "\n")
send_msg("System", role)
@@ -64,7 +74,7 @@ def wrapper(*args, **kwargs):
value = escape_string(value)
records_kv.append([name, value])
records = f"**[{func.__name__}]**\n\n" + convert_to_markdown_table(records_kv)
- log_and_print_online("System", records)
+ log_visualize("System", records)
return func(*args, **kwargs)
diff --git a/misc/demo.png b/misc/demo.png
index 4afe026f2fd929b15286427dfac15ccd5595be4b..274bb69eba1cbd12ba1b00190ab90efedc74cdb4 100644
GIT binary patch
literal 586914
zcmbrlWmp`~vN((r+$}f+cL?sm0%Y;vt|73vv$#W$1PvM>KnN@ji@OC4K^9ru-QE7=
z*gf~WznuHwoo8mJr@gDHtE#JNqtsLsu+X2Q!@~`RC<91^t;8FNA
zhi`KP=8Fm!yDAp-0%sD5#>9|076;2RP6=S~DI0