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 camel.models import ModelFactory
from camel.toolkits import (
AudioAnalysisToolkit,
CodeExecutionToolkit,
ExcelToolkit,
ImageAnalysisToolkit,
SearchToolkit,
VideoAnalysisToolkit,
BrowserToolkit,
FileWriteToolkit,
)

View File

@ -16,18 +16,22 @@
# 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
from dotenv import load_dotenv
import sys
from dotenv import load_dotenv
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.societies import RolePlaying
from owl.utils import run_society
from camel.societies import RolePlaying
from camel.logger import set_log_level
import pathlib
base_dir = pathlib.Path(__file__).parent.parent
@ -38,61 +42,83 @@ set_log_level(level="DEBUG")
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"
assistant_role_name = "assistant"
Args:
question (str): The task or question to be addressed by the society.
user_model = ModelFactory.create(
model_platform=ModelPlatformType.QWEN,
model_type=ModelType.QWEN_MAX,
model_config_dict={"temperature": 0},
)
Returns:
RolePlaying: A configured society of agents ready to address the question.
"""
assistant_model = ModelFactory.create(
model_platform=ModelPlatformType.QWEN,
model_type=ModelType.QWEN_MAX,
model_config_dict={"temperature": 0},
)
# Create models for different components
models = {
"user": ModelFactory.create(
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(
model_platform=ModelPlatformType.QWEN,
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 = [
# Configure toolkits
tools = [
*BrowserToolkit(
headless=False,
web_agent_model=web_model,
planning_agent_model=planning_model,
headless=False, # Set to True for headless mode (e.g., on remote servers)
web_agent_model=models["browsing"],
planning_agent_model=models["planning"],
output_language="Chinese",
).get_tools(),
SearchToolkit().search_baidu,
*FileWriteToolkit(output_dir="./").get_tools(),
]
user_role_name = "user"
user_agent_kwargs = dict(model=user_model)
assistant_role_name = "assistant"
assistant_agent_kwargs = dict(model=assistant_model, tools=tools_list)
# 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_role_name,
user_role_name="user",
user_agent_kwargs=user_agent_kwargs,
assistant_role_name=assistant_role_name,
assistant_role_name="assistant",
assistant_agent_kwargs=assistant_agent_kwargs,
output_language="Chinese",
)
@ -100,15 +126,21 @@ def construct_society(question: str) -> RolePlaying:
return society
# Example case
default_task = "浏览亚马逊并找出一款对程序员有吸引力的产品。请提供产品名称和价格"
def main():
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
task = sys.argv[1] if len(sys.argv) > 1 else default_task
# 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)
# Construct and run the society
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. =========
# 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
#
# 適用される法律で要求されているか、書面で合意されていない限り、
# ライセンスに基づいて配布されるソフトウェアは「現状のまま」で、
# 明示的または黙示的ないかなる種類の保証や条件もなく配布されます。
# ライセンスに基づく特定の言語での権限と制限については、ライセンスを参照してください。
# 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. =========
# 正しいモジュールパスからインポート
from utils import run_society
@ -333,13 +334,13 @@ def run_owl(question: str, example_module: str) -> Tuple[str, str, str]:
try:
# Ensure environment variables are loaded
load_dotenv(find_dotenv(), override=True)
logging.info(
f"質問を処理中: '{question}', モジュール使用: {example_module}"
)
logging.info(f"質問を処理中: '{question}', モジュール使用: {example_module}")
# Check if the module is in MODULE_DESCRIPTIONS
if example_module not in MODULE_DESCRIPTIONS:
logging.error(f"ユーザーがサポートされていないモジュールを選択しました: {example_module}")
logging.error(
f"ユーザーがサポートされていないモジュールを選択しました: {example_module}"
)
return (
f"選択されたモジュール '{example_module}' はサポートされていません",
"0",
@ -385,7 +386,9 @@ def run_owl(question: str, example_module: str) -> Tuple[str, str, str]:
society = module.construct_society(question)
except Exception as e:
logging.error(f"社会シミュレーションの構築中にエラーが発生しました: {str(e)}")
logging.error(
f"社会シミュレーションの構築中にエラーが発生しました: {str(e)}"
)
return (
f"社会シミュレーションの構築中にエラーが発生しました: {str(e)}",
"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)
logging.info("社会シミュレーションが完了しました")
except Exception as e:
logging.error(f"社会シミュレーションの実行中にエラーが発生しました: {str(e)}")
logging.error(
f"社会シミュレーションの実行中にエラーが発生しました: {str(e)}"
)
return (
f"社会シミュレーションの実行中にエラーが発生しました: {str(e)}",
"0",
@ -424,9 +429,7 @@ def run_owl(question: str, example_module: str) -> Tuple[str, str, str]:
)
except Exception as e:
logging.error(
f"質問の処理中に予期しないエラーが発生しました: {str(e)}"
)
logging.error(f"質問の処理中に予期しないエラーが発生しました: {str(e)}")
return (f"エラーが発生しました: {str(e)}", "0", f"❌ エラー: {str(e)}")
@ -668,9 +671,7 @@ def save_env_table_changes(data):
str: 操作ステータス情報HTML形式のステータスメッセージを含む
"""
try:
logging.info(
f"環境変数テーブルデータの処理を開始します、タイプ: {type(data)}"
)
logging.info(f"環境変数テーブルデータの処理を開始します、タイプ: {type(data)}")
# Get all current environment variables
current_env_vars = load_env_vars()
@ -696,9 +697,7 @@ def save_env_table_changes(data):
if (
key and str(key).strip()
): # If key name is not empty, add or update
logging.info(
f"環境変数の処理: {key} = {value}"
)
logging.info(f"環境変数の処理: {key} = {value}")
add_env_var(key, str(value))
processed_keys.add(key)
# Process other formats
@ -751,7 +750,9 @@ def save_env_table_changes(data):
import traceback
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)}"