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,10 +10,14 @@
|
|
|
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
|
+
|
|
15
|
+
# Enables postponed evaluation of annotations (for string-based type hints)
|
|
16
|
+
from __future__ import annotations
|
|
14
17
|
|
|
15
18
|
import io
|
|
16
19
|
import os
|
|
20
|
+
import re
|
|
17
21
|
import tempfile
|
|
18
22
|
from pathlib import Path
|
|
19
23
|
from typing import List, Optional
|
|
@@ -38,6 +42,11 @@ VIDEO_QA_PROMPT = """
|
|
|
38
42
|
Analyze the provided video frames and corresponding audio transcription to \
|
|
39
43
|
answer the given question(s) thoroughly and accurately.
|
|
40
44
|
|
|
45
|
+
The transcriptions may come from two sources:
|
|
46
|
+
1. **Audio Transcription**: The spoken words in the video.
|
|
47
|
+
2. **Visual Text (OCR)**: Text extracted from the video frames (like \
|
|
48
|
+
captions, on-screen text, etc.).
|
|
49
|
+
|
|
41
50
|
Instructions:
|
|
42
51
|
1. Visual Analysis:
|
|
43
52
|
- Examine the video frames to identify visible entities.
|
|
@@ -46,11 +55,13 @@ such as size, color, shape, texture, or behavior.
|
|
|
46
55
|
- Note significant groupings, interactions, or contextual patterns \
|
|
47
56
|
relevant to the analysis.
|
|
48
57
|
|
|
49
|
-
2. Audio Integration:
|
|
58
|
+
2. Audio and Text Integration:
|
|
50
59
|
- Use the audio transcription to complement or clarify your visual \
|
|
51
60
|
observations.
|
|
61
|
+
- Use the visual text (OCR) to get exact textual information that may \
|
|
62
|
+
not be accurately readable from the images alone.
|
|
52
63
|
- Identify names, descriptions, or contextual hints in the \
|
|
53
|
-
|
|
64
|
+
transcriptions that help confirm or refine your visual analysis.
|
|
54
65
|
|
|
55
66
|
3. Detailed Reasoning and Justification:
|
|
56
67
|
- Provide a brief explanation of how you identified and distinguished \
|
|
@@ -62,17 +73,20 @@ your reasoning.
|
|
|
62
73
|
- Specify the total number of distinct species or object types \
|
|
63
74
|
identified in the video.
|
|
64
75
|
- Describe the defining characteristics and any supporting evidence \
|
|
65
|
-
from the video and transcription.
|
|
76
|
+
from the video and transcription sources.
|
|
66
77
|
|
|
67
78
|
5. Important Considerations:
|
|
68
79
|
- Pay close attention to subtle differences that could distinguish \
|
|
69
|
-
similar-looking species or objects
|
|
80
|
+
similar-looking species or objects
|
|
70
81
|
(e.g., juveniles vs. adults, closely related species).
|
|
71
82
|
- Provide concise yet complete explanations to ensure clarity.
|
|
72
83
|
|
|
73
84
|
**Audio Transcription:**
|
|
74
85
|
{audio_transcription}
|
|
75
86
|
|
|
87
|
+
**Visual Text (OCR):**
|
|
88
|
+
{visual_text}
|
|
89
|
+
|
|
76
90
|
**Question:**
|
|
77
91
|
{question}
|
|
78
92
|
"""
|
|
@@ -83,7 +97,7 @@ class VideoAnalysisToolkit(BaseToolkit):
|
|
|
83
97
|
r"""A class for analysing videos with vision-language model.
|
|
84
98
|
|
|
85
99
|
Args:
|
|
86
|
-
|
|
100
|
+
working_directory (Optional[str], optional): The directory where the
|
|
87
101
|
video will be downloaded to. If not provided, video will be stored
|
|
88
102
|
in a temporary directory and will be cleaned up after use.
|
|
89
103
|
(default: :obj:`None`)
|
|
@@ -93,6 +107,8 @@ class VideoAnalysisToolkit(BaseToolkit):
|
|
|
93
107
|
transcription using OpenAI's audio models. Requires a valid OpenAI
|
|
94
108
|
API key. When disabled, video analysis will be based solely on
|
|
95
109
|
visual content. (default: :obj:`False`)
|
|
110
|
+
use_ocr (bool, optional): Whether to enable OCR for extracting text
|
|
111
|
+
from video frames. (default: :obj:`False`)
|
|
96
112
|
frame_interval (float, optional): Interval in seconds between frames
|
|
97
113
|
to extract from the video. (default: :obj:`4.0`)
|
|
98
114
|
output_language (str, optional): The language for output responses.
|
|
@@ -107,38 +123,40 @@ class VideoAnalysisToolkit(BaseToolkit):
|
|
|
107
123
|
@dependencies_required("ffmpeg", "scenedetect")
|
|
108
124
|
def __init__(
|
|
109
125
|
self,
|
|
110
|
-
|
|
126
|
+
working_directory: Optional[str] = None,
|
|
111
127
|
model: Optional[BaseModelBackend] = None,
|
|
112
128
|
use_audio_transcription: bool = False,
|
|
129
|
+
use_ocr: bool = False,
|
|
113
130
|
frame_interval: float = 4.0,
|
|
114
131
|
output_language: str = "English",
|
|
115
132
|
cookies_path: Optional[str] = None,
|
|
116
133
|
timeout: Optional[float] = None,
|
|
117
134
|
) -> None:
|
|
118
135
|
super().__init__(timeout=timeout)
|
|
119
|
-
self._cleanup =
|
|
136
|
+
self._cleanup = working_directory is None
|
|
120
137
|
self._temp_files: list[str] = [] # Track temporary files for cleanup
|
|
121
138
|
self._use_audio_transcription = use_audio_transcription
|
|
139
|
+
self._use_ocr = use_ocr
|
|
122
140
|
self.output_language = output_language
|
|
123
141
|
self.frame_interval = frame_interval
|
|
124
142
|
|
|
125
|
-
self.
|
|
126
|
-
|
|
143
|
+
self._working_directory = Path(
|
|
144
|
+
working_directory or tempfile.mkdtemp()
|
|
127
145
|
).resolve()
|
|
128
146
|
|
|
129
147
|
self.video_downloader_toolkit = VideoDownloaderToolkit(
|
|
130
|
-
|
|
148
|
+
working_directory=str(self._working_directory),
|
|
131
149
|
cookies_path=cookies_path,
|
|
132
150
|
)
|
|
133
151
|
|
|
134
152
|
try:
|
|
135
|
-
self.
|
|
153
|
+
self._working_directory.mkdir(parents=True, exist_ok=True)
|
|
136
154
|
except OSError as e:
|
|
137
155
|
raise ValueError(
|
|
138
|
-
f"Error creating directory {self.
|
|
156
|
+
f"Error creating directory {self._working_directory}: {e}"
|
|
139
157
|
)
|
|
140
158
|
|
|
141
|
-
logger.info(f"Video will be downloaded to {self.
|
|
159
|
+
logger.info(f"Video will be downloaded to {self._working_directory}")
|
|
142
160
|
|
|
143
161
|
self.vl_model = model
|
|
144
162
|
# Ensure ChatAgent is initialized with a model if provided
|
|
@@ -177,27 +195,33 @@ class VideoAnalysisToolkit(BaseToolkit):
|
|
|
177
195
|
destroyed.
|
|
178
196
|
"""
|
|
179
197
|
# Clean up temporary files
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
198
|
+
if hasattr(self, '_temp_files'):
|
|
199
|
+
for temp_file in self._temp_files:
|
|
200
|
+
if os.path.exists(temp_file):
|
|
201
|
+
try:
|
|
202
|
+
os.remove(temp_file)
|
|
203
|
+
logger.debug(f"Removed temporary file: {temp_file}")
|
|
204
|
+
except OSError as e:
|
|
205
|
+
logger.warning(
|
|
206
|
+
f"Failed to remove temporary file {temp_file}: {e}"
|
|
207
|
+
)
|
|
189
208
|
|
|
190
209
|
# Clean up temporary directory if needed
|
|
191
|
-
if
|
|
210
|
+
if (
|
|
211
|
+
hasattr(self, '_cleanup')
|
|
212
|
+
and self._cleanup
|
|
213
|
+
and hasattr(self, '_working_directory')
|
|
214
|
+
and os.path.exists(self._working_directory)
|
|
215
|
+
):
|
|
192
216
|
try:
|
|
193
217
|
import sys
|
|
194
218
|
|
|
195
219
|
if getattr(sys, 'modules', None) is not None:
|
|
196
220
|
import shutil
|
|
197
221
|
|
|
198
|
-
shutil.rmtree(self.
|
|
222
|
+
shutil.rmtree(self._working_directory)
|
|
199
223
|
logger.debug(
|
|
200
|
-
f"Removed temp directory: {self.
|
|
224
|
+
f"Removed temp directory: {self._working_directory}"
|
|
201
225
|
)
|
|
202
226
|
except (ImportError, AttributeError):
|
|
203
227
|
# Skip cleanup if interpreter is shutting down
|
|
@@ -205,9 +229,56 @@ class VideoAnalysisToolkit(BaseToolkit):
|
|
|
205
229
|
except OSError as e:
|
|
206
230
|
logger.warning(
|
|
207
231
|
f"Failed to remove temporary directory "
|
|
208
|
-
f"{self.
|
|
232
|
+
f"{self._working_directory}: {e}"
|
|
209
233
|
)
|
|
210
234
|
|
|
235
|
+
@dependencies_required("pytesseract", "cv2", "numpy")
|
|
236
|
+
def _extract_text_from_frame(self, frame: Image.Image) -> str:
|
|
237
|
+
r"""Extract text from a video frame using OCR.
|
|
238
|
+
|
|
239
|
+
Args:
|
|
240
|
+
frame (Image.Image): PIL image frame to process.
|
|
241
|
+
|
|
242
|
+
Returns:
|
|
243
|
+
str: Extracted text from the frame.
|
|
244
|
+
"""
|
|
245
|
+
import cv2
|
|
246
|
+
import numpy as np
|
|
247
|
+
import pytesseract
|
|
248
|
+
|
|
249
|
+
try:
|
|
250
|
+
# Convert to OpenCV format for preprocessing
|
|
251
|
+
cv_image = cv2.cvtColor(np.array(frame), cv2.COLOR_RGB2BGR)
|
|
252
|
+
|
|
253
|
+
# Preprocessing for better OCR results
|
|
254
|
+
gray = cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY)
|
|
255
|
+
blur = cv2.GaussianBlur(gray, (3, 3), 0)
|
|
256
|
+
_, threshold = cv2.threshold(
|
|
257
|
+
blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
# Convert back to PIL image for OCR
|
|
261
|
+
preprocessed_frame = Image.fromarray(threshold)
|
|
262
|
+
return pytesseract.image_to_string(preprocessed_frame).strip()
|
|
263
|
+
except Exception as e:
|
|
264
|
+
logger.error(f"OCR failed: {e}")
|
|
265
|
+
return ""
|
|
266
|
+
|
|
267
|
+
def _process_extracted_text(self, text: str) -> str:
|
|
268
|
+
r"""Clean and format OCR-extracted text.
|
|
269
|
+
|
|
270
|
+
Args:
|
|
271
|
+
text (str): Raw extracted OCR text.
|
|
272
|
+
|
|
273
|
+
Returns:
|
|
274
|
+
str: Cleaned and formatted text.
|
|
275
|
+
"""
|
|
276
|
+
# Filter irrelevant characters and noise
|
|
277
|
+
text = re.sub(r'[^\w\s,.?!:;\'"()-]', '', text)
|
|
278
|
+
# Remove excessive whitespace
|
|
279
|
+
text = re.sub(r'\s+', ' ', text).strip()
|
|
280
|
+
return text
|
|
281
|
+
|
|
211
282
|
def _extract_audio_from_video(
|
|
212
283
|
self, video_path: str, output_format: str = "mp3"
|
|
213
284
|
) -> str:
|
|
@@ -508,16 +579,28 @@ class VideoAnalysisToolkit(BaseToolkit):
|
|
|
508
579
|
audio_path = self._extract_audio_from_video(video_path)
|
|
509
580
|
audio_transcript = self._transcribe_audio(audio_path)
|
|
510
581
|
|
|
582
|
+
# Extract visual text with OCR
|
|
583
|
+
visual_text = ""
|
|
511
584
|
video_frames = self._extract_keyframes(video_path)
|
|
585
|
+
# Build visual text only if OCR is enabled
|
|
586
|
+
if self._use_ocr:
|
|
587
|
+
for frame in video_frames:
|
|
588
|
+
text = self._extract_text_from_frame(frame)
|
|
589
|
+
processed = self._process_extracted_text(text)
|
|
590
|
+
if processed:
|
|
591
|
+
visual_text += processed + "\n"
|
|
592
|
+
visual_text = visual_text.strip() or "No visual text detected."
|
|
593
|
+
|
|
512
594
|
prompt = VIDEO_QA_PROMPT.format(
|
|
513
595
|
audio_transcription=audio_transcript,
|
|
596
|
+
visual_text=visual_text,
|
|
514
597
|
question=question,
|
|
515
598
|
)
|
|
516
599
|
|
|
517
600
|
msg = BaseMessage.make_user_message(
|
|
518
601
|
role_name="User",
|
|
519
602
|
content=prompt,
|
|
520
|
-
image_list=video_frames,
|
|
603
|
+
image_list=video_frames, # type: ignore[arg-type]
|
|
521
604
|
)
|
|
522
605
|
# Reset the agent to clear previous state
|
|
523
606
|
self.vl_agent.reset()
|
|
@@ -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,10 @@
|
|
|
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
|
+
|
|
15
|
+
# Enables postponed evaluation of annotations (for string-based type hints)
|
|
16
|
+
from __future__ import annotations
|
|
14
17
|
|
|
15
18
|
import io
|
|
16
19
|
import tempfile
|
|
@@ -23,7 +26,7 @@ from PIL import Image
|
|
|
23
26
|
from camel.logger import get_logger
|
|
24
27
|
from camel.toolkits.base import BaseToolkit
|
|
25
28
|
from camel.toolkits.function_tool import FunctionTool
|
|
26
|
-
from camel.utils import
|
|
29
|
+
from camel.utils import dependencies_required
|
|
27
30
|
|
|
28
31
|
logger = get_logger(__name__)
|
|
29
32
|
|
|
@@ -54,13 +57,12 @@ def _capture_screenshot(video_file: str, timestamp: float) -> Image.Image:
|
|
|
54
57
|
return Image.open(io.BytesIO(out))
|
|
55
58
|
|
|
56
59
|
|
|
57
|
-
@MCPServer()
|
|
58
60
|
class VideoDownloaderToolkit(BaseToolkit):
|
|
59
61
|
r"""A class for downloading videos and optionally splitting them into
|
|
60
62
|
chunks.
|
|
61
63
|
|
|
62
64
|
Args:
|
|
63
|
-
|
|
65
|
+
working_directory (Optional[str], optional): The directory where the
|
|
64
66
|
video will be downloaded to. If not provided, video will be stored
|
|
65
67
|
in a temporary directory and will be cleaned up after use.
|
|
66
68
|
(default: :obj:`None`)
|
|
@@ -71,30 +73,30 @@ class VideoDownloaderToolkit(BaseToolkit):
|
|
|
71
73
|
@dependencies_required("yt_dlp", "ffmpeg")
|
|
72
74
|
def __init__(
|
|
73
75
|
self,
|
|
74
|
-
|
|
76
|
+
working_directory: Optional[str] = None,
|
|
75
77
|
cookies_path: Optional[str] = None,
|
|
76
78
|
timeout: Optional[float] = None,
|
|
77
79
|
) -> None:
|
|
78
80
|
super().__init__(timeout=timeout)
|
|
79
|
-
self._cleanup =
|
|
81
|
+
self._cleanup = working_directory is None
|
|
80
82
|
self._cookies_path = cookies_path
|
|
81
83
|
|
|
82
|
-
self.
|
|
83
|
-
|
|
84
|
+
self._working_directory = Path(
|
|
85
|
+
working_directory or tempfile.mkdtemp()
|
|
84
86
|
).resolve()
|
|
85
87
|
|
|
86
88
|
try:
|
|
87
|
-
self.
|
|
89
|
+
self._working_directory.mkdir(parents=True, exist_ok=True)
|
|
88
90
|
except FileExistsError:
|
|
89
91
|
raise ValueError(
|
|
90
|
-
f"{self.
|
|
92
|
+
f"{self._working_directory} is not a valid directory."
|
|
91
93
|
)
|
|
92
94
|
except OSError as e:
|
|
93
95
|
raise ValueError(
|
|
94
|
-
f"Error creating directory {self.
|
|
96
|
+
f"Error creating directory {self._working_directory}: {e}"
|
|
95
97
|
)
|
|
96
98
|
|
|
97
|
-
logger.info(f"Video will be downloaded to {self.
|
|
99
|
+
logger.info(f"Video will be downloaded to {self._working_directory}")
|
|
98
100
|
|
|
99
101
|
def __del__(self) -> None:
|
|
100
102
|
r"""Deconstructor for the VideoDownloaderToolkit class.
|
|
@@ -109,7 +111,7 @@ class VideoDownloaderToolkit(BaseToolkit):
|
|
|
109
111
|
if getattr(sys, 'modules', None) is not None:
|
|
110
112
|
import shutil
|
|
111
113
|
|
|
112
|
-
shutil.rmtree(self.
|
|
114
|
+
shutil.rmtree(self._working_directory, ignore_errors=True)
|
|
113
115
|
except (ImportError, AttributeError):
|
|
114
116
|
# Skip cleanup if interpreter is shutting down
|
|
115
117
|
pass
|
|
@@ -120,12 +122,15 @@ class VideoDownloaderToolkit(BaseToolkit):
|
|
|
120
122
|
yt-dlp will detect if the video is downloaded automatically so there
|
|
121
123
|
is no need to check if the video exists.
|
|
122
124
|
|
|
125
|
+
Args:
|
|
126
|
+
url (str): The URL of the video to download.
|
|
127
|
+
|
|
123
128
|
Returns:
|
|
124
129
|
str: The path to the downloaded video file.
|
|
125
130
|
"""
|
|
126
131
|
import yt_dlp
|
|
127
132
|
|
|
128
|
-
video_template = self.
|
|
133
|
+
video_template = self._working_directory / "%(title)s.%(ext)s"
|
|
129
134
|
ydl_opts = {
|
|
130
135
|
'format': 'bestvideo+bestaudio/best',
|
|
131
136
|
'outtmpl': str(video_template),
|
|
@@ -172,7 +177,8 @@ class VideoDownloaderToolkit(BaseToolkit):
|
|
|
172
177
|
dividing the video into equal parts if an integer is provided.
|
|
173
178
|
|
|
174
179
|
Args:
|
|
175
|
-
|
|
180
|
+
video_path (str): The local path or URL of the video to take
|
|
181
|
+
screenshots.
|
|
176
182
|
amount (int): the amount of evenly split screenshots to capture.
|
|
177
183
|
|
|
178
184
|
Returns:
|
|
@@ -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 List, Literal, Optional
|
|
16
16
|
|