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,483 @@
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 time
17
+ from typing import Any, Dict, List, Literal, Optional
18
+
19
+ import requests
20
+
21
+ from camel.logger import get_logger
22
+ from camel.toolkits import FunctionTool
23
+ from camel.toolkits.base import BaseToolkit
24
+ from camel.utils import MCPServer, api_keys_required, retry_on_error
25
+
26
+ logger = get_logger(__name__)
27
+
28
+ # Global variables for caching access token
29
+ _wechat_access_token = None
30
+ _wechat_access_token_expires_at = 0
31
+
32
+
33
+ @retry_on_error()
34
+ def _get_wechat_access_token() -> str:
35
+ r"""Retrieves or refreshes the WeChat Official Account access token.
36
+
37
+ Returns:
38
+ str: The valid access token.
39
+
40
+ Raises:
41
+ ValueError: If credentials are missing or token retrieval fails.
42
+
43
+ References:
44
+ https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html
45
+ """
46
+ global _wechat_access_token, _wechat_access_token_expires_at
47
+
48
+ if _wechat_access_token and _wechat_access_token_expires_at > time.time():
49
+ return _wechat_access_token
50
+
51
+ app_id = os.environ.get("WECHAT_APP_ID", "")
52
+ app_secret = os.environ.get("WECHAT_APP_SECRET", "")
53
+
54
+ url = (
55
+ "https://api.weixin.qq.com/cgi-bin/token?"
56
+ f"grant_type=client_credential&appid={app_id}&secret={app_secret}"
57
+ )
58
+ response = requests.get(url)
59
+ response.raise_for_status()
60
+ data = response.json()
61
+
62
+ if "access_token" in data:
63
+ _wechat_access_token = data["access_token"]
64
+ _wechat_access_token_expires_at = (
65
+ time.time() + data.get("expires_in", 7200) - 60
66
+ )
67
+ logger.info("WeChat access token refreshed.")
68
+ return _wechat_access_token
69
+ else:
70
+ errcode = data.get("errcode")
71
+ errmsg = data.get("errmsg", "Unknown error")
72
+ raise ValueError(f"Failed to get access token {errcode}: {errmsg}")
73
+
74
+
75
+ def _make_wechat_request(
76
+ method: Literal["GET", "POST"], endpoint: str, **kwargs
77
+ ) -> Dict[str, Any]:
78
+ r"""Makes a request to WeChat API with proper error handling.
79
+
80
+ Args:
81
+ method (Literal["GET", "POST"]): HTTP method ('GET' or 'POST').
82
+ endpoint (str): API endpoint path.
83
+ **kwargs: Additional arguments for requests.
84
+
85
+ Returns:
86
+ Dict[str, Any]: API response data.
87
+
88
+ Raises:
89
+ requests.exceptions.RequestException: If request fails.
90
+ ValueError: If API returns an error.
91
+ """
92
+ global _wechat_access_token, _wechat_access_token_expires_at
93
+ access_token = _get_wechat_access_token()
94
+
95
+ # Handle URL parameter concatenation
96
+ separator = "&" if "?" in endpoint else "?"
97
+ url = (
98
+ f"https://api.weixin.qq.com{endpoint}{separator}"
99
+ f"access_token={access_token}"
100
+ )
101
+
102
+ if method.upper() == "GET":
103
+ response = requests.get(url, **kwargs)
104
+ else:
105
+ response = requests.post(url, **kwargs)
106
+
107
+ response.raise_for_status()
108
+ data = response.json()
109
+
110
+ if data.get("errcode") and data.get("errcode") != 0:
111
+ errcode = data.get("errcode")
112
+ errmsg = data.get("errmsg", "Unknown error")
113
+ raise ValueError(f"WeChat API error {errcode}: {errmsg}")
114
+
115
+ return data
116
+
117
+
118
+ @MCPServer()
119
+ class WeChatOfficialToolkit(BaseToolkit):
120
+ r"""A toolkit for WeChat Official Account operations.
121
+
122
+ This toolkit provides methods to interact with the WeChat Official Account
123
+ API, allowing users to send messages, manage users, and handle media files.
124
+
125
+ References:
126
+ - Documentation: https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html
127
+ - Test Account: https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
128
+
129
+ Notes:
130
+ Set environment variables: WECHAT_APP_ID, WECHAT_APP_SECRET
131
+ """
132
+
133
+ def __init__(self, timeout: Optional[float] = None):
134
+ r"""Initializes the WeChatOfficialToolkit."""
135
+ super().__init__(timeout=timeout)
136
+ self.base_url = "https://api.weixin.qq.com"
137
+
138
+ # Validate credentials
139
+ app_id = os.environ.get("WECHAT_APP_ID", "")
140
+ app_secret = os.environ.get("WECHAT_APP_SECRET", "")
141
+
142
+ if not all([app_id, app_secret]):
143
+ raise ValueError(
144
+ "WeChat credentials missing. Set WECHAT_APP_ID and"
145
+ " WECHAT_APP_SECRET."
146
+ )
147
+
148
+ # Define full logic as class methods; top-level functions delegate here
149
+
150
+ @api_keys_required(
151
+ [
152
+ (None, "WECHAT_APP_ID"),
153
+ (None, "WECHAT_APP_SECRET"),
154
+ ]
155
+ )
156
+ def send_customer_message(
157
+ self,
158
+ openid: str,
159
+ content: str,
160
+ msgtype: Literal[
161
+ "text",
162
+ "image",
163
+ "voice",
164
+ "video",
165
+ ] = "text",
166
+ ) -> str:
167
+ r"""Sends a customer service message to a WeChat user.
168
+
169
+ Args:
170
+ openid (str): The user's OpenID.
171
+ content (str): Message content or media_id for non-text messages.
172
+ msgtype (str): Message type: "text", "image", "voice", "video".
173
+
174
+ Returns:
175
+ str: Success or error message.
176
+
177
+ References:
178
+ https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Service_Center_messages.html
179
+ """
180
+ payload: Dict[str, Any] = {"touser": openid, "msgtype": msgtype}
181
+ if msgtype == "text":
182
+ payload["text"] = {"content": content}
183
+ elif msgtype in ["image", "voice"]:
184
+ payload[msgtype] = {"media_id": content}
185
+ elif msgtype == "video":
186
+ parts = content.split(",", 2)
187
+ payload["video"] = {
188
+ "media_id": parts[0],
189
+ "title": parts[1] if len(parts) > 1 else "",
190
+ "description": parts[2] if len(parts) > 2 else "",
191
+ }
192
+ else:
193
+ return f"Unsupported message type: {msgtype}"
194
+
195
+ _make_wechat_request(
196
+ "POST",
197
+ "/cgi-bin/message/custom/send",
198
+ headers={"Content-Type": "application/json"},
199
+ json=payload,
200
+ )
201
+ return f"Message sent successfully to {openid}."
202
+
203
+ @api_keys_required(
204
+ [
205
+ (None, "WECHAT_APP_ID"),
206
+ (None, "WECHAT_APP_SECRET"),
207
+ ]
208
+ )
209
+ def get_user_info(
210
+ self,
211
+ openid: str,
212
+ lang: str = "zh_CN",
213
+ ) -> Dict[str, Any]:
214
+ r"""Retrieves WeChat user information.
215
+
216
+ Args:
217
+ openid (str): The user's OpenID.
218
+ lang (str): Response language. Common values: "zh_CN", "zh_TW",
219
+ "en". (default: "zh_CN")
220
+
221
+ Returns:
222
+ Dict[str, Any]: User information as dictionary or error
223
+ information.
224
+
225
+ References:
226
+ https://developers.weixin.qq.com/doc/offiaccount/User_Management/
227
+ Getting_user_basic_information.html
228
+ """
229
+ data = _make_wechat_request(
230
+ "GET", f"/cgi-bin/user/info?openid={openid}&lang={lang}"
231
+ )
232
+ return data
233
+
234
+ @api_keys_required(
235
+ [
236
+ (None, "WECHAT_APP_ID"),
237
+ (None, "WECHAT_APP_SECRET"),
238
+ ]
239
+ )
240
+ def get_followers_list(
241
+ self,
242
+ next_openid: str = "",
243
+ ) -> Dict[str, Any]:
244
+ r"""Retrieves list of followers' OpenIDs.
245
+
246
+ Args:
247
+ next_openid (str): Starting OpenID for pagination. (default: "")
248
+
249
+ Returns:
250
+ Dict[str, Any]: Followers list as dictionary or error information.
251
+
252
+ References:
253
+ https://developers.weixin.qq.com/doc/offiaccount/User_Management/
254
+ Getting_a_list_of_followers.html
255
+ """
256
+ endpoint = "/cgi-bin/user/get"
257
+ if next_openid:
258
+ endpoint += f"?next_openid={next_openid}"
259
+ data = _make_wechat_request("GET", endpoint)
260
+ return data
261
+
262
+ @api_keys_required(
263
+ [
264
+ (None, "WECHAT_APP_ID"),
265
+ (None, "WECHAT_APP_SECRET"),
266
+ ]
267
+ )
268
+ def upload_wechat_media(
269
+ self,
270
+ media_type: Literal[
271
+ "image",
272
+ "voice",
273
+ "video",
274
+ "thumb",
275
+ ],
276
+ file_path: str,
277
+ permanent: bool = False,
278
+ description: Optional[str] = None,
279
+ ) -> Dict[str, Any]:
280
+ r"""Uploads media file to WeChat.
281
+
282
+ Args:
283
+ media_type (str): Media type: "image", "voice", "video", "thumb".
284
+ file_path (str): Local file path.
285
+ permanent (bool): Whether to upload as permanent media.
286
+ (default: :obj:`False`)
287
+ description (Optional[str]): Video description in JSON format
288
+ for permanent upload. (default: :obj:`None`)
289
+
290
+ Returns:
291
+ Dict[str, Any]: Upload result with media_id or error information.
292
+
293
+ References:
294
+ - Temporary: https://developers.weixin.qq.com/doc/offiaccount/
295
+ Asset_Management/Adding_Temporary_Assets.html
296
+ - Permanent: https://developers.weixin.qq.com/doc/offiaccount/
297
+ Asset_Management/Adding_Permanent_Assets.html
298
+ """
299
+ if permanent:
300
+ endpoint = f"/cgi-bin/material/add_material?type={media_type}"
301
+ data_payload = {}
302
+ if media_type == "video" and description:
303
+ data_payload["description"] = description
304
+ with open(file_path, "rb") as media_file:
305
+ files: Dict[str, Any] = {"media": media_file}
306
+ if media_type == "video" and description:
307
+ files["description"] = (None, description)
308
+ data = _make_wechat_request(
309
+ "POST", endpoint, files=files, data=data_payload
310
+ )
311
+ else:
312
+ endpoint = f"/cgi-bin/media/upload?type={media_type}"
313
+ with open(file_path, "rb") as f:
314
+ files = {"media": f}
315
+ data = _make_wechat_request("POST", endpoint, files=files)
316
+
317
+ return data
318
+
319
+ @api_keys_required(
320
+ [
321
+ (None, "WECHAT_APP_ID"),
322
+ (None, "WECHAT_APP_SECRET"),
323
+ ]
324
+ )
325
+ def get_media_list(
326
+ self,
327
+ media_type: Literal[
328
+ "image",
329
+ "voice",
330
+ "video",
331
+ "news",
332
+ ],
333
+ offset: int = 0,
334
+ count: int = 20,
335
+ ) -> Dict[str, Any]:
336
+ r"""Gets list of permanent media files.
337
+
338
+ Args:
339
+ media_type (str): Media type: "image", "voice", "video", "news".
340
+ offset (int): Starting position. (default: :obj:`0`)
341
+ count (int): Number of items (1-20). (default: :obj:`20`)
342
+
343
+ Returns:
344
+ Dict[str, Any]: Media list as dictionary or error information.
345
+
346
+ References:
347
+ https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/
348
+ Get_the_list_of_all_materials.html
349
+ """
350
+ payload = {"type": media_type, "offset": offset, "count": count}
351
+ data = _make_wechat_request(
352
+ "POST",
353
+ "/cgi-bin/material/batchget_material",
354
+ headers={"Content-Type": "application/json"},
355
+ json=payload,
356
+ )
357
+ return data
358
+
359
+ @api_keys_required(
360
+ [
361
+ (None, "WECHAT_APP_ID"),
362
+ (None, "WECHAT_APP_SECRET"),
363
+ ]
364
+ )
365
+ def send_mass_message_to_all(
366
+ self,
367
+ content: str,
368
+ msgtype: Literal[
369
+ "text",
370
+ "image",
371
+ "voice",
372
+ "video",
373
+ ] = "text",
374
+ clientmsgid: Optional[str] = None,
375
+ send_ignore_reprint: Optional[int] = 0,
376
+ batch_size: int = 10000,
377
+ ) -> Dict[str, Any]:
378
+ r"""Sends a mass message to all followers (by OpenID list).
379
+
380
+ This method paginates all follower OpenIDs and calls the
381
+ mass-send API in batches.
382
+
383
+ Args:
384
+ content (str): For text, the message content; for non-text,
385
+ the media_id.
386
+ msgtype (Literal["text","image","voice","video"]):
387
+ Message type. For "video", the mass API expects
388
+ "mpvideo" internally.
389
+ clientmsgid (Optional[str]): Idempotency key to avoid
390
+ duplicate mass jobs.
391
+ send_ignore_reprint (Optional[int]): Whether to continue
392
+ when a news article is judged as a reprint (reserved;
393
+ applies to news/mpnews).
394
+ batch_size (int): Max OpenIDs per request (WeChat limit
395
+ is up to 10000 per batch).
396
+
397
+ Returns:
398
+ Dict[str, Any]: Aggregated result including counts and
399
+ each batch response.
400
+
401
+ References:
402
+ - Mass send by OpenID list:
403
+ https://developers.weixin.qq.com/doc/service/api/notify/message/
404
+ api_masssend.html
405
+ """
406
+ # 1) Collect all follower OpenIDs
407
+ all_openids: List[str] = []
408
+ next_openid = ""
409
+ while True:
410
+ endpoint = "/cgi-bin/user/get"
411
+ if next_openid:
412
+ endpoint += f"?next_openid={next_openid}"
413
+ page = _make_wechat_request("GET", endpoint)
414
+ data_block = page.get("data", {}) if isinstance(page, dict) else {}
415
+ openids = (
416
+ data_block.get("openid", [])
417
+ if isinstance(data_block, dict)
418
+ else []
419
+ )
420
+ if openids:
421
+ all_openids.extend(openids)
422
+ next_openid = (
423
+ page.get("next_openid", "") if isinstance(page, dict) else ""
424
+ )
425
+ if not next_openid:
426
+ break
427
+
428
+ # 2) Build and send batches
429
+ results: List[Dict[str, Any]] = []
430
+ if not all_openids:
431
+ return {
432
+ "total_openids": 0,
433
+ "batches": 0,
434
+ "results": results,
435
+ }
436
+
437
+ def build_payload(openid_batch: List[str]) -> Dict[str, Any]:
438
+ payload: Dict[str, Any] = {
439
+ "touser": openid_batch,
440
+ }
441
+ if msgtype == "text":
442
+ payload["msgtype"] = "text"
443
+ payload["text"] = {"content": content}
444
+ elif msgtype in ("image", "voice"):
445
+ payload["msgtype"] = msgtype
446
+ payload[msgtype] = {"media_id": content}
447
+ elif msgtype == "video":
448
+ # Mass API expects mpvideo
449
+ payload["msgtype"] = "mpvideo"
450
+ payload["mpvideo"] = {"media_id": content}
451
+ if clientmsgid:
452
+ payload["clientmsgid"] = clientmsgid
453
+ if send_ignore_reprint is not None:
454
+ payload["send_ignore_reprint"] = send_ignore_reprint
455
+ return payload
456
+
457
+ for i in range(0, len(all_openids), batch_size):
458
+ batch = all_openids[i : i + batch_size]
459
+ payload = build_payload(batch)
460
+ resp = _make_wechat_request(
461
+ "POST",
462
+ "/cgi-bin/message/mass/send",
463
+ headers={"Content-Type": "application/json"},
464
+ json=payload,
465
+ )
466
+ results.append(resp)
467
+
468
+ return {
469
+ "total_openids": len(all_openids),
470
+ "batches": (len(all_openids) + batch_size - 1) // batch_size,
471
+ "results": results,
472
+ }
473
+
474
+ def get_tools(self) -> List[FunctionTool]:
475
+ r"""Returns toolkit functions as tools."""
476
+ return [
477
+ FunctionTool(self.send_customer_message),
478
+ FunctionTool(self.get_user_info),
479
+ FunctionTool(self.get_followers_list),
480
+ FunctionTool(self.upload_wechat_media),
481
+ FunctionTool(self.get_media_list),
482
+ FunctionTool(self.send_mass_message_to_all),
483
+ ]
@@ -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
  from typing import Any, Dict, List, Optional, Union
