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.

Files changed (506) hide show
  1. camel/__init__.py +3 -3
  2. camel/agents/__init__.py +2 -2
  3. camel/agents/_types.py +9 -4
  4. camel/agents/_utils.py +40 -2
  5. camel/agents/base.py +2 -2
  6. camel/agents/chat_agent.py +5012 -902
  7. camel/agents/critic_agent.py +2 -2
  8. camel/agents/deductive_reasoner_agent.py +56 -56
  9. camel/agents/embodied_agent.py +2 -2
  10. camel/agents/knowledge_graph_agent.py +20 -20
  11. camel/agents/mcp_agent.py +39 -36
  12. camel/agents/multi_hop_generator_agent.py +3 -3
  13. camel/agents/programmed_agent_instruction.py +2 -2
  14. camel/agents/repo_agent.py +4 -3
  15. camel/agents/role_assignment_agent.py +2 -2
  16. camel/agents/search_agent.py +2 -2
  17. camel/agents/task_agent.py +2 -2
  18. camel/agents/tool_agents/__init__.py +2 -2
  19. camel/agents/tool_agents/base.py +2 -2
  20. camel/agents/tool_agents/hugging_face_tool_agent.py +3 -3
  21. camel/benchmarks/__init__.py +2 -2
  22. camel/benchmarks/apibank.py +5 -5
  23. camel/benchmarks/apibench.py +2 -2
  24. camel/benchmarks/base.py +2 -2
  25. camel/benchmarks/browsecomp.py +44 -33
  26. camel/benchmarks/gaia.py +17 -13
  27. camel/benchmarks/mock_website/README.md +94 -0
  28. camel/benchmarks/mock_website/mock_web.py +299 -0
  29. camel/benchmarks/mock_website/requirements.txt +3 -0
  30. camel/benchmarks/mock_website/shopping_mall/app.py +465 -0
  31. camel/benchmarks/mock_website/task.json +104 -0
  32. camel/benchmarks/nexus.py +3 -3
  33. camel/benchmarks/ragbench.py +2 -2
  34. camel/bots/__init__.py +2 -2
  35. camel/bots/discord/__init__.py +2 -2
  36. camel/bots/discord/discord_app.py +2 -2
  37. camel/bots/discord/discord_installation.py +2 -2
  38. camel/bots/discord/discord_store.py +3 -3
  39. camel/bots/slack/__init__.py +2 -2
  40. camel/bots/slack/models.py +4 -4
  41. camel/bots/slack/slack_app.py +2 -2
  42. camel/bots/telegram_bot.py +2 -2
  43. camel/configs/__init__.py +26 -2
  44. camel/configs/aihubmix_config.py +90 -0
  45. camel/configs/aiml_config.py +2 -2
  46. camel/configs/amd_config.py +70 -0
  47. camel/configs/anthropic_config.py +8 -7
  48. camel/configs/base_config.py +2 -2
  49. camel/configs/bedrock_config.py +5 -3
  50. camel/configs/cerebras_config.py +98 -0
  51. camel/configs/cohere_config.py +3 -3
  52. camel/configs/cometapi_config.py +106 -0
  53. camel/configs/crynux_config.py +94 -0
  54. camel/configs/deepseek_config.py +9 -8
  55. camel/configs/gemini_config.py +6 -4
  56. camel/configs/groq_config.py +6 -4
  57. camel/configs/internlm_config.py +6 -4
  58. camel/configs/litellm_config.py +2 -2
  59. camel/configs/lmstudio_config.py +6 -4
  60. camel/configs/minimax_config.py +95 -0
  61. camel/configs/mistral_config.py +3 -3
  62. camel/configs/modelscope_config.py +5 -3
  63. camel/configs/moonshot_config.py +2 -2
  64. camel/configs/nebius_config.py +105 -0
  65. camel/configs/netmind_config.py +2 -2
  66. camel/configs/novita_config.py +2 -2
  67. camel/configs/nvidia_config.py +2 -2
  68. camel/configs/ollama_config.py +2 -2
  69. camel/configs/openai_config.py +8 -3
  70. camel/configs/openrouter_config.py +6 -4
  71. camel/configs/ppio_config.py +2 -2
  72. camel/configs/qianfan_config.py +85 -0
  73. camel/configs/qwen_config.py +2 -2
  74. camel/configs/reka_config.py +3 -3
  75. camel/configs/samba_config.py +8 -6
  76. camel/configs/sglang_config.py +2 -2
  77. camel/configs/siliconflow_config.py +2 -2
  78. camel/configs/togetherai_config.py +2 -2
  79. camel/configs/vllm_config.py +4 -2
  80. camel/configs/watsonx_config.py +2 -2
  81. camel/configs/yi_config.py +6 -4
  82. camel/configs/zhipuai_config.py +6 -4
  83. camel/{data_collector → data_collectors}/__init__.py +2 -2
  84. camel/{data_collector → data_collectors}/alpaca_collector.py +19 -10
  85. camel/{data_collector → data_collectors}/base.py +2 -2
  86. camel/{data_collector → data_collectors}/sharegpt_collector.py +3 -3
  87. camel/datagen/__init__.py +2 -2
  88. camel/datagen/cot_datagen.py +32 -37
  89. camel/datagen/evol_instruct/__init__.py +2 -2
  90. camel/datagen/evol_instruct/evol_instruct.py +2 -2
  91. camel/datagen/evol_instruct/scorer.py +24 -25
  92. camel/datagen/evol_instruct/templates.py +48 -48
  93. camel/datagen/self_improving_cot.py +5 -5
  94. camel/datagen/self_instruct/__init__.py +2 -2
  95. camel/datagen/self_instruct/filter/__init__.py +2 -2
  96. camel/datagen/self_instruct/filter/filter_function.py +2 -2
  97. camel/datagen/self_instruct/filter/filter_registry.py +2 -2
  98. camel/datagen/self_instruct/filter/instruction_filter.py +2 -2
  99. camel/datagen/self_instruct/self_instruct.py +2 -2
  100. camel/datagen/self_instruct/templates.py +47 -47
  101. camel/datagen/source2synth/__init__.py +2 -2
  102. camel/datagen/source2synth/data_processor.py +2 -2
  103. camel/datagen/source2synth/models.py +2 -2
  104. camel/datagen/source2synth/user_data_processor_config.py +2 -2
  105. camel/datahubs/__init__.py +2 -2
  106. camel/datahubs/base.py +2 -2
  107. camel/datahubs/huggingface.py +2 -2
  108. camel/datahubs/models.py +2 -2
  109. camel/datasets/__init__.py +2 -2
  110. camel/datasets/base_generator.py +41 -12
  111. camel/datasets/few_shot_generator.py +18 -18
  112. camel/datasets/models.py +3 -3
  113. camel/datasets/self_instruct_generator.py +2 -2
  114. camel/datasets/static_dataset.py +152 -2
  115. camel/embeddings/__init__.py +2 -2
  116. camel/embeddings/azure_embedding.py +2 -2
  117. camel/embeddings/base.py +2 -2
  118. camel/embeddings/gemini_embedding.py +2 -2
  119. camel/embeddings/jina_embedding.py +10 -3
  120. camel/embeddings/mistral_embedding.py +2 -2
  121. camel/embeddings/openai_compatible_embedding.py +2 -2
  122. camel/embeddings/openai_embedding.py +2 -2
  123. camel/embeddings/sentence_transformers_embeddings.py +4 -4
  124. camel/embeddings/together_embedding.py +2 -2
  125. camel/embeddings/vlm_embedding.py +11 -4
  126. camel/environments/__init__.py +14 -2
  127. camel/environments/models.py +2 -2
  128. camel/environments/multi_step.py +2 -2
  129. camel/environments/rlcards_env.py +860 -0
  130. camel/environments/single_step.py +30 -5
  131. camel/environments/tic_tac_toe.py +3 -3
  132. camel/extractors/__init__.py +2 -2
  133. camel/extractors/base.py +2 -2
  134. camel/extractors/python_strategies.py +2 -2
  135. camel/generators.py +2 -2
  136. camel/human.py +2 -2
  137. camel/interpreters/__init__.py +4 -2
  138. camel/interpreters/base.py +16 -3
  139. camel/interpreters/docker/Dockerfile +53 -7
  140. camel/interpreters/docker_interpreter.py +70 -11
  141. camel/interpreters/e2b_interpreter.py +59 -11
  142. camel/interpreters/internal_python_interpreter.py +81 -4
  143. camel/interpreters/interpreter_error.py +2 -2
  144. camel/interpreters/ipython_interpreter.py +23 -5
  145. camel/interpreters/microsandbox_interpreter.py +395 -0
  146. camel/interpreters/subprocess_interpreter.py +36 -4
  147. camel/loaders/__init__.py +17 -5
  148. camel/loaders/apify_reader.py +2 -2
  149. camel/loaders/base_io.py +2 -2
  150. camel/loaders/base_loader.py +85 -0
  151. camel/loaders/chunkr_reader.py +128 -93
  152. camel/loaders/crawl4ai_reader.py +2 -2
  153. camel/loaders/firecrawl_reader.py +6 -6
  154. camel/loaders/jina_url_reader.py +2 -2
  155. camel/loaders/markitdown.py +2 -2
  156. camel/loaders/mineru_extractor.py +2 -2
  157. camel/loaders/mistral_reader.py +148 -0
  158. camel/loaders/scrapegraph_reader.py +2 -2
  159. camel/loaders/unstructured_io.py +2 -2
  160. camel/logger.py +5 -5
  161. camel/memories/__init__.py +2 -2
  162. camel/memories/agent_memories.py +86 -3
  163. camel/memories/base.py +36 -2
  164. camel/memories/blocks/__init__.py +2 -2
  165. camel/memories/blocks/chat_history_block.py +126 -9
  166. camel/memories/blocks/vectordb_block.py +10 -3
  167. camel/memories/context_creators/__init__.py +2 -2
  168. camel/memories/context_creators/score_based.py +31 -239
  169. camel/memories/records.py +98 -13
  170. camel/messages/__init__.py +2 -2
  171. camel/messages/base.py +193 -46
  172. camel/messages/conversion/__init__.py +2 -2
  173. camel/messages/conversion/alpaca.py +2 -2
  174. camel/messages/conversion/conversation_models.py +2 -2
  175. camel/messages/conversion/sharegpt/__init__.py +2 -2
  176. camel/messages/conversion/sharegpt/function_call_formatter.py +2 -2
  177. camel/messages/conversion/sharegpt/hermes/__init__.py +2 -2
  178. camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +2 -2
  179. camel/messages/func_message.py +54 -17
  180. camel/models/__init__.py +18 -2
  181. camel/models/_utils.py +3 -3
  182. camel/models/aihubmix_model.py +83 -0
  183. camel/models/aiml_model.py +11 -18
  184. camel/models/amd_model.py +101 -0
  185. camel/models/anthropic_model.py +127 -20
  186. camel/models/aws_bedrock_model.py +12 -35
  187. camel/models/azure_openai_model.py +263 -63
  188. camel/models/base_audio_model.py +5 -3
  189. camel/models/base_model.py +195 -26
  190. camel/models/cerebras_model.py +83 -0
  191. camel/models/cohere_model.py +81 -21
  192. camel/models/cometapi_model.py +83 -0
  193. camel/models/crynux_model.py +87 -0
  194. camel/models/deepseek_model.py +61 -59
  195. camel/models/fish_audio_model.py +8 -2
  196. camel/models/gemini_model.py +439 -30
  197. camel/models/groq_model.py +11 -19
  198. camel/models/internlm_model.py +11 -18
  199. camel/models/litellm_model.py +94 -34
  200. camel/models/lmstudio_model.py +17 -20
  201. camel/models/minimax_model.py +83 -0
  202. camel/models/mistral_model.py +84 -19
  203. camel/models/model_factory.py +49 -6
  204. camel/models/model_manager.py +33 -11
  205. camel/models/modelscope_model.py +13 -193
  206. camel/models/moonshot_model.py +195 -21
  207. camel/models/nebius_model.py +83 -0
  208. camel/models/nemotron_model.py +19 -9
  209. camel/models/netmind_model.py +11 -18
  210. camel/models/novita_model.py +11 -18
  211. camel/models/nvidia_model.py +11 -18
  212. camel/models/ollama_model.py +14 -21
  213. camel/models/openai_audio_models.py +2 -2
  214. camel/models/openai_compatible_model.py +234 -27
  215. camel/models/openai_model.py +255 -39
  216. camel/models/openrouter_model.py +11 -19
  217. camel/models/ppio_model.py +11 -18
  218. camel/models/qianfan_model.py +89 -0
  219. camel/models/qwen_model.py +13 -193
  220. camel/models/reka_model.py +90 -21
  221. camel/models/reward/__init__.py +2 -2
  222. camel/models/reward/base_reward_model.py +2 -2
  223. camel/models/reward/evaluator.py +2 -2
  224. camel/models/reward/nemotron_model.py +2 -2
  225. camel/models/reward/skywork_model.py +2 -2
  226. camel/models/samba_model.py +117 -49
  227. camel/models/sglang_model.py +162 -42
  228. camel/models/siliconflow_model.py +12 -35
  229. camel/models/stub_model.py +10 -7
  230. camel/models/togetherai_model.py +11 -18
  231. camel/models/vllm_model.py +10 -18
  232. camel/models/volcano_model.py +16 -20
  233. camel/models/watsonx_model.py +69 -19
  234. camel/models/yi_model.py +11 -18
  235. camel/models/zhipuai_model.py +70 -18
  236. camel/parsers/__init__.py +18 -0
  237. camel/parsers/mcp_tool_call_parser.py +176 -0
  238. camel/personas/__init__.py +2 -2
  239. camel/personas/persona.py +2 -2
  240. camel/personas/persona_hub.py +2 -2
  241. camel/prompts/__init__.py +2 -2
  242. camel/prompts/ai_society.py +2 -2
  243. camel/prompts/base.py +2 -2
  244. camel/prompts/code.py +2 -2
  245. camel/prompts/evaluation.py +2 -2
  246. camel/prompts/generate_text_embedding_data.py +2 -2
  247. camel/prompts/image_craft.py +2 -2
  248. camel/prompts/misalignment.py +2 -2
  249. camel/prompts/multi_condition_image_craft.py +2 -2
  250. camel/prompts/object_recognition.py +2 -2
  251. camel/prompts/persona_hub.py +3 -3
  252. camel/prompts/prompt_templates.py +2 -2
  253. camel/prompts/role_description_prompt_template.py +2 -2
  254. camel/prompts/solution_extraction.py +8 -8
  255. camel/prompts/task_prompt_template.py +2 -2
  256. camel/prompts/translation.py +2 -2
  257. camel/prompts/video_description_prompt.py +3 -3
  258. camel/responses/__init__.py +2 -2
  259. camel/responses/agent_responses.py +2 -2
  260. camel/retrievers/__init__.py +2 -2
  261. camel/retrievers/auto_retriever.py +23 -3
  262. camel/retrievers/base.py +2 -2
  263. camel/retrievers/bm25_retriever.py +3 -4
  264. camel/retrievers/cohere_rerank_retriever.py +2 -2
  265. camel/retrievers/hybrid_retrival.py +4 -4
  266. camel/retrievers/vector_retriever.py +2 -2
  267. camel/runtimes/Dockerfile.multi-toolkit +90 -0
  268. camel/{runtime → runtimes}/__init__.py +2 -2
  269. camel/runtimes/api.py +153 -0
  270. camel/{runtime → runtimes}/base.py +2 -2
  271. camel/{runtime → runtimes}/configs.py +13 -13
  272. camel/{runtime → runtimes}/daytona_runtime.py +18 -19
  273. camel/{runtime → runtimes}/docker_runtime.py +13 -13
  274. camel/{runtime → runtimes}/llm_guard_runtime.py +28 -28
  275. camel/{runtime → runtimes}/remote_http_runtime.py +12 -12
  276. camel/{runtime → runtimes}/ubuntu_docker_runtime.py +3 -3
  277. camel/{runtime → runtimes}/utils/__init__.py +2 -2
  278. camel/{runtime → runtimes}/utils/function_risk_toolkit.py +2 -2
  279. camel/{runtime → runtimes}/utils/ignore_risk_toolkit.py +2 -2
  280. camel/schemas/__init__.py +2 -2
  281. camel/schemas/base.py +2 -2
  282. camel/schemas/openai_converter.py +3 -3
  283. camel/schemas/outlines_converter.py +2 -2
  284. camel/services/agent_openapi_server.py +380 -0
  285. camel/societies/__init__.py +4 -2
  286. camel/societies/babyagi_playing.py +2 -2
  287. camel/societies/role_playing.py +201 -80
  288. camel/societies/workforce/__init__.py +10 -3
  289. camel/societies/workforce/base.py +9 -5
  290. camel/societies/workforce/events.py +143 -0
  291. camel/societies/workforce/prompts.py +258 -33
  292. camel/societies/workforce/role_playing_worker.py +95 -30
  293. camel/societies/workforce/single_agent_worker.py +659 -30
  294. camel/societies/workforce/structured_output_handler.py +512 -0
  295. camel/societies/workforce/task_channel.py +182 -38
  296. camel/societies/workforce/utils.py +784 -18
  297. camel/societies/workforce/worker.py +96 -28
  298. camel/societies/workforce/workflow_memory_manager.py +1746 -0
  299. camel/societies/workforce/workforce.py +5730 -366
  300. camel/societies/workforce/workforce_callback.py +103 -0
  301. camel/societies/workforce/workforce_logger.py +647 -0
  302. camel/societies/workforce/workforce_metrics.py +33 -0
  303. camel/storages/__init__.py +10 -2
  304. camel/storages/graph_storages/__init__.py +2 -2
  305. camel/storages/graph_storages/base.py +2 -2
  306. camel/storages/graph_storages/graph_element.py +2 -2
  307. camel/storages/graph_storages/nebula_graph.py +4 -4
  308. camel/storages/graph_storages/neo4j_graph.py +7 -7
  309. camel/storages/key_value_storages/__init__.py +2 -2
  310. camel/storages/key_value_storages/base.py +2 -2
  311. camel/storages/key_value_storages/in_memory.py +2 -2
  312. camel/storages/key_value_storages/json.py +17 -4
  313. camel/storages/key_value_storages/mem0_cloud.py +50 -49
  314. camel/storages/key_value_storages/redis.py +2 -2
  315. camel/storages/object_storages/__init__.py +2 -2
  316. camel/storages/object_storages/amazon_s3.py +2 -2
  317. camel/storages/object_storages/azure_blob.py +2 -2
  318. camel/storages/object_storages/base.py +2 -2
  319. camel/storages/object_storages/google_cloud.py +3 -3
  320. camel/storages/vectordb_storages/__init__.py +12 -2
  321. camel/storages/vectordb_storages/base.py +2 -2
  322. camel/storages/vectordb_storages/chroma.py +731 -0
  323. camel/storages/vectordb_storages/faiss.py +712 -0
  324. camel/storages/vectordb_storages/milvus.py +2 -2
  325. camel/storages/vectordb_storages/oceanbase.py +16 -17
  326. camel/storages/vectordb_storages/pgvector.py +349 -0
  327. camel/storages/vectordb_storages/qdrant.py +6 -6
  328. camel/storages/vectordb_storages/surreal.py +372 -0
  329. camel/storages/vectordb_storages/tidb.py +11 -8
  330. camel/storages/vectordb_storages/weaviate.py +714 -0
  331. camel/tasks/__init__.py +2 -2
  332. camel/tasks/task.py +366 -27
  333. camel/tasks/task_prompt.py +3 -3
  334. camel/terminators/__init__.py +2 -2
  335. camel/terminators/base.py +2 -2
  336. camel/terminators/response_terminator.py +2 -2
  337. camel/terminators/token_limit_terminator.py +2 -2
  338. camel/toolkits/__init__.py +58 -10
  339. camel/toolkits/aci_toolkit.py +66 -21
  340. camel/toolkits/arxiv_toolkit.py +8 -8
  341. camel/toolkits/ask_news_toolkit.py +2 -2
  342. camel/toolkits/async_browser_toolkit.py +174 -575
  343. camel/toolkits/audio_analysis_toolkit.py +3 -3
  344. camel/toolkits/base.py +65 -7
  345. camel/toolkits/bohrium_toolkit.py +318 -0
  346. camel/toolkits/browser_toolkit.py +306 -566
  347. camel/toolkits/browser_toolkit_commons.py +568 -0
  348. camel/toolkits/code_execution.py +67 -11
  349. camel/toolkits/context_summarizer_toolkit.py +684 -0
  350. camel/toolkits/craw4ai_toolkit.py +93 -0
  351. camel/toolkits/dappier_toolkit.py +12 -8
  352. camel/toolkits/data_commons_toolkit.py +2 -2
  353. camel/toolkits/dingtalk.py +1135 -0
  354. camel/toolkits/earth_science_toolkit.py +5367 -0
  355. camel/toolkits/edgeone_pages_mcp_toolkit.py +49 -0
  356. camel/toolkits/excel_toolkit.py +910 -70
  357. camel/toolkits/file_toolkit.py +1402 -0
  358. camel/toolkits/function_tool.py +128 -20
  359. camel/toolkits/github_toolkit.py +148 -43
  360. camel/toolkits/gmail_toolkit.py +1839 -0
  361. camel/toolkits/google_calendar_toolkit.py +40 -6
  362. camel/toolkits/google_drive_mcp_toolkit.py +54 -0
  363. camel/toolkits/google_maps_toolkit.py +2 -2
  364. camel/toolkits/google_scholar_toolkit.py +2 -2
  365. camel/toolkits/human_toolkit.py +36 -12
  366. camel/toolkits/hybrid_browser_toolkit/__init__.py +18 -0
  367. camel/toolkits/hybrid_browser_toolkit/config_loader.py +185 -0
  368. camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py +246 -0
  369. camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit_ts.py +1973 -0
  370. camel/toolkits/hybrid_browser_toolkit/installer.py +203 -0
  371. camel/toolkits/hybrid_browser_toolkit/ts/package-lock.json +4589 -0
  372. camel/toolkits/hybrid_browser_toolkit/ts/package.json +33 -0
  373. camel/toolkits/hybrid_browser_toolkit/ts/src/browser-scripts.js +125 -0
  374. camel/toolkits/hybrid_browser_toolkit/ts/src/browser-session.ts +1929 -0
  375. camel/toolkits/hybrid_browser_toolkit/ts/src/config-loader.ts +233 -0
  376. camel/toolkits/hybrid_browser_toolkit/ts/src/hybrid-browser-toolkit.ts +589 -0
  377. camel/toolkits/hybrid_browser_toolkit/ts/src/index.ts +7 -0
  378. camel/toolkits/hybrid_browser_toolkit/ts/src/parent-child-filter.ts +226 -0
  379. camel/toolkits/hybrid_browser_toolkit/ts/src/snapshot-parser.ts +219 -0
  380. camel/toolkits/hybrid_browser_toolkit/ts/src/som-screenshot-injected.ts +543 -0
  381. camel/toolkits/hybrid_browser_toolkit/ts/src/types.ts +129 -0
  382. camel/toolkits/hybrid_browser_toolkit/ts/tsconfig.json +27 -0
  383. camel/toolkits/hybrid_browser_toolkit/ts/websocket-server.js +319 -0
  384. camel/toolkits/hybrid_browser_toolkit/ws_wrapper.py +1037 -0
  385. camel/toolkits/hybrid_browser_toolkit_py/__init__.py +17 -0
  386. camel/toolkits/hybrid_browser_toolkit_py/actions.py +575 -0
  387. camel/toolkits/hybrid_browser_toolkit_py/agent.py +311 -0
  388. camel/toolkits/hybrid_browser_toolkit_py/browser_session.py +787 -0
  389. camel/toolkits/hybrid_browser_toolkit_py/config_loader.py +490 -0
  390. camel/toolkits/hybrid_browser_toolkit_py/hybrid_browser_toolkit.py +2390 -0
  391. camel/toolkits/hybrid_browser_toolkit_py/snapshot.py +233 -0
  392. camel/toolkits/hybrid_browser_toolkit_py/stealth_script.js +0 -0
  393. camel/toolkits/hybrid_browser_toolkit_py/unified_analyzer.js +1043 -0
  394. camel/toolkits/image_analysis_toolkit.py +3 -3
  395. camel/toolkits/image_generation_toolkit.py +390 -0
  396. camel/toolkits/jina_reranker_toolkit.py +195 -79
  397. camel/toolkits/klavis_toolkit.py +7 -3
  398. camel/toolkits/linkedin_toolkit.py +2 -2
  399. camel/toolkits/markitdown_toolkit.py +104 -0
  400. camel/toolkits/math_toolkit.py +66 -12
  401. camel/toolkits/mcp_toolkit.py +841 -600
  402. camel/toolkits/memory_toolkit.py +7 -3
  403. camel/toolkits/meshy_toolkit.py +2 -2
  404. camel/toolkits/message_agent_toolkit.py +608 -0
  405. camel/toolkits/message_integration.py +724 -0
  406. camel/toolkits/mineru_toolkit.py +2 -2
  407. camel/toolkits/minimax_mcp_toolkit.py +195 -0
  408. camel/toolkits/networkx_toolkit.py +2 -2
  409. camel/toolkits/note_taking_toolkit.py +277 -0
  410. camel/toolkits/notion_mcp_toolkit.py +224 -0
  411. camel/toolkits/notion_toolkit.py +2 -2
  412. camel/toolkits/open_api_specs/biztoc/__init__.py +2 -2
  413. camel/toolkits/open_api_specs/biztoc/ai-plugin.json +1 -1
  414. camel/toolkits/open_api_specs/coursera/__init__.py +2 -2
  415. camel/toolkits/open_api_specs/create_qr_code/__init__.py +2 -2
  416. camel/toolkits/open_api_specs/klarna/__init__.py +2 -2
  417. camel/toolkits/open_api_specs/nasa_apod/__init__.py +2 -2
  418. camel/toolkits/open_api_specs/outschool/__init__.py +2 -2
  419. camel/toolkits/open_api_specs/outschool/ai-plugin.json +1 -1
  420. camel/toolkits/open_api_specs/outschool/openapi.yaml +1 -1
  421. camel/toolkits/open_api_specs/outschool/paths/__init__.py +2 -2
  422. camel/toolkits/open_api_specs/outschool/paths/get_classes.py +2 -2
  423. camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +2 -2
  424. camel/toolkits/open_api_specs/security_config.py +2 -2
  425. camel/toolkits/open_api_specs/speak/__init__.py +2 -2
  426. camel/toolkits/open_api_specs/web_scraper/__init__.py +2 -2
  427. camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +1 -1
  428. camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +2 -2
  429. camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +2 -2
  430. camel/toolkits/open_api_toolkit.py +2 -2
  431. camel/toolkits/openbb_toolkit.py +7 -3
  432. camel/toolkits/origene_mcp_toolkit.py +56 -0
  433. camel/toolkits/page_script.js +86 -74
  434. camel/toolkits/playwright_mcp_toolkit.py +27 -32
  435. camel/toolkits/pptx_toolkit.py +790 -0
  436. camel/toolkits/pubmed_toolkit.py +2 -2
  437. camel/toolkits/pulse_mcp_search_toolkit.py +2 -2
  438. camel/toolkits/pyautogui_toolkit.py +2 -2
  439. camel/toolkits/reddit_toolkit.py +2 -2
  440. camel/toolkits/resend_toolkit.py +168 -0
  441. camel/toolkits/retrieval_toolkit.py +2 -2
  442. camel/toolkits/screenshot_toolkit.py +213 -0
  443. camel/toolkits/search_toolkit.py +539 -146
  444. camel/toolkits/searxng_toolkit.py +2 -2
  445. camel/toolkits/semantic_scholar_toolkit.py +2 -2
  446. camel/toolkits/slack_toolkit.py +108 -58
  447. camel/toolkits/sql_toolkit.py +712 -0
  448. camel/toolkits/stripe_toolkit.py +2 -2
  449. camel/toolkits/sympy_toolkit.py +3 -3
  450. camel/toolkits/task_planning_toolkit.py +134 -0
  451. camel/toolkits/terminal_toolkit/__init__.py +18 -0
  452. camel/toolkits/terminal_toolkit/terminal_toolkit.py +1070 -0
  453. camel/toolkits/terminal_toolkit/utils.py +532 -0
  454. camel/toolkits/thinking_toolkit.py +3 -3
  455. camel/toolkits/twitter_toolkit.py +8 -3
  456. camel/toolkits/vertex_ai_veo_toolkit.py +590 -0
  457. camel/toolkits/video_analysis_toolkit.py +112 -29
  458. camel/toolkits/video_download_toolkit.py +22 -16
  459. camel/toolkits/weather_toolkit.py +2 -2
  460. camel/toolkits/web_deploy_toolkit.py +1219 -0
  461. camel/toolkits/wechat_official_toolkit.py +483 -0
  462. camel/toolkits/whatsapp_toolkit.py +2 -2
  463. camel/toolkits/wolfram_alpha_toolkit.py +53 -25
  464. camel/toolkits/zapier_toolkit.py +7 -3
  465. camel/types/__init__.py +4 -4
  466. camel/types/agents/__init__.py +2 -2
  467. camel/types/agents/tool_calling_record.py +6 -3
  468. camel/types/enums.py +454 -35
  469. camel/types/mcp_registries.py +2 -2
  470. camel/types/openai_types.py +4 -4
  471. camel/types/unified_model_type.py +43 -6
  472. camel/utils/__init__.py +20 -2
  473. camel/utils/async_func.py +2 -2
  474. camel/utils/chunker/__init__.py +2 -2
  475. camel/utils/chunker/base.py +2 -2
  476. camel/utils/chunker/code_chunker.py +2 -2
  477. camel/utils/chunker/uio_chunker.py +2 -2
  478. camel/utils/commons.py +65 -7
  479. camel/utils/constants.py +5 -2
  480. camel/utils/context_utils.py +1134 -0
  481. camel/utils/deduplication.py +2 -2
  482. camel/utils/filename.py +2 -2
  483. camel/utils/langfuse.py +258 -0
  484. camel/utils/mcp.py +140 -6
  485. camel/utils/mcp_client.py +1056 -0
  486. camel/utils/message_summarizer.py +148 -0
  487. camel/utils/response_format.py +2 -2
  488. camel/utils/token_counting.py +45 -22
  489. camel/utils/tool_result.py +44 -0
  490. camel/verifiers/__init__.py +2 -2
  491. camel/verifiers/base.py +2 -2
  492. camel/verifiers/math_verifier.py +2 -2
  493. camel/verifiers/models.py +2 -2
  494. camel/verifiers/physics_verifier.py +2 -2
  495. camel/verifiers/python_verifier.py +2 -2
  496. {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/METADATA +349 -108
  497. camel_ai-0.2.82.dist-info/RECORD +507 -0
  498. {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/WHEEL +1 -1
  499. {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/licenses/LICENSE +1 -1
  500. camel/loaders/pandas_reader.py +0 -368
  501. camel/runtime/api.py +0 -97
  502. camel/toolkits/dalle_toolkit.py +0 -171
  503. camel/toolkits/file_write_toolkit.py +0 -395
  504. camel/toolkits/openai_agent_toolkit.py +0 -135
  505. camel/toolkits/terminal_toolkit.py +0 -1037
  506. camel_ai-0.2.59.dist-info/RECORD +0 -410
@@ -1,4 +1,4 @@
1
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
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-2024 @ CAMEL-AI.org. All Rights Reserved. =========
14
- from typing import List, Optional, Tuple
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.model = AutoModel.from_pretrained(
51
- 'jinaai/jina-reranker-m0',
52
- torch_dtype="auto",
53
- trust_remote_code=True,
54
- )
55
- DEVICE = (
56
- device
57
- if device is not None
58
- else ("cuda" if torch.cuda.is_available() else "cpu")
59
- )
60
- self.model.to(DEVICE)
61
- self.model.eval()
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[Tuple[str, float]]:
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[Tuple[str, float]]: Sorted list of (document, score) pairs.
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
- return doc_score_pairs
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[Tuple[str, float]]:
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[Tuple[str, float]]: A list of tuples containing
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
- if self.model is None:
106
- raise ValueError(
107
- "Model has not been initialized or failed to initialize."
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
- with torch.inference_mode():
111
- text_pairs = [[query, doc] for doc in documents]
112
- scores = self.model.compute_score(
113
- text_pairs, max_length=max_length, doc_type="text"
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[Tuple[str, float]]:
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[Tuple[str, float]]: A list of tuples containing
208
+ List[Dict[str, object]]: A list of dictionary containing
134
209
  the reranked image URLs/paths and their relevance scores.
135
210
  """
136
- import torch
137
-
138
- if self.model is None:
139
- raise ValueError(
140
- "Model has not been initialized or failed to initialize."
141
- )
142
-
143
- with torch.inference_mode():
144
- image_pairs = [[query, doc] for doc in documents]
145
- scores = self.model.compute_score(
146
- image_pairs, max_length=max_length, doc_type="image"
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[Tuple[str, float]]:
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[Tuple[str, float]]: A list of tuples containing
253
+ List[Dict[str, object]]: A list of dictionary containing
167
254
  the reranked documents and their relevance scores.
168
255
  """
169
- import torch
170
-
171
- if self.model is None:
172
- raise ValueError("Model has not been initialized.")
173
- with torch.inference_mode():
174
- image_pairs = [[image_query, doc] for doc in documents]
175
- scores = self.model.compute_score(
176
- image_pairs,
177
- max_length=max_length,
178
- query_type="image",
179
- doc_type="text",
180
- )
181
-
182
- return self._sort_documents(documents, scores)
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[Tuple[str, float]]:
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[Tuple[str, float]]: A list of tuples containing
301
+ List[Dict[str, object]]: A list of dictionary containing
200
302
  the reranked image URLs/paths and their relevance scores.
201
303
  """
202
- import torch
203
-
204
- if self.model is None:
205
- raise ValueError("Model has not been initialized.")
206
-
207
- with torch.inference_mode():
208
- image_pairs = [[image_query, doc] for doc in documents]
209
- scores = self.model.compute_score(
210
- image_pairs,
211
- max_length=max_length,
212
- query_type="image",
213
- doc_type="image",
214
- )
215
-
216
- return self._sort_documents(documents, scores)
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
@@ -1,4 +1,4 @@
1
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
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-2024 @ CAMEL-AI.org. All Rights Reserved. =========
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 MCPServer, api_keys_required, dependencies_required
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-2024 @ CAMEL-AI.org. All Rights Reserved. =========
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-2024 @ CAMEL-AI.org. All Rights Reserved. =========
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
+ ]
@@ -1,4 +1,4 @@
1
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
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-2024 @ CAMEL-AI.org. All Rights Reserved. =========
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 add(self, a: float, b: float) -> float:
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 sub(self, a: float, b: float) -> float:
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 multiply(self, a: float, b: float, decimal_places: int = 2) -> float:
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 divide(self, a: float, b: float, decimal_places: int = 2) -> float:
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 round(self, a: float, decimal_places: int = 0) -> float:
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.add),
105
- FunctionTool(self.sub),
106
- FunctionTool(self.multiply),
107
- FunctionTool(self.divide),
108
- FunctionTool(self.round),
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)