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
|
@@ -0,0 +1,532 @@
|
|
|
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
|
+
|
|
15
|
+
import os
|
|
16
|
+
import platform
|
|
17
|
+
import re
|
|
18
|
+
import shutil
|
|
19
|
+
import subprocess
|
|
20
|
+
import sys
|
|
21
|
+
import venv
|
|
22
|
+
from typing import Optional, Set, Tuple
|
|
23
|
+
|
|
24
|
+
from camel.logger import get_logger
|
|
25
|
+
|
|
26
|
+
logger = get_logger(__name__)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def check_command_safety(
|
|
30
|
+
command: str,
|
|
31
|
+
allowed_commands: Optional[Set[str]] = None,
|
|
32
|
+
) -> Tuple[bool, str]:
|
|
33
|
+
r"""Check if a command (potentially with chaining) is safe to execute.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
command (str): The command string to check
|
|
37
|
+
allowed_commands (Optional[Set[str]]): Set of allowed commands
|
|
38
|
+
(whitelist mode)
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
Tuple[bool, str]: (is_safe, reason)
|
|
42
|
+
"""
|
|
43
|
+
if not command.strip():
|
|
44
|
+
return False, "Empty command is not allowed."
|
|
45
|
+
|
|
46
|
+
# Dangerous commands list - including ALL rm operations
|
|
47
|
+
dangerous_commands = [
|
|
48
|
+
# System administration
|
|
49
|
+
'sudo',
|
|
50
|
+
'su',
|
|
51
|
+
'reboot',
|
|
52
|
+
'shutdown',
|
|
53
|
+
'halt',
|
|
54
|
+
'poweroff',
|
|
55
|
+
'init',
|
|
56
|
+
# File system manipulation
|
|
57
|
+
'rm',
|
|
58
|
+
'chown',
|
|
59
|
+
'chgrp',
|
|
60
|
+
'umount',
|
|
61
|
+
'mount',
|
|
62
|
+
# Disk operations
|
|
63
|
+
'dd',
|
|
64
|
+
'mkfs',
|
|
65
|
+
'fdisk',
|
|
66
|
+
'parted',
|
|
67
|
+
'fsck',
|
|
68
|
+
'mkswap',
|
|
69
|
+
'swapon',
|
|
70
|
+
'swapoff',
|
|
71
|
+
# Process management
|
|
72
|
+
'service',
|
|
73
|
+
'systemctl',
|
|
74
|
+
'systemd',
|
|
75
|
+
# Network configuration
|
|
76
|
+
'iptables',
|
|
77
|
+
'ip6tables',
|
|
78
|
+
'ifconfig',
|
|
79
|
+
'route',
|
|
80
|
+
'iptables-save',
|
|
81
|
+
# Cron and scheduling
|
|
82
|
+
'crontab',
|
|
83
|
+
'at',
|
|
84
|
+
'batch',
|
|
85
|
+
# User management
|
|
86
|
+
'useradd',
|
|
87
|
+
'userdel',
|
|
88
|
+
'usermod',
|
|
89
|
+
'passwd',
|
|
90
|
+
'chpasswd',
|
|
91
|
+
'newgrp',
|
|
92
|
+
# Kernel modules
|
|
93
|
+
'modprobe',
|
|
94
|
+
'rmmod',
|
|
95
|
+
'insmod',
|
|
96
|
+
'lsmod',
|
|
97
|
+
]
|
|
98
|
+
|
|
99
|
+
# Remove quoted strings to avoid false positives
|
|
100
|
+
clean_command = re.sub(r'''["'][^"']*["']''', ' ', command)
|
|
101
|
+
|
|
102
|
+
# If whitelist mode, check ALL commands against the whitelist
|
|
103
|
+
if allowed_commands is not None:
|
|
104
|
+
# Extract all command words (at start or after operators)
|
|
105
|
+
cmd_pattern = r'(?:^|;|\||&&)\s*\b([a-zA-Z_/][\w\-/]*)'
|
|
106
|
+
found_commands = re.findall(cmd_pattern, clean_command, re.IGNORECASE)
|
|
107
|
+
for cmd in found_commands:
|
|
108
|
+
if cmd.lower() not in allowed_commands:
|
|
109
|
+
return (
|
|
110
|
+
False,
|
|
111
|
+
f"Command '{cmd}' is not in the allowed commands list.",
|
|
112
|
+
)
|
|
113
|
+
return True, ""
|
|
114
|
+
|
|
115
|
+
# Check for dangerous commands
|
|
116
|
+
for cmd in dangerous_commands:
|
|
117
|
+
pattern = rf'(?:^|;|\||&&)\s*\b{re.escape(cmd)}\b'
|
|
118
|
+
if re.search(pattern, clean_command, re.IGNORECASE):
|
|
119
|
+
return False, f"Command '{cmd}' is blocked for safety."
|
|
120
|
+
|
|
121
|
+
return True, ""
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def sanitize_command(
|
|
125
|
+
command: str,
|
|
126
|
+
use_docker_backend: bool = False,
|
|
127
|
+
safe_mode: bool = True,
|
|
128
|
+
working_dir: Optional[str] = None,
|
|
129
|
+
allowed_commands: Optional[Set[str]] = None,
|
|
130
|
+
) -> Tuple[bool, str]:
|
|
131
|
+
r"""A comprehensive command sanitizer for both local and Docker backends.
|
|
132
|
+
|
|
133
|
+
Args:
|
|
134
|
+
command (str): The command to sanitize
|
|
135
|
+
use_docker_backend (bool): Whether using Docker backend
|
|
136
|
+
safe_mode (bool): Whether to apply security checks
|
|
137
|
+
working_dir (Optional[str]): Working directory for path validation
|
|
138
|
+
allowed_commands (Optional[Set[str]]): Set of allowed commands
|
|
139
|
+
|
|
140
|
+
Returns:
|
|
141
|
+
Tuple[bool, str]: (is_safe, message_or_command)
|
|
142
|
+
"""
|
|
143
|
+
if not safe_mode:
|
|
144
|
+
return True, command # Skip all checks if safe_mode is disabled
|
|
145
|
+
|
|
146
|
+
# Use safety checker
|
|
147
|
+
is_safe, reason = check_command_safety(command, allowed_commands)
|
|
148
|
+
if not is_safe:
|
|
149
|
+
return False, reason
|
|
150
|
+
|
|
151
|
+
# Additional check for Docker backend: prevent cd outside working directory
|
|
152
|
+
if not use_docker_backend and working_dir and 'cd ' in command:
|
|
153
|
+
# Extract cd commands and check their targets
|
|
154
|
+
cd_pattern = r'\bcd\s+([^\s;|&]+)'
|
|
155
|
+
for match in re.finditer(cd_pattern, command):
|
|
156
|
+
target_path = match.group(1).strip('\'"')
|
|
157
|
+
target_dir = os.path.abspath(
|
|
158
|
+
os.path.join(working_dir, target_path)
|
|
159
|
+
)
|
|
160
|
+
if not target_dir.startswith(working_dir):
|
|
161
|
+
return False, "Cannot 'cd' outside of the working directory."
|
|
162
|
+
|
|
163
|
+
return True, command
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
# Environment management utilities
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def is_uv_environment() -> bool:
|
|
170
|
+
r"""Detect whether the current Python runtime is managed by uv."""
|
|
171
|
+
return (
|
|
172
|
+
"UV_CACHE_DIR" in os.environ
|
|
173
|
+
or "uv" in sys.executable
|
|
174
|
+
or shutil.which("uv") is not None
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def ensure_uv_available(update_callback=None) -> Tuple[bool, Optional[str]]:
|
|
179
|
+
r"""Ensure uv is available, installing it if necessary.
|
|
180
|
+
|
|
181
|
+
Args:
|
|
182
|
+
update_callback: Optional callback function to receive status updates
|
|
183
|
+
|
|
184
|
+
Returns:
|
|
185
|
+
Tuple[bool, Optional[str]]: (success, uv_path)
|
|
186
|
+
"""
|
|
187
|
+
# Check if uv is already available
|
|
188
|
+
existing_uv = shutil.which("uv")
|
|
189
|
+
if existing_uv is not None:
|
|
190
|
+
if update_callback:
|
|
191
|
+
update_callback(f"uv is already available at: {existing_uv}\n")
|
|
192
|
+
return True, existing_uv
|
|
193
|
+
|
|
194
|
+
try:
|
|
195
|
+
if update_callback:
|
|
196
|
+
update_callback("uv not found, installing...\n")
|
|
197
|
+
|
|
198
|
+
os_type = platform.system()
|
|
199
|
+
|
|
200
|
+
# Install uv using the official installer script
|
|
201
|
+
if os_type in ['darwin', 'linux'] or os_type.startswith('linux'):
|
|
202
|
+
# Use curl to download and execute the installer
|
|
203
|
+
install_cmd = "curl -LsSf https://astral.sh/uv/install.sh | sh"
|
|
204
|
+
result = subprocess.run(
|
|
205
|
+
install_cmd,
|
|
206
|
+
shell=True,
|
|
207
|
+
capture_output=True,
|
|
208
|
+
text=True,
|
|
209
|
+
timeout=60,
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
if result.returncode != 0:
|
|
213
|
+
if update_callback:
|
|
214
|
+
update_callback(f"Failed to install uv: {result.stderr}\n")
|
|
215
|
+
return False, None
|
|
216
|
+
|
|
217
|
+
# Check if uv was installed in the expected location
|
|
218
|
+
home = os.path.expanduser("~")
|
|
219
|
+
uv_bin_path = os.path.join(home, ".cargo", "bin")
|
|
220
|
+
uv_executable = os.path.join(uv_bin_path, "uv")
|
|
221
|
+
|
|
222
|
+
if os.path.exists(uv_executable):
|
|
223
|
+
if update_callback:
|
|
224
|
+
update_callback(
|
|
225
|
+
f"uv installed successfully at: {uv_executable}\n"
|
|
226
|
+
)
|
|
227
|
+
return True, uv_executable
|
|
228
|
+
|
|
229
|
+
elif os_type == 'Windows':
|
|
230
|
+
# Use PowerShell to install uv on Windows
|
|
231
|
+
install_cmd = (
|
|
232
|
+
"powershell -ExecutionPolicy Bypass -c "
|
|
233
|
+
"\"irm https://astral.sh/uv/install.ps1 | iex\""
|
|
234
|
+
)
|
|
235
|
+
result = subprocess.run(
|
|
236
|
+
install_cmd,
|
|
237
|
+
shell=True,
|
|
238
|
+
capture_output=True,
|
|
239
|
+
text=True,
|
|
240
|
+
timeout=60,
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
if result.returncode != 0:
|
|
244
|
+
if update_callback:
|
|
245
|
+
update_callback(f"Failed to install uv: {result.stderr}\n")
|
|
246
|
+
return False, None
|
|
247
|
+
|
|
248
|
+
# Check if uv was installed in the expected location on Windows
|
|
249
|
+
home = os.path.expanduser("~")
|
|
250
|
+
uv_bin_path = os.path.join(home, ".cargo", "bin")
|
|
251
|
+
uv_executable = os.path.join(uv_bin_path, "uv.exe")
|
|
252
|
+
|
|
253
|
+
if os.path.exists(uv_executable):
|
|
254
|
+
if update_callback:
|
|
255
|
+
update_callback(
|
|
256
|
+
f"uv installed successfully at: {uv_executable}\n"
|
|
257
|
+
)
|
|
258
|
+
return True, uv_executable
|
|
259
|
+
|
|
260
|
+
if update_callback:
|
|
261
|
+
update_callback("Failed to verify uv installation\n")
|
|
262
|
+
return False, None
|
|
263
|
+
|
|
264
|
+
except Exception as e:
|
|
265
|
+
if update_callback:
|
|
266
|
+
update_callback(f"Error installing uv: {e!s}\n")
|
|
267
|
+
logger.error(f"Failed to install uv: {e}")
|
|
268
|
+
return False, None
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
def setup_initial_env_with_uv(
|
|
272
|
+
env_path: str, uv_path: str, working_dir: str, update_callback=None
|
|
273
|
+
) -> bool:
|
|
274
|
+
r"""Set up initial environment using uv."""
|
|
275
|
+
try:
|
|
276
|
+
# Create virtual environment with Python 3.10 using uv
|
|
277
|
+
subprocess.run(
|
|
278
|
+
[uv_path, "venv", "--python", "3.10", env_path],
|
|
279
|
+
check=True,
|
|
280
|
+
capture_output=True,
|
|
281
|
+
cwd=working_dir,
|
|
282
|
+
timeout=300,
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
# Get the python path from the new environment
|
|
286
|
+
if platform.system() == 'Windows':
|
|
287
|
+
python_path = os.path.join(env_path, "Scripts", "python.exe")
|
|
288
|
+
else:
|
|
289
|
+
python_path = os.path.join(env_path, "bin", "python")
|
|
290
|
+
|
|
291
|
+
# Install essential packages using uv
|
|
292
|
+
essential_packages = [
|
|
293
|
+
"pip",
|
|
294
|
+
"setuptools",
|
|
295
|
+
"wheel",
|
|
296
|
+
"pyautogui",
|
|
297
|
+
"plotly",
|
|
298
|
+
]
|
|
299
|
+
subprocess.run(
|
|
300
|
+
[
|
|
301
|
+
uv_path,
|
|
302
|
+
"pip",
|
|
303
|
+
"install",
|
|
304
|
+
"--python",
|
|
305
|
+
python_path,
|
|
306
|
+
*essential_packages,
|
|
307
|
+
],
|
|
308
|
+
check=True,
|
|
309
|
+
capture_output=True,
|
|
310
|
+
cwd=working_dir,
|
|
311
|
+
timeout=300,
|
|
312
|
+
)
|
|
313
|
+
|
|
314
|
+
if update_callback:
|
|
315
|
+
update_callback(
|
|
316
|
+
"[UV] Initial environment created with Python 3.10 "
|
|
317
|
+
"and essential packages"
|
|
318
|
+
)
|
|
319
|
+
return True
|
|
320
|
+
|
|
321
|
+
except subprocess.CalledProcessError as e:
|
|
322
|
+
error_msg = e.stderr.decode() if e.stderr else str(e)
|
|
323
|
+
if update_callback:
|
|
324
|
+
update_callback(f"UV setup failed: {error_msg}\n")
|
|
325
|
+
return False
|
|
326
|
+
except subprocess.TimeoutExpired:
|
|
327
|
+
if update_callback:
|
|
328
|
+
update_callback("UV setup timed out after 5 minutes\n")
|
|
329
|
+
return False
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
def setup_initial_env_with_venv(
|
|
333
|
+
env_path: str, working_dir: str, update_callback=None
|
|
334
|
+
) -> bool:
|
|
335
|
+
r"""Set up initial environment using standard venv."""
|
|
336
|
+
try:
|
|
337
|
+
# Create virtual environment with system Python
|
|
338
|
+
venv.create(
|
|
339
|
+
env_path, with_pip=True, system_site_packages=False, symlinks=False
|
|
340
|
+
)
|
|
341
|
+
|
|
342
|
+
# Get pip path
|
|
343
|
+
if platform.system() == 'Windows':
|
|
344
|
+
pip_path = os.path.join(env_path, "Scripts", "pip.exe")
|
|
345
|
+
else:
|
|
346
|
+
pip_path = os.path.join(env_path, "bin", "pip")
|
|
347
|
+
|
|
348
|
+
# Upgrade pip and install essential packages
|
|
349
|
+
essential_packages = [
|
|
350
|
+
"pip",
|
|
351
|
+
"setuptools",
|
|
352
|
+
"wheel",
|
|
353
|
+
"pyautogui",
|
|
354
|
+
"plotly",
|
|
355
|
+
]
|
|
356
|
+
subprocess.run(
|
|
357
|
+
[pip_path, "install", "--upgrade", *essential_packages],
|
|
358
|
+
check=True,
|
|
359
|
+
capture_output=True,
|
|
360
|
+
cwd=working_dir,
|
|
361
|
+
timeout=300,
|
|
362
|
+
)
|
|
363
|
+
|
|
364
|
+
if update_callback:
|
|
365
|
+
update_callback(
|
|
366
|
+
"Initial environment created with system Python "
|
|
367
|
+
"and essential packages"
|
|
368
|
+
)
|
|
369
|
+
return True
|
|
370
|
+
|
|
371
|
+
except subprocess.CalledProcessError as e:
|
|
372
|
+
error_msg = e.stderr.decode() if e.stderr else str(e)
|
|
373
|
+
if update_callback:
|
|
374
|
+
update_callback(f"Venv setup failed: {error_msg}\n")
|
|
375
|
+
return False
|
|
376
|
+
except subprocess.TimeoutExpired:
|
|
377
|
+
if update_callback:
|
|
378
|
+
update_callback("Venv setup timed out after 5 minutes\n")
|
|
379
|
+
return False
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
def clone_current_environment(
|
|
383
|
+
env_path: str, working_dir: str, update_callback=None
|
|
384
|
+
) -> bool:
|
|
385
|
+
r"""Create a new Python virtual environment, optionally using uv."""
|
|
386
|
+
try:
|
|
387
|
+
if os.path.exists(env_path):
|
|
388
|
+
if update_callback:
|
|
389
|
+
update_callback(f"Using existing environment: {env_path}\n")
|
|
390
|
+
return True
|
|
391
|
+
|
|
392
|
+
if update_callback:
|
|
393
|
+
update_callback(
|
|
394
|
+
f"Creating new Python environment at: {env_path}\n"
|
|
395
|
+
)
|
|
396
|
+
|
|
397
|
+
# Try to use uv if available
|
|
398
|
+
success, uv_path = ensure_uv_available(update_callback)
|
|
399
|
+
if success and uv_path:
|
|
400
|
+
# Get current Python version
|
|
401
|
+
current_version = (
|
|
402
|
+
f"{sys.version_info.major}.{sys.version_info.minor}"
|
|
403
|
+
)
|
|
404
|
+
|
|
405
|
+
subprocess.run(
|
|
406
|
+
[uv_path, "venv", "--python", current_version, env_path],
|
|
407
|
+
check=True,
|
|
408
|
+
capture_output=True,
|
|
409
|
+
cwd=working_dir,
|
|
410
|
+
timeout=300,
|
|
411
|
+
)
|
|
412
|
+
|
|
413
|
+
# Get the python path from the new environment
|
|
414
|
+
if platform.system() == 'Windows':
|
|
415
|
+
python_path = os.path.join(env_path, "Scripts", "python.exe")
|
|
416
|
+
else:
|
|
417
|
+
python_path = os.path.join(env_path, "bin", "python")
|
|
418
|
+
|
|
419
|
+
# Install pip and setuptools using uv
|
|
420
|
+
subprocess.run(
|
|
421
|
+
[
|
|
422
|
+
uv_path,
|
|
423
|
+
"pip",
|
|
424
|
+
"install",
|
|
425
|
+
"--python",
|
|
426
|
+
python_path,
|
|
427
|
+
"pip",
|
|
428
|
+
"setuptools",
|
|
429
|
+
"wheel",
|
|
430
|
+
],
|
|
431
|
+
check=True,
|
|
432
|
+
capture_output=True,
|
|
433
|
+
cwd=working_dir,
|
|
434
|
+
timeout=300,
|
|
435
|
+
)
|
|
436
|
+
|
|
437
|
+
if update_callback:
|
|
438
|
+
update_callback(
|
|
439
|
+
"[UV] Cloned Python environment created successfully!\n"
|
|
440
|
+
)
|
|
441
|
+
return True
|
|
442
|
+
else:
|
|
443
|
+
# Fallback to standard venv
|
|
444
|
+
if update_callback:
|
|
445
|
+
update_callback(
|
|
446
|
+
"Falling back to standard venv for cloning environment\n"
|
|
447
|
+
)
|
|
448
|
+
|
|
449
|
+
venv.create(env_path, with_pip=True, symlinks=False)
|
|
450
|
+
|
|
451
|
+
# Ensure pip is properly available
|
|
452
|
+
if platform.system() == 'Windows':
|
|
453
|
+
python_path = os.path.join(env_path, "Scripts", "python.exe")
|
|
454
|
+
else:
|
|
455
|
+
python_path = os.path.join(env_path, "bin", "python")
|
|
456
|
+
|
|
457
|
+
if os.path.exists(python_path):
|
|
458
|
+
subprocess.run(
|
|
459
|
+
[python_path, "-m", "pip", "install", "--upgrade", "pip"],
|
|
460
|
+
check=True,
|
|
461
|
+
capture_output=True,
|
|
462
|
+
cwd=working_dir,
|
|
463
|
+
timeout=60,
|
|
464
|
+
)
|
|
465
|
+
if update_callback:
|
|
466
|
+
update_callback(
|
|
467
|
+
"New Python environment created successfully with pip!"
|
|
468
|
+
)
|
|
469
|
+
else:
|
|
470
|
+
if update_callback:
|
|
471
|
+
update_callback(
|
|
472
|
+
f"Warning: Python executable not found at "
|
|
473
|
+
f"{python_path}"
|
|
474
|
+
)
|
|
475
|
+
return True
|
|
476
|
+
|
|
477
|
+
except subprocess.CalledProcessError as e:
|
|
478
|
+
error_msg = e.stderr.decode() if e.stderr else str(e)
|
|
479
|
+
if update_callback:
|
|
480
|
+
update_callback(f"Failed to create environment: {error_msg}\n")
|
|
481
|
+
logger.error(f"Failed to create environment: {error_msg}")
|
|
482
|
+
return False
|
|
483
|
+
except subprocess.TimeoutExpired:
|
|
484
|
+
if update_callback:
|
|
485
|
+
update_callback("Environment creation timed out\n")
|
|
486
|
+
return False
|
|
487
|
+
except Exception as e:
|
|
488
|
+
if update_callback:
|
|
489
|
+
update_callback(f"Failed to create environment: {e!s}\n")
|
|
490
|
+
logger.error(f"Failed to create environment: {e}")
|
|
491
|
+
return False
|
|
492
|
+
|
|
493
|
+
|
|
494
|
+
def check_nodejs_availability(update_callback=None) -> Tuple[bool, str]:
|
|
495
|
+
r"""Check if Node.js is available without modifying the system."""
|
|
496
|
+
try:
|
|
497
|
+
# Check if Node.js is already available in the system
|
|
498
|
+
node_result = subprocess.run(
|
|
499
|
+
["node", "--version"],
|
|
500
|
+
check=False,
|
|
501
|
+
capture_output=True,
|
|
502
|
+
timeout=10,
|
|
503
|
+
)
|
|
504
|
+
|
|
505
|
+
npm_result = subprocess.run(
|
|
506
|
+
["npm", "--version"],
|
|
507
|
+
check=False,
|
|
508
|
+
capture_output=True,
|
|
509
|
+
timeout=10,
|
|
510
|
+
)
|
|
511
|
+
|
|
512
|
+
if node_result.returncode == 0 and npm_result.returncode == 0:
|
|
513
|
+
node_version = node_result.stdout.decode().strip()
|
|
514
|
+
npm_version = npm_result.stdout.decode().strip()
|
|
515
|
+
info = (
|
|
516
|
+
f"Node.js {node_version} and npm {npm_version} are available"
|
|
517
|
+
)
|
|
518
|
+
if update_callback:
|
|
519
|
+
update_callback(f"{info}\n")
|
|
520
|
+
return True, info
|
|
521
|
+
else:
|
|
522
|
+
info = "Node.js not found. If needed, please install it manually."
|
|
523
|
+
if update_callback:
|
|
524
|
+
update_callback(f"Note: {info}\n")
|
|
525
|
+
return False, info
|
|
526
|
+
|
|
527
|
+
except Exception as e:
|
|
528
|
+
info = f"Could not check Node.js availability - {e}"
|
|
529
|
+
if update_callback:
|
|
530
|
+
update_callback(f"Note: {info}.\n")
|
|
531
|
+
logger.warning(f"Failed to check Node.js: {e}")
|
|
532
|
+
return False, info
|
|
@@ -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 typing import List, Optional
|
|
16
16
|
|
|
@@ -32,7 +32,7 @@ class ThinkingToolkit(BaseToolkit):
|
|
|
32
32
|
|
|
33
33
|
Args:
|
|
34
34
|
timeout (Optional[float]): The timeout for the toolkit.
|
|
35
|
-
(default: :obj
|
|
35
|
+
(default: :obj:`None`)
|
|
36
36
|
"""
|
|
37
37
|
super().__init__(timeout=timeout)
|
|
38
38
|
self.plans: List[str] = []
|
|
@@ -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 datetime
|
|
15
15
|
import os
|
|
16
16
|
from http import HTTPStatus
|
|
@@ -18,7 +18,6 @@ from http.client import responses
|
|
|
18
18
|
from typing import Any, Dict, List, Optional, Union
|
|
19
19
|
|
|
20
20
|
import requests
|
|
21
|
-
from requests_oauthlib import OAuth1
|
|
22
21
|
|
|
23
22
|
from camel.logger import get_logger
|
|
24
23
|
from camel.toolkits import FunctionTool
|
|
@@ -76,6 +75,8 @@ def create_tweet(
|
|
|
76
75
|
Reference:
|
|
77
76
|
https://developer.x.com/en/docs/x-api/tweets/manage-tweets/api-reference/post-tweets
|
|
78
77
|
"""
|
|
78
|
+
from requests_oauthlib import OAuth1
|
|
79
|
+
|
|
79
80
|
auth = OAuth1(
|
|
80
81
|
os.getenv("TWITTER_CONSUMER_KEY"),
|
|
81
82
|
os.getenv("TWITTER_CONSUMER_SECRET"),
|
|
@@ -160,6 +161,8 @@ def delete_tweet(tweet_id: str) -> str:
|
|
|
160
161
|
Reference:
|
|
161
162
|
https://developer.x.com/en/docs/x-api/tweets/manage-tweets/api-reference/delete-tweets-id
|
|
162
163
|
"""
|
|
164
|
+
from requests_oauthlib import OAuth1
|
|
165
|
+
|
|
163
166
|
auth = OAuth1(
|
|
164
167
|
os.getenv("TWITTER_CONSUMER_KEY"),
|
|
165
168
|
os.getenv("TWITTER_CONSUMER_SECRET"),
|
|
@@ -263,6 +266,8 @@ def _get_user_info(username: Optional[str] = None) -> str:
|
|
|
263
266
|
Returns:
|
|
264
267
|
str: A formatted report of the user's Twitter profile information.
|
|
265
268
|
"""
|
|
269
|
+
from requests_oauthlib import OAuth1
|
|
270
|
+
|
|
266
271
|
oauth = OAuth1(
|
|
267
272
|
os.getenv("TWITTER_CONSUMER_KEY"),
|
|
268
273
|
os.getenv("TWITTER_CONSUMER_SECRET"),
|