@@ -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,10 +10,10 @@
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
13
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
  import os
15
15
  import xml.etree.ElementTree as ET
16
- from typing import Any, Dict, List, Union
16
+ from typing import Any, Dict, List
17
17
 
18
18
  import requests
19
19
 
@@ -37,21 +37,14 @@ class WolframAlphaToolkit(BaseToolkit):
37
37
  ]
38
38
  )
39
39
  @dependencies_required("wolframalpha")
40
- def query_wolfram_alpha(
41
- self, query: str, is_detailed: bool = False
42
- ) -> Union[str, Dict[str, Any]]:
43
- r"""Queries Wolfram|Alpha and returns the result.
40
+ def query_wolfram_alpha(self, query: str) -> str:
41
+ r"""Queries Wolfram|Alpha and returns the result as a simple answer.
44
42
 
45
43
  Args:
46
44
  query (str): The query to send to Wolfram Alpha.
47
- is_detailed (bool): Whether to include additional details
48
- including step by step information in the result.
49
- (default: :obj:`False`)
50
45
 
51
46
  Returns:
52
- Union[str, Dict[str, Any]]: The result from Wolfram Alpha.
53
- Returns a string if `is_detailed` is False, otherwise returns
54
- a dictionary with detailed information.
47
+ str: The result from Wolfram Alpha as a simple answer.
55
48
  """
56
49
  import wolframalpha
57
50
 
@@ -64,24 +57,54 @@ class WolframAlphaToolkit(BaseToolkit):
64
57
  except Exception as e:
65
58
  return f"Wolfram Alpha wasn't able to answer it. Error: {e}"
66
59
 
67
- pased_result = self._parse_wolfram_result(res)
60
+ parsed_result = self._parse_wolfram_result(res)
61
+ return parsed_result["final_answer"]
68
62
 
69
- if is_detailed:
70
- step_info = self._get_wolframalpha_step_by_step_solution(
71
- WOLFRAMALPHA_APP_ID, query
72
- )
73
- pased_result["steps"] = step_info
74
- return pased_result
63
+ @api_keys_required(
64
+ [
65
+ (None, "WOLFRAMALPHA_APP_ID"),
66
+ ]
67
+ )
68
+ @dependencies_required("wolframalpha")
69
+ def query_wolfram_alpha_step_by_step(self, query: str) -> Dict[str, Any]:
70
+ r"""Queries Wolfram|Alpha and returns detailed results with
71
+ step-by-step solution.
75
72
 
