From 40f256e6cd58eec83196946a260e200242545346 Mon Sep 17 00:00:00 2001 From: Yuujee Date: Mon, 17 Mar 2025 23:37:47 +0800 Subject: [PATCH] feat: add cli mode --- examples/run_cli.py | 181 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 examples/run_cli.py diff --git a/examples/run_cli.py b/examples/run_cli.py new file mode 100644 index 0000000..5acea00 --- /dev/null +++ b/examples/run_cli.py @@ -0,0 +1,181 @@ +from dotenv import load_dotenv + +from camel.models import ModelFactory +from camel.toolkits import ( + ExcelToolkit, + SearchToolkit, + FileWriteToolkit, + CodeExecutionToolkit, + BrowserToolkit, + VideoAnalysisToolkit, + ImageAnalysisToolkit, +) +from camel.types import ModelPlatformType, ModelType +from camel.societies import RolePlaying +from camel.logger import set_log_level + +from owl.utils import run_society, DocumentProcessingToolkit + +import pathlib + +# Set the log level to DEBUG for detailed debugging information +set_log_level(level="DEBUG") + +# Get the parent directory of the current file and construct the path to the .env file +base_dir = pathlib.Path(__file__).parent.parent +env_path = base_dir / "owl" / ".env" +load_dotenv(dotenv_path=str(env_path)) + + +def get_user_input(prompt): + # Get user input and strip leading/trailing whitespace + return input(prompt).strip() + + +def get_construct_params() -> dict[str, any]: + # Welcome message + print("Welcome to owl! Have fun!") + + # Select model platform type + model_platforms = ModelPlatformType + print("Please select the model platform type:") + for i, platform in enumerate(model_platforms, 1): + print(f"{i}. {platform}") + model_platform_choice = int( + get_user_input("Please enter the model platform number:") + ) + selected_model_platform = list(model_platforms)[model_platform_choice - 1] + print(f"The model platform you selected is: {selected_model_platform}") + + # Select model type + models = ModelType + print("Please select the model type:") + for i, model in enumerate(models, 1): + print(f"{i}. {model}") + model_choice = int(get_user_input("Please enter the model number:")) + selected_model = list(models)[model_choice - 1] + print(f"The model you selected is: {selected_model}") + + # Select language + languages = ["English", "Chinese"] + print("Please select the language:") + for i, lang in enumerate(languages, 1): + print(f"{i}. {lang}") + language_choice = int(get_user_input("Please enter the language number:")) + selected_language = languages[language_choice - 1] + print(f"The language you selected is: {selected_language}") + + # Enter the question + question = get_user_input("Please enter your question:") + print(f"Your question is: {question}") + + return { + "language": selected_language, + "model_type": selected_model, + "model_platform": selected_model_platform, + "question": question, + } + + +def construct_society() -> RolePlaying: + # Get user input parameters + params = get_construct_params() + question = params["question"] + selected_model_type = params["model_type"] + selected_model_platform = params["model_platform"] + selected_language = params["language"] + + # Create model instances for different roles + models = { + "user": ModelFactory.create( + model_platform=selected_model_platform, + model_type=selected_model_type, + model_config_dict={"temperature": 0}, + ), + "assistant": ModelFactory.create( + model_platform=selected_model_platform, + model_type=selected_model_type, + model_config_dict={"temperature": 0}, + ), + "web": ModelFactory.create( + model_platform=selected_model_platform, + model_type=selected_model_type, + model_config_dict={"temperature": 0}, + ), + "planning": ModelFactory.create( + model_platform=selected_model_platform, + model_type=selected_model_type, + model_config_dict={"temperature": 0}, + ), + "video": ModelFactory.create( + model_platform=selected_model_platform, + model_type=selected_model_type, + model_config_dict={"temperature": 0}, + ), + "image": ModelFactory.create( + model_platform=selected_model_platform, + model_type=selected_model_type, + model_config_dict={"temperature": 0}, + ), + "document": ModelFactory.create( + model_platform=selected_model_platform, + model_type=selected_model_type, + model_config_dict={"temperature": 0}, + ), + } + + # Configure toolkits + tools = [ + *BrowserToolkit( + headless=False, # Set to True for headless mode (e.g., on remote servers) + web_agent_model=models["web"], + planning_agent_model=models["planning"], + output_language="Chinese", + ).get_tools(), + *VideoAnalysisToolkit(model=models["video"]).get_tools(), + *CodeExecutionToolkit(sandbox="subprocess", verbose=True).get_tools(), + *ImageAnalysisToolkit(model=models["image"]).get_tools(), + SearchToolkit().search_duckduckgo, + SearchToolkit().search_google, # Comment this out if you don't have Google search + SearchToolkit().search_wiki, + SearchToolkit().search_baidu, + SearchToolkit().search_bing, + *ExcelToolkit().get_tools(), + *DocumentProcessingToolkit(model=models["document"]).get_tools(), + *FileWriteToolkit(output_dir="./").get_tools(), + ] + + # Configure agent roles and parameters + user_agent_kwargs = {"model": models["user"]} + assistant_agent_kwargs = {"model": models["assistant"], "tools": tools} + + # Configure task parameters + task_kwargs = { + "task_prompt": question, + "with_task_specify": False, + } + + # Create and return the society + society = RolePlaying( + **task_kwargs, + user_role_name="user", + user_agent_kwargs=user_agent_kwargs, + assistant_role_name="assistant", + assistant_agent_kwargs=assistant_agent_kwargs, + output_language=selected_language, + ) + + return society + + +def main(): + # Construct the society + society = construct_society() + # Run the society and get the answer, chat history, and token count + answer, chat_history, token_count = run_society(society) + # Print the answer + print(f"\033[94mAnswer: {answer}\033[0m") + + +if __name__ == "__main__": + main()