From cca7507ddaa9fec8350855ec5d4ace739afc4bc4 Mon Sep 17 00:00:00 2001 From: "yifeng.wang" <3038880699@qq.com> Date: Fri, 2 May 2025 00:37:08 +0800 Subject: [PATCH] product survey usecase --- community_usecase/product_survey/main.py | 161 +++++++++++++++++++++++ pyproject.toml | 3 +- requirements.txt | 3 +- 3 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 community_usecase/product_survey/main.py diff --git a/community_usecase/product_survey/main.py b/community_usecase/product_survey/main.py new file mode 100644 index 0000000..df1df42 --- /dev/null +++ b/community_usecase/product_survey/main.py @@ -0,0 +1,161 @@ +# ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. ========= +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. ========= +import sys +import pathlib +from dotenv import load_dotenv +from camel.models import ModelFactory +from camel.toolkits import ( + AudioAnalysisToolkit, + CodeExecutionToolkit, + ExcelToolkit, + ImageAnalysisToolkit, + SearchToolkit, + VideoAnalysisToolkit, + BrowserToolkit, + FileWriteToolkit, + TerminalToolkit, + PyAutoGUIToolkit, + +) +from camel.types import ModelPlatformType, ModelType + +from camel.societies import RolePlaying +import os +from camel.logger import get_logger, set_log_file,set_log_level +from owl.utils import run_society, DocumentProcessingToolkit + +# Set logging +set_log_file("product.log") +logger = get_logger(__name__) +set_log_level(level="DEBUG") + + +# Load environment variables +load_dotenv(os.path.join(os.path.dirname(__file__), '../../owl/.env')) +base_dir = os.path.dirname(os.path.abspath(__file__)) +workspace_dir = os.path.join( + os.path.dirname(os.path.dirname(base_dir)), "workspace" +) + + +def construct_society(question: str) -> RolePlaying: + r"""Construct a society of agents based on the given question. + + Args: + question (str): The task or question to be addressed by the society. + + Returns: + RolePlaying: A configured society of agents ready to address the question. + """ + + # Create models for different components + models = { + "user": ModelFactory.create( + model_platform=ModelPlatformType.OPENAI, + model_type=ModelType.GPT_4O, + model_config_dict={"temperature": 0}, + ), + "assistant": ModelFactory.create( + model_platform=ModelPlatformType.OPENAI, + model_type=ModelType.GPT_4O, + model_config_dict={"temperature": 0}, + ), + "browsing": ModelFactory.create( + model_platform=ModelPlatformType.OPENAI, + model_type=ModelType.GPT_4O, + model_config_dict={"temperature": 0}, + ), + "planning": ModelFactory.create( + model_platform=ModelPlatformType.OPENAI, + model_type=ModelType.GPT_4O, + model_config_dict={"temperature": 0}, + ), + "video": ModelFactory.create( + model_platform=ModelPlatformType.OPENAI, + model_type=ModelType.GPT_4O, + model_config_dict={"temperature": 0}, + ), + "image": ModelFactory.create( + model_platform=ModelPlatformType.OPENAI, + model_type=ModelType.GPT_4O, + model_config_dict={"temperature": 0}, + ), + "document": ModelFactory.create( + model_platform=ModelPlatformType.OPENAI, + model_type=ModelType.GPT_4O, + 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["browsing"], + planning_agent_model=models["planning"], + ).get_tools(), + *PyAutoGUIToolkit().get_tools(), + *TerminalToolkit(working_dir=workspace_dir).get_tools(), + *VideoAnalysisToolkit(model=models["video"]).get_tools(), + *AudioAnalysisToolkit().get_tools(), # This requires OpenAI Key + *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, + *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, + ) + + return society + + +def main(): + r"""Main function to run the OWL system with an example question.""" + # Default research question + default_task = "please give me a product survey report for manus product.and then make a react website for it.please make full use of the Browsertoolkit、TerminalToolkit、PyAutoGUIToolkit、FileWriteToolkit etc." + + # Override default task if command line argument is provided + task = sys.argv[1] if len(sys.argv) > 1 else default_task + + # Construct and run the society + society = construct_society(task) + answer, chat_history, token_count = run_society(society) + + # Output the result + print(f"\033[94mAnswer: {answer}\033[0m") + + +if __name__ == "__main__": + main() diff --git a/pyproject.toml b/pyproject.toml index 8652236..772c23f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,13 +21,14 @@ keywords = [ "learning-systems" ] dependencies = [ - "camel-ai[owl]==0.2.45", + "camel-ai[owl]==0.2.49", "chunkr-ai>=0.0.41", "docx2markdown>=0.1.1", "gradio>=3.50.2", "mcp-simple-arxiv==0.2.2", "mcp-server-fetch==2025.1.17", "xmltodict>=0.14.2", + "pyautogui", ] [project.urls] diff --git a/requirements.txt b/requirements.txt index 96b829b..c27edab 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,7 @@ -camel-ai[owl]==0.2.45 +camel-ai[owl]==0.2.49 chunkr-ai>=0.0.41 docx2markdown>=0.1.1 gradio>=3.50.2 mcp-simple-arxiv==0.2.2 mcp-server-fetch==2025.1.17 +pyautogui