76
- return pased_result["final_answer"]
73
+ Args:
74
+ query (str): The query to send to Wolfram Alpha.
75
+
76
+ Returns:
77
+ Dict[str, Any]: A dictionary with detailed information including
78
+ step-by-step solution.
79
+ """
80
+ import wolframalpha
81
+
82
+ WOLFRAMALPHA_APP_ID = os.environ.get("WOLFRAMALPHA_APP_ID", "")
83
+
84
+ try:
85
+ client = wolframalpha.Client(WOLFRAMALPHA_APP_ID)
86
+ res = client.query(query)
87
+
88
+ except Exception as e:
89
+ return {
90
+ "error": f"Wolfram Alpha wasn't able to answer it. Error: {e}"
91
+ }
92
+
93
+ parsed_result = self._parse_wolfram_result(res)
94
+ step_info = self._get_wolframalpha_step_by_step_solution(
95
+ WOLFRAMALPHA_APP_ID, query
96
+ )
97
+ parsed_result["steps"] = step_info
98
+ return parsed_result
77
99
 
78
100
  @api_keys_required(
79
101
  [
80
102
  (None, "WOLFRAMALPHA_APP_ID"),
81
103
  ]
82
104
  )
83
- def query_wolfram_llm(self, query: str) -> str:
84
- r"""Queries Wolfram|Alpha LLM API and returns the result.
105
+ def query_wolfram_alpha_llm(self, query: str) -> str:
106
+ r"""Sends a query to the Wolfram|Alpha API optimized for language
107
+ model usage.
85
108
 
86
109
  Args:
87
110
  query (str): The query to send to Wolfram Alpha LLM.
@@ -94,7 +117,11 @@ class WolframAlphaToolkit(BaseToolkit):
94
117
 
95
118
  try:
96
119
  url = "https://www.wolframalpha.com/api/v1/llm-api"
97
- params = {"input": query, "appid": WOLFRAMALPHA_APP_ID}
120
+ params = {
121
+ "input": query,
122
+ "appid": WOLFRAMALPHA_APP_ID,
123
+ "format": "plaintext",
124
+ }
98
125
 
99
126
  response = requests.get(url, params=params)
100
127
  response.raise_for_status()
@@ -233,5 +260,6 @@ class WolframAlphaToolkit(BaseToolkit):
233
260
  """
