camel-ai 0.2.69a1__tar.gz → 0.2.69a3__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 (438) hide show
  1. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/PKG-INFO +5 -1
  2. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/__init__.py +1 -1
  3. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/chat_agent.py +27 -5
  4. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/workforce/single_agent_worker.py +11 -4
  5. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/workforce/workforce.py +7 -2
  6. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/function_tool.py +4 -3
  7. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/non_visual_browser_toolkit/browser_non_visual_toolkit.py +107 -79
  8. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/non_visual_browser_toolkit/nv_browser_session.py +28 -0
  9. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/non_visual_browser_toolkit/snapshot.py +58 -9
  10. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/video_analysis_toolkit.py +77 -3
  11. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/pyproject.toml +7 -2
  12. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/.gitignore +0 -0
  13. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/LICENSE +0 -0
  14. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/README.md +0 -0
  15. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/__init__.py +0 -0
  16. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/_types.py +0 -0
  17. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/_utils.py +0 -0
  18. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/base.py +0 -0
  19. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/critic_agent.py +0 -0
  20. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/deductive_reasoner_agent.py +0 -0
  21. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/embodied_agent.py +0 -0
  22. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/knowledge_graph_agent.py +0 -0
  23. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/mcp_agent.py +0 -0
  24. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/multi_hop_generator_agent.py +0 -0
  25. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/programmed_agent_instruction.py +0 -0
  26. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/repo_agent.py +0 -0
  27. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/role_assignment_agent.py +0 -0
  28. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/search_agent.py +0 -0
  29. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/task_agent.py +0 -0
  30. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/tool_agents/__init__.py +0 -0
  31. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/tool_agents/base.py +0 -0
  32. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/agents/tool_agents/hugging_face_tool_agent.py +0 -0
  33. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/__init__.py +0 -0
  34. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/apibank.py +0 -0
  35. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/apibench.py +0 -0
  36. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/base.py +0 -0
  37. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/browsecomp.py +0 -0
  38. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/gaia.py +0 -0
  39. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/mock_website/README.md +0 -0
  40. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/mock_website/mock_web.py +0 -0
  41. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/mock_website/requirements.txt +0 -0
  42. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/mock_website/shopping_mall/app.py +0 -0
  43. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/mock_website/task.json +0 -0
  44. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/nexus.py +0 -0
  45. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/benchmarks/ragbench.py +0 -0
  46. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/bots/__init__.py +0 -0
  47. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/bots/discord/__init__.py +0 -0
  48. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/bots/discord/discord_app.py +0 -0
  49. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/bots/discord/discord_installation.py +0 -0
  50. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/bots/discord/discord_store.py +0 -0
  51. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/bots/slack/__init__.py +0 -0
  52. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/bots/slack/models.py +0 -0
  53. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/bots/slack/slack_app.py +0 -0
  54. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/bots/telegram_bot.py +0 -0
  55. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/__init__.py +0 -0
  56. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/aiml_config.py +0 -0
  57. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/anthropic_config.py +0 -0
  58. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/base_config.py +0 -0
  59. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/bedrock_config.py +0 -0
  60. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/cohere_config.py +0 -0
  61. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/crynux_config.py +0 -0
  62. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/deepseek_config.py +0 -0
  63. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/gemini_config.py +0 -0
  64. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/groq_config.py +0 -0
  65. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/internlm_config.py +0 -0
  66. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/litellm_config.py +0 -0
  67. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/lmstudio_config.py +0 -0
  68. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/mistral_config.py +0 -0
  69. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/modelscope_config.py +0 -0
  70. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/moonshot_config.py +0 -0
  71. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/netmind_config.py +0 -0
  72. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/novita_config.py +0 -0
  73. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/nvidia_config.py +0 -0
  74. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/ollama_config.py +0 -0
  75. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/openai_config.py +0 -0
  76. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/openrouter_config.py +0 -0
  77. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/ppio_config.py +0 -0
  78. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/qianfan_config.py +0 -0
  79. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/qwen_config.py +0 -0
  80. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/reka_config.py +0 -0
  81. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/samba_config.py +0 -0
  82. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/sglang_config.py +0 -0
  83. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/siliconflow_config.py +0 -0
  84. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/togetherai_config.py +0 -0
  85. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/vllm_config.py +0 -0
  86. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/watsonx_config.py +0 -0
  87. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/yi_config.py +0 -0
  88. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/configs/zhipuai_config.py +0 -0
  89. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/data_collectors/__init__.py +0 -0
  90. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/data_collectors/alpaca_collector.py +0 -0
  91. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/data_collectors/base.py +0 -0
  92. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/data_collectors/sharegpt_collector.py +0 -0
  93. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/__init__.py +0 -0
  94. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/cot_datagen.py +0 -0
  95. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/evol_instruct/__init__.py +0 -0
  96. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/evol_instruct/evol_instruct.py +0 -0
  97. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/evol_instruct/scorer.py +0 -0
  98. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/evol_instruct/templates.py +0 -0
  99. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/self_improving_cot.py +0 -0
  100. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/self_instruct/__init__.py +0 -0
  101. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/self_instruct/filter/__init__.py +0 -0
  102. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/self_instruct/filter/filter_function.py +0 -0
  103. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/self_instruct/filter/filter_registry.py +0 -0
  104. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/self_instruct/filter/instruction_filter.py +0 -0
  105. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/self_instruct/self_instruct.py +0 -0
  106. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/self_instruct/templates.py +0 -0
  107. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/source2synth/__init__.py +0 -0
  108. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/source2synth/data_processor.py +0 -0
  109. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/source2synth/models.py +0 -0
  110. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datagen/source2synth/user_data_processor_config.py +0 -0
  111. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datahubs/__init__.py +0 -0
  112. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datahubs/base.py +0 -0
  113. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datahubs/huggingface.py +0 -0
  114. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datahubs/models.py +0 -0
  115. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datasets/__init__.py +0 -0
  116. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datasets/base_generator.py +0 -0
  117. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datasets/few_shot_generator.py +0 -0
  118. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datasets/models.py +0 -0
  119. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datasets/self_instruct_generator.py +0 -0
  120. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/datasets/static_dataset.py +0 -0
  121. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/embeddings/__init__.py +0 -0
  122. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/embeddings/azure_embedding.py +0 -0
  123. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/embeddings/base.py +0 -0
  124. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/embeddings/gemini_embedding.py +0 -0
  125. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/embeddings/jina_embedding.py +0 -0
  126. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/embeddings/mistral_embedding.py +0 -0
  127. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/embeddings/openai_compatible_embedding.py +0 -0
  128. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/embeddings/openai_embedding.py +0 -0
  129. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/embeddings/sentence_transformers_embeddings.py +0 -0
  130. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/embeddings/together_embedding.py +0 -0
  131. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/embeddings/vlm_embedding.py +0 -0
  132. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/environments/__init__.py +0 -0
  133. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/environments/models.py +0 -0
  134. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/environments/multi_step.py +0 -0
  135. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/environments/rlcards_env.py +0 -0
  136. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/environments/single_step.py +0 -0
  137. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/environments/tic_tac_toe.py +0 -0
  138. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/extractors/__init__.py +0 -0
  139. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/extractors/base.py +0 -0
  140. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/extractors/python_strategies.py +0 -0
  141. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/generators.py +0 -0
  142. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/human.py +0 -0
  143. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/interpreters/__init__.py +0 -0
  144. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/interpreters/base.py +0 -0
  145. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/interpreters/docker/Dockerfile +0 -0
  146. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/interpreters/docker_interpreter.py +0 -0
  147. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/interpreters/e2b_interpreter.py +0 -0
  148. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/interpreters/internal_python_interpreter.py +0 -0
  149. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/interpreters/interpreter_error.py +0 -0
  150. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/interpreters/ipython_interpreter.py +0 -0
  151. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/interpreters/subprocess_interpreter.py +0 -0
  152. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/__init__.py +0 -0
  153. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/apify_reader.py +0 -0
  154. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/base_io.py +0 -0
  155. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/chunkr_reader.py +0 -0
  156. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/crawl4ai_reader.py +0 -0
  157. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/firecrawl_reader.py +0 -0
  158. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/jina_url_reader.py +0 -0
  159. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/markitdown.py +0 -0
  160. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/mineru_extractor.py +0 -0
  161. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/mistral_reader.py +0 -0
  162. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/pandas_reader.py +0 -0
  163. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/scrapegraph_reader.py +0 -0
  164. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/loaders/unstructured_io.py +0 -0
  165. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/logger.py +0 -0
  166. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/memories/__init__.py +0 -0
  167. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/memories/agent_memories.py +0 -0
  168. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/memories/base.py +0 -0
  169. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/memories/blocks/__init__.py +0 -0
  170. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/memories/blocks/chat_history_block.py +0 -0
  171. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/memories/blocks/vectordb_block.py +0 -0
  172. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/memories/context_creators/__init__.py +0 -0
  173. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/memories/context_creators/score_based.py +0 -0
  174. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/memories/records.py +0 -0
  175. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/messages/__init__.py +0 -0
  176. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/messages/base.py +0 -0
  177. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/messages/conversion/__init__.py +0 -0
  178. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/messages/conversion/alpaca.py +0 -0
  179. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/messages/conversion/conversation_models.py +0 -0
  180. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/messages/conversion/sharegpt/__init__.py +0 -0
  181. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/messages/conversion/sharegpt/function_call_formatter.py +0 -0
  182. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/messages/conversion/sharegpt/hermes/__init__.py +0 -0
  183. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +0 -0
  184. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/messages/func_message.py +0 -0
  185. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/__init__.py +0 -0
  186. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/_utils.py +0 -0
  187. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/aiml_model.py +0 -0
  188. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/anthropic_model.py +0 -0
  189. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/aws_bedrock_model.py +0 -0
  190. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/azure_openai_model.py +0 -0
  191. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/base_audio_model.py +0 -0
  192. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/base_model.py +0 -0
  193. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/cohere_model.py +0 -0
  194. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/crynux_model.py +0 -0
  195. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/deepseek_model.py +0 -0
  196. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/fish_audio_model.py +0 -0
  197. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/gemini_model.py +0 -0
  198. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/groq_model.py +0 -0
  199. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/internlm_model.py +0 -0
  200. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/litellm_model.py +0 -0
  201. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/lmstudio_model.py +0 -0
  202. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/mistral_model.py +0 -0
  203. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/model_factory.py +0 -0
  204. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/model_manager.py +0 -0
  205. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/modelscope_model.py +0 -0
  206. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/moonshot_model.py +0 -0
  207. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/nemotron_model.py +0 -0
  208. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/netmind_model.py +0 -0
  209. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/novita_model.py +0 -0
  210. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/nvidia_model.py +0 -0
  211. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/ollama_model.py +0 -0
  212. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/openai_audio_models.py +0 -0
  213. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/openai_compatible_model.py +0 -0
  214. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/openai_model.py +0 -0
  215. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/openrouter_model.py +0 -0
  216. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/ppio_model.py +0 -0
  217. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/qianfan_model.py +0 -0
  218. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/qwen_model.py +0 -0
  219. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/reka_model.py +0 -0
  220. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/reward/__init__.py +0 -0
  221. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/reward/base_reward_model.py +0 -0
  222. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/reward/evaluator.py +0 -0
  223. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/reward/nemotron_model.py +0 -0
  224. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/reward/skywork_model.py +0 -0
  225. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/samba_model.py +0 -0
  226. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/sglang_model.py +0 -0
  227. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/siliconflow_model.py +0 -0
  228. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/stub_model.py +0 -0
  229. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/togetherai_model.py +0 -0
  230. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/vllm_model.py +0 -0
  231. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/volcano_model.py +0 -0
  232. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/watsonx_model.py +0 -0
  233. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/yi_model.py +0 -0
  234. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/models/zhipuai_model.py +0 -0
  235. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/personas/__init__.py +0 -0
  236. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/personas/persona.py +0 -0
  237. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/personas/persona_hub.py +0 -0
  238. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/__init__.py +0 -0
  239. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/ai_society.py +0 -0
  240. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/base.py +0 -0
  241. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/code.py +0 -0
  242. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/evaluation.py +0 -0
  243. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/generate_text_embedding_data.py +0 -0
  244. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/image_craft.py +0 -0
  245. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/misalignment.py +0 -0
  246. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/multi_condition_image_craft.py +0 -0
  247. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/object_recognition.py +0 -0
  248. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/persona_hub.py +0 -0
  249. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/prompt_templates.py +0 -0
  250. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/role_description_prompt_template.py +0 -0
  251. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/solution_extraction.py +0 -0
  252. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/task_prompt_template.py +0 -0
  253. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/translation.py +0 -0
  254. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/prompts/video_description_prompt.py +0 -0
  255. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/py.typed +0 -0
  256. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/responses/__init__.py +0 -0
  257. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/responses/agent_responses.py +0 -0
  258. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/retrievers/__init__.py +0 -0
  259. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/retrievers/auto_retriever.py +0 -0
  260. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/retrievers/base.py +0 -0
  261. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/retrievers/bm25_retriever.py +0 -0
  262. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/retrievers/cohere_rerank_retriever.py +0 -0
  263. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/retrievers/hybrid_retrival.py +0 -0
  264. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/retrievers/vector_retriever.py +0 -0
  265. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/runtimes/__init__.py +0 -0
  266. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/runtimes/api.py +0 -0
  267. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/runtimes/base.py +0 -0
  268. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/runtimes/configs.py +0 -0
  269. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/runtimes/daytona_runtime.py +0 -0
  270. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/runtimes/docker_runtime.py +0 -0
  271. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/runtimes/llm_guard_runtime.py +0 -0
  272. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/runtimes/remote_http_runtime.py +0 -0
  273. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/runtimes/ubuntu_docker_runtime.py +0 -0
  274. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/runtimes/utils/__init__.py +0 -0
  275. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/runtimes/utils/function_risk_toolkit.py +0 -0
  276. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/runtimes/utils/ignore_risk_toolkit.py +0 -0
  277. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/schemas/__init__.py +0 -0
  278. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/schemas/base.py +0 -0
  279. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/schemas/openai_converter.py +0 -0
  280. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/schemas/outlines_converter.py +0 -0
  281. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/__init__.py +0 -0
  282. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/babyagi_playing.py +0 -0
  283. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/role_playing.py +0 -0
  284. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/workforce/__init__.py +0 -0
  285. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/workforce/base.py +0 -0
  286. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/workforce/prompts.py +0 -0
  287. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/workforce/role_playing_worker.py +0 -0
  288. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/workforce/task_channel.py +0 -0
  289. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/workforce/utils.py +0 -0
  290. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/workforce/worker.py +0 -0
  291. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/societies/workforce/workforce_logger.py +0 -0
  292. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/__init__.py +0 -0
  293. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/graph_storages/__init__.py +0 -0
  294. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/graph_storages/base.py +0 -0
  295. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/graph_storages/graph_element.py +0 -0
  296. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/graph_storages/nebula_graph.py +0 -0
  297. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/graph_storages/neo4j_graph.py +0 -0
  298. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/key_value_storages/__init__.py +0 -0
  299. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/key_value_storages/base.py +0 -0
  300. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/key_value_storages/in_memory.py +0 -0
  301. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/key_value_storages/json.py +0 -0
  302. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/key_value_storages/mem0_cloud.py +0 -0
  303. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/key_value_storages/redis.py +0 -0
  304. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/object_storages/__init__.py +0 -0
  305. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/object_storages/amazon_s3.py +0 -0
  306. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/object_storages/azure_blob.py +0 -0
  307. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/object_storages/base.py +0 -0
  308. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/object_storages/google_cloud.py +0 -0
  309. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/vectordb_storages/__init__.py +0 -0
  310. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/vectordb_storages/base.py +0 -0
  311. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/vectordb_storages/faiss.py +0 -0
  312. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/vectordb_storages/milvus.py +0 -0
  313. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/vectordb_storages/oceanbase.py +0 -0
  314. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/vectordb_storages/qdrant.py +0 -0
  315. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/vectordb_storages/tidb.py +0 -0
  316. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/storages/vectordb_storages/weaviate.py +0 -0
  317. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/tasks/__init__.py +0 -0
  318. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/tasks/task.py +0 -0
  319. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/tasks/task_prompt.py +0 -0
  320. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/terminators/__init__.py +0 -0
  321. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/terminators/base.py +0 -0
  322. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/terminators/response_terminator.py +0 -0
  323. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/terminators/token_limit_terminator.py +0 -0
  324. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/__init__.py +0 -0
  325. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/aci_toolkit.py +0 -0
  326. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/arxiv_toolkit.py +0 -0
  327. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/ask_news_toolkit.py +0 -0
  328. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/async_browser_toolkit.py +0 -0
  329. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/audio_analysis_toolkit.py +0 -0
  330. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/base.py +0 -0
  331. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/bohrium_toolkit.py +0 -0
  332. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/browser_toolkit.py +0 -0
  333. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/browser_toolkit_commons.py +0 -0
  334. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/code_execution.py +0 -0
  335. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/dalle_toolkit.py +0 -0
  336. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/dappier_toolkit.py +0 -0
  337. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/data_commons_toolkit.py +0 -0
  338. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/excel_toolkit.py +0 -0
  339. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/file_write_toolkit.py +0 -0
  340. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/github_toolkit.py +0 -0
  341. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/google_calendar_toolkit.py +0 -0
  342. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/google_maps_toolkit.py +0 -0
  343. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/google_scholar_toolkit.py +0 -0
  344. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/human_toolkit.py +0 -0
  345. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/image_analysis_toolkit.py +0 -0
  346. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/jina_reranker_toolkit.py +0 -0
  347. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/klavis_toolkit.py +0 -0
  348. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/linkedin_toolkit.py +0 -0
  349. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/math_toolkit.py +0 -0
  350. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/mcp_toolkit.py +0 -0
  351. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/memory_toolkit.py +0 -0
  352. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/meshy_toolkit.py +0 -0
  353. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/mineru_toolkit.py +0 -0
  354. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/networkx_toolkit.py +0 -0
  355. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/non_visual_browser_toolkit/__init__.py +0 -0
  356. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/non_visual_browser_toolkit/actions.py +0 -0
  357. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/non_visual_browser_toolkit/agent.py +0 -0
  358. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/non_visual_browser_toolkit/snapshot.js +0 -0
  359. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/notion_toolkit.py +0 -0
  360. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/biztoc/__init__.py +0 -0
  361. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/biztoc/ai-plugin.json +0 -0
  362. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/biztoc/openapi.yaml +0 -0
  363. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/coursera/__init__.py +0 -0
  364. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/coursera/openapi.yaml +0 -0
  365. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/create_qr_code/__init__.py +0 -0
  366. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/create_qr_code/openapi.yaml +0 -0
  367. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/klarna/__init__.py +0 -0
  368. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/klarna/openapi.yaml +0 -0
  369. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/nasa_apod/__init__.py +0 -0
  370. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/nasa_apod/openapi.yaml +0 -0
  371. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/outschool/__init__.py +0 -0
  372. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/outschool/ai-plugin.json +0 -0
  373. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/outschool/openapi.yaml +0 -0
  374. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/outschool/paths/__init__.py +0 -0
  375. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/outschool/paths/get_classes.py +0 -0
  376. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +0 -0
  377. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/security_config.py +0 -0
  378. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/speak/__init__.py +0 -0
  379. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/speak/openapi.yaml +0 -0
  380. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/web_scraper/__init__.py +0 -0
  381. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +0 -0
  382. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/web_scraper/openapi.yaml +0 -0
  383. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +0 -0
  384. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +0 -0
  385. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/open_api_toolkit.py +0 -0
  386. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/openai_agent_toolkit.py +0 -0
  387. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/openbb_toolkit.py +0 -0
  388. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/page_script.js +0 -0
  389. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/playwright_mcp_toolkit.py +0 -0
  390. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/pptx_toolkit.py +0 -0
  391. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/pubmed_toolkit.py +0 -0
  392. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/pulse_mcp_search_toolkit.py +0 -0
  393. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/pyautogui_toolkit.py +0 -0
  394. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/reddit_toolkit.py +0 -0
  395. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/retrieval_toolkit.py +0 -0
  396. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/search_toolkit.py +0 -0
  397. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/searxng_toolkit.py +0 -0
  398. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/semantic_scholar_toolkit.py +0 -0
  399. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/slack_toolkit.py +0 -0
  400. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/stripe_toolkit.py +0 -0
  401. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/sympy_toolkit.py +0 -0
  402. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/task_planning_toolkit.py +0 -0
  403. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/terminal_toolkit.py +0 -0
  404. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/thinking_toolkit.py +0 -0
  405. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/twitter_toolkit.py +0 -0
  406. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/video_download_toolkit.py +0 -0
  407. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/weather_toolkit.py +0 -0
  408. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/whatsapp_toolkit.py +0 -0
  409. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/wolfram_alpha_toolkit.py +0 -0
  410. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/toolkits/zapier_toolkit.py +0 -0
  411. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/types/__init__.py +0 -0
  412. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/types/agents/__init__.py +0 -0
  413. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/types/agents/tool_calling_record.py +0 -0
  414. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/types/enums.py +0 -0
  415. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/types/mcp_registries.py +0 -0
  416. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/types/openai_types.py +0 -0
  417. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/types/unified_model_type.py +0 -0
  418. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/__init__.py +0 -0
  419. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/async_func.py +0 -0
  420. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/chunker/__init__.py +0 -0
  421. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/chunker/base.py +0 -0
  422. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/chunker/code_chunker.py +0 -0
  423. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/chunker/uio_chunker.py +0 -0
  424. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/commons.py +0 -0
  425. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/constants.py +0 -0
  426. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/deduplication.py +0 -0
  427. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/filename.py +0 -0
  428. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/langfuse.py +0 -0
  429. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/mcp.py +0 -0
  430. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/mcp_client.py +0 -0
  431. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/response_format.py +0 -0
  432. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/utils/token_counting.py +0 -0
  433. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/verifiers/__init__.py +0 -0
  434. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/verifiers/base.py +0 -0
  435. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/verifiers/math_verifier.py +0 -0
  436. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/verifiers/models.py +0 -0
  437. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/camel/verifiers/physics_verifier.py +0 -0
  438. {camel_ai-0.2.69a1 → camel_ai-0.2.69a3}/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.69a1
