camel-ai 0.2.62__tar.gz → 0.2.65__tar.gz

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 (428) hide show
  1. {camel_ai-0.2.62 → camel_ai-0.2.65}/PKG-INFO +9 -12
  2. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/__init__.py +1 -1
  3. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/chat_agent.py +95 -24
  4. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/mcp_agent.py +5 -1
  5. camel_ai-0.2.65/camel/benchmarks/mock_website/README.md +96 -0
  6. camel_ai-0.2.65/camel/benchmarks/mock_website/mock_web.py +299 -0
  7. camel_ai-0.2.65/camel/benchmarks/mock_website/requirements.txt +3 -0
  8. camel_ai-0.2.65/camel/benchmarks/mock_website/shopping_mall/app.py +465 -0
  9. camel_ai-0.2.65/camel/benchmarks/mock_website/task.json +104 -0
  10. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/__init__.py +3 -0
  11. camel_ai-0.2.65/camel/configs/crynux_config.py +94 -0
  12. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datasets/models.py +1 -1
  13. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datasets/static_dataset.py +6 -0
  14. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/interpreters/base.py +14 -1
  15. camel_ai-0.2.65/camel/interpreters/docker/Dockerfile +68 -0
  16. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/interpreters/docker_interpreter.py +65 -7
  17. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/interpreters/e2b_interpreter.py +23 -8
  18. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/interpreters/internal_python_interpreter.py +30 -2
  19. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/interpreters/ipython_interpreter.py +21 -3
  20. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/interpreters/subprocess_interpreter.py +34 -2
  21. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/memories/records.py +5 -3
  22. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/__init__.py +2 -0
  23. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/azure_openai_model.py +101 -25
  24. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/cohere_model.py +65 -0
  25. camel_ai-0.2.65/camel/models/crynux_model.py +94 -0
  26. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/deepseek_model.py +43 -1
  27. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/gemini_model.py +50 -4
  28. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/litellm_model.py +38 -0
  29. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/mistral_model.py +66 -0
  30. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/model_factory.py +10 -1
  31. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/openai_compatible_model.py +81 -17
  32. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/openai_model.py +87 -16
  33. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/reka_model.py +69 -0
  34. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/samba_model.py +69 -2
  35. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/sglang_model.py +74 -2
  36. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/watsonx_model.py +62 -0
  37. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/societies/workforce/role_playing_worker.py +11 -3
  38. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/societies/workforce/single_agent_worker.py +31 -1
  39. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/societies/workforce/utils.py +51 -0
  40. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/societies/workforce/workforce.py +409 -7
  41. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/__init__.py +2 -0
  42. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/vectordb_storages/__init__.py +2 -0
  43. camel_ai-0.2.65/camel/storages/vectordb_storages/weaviate.py +714 -0
  44. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/tasks/task.py +27 -10
  45. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/async_browser_toolkit.py +97 -54
  46. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/browser_toolkit.py +65 -18
  47. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/code_execution.py +37 -8
  48. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/function_tool.py +2 -2
  49. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/mcp_toolkit.py +13 -2
  50. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/playwright_mcp_toolkit.py +16 -3
  51. camel_ai-0.2.65/camel/toolkits/task_planning_toolkit.py +134 -0
  52. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/types/enums.py +61 -2
  53. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/types/unified_model_type.py +5 -0
  54. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/__init__.py +16 -0
  55. camel_ai-0.2.65/camel/utils/langfuse.py +258 -0
  56. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/mcp_client.py +84 -17
  57. {camel_ai-0.2.62 → camel_ai-0.2.65}/pyproject.toml +16 -14
  58. camel_ai-0.2.62/camel/interpreters/docker/Dockerfile +0 -12
  59. {camel_ai-0.2.62 → camel_ai-0.2.65}/.gitignore +0 -0
  60. {camel_ai-0.2.62 → camel_ai-0.2.65}/LICENSE +0 -0
  61. {camel_ai-0.2.62 → camel_ai-0.2.65}/README.md +0 -0
  62. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/__init__.py +0 -0
  63. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/_types.py +0 -0
  64. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/_utils.py +0 -0
  65. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/base.py +0 -0
  66. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/critic_agent.py +0 -0
  67. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/deductive_reasoner_agent.py +0 -0
  68. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/embodied_agent.py +0 -0
  69. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/knowledge_graph_agent.py +0 -0
  70. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/multi_hop_generator_agent.py +0 -0
  71. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/programmed_agent_instruction.py +0 -0
  72. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/repo_agent.py +0 -0
  73. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/role_assignment_agent.py +0 -0
  74. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/search_agent.py +0 -0
  75. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/task_agent.py +0 -0
  76. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/tool_agents/__init__.py +0 -0
  77. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/tool_agents/base.py +0 -0
  78. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/agents/tool_agents/hugging_face_tool_agent.py +0 -0
  79. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/benchmarks/__init__.py +0 -0
  80. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/benchmarks/apibank.py +0 -0
  81. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/benchmarks/apibench.py +0 -0
  82. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/benchmarks/base.py +0 -0
  83. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/benchmarks/browsecomp.py +0 -0
  84. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/benchmarks/gaia.py +0 -0
  85. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/benchmarks/nexus.py +0 -0
  86. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/benchmarks/ragbench.py +0 -0
  87. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/bots/__init__.py +0 -0
  88. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/bots/discord/__init__.py +0 -0
  89. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/bots/discord/discord_app.py +0 -0
  90. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/bots/discord/discord_installation.py +0 -0
  91. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/bots/discord/discord_store.py +0 -0
  92. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/bots/slack/__init__.py +0 -0
  93. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/bots/slack/models.py +0 -0
  94. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/bots/slack/slack_app.py +0 -0
  95. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/bots/telegram_bot.py +0 -0
  96. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/aiml_config.py +0 -0
  97. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/anthropic_config.py +0 -0
  98. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/base_config.py +0 -0
  99. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/bedrock_config.py +0 -0
  100. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/cohere_config.py +0 -0
  101. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/deepseek_config.py +0 -0
  102. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/gemini_config.py +0 -0
  103. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/groq_config.py +0 -0
  104. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/internlm_config.py +0 -0
  105. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/litellm_config.py +0 -0
  106. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/lmstudio_config.py +0 -0
  107. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/mistral_config.py +0 -0
  108. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/modelscope_config.py +0 -0
  109. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/moonshot_config.py +0 -0
  110. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/netmind_config.py +0 -0
  111. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/novita_config.py +0 -0
  112. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/nvidia_config.py +0 -0
  113. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/ollama_config.py +0 -0
  114. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/openai_config.py +0 -0
  115. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/openrouter_config.py +0 -0
  116. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/ppio_config.py +0 -0
  117. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/qwen_config.py +0 -0
  118. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/reka_config.py +0 -0
  119. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/samba_config.py +0 -0
  120. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/sglang_config.py +0 -0
  121. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/siliconflow_config.py +0 -0
  122. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/togetherai_config.py +0 -0
  123. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/vllm_config.py +0 -0
  124. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/watsonx_config.py +0 -0
  125. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/yi_config.py +0 -0
  126. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/configs/zhipuai_config.py +0 -0
  127. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/data_collectors/__init__.py +0 -0
  128. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/data_collectors/alpaca_collector.py +0 -0
  129. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/data_collectors/base.py +0 -0
  130. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/data_collectors/sharegpt_collector.py +0 -0
  131. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/__init__.py +0 -0
  132. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/cot_datagen.py +0 -0
  133. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/evol_instruct/__init__.py +0 -0
  134. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/evol_instruct/evol_instruct.py +0 -0
  135. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/evol_instruct/scorer.py +0 -0
  136. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/evol_instruct/templates.py +0 -0
  137. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/self_improving_cot.py +0 -0
  138. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/self_instruct/__init__.py +0 -0
  139. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/self_instruct/filter/__init__.py +0 -0
  140. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/self_instruct/filter/filter_function.py +0 -0
  141. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/self_instruct/filter/filter_registry.py +0 -0
  142. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/self_instruct/filter/instruction_filter.py +0 -0
  143. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/self_instruct/self_instruct.py +0 -0
  144. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/self_instruct/templates.py +0 -0
  145. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/source2synth/__init__.py +0 -0
  146. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/source2synth/data_processor.py +0 -0
  147. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/source2synth/models.py +0 -0
  148. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datagen/source2synth/user_data_processor_config.py +0 -0
  149. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datahubs/__init__.py +0 -0
  150. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datahubs/base.py +0 -0
  151. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datahubs/huggingface.py +0 -0
  152. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datahubs/models.py +0 -0
  153. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datasets/__init__.py +0 -0
  154. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datasets/base_generator.py +0 -0
  155. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datasets/few_shot_generator.py +0 -0
  156. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/datasets/self_instruct_generator.py +0 -0
  157. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/embeddings/__init__.py +0 -0
  158. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/embeddings/azure_embedding.py +0 -0
  159. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/embeddings/base.py +0 -0
  160. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/embeddings/gemini_embedding.py +0 -0
  161. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/embeddings/jina_embedding.py +0 -0
  162. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/embeddings/mistral_embedding.py +0 -0
  163. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/embeddings/openai_compatible_embedding.py +0 -0
  164. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/embeddings/openai_embedding.py +0 -0
  165. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/embeddings/sentence_transformers_embeddings.py +0 -0
  166. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/embeddings/together_embedding.py +0 -0
  167. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/embeddings/vlm_embedding.py +0 -0
  168. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/environments/__init__.py +0 -0
  169. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/environments/models.py +0 -0
  170. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/environments/multi_step.py +0 -0
  171. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/environments/single_step.py +0 -0
  172. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/environments/tic_tac_toe.py +0 -0
  173. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/extractors/__init__.py +0 -0
  174. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/extractors/base.py +0 -0
  175. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/extractors/python_strategies.py +0 -0
  176. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/generators.py +0 -0
  177. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/human.py +0 -0
  178. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/interpreters/__init__.py +0 -0
  179. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/interpreters/interpreter_error.py +0 -0
  180. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/__init__.py +0 -0
  181. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/apify_reader.py +0 -0
  182. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/base_io.py +0 -0
  183. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/chunkr_reader.py +0 -0
  184. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/crawl4ai_reader.py +0 -0
  185. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/firecrawl_reader.py +0 -0
  186. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/jina_url_reader.py +0 -0
  187. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/markitdown.py +0 -0
  188. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/mineru_extractor.py +0 -0
  189. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/mistral_reader.py +0 -0
  190. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/pandas_reader.py +0 -0
  191. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/scrapegraph_reader.py +0 -0
  192. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/loaders/unstructured_io.py +0 -0
  193. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/logger.py +0 -0
  194. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/memories/__init__.py +0 -0
  195. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/memories/agent_memories.py +0 -0
  196. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/memories/base.py +0 -0
  197. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/memories/blocks/__init__.py +0 -0
  198. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/memories/blocks/chat_history_block.py +0 -0
  199. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/memories/blocks/vectordb_block.py +0 -0
  200. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/memories/context_creators/__init__.py +0 -0
  201. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/memories/context_creators/score_based.py +0 -0
  202. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/messages/__init__.py +0 -0
  203. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/messages/base.py +0 -0
  204. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/messages/conversion/__init__.py +0 -0
  205. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/messages/conversion/alpaca.py +0 -0
  206. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/messages/conversion/conversation_models.py +0 -0
  207. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/messages/conversion/sharegpt/__init__.py +0 -0
  208. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/messages/conversion/sharegpt/function_call_formatter.py +0 -0
  209. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/messages/conversion/sharegpt/hermes/__init__.py +0 -0
  210. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +0 -0
  211. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/messages/func_message.py +0 -0
  212. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/_utils.py +0 -0
  213. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/aiml_model.py +0 -0
  214. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/anthropic_model.py +0 -0
  215. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/aws_bedrock_model.py +0 -0
  216. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/base_audio_model.py +0 -0
  217. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/base_model.py +0 -0
  218. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/fish_audio_model.py +0 -0
  219. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/groq_model.py +0 -0
  220. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/internlm_model.py +0 -0
  221. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/lmstudio_model.py +0 -0
  222. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/model_manager.py +0 -0
  223. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/modelscope_model.py +0 -0
  224. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/moonshot_model.py +0 -0
  225. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/nemotron_model.py +0 -0
  226. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/netmind_model.py +0 -0
  227. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/novita_model.py +0 -0
  228. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/nvidia_model.py +0 -0
  229. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/ollama_model.py +0 -0
  230. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/openai_audio_models.py +0 -0
  231. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/openrouter_model.py +0 -0
  232. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/ppio_model.py +0 -0
  233. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/qwen_model.py +0 -0
  234. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/reward/__init__.py +0 -0
  235. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/reward/base_reward_model.py +0 -0
  236. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/reward/evaluator.py +0 -0
  237. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/reward/nemotron_model.py +0 -0
  238. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/reward/skywork_model.py +0 -0
  239. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/siliconflow_model.py +0 -0
  240. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/stub_model.py +0 -0
  241. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/togetherai_model.py +0 -0
  242. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/vllm_model.py +0 -0
  243. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/volcano_model.py +0 -0
  244. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/yi_model.py +0 -0
  245. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/models/zhipuai_model.py +0 -0
  246. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/personas/__init__.py +0 -0
  247. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/personas/persona.py +0 -0
  248. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/personas/persona_hub.py +0 -0
  249. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/__init__.py +0 -0
  250. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/ai_society.py +0 -0
  251. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/base.py +0 -0
  252. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/code.py +0 -0
  253. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/evaluation.py +0 -0
  254. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/generate_text_embedding_data.py +0 -0
  255. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/image_craft.py +0 -0
  256. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/misalignment.py +0 -0
  257. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/multi_condition_image_craft.py +0 -0
  258. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/object_recognition.py +0 -0
  259. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/persona_hub.py +0 -0
  260. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/prompt_templates.py +0 -0
  261. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/role_description_prompt_template.py +0 -0
  262. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/solution_extraction.py +0 -0
  263. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/task_prompt_template.py +0 -0
  264. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/translation.py +0 -0
  265. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/prompts/video_description_prompt.py +0 -0
  266. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/py.typed +0 -0
  267. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/responses/__init__.py +0 -0
  268. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/responses/agent_responses.py +0 -0
  269. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/retrievers/__init__.py +0 -0
  270. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/retrievers/auto_retriever.py +0 -0
  271. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/retrievers/base.py +0 -0
  272. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/retrievers/bm25_retriever.py +0 -0
  273. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/retrievers/cohere_rerank_retriever.py +0 -0
  274. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/retrievers/hybrid_retrival.py +0 -0
  275. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/retrievers/vector_retriever.py +0 -0
  276. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/runtimes/__init__.py +0 -0
  277. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/runtimes/api.py +0 -0
  278. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/runtimes/base.py +0 -0
  279. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/runtimes/configs.py +0 -0
  280. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/runtimes/daytona_runtime.py +0 -0
  281. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/runtimes/docker_runtime.py +0 -0
  282. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/runtimes/llm_guard_runtime.py +0 -0
  283. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/runtimes/remote_http_runtime.py +0 -0
  284. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/runtimes/ubuntu_docker_runtime.py +0 -0
  285. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/runtimes/utils/__init__.py +0 -0
  286. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/runtimes/utils/function_risk_toolkit.py +0 -0
  287. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/runtimes/utils/ignore_risk_toolkit.py +0 -0
  288. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/schemas/__init__.py +0 -0
  289. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/schemas/base.py +0 -0
  290. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/schemas/openai_converter.py +0 -0
  291. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/schemas/outlines_converter.py +0 -0
  292. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/societies/__init__.py +0 -0
  293. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/societies/babyagi_playing.py +0 -0
  294. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/societies/role_playing.py +0 -0
  295. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/societies/workforce/__init__.py +0 -0
  296. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/societies/workforce/base.py +0 -0
  297. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/societies/workforce/prompts.py +0 -0
  298. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/societies/workforce/task_channel.py +0 -0
  299. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/societies/workforce/worker.py +0 -0
  300. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/graph_storages/__init__.py +0 -0
  301. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/graph_storages/base.py +0 -0
  302. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/graph_storages/graph_element.py +0 -0
  303. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/graph_storages/nebula_graph.py +0 -0
  304. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/graph_storages/neo4j_graph.py +0 -0
  305. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/key_value_storages/__init__.py +0 -0
  306. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/key_value_storages/base.py +0 -0
  307. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/key_value_storages/in_memory.py +0 -0
  308. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/key_value_storages/json.py +0 -0
  309. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/key_value_storages/mem0_cloud.py +0 -0
  310. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/key_value_storages/redis.py +0 -0
  311. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/object_storages/__init__.py +0 -0
  312. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/object_storages/amazon_s3.py +0 -0
  313. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/object_storages/azure_blob.py +0 -0
  314. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/object_storages/base.py +0 -0
  315. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/object_storages/google_cloud.py +0 -0
  316. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/vectordb_storages/base.py +0 -0
  317. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/vectordb_storages/faiss.py +0 -0
  318. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/vectordb_storages/milvus.py +0 -0
  319. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/vectordb_storages/oceanbase.py +0 -0
  320. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/vectordb_storages/qdrant.py +0 -0
  321. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/storages/vectordb_storages/tidb.py +0 -0
  322. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/tasks/__init__.py +0 -0
  323. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/tasks/task_prompt.py +0 -0
  324. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/terminators/__init__.py +0 -0
  325. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/terminators/base.py +0 -0
  326. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/terminators/response_terminator.py +0 -0
  327. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/terminators/token_limit_terminator.py +0 -0
  328. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/__init__.py +0 -0
  329. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/aci_toolkit.py +0 -0
  330. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/arxiv_toolkit.py +0 -0
  331. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/ask_news_toolkit.py +0 -0
  332. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/audio_analysis_toolkit.py +0 -0
  333. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/base.py +0 -0
  334. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/bohrium_toolkit.py +0 -0
  335. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/browser_toolkit_commons.py +0 -0
  336. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/dalle_toolkit.py +0 -0
  337. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/dappier_toolkit.py +0 -0
  338. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/data_commons_toolkit.py +0 -0
  339. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/excel_toolkit.py +0 -0
  340. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/file_write_toolkit.py +0 -0
  341. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/github_toolkit.py +0 -0
  342. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/google_calendar_toolkit.py +0 -0
  343. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/google_maps_toolkit.py +0 -0
  344. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/google_scholar_toolkit.py +0 -0
  345. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/human_toolkit.py +0 -0
  346. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/image_analysis_toolkit.py +0 -0
  347. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/jina_reranker_toolkit.py +0 -0
  348. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/klavis_toolkit.py +0 -0
  349. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/linkedin_toolkit.py +0 -0
  350. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/math_toolkit.py +0 -0
  351. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/memory_toolkit.py +0 -0
  352. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/meshy_toolkit.py +0 -0
  353. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/mineru_toolkit.py +0 -0
  354. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/networkx_toolkit.py +0 -0
  355. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/notion_toolkit.py +0 -0
  356. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/biztoc/__init__.py +0 -0
  357. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/biztoc/ai-plugin.json +0 -0
  358. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/biztoc/openapi.yaml +0 -0
  359. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/coursera/__init__.py +0 -0
  360. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/coursera/openapi.yaml +0 -0
  361. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/create_qr_code/__init__.py +0 -0
  362. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/create_qr_code/openapi.yaml +0 -0
  363. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/klarna/__init__.py +0 -0
  364. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/klarna/openapi.yaml +0 -0
  365. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/nasa_apod/__init__.py +0 -0
  366. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/nasa_apod/openapi.yaml +0 -0
  367. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/outschool/__init__.py +0 -0
  368. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/outschool/ai-plugin.json +0 -0
  369. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/outschool/openapi.yaml +0 -0
  370. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/outschool/paths/__init__.py +0 -0
  371. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/outschool/paths/get_classes.py +0 -0
  372. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +0 -0
  373. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/security_config.py +0 -0
  374. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/speak/__init__.py +0 -0
  375. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/speak/openapi.yaml +0 -0
  376. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/web_scraper/__init__.py +0 -0
  377. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +0 -0
  378. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/web_scraper/openapi.yaml +0 -0
  379. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +0 -0
  380. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +0 -0
  381. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/open_api_toolkit.py +0 -0
  382. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/openai_agent_toolkit.py +0 -0
  383. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/openbb_toolkit.py +0 -0
  384. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/page_script.js +0 -0
  385. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/pptx_toolkit.py +0 -0
  386. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/pubmed_toolkit.py +0 -0
  387. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/pulse_mcp_search_toolkit.py +0 -0
  388. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/pyautogui_toolkit.py +0 -0
  389. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/reddit_toolkit.py +0 -0
  390. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/retrieval_toolkit.py +0 -0
  391. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/search_toolkit.py +0 -0
  392. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/searxng_toolkit.py +0 -0
  393. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/semantic_scholar_toolkit.py +0 -0
  394. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/slack_toolkit.py +0 -0
  395. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/stripe_toolkit.py +0 -0
  396. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/sympy_toolkit.py +0 -0
  397. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/terminal_toolkit.py +0 -0
  398. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/thinking_toolkit.py +0 -0
  399. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/twitter_toolkit.py +0 -0
  400. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/video_analysis_toolkit.py +0 -0
  401. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/video_download_toolkit.py +0 -0
  402. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/weather_toolkit.py +0 -0
  403. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/whatsapp_toolkit.py +0 -0
  404. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/wolfram_alpha_toolkit.py +0 -0
  405. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/toolkits/zapier_toolkit.py +0 -0
  406. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/types/__init__.py +0 -0
  407. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/types/agents/__init__.py +0 -0
  408. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/types/agents/tool_calling_record.py +0 -0
  409. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/types/mcp_registries.py +0 -0
  410. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/types/openai_types.py +0 -0
  411. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/async_func.py +0 -0
  412. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/chunker/__init__.py +0 -0
  413. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/chunker/base.py +0 -0
  414. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/chunker/code_chunker.py +0 -0
  415. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/chunker/uio_chunker.py +0 -0
  416. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/commons.py +0 -0
  417. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/constants.py +0 -0
  418. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/deduplication.py +0 -0
  419. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/filename.py +0 -0
  420. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/mcp.py +0 -0
  421. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/response_format.py +0 -0
  422. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/utils/token_counting.py +0 -0
  423. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/verifiers/__init__.py +0 -0
  424. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/verifiers/base.py +0 -0
  425. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/verifiers/math_verifier.py +0 -0
  426. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/verifiers/models.py +0 -0
  427. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/verifiers/physics_verifier.py +0 -0
  428. {camel_ai-0.2.62 → camel_ai-0.2.65}/camel/verifiers/python_verifier.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: camel-ai
