fix issue 431

This commit is contained in:
Wendong
2025-04-01 00:02:40 +08:00
parent 082f12de34
commit 9592eab0d4
3 changed files with 103 additions and 72 deletions

View File

@@ -16,12 +16,10 @@ import pathlib
from dotenv import load_dotenv from dotenv import load_dotenv
from camel.models import ModelFactory from camel.models import ModelFactory
from camel.toolkits import ( from camel.toolkits import (
AudioAnalysisToolkit,
CodeExecutionToolkit, CodeExecutionToolkit,
ExcelToolkit, ExcelToolkit,
ImageAnalysisToolkit, ImageAnalysisToolkit,
SearchToolkit, SearchToolkit,
VideoAnalysisToolkit,
BrowserToolkit, BrowserToolkit,
FileWriteToolkit, FileWriteToolkit,
) )

View File

@@ -16,18 +16,22 @@
# You can obtain your API key from Bailian platform: bailian.console.aliyun.com # You can obtain your API key from Bailian platform: bailian.console.aliyun.com
# Set it as QWEN_API_KEY="your-api-key" in your .env file or add it to your environment variables # Set it as QWEN_API_KEY="your-api-key" in your .env file or add it to your environment variables
from dotenv import load_dotenv
import sys import sys
from dotenv import load_dotenv
from camel.models import ModelFactory from camel.models import ModelFactory
from camel.toolkits import BrowserToolkit, SearchToolkit, FileWriteToolkit from camel.toolkits import (
SearchToolkit,
BrowserToolkit,
FileWriteToolkit,
)
from camel.types import ModelPlatformType, ModelType from camel.types import ModelPlatformType, ModelType
from camel.societies import RolePlaying
from owl.utils import run_society from owl.utils import run_society
from camel.societies import RolePlaying
from camel.logger import set_log_level from camel.logger import set_log_level
import pathlib import pathlib
base_dir = pathlib.Path(__file__).parent.parent base_dir = pathlib.Path(__file__).parent.parent
@@ -38,61 +42,83 @@ set_log_level(level="DEBUG")
def construct_society(question: str) -> RolePlaying: def construct_society(question: str) -> RolePlaying:
r"""Construct the society based on the question.""" """
Construct a society of agents based on the given question.
user_role_name = "user" Args:
assistant_role_name = "assistant" question (str): The task or question to be addressed by the society.
user_model = ModelFactory.create( Returns:
model_platform=ModelPlatformType.QWEN, RolePlaying: A configured society of agents ready to address the question.
model_type=ModelType.QWEN_MAX, """
model_config_dict={"temperature": 0},
)
assistant_model = ModelFactory.create( # Create models for different components
model_platform=ModelPlatformType.QWEN, models = {
model_type=ModelType.QWEN_MAX, "user": ModelFactory.create(
model_config_dict={"temperature": 0}, model_platform=ModelPlatformType.QWEN,
) model_type=ModelType.QWEN_MAX,
model_config_dict={"temperature": 0},
),
"assistant": ModelFactory.create(
model_platform=ModelPlatformType.QWEN,
model_type=ModelType.QWEN_MAX,
model_config_dict={"temperature": 0},
),
"browsing": ModelFactory.create(
model_platform=ModelPlatformType.QWEN,
model_type=ModelType.QWEN_VL_MAX,
model_config_dict={"temperature": 0},
),
"planning": ModelFactory.create(
model_platform=ModelPlatformType.QWEN,
model_type=ModelType.QWEN_MAX,
model_config_dict={"temperature": 0},
),
"video": ModelFactory.create(
model_platform=ModelPlatformType.QWEN,
model_type=ModelType.QWEN_VL_MAX,
model_config_dict={"temperature": 0},
),
"image": ModelFactory.create(
model_platform=ModelPlatformType.QWEN,
model_type=ModelType.QWEN_VL_MAX,
model_config_dict={"temperature": 0},
),
"document": ModelFactory.create(
model_platform=ModelPlatformType.QWEN,
model_type=ModelType.QWEN_VL_MAX,
model_config_dict={"temperature": 0},
),
}
planning_model = ModelFactory.create( # Configure toolkits
model_platform=ModelPlatformType.QWEN, tools = [
model_type=ModelType.QWEN_MAX,
model_config_dict={"temperature": 0},
)
web_model = ModelFactory.create(
model_platform=ModelPlatformType.QWEN,
model_type=ModelType.QWEN_VL_MAX,
model_config_dict={"temperature": 0},
)
tools_list = [
*BrowserToolkit( *BrowserToolkit(
headless=False, headless=False, # Set to True for headless mode (e.g., on remote servers)
web_agent_model=web_model, web_agent_model=models["browsing"],
planning_agent_model=planning_model, planning_agent_model=models["planning"],
output_language="Chinese", output_language="Chinese",
).get_tools(), ).get_tools(),
SearchToolkit().search_baidu, SearchToolkit().search_baidu,
*FileWriteToolkit(output_dir="./").get_tools(), *FileWriteToolkit(output_dir="./").get_tools(),
] ]
user_role_name = "user" # Configure agent roles and parameters
user_agent_kwargs = dict(model=user_model) user_agent_kwargs = {"model": models["user"]}
assistant_role_name = "assistant" assistant_agent_kwargs = {"model": models["assistant"], "tools": tools}
assistant_agent_kwargs = dict(model=assistant_model, tools=tools_list)
# Configure task parameters
task_kwargs = { task_kwargs = {
"task_prompt": question, "task_prompt": question,
"with_task_specify": False, "with_task_specify": False,
} }
# Create and return the society
society = RolePlaying( society = RolePlaying(
**task_kwargs, **task_kwargs,
user_role_name=user_role_name, user_role_name="user",
user_agent_kwargs=user_agent_kwargs, user_agent_kwargs=user_agent_kwargs,
assistant_role_name=assistant_role_name, assistant_role_name="assistant",
assistant_agent_kwargs=assistant_agent_kwargs, assistant_agent_kwargs=assistant_agent_kwargs,
output_language="Chinese", output_language="Chinese",
) )
@@ -100,15 +126,21 @@ def construct_society(question: str) -> RolePlaying:
return society return society
# Example case def main():
default_task = "浏览亚马逊并找出一款对程序员有吸引力的产品。请提供产品名称和价格" r"""Main function to run the OWL system with an example question."""
# Example research question
default_task = "浏览亚马逊并找出一款对程序员有吸引力的产品。请提供产品名称和价格"
# Override default task if command line argument is provided # Override default task if command line argument is provided
task = sys.argv[1] if len(sys.argv) > 1 else default_task task = sys.argv[1] if len(sys.argv) > 1 else default_task
# Construct and run the society # Construct and run the society
society = construct_society(task) society = construct_society(task)
answer, chat_history, token_count = run_society(society)
answer, chat_history, token_count = run_society(society) # Output the result
print(f"\033[94mAnswer: {answer}\033[0m")
print(f"\033[94mAnswer: {answer}\033[0m")
if __name__ == "__main__":
main()

