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
camel/messages/base.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,14 +10,25 @@
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
+
15
+ # Enables postponed evaluation of annotations (for string-based type hints)
16
+ from __future__ import annotations
17
+
14
18
  import base64
15
19
  import io
16
20
  import re
17
21
  from dataclasses import dataclass
18
- from typing import Any, Dict, List, Literal, Optional, Tuple, Union
22
+ from typing import (
23
+ Any,
24
+ Dict,
25
+ List,
26
+ Literal,
27
+ Optional,
28
+ Tuple,
29
+ Union,
30
+ )
19
31
 
20
- import numpy as np
21
32
  from PIL import Image
22
33
  from pydantic import BaseModel
23
34
 
@@ -48,19 +59,22 @@ class BaseMessage:
48
59
  role_name (str): The name of the user or assistant role.
49
60
  role_type (RoleType): The type of role, either :obj:`RoleType.
50
61
  ASSISTANT` or :obj:`RoleType.USER`.
51
- meta_dict (Optional[Dict[str, str]]): Additional metadata dictionary
62
+ meta_dict (Optional[Dict[str, Any]]): Additional metadata dictionary
52
63
  for the message.
53
64
  content (str): The content of the message.
54
65
  video_bytes (Optional[bytes]): Optional bytes of a video associated
55
66
  with the message. (default: :obj:`None`)
56
- image_list (Optional[List[Image.Image]]): Optional list of PIL Image
57
- objects associated with the message. (default: :obj:`None`)
67
+ image_list (Optional[List[Union[Image.Image, str]]]): Optional list of
68
+ PIL Image objects or image URLs (strings) associated with the
69
+ message. (default: :obj:`None`)
58
70
  image_detail (Literal["auto", "low", "high"]): Detail level of the
59
71
  images associated with the message. (default: :obj:`auto`)
60
72
  video_detail (Literal["auto", "low", "high"]): Detail level of the
61
- videos associated with the message. (default: :obj:`low`)
62
- parsed: Optional[Union[Type[BaseModel], dict]]: Optional object which
73
+ videos associated with the message. (default: :obj:`auto`)
74
+ parsed (Optional[Union[Type[BaseModel], dict]]): Optional object which
63
75
  is parsed from the content. (default: :obj:`None`)
76
+ reasoning_content (Optional[str]): Optional reasoning trace associated
77
+ with the message. (default: :obj:`None`)
64
78
  """
65
79
 
66
80
  role_name: str
@@ -69,10 +83,11 @@ class BaseMessage:
69
83
  content: str
70
84
 
71
85
  video_bytes: Optional[bytes] = None
72
- image_list: Optional[List[Image.Image]] = None
86
+ image_list: Optional[List[Union[Image.Image, str]]] = None
73
87
  image_detail: Literal["auto", "low", "high"] = "auto"
74
- video_detail: Literal["auto", "low", "high"] = "low"
88
+ video_detail: Literal["auto", "low", "high"] = "auto"
75
89
  parsed: Optional[Union[BaseModel, dict]] = None
90
+ reasoning_content: Optional[str] = None
76
91
 
77
92
  @classmethod
78
93
  def make_user_message(
@@ -81,7 +96,7 @@ class BaseMessage:
81
96
  content: str,
82
97
  meta_dict: Optional[Dict[str, str]] = None,
83
98
  video_bytes: Optional[bytes] = None,
84
- image_list: Optional[List[Image.Image]] = None,
99
+ image_list: Optional[List[Union[Image.Image, str]]] = None,
85
100
  image_detail: Union[
86
101
  OpenAIVisionDetailType, str
87
102
  ] = OpenAIVisionDetailType.AUTO,
@@ -98,8 +113,9 @@ class BaseMessage:
98
113
  dictionary for the message.
99
114
  video_bytes (Optional[bytes]): Optional bytes of a video
100
115
  associated with the message.
101
- image_list (Optional[List[Image.Image]]): Optional list of PIL
102
- Image objects associated with the message.
116
+ image_list (Optional[List[Union[Image.Image, str]]]): Optional list
117
+ of PIL Image objects or image URLs (strings) associated with
118
+ the message.
103
119
  image_detail (Union[OpenAIVisionDetailType, str]): Detail level of
104
120
  the images associated with the message.
105
121
  video_detail (Union[OpenAIVisionDetailType, str]): Detail level of
@@ -126,7 +142,7 @@ class BaseMessage:
126
142
  content: str,
127
143
  meta_dict: Optional[Dict[str, str]] = None,
128
144
  video_bytes: Optional[bytes] = None,
129
- image_list: Optional[List[Image.Image]] = None,
145
+ image_list: Optional[List[Union[Image.Image, str]]] = None,
130
146
  image_detail: Union[
131
147
  OpenAIVisionDetailType, str
132
148
  ] = OpenAIVisionDetailType.AUTO,
@@ -143,8 +159,9 @@ class BaseMessage:
143
159
  dictionary for the message.
144
160
  video_bytes (Optional[bytes]): Optional bytes of a video
145
161
  associated with the message.
146
- image_list (Optional[List[Image.Image]]): Optional list of PIL
147
- Image objects associated with the message.
162
+ image_list (Optional[List[Union[Image.Image, str]]]): Optional list
163
+ of PIL Image objects or image URLs (strings) associated with
164
+ the message.
148
165
  image_detail (Union[OpenAIVisionDetailType, str]): Detail level of
149
166
  the images associated with the message.
150
167
  video_detail (Union[OpenAIVisionDetailType, str]): Detail level of
@@ -164,6 +181,32 @@ class BaseMessage:
164
181
  OpenAIVisionDetailType(video_detail).value,
165
182
  )
166
183
 
184
+ @classmethod
185
+ def make_system_message(
186
+ cls,
187
+ content: str,
188
+ role_name: str = "System",
189
+ meta_dict: Optional[Dict[str, str]] = None,
190
+ ) -> "BaseMessage":
191
+ r"""Create a new system message.
192
+
193
+ Args:
194
+ content (str): The content of the system message.
195
+ role_name (str): The name of the system role.
196
+ (default: :obj:`"System"`)
197
+ meta_dict (Optional[Dict[str, str]]): Additional metadata
198
+ dictionary for the message.
199
+
200
+ Returns:
201
+ BaseMessage: The new system message.
202
+ """
203
+ return cls(
204
+ role_name,
205
+ RoleType.SYSTEM,
206
+ meta_dict,
207
+ content,
208
+ )
209
+
167
210
  def create_new_instance(self, content: str) -> "BaseMessage":
168
211
  r"""Create a new instance of the :obj:`BaseMessage` with updated