3
- Version: 0.2.62
3
+ Version: 0.2.65
4
4
  Summary: Communicative Agents for AI Society Study
5
5
  Project-URL: Homepage, https://www.camel-ai.org/
6
6
  Project-URL: Repository, https://github.com/camel-ai/camel
@@ -21,7 +21,6 @@ Requires-Dist: psutil<6,>=5.9.8
21
21
  Requires-Dist: pydantic>=2.10.6
22
22
  Requires-Dist: tiktoken<0.8,>=0.7.0
23
23
  Provides-Extra: all
24
- Requires-Dist: accelerate<0.27,>=0.26.0; extra == 'all'
25
24
  Requires-Dist: aci-sdk>=1.0.0b1; extra == 'all'
26
25
  Requires-Dist: agentops<0.4,>=0.3.21; extra == 'all'
27
26
  Requires-Dist: aiosqlite<0.21,>=0.20.0; extra == 'all'
@@ -53,6 +52,7 @@ Requires-Dist: fastapi>=0.115.11; extra == 'all'
53
52
  Requires-Dist: ffmpeg-python<0.3,>=0.2.0; extra == 'all'
54
53
  Requires-Dist: firecrawl-py<2,>=1.0.0; extra == 'all'
55
54
  Requires-Dist: fish-audio-sdk<2025,>=2024.12.5; extra == 'all'
