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
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
# you may not use this file except in compliance with the License.
|
|
4
|
+
# You may obtain a copy of the License at
|
|
5
|
+
#
|
|
6
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
+
#
|
|
8
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
9
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
10
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
|
+
# See the License for the specific language governing permissions and
|
|
12
|
+
# limitations under the License.
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
|
+
import asyncio
|
|
15
|
+
from typing import Any, ClassVar, Dict, List, Optional, Tuple, Union
|
|
16
|
+
|
|
17
|
+
from camel.interpreters.base import BaseInterpreter
|
|
18
|
+
from camel.interpreters.interpreter_error import InterpreterError
|
|
19
|
+
from camel.logger import get_logger
|
|
20
|
+
|
|
21
|
+
logger = get_logger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class MicrosandboxInterpreter(BaseInterpreter):
|
|
25
|
+
r"""Microsandbox Code Interpreter implementation.
|
|
26
|
+
|
|
27
|
+
This interpreter provides secure code execution using microsandbox,
|
|
28
|
+
a self-hosted platform for secure execution of untrusted user/AI code.
|
|
29
|
+
It supports Python code execution via PythonSandbox, JavaScript/Node.js
|
|
30
|
+
code execution via NodeSandbox, and shell commands via the command
|
|
31
|
+
interface.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
require_confirm (bool, optional): If True, prompt user before running
|
|
35
|
+
code strings for security. (default: :obj:`True`)
|
|
36
|
+
server_url (str, optional): URL of the microsandbox server. If not
|
|
37
|
+
provided, will use MSB_SERVER_URL environment variable, then
|
|
38
|
+
fall back to http://127.0.0.1:5555. (default: :obj:`None`)
|
|
39
|
+
api_key (str, optional): API key for microsandbox authentication.
|
|
40
|
+
If not provided, will use MSB_API_KEY environment variable.
|
|
41
|
+
(default: :obj:`None`)
|
|
42
|
+
namespace (str, optional): Namespace for the sandbox.
|
|
43
|
+
(default: :obj:`"default"`)
|
|
44
|
+
sandbox_name (str, optional): Name of the sandbox instance. If not
|
|
45
|
+
provided, a random name will be generated by the SDK.
|
|
46
|
+
(default: :obj:`None`)
|
|
47
|
+
timeout (int, optional): Default timeout for code execution in seconds.
|
|
48
|
+
(default: :obj:`30`)
|
|
49
|
+
|
|
50
|
+
Environment Variables:
|
|
51
|
+
MSB_SERVER_URL: URL of the microsandbox server.
|
|
52
|
+
MSB_API_KEY: API key for microsandbox authentication.
|
|
53
|
+
|
|
54
|
+
Note:
|
|
55
|
+
The SDK handles parameter priority as: user parameter > environment
|
|
56
|
+
variable > default value.
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
_CODE_TYPE_MAPPING: ClassVar[Dict[str, str]] = {
|
|
60
|
+
# Python code - uses PythonSandbox
|
|
61
|
+
"python": "python_sandbox",
|
|
62
|
+
"py3": "python_sandbox",
|
|
63
|
+
"python3": "python_sandbox",
|
|
64
|
+
"py": "python_sandbox",
|
|
65
|
+
# JavaScript/Node.js code - uses NodeSandbox
|
|
66
|
+
"javascript": "node_sandbox",
|
|
67
|
+
"js": "node_sandbox",
|
|
68
|
+
"node": "node_sandbox",
|
|
69
|
+
"typescript": "node_sandbox",
|
|
70
|
+
"ts": "node_sandbox",
|
|
71
|
+
# Shell commands - uses command.run()
|
|
72
|
+
"bash": "shell_command",
|
|
73
|
+
"shell": "shell_command",
|
|
74
|
+
"sh": "shell_command",
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
def __init__(
|
|
78
|
+
self,
|
|
79
|
+
require_confirm: bool = True,
|
|
80
|
+
server_url: Optional[str] = None,
|
|
81
|
+
api_key: Optional[str] = None,
|
|
82
|
+
namespace: str = "default",
|
|
83
|
+
sandbox_name: Optional[str] = None,
|
|
84
|
+
timeout: int = 30,
|
|
85
|
+
) -> None:
|
|
86
|
+
from microsandbox import (
|
|
87
|
+
NodeSandbox,
|
|
88
|
+
PythonSandbox,
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# Store parameters, let SDK handle defaults and environment variables
|
|
92
|
+
self.require_confirm = require_confirm
|
|
93
|
+
self.server_url = server_url # None means use SDK default logic
|
|
94
|
+
self.api_key = api_key # None means use SDK default logic
|
|
95
|
+
self.namespace = namespace
|
|
96
|
+
self.sandbox_name = (
|
|
97
|
+
sandbox_name # None means SDK generates random name
|
|
98
|
+
)
|
|
99
|
+
self.timeout = timeout
|
|
100
|
+
|
|
101
|
+
# Store sandbox configuration
|
|
102
|
+
self._sandbox_config = {
|
|
103
|
+
"server_url": self.server_url,
|
|
104
|
+
"namespace": self.namespace,
|
|
105
|
+
"name": self.sandbox_name,
|
|
106
|
+
"api_key": self.api_key,
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
# Store sandbox classes for reuse
|
|
110
|
+
self._PythonSandbox = PythonSandbox
|
|
111
|
+
self._NodeSandbox = NodeSandbox
|
|
112
|
+
|
|
113
|
+
# Log initialization info
|
|
114
|
+
logger.info("Initialized MicrosandboxInterpreter")
|
|
115
|
+
logger.info(f"Namespace: {self.namespace}")
|
|
116
|
+
if self.sandbox_name:
|
|
117
|
+
logger.info(f"Sandbox name: {self.sandbox_name}")
|
|
118
|
+
else:
|
|
119
|
+
logger.info("Sandbox name: will be auto-generated by SDK")
|
|
120
|
+
|
|
121
|
+
def run(
|
|
122
|
+
self,
|
|
123
|
+
code: str,
|
|
124
|
+
code_type: str = "python",
|
|
125
|
+
) -> str:
|
|
126
|
+
r"""Executes the given code in the microsandbox.
|
|
127
|
+
|
|
128
|
+
Args:
|
|
129
|
+
code (str): The code string to execute.
|
|
130
|
+
code_type (str): The type of code to execute. Supported types:
|
|
131
|
+
'python', 'javascript', 'bash'. (default: :obj:`python`)
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
str: The string representation of the output of the executed code.
|
|
135
|
+
|
|
136
|
+
Raises:
|
|
137
|
+
InterpreterError: If the `code_type` is not supported or if any
|
|
138
|
+
runtime error occurs during the execution of the code.
|
|
139
|
+
"""
|
|
140
|
+
if code_type not in self._CODE_TYPE_MAPPING:
|
|
141
|
+
raise InterpreterError(
|
|
142
|
+
f"Unsupported code type {code_type}. "
|
|
143
|
+
f"`{self.__class__.__name__}` only supports "
|
|
144
|
+
f"{', '.join(list(self._CODE_TYPE_MAPPING.keys()))}."
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
# Print code for security checking
|
|
148
|
+
if self.require_confirm:
|
|
149
|
+
logger.info(
|
|
150
|
+
f"The following {code_type} code will run on "
|
|
151
|
+
f"microsandbox: {code}"
|
|
152
|
+
)
|
|
153
|
+
self._confirm_execution("code")
|
|
154
|
+
|
|
155
|
+
# Run the code asynchronously
|
|
156
|
+
return asyncio.run(self._run_async(code, code_type))
|
|
157
|
+
|
|
158
|
+
async def _run_async(self, code: str, code_type: str) -> str:
|
|
159
|
+
r"""Asynchronously executes code in microsandbox.
|
|
160
|
+
|
|
161
|
+
Args:
|
|
162
|
+
code (str): The code to execute.
|
|
163
|
+
code_type (str): The type of code to execute.
|
|
164
|
+
|
|
165
|
+
Returns:
|
|
166
|
+
str: The output of the executed code.
|
|
167
|
+
|
|
168
|
+
Raises:
|
|
169
|
+
InterpreterError: If execution fails.
|
|
170
|
+
"""
|
|
171
|
+
try:
|
|
172
|
+
execution_method = self._CODE_TYPE_MAPPING[code_type]
|
|
173
|
+
|
|
174
|
+
if execution_method == "python_sandbox":
|
|
175
|
+
return await self._run_python_code(code)
|
|
176
|
+
elif execution_method == "node_sandbox":
|
|
177
|
+
return await self._run_node_code(code)
|
|
178
|
+
elif execution_method == "shell_command":
|
|
179
|
+
return await self._run_shell_command(code)
|
|
180
|
+
else:
|
|
181
|
+
raise InterpreterError(
|
|
182
|
+
f"Unsupported execution method: {execution_method}"
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
except Exception as e:
|
|
186
|
+
raise InterpreterError(
|
|
187
|
+
f"Error executing code in microsandbox: {e}"
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
async def _run_python_code(self, code: str) -> str:
|
|
191
|
+
r"""Execute Python code using PythonSandbox.
|
|
192
|
+
|
|
193
|
+
Args:
|
|
194
|
+
code (str): Python code to execute.
|
|
195
|
+
|
|
196
|
+
Returns:
|
|
197
|
+
str: Execution output.
|
|
198
|
+
"""
|
|
199
|
+
async with self._PythonSandbox.create(
|
|
200
|
+
**self._sandbox_config
|
|
201
|
+
) as sandbox:
|
|
202
|
+
execution = await asyncio.wait_for(
|
|
203
|
+
sandbox.run(code), timeout=self.timeout
|
|
204
|
+
)
|
|
205
|
+
return await self._get_execution_output(execution)
|
|
206
|
+
|
|
207
|
+
async def _run_node_code(self, code: str) -> str:
|
|
208
|
+
r"""Execute JavaScript/Node.js code using NodeSandbox.
|
|
209
|
+
|
|
210
|
+
Args:
|
|
211
|
+
code (str): JavaScript/Node.js code to execute.
|
|
212
|
+
|
|
213
|
+
Returns:
|
|
214
|
+
str: Execution output.
|
|
215
|
+
"""
|
|
216
|
+
async with self._NodeSandbox.create(**self._sandbox_config) as sandbox:
|
|
217
|
+
execution = await asyncio.wait_for(
|
|
218
|
+
sandbox.run(code), timeout=self.timeout
|
|
219
|
+
)
|
|
220
|
+
return await self._get_execution_output(execution)
|
|
221
|
+
|
|
222
|
+
async def _run_shell_command(self, code: str) -> str:
|
|
223
|
+
r"""Execute shell commands directly.
|
|
224
|
+
|
|
225
|
+
Args:
|
|
226
|
+
code (str): Shell command to execute.
|
|
227
|
+
|
|
228
|
+
Returns:
|
|
229
|
+
str: Command execution output.
|
|
230
|
+
"""
|
|
231
|
+
# Use any sandbox for shell commands
|
|
232
|
+
async with self._PythonSandbox.create(
|
|
233
|
+
**self._sandbox_config
|
|
234
|
+
) as sandbox:
|
|
235
|
+
execution = await asyncio.wait_for(
|
|
236
|
+
sandbox.command.run("bash", ["-c", code]), timeout=self.timeout
|
|
237
|
+
)
|
|
238
|
+
return await self._get_command_output(execution)
|
|
239
|
+
|
|
240
|
+
async def _get_execution_output(self, execution) -> str:
|
|
241
|
+
r"""Get output from code execution.
|
|
242
|
+
|
|
243
|
+
Args:
|
|
244
|
+
execution: Execution object from sandbox.run().
|
|
245
|
+
|
|
246
|
+
Returns:
|
|
247
|
+
str: Formatted execution output.
|
|
248
|
+
"""
|
|
249
|
+
output = await execution.output()
|
|
250
|
+
error = await execution.error()
|
|
251
|
+
|
|
252
|
+
result_parts = []
|
|
253
|
+
if output and output.strip():
|
|
254
|
+
result_parts.append(output.strip())
|
|
255
|
+
if error and error.strip():
|
|
256
|
+
result_parts.append(f"STDERR: {error.strip()}")
|
|
257
|
+
|
|
258
|
+
return (
|
|
259
|
+
"\n".join(result_parts)
|
|
260
|
+
if result_parts
|
|
261
|
+
else "Code executed successfully (no output)"
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
async def _get_command_output(self, execution) -> str:
|
|
265
|
+
r"""Get output from command execution.
|
|
266
|
+
|
|
267
|
+
Args:
|
|
268
|
+
execution: CommandExecution object from sandbox.command.run().
|
|
269
|
+
|
|
270
|
+
Returns:
|
|
271
|
+
str: Formatted command output.
|
|
272
|
+
"""
|
|
273
|
+
output = await execution.output()
|
|
274
|
+
error = await execution.error()
|
|
275
|
+
|
|
276
|
+
result_parts = []
|
|
277
|
+
if output and output.strip():
|
|
278
|
+
result_parts.append(output.strip())
|
|
279
|
+
if error and error.strip():
|
|
280
|
+
result_parts.append(f"STDERR: {error.strip()}")
|
|
281
|
+
if hasattr(execution, 'exit_code') and execution.exit_code != 0:
|
|
282
|
+
result_parts.append(f"Exit code: {execution.exit_code}")
|
|
283
|
+
|
|
284
|
+
return (
|
|
285
|
+
"\n".join(result_parts)
|
|
286
|
+
if result_parts
|
|
287
|
+
else "Command executed successfully (no output)"
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
def _confirm_execution(self, execution_type: str) -> None:
|
|
291
|
+
r"""Prompt user for confirmation before executing code or commands.
|
|
292
|
+
|
|
293
|
+
Args:
|
|
294
|
+
execution_type (str): Type of execution ('code' or 'command').
|
|
295
|
+
|
|
296
|
+
Raises:
|
|
297
|
+
InterpreterError: If user declines to run the code/command.
|
|
298
|
+
"""
|
|
299
|
+
while True:
|
|
300
|
+
choice = input(f"Running {execution_type}? [Y/n]:").lower()
|
|
301
|
+
if choice in ["y", "yes", "ye"]:
|
|
302
|
+
break
|
|
303
|
+
elif choice not in ["no", "n"]:
|
|
304
|
+
continue
|
|
305
|
+
raise InterpreterError(
|
|
306
|
+
f"Execution halted: User opted not to run the "
|
|
307
|
+
f"{execution_type}. "
|
|
308
|
+
f"This choice stops the current operation and any "
|
|
309
|
+
f"further {execution_type} execution."
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
def supported_code_types(self) -> List[str]:
|
|
313
|
+
r"""Provides supported code types by the interpreter."""
|
|
314
|
+
return list(self._CODE_TYPE_MAPPING.keys())
|
|
315
|
+
|
|
316
|
+
def update_action_space(self, action_space: Dict[str, Any]) -> None:
|
|
317
|
+
r"""Updates action space for interpreter.
|
|
318
|
+
|
|
319
|
+
Args:
|
|
320
|
+
action_space: Action space dictionary (unused in microsandbox).
|
|
321
|
+
|
|
322
|
+
Note:
|
|
323
|
+
Microsandbox doesn't support action space updates as it runs
|
|
324
|
+
in isolated environments for each execution.
|
|
325
|
+
"""
|
|
326
|
+
# Explicitly acknowledge the parameter to avoid linting warnings
|
|
327
|
+
_ = action_space
|
|
328
|
+
logger.warning(
|
|
329
|
+
"Microsandbox doesn't support action space updates. "
|
|
330
|
+
"Code runs in isolated environments for each execution."
|
|
331
|
+
)
|
|
332
|
+
|
|
333
|
+
def execute_command(self, command: str) -> Union[str, Tuple[str, str]]:
|
|
334
|
+
r"""Execute a shell command in the microsandbox.
|
|
335
|
+
|
|
336
|
+
This method is designed for package management and system
|
|
337
|
+
administration tasks. It executes shell commands directly
|
|
338
|
+
using the microsandbox command interface.
|
|
339
|
+
|
|
340
|
+
Args:
|
|
341
|
+
command (str): The shell command to execute (e.g.,
|
|
342
|
+
"pip install numpy", "ls -la", "apt-get update").
|
|
343
|
+
|
|
344
|
+
Returns:
|
|
345
|
+
Union[str, Tuple[str, str]]: The output of the command.
|
|
346
|
+
|
|
347
|
+
Examples:
|
|
348
|
+
>>> interpreter.execute_command("pip install numpy")
|
|
349
|
+
>>> interpreter.execute_command("npm install express")
|
|
350
|
+
>>> interpreter.execute_command("ls -la /tmp")
|
|
351
|
+
"""
|
|
352
|
+
# Print command for security checking
|
|
353
|
+
if self.require_confirm:
|
|
354
|
+
logger.info(
|
|
355
|
+
f"The following shell command will run on "
|
|
356
|
+
f"microsandbox: {command}"
|
|
357
|
+
)
|
|
358
|
+
self._confirm_execution("command")
|
|
359
|
+
|
|
360
|
+
return asyncio.run(self._execute_command_async(command))
|
|
361
|
+
|
|
362
|
+
async def _execute_command_async(self, command: str) -> str:
|
|
363
|
+
r"""Asynchronously executes a shell command in microsandbox.
|
|
364
|
+
|
|
365
|
+
Args:
|
|
366
|
+
command (str): The shell command to execute.
|
|
367
|
+
|
|
368
|
+
Returns:
|
|
369
|
+
str: The output of the command execution.
|
|
370
|
+
|
|
371
|
+
Raises:
|
|
372
|
+
InterpreterError: If execution fails.
|
|
373
|
+
"""
|
|
374
|
+
try:
|
|
375
|
+
async with self._PythonSandbox.create(
|
|
376
|
+
**self._sandbox_config
|
|
377
|
+
) as sandbox:
|
|
378
|
+
execution = await asyncio.wait_for(
|
|
379
|
+
sandbox.command.run("bash", ["-c", command]),
|
|
380
|
+
timeout=self.timeout,
|
|
381
|
+
)
|
|
382
|
+
return await self._get_command_output(execution)
|
|
383
|
+
|
|
384
|
+
except Exception as e:
|
|
385
|
+
raise InterpreterError(
|
|
386
|
+
f"Error executing command in microsandbox: {e}"
|
|
387
|
+
)
|
|
388
|
+
|
|
389
|
+
def __del__(self) -> None:
|
|
390
|
+
r"""Destructor for the MicrosandboxInterpreter class.
|
|
391
|
+
|
|
392
|
+
Microsandbox uses context managers for resource management,
|
|
393
|
+
so no explicit cleanup is needed.
|
|
394
|
+
"""
|
|
395
|
+
logger.debug("MicrosandboxInterpreter cleaned up")
|
|
@@ -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
|
|
|
15
15
|
import os
|
|
16
16
|
import subprocess
|
camel/loaders/__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
|
|
|
15
15
|
from .apify_reader import Apify
|
|
16
16
|
from .base_io import File, create_file, create_file_from_raw_bytes
|
|
@@ -21,7 +21,6 @@ from .jina_url_reader import JinaURLReader
|
|
|
21
21
|
from .markitdown import MarkItDownLoader
|
|
22
22
|
from .mineru_extractor import MinerU
|
|
23
23
|
from .mistral_reader import MistralReader
|
|
24
|
-
from .pandas_reader import PandasReader
|
|
25
24
|
from .scrapegraph_reader import ScrapeGraphAI
|
|
26
25
|
from .unstructured_io import UnstructuredIO
|
|
27
26
|
|
|
@@ -33,7 +32,6 @@ __all__ = [
|
|
|
33
32
|
'JinaURLReader',
|
|
34
33
|
'Firecrawl',
|
|
35
34
|
'Apify',
|
|
36
|
-
'PandasReader',
|
|
37
35
|
'ChunkrReader',
|
|
38
36
|
'ChunkrReaderConfig',
|
|
39
37
|
'MinerU',
|
|
@@ -42,3 +40,14 @@ __all__ = [
|
|
|
42
40
|
'ScrapeGraphAI',
|
|
43
41
|
'MistralReader',
|
|
44
42
|
]
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def __getattr__(name: str):
|
|
46
|
+
if name == 'PandasReader':
|
|
47
|
+
raise ImportError(
|
|
48
|
+
"PandasReader has been removed from camel.loaders. "
|
|
49
|
+
"The pandasai dependency limited pandas to version 1.5.3. "
|
|
50
|
+
"Please use ExcelToolkit from camel.toolkits instead for "
|
|
51
|
+
"handling structured data."
|
|
52
|
+
)
|
|
53
|
+
raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
|
camel/loaders/apify_reader.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
3
|
# you may not use this file except in compliance with the License.
|
|
4
4
|
# You may obtain a copy of the License at
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
|
-
# ========= Copyright 2023-
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
import os
|
|
15
15
|
from typing import TYPE_CHECKING, List, Optional
|
|
16
16
|
|
camel/loaders/base_io.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
3
|
# you may not use this file except in compliance with the License.
|
|
4
4
|
# You may obtain a copy of the License at
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
|
-
# ========= Copyright 2023-
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
import json
|
|
15
15
|
import re
|
|
16
16
|
from abc import ABC, abstractmethod
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
# you may not use this file except in compliance with the License.
|
|
4
|
+
# You may obtain a copy of the License at
|
|
5
|
+
#
|
|
6
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
+
#
|
|
8
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
9
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
10
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
|
+
# See the License for the specific language governing permissions and
|
|
12
|
+
# limitations under the License.
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
|
+
from abc import ABC, abstractmethod
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from typing import Any, Dict, List, Union
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class BaseLoader(ABC):
|
|
20
|
+
r"""Abstract base class for all data loaders in CAMEL."""
|
|
21
|
+
|
|
22
|
+
@abstractmethod
|
|
23
|
+
def _load_single(self, source: Union[str, Path]) -> Dict[str, Any]:
|
|
24
|
+
r"""Load data from a single source.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
source (Union[str, Path]): The data source to load from.
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
Dict[str, Any]: A dictionary containing the loaded data. It is
|
|
31
|
+
recommended that the dictionary includes a "content" key with
|
|
32
|
+
the primary data and optional metadata keys.
|
|
33
|
+
"""
|
|
34
|
+
pass
|
|
35
|
+
|
|
36
|
+
def load(
|
|
37
|
+
self,
|
|
38
|
+
source: Union[str, Path, List[Union[str, Path]]],
|
|
39
|
+
) -> Dict[str, List[Dict[str, Any]]]:
|
|
40
|
+
r"""Load data from one or multiple sources.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
source (Union[str, Path, List[Union[str, Path]]]): The data source
|
|
44
|
+
(s) to load from. Can be:
|
|
45
|
+
- A single path/URL (str or Path)
|
|
46
|
+
- A list of paths/URLs
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
Dict[str, List[Dict[str, Any]]]: A dictionary with a single key
|
|
50
|
+
"contents" containing a list of loaded data. If a single source
|
|
51
|
+
is provided, the list will contain a single item.
|
|
52
|
+
|
|
53
|
+
Raises:
|
|
54
|
+
ValueError: If no sources are provided
|
|
55
|
+
Exception: If loading fails for any source
|
|
56
|
+
"""
|
|
57
|
+
if not source:
|
|
58
|
+
raise ValueError("At least one source must be provided")
|
|
59
|
+
|
|
60
|
+
# Convert single source to list for uniform processing
|
|
61
|
+
sources = [source] if isinstance(source, (str, Path)) else list(source)
|
|
62
|
+
|
|
63
|
+
# Process all sources
|
|
64
|
+
results = []
|
|
65
|
+
for i, src in enumerate(sources, 1):
|
|
66
|
+
try:
|
|
67
|
+
content = self._load_single(src)
|
|
68
|
+
results.append(content)
|
|
69
|
+
except Exception as e:
|
|
70
|
+
raise RuntimeError(
|
|
71
|
+
f"Error loading source {i}/{len(sources)}: {src}"
|
|
72
|
+
) from e
|
|
73
|
+
|
|
74
|
+
return {"contents": results}
|
|
75
|
+
|
|
76
|
+
@property
|
|
77
|
+
@abstractmethod
|
|
78
|
+
def supported_formats(self) -> set[str]:
|
|
79
|
+
r"""Get the set of supported file formats or data sources.
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
set[str]: A set of strings representing the supported formats/
|
|
83
|
+
sources.
|
|
84
|
+
"""
|
|
85
|
+
pass
|
camel/loaders/chunkr_reader.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
|
|
|
15
15
|
import json
|
|
16
16
|
import os
|
|
@@ -34,6 +34,12 @@ class ChunkrReaderConfig:
|
|
|
34
34
|
high_resolution (bool, optional): Whether to use high resolution OCR.
|
|
35
35
|
(default: :obj:`True`)
|
|
36
36
|
ocr_strategy (str, optional): The OCR strategy. Defaults to 'Auto'.
|
|
37
|
+
**kwargs: Additional keyword arguments to pass to the Chunkr
|
|
38
|
+
Configuration. This accepts all other Configuration parameters
|
|
39
|
+
such as expires_in, pipeline, segment_processing,
|
|
40
|
+
segmentation_strategy, etc.
|
|
41
|
+
See: https://github.com/lumina-ai-inc/chunkr/blob/main/core/src/
|
|
42
|
+
models/task.rs#L749
|
|
37
43
|
"""
|
|
38
44
|
|
|
39
45
|
def __init__(
|
|
@@ -41,10 +47,12 @@ class ChunkrReaderConfig:
|
|
|
41
47
|
chunk_processing: int = 512,
|
|
42
48
|
high_resolution: bool = True,
|
|
43
49
|
ocr_strategy: str = "Auto",
|
|
50
|
+
**kwargs,
|
|
44
51
|
):
|
|
45
52
|
self.chunk_processing = chunk_processing
|
|
46
53
|
self.high_resolution = high_resolution
|
|
47
54
|
self.ocr_strategy = ocr_strategy
|
|
55
|
+
self.kwargs = kwargs
|
|
48
56
|
|
|
49
57
|
|
|
50
58
|
class ChunkrReader:
|
|
@@ -190,4 +198,5 @@ class ChunkrReader:
|
|
|
190
198
|
"Auto": OcrStrategy.AUTO,
|
|
191
199
|
"All": OcrStrategy.ALL,
|
|
192
200
|
}.get(chunkr_config.ocr_strategy, OcrStrategy.ALL),
|
|
201
|
+
**chunkr_config.kwargs,
|
|
193
202
|
)
|
camel/loaders/crawl4ai_reader.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
|
|
|
15
15
|
import asyncio
|
|
16
16
|
import logging
|
|
@@ -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
|
|
|
15
15
|
import os
|
|
16
16
|
from typing import Any, Dict, Optional
|
|
@@ -98,8 +98,8 @@ class Firecrawl:
|
|
|
98
98
|
def scrape(
|
|
99
99
|
self,
|
|
100
100
|
url: str,
|
|
101
|
-
params: Optional[Dict[str,
|
|
102
|
-
) -> Dict:
|
|
101
|
+
params: Optional[Dict[str, str]] = None,
|
|
102
|
+
) -> Dict[str, str]:
|
|
103
103
|
r"""To scrape a single URL. This function supports advanced scraping
|
|
104
104
|
by setting different parameters and returns the full scraped data as a
|
|
105
105
|
dictionary.
|
|
@@ -108,11 +108,11 @@ class Firecrawl:
|
|
|
108
108
|
|
|
109
109
|
Args:
|
|
110
110
|
url (str): The URL to read.
|
|
111
|
-
params (Optional[Dict[str,
|
|
111
|
+
params (Optional[Dict[str, str]]): Additional parameters for the
|
|
112
112
|
scrape request.
|
|
113
113
|
|
|
114
114
|
Returns:
|
|
115
|
-
Dict: The scraped data.
|
|
115
|
+
Dict[str, str]: The scraped data.
|
|
116
116
|
|
|
117
117
|
Raises:
|
|
118
118
|
RuntimeError: If the scrape process fails.
|
camel/loaders/jina_url_reader.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
|
|
|
15
15
|
import os
|
|
16
16
|
from typing import Any, Optional
|