camel-ai 0.2.59__py3-none-any.whl → 0.2.82__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of camel-ai might be problematic. Click here for more details.
- camel/__init__.py +3 -3
- camel/agents/__init__.py +2 -2
- camel/agents/_types.py +9 -4
- camel/agents/_utils.py +40 -2
- camel/agents/base.py +2 -2
- camel/agents/chat_agent.py +5012 -902
- camel/agents/critic_agent.py +2 -2
- camel/agents/deductive_reasoner_agent.py +56 -56
- camel/agents/embodied_agent.py +2 -2
- camel/agents/knowledge_graph_agent.py +20 -20
- camel/agents/mcp_agent.py +39 -36
- camel/agents/multi_hop_generator_agent.py +3 -3
- camel/agents/programmed_agent_instruction.py +2 -2
- camel/agents/repo_agent.py +4 -3
- camel/agents/role_assignment_agent.py +2 -2
- camel/agents/search_agent.py +2 -2
- camel/agents/task_agent.py +2 -2
- camel/agents/tool_agents/__init__.py +2 -2
- camel/agents/tool_agents/base.py +2 -2
- camel/agents/tool_agents/hugging_face_tool_agent.py +3 -3
- camel/benchmarks/__init__.py +2 -2
- camel/benchmarks/apibank.py +5 -5
- camel/benchmarks/apibench.py +2 -2
- camel/benchmarks/base.py +2 -2
- camel/benchmarks/browsecomp.py +44 -33
- camel/benchmarks/gaia.py +17 -13
- camel/benchmarks/mock_website/README.md +94 -0
- camel/benchmarks/mock_website/mock_web.py +299 -0
- camel/benchmarks/mock_website/requirements.txt +3 -0
- camel/benchmarks/mock_website/shopping_mall/app.py +465 -0
- camel/benchmarks/mock_website/task.json +104 -0
- camel/benchmarks/nexus.py +3 -3
- camel/benchmarks/ragbench.py +2 -2
- camel/bots/__init__.py +2 -2
- camel/bots/discord/__init__.py +2 -2
- camel/bots/discord/discord_app.py +2 -2
- camel/bots/discord/discord_installation.py +2 -2
- camel/bots/discord/discord_store.py +3 -3
- camel/bots/slack/__init__.py +2 -2
- camel/bots/slack/models.py +4 -4
- camel/bots/slack/slack_app.py +2 -2
- camel/bots/telegram_bot.py +2 -2
- camel/configs/__init__.py +26 -2
- camel/configs/aihubmix_config.py +90 -0
- camel/configs/aiml_config.py +2 -2
- camel/configs/amd_config.py +70 -0
- camel/configs/anthropic_config.py +8 -7
- camel/configs/base_config.py +2 -2
- camel/configs/bedrock_config.py +5 -3
- camel/configs/cerebras_config.py +98 -0
- camel/configs/cohere_config.py +3 -3
- camel/configs/cometapi_config.py +106 -0
- camel/configs/crynux_config.py +94 -0
- camel/configs/deepseek_config.py +9 -8
- camel/configs/gemini_config.py +6 -4
- camel/configs/groq_config.py +6 -4
- camel/configs/internlm_config.py +6 -4
- camel/configs/litellm_config.py +2 -2
- camel/configs/lmstudio_config.py +6 -4
- camel/configs/minimax_config.py +95 -0
- camel/configs/mistral_config.py +3 -3
- camel/configs/modelscope_config.py +5 -3
- camel/configs/moonshot_config.py +2 -2
- camel/configs/nebius_config.py +105 -0
- camel/configs/netmind_config.py +2 -2
- camel/configs/novita_config.py +2 -2
- camel/configs/nvidia_config.py +2 -2
- camel/configs/ollama_config.py +2 -2
- camel/configs/openai_config.py +8 -3
- camel/configs/openrouter_config.py +6 -4
- camel/configs/ppio_config.py +2 -2
- camel/configs/qianfan_config.py +85 -0
- camel/configs/qwen_config.py +2 -2
- camel/configs/reka_config.py +3 -3
- camel/configs/samba_config.py +8 -6
- camel/configs/sglang_config.py +2 -2
- camel/configs/siliconflow_config.py +2 -2
- camel/configs/togetherai_config.py +2 -2
- camel/configs/vllm_config.py +4 -2
- camel/configs/watsonx_config.py +2 -2
- camel/configs/yi_config.py +6 -4
- camel/configs/zhipuai_config.py +6 -4
- camel/{data_collector → data_collectors}/__init__.py +2 -2
- camel/{data_collector → data_collectors}/alpaca_collector.py +19 -10
- camel/{data_collector → data_collectors}/base.py +2 -2
- camel/{data_collector → data_collectors}/sharegpt_collector.py +3 -3
- camel/datagen/__init__.py +2 -2
- camel/datagen/cot_datagen.py +32 -37
- camel/datagen/evol_instruct/__init__.py +2 -2
- camel/datagen/evol_instruct/evol_instruct.py +2 -2
- camel/datagen/evol_instruct/scorer.py +24 -25
- camel/datagen/evol_instruct/templates.py +48 -48
- camel/datagen/self_improving_cot.py +5 -5
- camel/datagen/self_instruct/__init__.py +2 -2
- camel/datagen/self_instruct/filter/__init__.py +2 -2
- camel/datagen/self_instruct/filter/filter_function.py +2 -2
- camel/datagen/self_instruct/filter/filter_registry.py +2 -2
- camel/datagen/self_instruct/filter/instruction_filter.py +2 -2
- camel/datagen/self_instruct/self_instruct.py +2 -2
- camel/datagen/self_instruct/templates.py +47 -47
- camel/datagen/source2synth/__init__.py +2 -2
- camel/datagen/source2synth/data_processor.py +2 -2
- camel/datagen/source2synth/models.py +2 -2
- camel/datagen/source2synth/user_data_processor_config.py +2 -2
- camel/datahubs/__init__.py +2 -2
- camel/datahubs/base.py +2 -2
- camel/datahubs/huggingface.py +2 -2
- camel/datahubs/models.py +2 -2
- camel/datasets/__init__.py +2 -2
- camel/datasets/base_generator.py +41 -12
- camel/datasets/few_shot_generator.py +18 -18
- camel/datasets/models.py +3 -3
- camel/datasets/self_instruct_generator.py +2 -2
- camel/datasets/static_dataset.py +152 -2
- camel/embeddings/__init__.py +2 -2
- camel/embeddings/azure_embedding.py +2 -2
- camel/embeddings/base.py +2 -2
- camel/embeddings/gemini_embedding.py +2 -2
- camel/embeddings/jina_embedding.py +10 -3
- camel/embeddings/mistral_embedding.py +2 -2
- camel/embeddings/openai_compatible_embedding.py +2 -2
- camel/embeddings/openai_embedding.py +2 -2
- camel/embeddings/sentence_transformers_embeddings.py +4 -4
- camel/embeddings/together_embedding.py +2 -2
- camel/embeddings/vlm_embedding.py +11 -4
- camel/environments/__init__.py +14 -2
- camel/environments/models.py +2 -2
- camel/environments/multi_step.py +2 -2
- camel/environments/rlcards_env.py +860 -0
- camel/environments/single_step.py +30 -5
- camel/environments/tic_tac_toe.py +3 -3
- camel/extractors/__init__.py +2 -2
- camel/extractors/base.py +2 -2
- camel/extractors/python_strategies.py +2 -2
- camel/generators.py +2 -2
- camel/human.py +2 -2
- camel/interpreters/__init__.py +4 -2
- camel/interpreters/base.py +16 -3
- camel/interpreters/docker/Dockerfile +53 -7
- camel/interpreters/docker_interpreter.py +70 -11
- camel/interpreters/e2b_interpreter.py +59 -11
- camel/interpreters/internal_python_interpreter.py +81 -4
- camel/interpreters/interpreter_error.py +2 -2
- camel/interpreters/ipython_interpreter.py +23 -5
- camel/interpreters/microsandbox_interpreter.py +395 -0
- camel/interpreters/subprocess_interpreter.py +36 -4
- camel/loaders/__init__.py +17 -5
- camel/loaders/apify_reader.py +2 -2
- camel/loaders/base_io.py +2 -2
- camel/loaders/base_loader.py +85 -0
- camel/loaders/chunkr_reader.py +128 -93
- camel/loaders/crawl4ai_reader.py +2 -2
- camel/loaders/firecrawl_reader.py +6 -6
- camel/loaders/jina_url_reader.py +2 -2
- camel/loaders/markitdown.py +2 -2
- camel/loaders/mineru_extractor.py +2 -2
- camel/loaders/mistral_reader.py +148 -0
- camel/loaders/scrapegraph_reader.py +2 -2
- camel/loaders/unstructured_io.py +2 -2
- camel/logger.py +5 -5
- camel/memories/__init__.py +2 -2
- camel/memories/agent_memories.py +86 -3
- camel/memories/base.py +36 -2
- camel/memories/blocks/__init__.py +2 -2
- camel/memories/blocks/chat_history_block.py +126 -9
- camel/memories/blocks/vectordb_block.py +10 -3
- camel/memories/context_creators/__init__.py +2 -2
- camel/memories/context_creators/score_based.py +31 -239
- camel/memories/records.py +98 -13
- camel/messages/__init__.py +2 -2
- camel/messages/base.py +193 -46
- camel/messages/conversion/__init__.py +2 -2
- camel/messages/conversion/alpaca.py +2 -2
- camel/messages/conversion/conversation_models.py +2 -2
- camel/messages/conversion/sharegpt/__init__.py +2 -2
- camel/messages/conversion/sharegpt/function_call_formatter.py +2 -2
- camel/messages/conversion/sharegpt/hermes/__init__.py +2 -2
- camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +2 -2
- camel/messages/func_message.py +54 -17
- camel/models/__init__.py +18 -2
- camel/models/_utils.py +3 -3
- camel/models/aihubmix_model.py +83 -0
- camel/models/aiml_model.py +11 -18
- camel/models/amd_model.py +101 -0
- camel/models/anthropic_model.py +127 -20
- camel/models/aws_bedrock_model.py +12 -35
- camel/models/azure_openai_model.py +263 -63
- camel/models/base_audio_model.py +5 -3
- camel/models/base_model.py +195 -26
- camel/models/cerebras_model.py +83 -0
- camel/models/cohere_model.py +81 -21
- camel/models/cometapi_model.py +83 -0
- camel/models/crynux_model.py +87 -0
- camel/models/deepseek_model.py +61 -59
- camel/models/fish_audio_model.py +8 -2
- camel/models/gemini_model.py +439 -30
- camel/models/groq_model.py +11 -19
- camel/models/internlm_model.py +11 -18
- camel/models/litellm_model.py +94 -34
- camel/models/lmstudio_model.py +17 -20
- camel/models/minimax_model.py +83 -0
- camel/models/mistral_model.py +84 -19
- camel/models/model_factory.py +49 -6
- camel/models/model_manager.py +33 -11
- camel/models/modelscope_model.py +13 -193
- camel/models/moonshot_model.py +195 -21
- camel/models/nebius_model.py +83 -0
- camel/models/nemotron_model.py +19 -9
- camel/models/netmind_model.py +11 -18
- camel/models/novita_model.py +11 -18
- camel/models/nvidia_model.py +11 -18
- camel/models/ollama_model.py +14 -21
- camel/models/openai_audio_models.py +2 -2
- camel/models/openai_compatible_model.py +234 -27
- camel/models/openai_model.py +255 -39
- camel/models/openrouter_model.py +11 -19
- camel/models/ppio_model.py +11 -18
- camel/models/qianfan_model.py +89 -0
- camel/models/qwen_model.py +13 -193
- camel/models/reka_model.py +90 -21
- camel/models/reward/__init__.py +2 -2
- camel/models/reward/base_reward_model.py +2 -2
- camel/models/reward/evaluator.py +2 -2
- camel/models/reward/nemotron_model.py +2 -2
- camel/models/reward/skywork_model.py +2 -2
- camel/models/samba_model.py +117 -49
- camel/models/sglang_model.py +162 -42
- camel/models/siliconflow_model.py +12 -35
- camel/models/stub_model.py +10 -7
- camel/models/togetherai_model.py +11 -18
- camel/models/vllm_model.py +10 -18
- camel/models/volcano_model.py +16 -20
- camel/models/watsonx_model.py +69 -19
- camel/models/yi_model.py +11 -18
- camel/models/zhipuai_model.py +70 -18
- camel/parsers/__init__.py +18 -0
- camel/parsers/mcp_tool_call_parser.py +176 -0
- camel/personas/__init__.py +2 -2
- camel/personas/persona.py +2 -2
- camel/personas/persona_hub.py +2 -2
- camel/prompts/__init__.py +2 -2
- camel/prompts/ai_society.py +2 -2
- camel/prompts/base.py +2 -2
- camel/prompts/code.py +2 -2
- camel/prompts/evaluation.py +2 -2
- camel/prompts/generate_text_embedding_data.py +2 -2
- camel/prompts/image_craft.py +2 -2
- camel/prompts/misalignment.py +2 -2
- camel/prompts/multi_condition_image_craft.py +2 -2
- camel/prompts/object_recognition.py +2 -2
- camel/prompts/persona_hub.py +3 -3
- camel/prompts/prompt_templates.py +2 -2
- camel/prompts/role_description_prompt_template.py +2 -2
- camel/prompts/solution_extraction.py +8 -8
- camel/prompts/task_prompt_template.py +2 -2
- camel/prompts/translation.py +2 -2
- camel/prompts/video_description_prompt.py +3 -3
- camel/responses/__init__.py +2 -2
- camel/responses/agent_responses.py +2 -2
- camel/retrievers/__init__.py +2 -2
- camel/retrievers/auto_retriever.py +23 -3
- camel/retrievers/base.py +2 -2
- camel/retrievers/bm25_retriever.py +3 -4
- camel/retrievers/cohere_rerank_retriever.py +2 -2
- camel/retrievers/hybrid_retrival.py +4 -4
- camel/retrievers/vector_retriever.py +2 -2
- camel/runtimes/Dockerfile.multi-toolkit +90 -0
- camel/{runtime → runtimes}/__init__.py +2 -2
- camel/runtimes/api.py +153 -0
- camel/{runtime → runtimes}/base.py +2 -2
- camel/{runtime → runtimes}/configs.py +13 -13
- camel/{runtime → runtimes}/daytona_runtime.py +18 -19
- camel/{runtime → runtimes}/docker_runtime.py +13 -13
- camel/{runtime → runtimes}/llm_guard_runtime.py +28 -28
- camel/{runtime → runtimes}/remote_http_runtime.py +12 -12
- camel/{runtime → runtimes}/ubuntu_docker_runtime.py +3 -3
- camel/{runtime → runtimes}/utils/__init__.py +2 -2
- camel/{runtime → runtimes}/utils/function_risk_toolkit.py +2 -2
- camel/{runtime → runtimes}/utils/ignore_risk_toolkit.py +2 -2
- camel/schemas/__init__.py +2 -2
- camel/schemas/base.py +2 -2
- camel/schemas/openai_converter.py +3 -3
- camel/schemas/outlines_converter.py +2 -2
- camel/services/agent_openapi_server.py +380 -0
- camel/societies/__init__.py +4 -2
- camel/societies/babyagi_playing.py +2 -2
- camel/societies/role_playing.py +201 -80
- camel/societies/workforce/__init__.py +10 -3
- camel/societies/workforce/base.py +9 -5
- camel/societies/workforce/events.py +143 -0
- camel/societies/workforce/prompts.py +258 -33
- camel/societies/workforce/role_playing_worker.py +95 -30
- camel/societies/workforce/single_agent_worker.py +659 -30
- camel/societies/workforce/structured_output_handler.py +512 -0
- camel/societies/workforce/task_channel.py +182 -38
- camel/societies/workforce/utils.py +784 -18
- camel/societies/workforce/worker.py +96 -28
- camel/societies/workforce/workflow_memory_manager.py +1746 -0
- camel/societies/workforce/workforce.py +5730 -366
- camel/societies/workforce/workforce_callback.py +103 -0
- camel/societies/workforce/workforce_logger.py +647 -0
- camel/societies/workforce/workforce_metrics.py +33 -0
- camel/storages/__init__.py +10 -2
- camel/storages/graph_storages/__init__.py +2 -2
- camel/storages/graph_storages/base.py +2 -2
- camel/storages/graph_storages/graph_element.py +2 -2
- camel/storages/graph_storages/nebula_graph.py +4 -4
- camel/storages/graph_storages/neo4j_graph.py +7 -7
- camel/storages/key_value_storages/__init__.py +2 -2
- camel/storages/key_value_storages/base.py +2 -2
- camel/storages/key_value_storages/in_memory.py +2 -2
- camel/storages/key_value_storages/json.py +17 -4
- camel/storages/key_value_storages/mem0_cloud.py +50 -49
- camel/storages/key_value_storages/redis.py +2 -2
- camel/storages/object_storages/__init__.py +2 -2
- camel/storages/object_storages/amazon_s3.py +2 -2
- camel/storages/object_storages/azure_blob.py +2 -2
- camel/storages/object_storages/base.py +2 -2
- camel/storages/object_storages/google_cloud.py +3 -3
- camel/storages/vectordb_storages/__init__.py +12 -2
- camel/storages/vectordb_storages/base.py +2 -2
- camel/storages/vectordb_storages/chroma.py +731 -0
- camel/storages/vectordb_storages/faiss.py +712 -0
- camel/storages/vectordb_storages/milvus.py +2 -2
- camel/storages/vectordb_storages/oceanbase.py +16 -17
- camel/storages/vectordb_storages/pgvector.py +349 -0
- camel/storages/vectordb_storages/qdrant.py +6 -6
- camel/storages/vectordb_storages/surreal.py +372 -0
- camel/storages/vectordb_storages/tidb.py +11 -8
- camel/storages/vectordb_storages/weaviate.py +714 -0
- camel/tasks/__init__.py +2 -2
- camel/tasks/task.py +366 -27
- camel/tasks/task_prompt.py +3 -3
- camel/terminators/__init__.py +2 -2
- camel/terminators/base.py +2 -2
- camel/terminators/response_terminator.py +2 -2
- camel/terminators/token_limit_terminator.py +2 -2
- camel/toolkits/__init__.py +58 -10
- camel/toolkits/aci_toolkit.py +66 -21
- camel/toolkits/arxiv_toolkit.py +8 -8
- camel/toolkits/ask_news_toolkit.py +2 -2
- camel/toolkits/async_browser_toolkit.py +174 -575
- camel/toolkits/audio_analysis_toolkit.py +3 -3
- camel/toolkits/base.py +65 -7
- camel/toolkits/bohrium_toolkit.py +318 -0
- camel/toolkits/browser_toolkit.py +306 -566
- camel/toolkits/browser_toolkit_commons.py +568 -0
- camel/toolkits/code_execution.py +67 -11
- camel/toolkits/context_summarizer_toolkit.py +684 -0
- camel/toolkits/craw4ai_toolkit.py +93 -0
- camel/toolkits/dappier_toolkit.py +12 -8
- camel/toolkits/data_commons_toolkit.py +2 -2
- camel/toolkits/dingtalk.py +1135 -0
- camel/toolkits/earth_science_toolkit.py +5367 -0
- camel/toolkits/edgeone_pages_mcp_toolkit.py +49 -0
- camel/toolkits/excel_toolkit.py +910 -70
- camel/toolkits/file_toolkit.py +1402 -0
- camel/toolkits/function_tool.py +128 -20
- camel/toolkits/github_toolkit.py +148 -43
- camel/toolkits/gmail_toolkit.py +1839 -0
- camel/toolkits/google_calendar_toolkit.py +40 -6
- camel/toolkits/google_drive_mcp_toolkit.py +54 -0
- camel/toolkits/google_maps_toolkit.py +2 -2
- camel/toolkits/google_scholar_toolkit.py +2 -2
- camel/toolkits/human_toolkit.py +36 -12
- camel/toolkits/hybrid_browser_toolkit/__init__.py +18 -0
- camel/toolkits/hybrid_browser_toolkit/config_loader.py +185 -0
- camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py +246 -0
- camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit_ts.py +1973 -0
- camel/toolkits/hybrid_browser_toolkit/installer.py +203 -0
- camel/toolkits/hybrid_browser_toolkit/ts/package-lock.json +4589 -0
- camel/toolkits/hybrid_browser_toolkit/ts/package.json +33 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/browser-scripts.js +125 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/browser-session.ts +1929 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/config-loader.ts +233 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/hybrid-browser-toolkit.ts +589 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/index.ts +7 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/parent-child-filter.ts +226 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/snapshot-parser.ts +219 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/som-screenshot-injected.ts +543 -0
- camel/toolkits/hybrid_browser_toolkit/ts/src/types.ts +129 -0
- camel/toolkits/hybrid_browser_toolkit/ts/tsconfig.json +27 -0
- camel/toolkits/hybrid_browser_toolkit/ts/websocket-server.js +319 -0
- camel/toolkits/hybrid_browser_toolkit/ws_wrapper.py +1037 -0
- camel/toolkits/hybrid_browser_toolkit_py/__init__.py +17 -0
- camel/toolkits/hybrid_browser_toolkit_py/actions.py +575 -0
- camel/toolkits/hybrid_browser_toolkit_py/agent.py +311 -0
- camel/toolkits/hybrid_browser_toolkit_py/browser_session.py +787 -0
- camel/toolkits/hybrid_browser_toolkit_py/config_loader.py +490 -0
- camel/toolkits/hybrid_browser_toolkit_py/hybrid_browser_toolkit.py +2390 -0
- camel/toolkits/hybrid_browser_toolkit_py/snapshot.py +233 -0
- camel/toolkits/hybrid_browser_toolkit_py/stealth_script.js +0 -0
- camel/toolkits/hybrid_browser_toolkit_py/unified_analyzer.js +1043 -0
- camel/toolkits/image_analysis_toolkit.py +3 -3
- camel/toolkits/image_generation_toolkit.py +390 -0
- camel/toolkits/jina_reranker_toolkit.py +195 -79
- camel/toolkits/klavis_toolkit.py +7 -3
- camel/toolkits/linkedin_toolkit.py +2 -2
- camel/toolkits/markitdown_toolkit.py +104 -0
- camel/toolkits/math_toolkit.py +66 -12
- camel/toolkits/mcp_toolkit.py +841 -600
- camel/toolkits/memory_toolkit.py +7 -3
- camel/toolkits/meshy_toolkit.py +2 -2
- camel/toolkits/message_agent_toolkit.py +608 -0
- camel/toolkits/message_integration.py +724 -0
- camel/toolkits/mineru_toolkit.py +2 -2
- camel/toolkits/minimax_mcp_toolkit.py +195 -0
- camel/toolkits/networkx_toolkit.py +2 -2
- camel/toolkits/note_taking_toolkit.py +277 -0
- camel/toolkits/notion_mcp_toolkit.py +224 -0
- camel/toolkits/notion_toolkit.py +2 -2
- camel/toolkits/open_api_specs/biztoc/__init__.py +2 -2
- camel/toolkits/open_api_specs/biztoc/ai-plugin.json +1 -1
- camel/toolkits/open_api_specs/coursera/__init__.py +2 -2
- camel/toolkits/open_api_specs/create_qr_code/__init__.py +2 -2
- camel/toolkits/open_api_specs/klarna/__init__.py +2 -2
- camel/toolkits/open_api_specs/nasa_apod/__init__.py +2 -2
- camel/toolkits/open_api_specs/outschool/__init__.py +2 -2
- camel/toolkits/open_api_specs/outschool/ai-plugin.json +1 -1
- camel/toolkits/open_api_specs/outschool/openapi.yaml +1 -1
- camel/toolkits/open_api_specs/outschool/paths/__init__.py +2 -2
- camel/toolkits/open_api_specs/outschool/paths/get_classes.py +2 -2
- camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +2 -2
- camel/toolkits/open_api_specs/security_config.py +2 -2
- camel/toolkits/open_api_specs/speak/__init__.py +2 -2
- camel/toolkits/open_api_specs/web_scraper/__init__.py +2 -2
- camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +1 -1
- camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +2 -2
- camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +2 -2
- camel/toolkits/open_api_toolkit.py +2 -2
- camel/toolkits/openbb_toolkit.py +7 -3
- camel/toolkits/origene_mcp_toolkit.py +56 -0
- camel/toolkits/page_script.js +86 -74
- camel/toolkits/playwright_mcp_toolkit.py +27 -32
- camel/toolkits/pptx_toolkit.py +790 -0
- camel/toolkits/pubmed_toolkit.py +2 -2
- camel/toolkits/pulse_mcp_search_toolkit.py +2 -2
- camel/toolkits/pyautogui_toolkit.py +2 -2
- camel/toolkits/reddit_toolkit.py +2 -2
- camel/toolkits/resend_toolkit.py +168 -0
- camel/toolkits/retrieval_toolkit.py +2 -2
- camel/toolkits/screenshot_toolkit.py +213 -0
- camel/toolkits/search_toolkit.py +539 -146
- camel/toolkits/searxng_toolkit.py +2 -2
- camel/toolkits/semantic_scholar_toolkit.py +2 -2
- camel/toolkits/slack_toolkit.py +108 -58
- camel/toolkits/sql_toolkit.py +712 -0
- camel/toolkits/stripe_toolkit.py +2 -2
- camel/toolkits/sympy_toolkit.py +3 -3
- camel/toolkits/task_planning_toolkit.py +134 -0
- camel/toolkits/terminal_toolkit/__init__.py +18 -0
- camel/toolkits/terminal_toolkit/terminal_toolkit.py +1070 -0
- camel/toolkits/terminal_toolkit/utils.py +532 -0
- camel/toolkits/thinking_toolkit.py +3 -3
- camel/toolkits/twitter_toolkit.py +8 -3
- camel/toolkits/vertex_ai_veo_toolkit.py +590 -0
- camel/toolkits/video_analysis_toolkit.py +112 -29
- camel/toolkits/video_download_toolkit.py +22 -16
- camel/toolkits/weather_toolkit.py +2 -2
- camel/toolkits/web_deploy_toolkit.py +1219 -0
- camel/toolkits/wechat_official_toolkit.py +483 -0
- camel/toolkits/whatsapp_toolkit.py +2 -2
- camel/toolkits/wolfram_alpha_toolkit.py +53 -25
- camel/toolkits/zapier_toolkit.py +7 -3
- camel/types/__init__.py +4 -4
- camel/types/agents/__init__.py +2 -2
- camel/types/agents/tool_calling_record.py +6 -3
- camel/types/enums.py +454 -35
- camel/types/mcp_registries.py +2 -2
- camel/types/openai_types.py +4 -4
- camel/types/unified_model_type.py +43 -6
- camel/utils/__init__.py +20 -2
- camel/utils/async_func.py +2 -2
- camel/utils/chunker/__init__.py +2 -2
- camel/utils/chunker/base.py +2 -2
- camel/utils/chunker/code_chunker.py +2 -2
- camel/utils/chunker/uio_chunker.py +2 -2
- camel/utils/commons.py +65 -7
- camel/utils/constants.py +5 -2
- camel/utils/context_utils.py +1134 -0
- camel/utils/deduplication.py +2 -2
- camel/utils/filename.py +2 -2
- camel/utils/langfuse.py +258 -0
- camel/utils/mcp.py +140 -6
- camel/utils/mcp_client.py +1056 -0
- camel/utils/message_summarizer.py +148 -0
- camel/utils/response_format.py +2 -2
- camel/utils/token_counting.py +45 -22
- camel/utils/tool_result.py +44 -0
- camel/verifiers/__init__.py +2 -2
- camel/verifiers/base.py +2 -2
- camel/verifiers/math_verifier.py +2 -2
- camel/verifiers/models.py +2 -2
- camel/verifiers/physics_verifier.py +2 -2
- camel/verifiers/python_verifier.py +2 -2
- {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/METADATA +349 -108
- camel_ai-0.2.82.dist-info/RECORD +507 -0
- {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/WHEEL +1 -1
- {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/licenses/LICENSE +1 -1
- camel/loaders/pandas_reader.py +0 -368
- camel/runtime/api.py +0 -97
- camel/toolkits/dalle_toolkit.py +0 -171
- camel/toolkits/file_write_toolkit.py +0 -395
- camel/toolkits/openai_agent_toolkit.py +0 -135
- camel/toolkits/terminal_toolkit.py +0 -1037
- camel_ai-0.2.59.dist-info/RECORD +0 -410
camel/societies/role_playing.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
3
|
# you may not use this file except in compliance with the License.
|
|
4
4
|
# You may obtain a copy of the License at
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
|
-
# ========= Copyright 2023-
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
import logging
|
|
15
15
|
import threading
|
|
16
16
|
from typing import Dict, List, Optional, Sequence, Tuple, Union
|
|
@@ -62,8 +62,8 @@ class RolePlaying:
|
|
|
62
62
|
(default: :obj:`TaskType.AI_SOCIETY`)
|
|
63
63
|
assistant_agent_kwargs (Dict, optional): Additional arguments to pass
|
|
64
64
|
to the assistant agent. (default: :obj:`None`)
|
|
65
|
-
user_agent_kwargs (Dict, optional): Additional arguments to pass to
|
|
66
|
-
|
|
65
|
+
user_agent_kwargs (Dict, optional): Additional arguments to pass to the
|
|
66
|
+
user agent. (default: :obj:`None`)
|
|
67
67
|
task_specify_agent_kwargs (Dict, optional): Additional arguments to
|
|
68
68
|
pass to the task specify agent. (default: :obj:`None`)
|
|
69
69
|
task_planner_agent_kwargs (Dict, optional): Additional arguments to
|
|
@@ -81,6 +81,12 @@ class RolePlaying:
|
|
|
81
81
|
stop_event (Optional[threading.Event], optional): Event to signal
|
|
82
82
|
termination of the agent's operation. When set, the agent will
|
|
83
83
|
terminate its execution. (default: :obj:`None`)
|
|
84
|
+
assistant_agent (ChatAgent, optional): A pre-configured ChatAgent to
|
|
85
|
+
use as the assistant. If provided, this will override the creation
|
|
86
|
+
of a new assistant agent. (default: :obj:`None`)
|
|
87
|
+
user_agent (ChatAgent, optional): A pre-configured ChatAgent to use as
|
|
88
|
+
the user. If provided, this will override the creation of a new
|
|
89
|
+
user agent. (default: :obj:`None`)
|
|
84
90
|
"""
|
|
85
91
|
|
|
86
92
|
def __init__(
|
|
@@ -106,6 +112,8 @@ class RolePlaying:
|
|
|
106
112
|
extend_task_specify_meta_dict: Optional[Dict] = None,
|
|
107
113
|
output_language: Optional[str] = None,
|
|
108
114
|
stop_event: Optional[threading.Event] = None,
|
|
115
|
+
assistant_agent: Optional[ChatAgent] = None,
|
|
116
|
+
user_agent: Optional[ChatAgent] = None,
|
|
109
117
|
) -> None:
|
|
110
118
|
if model is not None:
|
|
111
119
|
logger.warning(
|
|
@@ -143,21 +151,45 @@ class RolePlaying:
|
|
|
143
151
|
**(sys_msg_generator_kwargs or {}),
|
|
144
152
|
)
|
|
145
153
|
|
|
146
|
-
|
|
147
|
-
init_assistant_sys_msg,
|
|
148
|
-
init_user_sys_msg,
|
|
149
|
-
sys_msg_meta_dicts,
|
|
150
|
-
) = self._get_sys_message_info(
|
|
151
|
-
assistant_role_name,
|
|
152
|
-
user_role_name,
|
|
153
|
-
sys_msg_generator,
|
|
154
|
-
extend_sys_msg_meta_dicts=extend_sys_msg_meta_dicts,
|
|
155
|
-
)
|
|
156
|
-
|
|
154
|
+
# Initialize agent attributes first
|
|
157
155
|
self.assistant_agent: ChatAgent
|
|
158
156
|
self.user_agent: ChatAgent
|
|
159
|
-
self.assistant_sys_msg: Optional[BaseMessage]
|
|
160
|
-
self.user_sys_msg: Optional[BaseMessage]
|
|
157
|
+
self.assistant_sys_msg: Optional[BaseMessage] = None
|
|
158
|
+
self.user_sys_msg: Optional[BaseMessage] = None
|
|
159
|
+
|
|
160
|
+
# Determine if we need to generate system messages
|
|
161
|
+
if assistant_agent is None or user_agent is None:
|
|
162
|
+
# Generate system messages for missing agents
|
|
163
|
+
(
|
|
164
|
+
init_assistant_sys_msg,
|
|
165
|
+
init_user_sys_msg,
|
|
166
|
+
sys_msg_meta_dicts,
|
|
167
|
+
) = self._get_sys_message_info(
|
|
168
|
+
assistant_role_name,
|
|
169
|
+
user_role_name,
|
|
170
|
+
sys_msg_generator,
|
|
171
|
+
extend_sys_msg_meta_dicts=extend_sys_msg_meta_dicts,
|
|
172
|
+
)
|
|
173
|
+
else:
|
|
174
|
+
# When both agents are provided, use their existing system messages
|
|
175
|
+
assistant_sys_msg = assistant_agent.system_message
|
|
176
|
+
user_sys_msg = user_agent.system_message
|
|
177
|
+
|
|
178
|
+
# Ensure system messages are not None
|
|
179
|
+
if assistant_sys_msg is None:
|
|
180
|
+
raise ValueError(
|
|
181
|
+
"Provided assistant_agent has None system_message"
|
|
182
|
+
)
|
|
183
|
+
if user_sys_msg is None:
|
|
184
|
+
raise ValueError("Provided user_agent has None system_message")
|
|
185
|
+
|
|
186
|
+
init_assistant_sys_msg = assistant_sys_msg
|
|
187
|
+
init_user_sys_msg = user_sys_msg
|
|
188
|
+
# Create a default sys_msg_meta_dicts for critic initialization
|
|
189
|
+
sys_msg_meta_dicts = [
|
|
190
|
+
dict(task=self.task_prompt) for _ in range(2)
|
|
191
|
+
]
|
|
192
|
+
|
|
161
193
|
self._init_agents(
|
|
162
194
|
init_assistant_sys_msg,
|
|
163
195
|
init_user_sys_msg,
|
|
@@ -165,7 +197,10 @@ class RolePlaying:
|
|
|
165
197
|
user_agent_kwargs=user_agent_kwargs,
|
|
166
198
|
output_language=output_language,
|
|
167
199
|
stop_event=stop_event,
|
|
200
|
+
assistant_agent=assistant_agent,
|
|
201
|
+
user_agent=user_agent,
|
|
168
202
|
)
|
|
203
|
+
|
|
169
204
|
self.critic: Optional[Union[CriticAgent, Human]] = None
|
|
170
205
|
self.critic_sys_msg: Optional[BaseMessage] = None
|
|
171
206
|
self._init_critic(
|
|
@@ -320,20 +355,22 @@ class RolePlaying:
|
|
|
320
355
|
|
|
321
356
|
def _init_agents(
|
|
322
357
|
self,
|
|
323
|
-
init_assistant_sys_msg: BaseMessage,
|
|
324
|
-
init_user_sys_msg: BaseMessage,
|
|
358
|
+
init_assistant_sys_msg: Optional[BaseMessage],
|
|
359
|
+
init_user_sys_msg: Optional[BaseMessage],
|
|
325
360
|
assistant_agent_kwargs: Optional[Dict] = None,
|
|
326
361
|
user_agent_kwargs: Optional[Dict] = None,
|
|
327
362
|
output_language: Optional[str] = None,
|
|
328
363
|
stop_event: Optional[threading.Event] = None,
|
|
364
|
+
assistant_agent: Optional[ChatAgent] = None,
|
|
365
|
+
user_agent: Optional[ChatAgent] = None,
|
|
329
366
|
) -> None:
|
|
330
367
|
r"""Initialize assistant and user agents with their system messages.
|
|
331
368
|
|
|
332
369
|
Args:
|
|
333
|
-
init_assistant_sys_msg (BaseMessage): Assistant agent's
|
|
370
|
+
init_assistant_sys_msg (Optional[BaseMessage]): Assistant agent's
|
|
371
|
+
initial system message.
|
|
372
|
+
init_user_sys_msg (Optional[BaseMessage]): User agent's initial
|
|
334
373
|
system message.
|
|
335
|
-
init_user_sys_msg (BaseMessage): User agent's initial system
|
|
336
|
-
message.
|
|
337
374
|
assistant_agent_kwargs (Dict, optional): Additional arguments to
|
|
338
375
|
pass to the assistant agent. (default: :obj:`None`)
|
|
339
376
|
user_agent_kwargs (Dict, optional): Additional arguments to
|
|
@@ -343,6 +380,12 @@ class RolePlaying:
|
|
|
343
380
|
stop_event (Optional[threading.Event], optional): Event to signal
|
|
344
381
|
termination of the agent's operation. When set, the agent will
|
|
345
382
|
terminate its execution. (default: :obj:`None`)
|
|
383
|
+
assistant_agent (ChatAgent, optional): A pre-configured ChatAgent
|
|
384
|
+
to use as the assistant. If provided, this will override the
|
|
385
|
+
creation of a new assistant agent. (default: :obj:`None`)
|
|
386
|
+
user_agent (ChatAgent, optional): A pre-configured ChatAgent to use
|
|
387
|
+
as the user. If provided, this will override the creation of a
|
|
388
|
+
new user agent. (default: :obj:`None`)
|
|
346
389
|
"""
|
|
347
390
|
if self.model is not None:
|
|
348
391
|
if assistant_agent_kwargs is None:
|
|
@@ -354,21 +397,71 @@ class RolePlaying:
|
|
|
354
397
|
elif 'model' not in user_agent_kwargs:
|
|
355
398
|
user_agent_kwargs.update(dict(model=self.model))
|
|
356
399
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
400
|
+
# Use provided assistant agent if available, otherwise create a new one
|
|
401
|
+
if assistant_agent is not None:
|
|
402
|
+
# Ensure functionality consistent with our configuration
|
|
403
|
+
if (
|
|
404
|
+
hasattr(assistant_agent, 'output_language')
|
|
405
|
+
and output_language is not None
|
|
406
|
+
):
|
|
407
|
+
assistant_agent.output_language = output_language
|
|
408
|
+
if hasattr(assistant_agent, 'stop_event'):
|
|
409
|
+
assistant_agent.stop_event = stop_event
|
|
410
|
+
self.assistant_agent = assistant_agent
|
|
411
|
+
# Handle potential None system_message - use provided or fallback
|
|
412
|
+
if assistant_agent.system_message is not None:
|
|
413
|
+
self.assistant_sys_msg = assistant_agent.system_message
|
|
414
|
+
elif init_assistant_sys_msg is not None:
|
|
415
|
+
self.assistant_sys_msg = init_assistant_sys_msg
|
|
416
|
+
else:
|
|
417
|
+
raise ValueError("Assistant system message cannot be None")
|
|
418
|
+
else:
|
|
419
|
+
# Create new assistant agent
|
|
420
|
+
if init_assistant_sys_msg is None:
|
|
421
|
+
raise ValueError(
|
|
422
|
+
"Assistant system message cannot be None when creating "
|
|
423
|
+
"new agent"
|
|
424
|
+
)
|
|
425
|
+
self.assistant_agent = ChatAgent(
|
|
426
|
+
init_assistant_sys_msg,
|
|
427
|
+
output_language=output_language,
|
|
428
|
+
stop_event=stop_event,
|
|
429
|
+
**(assistant_agent_kwargs or {}),
|
|
430
|
+
)
|
|
431
|
+
self.assistant_sys_msg = self.assistant_agent.system_message
|
|
432
|
+
|
|
433
|
+
# Use provided user agent if available, otherwise create a new one
|
|
434
|
+
if user_agent is not None:
|
|
435
|
+
# Ensure functionality consistent with our configuration
|
|
436
|
+
if (
|
|
437
|
+
hasattr(user_agent, 'output_language')
|
|
438
|
+
and output_language is not None
|
|
439
|
+
):
|
|
440
|
+
user_agent.output_language = output_language
|
|
441
|
+
if hasattr(user_agent, 'stop_event'):
|
|
442
|
+
user_agent.stop_event = stop_event
|
|
443
|
+
self.user_agent = user_agent
|
|
444
|
+
# Handle potential None system_message - use provided or fallback
|
|
445
|
+
if user_agent.system_message is not None:
|
|
446
|
+
self.user_sys_msg = user_agent.system_message
|
|
447
|
+
elif init_user_sys_msg is not None:
|
|
448
|
+
self.user_sys_msg = init_user_sys_msg
|
|
449
|
+
else:
|
|
450
|
+
raise ValueError("User system message cannot be None")
|
|
451
|
+
else:
|
|
452
|
+
# Create new user agent
|
|
453
|
+
if init_user_sys_msg is None:
|
|
454
|
+
raise ValueError(
|
|
455
|
+
"User system message cannot be None when creating new "
|
|
456
|
+
"agent"
|
|
457
|
+
)
|
|
458
|
+
self.user_agent = ChatAgent(
|
|
459
|
+
init_user_sys_msg,
|
|
460
|
+
output_language=output_language,
|
|
461
|
+
stop_event=stop_event,
|
|
462
|
+
**(user_agent_kwargs or {}),
|
|
463
|
+
)
|
|
464
|
+
self.user_sys_msg = self.user_agent.system_message
|
|
372
465
|
|
|
373
466
|
def _init_critic(
|
|
374
467
|
self,
|
|
@@ -389,7 +482,7 @@ class RolePlaying:
|
|
|
389
482
|
sys_msg_meta_dicts (list): A list of system message meta dicts.
|
|
390
483
|
critic_role_name (str): The name of the role played by the critic.
|
|
391
484
|
critic_criteria (str, optional): Critic criteria for the
|
|
392
|
-
critic agent. If not specified, set
|
|
485
|
+
critic agent. If not specified, set it to
|
|
393
486
|
improve task performance. (default: :obj:`None`)
|
|
394
487
|
critic_kwargs (Dict, optional): Additional arguments to
|
|
395
488
|
pass to the critic. (default: :obj:`None`)
|
|
@@ -465,20 +558,28 @@ class RolePlaying:
|
|
|
465
558
|
BaseMessage: A single `BaseMessage` representing the initial
|
|
466
559
|
message.
|
|
467
560
|
"""
|
|
468
|
-
self.assistant_agent
|
|
469
|
-
|
|
561
|
+
if self.assistant_agent is not None:
|
|
562
|
+
self.assistant_agent.reset()
|
|
563
|
+
if self.user_agent is not None:
|
|
564
|
+
self.user_agent.reset()
|
|
470
565
|
default_init_msg_content = (
|
|
471
566
|
"Now start to give me instructions one by one. "
|
|
472
567
|
"Only reply with Instruction and Input."
|
|
473
568
|
)
|
|
474
|
-
|
|
475
|
-
init_msg_content = default_init_msg_content
|
|
569
|
+
final_init_msg_content = init_msg_content or default_init_msg_content
|
|
476
570
|
|
|
477
571
|
# Initialize a message sent by the assistant
|
|
572
|
+
assistant_role_name = "assistant"
|
|
573
|
+
if self.assistant_sys_msg is not None and hasattr(
|
|
574
|
+
self.assistant_sys_msg, 'role_name'
|
|
575
|
+
):
|
|
576
|
+
role_name_attr = getattr(self.assistant_sys_msg, 'role_name', None)
|
|
577
|
+
if role_name_attr is not None:
|
|
578
|
+
assistant_role_name = str(role_name_attr)
|
|
579
|
+
|
|
478
580
|
init_msg = BaseMessage.make_assistant_message(
|
|
479
|
-
role_name=
|
|
480
|
-
|
|
481
|
-
content=init_msg_content,
|
|
581
|
+
role_name=assistant_role_name,
|
|
582
|
+
content=final_init_msg_content,
|
|
482
583
|
)
|
|
483
584
|
|
|
484
585
|
return init_msg
|
|
@@ -501,20 +602,28 @@ class RolePlaying:
|
|
|
501
602
|
"""
|
|
502
603
|
# Currently, reset() is synchronous, but if it becomes async in the
|
|
503
604
|
# future, we can await it here
|
|
504
|
-
self.assistant_agent
|
|
505
|
-
|
|
605
|
+
if self.assistant_agent is not None:
|
|
606
|
+
self.assistant_agent.reset()
|
|
607
|
+
if self.user_agent is not None:
|
|
608
|
+
self.user_agent.reset()
|
|
506
609
|
default_init_msg_content = (
|
|
507
610
|
"Now start to give me instructions one by one. "
|
|
508
611
|
"Only reply with Instruction and Input."
|
|
509
612
|
)
|
|
510
|
-
|
|
511
|
-
init_msg_content = default_init_msg_content
|
|
613
|
+
final_init_msg_content = init_msg_content or default_init_msg_content
|
|
512
614
|
|
|
513
615
|
# Initialize a message sent by the assistant
|
|
616
|
+
assistant_role_name = "assistant"
|
|
617
|
+
if self.assistant_sys_msg is not None and hasattr(
|
|
618
|
+
self.assistant_sys_msg, 'role_name'
|
|
619
|
+
):
|
|
620
|
+
role_name_attr = getattr(self.assistant_sys_msg, 'role_name', None)
|
|
621
|
+
if role_name_attr is not None:
|
|
622
|
+
assistant_role_name = str(role_name_attr)
|
|
623
|
+
|
|
514
624
|
init_msg = BaseMessage.make_assistant_message(
|
|
515
|
-
role_name=
|
|
516
|
-
|
|
517
|
-
content=init_msg_content,
|
|
625
|
+
role_name=assistant_role_name,
|
|
626
|
+
content=final_init_msg_content,
|
|
518
627
|
)
|
|
519
628
|
|
|
520
629
|
return init_msg
|
|
@@ -544,6 +653,11 @@ class RolePlaying:
|
|
|
544
653
|
user agent terminated the conversation, and any additional user
|
|
545
654
|
information.
|
|
546
655
|
"""
|
|
656
|
+
if self.user_agent is None:
|
|
657
|
+
raise ValueError("User agent is not initialized")
|
|
658
|
+
if self.assistant_agent is None:
|
|
659
|
+
raise ValueError("Assistant agent is not initialized")
|
|
660
|
+
|
|
547
661
|
user_response = self.user_agent.step(assistant_msg)
|
|
548
662
|
if user_response.terminated or user_response.msgs is None:
|
|
549
663
|
return (
|
|
@@ -556,13 +670,12 @@ class RolePlaying:
|
|
|
556
670
|
)
|
|
557
671
|
user_msg = self._reduce_message_options(user_response.msgs)
|
|
558
672
|
|
|
559
|
-
# To prevent recording
|
|
560
|
-
#
|
|
561
|
-
#
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
):
|
|
673
|
+
# To prevent recording missing messages: ChatAgent.step automatically
|
|
674
|
+
# saves the response to memory only when a single message is returned.
|
|
675
|
+
# When multi-response support is enabled (n > 1), it is the caller's
|
|
676
|
+
# responsibility to record the selected message. Therefore, we record
|
|
677
|
+
# it here after choosing one message via `_reduce_message_options()`.
|
|
678
|
+
if self._is_multi_response(self.user_agent):
|
|
566
679
|
self.user_agent.record_message(user_msg)
|
|
567
680
|
|
|
568
681
|
assistant_response = self.assistant_agent.step(user_msg)
|
|
@@ -579,13 +692,7 @@ class RolePlaying:
|
|
|
579
692
|
)
|
|
580
693
|
assistant_msg = self._reduce_message_options(assistant_response.msgs)
|
|
581
694
|
|
|
582
|
-
|
|
583
|
-
# step and once in role play), and the model generates only one
|
|
584
|
-
# response when multi-response support is enabled.
|
|
585
|
-
if (
|
|
586
|
-
'n' in self.assistant_agent.model_backend.model_config_dict.keys()
|
|
587
|
-
and self.assistant_agent.model_backend.model_config_dict['n'] > 1
|
|
588
|
-
):
|
|
695
|
+
if self._is_multi_response(self.assistant_agent):
|
|
589
696
|
self.assistant_agent.record_message(assistant_msg)
|
|
590
697
|
|
|
591
698
|
return (
|
|
@@ -627,6 +734,11 @@ class RolePlaying:
|
|
|
627
734
|
user agent terminated the conversation, and any additional user
|
|
628
735
|
information.
|
|
629
736
|
"""
|
|
737
|
+
if self.user_agent is None:
|
|
738
|
+
raise ValueError("User agent is not initialized")
|
|
739
|
+
if self.assistant_agent is None:
|
|
740
|
+
raise ValueError("Assistant agent is not initialized")
|
|
741
|
+
|
|
630
742
|
user_response = await self.user_agent.astep(assistant_msg)
|
|
631
743
|
if user_response.terminated or user_response.msgs is None:
|
|
632
744
|
return (
|
|
@@ -639,13 +751,7 @@ class RolePlaying:
|
|
|
639
751
|
)
|
|
640
752
|
user_msg = self._reduce_message_options(user_response.msgs)
|
|
641
753
|
|
|
642
|
-
|
|
643
|
-
# step and once in role play), and the model generates only one
|
|
644
|
-
# response when multi-response support is enabled.
|
|
645
|
-
if (
|
|
646
|
-
'n' in self.user_agent.model_backend.model_config_dict.keys()
|
|
647
|
-
and self.user_agent.model_backend.model_config_dict['n'] > 1
|
|
648
|
-
):
|
|
754
|
+
if self._is_multi_response(self.user_agent):
|
|
649
755
|
self.user_agent.record_message(user_msg)
|
|
650
756
|
|
|
651
757
|
assistant_response = await self.assistant_agent.astep(user_msg)
|
|
@@ -662,13 +768,7 @@ class RolePlaying:
|
|
|
662
768
|
)
|
|
663
769
|
assistant_msg = self._reduce_message_options(assistant_response.msgs)
|
|
664
770
|
|
|
665
|
-
|
|
666
|
-
# step and once in role play), and the model generates only one
|
|
667
|
-
# response when multi-response support is enabled.
|
|
668
|
-
if (
|
|
669
|
-
'n' in self.assistant_agent.model_backend.model_config_dict.keys()
|
|
670
|
-
and self.assistant_agent.model_backend.model_config_dict['n'] > 1
|
|
671
|
-
):
|
|
771
|
+
if self._is_multi_response(self.assistant_agent):
|
|
672
772
|
self.assistant_agent.record_message(assistant_msg)
|
|
673
773
|
|
|
674
774
|
return (
|
|
@@ -701,6 +801,10 @@ class RolePlaying:
|
|
|
701
801
|
RolePlaying: A new instance of RolePlaying with the same
|
|
702
802
|
configuration.
|
|
703
803
|
"""
|
|
804
|
+
if self.assistant_agent is None or self.user_agent is None:
|
|
805
|
+
raise ValueError(
|
|
806
|
+
"Cannot clone: assistant_agent or user_agent is None"
|
|
807
|
+
)
|
|
704
808
|
|
|
705
809
|
new_instance = RolePlaying(
|
|
706
810
|
assistant_role_name=self.assistant_agent.role_name,
|
|
@@ -730,3 +834,20 @@ class RolePlaying:
|
|
|
730
834
|
new_instance.critic = self.critic.clone(with_memory)
|
|
731
835
|
|
|
732
836
|
return new_instance
|
|
837
|
+
|
|
838
|
+
def _is_multi_response(self, agent: ChatAgent) -> bool:
|
|
839
|
+
r"""Checks if the given agent supports multi-response.
|
|
840
|
+
|
|
841
|
+
Args:
|
|
842
|
+
agent (ChatAgent): The agent to check for multi-response support.
|
|
843
|
+
|
|
844
|
+
Returns:
|
|
845
|
+
bool: True if the agent supports multi-response, False otherwise.
|
|
846
|
+
"""
|
|
847
|
+
if (
|
|
848
|
+
'n' in agent.model_backend.model_config_dict.keys()
|
|
849
|
+
and agent.model_backend.model_config_dict['n'] is not None
|
|
850
|
+
and agent.model_backend.model_config_dict['n'] > 1
|
|
851
|
+
):
|
|
852
|
+
return True
|
|
853
|
+
return False
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
3
|
# you may not use this file except in compliance with the License.
|
|
4
4
|
# You may obtain a copy of the License at
|
|
@@ -10,14 +10,21 @@
|
|
|
10
10
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
|
-
# ========= Copyright 2023-
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
|
|
15
15
|
from .role_playing_worker import RolePlayingWorker
|
|
16
16
|
from .single_agent_worker import SingleAgentWorker
|
|
17
|
-
from .
|
|
17
|
+
from .utils import FailureHandlingConfig, PipelineTaskBuilder, RecoveryStrategy
|
|
18
|
+
from .workflow_memory_manager import WorkflowSelectionMethod
|
|
19
|
+
from .workforce import Workforce, WorkforceMode
|
|
18
20
|
|
|
19
21
|
__all__ = [
|
|
20
22
|
"Workforce",
|
|
23
|
+
"WorkforceMode",
|
|
24
|
+
"PipelineTaskBuilder",
|
|
21
25
|
"SingleAgentWorker",
|
|
22
26
|
"RolePlayingWorker",
|
|
27
|
+
"WorkflowSelectionMethod",
|
|
28
|
+
"FailureHandlingConfig",
|
|
29
|
+
"RecoveryStrategy",
|
|
23
30
|
]
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
3
|
# you may not use this file except in compliance with the License.
|
|
4
4
|
# You may obtain a copy of the License at
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
|
-
# ========= Copyright 2023-
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
from abc import ABC, abstractmethod
|
|
15
|
-
from typing import Any
|
|
15
|
+
from typing import Any, Optional
|
|
16
16
|
|
|
17
17
|
from camel.societies.workforce.task_channel import TaskChannel
|
|
18
18
|
from camel.societies.workforce.utils import check_if_running
|
|
@@ -23,10 +23,14 @@ class BaseNode(ABC):
|
|
|
23
23
|
|
|
24
24
|
Args:
|
|
25
25
|
description (str): Description of the node.
|
|
26
|
+
node_id (Optional[str]): ID of the node. If not provided, it will
|
|
27
|
+
be generated automatically. (default: :obj:`None`)
|
|
26
28
|
"""
|
|
27
29
|
|
|
28
|
-
def __init__(
|
|
29
|
-
self
|
|
30
|
+
def __init__(
|
|
31
|
+
self, description: str, node_id: Optional[str] = None
|
|
32
|
+
) -> None:
|
|
33
|
+
self.node_id = node_id if node_id is not None else str(id(self))
|
|
30
34
|
self.description = description
|
|
31
35
|
self._channel: TaskChannel = TaskChannel()
|
|
32
36
|
self._running = False
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
# you may not use this file except in compliance with the License.
|
|
4
|
+
# You may obtain a copy of the License at
|
|
5
|
+
#
|
|
6
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
+
#
|
|
8
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
9
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
10
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
|
+
# See the License for the specific language governing permissions and
|
|
12
|
+
# limitations under the License.
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
from datetime import datetime, timezone
|
|
17
|
+
from typing import Any, Dict, List, Literal, Optional, Union
|
|
18
|
+
|
|
19
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class WorkforceEventBase(BaseModel):
|
|
23
|
+
model_config = ConfigDict(frozen=True, extra='forbid')
|
|
24
|
+
event_type: Literal[
|
|
25
|
+
"log",
|
|
26
|
+
"task_decomposed",
|
|
27
|
+
"task_created",
|
|
28
|
+
"task_assigned",
|
|
29
|
+
"task_started",
|
|
30
|
+
"task_completed",
|
|
31
|
+
"task_failed",
|
|
32
|
+
"worker_created",
|
|
33
|
+
"worker_deleted",
|
|
34
|
+
"queue_status",
|
|
35
|
+
"all_tasks_completed",
|
|
36
|
+
]
|
|
37
|
+
metadata: Optional[Dict[str, Any]] = None
|
|
38
|
+
timestamp: datetime = Field(
|
|
39
|
+
default_factory=lambda: datetime.now(timezone.utc)
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class LogEvent(WorkforceEventBase):
|
|
44
|
+
event_type: Literal["log"] = "log"
|
|
45
|
+
message: str
|
|
46
|
+
level: Literal["debug", "info", "warning", "error", "critical"]
|
|
47
|
+
color: (
|
|
48
|
+
Literal[
|
|
49
|
+
"red",
|
|
50
|
+
"green",
|
|
51
|
+
"yellow",
|
|
52
|
+
"blue",
|
|
53
|
+
"cyan",
|
|
54
|
+
"magenta",
|
|
55
|
+
"gray",
|
|
56
|
+
"black",
|
|
57
|
+
]
|
|
58
|
+
| None
|
|
59
|
+
) = None
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class WorkerCreatedEvent(WorkforceEventBase):
|
|
63
|
+
event_type: Literal["worker_created"] = "worker_created"
|
|
64
|
+
worker_id: str
|
|
65
|
+
worker_type: str
|
|
66
|
+
role: str
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class WorkerDeletedEvent(WorkforceEventBase):
|
|
70
|
+
event_type: Literal["worker_deleted"] = "worker_deleted"
|
|
71
|
+
worker_id: str
|
|
72
|
+
reason: Optional[str] = None
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class TaskDecomposedEvent(WorkforceEventBase):
|
|
76
|
+
event_type: Literal["task_decomposed"] = "task_decomposed"
|
|
77
|
+
parent_task_id: str
|
|
78
|
+
subtask_ids: List[str]
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class TaskCreatedEvent(WorkforceEventBase):
|
|
82
|
+
event_type: Literal["task_created"] = "task_created"
|
|
83
|
+
task_id: str
|
|
84
|
+
description: str
|
|
85
|
+
parent_task_id: Optional[str] = None
|
|
86
|
+
task_type: Optional[str] = None
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
class TaskAssignedEvent(WorkforceEventBase):
|
|
90
|
+
event_type: Literal["task_assigned"] = "task_assigned"
|
|
91
|
+
task_id: str
|
|
92
|
+
worker_id: str
|
|
93
|
+
queue_time_seconds: Optional[float] = None
|
|
94
|
+
dependencies: Optional[List[str]] = None
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class TaskStartedEvent(WorkforceEventBase):
|
|
98
|
+
event_type: Literal["task_started"] = "task_started"
|
|
99
|
+
task_id: str
|
|
100
|
+
worker_id: str
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
class TaskCompletedEvent(WorkforceEventBase):
|
|
104
|
+
event_type: Literal["task_completed"] = "task_completed"
|
|
105
|
+
task_id: str
|
|
106
|
+
worker_id: str
|
|
107
|
+
result_summary: Optional[str] = None
|
|
108
|
+
processing_time_seconds: Optional[float] = None
|
|
109
|
+
token_usage: Optional[Dict[str, int]] = None
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class TaskFailedEvent(WorkforceEventBase):
|
|
113
|
+
event_type: Literal["task_failed"] = "task_failed"
|
|
114
|
+
task_id: str
|
|
115
|
+
error_message: str
|
|
116
|
+
worker_id: Optional[str] = None
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
class AllTasksCompletedEvent(WorkforceEventBase):
|
|
120
|
+
event_type: Literal["all_tasks_completed"] = "all_tasks_completed"
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
class QueueStatusEvent(WorkforceEventBase):
|
|
124
|
+
event_type: Literal["queue_status"] = "queue_status"
|
|
125
|
+
queue_name: str
|
|
126
|
+
length: int
|
|
127
|
+
pending_task_ids: Optional[List[str]] = None
|
|
128
|
+
metadata: Optional[Dict[str, Any]] = None
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
WorkforceEvent = Union[
|
|
132
|
+
LogEvent,
|
|
133
|
+
TaskDecomposedEvent,
|
|
134
|
+
TaskCreatedEvent,
|
|
135
|
+
TaskAssignedEvent,
|
|
136
|
+
TaskStartedEvent,
|
|
137
|
+
TaskCompletedEvent,
|
|
138
|
+
TaskFailedEvent,
|
|
139
|
+
WorkerCreatedEvent,
|
|
140
|
+
WorkerDeletedEvent,
|
|
141
|
+
AllTasksCompletedEvent,
|
|
142
|
+
QueueStatusEvent,
|
|
143
|
+
]
|