camel-ai 0.2.65__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 +4835 -947
- 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 +35 -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 +1 -3
- camel/benchmarks/mock_website/mock_web.py +2 -2
- camel/benchmarks/mock_website/requirements.txt +1 -1
- camel/benchmarks/mock_website/shopping_mall/app.py +2 -2
- camel/benchmarks/mock_website/task.json +1 -1
- 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 +23 -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 +2 -2
- 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 +2 -2
- camel/configs/cometapi_config.py +106 -0
- camel/configs/crynux_config.py +2 -2
- 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 +2 -2
- 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 +5 -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 +2 -2
- camel/configs/samba_config.py +6 -4
- 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_collectors/__init__.py +2 -2
- camel/data_collectors/alpaca_collector.py +18 -9
- camel/data_collectors/base.py +2 -2
- camel/data_collectors/sharegpt_collector.py +2 -2
- camel/datagen/__init__.py +2 -2
- camel/datagen/cot_datagen.py +3 -3
- camel/datagen/evol_instruct/__init__.py +2 -2
- camel/datagen/evol_instruct/evol_instruct.py +2 -2
- camel/datagen/evol_instruct/scorer.py +12 -12
- camel/datagen/evol_instruct/templates.py +16 -16
- 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 +2 -2
- camel/datasets/self_instruct_generator.py +2 -2
- camel/datasets/static_dataset.py +2 -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 +2 -2
- 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 +2 -2
- camel/embeddings/together_embedding.py +2 -2
- camel/embeddings/vlm_embedding.py +2 -2
- 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 +2 -2
- camel/interpreters/docker/Dockerfile +14 -24
- camel/interpreters/docker_interpreter.py +5 -4
- camel/interpreters/e2b_interpreter.py +36 -3
- camel/interpreters/internal_python_interpreter.py +53 -4
- camel/interpreters/interpreter_error.py +2 -2
- camel/interpreters/ipython_interpreter.py +2 -2
- camel/interpreters/microsandbox_interpreter.py +395 -0
- camel/interpreters/subprocess_interpreter.py +2 -2
- camel/loaders/__init__.py +13 -4
- 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 +11 -2
- 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 +2 -2
- 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 +125 -7
- 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 +90 -10
- camel/messages/__init__.py +2 -2
- camel/messages/base.py +178 -43
- 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 +16 -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 +212 -89
- 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 +16 -21
- camel/models/cometapi_model.py +83 -0
- camel/models/crynux_model.py +11 -18
- camel/models/deepseek_model.py +18 -58
- camel/models/fish_audio_model.py +8 -2
- camel/models/gemini_model.py +389 -26
- camel/models/groq_model.py +11 -19
- camel/models/internlm_model.py +11 -18
- camel/models/litellm_model.py +56 -34
- camel/models/lmstudio_model.py +17 -20
- camel/models/minimax_model.py +83 -0
- camel/models/mistral_model.py +18 -19
- camel/models/model_factory.py +37 -3
- camel/models/model_manager.py +26 -8
- 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 +188 -45
- camel/models/openai_model.py +216 -71
- 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 +21 -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 +48 -47
- camel/models/sglang_model.py +88 -40
- 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 +7 -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 +3 -2
- camel/retrievers/base.py +2 -2
- camel/retrievers/bm25_retriever.py +2 -2
- camel/retrievers/cohere_rerank_retriever.py +2 -2
- camel/retrievers/hybrid_retrival.py +2 -2
- camel/retrievers/vector_retriever.py +2 -2
- camel/runtimes/Dockerfile.multi-toolkit +90 -0
- camel/runtimes/__init__.py +2 -2
- camel/runtimes/api.py +79 -23
- camel/runtimes/base.py +2 -2
- camel/runtimes/configs.py +13 -13
- camel/runtimes/daytona_runtime.py +17 -18
- camel/runtimes/docker_runtime.py +12 -12
- camel/runtimes/llm_guard_runtime.py +26 -26
- camel/runtimes/remote_http_runtime.py +11 -11
- camel/runtimes/ubuntu_docker_runtime.py +2 -2
- camel/runtimes/utils/__init__.py +2 -2
- camel/runtimes/utils/function_risk_toolkit.py +2 -2
- camel/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 +2 -2
- camel/societies/workforce/events.py +143 -0
- camel/societies/workforce/prompts.py +258 -33
- camel/societies/workforce/role_playing_worker.py +88 -31
- camel/societies/workforce/single_agent_worker.py +638 -40
- camel/societies/workforce/structured_output_handler.py +512 -0
- camel/societies/workforce/task_channel.py +182 -38
- camel/societies/workforce/utils.py +780 -65
- camel/societies/workforce/worker.py +92 -26
- camel/societies/workforce/workflow_memory_manager.py +1746 -0
- camel/societies/workforce/workforce.py +5276 -355
- 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 +6 -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 +8 -2
- camel/storages/vectordb_storages/base.py +2 -2
- camel/storages/vectordb_storages/chroma.py +731 -0
- camel/storages/vectordb_storages/faiss.py +2 -2
- camel/storages/vectordb_storages/milvus.py +2 -2
- camel/storages/vectordb_storages/oceanbase.py +15 -15
- 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 +2 -2
- camel/tasks/__init__.py +2 -2
- camel/tasks/task.py +348 -26
- 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 +54 -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 +4 -4
- camel/toolkits/audio_analysis_toolkit.py +3 -3
- camel/toolkits/base.py +65 -7
- camel/toolkits/bohrium_toolkit.py +2 -2
- camel/toolkits/browser_toolkit.py +34 -21
- camel/toolkits/browser_toolkit_commons.py +4 -4
- camel/toolkits/code_execution.py +31 -4
- 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 +905 -71
- camel/toolkits/file_toolkit.py +1402 -0
- camel/toolkits/function_tool.py +126 -18
- camel/toolkits/github_toolkit.py +109 -22
- 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 -6
- camel/toolkits/image_generation_toolkit.py +390 -0
- camel/toolkits/jina_reranker_toolkit.py +5 -6
- 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 +412 -36
- 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 +53 -53
- camel/toolkits/playwright_mcp_toolkit.py +13 -31
- camel/toolkits/pptx_toolkit.py +36 -23
- 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 +5 -5
- 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 +2 -2
- camel/toolkits/vertex_ai_veo_toolkit.py +590 -0
- camel/toolkits/video_analysis_toolkit.py +109 -29
- camel/toolkits/video_download_toolkit.py +19 -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 +2 -2
- 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 +378 -39
- camel/types/mcp_registries.py +2 -2
- camel/types/openai_types.py +4 -4
- camel/types/unified_model_type.py +38 -6
- camel/utils/__init__.py +2 -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 +38 -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 +2 -2
- camel/utils/mcp.py +140 -6
- camel/utils/mcp_client.py +48 -38
- 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.65.dist-info → camel_ai-0.2.82.dist-info}/METADATA +327 -94
- camel_ai-0.2.82.dist-info/RECORD +507 -0
- {camel_ai-0.2.65.dist-info → camel_ai-0.2.82.dist-info}/WHEEL +1 -1
- {camel_ai-0.2.65.dist-info → camel_ai-0.2.82.dist-info}/licenses/LICENSE +1 -1
- camel/loaders/pandas_reader.py +0 -368
- camel/toolkits/dalle_toolkit.py +0 -175
- camel/toolkits/file_write_toolkit.py +0 -444
- camel/toolkits/openai_agent_toolkit.py +0 -135
- camel/toolkits/terminal_toolkit.py +0 -1037
- camel_ai-0.2.65.dist-info/RECORD +0 -426
camel/tasks/task.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,24 +10,164 @@
|
|
|
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
|
import re
|
|
16
16
|
from enum import Enum
|
|
17
|
-
from
|
|
17
|
+
from types import GeneratorType
|
|
18
|
+
from typing import (
|
|
19
|
+
TYPE_CHECKING,
|
|
20
|
+
Any,
|
|
21
|
+
Callable,
|
|
22
|
+
Dict,
|
|
23
|
+
Generator,
|
|
24
|
+
Iterable,
|
|
25
|
+
List,
|
|
26
|
+
Literal,
|
|
27
|
+
Optional,
|
|
28
|
+
Union,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
from PIL import Image
|
|
32
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
18
33
|
|
|
19
|
-
|
|
34
|
+
if TYPE_CHECKING:
|
|
35
|
+
from camel.agents import ChatAgent
|
|
36
|
+
from camel.responses import ChatAgentResponse
|
|
37
|
+
import uuid
|
|
20
38
|
|
|
21
|
-
from camel.
|
|
39
|
+
from camel.logger import get_logger
|
|
22
40
|
from camel.messages import BaseMessage
|
|
23
41
|
from camel.prompts import TextPrompt
|
|
24
42
|
|
|
43
|
+
# Note: validate_task_content moved here to avoid circular imports
|
|
25
44
|
from .task_prompt import (
|
|
26
45
|
TASK_COMPOSE_PROMPT,
|
|
27
46
|
TASK_DECOMPOSE_PROMPT,
|
|
28
47
|
TASK_EVOLVE_PROMPT,
|
|
29
48
|
)
|
|
30
49
|
|
|
50
|
+
logger = get_logger(__name__)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class TaskValidationMode(Enum):
|
|
54
|
+
r"""Validation modes for different use cases."""
|
|
55
|
+
|
|
56
|
+
INPUT = "input" # For validating task content before processing
|
|
57
|
+
OUTPUT = "output" # For validating task results after completion
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def validate_task_content(
|
|
61
|
+
content: str,
|
|
62
|
+
task_id: str = "unknown",
|
|
63
|
+
min_length: int = 1,
|
|
64
|
+
mode: TaskValidationMode = TaskValidationMode.INPUT,
|
|
65
|
+
check_failure_patterns: bool = True,
|
|
66
|
+
) -> bool:
|
|
67
|
+
r"""Unified validation for task content and results to avoid silent
|
|
68
|
+
failures. Performs comprehensive checks to ensure content meets quality
|
|
69
|
+
standards.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
content (str): The task content or result to validate.
|
|
73
|
+
task_id (str): Task ID for logging purposes.
|
|
74
|
+
(default: :obj:`"unknown"`)
|
|
75
|
+
min_length (int): Minimum content length after stripping whitespace.
|
|
76
|
+
(default: :obj:`1`)
|
|
77
|
+
mode (TaskValidationMode): Validation mode - INPUT for task content,
|
|
78
|
+
OUTPUT for task results. (default: :obj:`TaskValidationMode.INPUT`)
|
|
79
|
+
check_failure_patterns (bool): Whether to check for failure indicators
|
|
80
|
+
in the content. Only effective in OUTPUT mode.
|
|
81
|
+
(default: :obj:`True`)
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
bool: True if content passes validation, False otherwise.
|
|
85
|
+
"""
|
|
86
|
+
# 1: Content must not be None
|
|
87
|
+
if content is None:
|
|
88
|
+
logger.warning(f"Task {task_id}: None content rejected")
|
|
89
|
+
return False
|
|
90
|
+
|
|
91
|
+
# 2: Content must not be empty after stripping whitespace
|
|
92
|
+
stripped_content = content.strip()
|
|
93
|
+
if not stripped_content:
|
|
94
|
+
logger.warning(
|
|
95
|
+
f"Task {task_id}: Empty or whitespace-only content rejected."
|
|
96
|
+
)
|
|
97
|
+
return False
|
|
98
|
+
|
|
99
|
+
# 3: Content must meet minimum meaningful length
|
|
100
|
+
if len(stripped_content) < min_length:
|
|
101
|
+
logger.warning(
|
|
102
|
+
f"Task {task_id}: Content too short ({len(stripped_content)} "
|
|
103
|
+
f"chars < {min_length} minimum). Content preview: "
|
|
104
|
+
f"'{stripped_content}'"
|
|
105
|
+
)
|
|
106
|
+
return False
|
|
107
|
+
|
|
108
|
+
# 4: For OUTPUT mode, check for failure patterns if enabled
|
|
109
|
+
if mode == TaskValidationMode.OUTPUT and check_failure_patterns:
|
|
110
|
+
content_lower = stripped_content.lower()
|
|
111
|
+
|
|
112
|
+
# Check for explicit failure indicators
|
|
113
|
+
failure_indicators = [
|
|
114
|
+
"i cannot complete",
|
|
115
|
+
"i cannot do",
|
|
116
|
+
"task failed",
|
|
117
|
+
"unable to complete",
|
|
118
|
+
"cannot be completed",
|
|
119
|
+
"failed to complete",
|
|
120
|
+
"i cannot",
|
|
121
|
+
"not possible",
|
|
122
|
+
"impossible to",
|
|
123
|
+
"cannot perform",
|
|
124
|
+
]
|
|
125
|
+
|
|
126
|
+
if any(indicator in content_lower for indicator in failure_indicators):
|
|
127
|
+
logger.warning(
|
|
128
|
+
f"Task {task_id}: Failure indicator detected in result. "
|
|
129
|
+
f"Content preview: '{stripped_content}'"
|
|
130
|
+
)
|
|
131
|
+
return False
|
|
132
|
+
|
|
133
|
+
# Check for responses that are just error messages or refusals
|
|
134
|
+
if content_lower.startswith(("error", "failed", "cannot", "unable")):
|
|
135
|
+
logger.warning(
|
|
136
|
+
f"Task {task_id}: Error/refusal pattern detected at start. "
|
|
137
|
+
f"Content preview: '{stripped_content}'"
|
|
138
|
+
)
|
|
139
|
+
return False
|
|
140
|
+
|
|
141
|
+
# All validation checks passed
|
|
142
|
+
logger.debug(
|
|
143
|
+
f"Task {task_id}: {mode.value} validation passed "
|
|
144
|
+
f"({len(stripped_content)} chars)"
|
|
145
|
+
)
|
|
146
|
+
return True
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def is_task_result_insufficient(task: "Task") -> bool:
|
|
150
|
+
r"""Check if a task result is insufficient and should be treated as failed.
|
|
151
|
+
|
|
152
|
+
This is a convenience wrapper around validate_task_content for backward
|
|
153
|
+
compatibility and semantic clarity when checking task results.
|
|
154
|
+
|
|
155
|
+
Args:
|
|
156
|
+
task (Task): The task to check.
|
|
157
|
+
|
|
158
|
+
Returns:
|
|
159
|
+
bool: True if the result is insufficient, False otherwise.
|
|
160
|
+
"""
|
|
161
|
+
if not hasattr(task, 'result') or task.result is None:
|
|
162
|
+
return True
|
|
163
|
+
|
|
164
|
+
return not validate_task_content(
|
|
165
|
+
content=task.result,
|
|
166
|
+
task_id=task.id,
|
|
167
|
+
mode=TaskValidationMode.OUTPUT,
|
|
168
|
+
check_failure_patterns=True,
|
|
169
|
+
)
|
|
170
|
+
|
|
31
171
|
|
|
32
172
|
def parse_response(
|
|
33
173
|
response: str, task_id: Optional[str] = None
|
|
@@ -48,8 +188,17 @@ def parse_response(
|
|
|
48
188
|
tasks = []
|
|
49
189
|
if task_id is None:
|
|
50
190
|
task_id = "0"
|
|
51
|
-
for i, content in enumerate(tasks_content):
|
|
52
|
-
|
|
191
|
+
for i, content in enumerate(tasks_content, 1):
|
|
192
|
+
stripped_content = content.strip()
|
|
193
|
+
# validate subtask content before creating the task
|
|
194
|
+
if validate_task_content(stripped_content, f"{task_id}.{i}"):
|
|
195
|
+
tasks.append(Task(content=stripped_content, id=f"{task_id}.{i}"))
|
|
196
|
+
else:
|
|
197
|
+
logger.warning(
|
|
198
|
+
f"Skipping invalid subtask {task_id}.{i} "
|
|
199
|
+
f"during decomposition: "
|
|
200
|
+
f"Content '{stripped_content}' failed validation"
|
|
201
|
+
)
|
|
53
202
|
return tasks
|
|
54
203
|
|
|
55
204
|
|
|
@@ -72,27 +221,42 @@ class Task(BaseModel):
|
|
|
72
221
|
content (str): string content for task.
|
|
73
222
|
id (str): An unique string identifier for the task. This should
|
|
74
223
|
ideally be provided by the provider/model which created the task.
|
|
75
|
-
(default: :obj
|
|
224
|
+
(default: :obj:`uuid.uuid4()`)
|
|
76
225
|
state (TaskState): The state which should be OPEN, RUNNING, DONE or
|
|
77
|
-
DELETED. (default: :obj
|
|
78
|
-
type (Optional[str]): task type. (default: :obj
|
|
226
|
+
DELETED. (default: :obj:`TaskState.FAILED`)
|
|
227
|
+
type (Optional[str]): task type. (default: :obj:`None`)
|
|
79
228
|
parent (Optional[Task]): The parent task, None for root task.
|
|
80
|
-
(default: :obj
|
|
229
|
+
(default: :obj:`None`)
|
|
81
230
|
subtasks (List[Task]): The childrent sub-tasks for the task.
|
|
82
|
-
(default: :obj
|
|
231
|
+
(default: :obj:`[]`)
|
|
83
232
|
result (Optional[str]): The answer for the task.
|
|
84
|
-
(default: :obj
|
|
233
|
+
(default: :obj:`""`)
|
|
85
234
|
failure_count (int): The failure count for the task.
|
|
86
|
-
(default: :obj
|
|
235
|
+
(default: :obj:`0`)
|
|
236
|
+
assigned_worker_id (Optional[str]): The ID of the worker assigned to
|
|
237
|
+
this task. (default: :obj:`None`)
|
|
238
|
+
dependencies (List[Task]): The dependencies for the task.
|
|
239
|
+
(default: :obj:`[]`)
|
|
87
240
|
additional_info (Optional[Dict[str, Any]]): Additional information for
|
|
88
|
-
the task. (default: :obj
|
|
241
|
+
the task. (default: :obj:`None`)
|
|
242
|
+
image_list (Optional[List[Union[Image.Image, str]]]): Optional list
|
|
243
|
+
of PIL Image objects or image URLs (strings) associated with the
|
|
244
|
+
task. (default: :obj:`None`)
|
|
245
|
+
image_detail (Literal["auto", "low", "high"]): Detail level of the
|
|
246
|
+
images associated with the task. (default: :obj:`auto`)
|
|
247
|
+
video_bytes (Optional[bytes]): Optional bytes of a video associated
|
|
248
|
+
with the task. (default: :obj:`None`)
|
|
249
|
+
video_detail (Literal["auto", "low", "high"]): Detail level of the
|
|
250
|
+
videos associated with the task. (default: :obj:`auto`)
|
|
89
251
|
"""
|
|
90
252
|
|
|
91
253
|
content: str
|
|
92
254
|
|
|
93
|
-
id: str =
|
|
255
|
+
id: str = Field(default_factory=lambda: str(uuid.uuid4()))
|
|
94
256
|
|
|
95
|
-
state: TaskState =
|
|
257
|
+
state: TaskState = (
|
|
258
|
+
TaskState.FAILED
|
|
259
|
+
) # TODO: Add logic for OPEN in workforce.py
|
|
96
260
|
|
|
97
261
|
type: Optional[str] = None
|
|
98
262
|
|
|
@@ -104,8 +268,22 @@ class Task(BaseModel):
|
|
|
104
268
|
|
|
105
269
|
failure_count: int = 0
|
|
106
270
|
|
|
271
|
+
assigned_worker_id: Optional[str] = None
|
|
272
|
+
|
|
273
|
+
dependencies: List["Task"] = []
|
|
274
|
+
|
|
107
275
|
additional_info: Optional[Dict[str, Any]] = None
|
|
108
276
|
|
|
277
|
+
image_list: Optional[List[Union[Image.Image, str]]] = None
|
|
278
|
+
|
|
279
|
+
image_detail: Literal["auto", "low", "high"] = "auto"
|
|
280
|
+
|
|
281
|
+
video_bytes: Optional[bytes] = None
|
|
282
|
+
|
|
283
|
+
video_detail: Literal["auto", "low", "high"] = "auto"
|
|
284
|
+
|
|
285
|
+
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
286
|
+
|
|
109
287
|
def __repr__(self) -> str:
|
|
110
288
|
r"""Return a string representation of the task."""
|
|
111
289
|
content_preview = self.content
|
|
@@ -134,7 +312,9 @@ class Task(BaseModel):
|
|
|
134
312
|
|
|
135
313
|
def reset(self):
|
|
136
314
|
r"""Reset Task to initial state."""
|
|
137
|
-
self.state =
|
|
315
|
+
self.state = (
|
|
316
|
+
TaskState.FAILED
|
|
317
|
+
) # TODO: Add logic for OPEN in workforce.py
|
|
138
318
|
self.result = ""
|
|
139
319
|
|
|
140
320
|
def update_result(self, result: str):
|
|
@@ -228,12 +408,15 @@ class Task(BaseModel):
|
|
|
228
408
|
|
|
229
409
|
def decompose(
|
|
230
410
|
self,
|
|
231
|
-
agent: ChatAgent,
|
|
411
|
+
agent: "ChatAgent",
|
|
232
412
|
prompt: Optional[str] = None,
|
|
233
413
|
task_parser: Callable[[str, str], List["Task"]] = parse_response,
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
414
|
+
stream_callback: Optional[
|
|
415
|
+
Callable[["ChatAgentResponse"], None]
|
|
416
|
+
] = None,
|
|
417
|
+
) -> Union[List["Task"], Generator[List["Task"], None, None]]:
|
|
418
|
+
r"""Decompose a task to a list of sub-tasks. Automatically detects
|
|
419
|
+
streaming or non-streaming based on agent configuration.
|
|
237
420
|
|
|
238
421
|
Args:
|
|
239
422
|
agent (ChatAgent): An agent that used to decompose the task.
|
|
@@ -242,9 +425,16 @@ class Task(BaseModel):
|
|
|
242
425
|
task_parser (Callable[[str, str], List[Task]], optional): A
|
|
243
426
|
function to extract Task from response. If not provided,
|
|
244
427
|
the default parse_response will be used.
|
|
428
|
+
stream_callback (Callable[[ChatAgentResponse], None], optional): A
|
|
429
|
+
callback function that receives each chunk (ChatAgentResponse)
|
|
430
|
+
during streaming. This allows tracking the decomposition
|
|
431
|
+
progress in real-time.
|
|
245
432
|
|
|
246
433
|
Returns:
|
|
247
|
-
List[Task]
|
|
434
|
+
Union[List[Task], Generator[List[Task], None, None]]: If agent is
|
|
435
|
+
configured for streaming, returns a generator that yields lists
|
|
436
|
+
of new tasks as they are parsed. Otherwise returns a list of
|
|
437
|
+
all tasks.
|
|
248
438
|
"""
|
|
249
439
|
|
|
250
440
|
role_name = agent.role_name
|
|
@@ -256,14 +446,136 @@ class Task(BaseModel):
|
|
|
256
446
|
role_name=role_name, content=content
|
|
257
447
|
)
|
|
258
448
|
response = agent.step(msg)
|
|
449
|
+
|
|
450
|
+
# Auto-detect streaming based on response type
|
|
451
|
+
from camel.agents.chat_agent import StreamingChatAgentResponse
|
|
452
|
+
|
|
453
|
+
is_streaming = isinstance(
|
|
454
|
+
response, StreamingChatAgentResponse
|
|
455
|
+
) or isinstance(response, GeneratorType)
|
|
456
|
+
if (
|
|
457
|
+
not is_streaming
|
|
458
|
+
and hasattr(response, "__iter__")
|
|
459
|
+
and not hasattr(response, "msg")
|
|
460
|
+
):
|
|
461
|
+
is_streaming = True
|
|
462
|
+
|
|
463
|
+
if is_streaming:
|
|
464
|
+
return self._decompose_streaming(
|
|
465
|
+
response, task_parser, stream_callback=stream_callback
|
|
466
|
+
)
|
|
467
|
+
return self._decompose_non_streaming(response, task_parser)
|
|
468
|
+
|
|
469
|
+
def _decompose_streaming(
|
|
470
|
+
self,
|
|
471
|
+
response: Iterable,
|
|
472
|
+
task_parser: Callable[[str, str], List["Task"]],
|
|
473
|
+
stream_callback: Optional[
|
|
474
|
+
Callable[["ChatAgentResponse"], None]
|
|
475
|
+
] = None,
|
|
476
|
+
) -> Generator[List["Task"], None, None]:
|
|
477
|
+
r"""Handle streaming response for task decomposition.
|
|
478
|
+
|
|
479
|
+
Args:
|
|
480
|
+
response: Streaming response from agent
|
|
481
|
+
task_parser: Function to parse tasks from response
|
|
482
|
+
stream_callback (Callable[[ChatAgentResponse], None], optional): A
|
|
483
|
+
callback function that receives each chunk (ChatAgentResponse)
|
|
484
|
+
during streaming.
|
|
485
|
+
|
|
486
|
+
Yields:
|
|
487
|
+
List[Task]: New tasks as they are parsed from streaming response
|
|
488
|
+
"""
|
|
489
|
+
accumulated_content = ""
|
|
490
|
+
yielded_count = 0
|
|
491
|
+
|
|
492
|
+
# Process streaming response
|
|
493
|
+
for chunk in response:
|
|
494
|
+
accumulated_content = chunk.msg.content
|
|
495
|
+
if stream_callback:
|
|
496
|
+
try:
|
|
497
|
+
stream_callback(chunk)
|
|
498
|
+
except Exception:
|
|
499
|
+
logger.warning(
|
|
500
|
+
"stream_callback failed during decomposition",
|
|
501
|
+
exc_info=True,
|
|
502
|
+
)
|
|
503
|
+
|
|
504
|
+
# Try to parse partial tasks from accumulated content
|
|
505
|
+
try:
|
|
506
|
+
current_tasks = self._parse_partial_tasks(accumulated_content)
|
|
507
|
+
|
|
508
|
+
# Yield new tasks if we have more than previously yielded
|
|
509
|
+
if len(current_tasks) > yielded_count:
|
|
510
|
+
new_tasks = current_tasks[yielded_count:]
|
|
511
|
+
for task in new_tasks:
|
|
512
|
+
task.additional_info = self.additional_info
|
|
513
|
+
task.parent = self
|
|
514
|
+
yield new_tasks
|
|
515
|
+
yielded_count = len(current_tasks)
|
|
516
|
+
|
|
517
|
+
except Exception:
|
|
518
|
+
# If parsing fails, continue accumulating
|
|
519
|
+
continue
|
|
520
|
+
|
|
521
|
+
# Final complete parsing
|
|
522
|
+
final_tasks = task_parser(accumulated_content, self.id)
|
|
523
|
+
for task in final_tasks:
|
|
524
|
+
task.additional_info = self.additional_info
|
|
525
|
+
task.parent = self
|
|
526
|
+
self.subtasks = final_tasks
|
|
527
|
+
|
|
528
|
+
def _decompose_non_streaming(
|
|
529
|
+
self, response, task_parser: Callable[[str, str], List["Task"]]
|
|
530
|
+
) -> List["Task"]:
|
|
531
|
+
r"""Handle non-streaming response for task decomposition.
|
|
532
|
+
|
|
533
|
+
Args:
|
|
534
|
+
response: Regular response from agent
|
|
535
|
+
task_parser: Function to parse tasks from response
|
|
536
|
+
|
|
537
|
+
Returns:
|
|
538
|
+
List[Task]: All parsed tasks
|
|
539
|
+
"""
|
|
259
540
|
tasks = task_parser(response.msg.content, self.id)
|
|
260
541
|
for task in tasks:
|
|
261
542
|
task.additional_info = self.additional_info
|
|
543
|
+
task.parent = self
|
|
544
|
+
self.subtasks = tasks
|
|
545
|
+
return tasks
|
|
546
|
+
|
|
547
|
+
def _parse_partial_tasks(self, response: str) -> List["Task"]:
|
|
548
|
+
r"""Parse tasks from potentially incomplete response.
|
|
549
|
+
|
|
550
|
+
Args:
|
|
551
|
+
response: Partial response content
|
|
552
|
+
|
|
553
|
+
Returns:
|
|
554
|
+
List[Task]: Tasks parsed from complete <task></task> blocks
|
|
555
|
+
"""
|
|
556
|
+
pattern = r"<task>(.*?)</task>"
|
|
557
|
+
tasks_content = re.findall(pattern, response, re.DOTALL)
|
|
558
|
+
|
|
559
|
+
tasks = []
|
|
560
|
+
task_id = self.id or "0"
|
|
561
|
+
|
|
562
|
+
for i, content in enumerate(tasks_content, 1):
|
|
563
|
+
stripped_content = content.strip()
|
|
564
|
+
if validate_task_content(stripped_content, f"{task_id}.{i}"):
|
|
565
|
+
tasks.append(
|
|
566
|
+
Task(content=stripped_content, id=f"{task_id}.{i}")
|
|
567
|
+
)
|
|
568
|
+
else:
|
|
569
|
+
logger.warning(
|
|
570
|
+
f"Skipping invalid subtask {task_id}.{i} "
|
|
571
|
+
f"during streaming decomposition: "
|
|
572
|
+
f"Content '{stripped_content}' failed validation"
|
|
573
|
+
)
|
|
262
574
|
return tasks
|
|
263
575
|
|
|
264
576
|
def compose(
|
|
265
577
|
self,
|
|
266
|
-
agent: ChatAgent,
|
|
578
|
+
agent: "ChatAgent",
|
|
267
579
|
template: TextPrompt = TASK_COMPOSE_PROMPT,
|
|
268
580
|
result_parser: Optional[Callable[[str], str]] = None,
|
|
269
581
|
):
|
|
@@ -287,6 +599,10 @@ class Task(BaseModel):
|
|
|
287
599
|
role_name=role_name,
|
|
288
600
|
content=self.content,
|
|
289
601
|
additional_info=self.additional_info,
|
|
602
|
+
image_list=self.image_list,
|
|
603
|
+
image_detail=self.image_detail,
|
|
604
|
+
video_bytes=self.video_bytes,
|
|
605
|
+
video_detail=self.video_detail,
|
|
290
606
|
other_results=sub_tasks_result,
|
|
291
607
|
)
|
|
292
608
|
msg = BaseMessage.make_user_message(
|
|
@@ -412,12 +728,13 @@ class TaskManager:
|
|
|
412
728
|
def evolve(
|
|
413
729
|
self,
|
|
414
730
|
task: Task,
|
|
415
|
-
agent: ChatAgent,
|
|
731
|
+
agent: "ChatAgent",
|
|
416
732
|
template: Optional[TextPrompt] = None,
|
|
417
733
|
task_parser: Optional[Callable[[str, str], List[Task]]] = None,
|
|
418
734
|
) -> Optional[Task]:
|
|
419
735
|
r"""Evolve a task to a new task.
|
|
420
736
|
Evolve is only used for data generation.
|
|
737
|
+
|
|
421
738
|
Args:
|
|
422
739
|
task (Task): A given task.
|
|
423
740
|
agent (ChatAgent): An agent that used to evolve the task.
|
|
@@ -436,7 +753,12 @@ class TaskManager:
|
|
|
436
753
|
role_name = agent.role_name
|
|
437
754
|
content = template.format(role_name=role_name, content=task.content)
|
|
438
755
|
msg = BaseMessage.make_user_message(
|
|
439
|
-
role_name=role_name,
|
|
756
|
+
role_name=role_name,
|
|
757
|
+
content=content,
|
|
758
|
+
image_list=task.image_list,
|
|
759
|
+
image_detail=task.image_detail,
|
|
760
|
+
video_bytes=task.video_bytes,
|
|
761
|
+
video_detail=task.video_detail,
|
|
440
762
|
)
|
|
441
763
|
response = agent.step(msg)
|
|
442
764
|
if task_parser is None:
|
camel/tasks/task_prompt.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
|
from camel.prompts import TextPrompt
|
|
15
15
|
|
|
16
16
|
# ruff: noqa: E501
|
|
@@ -47,7 +47,7 @@ The related tasks result and status:
|
|
|
47
47
|
|
|
48
48
|
{other_results}
|
|
49
49
|
|
|
50
|
-
so, the final answer of the root task is:
|
|
50
|
+
so, the final answer of the root task is:
|
|
51
51
|
"""
|
|
52
52
|
)
|
|
53
53
|
|
camel/terminators/__init__.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
|
from .base import BaseTerminator
|
|
15
15
|
from .response_terminator import ResponseTerminator, ResponseWordsTerminator
|
|
16
16
|
from .token_limit_terminator import TokenLimitTerminator
|
camel/terminators/base.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
|
from abc import ABC, abstractmethod
|
|
15
15
|
from typing import List, Optional, Tuple
|
|
16
16
|
|
|
@@ -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
|
from collections import defaultdict
|
|
15
15
|
from typing import Dict, List, Optional, Tuple
|
|
16
16
|
|
|
@@ -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
|
from typing import Optional, Tuple
|
|
15
15
|
|
|
16
16
|
from camel.terminators.base import BaseTerminator
|