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
|
@@ -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 random
|
|
@@ -218,9 +218,34 @@ class SingleStepEnv:
|
|
|
218
218
|
return observations[0] if batch_size == 1 else observations
|
|
219
219
|
|
|
220
220
|
elif isinstance(self.dataset, BaseGenerator):
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
221
|
+
# Generate more data if needed
|
|
222
|
+
if batch_size > len(self.dataset):
|
|
223
|
+
new_datapoints_needed = batch_size - len(self.dataset)
|
|
224
|
+
await self.dataset.generate_new(n=new_datapoints_needed)
|
|
225
|
+
|
|
226
|
+
# Verify that enough data was generated
|
|
227
|
+
if len(self.dataset) < batch_size:
|
|
228
|
+
raise RuntimeError(
|
|
229
|
+
f"Failed to generate enough datapoints. "
|
|
230
|
+
f"Requested {batch_size}, but only "
|
|
231
|
+
f"{len(self.dataset)} available after generation."
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
# Choose sampling strategy based on whether seed is provided
|
|
235
|
+
if seed is not None:
|
|
236
|
+
# Deterministic random sampling when seed is provided
|
|
237
|
+
random_indices = rng.sample(
|
|
238
|
+
range(len(self.dataset)), batch_size
|
|
239
|
+
)
|
|
240
|
+
self._states = [self.dataset[ind] for ind in random_indices]
|
|
241
|
+
else:
|
|
242
|
+
# Sequential sampling when no seed (backward compatible)
|
|
243
|
+
# Use async_sample to maintain sequential behavior
|
|
244
|
+
self._states = [
|
|
245
|
+
await self.dataset.async_sample()
|
|
246
|
+
for _ in range(batch_size)
|
|
247
|
+
]
|
|
248
|
+
|
|
224
249
|
self.current_batch_size = batch_size
|
|
225
250
|
self._states_done = [False] * batch_size
|
|
226
251
|
|
|
@@ -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 math
|
|
15
15
|
import random
|
|
16
16
|
import re
|
|
@@ -483,7 +483,7 @@ class TicTacToeEnv(MultiStepEnv):
|
|
|
483
483
|
# Check all win combinations.
|
|
484
484
|
for a, b, c in TicTacToeEnv.WIN_COMBINATIONS:
|
|
485
485
|
if board[a] != " " and board[a] == board[b] == board[c]:
|
|
486
|
-
return board[a]
|
|
486
|
+
return board[a] # type: ignore[return-value]
|
|
487
487
|
# Check for draw.
|
|
488
488
|
if all(cell != " " for cell in board):
|
|
489
489
|
return "draw"
|
camel/extractors/__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 BaseExtractor, BaseExtractorStrategy
|
|
15
15
|
from .python_strategies import (
|
|
16
16
|
BoxedStrategy,
|
camel/extractors/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
|
|
|
15
15
|
import asyncio
|
|
16
16
|
from abc import ABC, abstractmethod
|
|
@@ -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 ast
|
|
16
16
|
from typing import Optional
|
camel/generators.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 typing import Dict, Generator, List, Optional, Set, Tuple
|
|
15
15
|
|
|
16
16
|
from camel.messages import BaseMessage
|
camel/human.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 typing import Any, Dict, Sequence
|
|
15
15
|
|
|
16
16
|
from colorama import Fore
|
camel/interpreters/__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 .base import BaseInterpreter
|
|
16
16
|
from .docker_interpreter import DockerInterpreter
|
|
@@ -18,6 +18,7 @@ from .e2b_interpreter import E2BInterpreter
|
|
|
18
18
|
from .internal_python_interpreter import InternalPythonInterpreter
|
|
19
19
|
from .interpreter_error import InterpreterError
|
|
20
20
|
from .ipython_interpreter import JupyterKernelInterpreter
|
|
21
|
+
from .microsandbox_interpreter import MicrosandboxInterpreter
|
|
21
22
|
from .subprocess_interpreter import SubprocessInterpreter
|
|
22
23
|
|
|
23
24
|
__all__ = [
|
|
@@ -28,4 +29,5 @@ __all__ = [
|
|
|
28
29
|
'DockerInterpreter',
|
|
29
30
|
'JupyterKernelInterpreter',
|
|
30
31
|
'E2BInterpreter',
|
|
32
|
+
'MicrosandboxInterpreter',
|
|
31
33
|
]
|
camel/interpreters/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,9 +10,9 @@
|
|
|
10
10
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
|
-
# ========= Copyright 2023-
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
from abc import ABC, abstractmethod
|
|
15
|
-
from typing import Any, Dict, List
|
|
15
|
+
from typing import Any, Dict, List, Tuple, Union
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
class BaseInterpreter(ABC):
|
|
@@ -47,3 +47,16 @@ class BaseInterpreter(ABC):
|
|
|
47
47
|
def update_action_space(self, action_space: Dict[str, Any]) -> None:
|
|
48
48
|
r"""Updates action space for *python* interpreter"""
|
|
49
49
|
pass
|
|
50
|
+
|
|
51
|
+
@abstractmethod
|
|
52
|
+
def execute_command(self, command: str) -> Union[str, Tuple[str, str]]:
|
|
53
|
+
r"""Executes a command in the interpreter.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
command (str): The command to execute.
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
Tuple[str, str]: A tuple containing the stdout and stderr of the
|
|
60
|
+
command execution.
|
|
61
|
+
"""
|
|
62
|
+
pass
|
|
@@ -1,12 +1,58 @@
|
|
|
1
|
-
|
|
1
|
+
# syntax=docker/dockerfile:1
|
|
2
|
+
FROM ubuntu:24.04
|
|
3
|
+
|
|
4
|
+
ENV DEBIAN_FRONTEND=noninteractive
|
|
2
5
|
|
|
3
|
-
# Install R and required dependencies
|
|
4
6
|
RUN apt-get update && apt-get install -y \
|
|
5
|
-
|
|
6
|
-
|
|
7
|
+
build-essential \
|
|
8
|
+
software-properties-common \
|
|
9
|
+
curl \
|
|
10
|
+
wget \
|
|
11
|
+
git \
|
|
12
|
+
git-lfs \
|
|
13
|
+
netcat-openbsd \
|
|
14
|
+
sudo \
|
|
15
|
+
tzdata \
|
|
16
|
+
&& rm -rf /var/lib/apt/lists/* \
|
|
17
|
+
&& apt-get clean \
|
|
18
|
+
&& apt-get autoremove -y
|
|
19
|
+
|
|
20
|
+
RUN add-apt-repository ppa:deadsnakes/ppa && \
|
|
21
|
+
apt-get update && \
|
|
22
|
+
apt-get install -y \
|
|
23
|
+
python3.10 \
|
|
24
|
+
python3.10-venv \
|
|
25
|
+
python3.10-dev \
|
|
26
|
+
&& rm -rf /var/lib/apt/lists/* \
|
|
27
|
+
&& apt-get clean \
|
|
28
|
+
&& apt-get autoremove -y
|
|
29
|
+
|
|
30
|
+
RUN python3.10 -m venv /opt/venv
|
|
31
|
+
ENV PATH="/opt/venv/bin:$PATH"
|
|
32
|
+
|
|
33
|
+
RUN pip install --upgrade pip setuptools wheel
|
|
34
|
+
RUN pip install uv
|
|
35
|
+
|
|
36
|
+
RUN ln -sf /opt/venv/bin/python /usr/bin/python
|
|
37
|
+
|
|
38
|
+
RUN apt-get update && \
|
|
39
|
+
apt-get install -y r-base && \
|
|
40
|
+
rm -rf /var/lib/apt/lists/* && \
|
|
41
|
+
apt-get clean && \
|
|
42
|
+
apt-get autoremove -y
|
|
43
|
+
|
|
44
|
+
RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && \
|
|
45
|
+
apt-get install -y nodejs && \
|
|
46
|
+
rm -rf /var/lib/apt/lists/* && \
|
|
47
|
+
apt-get clean && \
|
|
48
|
+
apt-get autoremove -y
|
|
49
|
+
|
|
50
|
+
RUN curl -fsSL https://install.python-poetry.org | python - && \
|
|
51
|
+
ln -s ~/.local/bin/poetry /usr/local/bin/poetry
|
|
7
52
|
|
|
8
|
-
|
|
53
|
+
RUN groupadd -r devuser && useradd -r -m -g devuser devuser
|
|
9
54
|
WORKDIR /workspace
|
|
55
|
+
RUN chown -R devuser:devuser /workspace
|
|
56
|
+
USER devuser
|
|
10
57
|
|
|
11
|
-
|
|
12
|
-
CMD ["tail", "-f", "/dev/null"]
|
|
58
|
+
CMD ["/bin/bash"]
|
|
@@ -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 io
|
|
16
16
|
import shlex
|
|
@@ -53,12 +53,14 @@ class DockerInterpreter(BaseInterpreter):
|
|
|
53
53
|
"python": "python {file_name}",
|
|
54
54
|
"bash": "bash {file_name}",
|
|
55
55
|
"r": "Rscript {file_name}",
|
|
56
|
+
"node": "node {file_name}",
|
|
56
57
|
}
|
|
57
58
|
|
|
58
59
|
_CODE_EXTENSION_MAPPING: ClassVar[Dict[str, str]] = {
|
|
59
60
|
"python": "py",
|
|
60
61
|
"bash": "sh",
|
|
61
62
|
"r": "R",
|
|
63
|
+
"node": "js",
|
|
62
64
|
}
|
|
63
65
|
|
|
64
66
|
_CODE_TYPE_MAPPING: ClassVar[Dict[str, str]] = {
|
|
@@ -71,6 +73,11 @@ class DockerInterpreter(BaseInterpreter):
|
|
|
71
73
|
"sh": "bash",
|
|
72
74
|
"r": "r",
|
|
73
75
|
"R": "r",
|
|
76
|
+
"node": "node",
|
|
77
|
+
"js": "node",
|
|
78
|
+
"javascript": "node",
|
|
79
|
+
"typescript": "node",
|
|
80
|
+
"ts": "node",
|
|
74
81
|
}
|
|
75
82
|
|
|
76
83
|
def __init__(
|
|
@@ -92,8 +99,11 @@ class DockerInterpreter(BaseInterpreter):
|
|
|
92
99
|
This method ensures that the Docker container is removed when the
|
|
93
100
|
interpreter is deleted.
|
|
94
101
|
"""
|
|
95
|
-
|
|
96
|
-
self._container
|
|
102
|
+
try:
|
|
103
|
+
if self._container is not None:
|
|
104
|
+
self.cleanup()
|
|
105
|
+
except ImportError as e:
|
|
106
|
+
logger.warning(f"Error during container cleanup: {e}")
|
|
97
107
|
|
|
98
108
|
def _initialize_if_needed(self) -> None:
|
|
99
109
|
if self._container is not None:
|
|
@@ -136,8 +146,9 @@ class DockerInterpreter(BaseInterpreter):
|
|
|
136
146
|
tar_stream = io.BytesIO()
|
|
137
147
|
with tarfile.open(fileobj=tar_stream, mode='w') as tar:
|
|
138
148
|
tarinfo = tarfile.TarInfo(name=filename)
|
|
139
|
-
|
|
140
|
-
|
|
149
|
+
encoded_content = content.encode('utf-8')
|
|
150
|
+
tarinfo.size = len(encoded_content)
|
|
151
|
+
tar.addfile(tarinfo, io.BytesIO(encoded_content))
|
|
141
152
|
tar_stream.seek(0)
|
|
142
153
|
|
|
143
154
|
# copy the tar into the container
|
|
@@ -180,10 +191,24 @@ class DockerInterpreter(BaseInterpreter):
|
|
|
180
191
|
exec_result += f"(stderr: {stderr.decode()})" if stderr else ""
|
|
181
192
|
return exec_result
|
|
182
193
|
|
|
194
|
+
def cleanup(self) -> None:
|
|
195
|
+
r"""Explicitly stops and removes the Docker container.
|
|
196
|
+
|
|
197
|
+
This method should be called when you're done with the interpreter
|
|
198
|
+
to ensure proper cleanup of Docker resources.
|
|
199
|
+
"""
|
|
200
|
+
try:
|
|
201
|
+
if self._container is not None:
|
|
202
|
+
self._container.stop()
|
|
203
|
+
self._container.remove(force=True)
|
|
204
|
+
self._container = None
|
|
205
|
+
except Exception as e:
|
|
206
|
+
logger.error(f"Error during container cleanup: {e}")
|
|
207
|
+
|
|
183
208
|
def run(
|
|
184
209
|
self,
|
|
185
210
|
code: str,
|
|
186
|
-
code_type: str,
|
|
211
|
+
code_type: str = "python",
|
|
187
212
|
) -> str:
|
|
188
213
|
r"""Executes the given code in the container attached to the
|
|
189
214
|
interpreter, and captures the stdout and stderr streams.
|
|
@@ -191,7 +216,7 @@ class DockerInterpreter(BaseInterpreter):
|
|
|
191
216
|
Args:
|
|
192
217
|
code (str): The code string to execute.
|
|
193
218
|
code_type (str): The type of code to execute (e.g., 'python',
|
|
194
|
-
'bash').
|
|
219
|
+
'bash'). (default: obj:`python`)
|
|
195
220
|
|
|
196
221
|
Returns:
|
|
197
222
|
str: A string containing the captured stdout and stderr of the
|
|
@@ -229,13 +254,16 @@ class DockerInterpreter(BaseInterpreter):
|
|
|
229
254
|
try:
|
|
230
255
|
temp_file_path = self._create_file_in_container(code)
|
|
231
256
|
result = self._run_file_in_container(temp_file_path, code_type)
|
|
257
|
+
# Clean up after execution
|
|
232
258
|
except docker.errors.APIError as e:
|
|
259
|
+
self.cleanup()
|
|
233
260
|
raise InterpreterError(
|
|
234
261
|
f"Execution halted due to docker API error: {e.explanation}. "
|
|
235
262
|
"This choice stops the current operation and any "
|
|
236
263
|
"further code execution."
|
|
237
264
|
) from e
|
|
238
265
|
except docker.errors.DockerException as e:
|
|
266
|
+
self.cleanup() # Clean up even if there's an error
|
|
239
267
|
raise InterpreterError(
|
|
240
268
|
f"Execution halted due to docker exceptoin: {e}. "
|
|
241
269
|
"This choice stops the current operation and any "
|
|
@@ -258,6 +286,37 @@ class DockerInterpreter(BaseInterpreter):
|
|
|
258
286
|
|
|
259
287
|
def update_action_space(self, action_space: Dict[str, Any]) -> None:
|
|
260
288
|
r"""Updates action space for *python* interpreter"""
|
|
261
|
-
raise RuntimeError(
|
|
262
|
-
|
|
263
|
-
|
|
289
|
+
raise RuntimeError("DockerInterpreter doesn't support `action_space`.")
|
|
290
|
+
|
|
291
|
+
def execute_command(self, command: str) -> str:
|
|
292
|
+
r"""Executes a command in the Docker container and returns its output.
|
|
293
|
+
|
|
294
|
+
Args:
|
|
295
|
+
command (str): The command to execute in the container.
|
|
296
|
+
|
|
297
|
+
Returns:
|
|
298
|
+
str: A string containing the captured stdout and stderr of the
|
|
299
|
+
executed command.
|
|
300
|
+
|
|
301
|
+
Raises:
|
|
302
|
+
InterpreterError: If the container is not initialized or there is
|
|
303
|
+
an error executing the command.
|
|
304
|
+
"""
|
|
305
|
+
self._initialize_if_needed()
|
|
306
|
+
|
|
307
|
+
if self._container is None:
|
|
308
|
+
raise InterpreterError(
|
|
309
|
+
"Container is not initialized. Try running the command again."
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
try:
|
|
313
|
+
stdout, stderr = self._container.exec_run(
|
|
314
|
+
command,
|
|
315
|
+
demux=True,
|
|
316
|
+
).output
|
|
317
|
+
exec_result = f"{stdout.decode()}" if stdout else ""
|
|
318
|
+
exec_result += f"(stderr: {stderr.decode()})" if stderr else ""
|
|
319
|
+
return exec_result
|
|
320
|
+
|
|
321
|
+
except Exception as e:
|
|
322
|
+
raise InterpreterError(f"Failed to execute command: {e!s}") from e
|
|
@@ -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 Any, ClassVar, Dict, List, Optional
|
|
16
16
|
|
|
@@ -28,6 +28,11 @@ class E2BInterpreter(BaseInterpreter):
|
|
|
28
28
|
Args:
|
|
29
29
|
require_confirm (bool, optional): If True, prompt user before running
|
|
30
30
|
code strings for security. (default: :obj:`True`)
|
|
31
|
+
|
|
32
|
+
Environment Variables:
|
|
33
|
+
E2B_API_KEY: The API key for authenticating with the E2B service.
|
|
34
|
+
E2B_DOMAIN: The base URL for the E2B API. If not provided,
|
|
35
|
+
will use the default E2B endpoint.
|
|
31
36
|
"""
|
|
32
37
|
|
|
33
38
|
_CODE_TYPE_MAPPING: ClassVar[Dict[str, Optional[str]]] = {
|
|
@@ -55,7 +60,35 @@ class E2BInterpreter(BaseInterpreter):
|
|
|
55
60
|
from e2b_code_interpreter import Sandbox
|
|
56
61
|
|
|
57
62
|
self.require_confirm = require_confirm
|
|
58
|
-
|
|
63
|
+
|
|
64
|
+
# Get API key from environment variable
|
|
65
|
+
api_key = os.environ.get("E2B_API_KEY")
|
|
66
|
+
|
|
67
|
+
# Get domain from environment variable
|
|
68
|
+
domain = os.environ.get("E2B_DOMAIN")
|
|
69
|
+
|
|
70
|
+
# Create sandbox with appropriate parameters
|
|
71
|
+
sandbox_kwargs = {"api_key": api_key}
|
|
72
|
+
|
|
73
|
+
# Only add domain if it's provided
|
|
74
|
+
# (to maintain compatibility with standard E2B)
|
|
75
|
+
if domain:
|
|
76
|
+
sandbox_kwargs["domain"] = domain
|
|
77
|
+
logger.info(f"Using custom E2B endpoint: {domain}")
|
|
78
|
+
|
|
79
|
+
try:
|
|
80
|
+
self._sandbox = Sandbox(**sandbox_kwargs)
|
|
81
|
+
except TypeError as e:
|
|
82
|
+
if domain and "domain" in str(e):
|
|
83
|
+
logger.warning(
|
|
84
|
+
f"The e2b_code_interpreter library doesn't support "
|
|
85
|
+
f"custom domain. "
|
|
86
|
+
f"Using default E2B endpoint. Error: {e}"
|
|
87
|
+
)
|
|
88
|
+
# Fallback to default configuration without domain
|
|
89
|
+
self._sandbox = Sandbox(api_key=api_key)
|
|
90
|
+
else:
|
|
91
|
+
raise e
|
|
59
92
|
|
|
60
93
|
def __del__(self) -> None:
|
|
61
94
|
r"""Destructor for the E2BInterpreter class.
|
|
@@ -63,24 +96,27 @@ class E2BInterpreter(BaseInterpreter):
|
|
|
63
96
|
This method ensures that the e2b sandbox is killed when the
|
|
64
97
|
interpreter is deleted.
|
|
65
98
|
"""
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
99
|
+
try:
|
|
100
|
+
if (
|
|
101
|
+
hasattr(self, '_sandbox')
|
|
102
|
+
and self._sandbox is not None
|
|
103
|
+
and self._sandbox.is_running()
|
|
104
|
+
):
|
|
105
|
+
self._sandbox.kill()
|
|
106
|
+
except ImportError as e:
|
|
107
|
+
logger.warning(f"Error during sandbox cleanup: {e}")
|
|
72
108
|
|
|
73
109
|
def run(
|
|
74
110
|
self,
|
|
75
111
|
code: str,
|
|
76
|
-
code_type: str,
|
|
112
|
+
code_type: str = "python",
|
|
77
113
|
) -> str:
|
|
78
114
|
r"""Executes the given code in the e2b sandbox.
|
|
79
115
|
|
|
80
116
|
Args:
|
|
81
117
|
code (str): The code string to execute.
|
|
82
118
|
code_type (str): The type of code to execute (e.g., 'python',
|
|
83
|
-
'bash').
|
|
119
|
+
'bash'). (default: obj:`python`)
|
|
84
120
|
|
|
85
121
|
Returns:
|
|
86
122
|
str: The string representation of the output of the executed code.
|
|
@@ -138,3 +174,15 @@ class E2BInterpreter(BaseInterpreter):
|
|
|
138
174
|
def update_action_space(self, action_space: Dict[str, Any]) -> None:
|
|
139
175
|
r"""Updates action space for *python* interpreter"""
|
|
140
176
|
raise RuntimeError("E2B doesn't support " "`action_space`.")
|
|
177
|
+
|
|
178
|
+
def execute_command(self, command: str) -> str:
|
|
179
|
+
r"""Execute a command can be used to resolve the dependency of the
|
|
180
|
+
code.
|
|
181
|
+
|
|
182
|
+
Args:
|
|
183
|
+
command (str): The command to execute.
|
|
184
|
+
|
|
185
|
+
Returns:
|
|
186
|
+
str: The output of the command.
|
|
187
|
+
"""
|
|
188
|
+
return self._sandbox.commands.run(command)
|