55
+ Requires-Dist: flask>=2.0; extra == 'all'
56
56
  Requires-Dist: fpdf>=1.7.2; extra == 'all'
57
57
  Requires-Dist: google-api-python-client==2.166.0; extra == 'all'
58
58
  Requires-Dist: google-auth-httplib2==0.2.0; extra == 'all'
@@ -66,6 +66,7 @@ Requires-Dist: ibm-watsonx-ai>=1.3.11; extra == 'all'
66
66
  Requires-Dist: imageio[pyav]<3,>=2.34.2; extra == 'all'
67
67
  Requires-Dist: ipykernel<7,>=6.0.0; extra == 'all'
68
68
  Requires-Dist: jupyter-client<9,>=8.6.2; extra == 'all'
69
+ Requires-Dist: langfuse>=2.60.5; extra == 'all'
69
70
  Requires-Dist: linkup-sdk<0.3,>=0.2.1; extra == 'all'
70
71
  Requires-Dist: litellm<2,>=1.38.1; extra == 'all'
71
72
  Requires-Dist: markitdown==0.1.1; extra == 'all'
@@ -82,9 +83,7 @@ Requires-Dist: newspaper3k<0.3,>=0.2.8; extra == 'all'
82
83
  Requires-Dist: notion-client<3,>=2.2.1; extra == 'all'