3
+ Version: 0.2.69a3
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
@@ -99,6 +99,7 @@ Requires-Dist: pymupdf<2,>=1.22.5; extra == 'all'
99
99
  Requires-Dist: pyobvector>=0.1.18; extra == 'all'
100
100
  Requires-Dist: pyowm<4,>=3.3.0; extra == 'all'
101
101
  Requires-Dist: pytelegrambotapi<5,>=4.18.0; extra == 'all'
102
+ Requires-Dist: pytesseract>=0.3.13; extra == 'all'
102
103
  Requires-Dist: pytest-asyncio<0.24,>=0.23.0; extra == 'all'
103
104
  Requires-Dist: pytest-cov<5,>=4; extra == 'all'
104
105
  Requires-Dist: pytest<8,>=7; extra == 'all'
@@ -226,6 +227,7 @@ Provides-Extra: media-tools
226
227
  Requires-Dist: ffmpeg-python<0.3,>=0.2.0; extra == 'media-tools'
227
228
  Requires-Dist: imageio[pyav]<3,>=2.34.2; extra == 'media-tools'
228
229
  Requires-Dist: pydub<0.26,>=0.25.1; extra == 'media-tools'
230
+ Requires-Dist: pytesseract>=0.3.13; extra == 'media-tools'
229
231
  Requires-Dist: scenedetect>=0.6.5.2; extra == 'media-tools'