169
212
  content.
@@ -179,6 +222,12 @@ class BaseMessage:
179
222
  role_type=self.role_type,
180
223
  meta_dict=self.meta_dict,
181
224
  content=content,
225
+ video_bytes=self.video_bytes,
226
+ image_list=self.image_list,
227
+ image_detail=self.image_detail,
228
+ video_detail=self.video_detail,
229
+ parsed=self.parsed,
230
+ reasoning_content=self.reasoning_content,
182
231
  )
183
232
 
184
233
  def __add__(self, other: Any) -> Union["BaseMessage", Any]:
@@ -425,38 +474,68 @@ class BaseMessage:
425
474
  )
426
475
  if self.image_list and len(self.image_list) > 0:
427
476
  for image in self.image_list:
428
- if image.format is None:
429
- raise ValueError(
430
- f"Image's `format` is `None`, please "
431
- f"transform the `PIL.Image.Image` to one of "
432
- f"following supported formats, such as "
433
- f"{list(OpenAIImageType)}"
477
+ # Check if image is a URL string or PIL Image
478
+ if isinstance(image, str):
479
+ # Image is a URL string
480
+ hybrid_content.append(
481
+ {
482
+ "type": "image_url",
483
+ "image_url": {
484
+ "url": image,
485
+ "detail": self.image_detail,
486
+ },
487
+ }
434
488
  )
489
+ else:
490
+ # Image is a PIL Image object
491
+ if image.format is None:
492
+ # Set default format to PNG as fallback
493
+ image.format = 'PNG'
494
+
495
+ image_type: str = image.format.lower()
496
+ if image_type not in OpenAIImageType:
497
+ raise ValueError(
498
+ f"Image type {image.format} "
499
+ f"is not supported by OpenAI vision model"
500
+ )
501
+
502
+ # Convert RGBA to RGB for formats that don't support
503
+ # transparency or when the image has transparency channel
504
+ img_to_save = image
505
+ if image.mode in ('RGBA', 'LA', 'P') and image_type in (
506
+ 'jpeg',
507
+ 'jpg',
508
+ ):
509
+ # JPEG doesn't support transparency, convert to RGB
510
+ img_to_save = image.convert('RGB')
511
+ elif (
512
+ image.mode in ('RGBA', 'LA', 'P')
513
+ and image_type == 'png'
514
+ ):
515
+ # For PNG with transparency, convert to RGBA if needed
516
+ if image.mode in ('LA', 'P'):
517
+ img_to_save = image.convert('RGBA')
518
+ # else: RGBA mode, keep as-is
435
519
 
436
- image_type: str = image.format.lower()
437
- if image_type not in OpenAIImageType:
438
- raise ValueError(
439
- f"Image type {image.format} "
440
- f"is not supported by OpenAI vision model"
441
- )
442
- with io.BytesIO() as buffer:
443
- image.save(fp=buffer, format=image.format)
444
- encoded_image = base64.b64encode(buffer.getvalue()).decode(
445
- "utf-8"
520
+ with io.BytesIO() as buffer:
521
+ img_to_save.save(fp=buffer, format=image.format)
522
+ encoded_image = base64.b64encode(
523
+ buffer.getvalue()
524
+ ).decode("utf-8")
525
+ image_prefix = f"data:image/{image_type};base64,"
526
+ hybrid_content.append(
527
+ {
528
+ "type": "image_url",
529
+ "image_url": {
530
+ "url": f"{image_prefix}{encoded_image}",
531
+ "detail": self.image_detail,
532
+ },
533
+ }
446
534
  )
447
- image_prefix = f"data:image/{image_type};base64,"
448
- hybrid_content.append(
449
- {
450
- "type": "image_url",
451
- "image_url": {
452
- "url": f"{image_prefix}{encoded_image}",
453
- "detail": self.image_detail,
454
- },
455
- }
456
- )
457
535
 
458
536
  if self.video_bytes:
459
537
  import imageio.v3 as iio
538
+ import numpy as np
460
539
 
461
540
  base64Frames: List[str] = []
462
541
  frame_count = 0
@@ -525,7 +604,18 @@ class BaseMessage:
525
604
  OpenAIAssistantMessage: The converted :obj:`OpenAIAssistantMessage`
526
605
  object.
527
606
  """
528
- return {"role": "assistant", "content": self.content}
607
+ message_dict: Dict[str, Any] = {
608
+ "role": "assistant",
609
+ "content": self.content,
610
+ }
611
+
612
+ # Check if meta_dict contains tool_calls
613
+ if self.meta_dict and "tool_calls" in self.meta_dict:
614
+ tool_calls = self.meta_dict["tool_calls"]
615
+ if tool_calls:
616
+ message_dict["tool_calls"] = tool_calls
617
+
618
+ return message_dict # type: ignore[return-value]
529
619
 
530
620
  def to_dict(self) -> Dict:
531
621
  r"""Converts the message to a dictionary.
@@ -533,9 +623,66 @@ class BaseMessage:
533
623
  Returns:
534
624
  dict: The converted dictionary.
535
625
  """
536
- return {
626
+ result = {
537
627
  "role_name": self.role_name,
538
- "role_type": self.role_type.name,
628
+ "role_type": self.role_type.value,
539
629
  **(self.meta_dict or {}),
540
630
  "content": self.content,
541
631
  }
632
+
633
+ # Include image/video fields if present
634
+ if self.image_list is not None:
635
+ # Handle both PIL Images and URL strings
636
+ import base64
637
+ from io import BytesIO
638
+
639
+ image_data_list = []
640
+ for img in self.image_list:
641
+ if isinstance(img, str):
642
+ # Image is a URL string, store as-is
643
+ image_data_list.append({"type": "url", "data": img})
644
+ else:
645
+ # Image is a PIL Image, convert to base64
646
+ # Preserve format, default to PNG if not set
647
+ img_format = img.format if img.format else "PNG"
648
+
649
+ # Handle transparency for different formats
650
+ img_to_save = img
651
+ if img.mode in (
652
+ 'RGBA',
653
+ 'LA',
654
+ 'P',
655
+ ) and img_format.upper() in ('JPEG', 'JPG'):
656
+ # JPEG doesn't support transparency, convert to RGB
657
+ img_to_save = img.convert('RGB')
658
+ elif (
659
+ img.mode in ('LA', 'P') and img_format.upper() == 'PNG'
660
+ ):
661
+ # For PNG with transparency, convert to RGBA if needed
662
+ img_to_save = img.convert('RGBA')
663
+ # else: keep as-is for other combinations
664
+
665
+ buffered = BytesIO()
666
+ img_to_save.save(buffered, format=img_format)
667
+ img_str = base64.b64encode(buffered.getvalue()).decode()
668
+ image_data_list.append(
669
+ {
670
+ "type": "base64",
671
+ "data": img_str,
672
+ "format": img_format, # Preserve format
673
+ }
674
+ )
675
+ result["image_list"] = image_data_list
676
+
677
+ if self.video_bytes is not None:
678
+ import base64
679
+
680
+ result["video_bytes"] = base64.b64encode(self.video_bytes).decode()
681
+
682
+ if self.image_detail is not None:
683
+ result["image_detail"] = self.image_detail
684
+
685
+ if self.video_detail is not None:
686
+ result["video_detail"] = self.video_detail
687
+
688
+ return result
@@ -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 .alpaca import AlpacaItem
16
16
  from .conversation_models import (
@@ -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 re
16
16
 
@@ -1,4 +1,4 @@
1
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
1
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
2
2
  # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
@@ -10,7 +10,7 @@
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
13
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
 
15
15
  import json
16
16
  from typing import Any, Dict, List, Literal
@@ -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
 
16
16
  from .hermes import HermesFunctionFormatter
@@ -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 abc import ABC, abstractmethod
15
15
  from typing import Any, Dict, Generic, List, Optional, TypeVar
16
16
 
@@ -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 .hermes_function_formatter import HermesFunctionFormatter
16
16
 
@@ -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 json
15
15
  import re
16
16
  from typing import Any, Dict, List, Optional
@@ -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 json
15
15
  from dataclasses import dataclass
16
16
  from typing import Any, Dict, Optional
@@ -47,12 +47,20 @@ class FunctionCallingMessage(BaseMessage):
47
47
  (default: :obj:`None`)
48
48
  tool_call_id (Optional[str]): The ID of the tool call, if available.
49
49
  (default: :obj:`None`)
50
+ mask_output (Optional[bool]): Whether to return a sanitized placeholder
51
+ instead of the raw tool output.
52
+ (default: :obj:`False`)
53
+ extra_content (Optional[Dict[str, Any]]): Additional content
54
+ associated with the tool call.
55
+ (default: :obj:`None`)
50
56
  """
51
57
 
52
58
  func_name: Optional[str] = None
53
59
  args: Optional[Dict] = None
54
60
  result: Optional[Any] = None
55
61
  tool_call_id: Optional[str] = None
62
+ mask_output: Optional[bool] = False
63
+ extra_content: Optional[Dict[str, Any]] = None
56
64
 
57
65
  def to_openai_message(
58
66
  self,
@@ -105,10 +113,13 @@ class FunctionCallingMessage(BaseMessage):
105
113
  # This is a function response
106
114
  # TODO: Allow for more flexible setting of tool role,
107
115
  # optionally to be the same as assistant messages
108
- content = function_format.format_tool_response(
109
- self.func_name, # type: ignore[arg-type]
110
- self.result, # type: ignore[arg-type]
111
- )
116
+ if self.mask_output:
117
+ content = "[MASKED]"
118
+ else:
119
+ content = function_format.format_tool_response(
120
+ self.func_name, # type: ignore[arg-type]
121
+ self.result, # type: ignore[arg-type]
122
+ )
112
123
  return ShareGPTMessage(from_="tool", value=content) # type: ignore[call-arg]
113
124
 
114
125
  def to_openai_assistant_message(self) -> OpenAIAssistantMessage:
@@ -124,19 +135,23 @@ class FunctionCallingMessage(BaseMessage):
124
135
  " due to missing function name or arguments."
125
136
  )
126
137
 
138
+ tool_call = {
139
+ "id": self.tool_call_id or "null",
140
+ "type": "function",
141
+ "function": {
142
+ "name": self.func_name,
143
+ "arguments": json.dumps(self.args, ensure_ascii=False),
144
+ },
145
+ }
146
+
147
+ # Include extra_content if available
148
+ if self.extra_content is not None:
149
+ tool_call["extra_content"] = self.extra_content
150
+
127
151
  return {
128
152
  "role": "assistant",
129
153
  "content": self.content or "",
130
- "tool_calls": [
131
- {
132
- "id": self.tool_call_id or "null",
133
- "type": "function",
134
- "function": {
135
- "name": self.func_name,
136
- "arguments": json.dumps(self.args, ensure_ascii=False),
137
- },
138
- }
139
- ],
154
+ "tool_calls": [tool_call], # type: ignore[list-item]
140
155
  }
141
156
 
142
157
  def to_openai_tool_message(self) -> OpenAIToolMessageParam:
@@ -154,10 +169,32 @@ class FunctionCallingMessage(BaseMessage):
154
169
  " due to missing function name."
155
170
  )
156
171
 
157
- result_content = str(self.result)
172
+ if self.mask_output:
173
+ result_content = "[MASKED]"
174
+ else:
175
+ result_content = str(self.result)
158
176
 
159
177
  return {
160
178
  "role": "tool",
161
179
  "content": result_content,
162
180
  "tool_call_id": self.tool_call_id or "null",
163
181
  }
182
+
183
+ def to_dict(self) -> Dict:
184
+ r"""Converts the message to a dictionary.
185
+
186
+ Returns:
187
+ dict: The converted dictionary.
188
+ """
189
+ base = super().to_dict()
190
+ base["func_name"] = self.func_name
191
+ if self.args is not None:
192
+ base["args"] = self.args
193
+ if self.result is not None:
194
+ base["result"] = self.result
195
+ if self.tool_call_id is not None:
196
+ base["tool_call_id"] = self.tool_call_id
197
+ base["mask_output"] = self.mask_output
198
+ if self.extra_content is not None:
199
+ base["extra_content"] = self.extra_content
200
+ return base
camel/models/__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,14 +10,19 @@
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
+ from .aihubmix_model import AihubMixModel
14
15
  from .aiml_model import AIMLModel
16
+ from .amd_model import AMDModel
15
17
  from .anthropic_model import AnthropicModel
16
18
  from .aws_bedrock_model import AWSBedrockModel
17
19
  from .azure_openai_model import AzureOpenAIModel
18
20
  from .base_audio_model import BaseAudioModel
19
21
  from .base_model import BaseModelBackend
22
+ from .cerebras_model import CerebrasModel
20
23
  from .cohere_model import CohereModel
24
+ from .cometapi_model import CometAPIModel
25
+ from .crynux_model import CrynuxModel
21
26
  from .deepseek_model import DeepSeekModel
22
27
  from .fish_audio_model import FishAudioModel
23
28
  from .gemini_model import GeminiModel
@@ -25,11 +30,13 @@ from .groq_model import GroqModel
25
30
  from .internlm_model import InternLMModel
26
31
  from .litellm_model import LiteLLMModel
27
32
  from .lmstudio_model import LMStudioModel
33
+ from .minimax_model import MinimaxModel
28
34
  from .mistral_model import MistralModel
29
35
  from .model_factory import ModelFactory
30
36
  from .model_manager import ModelManager, ModelProcessingError
31
37
  from .modelscope_model import ModelScopeModel
32
38
  from .moonshot_model import MoonshotModel
39
+ from .nebius_model import NebiusModel
33
40
  from .nemotron_model import NemotronModel
34
41
  from .netmind_model import NetmindModel
35
42
  from .novita_model import NovitaModel
@@ -40,6 +47,7 @@ from .openai_compatible_model import OpenAICompatibleModel
40
47
  from .openai_model import OpenAIModel
41
48
  from .openrouter_model import OpenRouterModel
42
49
  from .ppio_model import PPIOModel
50
+ from .qianfan_model import QianfanModel
43
51
  from .qwen_model import QwenModel
44
52
  from .reka_model import RekaModel
45
53
  from .samba_model import SambaModel
@@ -59,11 +67,14 @@ __all__ = [
59
67
  'OpenRouterModel',
60
68
  'AzureOpenAIModel',
61
69
  'AnthropicModel',
70
+ 'AMDModel',
62
71
  'MistralModel',
63
72
  'GroqModel',
64
73
  'StubModel',
65
74
  'ZhipuAIModel',
75
+ 'CerebrasModel',
66
76
  'CohereModel',
77
+ 'CometAPIModel',
67
78
  'ModelFactory',
68
79
  'ModelManager',
69
80
  'LiteLLMModel',
@@ -85,6 +96,7 @@ __all__ = [
85
96
  'QwenModel',
86
97
  'AWSBedrockModel',
87
98
  'ModelProcessingError',
99
+ 'NebiusModel',
88
100
  'DeepSeekModel',
89
101
  'FishAudioModel',
90
102
  'InternLMModel',
@@ -95,5 +107,9 @@ __all__ = [
95
107
  'SiliconFlowModel',
96
108
  'VolcanoModel',
97
109
  'LMStudioModel',
110
+ 'MinimaxModel',
98
111
  'WatsonXModel',
112
+ 'QianfanModel',
113
+ 'CrynuxModel',
114
+ 'AihubMixModel',
99
115
  ]