234
261
  return [
235
262
  FunctionTool(self.query_wolfram_alpha),
236
- FunctionTool(self.query_wolfram_llm),
263
+ FunctionTool(self.query_wolfram_alpha_step_by_step),
264
+ FunctionTool(self.query_wolfram_alpha_llm),
237
265
  ]
@@ -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
  from typing import Any, Dict, List, Optional
@@ -19,7 +19,11 @@ import requests
19
19
 
20
20
  from camel.toolkits.base import BaseToolkit
21
21
  from camel.toolkits.function_tool import FunctionTool
22
- from camel.utils import MCPServer, api_keys_required, dependencies_required
22
+ from camel.utils import (
23
+ MCPServer,
24
+ api_keys_required,
25
+ dependencies_required,
26
+ )
23
27
 
24
28
 
25
29
  @MCPServer()
camel/types/__init__.py CHANGED
@@ -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
  from .enums import (
15
15
  AudioModelType,
16
16
  EmbeddingModelType,
@@ -41,8 +41,8 @@ from .openai_types import (
41
41
  ChatCompletionAssistantMessageParam,
42
42
  ChatCompletionChunk,
43
43
  ChatCompletionMessage,
44
+ ChatCompletionMessageFunctionToolCall,
44
45
  ChatCompletionMessageParam,
45
- ChatCompletionMessageToolCall,
46
46
  ChatCompletionSystemMessageParam,
47
47
  ChatCompletionToolMessageParam,
48
48
  ChatCompletionUserMessageParam,
@@ -71,7 +71,7 @@ __all__ = [
71
71
  'ChatCompletionUserMessageParam',
72
72
  'ChatCompletionAssistantMessageParam',
73
73
  'ChatCompletionToolMessageParam',
74
- 'ChatCompletionMessageToolCall',
74
+ 'ChatCompletionMessageFunctionToolCall',
75
75
  'CompletionUsage',
76
76
  'OpenAIImageType',
77
77
  'OpenAIVisionDetailType',