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