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,8 +10,12 @@
|
|
|
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-
|
|
14
|
-
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
|
+
import json
|
|
15
|
+
import os
|
|
16
|
+
from typing import Any, Dict, List, Optional
|
|
17
|
+
|
|
18
|
+
import requests
|
|
15
19
|
|
|
16
20
|
from camel.toolkits import FunctionTool
|
|
17
21
|
from camel.toolkits.base import BaseToolkit
|
|
@@ -30,7 +34,9 @@ class JinaRerankerToolkit(BaseToolkit):
|
|
|
30
34
|
def __init__(
|
|
31
35
|
self,
|
|
32
36
|
timeout: Optional[float] = None,
|
|
37
|
+
model_name: str = "jinaai/jina-reranker-m0",
|
|
33
38
|
device: Optional[str] = None,
|
|
39
|
+
use_api: bool = True,
|
|
34
40
|
) -> None:
|
|
35
41
|
r"""Initializes a new instance of the JinaRerankerToolkit class.
|
|
36
42
|
|
|
@@ -38,31 +44,56 @@ class JinaRerankerToolkit(BaseToolkit):
|
|
|
38
44
|
timeout (Optional[float]): The timeout value for API requests
|
|
39
45
|
in seconds. If None, no timeout is applied.
|
|
40
46
|
(default: :obj:`None`)
|
|
47
|
+
model_name (str): The reranker model name.
|
|
48
|
+
(default: :obj:`"jinaai/jina-reranker-m0"`)
|
|
41
49
|
device (Optional[str]): Device to load the model on. If None,
|
|
42
50
|
will use CUDA if available, otherwise CPU.
|
|
51
|
+
Only effective when use_api=False.
|
|
43
52
|
(default: :obj:`None`)
|
|
53
|
+
use_api (bool): A flag to switch between local model and API.
|
|
54
|
+
(default: :obj:`True`)
|
|
44
55
|
"""
|
|
45
|
-
import torch
|
|
46
|
-
from transformers import AutoModel
|
|
47
56
|
|
|
48
57
|
super().__init__(timeout=timeout)
|
|
49
58
|
|
|
50
|
-
self.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
self.use_api = use_api
|
|
60
|
+
self.model_name = model_name
|
|
61
|
+
|
|
62
|
+
if self.use_api:
|
|
63
|
+
self.model = None
|
|
64
|
+
self._api_key = os.environ.get("JINA_API_KEY", "None")
|
|
65
|
+
if self._api_key == "None":
|
|
66
|
+
raise ValueError(
|
|
67
|
+
"Missing or empty required API keys in "
|
|
68
|
+
"environment variables\n"
|
|
69
|
+
"You can obtain the API key from https://jina.ai/reranker/"
|
|
70
|
+
)
|
|
71
|
+
self.url = 'https://api.jina.ai/v1/rerank'
|
|
72
|
+
self.headers = {
|
|
73
|
+
'Content-Type': 'application/json',
|
|
74
|
+
'Accept': 'application/json',
|
|
75
|
+
'Authorization': f'Bearer {self._api_key}',
|
|
76
|
+
}
|
|
77
|
+
else:
|
|
78
|
+
import torch
|
|
79
|
+
from transformers import AutoModel
|
|
80
|
+
|
|
81
|
+
self.model = AutoModel.from_pretrained(
|
|
82
|
+
self.model_name,
|
|
83
|
+
torch_dtype="auto",
|
|
84
|
+
trust_remote_code=True,
|
|
85
|
+
)
|
|
86
|
+
self.device = (
|
|
87
|
+
device
|
|
88
|
+
if device is not None
|
|
89
|
+
else ("cuda" if torch.cuda.is_available() else "cpu")
|
|
90
|
+
)
|
|
91
|
+
self.model.to(self.device)
|
|
92
|
+
self.model.eval()
|
|
62
93
|
|
|
63
94
|
def _sort_documents(
|
|
64
95
|
self, documents: List[str], scores: List[float]
|
|
65
|
-
) -> List[
|
|
96
|
+
) -> List[Dict[str, object]]:
|
|
66
97
|
r"""Sort documents by their scores in descending order.
|
|
67
98
|
|
|
68
99
|
Args:
|
|
@@ -70,7 +101,7 @@ class JinaRerankerToolkit(BaseToolkit):
|
|
|
70
101
|
scores (List[float]): Corresponding scores for each document.
|
|
71
102
|
|
|
72
103
|
Returns:
|
|
73
|
-
List[
|
|
104
|
+
List[Dict[str, object]]: Sorted list of (document, score) pairs.
|
|
74
105
|
|
|
75
106
|
Raises:
|
|
76
107
|
ValueError: If documents and scores have different lengths.
|
|
@@ -80,14 +111,45 @@ class JinaRerankerToolkit(BaseToolkit):
|
|
|
80
111
|
doc_score_pairs = list(zip(documents, scores))
|
|
81
112
|
doc_score_pairs.sort(key=lambda x: x[1], reverse=True)
|
|
82
113
|
|
|
83
|
-
|
|
114
|
+
results = [
|
|
115
|
+
{'document': {'text': doc}, 'relevance_score': score}
|
|
116
|
+
for doc, score in doc_score_pairs
|
|
117
|
+
]
|
|
118
|
+
|
|
119
|
+
return results
|
|
120
|
+
|
|
121
|
+
def _call_jina_api(self, data: Dict[str, Any]) -> List[Dict[str, object]]:
|
|
122
|
+
r"""Makes a call to the JINA API for reranking.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
data (Dict[str]): The data to be passed into the api body.
|
|
126
|
+
|
|
127
|
+
Returns:
|
|
128
|
+
List[Dict[str, object]]: A list of dictionary containing
|
|
129
|
+
the reranked documents and their relevance scores.
|
|
130
|
+
"""
|
|
131
|
+
try:
|
|
132
|
+
response = requests.post(
|
|
133
|
+
self.url,
|
|
134
|
+
headers=self.headers,
|
|
135
|
+
data=json.dumps(data),
|
|
136
|
+
timeout=self.timeout,
|
|
137
|
+
)
|
|
138
|
+
response.raise_for_status()
|
|
139
|
+
results = [
|
|
140
|
+
{key: value for key, value in _res.items() if key != 'index'}
|
|
141
|
+
for _res in response.json()['results']
|
|
142
|
+
]
|
|
143
|
+
return results
|
|
144
|
+
except requests.exceptions.RequestException as e:
|
|
145
|
+
raise RuntimeError(f"Failed to get response from Jina AI: {e}")
|
|
84
146
|
|
|
85
147
|
def rerank_text_documents(
|
|
86
148
|
self,
|
|
87
149
|
query: str,
|
|
88
150
|
documents: List[str],
|
|
89
151
|
max_length: int = 1024,
|
|
90
|
-
) -> List[
|
|
152
|
+
) -> List[Dict[str, object]]:
|
|
91
153
|
r"""Reranks text documents based on their relevance to a text query.
|
|
92
154
|
|
|
93
155
|
Args:
|
|
@@ -97,21 +159,34 @@ class JinaRerankerToolkit(BaseToolkit):
|
|
|
97
159
|
(default: :obj:`1024`)
|
|
98
160
|
|
|
99
161
|
Returns:
|
|
100
|
-
List[
|
|
162
|
+
List[Dict[str, object]]: A list of dictionary containing
|
|
101
163
|
the reranked documents and their relevance scores.
|
|
102
164
|
"""
|
|
103
|
-
import torch
|
|
104
165
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
)
|
|
166
|
+
data = {
|
|
167
|
+
'model': self.model_name,
|
|
168
|
+
'query': query,
|
|
169
|
+
'top_n': len(documents),
|
|
170
|
+
'documents': documents,
|
|
171
|
+
'return_documents': True,
|
|
172
|
+
}
|
|
109
173
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
174
|
+
if self.use_api:
|
|
175
|
+
return self._call_jina_api(data)
|
|
176
|
+
|
|
177
|
+
else:
|
|
178
|
+
import torch
|
|
179
|
+
|
|
180
|
+
if self.model is None:
|
|
181
|
+
raise ValueError(
|
|
182
|
+
"Model has not been initialized or failed to initialize."
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
with torch.inference_mode():
|
|
186
|
+
text_pairs = [[query, doc] for doc in documents]
|
|
187
|
+
scores = self.model.compute_score(
|
|
188
|
+
text_pairs, max_length=max_length, doc_type="text"
|
|
189
|
+
)
|
|
115
190
|
|
|
116
191
|
return self._sort_documents(documents, scores)
|
|
117
192
|
|
|
@@ -120,7 +195,7 @@ class JinaRerankerToolkit(BaseToolkit):
|
|
|
120
195
|
query: str,
|
|
121
196
|
documents: List[str],
|
|
122
197
|
max_length: int = 2048,
|
|
123
|
-
) -> List[
|
|
198
|
+
) -> List[Dict[str, object]]:
|
|
124
199
|
r"""Reranks image documents based on their relevance to a text query.
|
|
125
200
|
|
|
126
201
|
Args:
|
|
@@ -130,21 +205,33 @@ class JinaRerankerToolkit(BaseToolkit):
|
|
|
130
205
|
(default: :obj:`2048`)
|
|
131
206
|
|
|
132
207
|
Returns:
|
|
133
|
-
List[
|
|
208
|
+
List[Dict[str, object]]: A list of dictionary containing
|
|
134
209
|
the reranked image URLs/paths and their relevance scores.
|
|
135
210
|
"""
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
211
|
+
data = {
|
|
212
|
+
'model': self.model_name,
|
|
213
|
+
'query': query,
|
|
214
|
+
'top_n': len(documents),
|
|
215
|
+
'documents': documents,
|
|
216
|
+
'return_documents': True,
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
if self.use_api:
|
|
220
|
+
return self._call_jina_api(data)
|
|
221
|
+
|
|
222
|
+
else:
|
|
223
|
+
import torch
|
|
224
|
+
|
|
225
|
+
if self.model is None:
|
|
226
|
+
raise ValueError(
|
|
227
|
+
"Model has not been initialized or failed to initialize."
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
with torch.inference_mode():
|
|
231
|
+
image_pairs = [[query, doc] for doc in documents]
|
|
232
|
+
scores = self.model.compute_score(
|
|
233
|
+
image_pairs, max_length=max_length, doc_type="image"
|
|
234
|
+
)
|
|
148
235
|
|
|
149
236
|
return self._sort_documents(documents, scores)
|
|
150
237
|
|
|
@@ -153,7 +240,7 @@ class JinaRerankerToolkit(BaseToolkit):
|
|
|
153
240
|
image_query: str,
|
|
154
241
|
documents: List[str],
|
|
155
242
|
max_length: int = 2048,
|
|
156
|
-
) -> List[
|
|
243
|
+
) -> List[Dict[str, object]]:
|
|
157
244
|
r"""Reranks text documents based on their relevance to an image query.
|
|
158
245
|
|
|
159
246
|
Args:
|
|
@@ -163,30 +250,45 @@ class JinaRerankerToolkit(BaseToolkit):
|
|
|
163
250
|
(default: :obj:`2048`)
|
|
164
251
|
|
|
165
252
|
Returns:
|
|
166
|
-
List[
|
|
253
|
+
List[Dict[str, object]]: A list of dictionary containing
|
|
167
254
|
the reranked documents and their relevance scores.
|
|
168
255
|
"""
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
256
|
+
data = {
|
|
257
|
+
'model': self.model_name,
|
|
258
|
+
'query': image_query,
|
|
259
|
+
'top_n': len(documents),
|
|
260
|
+
'documents': documents,
|
|
261
|
+
'return_documents': True,
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
if self.use_api:
|
|
265
|
+
return self._call_jina_api(data)
|
|
266
|
+
|
|
267
|
+
else:
|
|
268
|
+
import torch
|
|
269
|
+
|
|
270
|
+
if self.model is None:
|
|
271
|
+
raise ValueError(
|
|
272
|
+
"Model has not been initialized or failed to initialize."
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
with torch.inference_mode():
|
|
276
|
+
image_pairs = [[image_query, doc] for doc in documents]
|
|
277
|
+
scores = self.model.compute_score(
|
|
278
|
+
image_pairs,
|
|
279
|
+
max_length=max_length,
|
|
280
|
+
query_type="image",
|
|
281
|
+
doc_type="text",
|
|
282
|
+
)
|
|
283
|
+
|
|
284
|
+
return self._sort_documents(documents, scores)
|
|
183
285
|
|
|
184
286
|
def image_query_image_documents(
|
|
185
287
|
self,
|
|
186
288
|
image_query: str,
|
|
187
289
|
documents: List[str],
|
|
188
290
|
max_length: int = 2048,
|
|
189
|
-
) -> List[
|
|
291
|
+
) -> List[Dict[str, object]]:
|
|
190
292
|
r"""Reranks image documents based on their relevance to an image query.
|
|
191
293
|
|
|
192
294
|
Args:
|
|
@@ -196,24 +298,38 @@ class JinaRerankerToolkit(BaseToolkit):
|
|
|
196
298
|
(default: :obj:`2048`)
|
|
197
299
|
|
|
198
300
|
Returns:
|
|
199
|
-
List[
|
|
301
|
+
List[Dict[str, object]]: A list of dictionary containing
|
|
200
302
|
the reranked image URLs/paths and their relevance scores.
|
|
201
303
|
"""
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
304
|
+
data = {
|
|
305
|
+
'model': self.model_name,
|
|
306
|
+
'query': image_query,
|
|
307
|
+
'top_n': len(documents),
|
|
308
|
+
'documents': documents,
|
|
309
|
+
'return_documents': True,
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
if self.use_api:
|
|
313
|
+
return self._call_jina_api(data)
|
|
314
|
+
|
|
315
|
+
else:
|
|
316
|
+
import torch
|
|
317
|
+
|
|
318
|
+
if self.model is None:
|
|
319
|
+
raise ValueError(
|
|
320
|
+
"Model has not been initialized or failed to initialize."
|
|
321
|
+
)
|
|
322
|
+
|
|
323
|
+
with torch.inference_mode():
|
|
324
|
+
image_pairs = [[image_query, doc] for doc in documents]
|
|
325
|
+
scores = self.model.compute_score(
|
|
326
|
+
image_pairs,
|
|
327
|
+
max_length=max_length,
|
|
328
|
+
query_type="image",
|
|
329
|
+
doc_type="image",
|
|
330
|
+
)
|
|
331
|
+
|
|
332
|
+
return self._sort_documents(documents, scores)
|
|
217
333
|
|
|
218
334
|
def get_tools(self) -> List[FunctionTool]:
|
|
219
335
|
r"""Returns a list of FunctionTool objects representing the
|
camel/toolkits/klavis_toolkit.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
3
|
# you may not use this file except in compliance with the License.
|
|
4
4
|
# You may obtain a copy of the License at
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
|
-
# ========= Copyright 2023-
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
|
|
15
15
|
import os
|
|
16
16
|
import urllib.parse
|
|
@@ -21,7 +21,11 @@ import requests
|
|
|
21
21
|
from camel.logger import get_logger
|
|
22
22
|
from camel.toolkits.base import BaseToolkit
|
|
23
23
|
from camel.toolkits.function_tool import FunctionTool
|
|
24
|
-
from camel.utils import
|
|
24
|
+
from camel.utils import (
|
|
25
|
+
MCPServer,
|
|
26
|
+
api_keys_required,
|
|
27
|
+
dependencies_required,
|
|
28
|
+
)
|
|
25
29
|
|
|
26
30
|
logger = get_logger(__name__)
|
|
27
31
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ========= Copyright 2023-
|
|
1
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
2
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
3
|
# you may not use this file except in compliance with the License.
|
|
4
4
|
# You may obtain a copy of the License at
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
# See the License for the specific language governing permissions and
|
|
12
12
|
# limitations under the License.
|
|
13
|
-
# ========= Copyright 2023-
|
|
13
|
+
# ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
14
14
|
|
|
15
15
|
import json
|
|
16
16
|
import os
|
|
@@ -0,0 +1,104 @@
|
|
|
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
|
+
from typing import Dict, List, Optional
|
|
16
|
+
|
|
17
|
+
from camel.loaders.markitdown import MarkItDownLoader
|
|
18
|
+
from camel.logger import get_logger
|
|
19
|
+
from camel.toolkits.base import BaseToolkit
|
|
20
|
+
from camel.toolkits.function_tool import FunctionTool
|
|
21
|
+
from camel.utils import MCPServer
|
|
22
|
+
|
|
23
|
+
logger = get_logger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@MCPServer()
|
|
27
|
+
class MarkItDownToolkit(BaseToolkit):
|
|
28
|
+
r"""A class representing a toolkit for MarkItDown.
|
|
29
|
+
|
|
30
|
+
.. deprecated::
|
|
31
|
+
MarkItDownToolkit is deprecated. Use FileToolkit instead, which now
|
|
32
|
+
includes the same functionality through its read_file method that
|
|
33
|
+
supports both single files and multiple files.
|
|
34
|
+
|
|
35
|
+
Example migration:
|
|
36
|
+
# Old way
|
|
37
|
+
from camel.toolkits import MarkItDownToolkit
|
|
38
|
+
toolkit = MarkItDownToolkit()
|
|
39
|
+
content = toolkit.read_files(['file1.pdf', 'file2.docx'])
|
|
40
|
+
|
|
41
|
+
# New way
|
|
42
|
+
from camel.toolkits import FileToolkit
|
|
43
|
+
toolkit = FileToolkit()
|
|
44
|
+
content = toolkit.read_file(['file1.pdf', 'file2.docx'])
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
def __init__(
|
|
48
|
+
self,
|
|
49
|
+
timeout: Optional[float] = None,
|
|
50
|
+
):
|
|
51
|
+
import warnings
|
|
52
|
+
|
|
53
|
+
warnings.warn(
|
|
54
|
+
"MarkItDownToolkit is deprecated and will be removed in a future "
|
|
55
|
+
"version. Please use FileToolkit instead, which now includes "
|
|
56
|
+
"read_file method that supports both single and multiple files.",
|
|
57
|
+
DeprecationWarning,
|
|
58
|
+
stacklevel=2,
|
|
59
|
+
)
|
|
60
|
+
super().__init__(timeout=timeout)
|
|
61
|
+
|
|
62
|
+
def read_files(self, file_paths: List[str]) -> Dict[str, str]:
|
|
63
|
+
r"""Scrapes content from a list of files and converts it to Markdown.
|
|
64
|
+
|
|
65
|
+
This function takes a list of local file paths, attempts to convert
|
|
66
|
+
each file into Markdown format, and returns the converted content.
|
|
67
|
+
The conversion is performed in parallel for efficiency.
|
|
68
|
+
|
|
69
|
+
Supported file formats include:
|
|
70
|
+
- PDF (.pdf)
|
|
71
|
+
- Microsoft Office: Word (.doc, .docx), Excel (.xls, .xlsx),
|
|
72
|
+
PowerPoint (.ppt, .pptx)
|
|
73
|
+
- EPUB (.epub)
|
|
74
|
+
- HTML (.html, .htm)
|
|
75
|
+
- Images (.jpg, .jpeg, .png) for OCR
|
|
76
|
+
- Audio (.mp3, .wav) for transcription
|
|
77
|
+
- Text-based formats (.csv, .json, .xml, .txt)
|
|
78
|
+
- ZIP archives (.zip)
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
file_paths (List[str]): A list of local file paths to be
|
|
82
|
+
converted.
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
Dict[str, str]: A dictionary where keys are the input file paths
|
|
86
|
+
and values are the corresponding content in Markdown format.
|
|
87
|
+
If conversion of a file fails, the value will contain an
|
|
88
|
+
error message.
|
|
89
|
+
"""
|
|
90
|
+
return MarkItDownLoader().convert_files(
|
|
91
|
+
file_paths=file_paths, parallel=True
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
def get_tools(self) -> List[FunctionTool]:
|
|
95
|
+
r"""Returns a list of FunctionTool objects representing the
|
|
96
|
+
functions in the toolkit.
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
List[FunctionTool]: A list of FunctionTool objects
|
|
100
|
+
representing the functions in the toolkit.
|
|
101
|
+
"""
|
|
102
|
+
return [
|
|
103
|
+
FunctionTool(self.read_files),
|
|
104
|
+
]
|
camel/toolkits/math_toolkit.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,8 +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
|
|
|
15
|
+
import warnings
|
|
15
16
|
from typing import List
|
|
16
17
|
|
|
17
18
|
from camel.toolkits.base import BaseToolkit
|
|
@@ -27,7 +28,7 @@ class MathToolkit(BaseToolkit):
|
|
|
27
28
|
addition, subtraction, multiplication, division, and rounding.
|
|
28
29
|
"""
|
|
29
30
|
|
|
30
|
-
def
|
|
31
|
+
def math_add(self, a: float, b: float) -> float:
|
|
31
32
|
r"""Adds two numbers.
|
|
32
33
|
|
|
33
34
|
Args:
|
|
@@ -39,7 +40,7 @@ class MathToolkit(BaseToolkit):
|
|
|
39
40
|
"""
|
|
40
41
|
return a + b
|
|
41
42
|
|
|
42
|
-
def
|
|
43
|
+
def math_subtract(self, a: float, b: float) -> float:
|
|
43
44
|
r"""Do subtraction between two numbers.
|
|
44
45
|
|
|
45
46
|
Args:
|
|
@@ -51,7 +52,9 @@ class MathToolkit(BaseToolkit):
|
|
|
51
52
|
"""
|
|
52
53
|
return a - b
|
|
53
54
|
|
|
54
|
-
def
|
|
55
|
+
def math_multiply(
|
|
56
|
+
self, a: float, b: float, decimal_places: int = 2
|
|
57
|
+
) -> float:
|
|
55
58
|
r"""Multiplies two numbers.
|
|
56
59
|
|
|
57
60
|
Args:
|
|
@@ -65,7 +68,9 @@ class MathToolkit(BaseToolkit):
|
|
|
65
68
|
"""
|
|
66
69
|
return round(a * b, decimal_places)
|
|
67
70
|
|
|
68
|
-
def
|
|
71
|
+
def math_divide(
|
|
72
|
+
self, a: float, b: float, decimal_places: int = 2
|
|
73
|
+
) -> float:
|
|
69
74
|
r"""Divides two numbers.
|
|
70
75
|
|
|
71
76
|
Args:
|
|
@@ -79,7 +84,7 @@ class MathToolkit(BaseToolkit):
|
|
|
79
84
|
"""
|
|
80
85
|
return round(a / b, decimal_places)
|
|
81
86
|
|
|
82
|
-
def
|
|
87
|
+
def math_round(self, a: float, decimal_places: int = 0) -> float:
|
|
83
88
|
r"""Rounds a number to a specified number of decimal places.
|
|
84
89
|
|
|
85
90
|
Args:
|
|
@@ -101,9 +106,58 @@ class MathToolkit(BaseToolkit):
|
|
|
101
106
|
representing the functions in the toolkit.
|
|
102
107
|
"""
|
|
103
108
|
return [
|
|
104
|
-
FunctionTool(self.
|
|
105
|
-
FunctionTool(self.
|
|
106
|
-
FunctionTool(self.
|
|
107
|
-
FunctionTool(self.
|
|
108
|
-
FunctionTool(self.
|
|
109
|
+
FunctionTool(self.math_add),
|
|
110
|
+
FunctionTool(self.math_subtract),
|
|
111
|
+
FunctionTool(self.math_multiply),
|
|
112
|
+
FunctionTool(self.math_divide),
|
|
113
|
+
FunctionTool(self.math_round),
|
|
109
114
|
]
|
|
115
|
+
|
|
116
|
+
# Deprecated method aliases for backward compatibility
|
|
117
|
+
def add(self, *args, **kwargs):
|
|
118
|
+
r"""Deprecated: Use math_add instead."""
|
|
119
|
+
warnings.warn(
|
|
120
|
+
"add is deprecated. Use math_add instead.",
|
|
121
|
+
DeprecationWarning,
|
|
122
|
+
stacklevel=2,
|
|
123
|
+
)
|
|
124
|
+
return self.math_add(*args, **kwargs)
|
|
125
|
+
|
|
126
|
+
def sub(self, *args, **kwargs):
|
|
127
|
+
r"""Deprecated: Use math_subtract instead."""
|
|
128
|
+
warnings.warn(
|
|
129
|
+
"sub is deprecated. Use math_subtract instead.",
|
|
130
|
+
DeprecationWarning,
|
|
131
|
+
stacklevel=2,
|
|
132
|
+
)
|
|
133
|
+
return self.math_subtract(*args, **kwargs)
|
|
134
|
+
|
|
135
|
+
def multiply(self, *args, **kwargs):
|
|
136
|
+
r"""Deprecated: Use math_multiply instead."""
|
|
137
|
+
warnings.warn(
|
|
138
|
+
"multiply is deprecated. Use math_multiply instead.",
|
|
139
|
+
DeprecationWarning,
|
|
140
|
+
stacklevel=2,
|
|
141
|
+
)
|
|
142
|
+
return self.math_multiply(*args, **kwargs)
|
|
143
|
+
|
|
144
|
+
def divide(self, *args, **kwargs):
|
|
145
|
+
r"""Deprecated: Use math_divide instead."""
|
|
146
|
+
warnings.warn(
|
|
147
|
+
"divide is deprecated. Use math_divide instead.",
|
|
148
|
+
DeprecationWarning,
|
|
149
|
+
stacklevel=2,
|
|
150
|
+
)
|
|
151
|
+
return self.math_divide(*args, **kwargs)
|
|
152
|
+
|
|
153
|
+
def round(self, *args, **kwargs):
|
|
154
|
+
r"""Deprecated: Use math_round instead. Note: This was shadowing
|
|
155
|
+
Python's built-in round().
|
|
156
|
+
"""
|
|
157
|
+
warnings.warn(
|
|
158
|
+
"round is deprecated. Use math_round instead. This was "
|
|
159
|
+
"shadowing Python's built-in round().",
|
|
160
|
+
DeprecationWarning,
|
|
161
|
+
stacklevel=2,
|
|
162
|
+
)
|
|
163
|
+
return self.math_round(*args, **kwargs)
|