View File

@@ -1,14 +1,15 @@
# ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. ========= # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
# Apache License 2.0(「ライセンス」)に基づいてライセンスされています。 # 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 # 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. ========= # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
# 正しいモジュールパスからインポート # 正しいモジュールパスからインポート
from utils import run_society from utils import run_society
@@ -333,13 +334,13 @@ def run_owl(question: str, example_module: str) -> Tuple[str, str, str]:
try: try:
# Ensure environment variables are loaded # Ensure environment variables are loaded
load_dotenv(find_dotenv(), override=True) load_dotenv(find_dotenv(), override=True)
logging.info( logging.info(f"質問を処理中: '{question}', モジュール使用: {example_module}")
f"質問を処理中: '{question}', モジュール使用: {example_module}"
)
# Check if the module is in MODULE_DESCRIPTIONS # Check if the module is in MODULE_DESCRIPTIONS
if example_module not in MODULE_DESCRIPTIONS: if example_module not in MODULE_DESCRIPTIONS:
logging.error(f"ユーザーがサポートされていないモジュールを選択しました: {example_module}") logging.error(
f"ユーザーがサポートされていないモジュールを選択しました: {example_module}"
)
return ( return (
f"選択されたモジュール '{example_module}' はサポートされていません", f"選択されたモジュール '{example_module}' はサポートされていません",
"0", "0",
@@ -385,7 +386,9 @@ def run_owl(question: str, example_module: str) -> Tuple[str, str, str]:
society = module.construct_society(question) society = module.construct_society(question)
except Exception as e: except Exception as e:
logging.error(f"社会シミュレーションの構築中にエラーが発生しました: {str(e)}") logging.error(
f"社会シミュレーションの構築中にエラーが発生しました: {str(e)}"
)
return ( return (
f"社会シミュレーションの構築中にエラーが発生しました: {str(e)}", f"社会シミュレーションの構築中にエラーが発生しました: {str(e)}",
"0", "0",
@@ -398,7 +401,9 @@ def run_owl(question: str, example_module: str) -> Tuple[str, str, str]:
answer, chat_history, token_info = run_society(society) answer, chat_history, token_info = run_society(society)
logging.info("社会シミュレーションが完了しました") logging.info("社会シミュレーションが完了しました")
except Exception as e: except Exception as e:
logging.error(f"社会シミュレーションの実行中にエラーが発生しました: {str(e)}") logging.error(
f"社会シミュレーションの実行中にエラーが発生しました: {str(e)}"
)
return ( return (
f"社会シミュレーションの実行中にエラーが発生しました: {str(e)}", f"社会シミュレーションの実行中にエラーが発生しました: {str(e)}",
"0", "0",
@@ -424,9 +429,7 @@ def run_owl(question: str, example_module: str) -> Tuple[str, str, str]:
) )
except Exception as e: except Exception as e:
logging.error( logging.error(f"質問の処理中に予期しないエラーが発生しました: {str(e)}")
f"質問の処理中に予期しないエラーが発生しました: {str(e)}"
)
return (f"エラーが発生しました: {str(e)}", "0", f"❌ エラー: {str(e)}") return (f"エラーが発生しました: {str(e)}", "0", f"❌ エラー: {str(e)}")
@@ -668,9 +671,7 @@ def save_env_table_changes(data):
str: 操作ステータス情報、HTML形式のステータスメッセージを含む str: 操作ステータス情報、HTML形式のステータスメッセージを含む
""" """
try: try:
logging.info( logging.info(f"環境変数テーブルデータの処理を開始します、タイプ: {type(data)}")
f"環境変数テーブルデータの処理を開始します、タイプ: {type(data)}"
)
# Get all current environment variables # Get all current environment variables
current_env_vars = load_env_vars() current_env_vars = load_env_vars()
@@ -696,9 +697,7 @@ def save_env_table_changes(data):
if ( if (
key and str(key).strip() key and str(key).strip()
): # If key name is not empty, add or update ): # If key name is not empty, add or update
logging.info( logging.info(f"環境変数の処理: {key} = {value}")
f"環境変数の処理: {key} = {value}"
)
add_env_var(key, str(value)) add_env_var(key, str(value))
processed_keys.add(key) processed_keys.add(key)
# Process other formats # Process other formats
@@ -751,7 +750,9 @@ def save_env_table_changes(data):
import traceback import traceback
error_details = traceback.format_exc() error_details = traceback.format_exc()
logging.error(f"環境変数の保存中にエラーが発生しました: {str(e)}\n{error_details}") logging.error(
f"環境変数の保存中にエラーが発生しました: {str(e)}\n{error_details}"
)
return f"❌ 保存に失敗しました: {str(e)}" return f"❌ 保存に失敗しました: {str(e)}"