83
84
  Requires-Dist: numpy<=2.2,>=1.2; extra == 'all'
84
85
  Requires-Dist: openapi-spec-validator<0.8,>=0.7.1; extra == 'all'
85
- Requires-Dist: opencv-python<5,>=4; extra == 'all'
86
86
  Requires-Dist: openpyxl>=3.1.5; extra == 'all'
87
- Requires-Dist: outlines<0.2,>=0.1.7; extra == 'all'
88
87
  Requires-Dist: pandas<2,>=1.5.3; extra == 'all'
89
88
  Requires-Dist: pandasai<3,>=2.3.0; extra == 'all'
90
89
  Requires-Dist: playwright>=1.50.0; extra == 'all'
@@ -114,7 +113,6 @@ Requires-Dist: rouge<2,>=1.0.1; extra == 'all'
114
113
  Requires-Dist: scenedetect>=0.6.5.2; extra == 'all'
115
114
  Requires-Dist: scholarly[tor]==1.7.11; extra == 'all'
116
115
  Requires-Dist: scrapegraph-py<2,>=1.12.0; extra == 'all'
117
- Requires-Dist: sentence-transformers<4,>=3.0.1; extra == 'all'
118
116
  Requires-Dist: sentencepiece<0.3,>=0.2; extra == 'all'
119
117
  Requires-Dist: slack-bolt<2,>=1.20.1; extra == 'all'
120
118
  Requires-Dist: slack-sdk<4,>=3.27.2; extra == 'all'
@@ -124,7 +122,6 @@ Requires-Dist: sympy<2,>=1.13.3; extra == 'all'
124
122
  Requires-Dist: tabulate>=0.9.0; extra == 'all'
