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,465 @@
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
+ import argparse
15
+ import json
16
+ import logging
17
+ import os
18
+ import sys # Import the sys module
19
+ from logging.handlers import RotatingFileHandler
20
+ from typing import Any, Dict, List
21
+
22
+ app = None
23
+ products: List[Dict[str, Any]] = []
24
+ products_by_id: Dict[int, Dict[str, Any]] = {}
25
+ cart: List[Dict[str, Any]] = []
26
+ ACTION_COUNT: int = 0
27
+
28
+
29
+ def load_products(file_path: str = 'products.json') -> None:
30
+ global products, products_by_id
31
+ try:
32
+ # The products.json is expected to be
33
+ # in the same directory as this app.py
34
+ # or given by mock_web.py
35
+ script_dir = os.path.dirname(__file__)
36
+ abs_file_path = os.path.join(script_dir, file_path)
37
+ with open(abs_file_path, 'r') as f:
38
+ products = json.load(f)
39
+ products_by_id = {product['id']: product for product in products}
40
+ except FileNotFoundError:
41
+ sys.stderr.write(f"Error: {file_path} not found.\n")
42
+ products = []
43
+ products_by_id = {}
44
+ except json.JSONDecodeError:
45
+ sys.stderr.write(f"Error: Could not decode JSON from {file_path}.\n")
46
+ products = []
47
+ products_by_id = {}
48
+
49
+
50
+ # --- Logging Setup ---
51
+ def setup_logging(application):
52
+ log_formatter = logging.Formatter(
53
+ '%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
54
+ )
55
+ # Log to a file in the same directory as this script
56
+ script_dir = os.path.dirname(__file__)
57
+ log_file = os.path.join(script_dir, 'app.log')
58
+
59
+ # File Handler
60
+ file_handler = RotatingFileHandler(
61
+ log_file, maxBytes=1024 * 1024 * 10, backupCount=5
62
+ ) # 10MB per file, 5 backups
63
+ file_handler.setFormatter(log_formatter)
64
+ file_handler.setLevel(logging.INFO)
65
+
66
+ # Stream Handler (for console output)
67
+ stream_handler = logging.StreamHandler(
68
+ sys.stdout
69
+ ) # Explicitly set to stdout
70
+ stream_handler.setFormatter(log_formatter)
71
+ stream_handler.setLevel(logging.INFO)
72
+
73
+ application.logger.addHandler(file_handler)
74
+ application.logger.addHandler(stream_handler)
75
+ application.logger.setLevel(logging.INFO)
76
+ application.logger.info(
77
+ f"Logging setup complete. Logs will be saved to {log_file}"
78
+ )
79
+
80
+
81
+ # --- End Logging Setup ---
82
+
83
+
84
+ # --- Task Mode Helper ---
85
+ def check_task_completion(current_cart_raw, ground_truth_spec):
86
+ if not ground_truth_spec: # No ground truth defined
87
+ return False
88
+
89
+ # Group current cart by product ID and count quantity
90
+ current_cart_grouped = {}
91
+ for item in current_cart_raw:
92
+ pid = item['id']
93
+ current_cart_grouped[pid] = current_cart_grouped.get(pid, 0) + 1
94
+
95
+ # Convert ground truth spec to a comparable dictionary {product_id:
96
+ # quantity}
97
+ ground_truth_dict = {}
98
+ for item_spec in ground_truth_spec:
99
+ ground_truth_dict[item_spec['id']] = item_spec['quantity']
100
+
101
+ # Check if current cart exactly matches ground truth
102
+ # 1. Same number of unique product types
103
+ if len(current_cart_grouped) != len(ground_truth_dict):
104
+ return False
105
+
106
+ # 2. Each product in current cart matches ground truth quantity, and all
107
+ # ground truth items are present
108
+ for pid, qty_spec in ground_truth_dict.items():
109
+ if (
110
+ pid not in current_cart_grouped
111
+ or current_cart_grouped[pid] != qty_spec
112
+ ):
113
+ return False
114
+
115
+ # Ensure no extra items in current_cart_grouped that are not in
116
+ # ground_truth_dict (already covered by length check if all ground truth
117
+ # items are found)
118
+ # For robustness, explicitly check this too:
119
+ for pid_current in current_cart_grouped.keys():
120
+ if pid_current not in ground_truth_dict:
121
+ return False
122
+
123
+ return True
124
+
125
+
126
+ # --- End Task Mode Helper ---
127
+
128
+
129
+ # --- Task Completion Helper ---
130
+ def _trigger_task_completion_check():
131
+ r"""Checks for task completion if in task mode and not already signaled."""
132
+ # Uses global `app` and `cart`
133
+ if app.config.get('TASK_ACTIVE') and not app.config.get(
134
+ 'TASK_COMPLETION_SIGNALED'
135
+ ):
136
+ if check_task_completion(cart, app.config.get('GROUND_TRUTH_CART')):
137
+ app.config['TASK_COMPLETION_SIGNALED'] = True
138
+ app.logger.info(
139
+ "TASK COMPLETED: Ground truth cart state achieved."
140
+ )
141
+
142
+
143
+ # --- End Task Completion Helper ---
144
+ def create_app():
145
+ global app
146
+ try:
147
+ from flask import Flask, jsonify, render_template, request
148
+ except ImportError:
149
+ raise ImportError(
150
+ "Flask not installed. Please install it with `pip install Flask`"
151
+ )
152
+
153
+ # Adjust template and static folder paths
154
+ script_dir = os.path.dirname(os.path.abspath(__file__))
155
+ app = Flask(
156
+ __name__,
157
+ template_folder=os.path.join(script_dir, 'templates'),
158
+ static_folder=os.path.join(script_dir, 'static'),
159
+ )
160
+ setup_logging(app)
161
+
162
+ # --- Global Task Config ---
163
+ app.config['TASK_ACTIVE'] = False
164
+ app.config['GROUND_TRUTH_CART'] = []
165
+ app.config['TASK_COMPLETION_SIGNALED'] = False
166
+
167
+ @app.route('/')
168
+ def home():
169
+ global ACTION_COUNT
170
+ ACTION_COUNT += 1
171
+ unique_categories = sorted({p["category"] for p in products})
172
+ products_by_category = {}
173
+ for product in products:
174
+ category = product["category"]
175
+ if category not in products_by_category:
176
+ products_by_category[category] = []
177
+ products_by_category[category].append(product)
178
+
179
+ app.logger.info(
180
+ "Home page requested. "
181
+ f"Categories: {unique_categories}. Cart count: {len(cart)}"
182
+ )
183
+ # Pass products_by_category to the template instead of the flat
184
+ # products list for main display
185
+ return render_template(
186
+ 'index.html',
187
+ products_by_category=products_by_category,
188
+ categories=unique_categories,
189
+ cart_count=len(cart),
190
+ all_products=products,
191
+ )
192
+
193
+ @app.route('/product/<int:product_id>')
194
+ def product_detail(product_id):
195
+ global ACTION_COUNT
196
+ ACTION_COUNT += 1
197
+ product = products_by_id.get(product_id)
198
+ app.logger.info(
199
+ f"Product detail page requested for ID: {product_id}. "
200
+ f"Cart count: {len(cart)}"
201
+ )
202
+ if product:
203
+ return render_template(
204
+ 'product-detail.html', product=product, cart_count=len(cart)
205
+ )
206
+ return "Product not found", 404
207
+
208
+ @app.route('/cart')
209
+ def view_cart():
210
+ global ACTION_COUNT
211
+ ACTION_COUNT += 1
212
+ total_price = sum(
213
+ item['price'] * item.get('quantity', 1) for item in cart
214
+ )
215
+ app.logger.info(f"Cart page requested. Cart count: {len(cart)}")
216
+ return render_template(
217
+ 'cart.html', cart_items=cart, total_price=total_price
218
+ )
219
+
220
+ @app.route('/api/products')
221
+ def get_products():
222
+ return jsonify(products)
223
+
224
+ @app.route('/api/cart', methods=['GET'])
225
+ def get_cart_api():
226
+ total_price = sum(
227
+ item['price'] * item.get('quantity', 1) for item in cart
228
+ )
229
+ return jsonify({'cart': cart, 'total_price': total_price})
230
+
231
+ @app.route('/api/cart/add', methods=['POST'])
232
+ def add_to_cart_api():
233
+ global ACTION_COUNT
234
+ data = request.json
235
+ product_id = data.get('productId')
236
+
237
+ if not product_id:
238
+ return jsonify(
239
+ {'success': False, 'message': 'Product ID is required'}
240
+ ), 400
241
+
242
+ product = products_by_id.get(product_id)
243
+ if not product:
244
+ return jsonify(
245
+ {'success': False, 'message': 'Product not found'}
246
+ ), 404
247
+
248
+ # Check if product is already in cart
249
+ for item in cart:
250
+ if item['id'] == product_id:
251
+ # If yes, just increment quantity
252
+ item.get('quantity', 1)
253
+ item['quantity'] = item.get('quantity', 1) + 1
254
+ app.logger.info(
255
+ f"Incremented quantity for product {product_id} in cart."
256
+ )
257
+ return jsonify(
258
+ {'success': True, 'cart': cart, 'cart_count': len(cart)}
259
+ )
260
+
261
+ # If not, add new item to cart
262
+ cart_item = product.copy()
263
+ cart_item['quantity'] = 1 # Start with quantity 1
264
+ cart.append(cart_item)
265
+ ACTION_COUNT += 1 # Increment on successful add
266
+
267
+ _trigger_task_completion_check()
268
+
269
+ app.logger.info(f"Added product {product_id} to cart.")
270
+ return jsonify(
271
+ {'success': True, 'cart': cart, 'cart_count': len(cart)}
272
+ )
273
+
274
+ @app.route('/api/cart/update', methods=['POST'])
275
+ def update_cart_item_api():
276
+ data = request.json
277
+ product_id = data.get('productId')
278
+ quantity = data.get('quantity')
279
+
280
+ if not product_id:
281
+ return jsonify(
282
+ {'success': False, 'message': 'Product ID is required'}
283
+ ), 400
284
+
285
+ try:
286
+ # Ensure quantity is a non-negative integer
287
+ quantity = int(quantity)
288
+ if quantity < 0:
289
+ raise ValueError
290
+ except (ValueError, TypeError):
291
+ return jsonify(
292
+ {'success': False, 'message': 'Invalid quantity'}
293
+ ), 400
294
+
295
+ found_item = False
296
+ for item in cart:
297
+ if item['id'] == product_id:
298
+ if quantity > 0:
299
+ item['quantity'] = quantity
300
+ app.logger.info(
301
+ "Updated quantity for product "
302
+ f"{product_id} to {quantity}."
303
+ )
304
+ else:
305
+ # If quantity is 0, remove the item
306
+ cart.remove(item)
307
+ app.logger.info(f"Removed product {product_id} from cart.")
308
+ found_item = True
309
+ break
310
+
311
+ if not found_item:
312
+ return jsonify(
313
+ {'success': False, 'message': 'Product not in cart'}
314
+ ), 404
315
+
316
+ _trigger_task_completion_check()
317
+
318
+ total_price = sum(
319
+ item['price'] * item.get('quantity', 1) for item in cart
320
+ )
321
+ return jsonify(
322
+ {
323
+ 'success': True,
324
+ 'cart': cart,
325
+ 'cart_count': len(cart),
326
+ 'total_price': total_price,
327
+ }
328
+ )
329
+
330
+ @app.route('/api/cart/remove', methods=['POST'])
331
+ def remove_from_cart_api():
332
+ global cart, ACTION_COUNT
333
+ data = request.json
334
+ product_id = data.get('productId')
335
+
336
+ if not product_id:
337
+ return jsonify(
338
+ {'success': False, 'message': 'Product ID is required'}
339
+ ), 400
340
+
341
+ original_cart_len = len(cart)
342
+ # List comprehension to create a new list excluding the item to be
343
+ # removed This is simpler than finding index and deleting
344
+ cart[:] = [item for item in cart if item['id'] != product_id]
345
+
346
+ if len(cart) < original_cart_len:
347
+ ACTION_COUNT += 1 # Increment on successful remove
348
+ app.logger.info(f"Removed product {product_id} from cart.")
349
+
350
+ _trigger_task_completion_check()
351
+
352
+ total_price = sum(
353
+ item['price'] * item.get('quantity', 1) for item in cart
354
+ )
355
+ return jsonify(
356
+ {
357
+ 'success': True,
358
+ 'cart': cart,
359
+ 'cart_count': len(cart),
360
+ 'total_price': total_price,
361
+ }
362
+ )
363
+
364
+ return jsonify(
365
+ {'success': False, 'message': 'Product not in cart'}
366
+ ), 404
367
+
368
+ @app.route('/task/start', methods=['POST'])
369
+ def start_task():
370
+ global cart, ACTION_COUNT
371
+ ACTION_COUNT = 0 # Reset action counter
372
+ data = request.json
373
+ ground_truth = data.get('ground_truth_cart')
374
+
375
+ if not isinstance(ground_truth, list):
376
+ return jsonify(
377
+ {
378
+ 'success': False,
379
+ 'message': '`ground_truth_cart` must be a list.',
380
+ }
381
+ ), 400
382
+
383
+ # Validate ground truth spec
384
+ for item_spec in ground_truth:
385
+ if not all(k in item_spec for k in ['id', 'quantity']):
386
+ return jsonify(
387
+ {
388
+ 'success': False,
389
+ 'message': (
390
+ 'Each item in `ground_truth_cart` must have '
391
+ '`id` and `quantity`.'
392
+ ),
393
+ }
394
+ ), 400
395
+
396
+ app.config['TASK_ACTIVE'] = True
397
+ app.config['GROUND_TRUTH_CART'] = ground_truth
398
+ app.config['TASK_COMPLETION_SIGNALED'] = False # Reset signal
399
+ cart = [] # Reset cart
400
+ app.logger.info(f"TASK MODE STARTED. Ground truth: {ground_truth}")
401
+ return jsonify(
402
+ {'success': True, 'message': 'Task mode started. Cart reset.'}
403
+ )
404
+
405
+ @app.route('/task/check', methods=['GET'])
406
+ def check_task():
407
+ global ACTION_COUNT
408
+ if not app.config.get('TASK_ACTIVE'):
409
+ return jsonify(
410
+ {'success': False, 'message': 'Task mode is not active.'}
411
+ ), 400
412
+
413
+ completed = app.config.get('TASK_COMPLETION_SIGNALED', False)
414
+ if completed:
415
+ message = "Task completed successfully."
416
+ else:
417
+ message = "Task not yet completed."
418
+
419
+ return jsonify(
420
+ {
421
+ 'success': True,
422
+ 'completed': completed,
423
+ 'steps': ACTION_COUNT,
424
+ 'message': message,
425
+ }
426
+ )
427
+
428
+ @app.route('/task/stop', methods=['POST'])
429
+ def stop_task():
430
+ global cart
431
+ app.config['TASK_ACTIVE'] = False
432
+ app.config['GROUND_TRUTH_CART'] = []
433
+ app.config['TASK_COMPLETION_SIGNALED'] = False
434
+ cart = [] # Reset cart
435
+ app.logger.info("TASK MODE STOPPED. Cart reset.")
436
+ return jsonify(
437
+ {'success': True, 'message': 'Task mode stopped. Cart reset.'}
438
+ )
439
+
440
+ return app
441
+
442
+
443
+ def main():
444
+ parser = argparse.ArgumentParser(
445
+ description="Run the mock website server."
446
+ )
447
+ parser.add_argument(
448
+ '--port', type=int, default=5000, help='Port to run the server on.'
449
+ )
450
+ args = parser.parse_args()
451
+
452
+ # Load products specific to this app
453
+ load_products()
454
+ flask_app = create_app()
455
+
456
+ if flask_app:
457
+ # Use 0.0.0.0 to make it accessible from the dispatcher
458
+ # Disable the reloader to prevent state loss on logging
459
+ flask_app.run(
460
+ debug=True, port=args.port, host='0.0.0.0', use_reloader=False
461
+ )
462
+
463
+
464
+ if __name__ == "__main__":
465
+ main()
@@ -0,0 +1,104 @@
1
+ {
2
+ "products": [
3
+ {
4
+ "id": 1,
5
+ "name": "Gaming Laptop",
6
+ "price": 1200,
7
+ "image": "assets/img/products/laptop.jpg",
8
+ "category": "Electronics",
9
+ "rating": 4.5,
10
+ "description": "High-performance gaming laptop with latest specs."
11
+ },
12
+ {
13
+ "id": 2,
14
+ "name": "Wireless Mouse",
15
+ "price": 25,
16
+ "image": "assets/img/products/mouse.jpg",
17
+ "category": "Electronics",
18
+ "rating": 4.0,
19
+ "description": "Ergonomic wireless mouse with long battery life."
20
+ },
21
+ {
22
+ "id": 3,
23
+ "name": "Mechanical Keyboard",
24
+ "price": 75,
25
+ "image": "assets/img/products/keyboard.jpg",
26
+ "category": "Electronics",
27
+ "rating": 4.8,
28
+ "description": "RGB mechanical keyboard with customizable keys."
29
+ },
30
+ {
31
+ "id": 4,
32
+ "name": "Coffee Maker",
33
+ "price": 50,
34
+ "image": "assets/img/products/coffeemaker.jpg",
35
+ "category": "Home Goods",
36
+ "rating": 3.9,
37
+ "description": "Drip coffee maker with programmable timer."
38
+ },
39
+ {
40
+ "id": 5,
41
+ "name": "Bluetooth Speaker",
42
+ "price": 45,
43
+ "image": "assets/img/products/speaker.jpg",
44
+ "category": "Electronics",
45
+ "rating": 4.2,
46
+ "description": "Portable Bluetooth speaker with rich sound."
47
+ },
48
+ {
49
+ "id": 6,
50
+ "name": "Smartphone",
51
+ "price": 699,
52
+ "image": "assets/img/products/smartphone.jpg",
53
+ "category": "Electronics",
54
+ "rating": 4.6,
55
+ "description": "Latest-gen smartphone with stunning display and fast performance."
56
+ },
57
+ {
58
+ "id": 7,
59
+ "name": "Air Purifier",
60
+ "price": 130,
61
+ "image": "assets/img/products/airpurifier.jpg",
62
+ "category": "Home Goods",
63
+ "rating": 4.3,
64
+ "description": "HEPA air purifier with quiet operation and multiple fan speeds."
65
+ },
66
+ {
67
+ "id": 8,
68
+ "name": "Fitness Tracker",
69
+ "price": 85,
70
+ "image": "assets/img/products/fitnesstracker.jpg",
71
+ "category": "Electronics",
72
+ "rating": 4.1,
73
+ "description": "Waterproof fitness tracker with heart rate and sleep monitoring."
74
+ },
75
+ {
76
+ "id": 9,
77
+ "name": "Electric Kettle",
78
+ "price": 35,
79
+ "image": "assets/img/products/kettle.jpg",
80
+ "category": "Home Goods",
81
+ "rating": 4.0,
82
+ "description": "Stainless steel electric kettle with auto shut-off feature."
83
+ },
84
+ {
85
+ "id": 10,
86
+ "name": "Noise Cancelling Headphones",
87
+ "price": 150,
88
+ "image": "assets/img/products/headphones.jpg",
89
+ "category": "Electronics",
90
+ "rating": 4.7,
91
+ "description": "Over-ear headphones with active noise cancellation and long battery life."
92
+ }
93
+ ],
94
+ "ground_truth_cart": [
95
+ {
96
+ "id": 1,
97
+ "quantity": 1
98
+ },
99
+ {
100
+ "id": 2,
101
+ "quantity": 1
102
+ }
103
+ ]
104
+ }
camel/benchmarks/nexus.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
 
15
15
  import ast
16
16
  import json
@@ -68,7 +68,7 @@ with the proper arguments that best answers the given prompt.
68
68
 
69
69
  Respond with nothing but the function call ONLY, such that I can \
70
70
  directly execute your function call without any post processing \
71
- necessary from my end. Do not use variables.
71
+ necessary from my end. Do not use variables.
72
72
  If there are more than two function calls, separate them with a semicolon (;).
73
73
 
74
74
  {tools}
@@ -1,4 +1,4 @@
1
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
1
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
2
2
  # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
@@ -10,7 +10,7 @@
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
13
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
 
15
15
  from typing import Any, Callable, Dict, List, Literal, Optional, Sequence
16
16
 
camel/bots/__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 .discord import DiscordApp
15
15
  from .slack.models import (
16
16
  SlackAppMentionEventBody,
@@ -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 .discord_app import DiscordApp
15
15
  from .discord_installation import DiscordInstallation
16
16
  from .discord_store 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
  import os
15
15
  from datetime import datetime, timedelta
16
16
  from typing import TYPE_CHECKING, 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
  from datetime import datetime
15
15
  from typing import Optional
16
16