230
232
  Requires-Dist: yt-dlp<2025,>=2024.11.4; extra == 'media-tools'
231
233
  Provides-Extra: model-platforms
@@ -252,6 +254,7 @@ Requires-Dist: ffmpeg-python<0.3,>=0.2.0; extra == 'owl'
252
254
  Requires-Dist: fpdf>=1.7.2; extra == 'owl'
253
255
  Requires-Dist: html2text>=2024.2.26; extra == 'owl'
254
256
  Requires-Dist: imageio[pyav]<3,>=2.34.2; extra == 'owl'
257
+ Requires-Dist: markitdown==0.1.1; extra == 'owl'
255
258
  Requires-Dist: mcp-server-fetch==2025.1.17; extra == 'owl'
256
259
  Requires-Dist: mcp-simple-arxiv==0.2.2; extra == 'owl'
257
260
  Requires-Dist: newspaper3k<0.3,>=0.2.8; extra == 'owl'
@@ -266,6 +269,7 @@ Requires-Dist: pyautogui<0.10,>=0.9.54; extra == 'owl'
266
269
  Requires-Dist: pydub<0.26,>=0.25.1; extra == 'owl'
267
270
  Requires-Dist: pylatex>=1.4.2; extra == 'owl'
268
271
  Requires-Dist: pymupdf<2,>=1.22.5; extra == 'owl'