125
123
  Requires-Dist: tavily-python<0.6,>=0.5.0; extra == 'all'
126
124
  Requires-Dist: textblob<0.18,>=0.17.1; extra == 'all'
127
- Requires-Dist: torch; extra == 'all'
128
125
  Requires-Dist: transformers<5,>=4; extra == 'all'
129
126
  Requires-Dist: tree-sitter-python<0.24,>=0.23.6; extra == 'all'
130
127
  Requires-Dist: tree-sitter<0.24,>=0.23.2; extra == 'all'
@@ -136,6 +133,7 @@ Requires-Dist: types-requests<3,>=2.31.0; extra == 'all'
136
133
  Requires-Dist: types-setuptools<70,>=69.2.0; extra == 'all'
137
134
  Requires-Dist: types-tqdm<5,>=4.66.0; extra == 'all'
138
135
  Requires-Dist: unstructured==0.16.20; extra == 'all'
136
+ Requires-Dist: weaviate-client>=4.15.0; extra == 'all'
139
137
  Requires-Dist: wikipedia<2,>=1; extra == 'all'
140
138
  Requires-Dist: wolframalpha<6,>=5.0.0; extra == 'all'
141
139
  Requires-Dist: xls2xlsx>=0.2.0; extra == 'all'
@@ -160,6 +158,7 @@ Requires-Dist: rouge<2,>=1.0.1; extra == 'data-tools'
160
158
  Requires-Dist: stripe<12,>=11.3.0; extra == 'data-tools'
161
159
  Requires-Dist: textblob<0.18,>=0.17.1; extra == 'data-tools'
162
160
  Provides-Extra: dev
161
+ Requires-Dist: flask>=2.0; extra == 'dev'
163
162
  Requires-Dist: gradio<4,>=3; extra == 'dev'
164
163
  Requires-Dist: mock<6,>=5; extra == 'dev'
165
164
  Requires-Dist: mypy<2,>=1.5.1; extra == 'dev'
@@ -184,6 +183,7 @@ Requires-Dist: docker<8,>=7.1.0; extra == 'dev-tools'
184
183
  Requires-Dist: e2b-code-interpreter<2,>=1.0.3; extra == 'dev-tools'
185
184
  Requires-Dist: ipykernel<7,>=6.0.0; extra == 'dev-tools'
186
185
  Requires-Dist: jupyter-client<9,>=8.6.2; extra == 'dev-tools'
186
+ Requires-Dist: langfuse>=2.60.5; extra == 'dev-tools'
187
187
  Requires-Dist: mcp>=1.3.0; extra == 'dev-tools'
188
188
  Requires-Dist: tree-sitter-python<0.24,>=0.23.6; extra == 'dev-tools'
189
189
  Requires-Dist: tree-sitter<0.24,>=0.23.2; extra == 'dev-tools'
@@ -215,13 +215,11 @@ Requires-Dist: tabulate>=0.9.0; extra == 'document-tools'
215
215
  Requires-Dist: unstructured==0.16.20; extra == 'document-tools'
216
216
  Requires-Dist: xls2xlsx>=0.2.0; extra == 'document-tools'
217
217
  Provides-Extra: huggingface
218
- Requires-Dist: accelerate<0.27,>=0.26.0; extra == 'huggingface'
219
218
  Requires-Dist: datasets<4,>=3; extra == 'huggingface'
220
219
  Requires-Dist: diffusers<0.26,>=0.25.0; extra == 'huggingface'
221
- Requires-Dist: opencv-python<5,>=4; extra == 'huggingface'
220
+ Requires-Dist: huggingface-hub; extra == 'huggingface'
222
221
  Requires-Dist: sentencepiece<0.3,>=0.2; extra == 'huggingface'
223
222
  Requires-Dist: soundfile<0.14,>=0.13; extra == 'huggingface'
224
- Requires-Dist: torch; extra == 'huggingface'
225
223
  Requires-Dist: transformers<5,>=4; extra == 'huggingface'
226
224
  Provides-Extra: media-tools
227
225
  Requires-Dist: ffmpeg-python<0.3,>=0.2.0; extra == 'media-tools'
@@ -258,9 +256,7 @@ Requires-Dist: mcp-simple-arxiv==0.2.2; extra == 'owl'
258
256
  Requires-Dist: newspaper3k<0.3,>=0.2.8; extra == 'owl'
259
257
  Requires-Dist: numpy<=2.2,>=1.2; extra == 'owl'
260
258
  Requires-Dist: openapi-spec-validator<0.8,>=0.7.1; extra == 'owl'
261
- Requires-Dist: opencv-python<5,>=4; extra == 'owl'
262
259
  Requires-Dist: openpyxl>=3.1.5; extra == 'owl'
263
- Requires-Dist: outlines<0.2,>=0.1.7; extra == 'owl'
264
260
  Requires-Dist: pandas<2,>=1.5.3; extra == 'owl'
265
261
  Requires-Dist: pandasai<3,>=2.3.0; extra == 'owl'
266
262
  Requires-Dist: playwright>=1.50.0; extra == 'owl'
@@ -301,8 +297,8 @@ Requires-Dist: pyobvector>=0.1.18; extra == 'rag'
301
297
  Requires-Dist: pytidb-experimental==0.0.1.dev4; extra == 'rag'
302
298
  Requires-Dist: qdrant-client<2,>=1.9.0; extra == 'rag'
303
299
  Requires-Dist: rank-bm25<0.3,>=0.2.2; extra == 'rag'
304
- Requires-Dist: sentence-transformers<4,>=3.0.1; extra == 'rag'
305
300
  Requires-Dist: unstructured==0.16.20; extra == 'rag'
301
+ Requires-Dist: weaviate-client>=4.15.0; extra == 'rag'
306
302
  Provides-Extra: research-tools
307
303
  Requires-Dist: arxiv2text<0.2,>=0.1.14; extra == 'research-tools'
308
304
  Requires-Dist: arxiv<3,>=2.1.3; extra == 'research-tools'
@@ -320,6 +316,7 @@ Requires-Dist: pyobvector>=0.1.18; extra == 'storage'
320
316
  Requires-Dist: pytidb-experimental==0.0.1.dev4; extra == 'storage'
321
317
  Requires-Dist: qdrant-client<2,>=1.9.0; extra == 'storage'
322
318
  Requires-Dist: redis<6,>=5.0.6; extra == 'storage'
319
+ Requires-Dist: weaviate-client>=4.15.0; extra == 'storage'
323
320
  Provides-Extra: test
324
321
  Requires-Dist: mock<6,>=5; extra == 'test'
325
322
  Requires-Dist: pytest-asyncio<0.24,>=0.23.0; extra == 'test'
@@ -14,7 +14,7 @@
14
14
 
15
15
  from camel.logger import disable_logging, enable_logging, set_log_level
16
16
 
17
- __version__ = '0.2.62'
17
+ __version__ = '0.2.65'
18
18
 
19
19
  __all__ = [
20
20
  '__version__',
@@ -19,7 +19,6 @@ import textwrap
19
19
  import threading
20
20
  import uuid
21
21
  from collections import defaultdict
22
- from datetime import datetime
23
22
  from pathlib import Path
24
23
  from typing import (
25
24
  TYPE_CHECKING,
@@ -79,6 +78,7 @@ from camel.utils import (
79
78
  get_model_encoding,
80
79
  model_from_json_schema,
81
80
  )
81
+ from camel.utils.commons import dependencies_required
82
82
 
83
83
  if TYPE_CHECKING:
84
84
  from camel.terminators import ResponseTerminator
@@ -96,6 +96,15 @@ try:
96
96
  except (ImportError, AttributeError):
97
97
  from camel.utils import track_agent
98
98
 
99
+ # Langfuse decorator setting
100
+ if os.environ.get("LANGFUSE_ENABLED", "False").lower() == "true":
101
+ try:
102
+ from langfuse.decorators import observe
103
+ except ImportError:
104
+ from camel.utils import observe
105
+ else:
106
+ from camel.utils import observe
107
+
99
108
 
100
109
  SIMPLE_FORMAT_PROMPT = TextPrompt(
101
110
  textwrap.dedent(
@@ -151,8 +160,10 @@ class ChatAgent(BaseAgent):
151
160
  (default: :obj:`None`)
152
161
  scheduling_strategy (str): name of function that defines how to select
153
162
  the next model in ModelManager. (default: :str:`round_robin`)
154
- single_iteration (bool): Whether to let the agent perform only one
155
- model calling at each step. (default: :obj:`False`)
163
+ max_iteration (Optional[int], optional): Maximum number of model
164
+ calling iterations allowed per step. If `None` (default), there's
165
+ no explicit limit. If `1`, it performs a single model call. If `N
166
+ > 1`, it allows up to N model calls. (default: :obj:`None`)
156
167
  agent_id (str, optional): The ID of the agent. If not provided, a
157
168
  random UUID will be generated. (default: :obj:`None`)
158
169
  stop_event (Optional[threading.Event], optional): Event to signal
@@ -188,7 +199,7 @@ class ChatAgent(BaseAgent):
188
199
  ] = None,
189
200
  response_terminators: Optional[List[ResponseTerminator]] = None,
190
201
  scheduling_strategy: str = "round_robin",
191
- single_iteration: bool = False,
202
+ max_iteration: Optional[int] = None,
192
203
  agent_id: Optional[str] = None,
193
204
  stop_event: Optional[threading.Event] = None,
194
205
  ) -> None:
@@ -204,7 +215,7 @@ class ChatAgent(BaseAgent):
204
215
  self.model_type = self.model_backend.model_type
205
216
 
206
217
  # Assign unique ID
207
- self.agent_id = agent_id if agent_id else str(uuid.uuid4())[:6]
218
+ self.agent_id = agent_id if agent_id else str(uuid.uuid4())
208
219
 
209
220
  # Set up memory
210
221
  context_creator = ScoreBasedContextCreator(
@@ -263,7 +274,7 @@ class ChatAgent(BaseAgent):
263
274
  # Set up other properties
264
275
  self.terminated = False
265
276
  self.response_terminators = response_terminators or []
266
- self.single_iteration = single_iteration
277
+ self.max_iteration = max_iteration
267
278
  self.stop_event = stop_event
268
279
 
269
280
  def reset(self):
@@ -509,7 +520,7 @@ class ChatAgent(BaseAgent):
509
520
  memory record. If None, current timestamp will be used.
510
521
  (default: :obj:`None`)
511
522
  """
512
- from datetime import timezone
523
+ import time
513
524
 
514
525
  self.memory.write_record(
515
526
  MemoryRecord(
@@ -517,7 +528,7 @@ class ChatAgent(BaseAgent):
517
528
  role_at_backend=role,
518
529
  timestamp=timestamp
519
530
  if timestamp is not None
520
- else datetime.now(timezone.utc).timestamp(),
531
+ else time.time_ns() / 1_000_000_000, # Nanosecond precision
521
532
  agent_id=self.agent_id,
522
533
  )
523
534
  )
@@ -731,6 +742,7 @@ class ChatAgent(BaseAgent):
731
742
  message.content = response.output_messages[0].content
732
743
  self._try_format_message(message, response_format)
733
744
 
745
+ @observe()
734
746
  def step(
735
747
  self,
736
748
  input_message: Union[BaseMessage, str],
@@ -753,6 +765,14 @@ class ChatAgent(BaseAgent):
753
765
  flag, and session information.
754
766
  """
755
767
 
768
+ # Set Langfuse session_id using agent_id for trace grouping
769
+ try:
770
+ from camel.utils.langfuse import set_current_agent_session_id
771
+
772
+ set_current_agent_session_id(self.agent_id)
773
+ except ImportError:
774
+ pass # Langfuse not available
775
+
756
776
  # Convert input message to BaseMessage if necessary
757
777
  if isinstance(input_message, str):
758
778
  input_message = BaseMessage.make_user_message(
@@ -771,6 +791,7 @@ class ChatAgent(BaseAgent):
771
791
 
772
792
  # Initialize token usage tracker
773
793
  step_token_usage = self._create_token_usage_tracker()
794
+ iteration_count = 0
774
795
 
775
796
  while True:
776
797
  try:
@@ -787,6 +808,7 @@ class ChatAgent(BaseAgent):
787
808
  response_format,
788
809
  self._get_full_tool_schemas(),
789
810
  )
811
+ iteration_count += 1
790
812
 
791
813
  # Accumulate API token usage
792
814
  self._update_token_usage_tracker(
@@ -821,7 +843,10 @@ class ChatAgent(BaseAgent):
821
843
  if external_tool_call_requests:
822
844
  break
823
845
 
824
- if self.single_iteration:
846
+ if (
847
+ self.max_iteration is not None
848
+ and iteration_count >= self.max_iteration
849
+ ):
825
850
  break
826
851
 
827
852
  # If we're still here, continue the loop
@@ -847,6 +872,7 @@ class ChatAgent(BaseAgent):
847
872
  openai_messages, _ = self.memory.get_context()
848
873
  return openai_messages
849
874
 
875
+ @observe()
850
876
  async def astep(
851
877
  self,
852
878
  input_message: Union[BaseMessage, str],
@@ -873,6 +899,13 @@ class ChatAgent(BaseAgent):
873
899
  a boolean indicating whether the chat session has terminated,
874
900
  and information about the chat session.
875
901
  """
902
+ try:
903
+ from camel.utils.langfuse import set_current_agent_session_id
904
+
905
+ set_current_agent_session_id(self.agent_id)
906
+ except ImportError:
907
+ pass # Langfuse not available
908
+
876
909
  if isinstance(input_message, str):
877
910
  input_message = BaseMessage.make_user_message(
878
911
  role_name="User", content=input_message
@@ -888,6 +921,7 @@ class ChatAgent(BaseAgent):
888
921
 
889
922
  # Initialize token usage tracker
890
923
  step_token_usage = self._create_token_usage_tracker()
924
+ iteration_count = 0
891
925
  while True:
892
926
  try:
893
927
  openai_messages, num_tokens = self.memory.get_context()
@@ -903,6 +937,7 @@ class ChatAgent(BaseAgent):
903
937
  response_format,
904
938
  self._get_full_tool_schemas(),
905
939
  )
940
+ iteration_count += 1
906
941
 
907
942
  # Terminate Agent if stop_event is set
908
943
  if self.stop_event and self.stop_event.is_set():
@@ -933,7 +968,10 @@ class ChatAgent(BaseAgent):
933
968
  if external_tool_call_requests:
934
969
  break
935
970
 
936
- if self.single_iteration:
971
+ if (
972
+ self.max_iteration is not None
973
+ and iteration_count >= self.max_iteration
974
+ ):
937
975
  break
938
976
 
939
977
  # If we're still here, continue the loop
@@ -1331,6 +1369,13 @@ class ChatAgent(BaseAgent):
1331
1369
  """
1332
1370
  output_messages: List[BaseMessage] = []
1333
1371
  for choice in response.choices:
1372
+ # Skip messages with no meaningful content
1373
+ if (
1374
+ choice.message.content is None
1375
+ or choice.message.content.strip() == ""
1376
+ ) and not choice.message.tool_calls:
1377
+ continue
1378
+
1334
1379
  meta_dict = {}
1335
1380
  if logprobs_info := handle_logprobs(choice):
1336
1381
  meta_dict["logprobs_info"] = logprobs_info
@@ -1560,8 +1605,32 @@ class ChatAgent(BaseAgent):
1560
1605
  args = tool_call_request.args
1561
1606
  tool_call_id = tool_call_request.tool_call_id
1562
1607
  tool = self._internal_tools[func_name]
1608
+ import asyncio
1609
+
1563
1610
  try:
1564
- result = await tool.async_call(**args)
1611
+ # Try different invocation paths in order of preference
1612
+ if hasattr(tool, 'func') and hasattr(tool.func, 'async_call'):
1613
+ # Case: FunctionTool wrapping an MCP tool
1614
+ result = await tool.func.async_call(**args)
1615
+
1616
+ elif hasattr(tool, 'async_call') and callable(tool.async_call):
1617
+ # Case: tool itself has async_call
1618
+ result = await tool.async_call(**args)
1619
+
1620
+ elif hasattr(tool, 'func') and asyncio.iscoroutinefunction(
1621
+ tool.func
1622
+ ):
1623
+ # Case: tool wraps a direct async function
1624
+ result = await tool.func(**args)
1625
+
1626
+ elif asyncio.iscoroutinefunction(tool):
1627
+ # Case: tool is itself a coroutine function
1628
+ result = await tool(**args)
1629
+
1630
+ else:
1631
+ # Fallback: synchronous call
1632
+ result = tool(**args)
1633
+
1565
1634
  except Exception as e:
1566
1635
  # Capture the error message to prevent framework crash
1567
1636
  error_msg = f"Error executing async tool '{func_name}': {e!s}"
@@ -1599,17 +1668,24 @@ class ChatAgent(BaseAgent):
1599
1668
  tool_call_id=tool_call_id,
1600
1669
  )
1601
1670
 
1602
- # Use slightly different timestamps to ensure correct ordering
1671
+ # Use precise timestamps to ensure correct ordering
1603
1672
  # This ensures the assistant message (tool call) always appears before
1604
1673
  # the function message (tool result) in the conversation context
1605
- current_time = datetime.now().timestamp()
1674
+ # Use time.time_ns() for nanosecond precision to avoid collisions
1675
+ import time
1676
+
1677
+ current_time_ns = time.time_ns()
1678
+ base_timestamp = current_time_ns / 1_000_000_000 # Convert to seconds
1679
+
1606
1680
  self.update_memory(
1607
- assist_msg, OpenAIBackendRole.ASSISTANT, timestamp=current_time
1681
+ assist_msg, OpenAIBackendRole.ASSISTANT, timestamp=base_timestamp
1608
1682
  )
1683
+
1684
+ # Add minimal increment to ensure function message comes after
1609
1685
  self.update_memory(
1610
1686
  func_msg,
1611
1687
  OpenAIBackendRole.FUNCTION,
1612
- timestamp=current_time + 0.001,
1688
+ timestamp=base_timestamp + 1e-6,
1613
1689
  )
1614
1690
 
1615
1691
  # Record information about this tool call
@@ -1690,7 +1766,7 @@ class ChatAgent(BaseAgent):
1690
1766
  ],
1691
1767
  response_terminators=self.response_terminators,
1692
1768
  scheduling_strategy=self.model_backend.scheduling_strategy.__name__,
1693
- single_iteration=self.single_iteration,
1769
+ max_iteration=self.max_iteration,
1694
1770
  stop_event=self.stop_event,
1695
1771
  )
1696
1772
 
@@ -1714,6 +1790,7 @@ class ChatAgent(BaseAgent):
1714
1790
  f"ChatAgent({self.role_name}, {self.role_type}, {self.model_type})"
1715
1791
  )
1716
1792
 
1793
+ @dependencies_required("mcp")
1717
1794
  def to_mcp(
1718
1795
  self,
1719
1796
  name: str = "CAMEL-ChatAgent",
@@ -1740,13 +1817,7 @@ class ChatAgent(BaseAgent):
1740
1817
  Returns:
1741
1818
  FastMCP: An MCP server instance that can be run.
1742
1819
  """
1743
- try:
1744
- from mcp.server.fastmcp import FastMCP
1745
- except ImportError:
1746
- raise ImportError(
1747
- "The 'mcp' package is required to use the to_mcp method. "
1748
- "Install it with 'pip install mcp'."
1749
- )
1820
+ from mcp.server.fastmcp import FastMCP
1750
1821
 
1751
1822
  # Combine dependencies
1752
1823
  all_dependencies = ["camel-ai[all]"]
@@ -1837,7 +1908,7 @@ class ChatAgent(BaseAgent):
1837
1908
  "description": tool.get_function_description() or "",
1838
1909
  "parameters": [
1839
1910
  {"name": param_name, "type": str(param_type)}
1840
- for param_name, param_type in tool.get_parameters().items() # noqa: E501
1911
+ for param_name, param_type in tool.parameters.items()
1841
1912
  ],
1842
1913
  }
1843
1914
  return tool_info
@@ -125,6 +125,7 @@ class MCPAgent(ChatAgent):
125
125
  local_config_path: Optional[str] = None,
126
126
  tools: Optional[List[Union[FunctionTool, Callable]]] = None,
127
127
  function_calling_available: bool = True,
128
+ strict: bool = False,
128
129
  **kwargs,
129
130
  ):
130
131
  if model is None:
@@ -144,6 +145,7 @@ class MCPAgent(ChatAgent):
144
145
 
145
146
  self.local_config = local_config
146
147
  self.function_calling_available = function_calling_available
148
+ self.strict = strict
147
149
 
148
150
  if function_calling_available:
149
151
  sys_msg_content = "You are a helpful assistant, and you prefer "
@@ -177,7 +179,7 @@ class MCPAgent(ChatAgent):
177
179
  if self.local_config:
178
180
  config_dict.update(self.local_config)
179
181
 
180
- return MCPToolkit(config_dict=config_dict)
182
+ return MCPToolkit(config_dict=config_dict, strict=self.strict)
181
183
 
182
184
  def add_registry(self, registry_config: BaseMCPRegistryConfig) -> None:
183
185
  r"""Add a new registry configuration to the agent.
@@ -211,6 +213,7 @@ class MCPAgent(ChatAgent):
211
213
  ] = None,
212
214
  model: Optional[BaseModelBackend] = None,
213
215
  function_calling_available: bool = False,
216
+ strict: bool = False,
214
217
  **kwargs,
215
218
  ) -> "MCPAgent":
