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/tasks/__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 .task import Task, TaskManager
|
|
15
15
|
from .task_prompt import TASK_DECOMPOSE_PROMPT, TASK_EVOLVE_PROMPT
|
|
16
16
|
|
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
|
|
|
@@ -69,21 +218,45 @@ class Task(BaseModel):
|
|
|
69
218
|
r"""Task is specific assignment that can be passed to a agent.
|
|
70
219
|
|
|
71
220
|
Attributes:
|
|
72
|
-
content: string content for task.
|
|
73
|
-
id: An unique string identifier for the task. This should
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
221
|
+
content (str): string content for task.
|
|
222
|
+
id (str): An unique string identifier for the task. This should
|
|
223
|
+
ideally be provided by the provider/model which created the task.
|
|
224
|
+
(default: :obj:`uuid.uuid4()`)
|
|
225
|
+
state (TaskState): The state which should be OPEN, RUNNING, DONE or
|
|
226
|
+
DELETED. (default: :obj:`TaskState.FAILED`)
|
|
227
|
+
type (Optional[str]): task type. (default: :obj:`None`)
|
|
228
|
+
parent (Optional[Task]): The parent task, None for root task.
|
|
229
|
+
(default: :obj:`None`)
|
|
230
|
+
subtasks (List[Task]): The childrent sub-tasks for the task.
|
|
231
|
+
(default: :obj:`[]`)
|
|
232
|
+
result (Optional[str]): The answer for the task.
|
|
233
|
+
(default: :obj:`""`)
|
|
234
|
+
failure_count (int): The failure count for the task.
|
|
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:`[]`)
|
|
240
|
+
additional_info (Optional[Dict[str, Any]]): Additional information for
|
|
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`)
|
|
80
251
|
"""
|
|
81
252
|
|
|
82
253
|
content: str
|
|
83
254
|
|
|
84
|
-
id: str =
|
|
255
|
+
id: str = Field(default_factory=lambda: str(uuid.uuid4()))
|
|
85
256
|
|
|
86
|
-
state: TaskState =
|
|
257
|
+
state: TaskState = (
|
|
258
|
+
TaskState.FAILED
|
|
259
|
+
) # TODO: Add logic for OPEN in workforce.py
|
|
87
260
|
|
|
88
261
|
type: Optional[str] = None
|
|
89
262
|
|
|
@@ -95,7 +268,29 @@ class Task(BaseModel):
|
|
|
95
268
|
|
|
96
269
|
failure_count: int = 0
|
|
97
270
|
|
|
98
|
-
|
|
271
|
+
assigned_worker_id: Optional[str] = None
|
|
272
|
+
|
|
273
|
+
dependencies: List["Task"] = []
|
|
274
|
+
|
|
275
|
+
additional_info: Optional[Dict[str, Any]] = None
|
|
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
|
+
|
|
287
|
+
def __repr__(self) -> str:
|
|
288
|
+
r"""Return a string representation of the task."""
|
|
289
|
+
content_preview = self.content
|
|
290
|
+
return (
|
|
291
|
+
f"Task(id='{self.id}', content='{content_preview}', "
|
|
292
|
+
f"state='{self.state.value}')"
|
|
293
|
+
)
|
|
99
294
|
|
|
100
295
|
@classmethod
|
|
101
296
|
def from_message(cls, message: BaseMessage) -> "Task":
|
|
@@ -117,7 +312,9 @@ class Task(BaseModel):
|
|
|
117
312
|
|
|
118
313
|
def reset(self):
|
|
119
314
|
r"""Reset Task to initial state."""
|
|
120
|
-
self.state =
|
|
315
|
+
self.state = (
|
|
316
|
+
TaskState.FAILED
|
|
317
|
+
) # TODO: Add logic for OPEN in workforce.py
|
|
121
318
|
self.result = ""
|
|
122
319
|
|
|
123
320
|
def update_result(self, result: str):
|
|
@@ -211,12 +408,15 @@ class Task(BaseModel):
|
|
|
211
408
|
|
|
212
409
|
def decompose(
|
|
213
410
|
self,
|
|
214
|
-
agent: ChatAgent,
|
|
411
|
+
agent: "ChatAgent",
|
|
215
412
|
prompt: Optional[str] = None,
|
|
216
413
|
task_parser: Callable[[str, str], List["Task"]] = parse_response,
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
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.
|
|
220
420
|
|
|
221
421
|
Args:
|
|
222
422
|
agent (ChatAgent): An agent that used to decompose the task.
|
|
@@ -225,9 +425,16 @@ class Task(BaseModel):
|
|
|
225
425
|
task_parser (Callable[[str, str], List[Task]], optional): A
|
|
226
426
|
function to extract Task from response. If not provided,
|
|
227
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.
|
|
228
432
|
|
|
229
433
|
Returns:
|
|
230
|
-
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.
|
|
231
438
|
"""
|
|
232
439
|
|
|
233
440
|
role_name = agent.role_name
|
|
@@ -239,14 +446,136 @@ class Task(BaseModel):
|
|
|
239
446
|
role_name=role_name, content=content
|
|
240
447
|
)
|
|
241
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
|
+
"""
|
|
242
540
|
tasks = task_parser(response.msg.content, self.id)
|
|
243
541
|
for task in tasks:
|
|
244
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
|
+
)
|
|
245
574
|
return tasks
|
|
246
575
|
|
|
247
576
|
def compose(
|
|
248
577
|
self,
|
|
249
|
-
agent: ChatAgent,
|
|
578
|
+
agent: "ChatAgent",
|
|
250
579
|
template: TextPrompt = TASK_COMPOSE_PROMPT,
|
|
251
580
|
result_parser: Optional[Callable[[str], str]] = None,
|
|
252
581
|
):
|
|
@@ -270,6 +599,10 @@ class Task(BaseModel):
|
|
|
270
599
|
role_name=role_name,
|
|
271
600
|
content=self.content,
|
|
272
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,
|
|
273
606
|
other_results=sub_tasks_result,
|
|
274
607
|
)
|
|
275
608
|
msg = BaseMessage.make_user_message(
|
|
@@ -395,12 +728,13 @@ class TaskManager:
|
|
|
395
728
|
def evolve(
|
|
396
729
|
self,
|
|
397
730
|
task: Task,
|
|
398
|
-
agent: ChatAgent,
|
|
731
|
+
agent: "ChatAgent",
|
|
399
732
|
template: Optional[TextPrompt] = None,
|
|
400
733
|
task_parser: Optional[Callable[[str, str], List[Task]]] = None,
|
|
401
734
|
) -> Optional[Task]:
|
|
402
735
|
r"""Evolve a task to a new task.
|
|
403
736
|
Evolve is only used for data generation.
|
|
737
|
+
|
|
404
738
|
Args:
|
|
405
739
|
task (Task): A given task.
|
|
406
740
|
agent (ChatAgent): An agent that used to evolve the task.
|
|
@@ -419,7 +753,12 @@ class TaskManager:
|
|
|
419
753
|
role_name = agent.role_name
|
|
420
754
|
content = template.format(role_name=role_name, content=task.content)
|
|
421
755
|
msg = BaseMessage.make_user_message(
|
|
422
|
-
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,
|
|
423
762
|
)
|
|
424
763
|
response = agent.step(msg)
|
|
425
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
|