272
+ Requires-Dist: pytesseract>=0.3.13; extra == 'owl'
269
273
  Requires-Dist: python-dotenv<2,>=1.0.0; extra == 'owl'
270
274
  Requires-Dist: python-pptx>=1.0.2; extra == 'owl'
271
275
  Requires-Dist: requests-oauthlib<2,>=1.3.1; extra == 'owl'
@@ -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.69a1'
17
+ __version__ = '0.2.69a3'
18
18
 
19
19
  __all__ = [
20
20
  '__version__',
@@ -1904,12 +1904,36 @@ class ChatAgent(BaseAgent):
1904
1904
  ChatAgent: A new instance of :obj:`ChatAgent` with the same
1905
1905
  configuration.
1906
1906
  """
1907
+ import copy
1908
+
1907
1909
  # Create a new instance with the same configuration
1908
1910
  # If with_memory is True, set system_message to None
1909
1911
  # If with_memory is False, use the original system message
1910
1912
  # To avoid duplicated system memory.
1911
1913
  system_message = None if with_memory else self._original_system_message
1912
1914
 
1915
+ # Create deep copies of tools to avoid shared state
1916
+ cloned_tools: List[Union[FunctionTool, Callable]] = []
1917
+ for tool in self._internal_tools.values():
1918
+ # Create a new FunctionTool instance to avoid sharing state
1919
+ cloned_tool = copy.deepcopy(tool)
1920
+ cloned_tools.append(cloned_tool)
1921
+
1922
+ # Create deep copies of external tool schemas
1923
+ cloned_external_tools: List[
1924
+ Union[FunctionTool, Callable, Dict[str, Any]]
1925
+ ] = []
1926
+ for schema in self._external_tool_schemas.values():
1927
+ cloned_schema = copy.deepcopy(schema)
1928
+ cloned_external_tools.append(cloned_schema)
1929
+
1930
+ # Create deep copies of response terminators to avoid shared state
1931
+ cloned_terminators: List[ResponseTerminator] = []
1932
+ if self.response_terminators:
1933
+ for terminator in self.response_terminators:
1934
+ cloned_terminator = copy.deepcopy(terminator)
1935
+ cloned_terminators.append(cloned_terminator)
1936
+
1913
1937
  new_agent = ChatAgent(
1914
1938
  system_message=system_message,
1915
1939
  model=self.model_backend.models, # Pass the existing model_backend
@@ -1919,11 +1943,9 @@ class ChatAgent(BaseAgent):
1919
1943
  self.memory.get_context_creator(), "token_limit", None
1920
1944
  ),
1921
1945
  output_language=self._output_language,
1922
- tools=list(self._internal_tools.values()),
1923
- external_tools=[
1924
- schema for schema in self._external_tool_schemas.values()
1925
- ],
1926
- response_terminators=self.response_terminators,
1946
+ tools=cloned_tools,
1947
+ external_tools=cloned_external_tools,
1948
+ response_terminators=cloned_terminators,
1927
1949
  scheduling_strategy=self.model_backend.scheduling_strategy.__name__,
1928
1950
  max_iteration=self.max_iteration,
1929
1951
  stop_event=self.stop_event,
@@ -286,8 +286,8 @@ class SingleAgentWorker(Worker):
286
286
  )
287
287
  except Exception as e:
288
288
  print(
289
- f"{Fore.RED}Error occurred while processing task {task.id}:"
290
- f"\n{e}{Fore.RESET}"
289
+ f"{Fore.RED}Error processing task {task.id}: "
290
+ f"{type(e).__name__}: {e}{Fore.RESET}"
291
291
  )
292
292
  return TaskState.FAILED
293
293
  finally:
@@ -336,8 +336,15 @@ class SingleAgentWorker(Worker):
336
336
 
337
337
  print(f"======\n{Fore.GREEN}Reply from {self}:{Fore.RESET}")
338
338
 
339
- result_dict = json.loads(response.msg.content)
340
- task_result = TaskResult(**result_dict)
339
+ try:
340
+ result_dict = json.loads(response.msg.content)
341
+ task_result = TaskResult(**result_dict)
342
+ except json.JSONDecodeError as e:
343
+ print(
344
+ f"{Fore.RED}JSON parsing error for task {task.id}: "
345
+ f"Invalid response format - {e}{Fore.RESET}"
346
+ )
347
+ return TaskState.FAILED
341
348
 
342
349
  color = Fore.RED if task_result.failed else Fore.GREEN
343
350
  print(
@@ -882,11 +882,16 @@ class Workforce(BaseNode):
882
882
  self._task = task
883
883
  self._state = WorkforceState.RUNNING
884
884
  task.state = TaskState.FAILED # TODO: Add logic for OPEN
885
- self._pending_tasks.append(task)
886
885
 
887
886
  # Decompose the task into subtasks first
888
887
  subtasks = self._decompose_task(task)
889
- self._pending_tasks.extendleft(reversed(subtasks))
888
+ if subtasks:
889
+ # If decomposition happened, the original task becomes a container.
890
+ # We only execute its subtasks.
891
+ self._pending_tasks.extendleft(reversed(subtasks))
892
+ else:
893
+ # If no decomposition, execute the original task.
894
+ self._pending_tasks.append(task)
890
895
  self.set_channel(TaskChannel())
891
896
 
892
897
  # Save initial snapshot
@@ -531,9 +531,10 @@ class FunctionTool:
531
531
  param_dict = properties[param_name]
532
532
  if "description" not in param_dict:
533
533
  warnings.warn(
534
- f"Parameter description is missing "
535
- f"for {param_dict}. This may affect the "
536
- f"quality of tool calling."
534
+ f"Parameter description is missing for the "
535
+ f"function '{openai_tool_schema['function']['name']}'. "
536
+ f"The parameter definition is {param_dict}. "
537
+ f"This may affect the quality of tool calling."
537
538
  )
538
539
 
539
540
  def get_openai_tool_schema(self) -> Dict[str, Any]:
@@ -15,15 +15,16 @@ from __future__ import annotations
15
15
 
16
16
  from typing import Any, Dict, List, Optional
17
17
 
18
+ from camel.logger import get_logger
18
19
  from camel.models import BaseModelBackend
19
20
  from camel.toolkits.base import BaseToolkit
20
21
  from camel.toolkits.function_tool import FunctionTool
21
22
 
22
23
  from .agent import PlaywrightLLMAgent
23
-
24
- # session wrapper
25
24
  from .nv_browser_session import NVBrowserSession
26
25
 
26
+ logger = get_logger(__name__)
27
+
27
28
 
28
29
  class BrowserNonVisualToolkit(BaseToolkit):
29
30
  r"""A lightweight, *non-visual* browser toolkit exposing primitive
@@ -52,24 +53,50 @@ class BrowserNonVisualToolkit(BaseToolkit):
52
53
  self._agent: Optional[PlaywrightLLMAgent] = None
53
54
 
54
55
  def __del__(self):
55
- r"""Ensure cleanup when toolkit is garbage collected."""
56
- # Note: __del__ cannot be async, so we schedule cleanup if needed
57
- import asyncio
58
-
56
+ r"""Best-effort cleanup when toolkit is garbage collected.
57
+
58
+ 1. We *avoid* running during the Python interpreter shutdown phase
59
+ (`sys.is_finalizing()`), because the import machinery and/or event
60
+ loop may already be torn down which leads to noisy exceptions such
61
+ as `ImportError: sys.meta_path is None` or
62
+ `RuntimeError: Event loop is closed`.
63
+ 2. We protect all imports and event-loop operations with defensive
64
+ `try/except` blocks. This ensures that, even if cleanup cannot be
65
+ carried out, we silently ignore the failure instead of polluting
66
+ stderr on program exit.
67
+ """
59
68
  try:
60
- loop = asyncio.get_event_loop()
69
+ import sys
70
+
71
+ if getattr(sys, "is_finalizing", lambda: False)():
72
+ return # Skip cleanup during interpreter shutdown
73
+
74
+ import asyncio
75
+
76
+ try:
77
+ loop = asyncio.get_event_loop()
78
+ except RuntimeError:
79
+ # No event loop in current thread → nothing to clean
80
+ return
81
+
82
+ if loop.is_closed():
83
+ # Event loop already closed → cannot run async cleanup
84
+ return
85
+
61
86
  if loop.is_running():
62
- task = loop.create_task(self.close_browser())
63
- # Don't wait for completion to avoid blocking
64
- del task
87
+ try:
88
+ task = loop.create_task(self.close_browser())
89
+ del task # Fire-and-forget
90
+ except RuntimeError:
91
+ # Loop is running but not in this thread → ignore
92
+ pass
65
93
  else:
94
+ # Own the loop → safe to run
66
95
  asyncio.run(self.close_browser())
67
96
  except Exception:
68
- pass # Don't fail during garbage collection
97
+ # Suppress *all* errors during garbage collection
98
+ pass
69
99
 
70
- # ------------------------------------------------------------------
71
- # Internal helpers
72
- # ------------------------------------------------------------------
73
100
  async def _ensure_browser(self):
74
101
  await self._session.ensure_browser()
75
102
 
@@ -78,28 +105,26 @@ class BrowserNonVisualToolkit(BaseToolkit):
78
105
  return await self._session.get_page()
79
106
 
80
107
  def _validate_ref(self, ref: str, method_name: str) -> None:
81
- """Validate that ref parameter is a non-empty string."""
108
+ r"""Validate that ref parameter is a non-empty string."""
82
109
  if not ref or not isinstance(ref, str):
83
- raise ValueError(
110
+ logger.error(
84
111
  f"{method_name}(): 'ref' must be a non-empty string, "
85
112
  f"got: {ref}"
86
113
  )
87
114
 
88
- # ------------------------------------------------------------------
89
- # Tool implementations
90
- # ------------------------------------------------------------------
91
115
  async def open_browser(
92
116
  self, start_url: Optional[str] = None
93
117
  ) -> Dict[str, str]:
94
118
  r"""Launch a Playwright browser session.
95
119
 
96
120
  Args:
97
- start_url (Optional[str]): If provided, the page will navigate to
98
- this URL immediately after the browser launches.
121
+ start_url (Optional[str]): Optional URL to navigate to immediately
122
+ after the browser launches. If not provided, the browser will
123
+ not navigate to any URL. (default: :obj:`None`)
99
124
 
100
125
  Returns:
101
126
  Dict[str, str]: Keys: ``result`` for action outcome,
102
- ``snapshot`` for full DOM snapshot.
127
+ ``snapshot`` for full DOM snapshot.
103
128
  """
104
129
  await self._session.ensure_browser()
105
130
  if start_url:
@@ -128,16 +153,15 @@ class BrowserNonVisualToolkit(BaseToolkit):
128
153
  await self._session.close()
129
154
  return "Browser session closed."
130
155
 
131
- # Navigation / page state ------------------------------------------------
132
156
  async def visit_page(self, url: str) -> Dict[str, str]:
133
- """Navigate the current page to the specified URL.
157
+ r"""Navigate the current page to the specified URL.
134
158
 
135
159
  Args:
136
160
  url (str): The destination URL.
137
161
 
138
162
  Returns:
139
163
  Dict[str, str]: Keys: ``result`` for action outcome,
140
- ``snapshot`` for full DOM snapshot.
164
+ ``snapshot`` for full DOM snapshot.
141
165
  """
142
166
  if not url or not isinstance(url, str):
143
167
  raise ValueError("visit_page(): 'url' must be a non-empty string")
@@ -155,10 +179,10 @@ class BrowserNonVisualToolkit(BaseToolkit):
155
179
 
156
180
  Args:
157
181
  force_refresh (bool): When ``True`` always re-generate the
158
- snapshot even
159
- if the URL has not changed.
160
- diff_only (bool): If ``True`` return only the diff relative to the
161
- previous snapshot.
182
+ snapshot even if the URL has not changed. (default:
183
+ :obj:`False`)
184
+ diff_only (bool): When ``True`` return only the diff relative to
185
+ the previous snapshot. (default: :obj:`False`)
162
186
 
163
187
  Returns:
164
188
  str: Formatted snapshot string.
@@ -167,13 +191,12 @@ class BrowserNonVisualToolkit(BaseToolkit):
167
191
  force_refresh=force_refresh, diff_only=diff_only
168
192
  )
169
193
 
170
- # Element-level wrappers -------------------------------------------------
171
194
  async def click(self, *, ref: str) -> Dict[str, str]:
172
195
  r"""Click an element identified by ``ref``
173
196
 
174
197
  Args:
175
- ref (str): Element reference ID extracted from snapshot (e.g.
176
- ``"e3"``).
198
+ ref (str): Element reference ID extracted from snapshot
199
+ (e.g.``"e3"``).
177
200
 
178
201
  Returns:
179
202
  Dict[str, str]: Result message from ``ActionExecutor``.
@@ -187,8 +210,8 @@ class BrowserNonVisualToolkit(BaseToolkit):
187
210
  r"""Type text into an input or textarea element.
188
211
 
189
212
  Args:
190
- ref (str): Element reference ID extracted from snapshot (e.g.
191
- ``"e3"``).
213
+ ref (str): Element reference ID extracted from snapshot.
214
+ (e.g.``"e3"``).
192
215
  text (str): The text to enter.
193
216
 
194
217
  Returns:
@@ -218,67 +241,70 @@ class BrowserNonVisualToolkit(BaseToolkit):
218
241
  r"""Scroll the page.
219
242
 
220
243
  Args:
221
- direction (str): ``"down"`` or ``"up"``.
244
+ direction (str): Scroll direction, should be ``"down"`` or
245
+ ``"up"``.
222
246
  amount (int): Pixel distance to scroll.
223
247
 
224
248
  Returns:
225
249
  Dict[str, str]: Execution result message.
226
250
  """
227
251
  if direction not in ("up", "down"):
228
- raise ValueError("scroll(): 'direction' must be 'up' or 'down'")
252
+ logger.error("scroll(): 'direction' must be 'up' or 'down'")
253
+ return {
254
+ "result": "scroll() Error: 'direction' must be 'up' or 'down'"
255
+ }
229
256
 
230
257
  action = {"type": "scroll", "direction": direction, "amount": amount}
231
258
  return await self._exec_with_snapshot(action)
232
259
 
233
- async def wait(
234
- self, *, timeout_ms: int | None = None, selector: str | None = None
235
- ) -> Dict[str, str]:
236
- r"""Explicit wait utility.
260
+ async def enter(self, *, ref: str) -> Dict[str, str]:
261
+ r"""Press the Enter key.
237
262
 
238
263
  Args:
239
- timeout_ms (Optional[int]): Milliseconds to sleep.
240
- selector (Optional[str]): Wait until this CSS selector appears
241
- in DOM.
264
+ ref (str): Element reference ID to focus before pressing.
242
265
 
243
266
  Returns:
244
267
  Dict[str, str]: Execution result message.
245
268
  """
246
- # Default to 1 000 ms sleep when no arguments provided
247
- if timeout_ms is None and selector is None:
248
- timeout_ms = 1000
249
-
250
- action: Dict[str, Any] = {"type": "wait"}
251
- if timeout_ms is not None:
252
- action["timeout"] = timeout_ms
253
- if selector is not None:
254
- action["selector"] = selector
269
+ self._validate_ref(ref, "enter")
270
+
271
+ action: Dict[str, Any] = {"type": "enter", "ref": ref}
255
272
  return await self._exec_with_snapshot(action)
256
273
 
257
- async def extract(self, *, ref: str) -> Dict[str, str]:
258
- r"""Extract text content from an element.
274
+ async def wait_user(self, *, seconds: float = 1.0) -> Dict[str, str]:
275
+ r"""Pause execution for a given amount of *real* time and then
276
+ return a *full* page snapshot.
277
+
278
+ This is a convenience wrapper around the existing wait action for
279
+ scenarios where you encounter a CAPTCHA or need to pause for manual
280
+ user input, and want to retrieve the complete DOM snapshot afterward.
259
281
 
260
282
  Args:
261
- ref (str): Element reference ID obtained from snapshot.
283
+ seconds (float): How long to sleep, expressed in seconds. Must
284
+ be a positive number. (default: :obj:`1.0`)
262
285
 
263
286
  Returns:
264
- Dict[str, str]: Extracted text or error message.
287
+ Dict[str, str]: Keys ``result`` and ``snapshot``.
265
288
  """
266
- self._validate_ref(ref, "extract")
267
- return await self._exec_with_snapshot({"type": "extract", "ref": ref})
289
+ if seconds is None or seconds <= 0:
290
+ logger.error("wait_time(): 'seconds' must be a positive number")
291
+ return {
292
+ "result": "wait_time(): 'seconds' must be a positive number"
293
+ }
268
294
 
269
- async def enter(self, *, ref: str) -> Dict[str, str]:
270
- r"""Press the Enter key.
295
+ # Reuse underlying ActionExecutor's ``wait`` implementation (expects
296
+ # ms)
297
+ timeout_ms = int(seconds * 1000)
298
+ action: Dict[str, Any] = {"type": "wait", "timeout": timeout_ms}
271
299
 
272
- Args:
273
- ref (str): Element reference ID to focus before pressing.
300
+ # Execute the sleep via ActionExecutor (no snapshot diff expected)
301
+ result = await self._exec(action)
274
302
 
275
- Returns:
276
- Dict[str, str]: Execution result message.
277
- """
278
- self._validate_ref(ref, "enter")
279
-
280
- action: Dict[str, Any] = {"type": "enter", "ref": ref}
281
- return await self._exec_with_snapshot(action)
303
+ # Always return a *full* snapshot after the pause
304
+ snapshot = await self._session.get_snapshot(
305
+ force_refresh=True, diff_only=False
306
+ )
307
+ return {"result": result, "snapshot": snapshot}
282
308
 
283
309
  # Helper to run through ActionExecutor
284
310
  async def _exec(self, action: Dict[str, Any]) -> str:
@@ -308,9 +334,6 @@ class BrowserNonVisualToolkit(BaseToolkit):
308
334
 
309
335
  return {"result": result, "snapshot": diff}
310
336
 
311
- # ------------------------------------------------------------------
312
- # Optional PlaywrightLLMAgent helpers
313
- # ------------------------------------------------------------------
314
337
  def _ensure_agent(self) -> PlaywrightLLMAgent:
315
338
  r"""Create PlaywrightLLMAgent on first use if `web_agent_model`
316
339
  provided."""
@@ -332,29 +355,34 @@ class BrowserNonVisualToolkit(BaseToolkit):
332
355
  self, task_prompt: str, start_url: str, max_steps: int = 15
333
356
  ) -> str:
334
357
  r"""Use LLM agent to autonomously complete the task (requires
335
- `web_agent_model`)."""
358
+ `web_agent_model`).
359
+
360
+ Args:
361
+ task_prompt (str): The task prompt to complete.
362
+ start_url (str): The URL to navigate to.
363
+ max_steps (int): The maximum number of steps to take.
364
+ (default: :obj:`15`)
365
+
366
+ Returns:
367
+ str: The result of the task.
368
+ """
336
369
 
337
370
  agent = self._ensure_agent()
338
371
  await agent.navigate(start_url)
339
372
  await agent.process_command(task_prompt, max_steps=max_steps)
340
373
  return "Task processing finished - see stdout for detailed trace."
341
374
 
342
- # ------------------------------------------------------------------
343
- # Toolkit registration
344
- # ------------------------------------------------------------------
345
375
  def get_tools(self) -> List[FunctionTool]:
346
376
  base_tools = [
347
377
  FunctionTool(self.open_browser),
348
378
  FunctionTool(self.close_browser),
349
379
  FunctionTool(self.visit_page),
350
- FunctionTool(self.get_page_snapshot),
351
380
  FunctionTool(self.click),
352
381
  FunctionTool(self.type),
353
382
  FunctionTool(self.select),
354
383
  FunctionTool(self.scroll),
355
- FunctionTool(self.wait),
356
- FunctionTool(self.extract),
357
384
  FunctionTool(self.enter),
385
+ FunctionTool(self.wait_user),
358
386
  ]
359
387
 
360
388
  if self.web_agent_model is not None:
@@ -55,10 +55,23 @@ class NVBrowserSession:
55
55
  self.snapshot: Optional[PageSnapshot] = None
56
56
  self.executor: Optional[ActionExecutor] = None
57
57
 
58
+ # Protect browser initialisation against concurrent calls
59
+ import asyncio
60
+
61
+ self._ensure_lock: "asyncio.Lock" = asyncio.Lock()
62
+
58
63
  # ------------------------------------------------------------------
59
64
  # Browser lifecycle helpers
60
65
  # ------------------------------------------------------------------
61
66
  async def ensure_browser(self) -> None:
67
+ # Serialise initialisation to avoid race conditions where multiple
68
+ # concurrent coroutine calls create multiple browser instances for
69
+ # the same NVBrowserSession.
70
+ async with self._ensure_lock:
71
+ await self._ensure_browser_inner()
72
+
73
+ # Moved original logic to helper
74
+ async def _ensure_browser_inner(self) -> None:
62
75
  from playwright.async_api import async_playwright
63
76
 
64
77
  if self._page is not None:
@@ -80,12 +93,27 @@ class NVBrowserSession:
80
93
  self._browser = await pl.chromium.launch(headless=self._headless)
81
94
  self._context = await self._browser.new_context()
82
95
 
96
+ from camel.logger import get_logger
97
+
98
+ _dbg_logger = get_logger(__name__)
99
+
83
100
  # Reuse an already open page (persistent context may restore last
84
101
  # session)
85
102
  if self._context.pages:
86
103
  self._page = self._context.pages[0]
87
104
  else:
88
105
  self._page = await self._context.new_page()
106
+
107
+ # Debug information to help trace concurrency issues
108
+ _dbg_logger.debug(
109
+ "Session %s created browser=%s context=%s page=%s (url=%s)",
110
+ hex(id(self)),
111
+ hex(id(self._browser)) if self._browser else None,
112
+ hex(id(self._context)) if self._context else None,
113
+ hex(id(self._page)),
114
+ self._page.url if self._page else "<none>",
115
+ )
116
+
89
117
  # helpers
90
118
  self.snapshot = PageSnapshot(self._page)
91
119
  self.executor = ActionExecutor(self._page)
@@ -99,16 +99,65 @@ class PageSnapshot:
99
99
  _snapshot_js_cache: Optional[str] = None # class-level cache
100
100
 
101
101
  async def _get_snapshot_direct(self) -> Optional[str]:
102
- try:
103
- if PageSnapshot._snapshot_js_cache is None:
104
- js_path = Path(__file__).parent / "snapshot.js"
105
- PageSnapshot._snapshot_js_cache = js_path.read_text(
106
- encoding="utf-8"
102
+ r"""Evaluate the snapshot-extraction JS with simple retry logic.
103
+
104
+ Playwright throws *Execution context was destroyed* when a new page
105
+ navigation happens between scheduling and evaluating the JS. In that
106
+ case we retry a few times after waiting for the next DOMContentLoaded
107
+ event; for all other exceptions we abort immediately.
108
+ """
109
+
110
+ # Load JS once and cache it at class level
111
+ if PageSnapshot._snapshot_js_cache is None:
112
+ js_path = Path(__file__).parent / "snapshot.js"
113
+ PageSnapshot._snapshot_js_cache = js_path.read_text(
114
+ encoding="utf-8"
115
+ )
116
+
117
+ js_code = PageSnapshot._snapshot_js_cache
118
+
119
+ retries: int = 3
120
+ while retries > 0:
121
+ try:
122
+ return await self.page.evaluate(js_code)
123
+ except Exception as e:
124
+ msg = str(e)
125
+
126
+ # Typical error when navigation happens between calls
127
+ nav_err = "Execution context was destroyed"
128
+
129
+ if (
130
+ nav_err in msg
131
+ or "Most likely because of a navigation" in msg
132
+ ):
133
+ retries -= 1
134
+ logger.debug(
135
+ "Snapshot evaluate failed due to navigation; "
136
+ "retrying (%d left)…",
137
+ retries,
138
+ )
139
+
140
+ # Wait for next DOM stability before retrying
141
+ try:
142
+ await self.page.wait_for_load_state(
143
+ "domcontentloaded", timeout=self.MAX_TIMEOUT_MS
144
+ )
145
+ except Exception:
146
+ # Even if waiting fails, attempt retry to give it
147
+ # one more chance
148
+ pass
149
+
150
+ continue # retry the evaluate()
151
+
152
+ # Any other exception → abort
153
+ logger.warning(
154
+ "Failed to execute snapshot JavaScript: %s",
155
+ e,
107
156
  )
108
- return await self.page.evaluate(PageSnapshot._snapshot_js_cache)
109
- except Exception as e:
110
- logger.warning("Failed to execute snapshot JavaScript: %s", e)
111
- return None
157
+ return None
158
+
159
+ logger.warning("Failed to execute snapshot JavaScript after retries")
160
+ return None
112
161
 
113
162
  @staticmethod
114
163
  def _format_snapshot(text: str) -> str: