camel-ai 0.2.65__py3-none-any.whl → 0.2.83a6__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 +5107 -995
- 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 +29 -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/function_gemma_config.py +59 -0
- 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 +109 -230
- 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 +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 +214 -115
- camel/models/base_audio_model.py +5 -3
- camel/models/base_model.py +378 -31
- camel/models/cerebras_model.py +83 -0
- camel/models/cohere_model.py +18 -49
- camel/models/cometapi_model.py +83 -0
- camel/models/crynux_model.py +11 -18
- camel/models/deepseek_model.py +20 -84
- camel/models/fish_audio_model.py +8 -2
- camel/models/function_gemma_model.py +889 -0
- camel/models/gemini_model.py +391 -52
- camel/models/groq_model.py +11 -19
- camel/models/internlm_model.py +11 -18
- camel/models/litellm_model.py +57 -49
- camel/models/lmstudio_model.py +17 -20
- camel/models/minimax_model.py +83 -0
- camel/models/mistral_model.py +20 -47
- camel/models/model_factory.py +39 -3
- camel/models/model_manager.py +26 -8
- camel/models/modelscope_model.py +13 -193
- camel/models/moonshot_model.py +183 -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 +190 -71
- camel/models/openai_model.py +192 -86
- 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 +23 -49
- 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 +50 -75
- camel/models/sglang_model.py +90 -68
- 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 +158 -19
- camel/models/watsonx_model.py +9 -47
- 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 +145 -0
- camel/societies/workforce/prompts.py +259 -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 +5354 -372
- 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 +57 -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 +106 -6
- 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 +205 -27
- 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 +1958 -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 +1940 -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 +325 -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 +728 -0
- camel/toolkits/microsoft_outlook_mail_toolkit.py +1885 -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 +606 -156
- 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 +1281 -0
- camel/toolkits/terminal_toolkit/utils.py +659 -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 +381 -41
- camel/types/mcp_registries.py +2 -2
- camel/types/openai_types.py +4 -4
- camel/types/unified_model_type.py +46 -10
- camel/utils/__init__.py +5 -2
- camel/utils/agent_context.py +41 -0
- 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 +18 -10
- 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.83a6.dist-info}/METADATA +355 -117
- camel_ai-0.2.83a6.dist-info/RECORD +511 -0
- {camel_ai-0.2.65.dist-info → camel_ai-0.2.83a6.dist-info}/WHEEL +1 -1
- {camel_ai-0.2.65.dist-info → camel_ai-0.2.83a6.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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2026 @ 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,19 +10,25 @@
|
|
|
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-2026 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
import asyncio
|
|
15
|
+
from collections import defaultdict, deque
|
|
15
16
|
from enum import Enum
|
|
16
|
-
from typing import Dict, List, Optional
|
|
17
|
+
from typing import Dict, List, Optional, Set
|
|
17
18
|
|
|
19
|
+
from camel.logger import get_logger
|
|
18
20
|
from camel.tasks import Task
|
|
19
21
|
|
|
22
|
+
logger = get_logger(__name__)
|
|
23
|
+
|
|
20
24
|
|
|
21
25
|
class PacketStatus(Enum):
|
|
22
26
|
r"""The status of a packet. The packet can be in one of the following
|
|
23
27
|
states:
|
|
24
28
|
|
|
25
29
|
- ``SENT``: The packet has been sent to a worker.
|
|
30
|
+
- ``PROCESSING``: The packet has been claimed by a worker and is being
|
|
31
|
+
processed.
|
|
26
32
|
- ``RETURNED``: The packet has been returned by the worker, meaning that
|
|
27
33
|
the status of the task inside has been updated.
|
|
28
34
|
- ``ARCHIVED``: The packet has been archived, meaning that the content of
|
|
@@ -31,6 +37,7 @@ class PacketStatus(Enum):
|
|
|
31
37
|
"""
|
|
32
38
|
|
|
33
39
|
SENT = "SENT"
|
|
40
|
+
PROCESSING = "PROCESSING"
|
|
34
41
|
RETURNED = "RETURNED"
|
|
35
42
|
ARCHIVED = "ARCHIVED"
|
|
36
43
|
|
|
@@ -76,41 +83,121 @@ class Packet:
|
|
|
76
83
|
|
|
77
84
|
|
|
78
85
|
class TaskChannel:
|
|
79
|
-
r"""An internal class used by Workforce to manage tasks.
|
|
86
|
+
r"""An internal class used by Workforce to manage tasks.
|
|
87
|
+
|
|
88
|
+
This implementation uses a hybrid data structure approach:
|
|
89
|
+
- Hash map (_task_dict) for O(1) task lookup by ID
|
|
90
|
+
- Status-based index (_task_by_status) for efficient filtering by status
|
|
91
|
+
- Assignee/publisher queues for ordered task processing
|
|
92
|
+
"""
|
|
80
93
|
|
|
81
94
|
def __init__(self) -> None:
|
|
82
|
-
self._task_id_list: List[str] = []
|
|
83
95
|
self._condition = asyncio.Condition()
|
|
84
96
|
self._task_dict: Dict[str, Packet] = {}
|
|
85
97
|
|
|
98
|
+
self._task_by_status: Dict[PacketStatus, Set[str]] = defaultdict(set)
|
|
99
|
+
|
|
100
|
+
# task by assignee store which are sent to
|
|
101
|
+
self._task_by_assignee: Dict[str, deque[str]] = defaultdict(deque)
|
|
102
|
+
|
|
103
|
+
self._task_by_publisher: Dict[str, deque[str]] = defaultdict(deque)
|
|
104
|
+
|
|
105
|
+
def _update_task_status(
|
|
106
|
+
self, task_id: str, new_status: PacketStatus
|
|
107
|
+
) -> None:
|
|
108
|
+
r"""Helper method to properly update task status in all indexes."""
|
|
109
|
+
if task_id not in self._task_dict:
|
|
110
|
+
return
|
|
111
|
+
|
|
112
|
+
packet = self._task_dict[task_id]
|
|
113
|
+
old_status = packet.status
|
|
114
|
+
|
|
115
|
+
if old_status in self._task_by_status:
|
|
116
|
+
self._task_by_status[old_status].discard(task_id)
|
|
117
|
+
|
|
118
|
+
packet.status = new_status
|
|
119
|
+
|
|
120
|
+
self._task_by_status[new_status].add(task_id)
|
|
121
|
+
|
|
122
|
+
def _cleanup_task_from_indexes(self, task_id: str) -> None:
|
|
123
|
+
r"""Helper method to remove a task from all indexes.
|
|
124
|
+
|
|
125
|
+
Args:
|
|
126
|
+
task_id (str): The ID of the task to remove from indexes.
|
|
127
|
+
"""
|
|
128
|
+
if task_id not in self._task_dict:
|
|
129
|
+
return
|
|
130
|
+
|
|
131
|
+
packet = self._task_dict[task_id]
|
|
132
|
+
|
|
133
|
+
if packet.status in self._task_by_status:
|
|
134
|
+
self._task_by_status[packet.status].discard(task_id)
|
|
135
|
+
|
|
136
|
+
if packet.assignee_id and packet.assignee_id in self._task_by_assignee:
|
|
137
|
+
assignee_queue = self._task_by_assignee[packet.assignee_id]
|
|
138
|
+
self._task_by_assignee[packet.assignee_id] = deque(
|
|
139
|
+
task for task in assignee_queue if task != task_id
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
if packet.publisher_id in self._task_by_publisher:
|
|
143
|
+
publisher_queue = self._task_by_publisher[packet.publisher_id]
|
|
144
|
+
self._task_by_publisher[packet.publisher_id] = deque(
|
|
145
|
+
task for task in publisher_queue if task != task_id
|
|
146
|
+
)
|
|
147
|
+
|
|
86
148
|
async def get_returned_task_by_publisher(self, publisher_id: str) -> Task:
|
|
87
149
|
r"""Get a task from the channel that has been returned by the
|
|
88
150
|
publisher.
|
|
89
151
|
"""
|
|
90
152
|
async with self._condition:
|
|
91
153
|
while True:
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
154
|
+
task_ids = self._task_by_publisher[publisher_id]
|
|
155
|
+
|
|
156
|
+
if task_ids:
|
|
157
|
+
task_id = task_ids.popleft()
|
|
158
|
+
|
|
159
|
+
if task_id in self._task_dict:
|
|
160
|
+
packet = self._task_dict[task_id]
|
|
161
|
+
|
|
162
|
+
if (
|
|
163
|
+
packet.status == PacketStatus.RETURNED
|
|
164
|
+
and packet.publisher_id == publisher_id
|
|
165
|
+
):
|
|
166
|
+
# Clean up all indexes before removing
|
|
167
|
+
self._cleanup_task_from_indexes(task_id)
|
|
168
|
+
del self._task_dict[task_id]
|
|
169
|
+
self._condition.notify_all()
|
|
170
|
+
return packet.task
|
|
171
|
+
|
|
99
172
|
await self._condition.wait()
|
|
100
173
|
|
|
101
174
|
async def get_assigned_task_by_assignee(self, assignee_id: str) -> Task:
|
|
102
|
-
r"""
|
|
103
|
-
assignee.
|
|
175
|
+
r"""Atomically get and claim a task from the channel that has been
|
|
176
|
+
assigned to the assignee. This prevents race conditions where multiple
|
|
177
|
+
concurrent calls might retrieve the same task.
|
|
104
178
|
"""
|
|
105
179
|
async with self._condition:
|
|
106
180
|
while True:
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
181
|
+
task_ids = self._task_by_assignee.get(assignee_id, deque())
|
|
182
|
+
|
|
183
|
+
# Process all available tasks until we find a valid one
|
|
184
|
+
while task_ids:
|
|
185
|
+
task_id = task_ids.popleft()
|
|
186
|
+
|
|
187
|
+
if task_id in self._task_dict:
|
|
188
|
+
packet = self._task_dict[task_id]
|
|
189
|
+
|
|
190
|
+
if (
|
|
191
|
+
packet.status == PacketStatus.SENT
|
|
192
|
+
and packet.assignee_id == assignee_id
|
|
193
|
+
):
|
|
194
|
+
# Use helper method to properly update status
|
|
195
|
+
self._update_task_status(
|
|
196
|
+
task_id, PacketStatus.PROCESSING
|
|
197
|
+
)
|
|
198
|
+
self._condition.notify_all()
|
|
199
|
+
return packet.task
|
|
200
|
+
|
|
114
201
|
await self._condition.wait()
|
|
115
202
|
|
|
116
203
|
async def post_task(
|
|
@@ -119,9 +206,10 @@ class TaskChannel:
|
|
|
119
206
|
r"""Send a task to the channel with specified publisher and assignee,
|
|
120
207
|
along with the dependency of the task."""
|
|
121
208
|
async with self._condition:
|
|
122
|
-
self._task_id_list.append(task.id)
|
|
123
209
|
packet = Packet(task, publisher_id, assignee_id)
|
|
124
210
|
self._task_dict[packet.task.id] = packet
|
|
211
|
+
self._task_by_status[PacketStatus.SENT].add(packet.task.id)
|
|
212
|
+
self._task_by_assignee[assignee_id].append(packet.task.id)
|
|
125
213
|
self._condition.notify_all()
|
|
126
214
|
|
|
127
215
|
async def post_dependency(
|
|
@@ -130,53 +218,109 @@ class TaskChannel:
|
|
|
130
218
|
r"""Post a dependency to the channel. A dependency is a task that is
|
|
131
219
|
archived, and will be referenced by other tasks."""
|
|
132
220
|
async with self._condition:
|
|
133
|
-
self._task_id_list.append(dependency.id)
|
|
134
221
|
packet = Packet(
|
|
135
222
|
dependency, publisher_id, status=PacketStatus.ARCHIVED
|
|
136
223
|
)
|
|
137
224
|
self._task_dict[packet.task.id] = packet
|
|
225
|
+
self._task_by_status[PacketStatus.ARCHIVED].add(packet.task.id)
|
|
138
226
|
self._condition.notify_all()
|
|
139
227
|
|
|
140
228
|
async def return_task(self, task_id: str) -> None:
|
|
141
229
|
r"""Return a task to the sender, indicating that the task has been
|
|
142
230
|
processed by the worker."""
|
|
143
231
|
async with self._condition:
|
|
144
|
-
|
|
145
|
-
|
|
232
|
+
if task_id in self._task_dict:
|
|
233
|
+
packet = self._task_dict[task_id]
|
|
234
|
+
# Only add to publisher queue if not already returned
|
|
235
|
+
if packet.status != PacketStatus.RETURNED:
|
|
236
|
+
self._update_task_status(task_id, PacketStatus.RETURNED)
|
|
237
|
+
self._task_by_publisher[packet.publisher_id].append(
|
|
238
|
+
packet.task.id
|
|
239
|
+
)
|
|
146
240
|
self._condition.notify_all()
|
|
147
241
|
|
|
148
242
|
async def archive_task(self, task_id: str) -> None:
|
|
149
243
|
r"""Archive a task in channel, making it to become a dependency."""
|
|
150
244
|
async with self._condition:
|
|
151
|
-
|
|
152
|
-
|
|
245
|
+
if task_id in self._task_dict:
|
|
246
|
+
packet = self._task_dict[task_id]
|
|
247
|
+
# Remove from assignee queue before archiving
|
|
248
|
+
if (
|
|
249
|
+
packet.assignee_id
|
|
250
|
+
and packet.assignee_id in self._task_by_assignee
|
|
251
|
+
):
|
|
252
|
+
assignee_queue = self._task_by_assignee[packet.assignee_id]
|
|
253
|
+
self._task_by_assignee[packet.assignee_id] = deque(
|
|
254
|
+
task for task in assignee_queue if task != task_id
|
|
255
|
+
)
|
|
256
|
+
# Update status (keeps in status index for dependencies)
|
|
257
|
+
self._update_task_status(task_id, PacketStatus.ARCHIVED)
|
|
153
258
|
self._condition.notify_all()
|
|
154
259
|
|
|
155
260
|
async def remove_task(self, task_id: str) -> None:
|
|
156
261
|
r"""Remove a task from the channel."""
|
|
157
262
|
async with self._condition:
|
|
158
|
-
|
|
159
|
-
self._task_dict
|
|
263
|
+
# Check if task ID exists before removing
|
|
264
|
+
if task_id in self._task_dict:
|
|
265
|
+
# Clean up all indexes before removing
|
|
266
|
+
self._cleanup_task_from_indexes(task_id)
|
|
267
|
+
del self._task_dict[task_id]
|
|
160
268
|
self._condition.notify_all()
|
|
161
269
|
|
|
162
270
|
async def get_dependency_ids(self) -> List[str]:
|
|
163
271
|
r"""Get the IDs of all dependencies in the channel."""
|
|
164
272
|
async with self._condition:
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
273
|
+
return list(self._task_by_status[PacketStatus.ARCHIVED])
|
|
274
|
+
|
|
275
|
+
async def get_in_flight_tasks(self, publisher_id: str) -> List[Task]:
|
|
276
|
+
r"""Get all tasks that are currently in-flight (SENT, RETURNED
|
|
277
|
+
or PROCESSING) published by the given publisher.
|
|
278
|
+
|
|
279
|
+
Args:
|
|
280
|
+
publisher_id (str): The ID of the publisher whose
|
|
281
|
+
in-flight tasks to retrieve.
|
|
282
|
+
|
|
283
|
+
Returns:
|
|
284
|
+
List[Task]: List of tasks that are currently in-flight.
|
|
285
|
+
"""
|
|
286
|
+
async with self._condition:
|
|
287
|
+
in_flight_tasks = []
|
|
288
|
+
seen_task_ids = set() # Track seen IDs for duplicate detection
|
|
289
|
+
|
|
290
|
+
# Get tasks with SENT, RETURNED or PROCESSING
|
|
291
|
+
# status published by this publisher
|
|
292
|
+
for status in [
|
|
293
|
+
PacketStatus.SENT,
|
|
294
|
+
PacketStatus.PROCESSING,
|
|
295
|
+
PacketStatus.RETURNED,
|
|
296
|
+
]:
|
|
297
|
+
for task_id in self._task_by_status[status]:
|
|
298
|
+
if task_id in self._task_dict:
|
|
299
|
+
packet = self._task_dict[task_id]
|
|
300
|
+
if packet.publisher_id == publisher_id:
|
|
301
|
+
# Defensive check: detect if task appears in
|
|
302
|
+
# multiple status sets (should never happen)
|
|
303
|
+
if task_id in seen_task_ids:
|
|
304
|
+
logger.warning(
|
|
305
|
+
f"Task {task_id} found in multiple "
|
|
306
|
+
f"status sets. This indicates a bug in "
|
|
307
|
+
f"status management."
|
|
308
|
+
)
|
|
309
|
+
continue
|
|
310
|
+
in_flight_tasks.append(packet.task)
|
|
311
|
+
seen_task_ids.add(task_id)
|
|
312
|
+
|
|
313
|
+
return in_flight_tasks
|
|
171
314
|
|
|
172
315
|
async def get_task_by_id(self, task_id: str) -> Task:
|
|
173
316
|
r"""Get a task from the channel by its ID."""
|
|
174
317
|
async with self._condition:
|
|
175
|
-
|
|
318
|
+
packet = self._task_dict.get(task_id)
|
|
319
|
+
if packet is None:
|
|
176
320
|
raise ValueError(f"Task {task_id} not found.")
|
|
177
|
-
return
|
|
321
|
+
return packet.task
|
|
178
322
|
|
|
179
323
|
async def get_channel_debug_info(self) -> str:
|
|
180
324
|
r"""Get the debug information of the channel."""
|
|
181
325
|
async with self._condition:
|
|
182
|
-
return str(self._task_dict)
|
|
326
|
+
return str(self._task_dict)
|