216
219
  r"""Create and connect an MCPAgent instance.
@@ -276,6 +279,7 @@ class MCPAgent(ChatAgent):
276
279
  registry_configs=final_registry_configs,
277
280
  model=model,
278
281
  function_calling_available=function_calling_available,
282
+ strict=strict,
279
283
  **kwargs,
280
284
  )
281
285
 
@@ -0,0 +1,96 @@
1
+ # Mock Website Benchmarks for Web Agent Testing
2
+
3
+ This project provides a framework for testing web agents against various mock websites. It features a central dispatcher (`mock_web.py`) that manages different test environments, each simulating a specific type of website (e.g., an e-commerce site). The initial example project is an Amazon-like shopping website.
4
+
5
+ ## Core Concepts
6
+
7
+ * **Dispatcher (`mock_web.py`):** The single entry point for running any benchmark. It handles:
8
+ * Downloading necessary web assets (HTML templates, CSS, JS) for a specific project from Hugging Face (https://huggingface.co/datasets/camel-ai/mock_websites).
9
+ * Reading the task configuration from `task.json`.
10
+ * Launching the project's dedicated Flask web server as a background process.
11
+ * Monitoring the server for task completion via API polling.
12
+ * Reporting the final results (success status, number of operations) and shutting down the server.
13
+ * **Projects (e.g., `shopping_mall/`):** Each project is a self-contained Flask application representing a unique website.
14
+ * **Task Configuration (`task.json`):** A central JSON file that defines the environment and the goal for the agent.
15
+
16
+ ## Example Project: `shopping_mall`
17
+
18
+ The included `shopping_mall` project simulates an e-commerce website with the following features:
19
+ * **Product Display:** View a list of products with images, descriptions, ratings, and prices.
20
+ * **Product Detail Pages:** Click on a product to see its dedicated detail page.
21
+ * **Shopping Cart:** Add products, view the cart, and manage its contents.
22
+ * **API-Driven:** The backend provides API endpoints for all state-changing actions.
23
+
24
+ ## Setup and Usage
25
+
26
+ 1. **Install Dependencies:**
27
+ ```bash
28
+ pip install -r requirements.txt
29
+ ```
30
+ This will install `Flask`, `huggingface-hub`, `requests`, and other necessary packages.
31
+
32
+ 2. **Configure the Task:**
33
+ Edit the `task.json` file to define the products available on the website and the agent's goal. The structure is as follows:
34
+ ```json
35
+ {
36
+ "products": [
37
+ {
38
+ "id": 1,
39
+ "name": "Gaming Laptop",
40
+ "price": 1200,
41
+ "image": "assets/img/products/laptop.jpg",
42
+ "category": "Electronics",
43
+ "rating": 4.5,
44
+ "description": "High-performance gaming laptop with latest specs."
45
+ }
46
+ ],
47
+ "ground_truth_cart": [
48
+ {
49
+ "id": 1,
50
+ "quantity": 1
51
+ }
52
+ ]
53
+ }
54
+ ```
55
+ * `products`: A list of all product objects available in the environment.
56
+ * `ground_truth_cart`: A list of items that defines the target state of the shopping cart for the task to be considered complete.
57
+
58
+ 3. **Running the Benchmark:**
59
+ Use the `mock_web.py` dispatcher to run a project.
60
+ ```bash
61
+ python mock_web.py --project shopping_mall
62
+ ```
63
+ * `--project`: Specifies which mock website project to run (default: `shopping_mall`).
64
+ * `--port`: Specifies the port to run the server on (default: `5001`).
65
+
66
+ The dispatcher will start the server and begin polling for task completion. You or your agent can then interact with the website at `http://127.0.0.1:5001/`. Once the conditions defined in `ground_truth_cart` are met, the dispatcher will automatically detect it, report the results, and shut down. You can also stop it early by pressing `Ctrl+C`.
67
+
68
+ ## Logging
69
+
70
+ * `dispatcher.log`: High-level log from the dispatcher, showing setup, status, and final results.
71
+ * `shopping_mall/app.log`: Detailed internal log from the Flask application for the `shopping_mall` project.
72
+
73
+ ## Project Structure
74
+
75
+ ```
76
+ .
77
+ ├── mock_web.py # Main dispatcher for running benchmarks
78
+ ├── task.json # Task configuration file
79
+ ├── requirements.txt # Python dependencies
80
+ ├── shopping_mall/ # Example project: shopping_mall
81
+ │ └── app.py # Flask application for this project
82
+ ├── dispatcher.log # (Generated at runtime)
83
+ └── README.md # This file
84
+ ```
85
+ The dispatcher will automatically download project-specific `templates` and `static` folders from Hugging Face Hub and place them inside the corresponding project directory at runtime.
86
+
87
+ ## TODO: Automated Question Generation Module
88
+
89
+ A planned future module for this project is the development of an automated question generation system. This system would analyze the current state of the web application environment (e.g., visible elements, available products, cart status) and generate relevant questions or tasks for a web agent to solve.
90
+
91
+ This could involve:
92
+ * Identifying interactable elements and their states.
93
+ * Understanding the current context (e.g., on product page, in cart).
94
+ * Formulating natural language questions or goal descriptions based on this context (e.g., "Find a product under $50 in the Electronics category and add it to the cart," or "What is the current subtotal of the cart after adding two units of item X?").
95
+
96
+