camel-ai 0.2.69a2__tar.gz → 0.2.69a4__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.69a2 → camel_ai-0.2.69a4}/PKG-INFO +1 -1
  2. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/__init__.py +1 -1
  3. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/agents/chat_agent.py +1 -1
  4. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/societies/workforce/single_agent_worker.py +9 -11
  5. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/non_visual_browser_toolkit/browser_non_visual_toolkit.py +107 -79
  6. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/non_visual_browser_toolkit/nv_browser_session.py +28 -0
  7. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/non_visual_browser_toolkit/snapshot.py +58 -9
  8. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/pyproject.toml +1 -1
  9. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/.gitignore +0 -0
  10. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/LICENSE +0 -0
  11. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/README.md +0 -0
  12. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/agents/__init__.py +0 -0
  13. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/agents/_types.py +0 -0
  14. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/agents/_utils.py +0 -0
  15. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/agents/base.py +0 -0
  16. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/agents/critic_agent.py +0 -0
  17. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/agents/deductive_reasoner_agent.py +0 -0
  18. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/agents/embodied_agent.py +0 -0
  19. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/agents/knowledge_graph_agent.py +0 -0
  20. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/agents/mcp_agent.py +0 -0
  21. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/agents/multi_hop_generator_agent.py +0 -0
  22. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/agents/programmed_agent_instruction.py +0 -0
  23. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/agents/repo_agent.py +0 -0
  24. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/agents/role_assignment_agent.py +0 -0
  25. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/agents/search_agent.py +0 -0
  26. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/agents/task_agent.py +0 -0
  27. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/agents/tool_agents/__init__.py +0 -0
  28. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/agents/tool_agents/base.py +0 -0
  29. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/agents/tool_agents/hugging_face_tool_agent.py +0 -0
  30. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/benchmarks/__init__.py +0 -0
  31. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/benchmarks/apibank.py +0 -0
  32. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/benchmarks/apibench.py +0 -0
  33. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/benchmarks/base.py +0 -0
  34. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/benchmarks/browsecomp.py +0 -0
  35. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/benchmarks/gaia.py +0 -0
  36. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/benchmarks/mock_website/README.md +0 -0
  37. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/benchmarks/mock_website/mock_web.py +0 -0
  38. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/benchmarks/mock_website/requirements.txt +0 -0
  39. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/benchmarks/mock_website/shopping_mall/app.py +0 -0
  40. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/benchmarks/mock_website/task.json +0 -0
  41. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/benchmarks/nexus.py +0 -0
  42. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/benchmarks/ragbench.py +0 -0
  43. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/bots/__init__.py +0 -0
  44. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/bots/discord/__init__.py +0 -0
  45. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/bots/discord/discord_app.py +0 -0
  46. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/bots/discord/discord_installation.py +0 -0
  47. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/bots/discord/discord_store.py +0 -0
  48. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/bots/slack/__init__.py +0 -0
  49. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/bots/slack/models.py +0 -0
  50. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/bots/slack/slack_app.py +0 -0
  51. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/bots/telegram_bot.py +0 -0
  52. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/__init__.py +0 -0
  53. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/aiml_config.py +0 -0
  54. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/anthropic_config.py +0 -0
  55. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/base_config.py +0 -0
  56. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/bedrock_config.py +0 -0
  57. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/cohere_config.py +0 -0
  58. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/crynux_config.py +0 -0
  59. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/deepseek_config.py +0 -0
  60. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/gemini_config.py +0 -0
  61. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/groq_config.py +0 -0
  62. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/internlm_config.py +0 -0
  63. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/litellm_config.py +0 -0
  64. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/lmstudio_config.py +0 -0
  65. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/mistral_config.py +0 -0
  66. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/modelscope_config.py +0 -0
  67. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/moonshot_config.py +0 -0
  68. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/netmind_config.py +0 -0
  69. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/novita_config.py +0 -0
  70. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/nvidia_config.py +0 -0
  71. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/ollama_config.py +0 -0
  72. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/openai_config.py +0 -0
  73. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/openrouter_config.py +0 -0
  74. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/ppio_config.py +0 -0
  75. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/qianfan_config.py +0 -0
  76. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/qwen_config.py +0 -0
  77. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/reka_config.py +0 -0
  78. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/samba_config.py +0 -0
  79. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/sglang_config.py +0 -0
  80. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/siliconflow_config.py +0 -0
  81. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/togetherai_config.py +0 -0
  82. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/vllm_config.py +0 -0
  83. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/watsonx_config.py +0 -0
  84. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/yi_config.py +0 -0
  85. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/configs/zhipuai_config.py +0 -0
  86. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/data_collectors/__init__.py +0 -0
  87. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/data_collectors/alpaca_collector.py +0 -0
  88. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/data_collectors/base.py +0 -0
  89. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/data_collectors/sharegpt_collector.py +0 -0
  90. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datagen/__init__.py +0 -0
  91. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datagen/cot_datagen.py +0 -0
  92. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datagen/evol_instruct/__init__.py +0 -0
  93. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datagen/evol_instruct/evol_instruct.py +0 -0
  94. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datagen/evol_instruct/scorer.py +0 -0
  95. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datagen/evol_instruct/templates.py +0 -0
  96. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datagen/self_improving_cot.py +0 -0
  97. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datagen/self_instruct/__init__.py +0 -0
  98. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datagen/self_instruct/filter/__init__.py +0 -0
  99. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datagen/self_instruct/filter/filter_function.py +0 -0
  100. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datagen/self_instruct/filter/filter_registry.py +0 -0
  101. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datagen/self_instruct/filter/instruction_filter.py +0 -0
  102. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datagen/self_instruct/self_instruct.py +0 -0
  103. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datagen/self_instruct/templates.py +0 -0
  104. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datagen/source2synth/__init__.py +0 -0
  105. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datagen/source2synth/data_processor.py +0 -0
  106. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datagen/source2synth/models.py +0 -0
  107. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datagen/source2synth/user_data_processor_config.py +0 -0
  108. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datahubs/__init__.py +0 -0
  109. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datahubs/base.py +0 -0
  110. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datahubs/huggingface.py +0 -0
  111. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datahubs/models.py +0 -0
  112. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datasets/__init__.py +0 -0
  113. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datasets/base_generator.py +0 -0
  114. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datasets/few_shot_generator.py +0 -0
  115. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datasets/models.py +0 -0
  116. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datasets/self_instruct_generator.py +0 -0
  117. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/datasets/static_dataset.py +0 -0
  118. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/embeddings/__init__.py +0 -0
  119. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/embeddings/azure_embedding.py +0 -0
  120. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/embeddings/base.py +0 -0
  121. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/embeddings/gemini_embedding.py +0 -0
  122. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/embeddings/jina_embedding.py +0 -0
  123. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/embeddings/mistral_embedding.py +0 -0
  124. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/embeddings/openai_compatible_embedding.py +0 -0
  125. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/embeddings/openai_embedding.py +0 -0
  126. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/embeddings/sentence_transformers_embeddings.py +0 -0
  127. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/embeddings/together_embedding.py +0 -0
  128. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/embeddings/vlm_embedding.py +0 -0
  129. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/environments/__init__.py +0 -0
  130. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/environments/models.py +0 -0
  131. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/environments/multi_step.py +0 -0
  132. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/environments/rlcards_env.py +0 -0
  133. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/environments/single_step.py +0 -0
  134. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/environments/tic_tac_toe.py +0 -0
  135. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/extractors/__init__.py +0 -0
  136. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/extractors/base.py +0 -0
  137. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/extractors/python_strategies.py +0 -0
  138. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/generators.py +0 -0
  139. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/human.py +0 -0
  140. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/interpreters/__init__.py +0 -0
  141. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/interpreters/base.py +0 -0
  142. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/interpreters/docker/Dockerfile +0 -0
  143. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/interpreters/docker_interpreter.py +0 -0
  144. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/interpreters/e2b_interpreter.py +0 -0
  145. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/interpreters/internal_python_interpreter.py +0 -0
  146. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/interpreters/interpreter_error.py +0 -0
  147. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/interpreters/ipython_interpreter.py +0 -0
  148. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/interpreters/subprocess_interpreter.py +0 -0
  149. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/loaders/__init__.py +0 -0
  150. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/loaders/apify_reader.py +0 -0
  151. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/loaders/base_io.py +0 -0
  152. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/loaders/chunkr_reader.py +0 -0
  153. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/loaders/crawl4ai_reader.py +0 -0
  154. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/loaders/firecrawl_reader.py +0 -0
  155. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/loaders/jina_url_reader.py +0 -0
  156. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/loaders/markitdown.py +0 -0
  157. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/loaders/mineru_extractor.py +0 -0
  158. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/loaders/mistral_reader.py +0 -0
  159. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/loaders/pandas_reader.py +0 -0
  160. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/loaders/scrapegraph_reader.py +0 -0
  161. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/loaders/unstructured_io.py +0 -0
  162. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/logger.py +0 -0
  163. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/memories/__init__.py +0 -0
  164. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/memories/agent_memories.py +0 -0
  165. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/memories/base.py +0 -0
  166. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/memories/blocks/__init__.py +0 -0
  167. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/memories/blocks/chat_history_block.py +0 -0
  168. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/memories/blocks/vectordb_block.py +0 -0
  169. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/memories/context_creators/__init__.py +0 -0
  170. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/memories/context_creators/score_based.py +0 -0
  171. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/memories/records.py +0 -0
  172. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/messages/__init__.py +0 -0
  173. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/messages/base.py +0 -0
  174. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/messages/conversion/__init__.py +0 -0
  175. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/messages/conversion/alpaca.py +0 -0
  176. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/messages/conversion/conversation_models.py +0 -0
  177. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/messages/conversion/sharegpt/__init__.py +0 -0
  178. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/messages/conversion/sharegpt/function_call_formatter.py +0 -0
  179. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/messages/conversion/sharegpt/hermes/__init__.py +0 -0
  180. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +0 -0
  181. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/messages/func_message.py +0 -0
  182. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/__init__.py +0 -0
  183. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/_utils.py +0 -0
  184. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/aiml_model.py +0 -0
  185. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/anthropic_model.py +0 -0
  186. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/aws_bedrock_model.py +0 -0
  187. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/azure_openai_model.py +0 -0
  188. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/base_audio_model.py +0 -0
  189. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/base_model.py +0 -0
  190. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/cohere_model.py +0 -0
  191. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/crynux_model.py +0 -0
  192. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/deepseek_model.py +0 -0
  193. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/fish_audio_model.py +0 -0
  194. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/gemini_model.py +0 -0
  195. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/groq_model.py +0 -0
  196. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/internlm_model.py +0 -0
  197. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/litellm_model.py +0 -0
  198. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/lmstudio_model.py +0 -0
  199. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/mistral_model.py +0 -0
  200. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/model_factory.py +0 -0
  201. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/model_manager.py +0 -0
  202. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/modelscope_model.py +0 -0
  203. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/moonshot_model.py +0 -0
  204. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/nemotron_model.py +0 -0
  205. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/netmind_model.py +0 -0
  206. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/novita_model.py +0 -0
  207. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/nvidia_model.py +0 -0
  208. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/ollama_model.py +0 -0
  209. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/openai_audio_models.py +0 -0
  210. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/openai_compatible_model.py +0 -0
  211. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/openai_model.py +0 -0
  212. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/openrouter_model.py +0 -0
  213. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/ppio_model.py +0 -0
  214. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/qianfan_model.py +0 -0
  215. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/qwen_model.py +0 -0
  216. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/reka_model.py +0 -0
  217. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/reward/__init__.py +0 -0
  218. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/reward/base_reward_model.py +0 -0
  219. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/reward/evaluator.py +0 -0
  220. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/reward/nemotron_model.py +0 -0
  221. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/reward/skywork_model.py +0 -0
  222. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/samba_model.py +0 -0
  223. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/sglang_model.py +0 -0
  224. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/siliconflow_model.py +0 -0
  225. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/stub_model.py +0 -0
  226. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/togetherai_model.py +0 -0
  227. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/vllm_model.py +0 -0
  228. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/volcano_model.py +0 -0
  229. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/watsonx_model.py +0 -0
  230. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/yi_model.py +0 -0
  231. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/models/zhipuai_model.py +0 -0
  232. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/personas/__init__.py +0 -0
  233. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/personas/persona.py +0 -0
  234. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/personas/persona_hub.py +0 -0
  235. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/prompts/__init__.py +0 -0
  236. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/prompts/ai_society.py +0 -0
  237. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/prompts/base.py +0 -0
  238. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/prompts/code.py +0 -0
  239. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/prompts/evaluation.py +0 -0
  240. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/prompts/generate_text_embedding_data.py +0 -0
  241. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/prompts/image_craft.py +0 -0
  242. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/prompts/misalignment.py +0 -0
  243. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/prompts/multi_condition_image_craft.py +0 -0
  244. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/prompts/object_recognition.py +0 -0
  245. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/prompts/persona_hub.py +0 -0
  246. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/prompts/prompt_templates.py +0 -0
  247. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/prompts/role_description_prompt_template.py +0 -0
  248. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/prompts/solution_extraction.py +0 -0
  249. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/prompts/task_prompt_template.py +0 -0
  250. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/prompts/translation.py +0 -0
  251. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/prompts/video_description_prompt.py +0 -0
  252. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/py.typed +0 -0
  253. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/responses/__init__.py +0 -0
  254. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/responses/agent_responses.py +0 -0
  255. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/retrievers/__init__.py +0 -0
  256. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/retrievers/auto_retriever.py +0 -0
  257. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/retrievers/base.py +0 -0
  258. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/retrievers/bm25_retriever.py +0 -0
  259. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/retrievers/cohere_rerank_retriever.py +0 -0
  260. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/retrievers/hybrid_retrival.py +0 -0
  261. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/retrievers/vector_retriever.py +0 -0
  262. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/runtimes/__init__.py +0 -0
  263. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/runtimes/api.py +0 -0
  264. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/runtimes/base.py +0 -0
  265. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/runtimes/configs.py +0 -0
  266. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/runtimes/daytona_runtime.py +0 -0
  267. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/runtimes/docker_runtime.py +0 -0
  268. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/runtimes/llm_guard_runtime.py +0 -0
  269. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/runtimes/remote_http_runtime.py +0 -0
  270. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/runtimes/ubuntu_docker_runtime.py +0 -0
  271. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/runtimes/utils/__init__.py +0 -0
  272. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/runtimes/utils/function_risk_toolkit.py +0 -0
  273. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/runtimes/utils/ignore_risk_toolkit.py +0 -0
  274. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/schemas/__init__.py +0 -0
  275. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/schemas/base.py +0 -0
  276. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/schemas/openai_converter.py +0 -0
  277. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/schemas/outlines_converter.py +0 -0
  278. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/societies/__init__.py +0 -0
  279. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/societies/babyagi_playing.py +0 -0
  280. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/societies/role_playing.py +0 -0
  281. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/societies/workforce/__init__.py +0 -0
  282. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/societies/workforce/base.py +0 -0
  283. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/societies/workforce/prompts.py +0 -0
  284. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/societies/workforce/role_playing_worker.py +0 -0
  285. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/societies/workforce/task_channel.py +0 -0
  286. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/societies/workforce/utils.py +0 -0
  287. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/societies/workforce/worker.py +0 -0
  288. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/societies/workforce/workforce.py +0 -0
  289. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/societies/workforce/workforce_logger.py +0 -0
  290. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/storages/__init__.py +0 -0
  291. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/storages/graph_storages/__init__.py +0 -0
  292. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/storages/graph_storages/base.py +0 -0
  293. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/storages/graph_storages/graph_element.py +0 -0
  294. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/storages/graph_storages/nebula_graph.py +0 -0
  295. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/storages/graph_storages/neo4j_graph.py +0 -0
  296. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/storages/key_value_storages/__init__.py +0 -0
  297. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/storages/key_value_storages/base.py +0 -0
  298. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/storages/key_value_storages/in_memory.py +0 -0
  299. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/storages/key_value_storages/json.py +0 -0
  300. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/storages/key_value_storages/mem0_cloud.py +0 -0
  301. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/storages/key_value_storages/redis.py +0 -0
  302. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/storages/object_storages/__init__.py +0 -0
  303. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/storages/object_storages/amazon_s3.py +0 -0
  304. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/storages/object_storages/azure_blob.py +0 -0
  305. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/storages/object_storages/base.py +0 -0
  306. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/storages/object_storages/google_cloud.py +0 -0
  307. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/storages/vectordb_storages/__init__.py +0 -0
  308. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/storages/vectordb_storages/base.py +0 -0
  309. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/storages/vectordb_storages/faiss.py +0 -0
  310. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/storages/vectordb_storages/milvus.py +0 -0
  311. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/storages/vectordb_storages/oceanbase.py +0 -0
  312. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/storages/vectordb_storages/qdrant.py +0 -0
  313. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/storages/vectordb_storages/tidb.py +0 -0
  314. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/storages/vectordb_storages/weaviate.py +0 -0
  315. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/tasks/__init__.py +0 -0
  316. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/tasks/task.py +0 -0
  317. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/tasks/task_prompt.py +0 -0
  318. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/terminators/__init__.py +0 -0
  319. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/terminators/base.py +0 -0
  320. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/terminators/response_terminator.py +0 -0
  321. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/terminators/token_limit_terminator.py +0 -0
  322. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/__init__.py +0 -0
  323. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/aci_toolkit.py +0 -0
  324. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/arxiv_toolkit.py +0 -0
  325. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/ask_news_toolkit.py +0 -0
  326. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/async_browser_toolkit.py +0 -0
  327. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/audio_analysis_toolkit.py +0 -0
  328. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/base.py +0 -0
  329. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/bohrium_toolkit.py +0 -0
  330. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/browser_toolkit.py +0 -0
  331. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/browser_toolkit_commons.py +0 -0
  332. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/code_execution.py +0 -0
  333. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/dalle_toolkit.py +0 -0
  334. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/dappier_toolkit.py +0 -0
  335. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/data_commons_toolkit.py +0 -0
  336. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/excel_toolkit.py +0 -0
  337. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/file_write_toolkit.py +0 -0
  338. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/function_tool.py +0 -0
  339. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/github_toolkit.py +0 -0
  340. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/google_calendar_toolkit.py +0 -0
  341. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/google_maps_toolkit.py +0 -0
  342. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/google_scholar_toolkit.py +0 -0
  343. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/human_toolkit.py +0 -0
  344. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/image_analysis_toolkit.py +0 -0
  345. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/jina_reranker_toolkit.py +0 -0
  346. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/klavis_toolkit.py +0 -0
  347. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/linkedin_toolkit.py +0 -0
  348. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/math_toolkit.py +0 -0
  349. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/mcp_toolkit.py +0 -0
  350. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/memory_toolkit.py +0 -0
  351. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/meshy_toolkit.py +0 -0
  352. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/mineru_toolkit.py +0 -0
  353. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/networkx_toolkit.py +0 -0
  354. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/non_visual_browser_toolkit/__init__.py +0 -0
  355. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/non_visual_browser_toolkit/actions.py +0 -0
  356. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/non_visual_browser_toolkit/agent.py +0 -0
  357. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/non_visual_browser_toolkit/snapshot.js +0 -0
  358. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/notion_toolkit.py +0 -0
  359. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_specs/biztoc/__init__.py +0 -0
  360. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_specs/biztoc/ai-plugin.json +0 -0
  361. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_specs/biztoc/openapi.yaml +0 -0
  362. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_specs/coursera/__init__.py +0 -0
  363. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_specs/coursera/openapi.yaml +0 -0
  364. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_specs/create_qr_code/__init__.py +0 -0
  365. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_specs/create_qr_code/openapi.yaml +0 -0
  366. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_specs/klarna/__init__.py +0 -0
  367. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_specs/klarna/openapi.yaml +0 -0
  368. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_specs/nasa_apod/__init__.py +0 -0
  369. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_specs/nasa_apod/openapi.yaml +0 -0
  370. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_specs/outschool/__init__.py +0 -0
  371. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_specs/outschool/ai-plugin.json +0 -0
  372. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_specs/outschool/openapi.yaml +0 -0
  373. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_specs/outschool/paths/__init__.py +0 -0
  374. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_specs/outschool/paths/get_classes.py +0 -0
  375. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +0 -0
  376. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_specs/security_config.py +0 -0
  377. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_specs/speak/__init__.py +0 -0
  378. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_specs/speak/openapi.yaml +0 -0
  379. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_specs/web_scraper/__init__.py +0 -0
  380. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +0 -0
  381. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_specs/web_scraper/openapi.yaml +0 -0
  382. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +0 -0
  383. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +0 -0
  384. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/open_api_toolkit.py +0 -0
  385. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/openai_agent_toolkit.py +0 -0
  386. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/openbb_toolkit.py +0 -0
  387. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/page_script.js +0 -0
  388. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/playwright_mcp_toolkit.py +0 -0
  389. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/pptx_toolkit.py +0 -0
  390. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/pubmed_toolkit.py +0 -0
  391. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/pulse_mcp_search_toolkit.py +0 -0
  392. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/pyautogui_toolkit.py +0 -0
  393. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/reddit_toolkit.py +0 -0
  394. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/retrieval_toolkit.py +0 -0
  395. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/search_toolkit.py +0 -0
  396. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/searxng_toolkit.py +0 -0
  397. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/semantic_scholar_toolkit.py +0 -0
  398. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/slack_toolkit.py +0 -0
  399. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/stripe_toolkit.py +0 -0
  400. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/sympy_toolkit.py +0 -0
  401. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/task_planning_toolkit.py +0 -0
  402. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/terminal_toolkit.py +0 -0
  403. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/thinking_toolkit.py +0 -0
  404. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/twitter_toolkit.py +0 -0
  405. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/video_analysis_toolkit.py +0 -0
  406. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/video_download_toolkit.py +0 -0
  407. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/weather_toolkit.py +0 -0
  408. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/whatsapp_toolkit.py +0 -0
  409. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/wolfram_alpha_toolkit.py +0 -0
  410. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/toolkits/zapier_toolkit.py +0 -0
  411. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/types/__init__.py +0 -0
  412. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/types/agents/__init__.py +0 -0
  413. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/types/agents/tool_calling_record.py +0 -0
  414. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/types/enums.py +0 -0
  415. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/types/mcp_registries.py +0 -0
  416. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/types/openai_types.py +0 -0
  417. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/types/unified_model_type.py +0 -0
  418. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/utils/__init__.py +0 -0
  419. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/utils/async_func.py +0 -0
  420. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/utils/chunker/__init__.py +0 -0
  421. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/utils/chunker/base.py +0 -0
  422. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/utils/chunker/code_chunker.py +0 -0
  423. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/utils/chunker/uio_chunker.py +0 -0
  424. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/utils/commons.py +0 -0
  425. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/utils/constants.py +0 -0
  426. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/utils/deduplication.py +0 -0
  427. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/utils/filename.py +0 -0
  428. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/utils/langfuse.py +0 -0
  429. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/utils/mcp.py +0 -0
  430. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/utils/mcp_client.py +0 -0
  431. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/utils/response_format.py +0 -0
  432. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/utils/token_counting.py +0 -0
  433. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/verifiers/__init__.py +0 -0
  434. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/verifiers/base.py +0 -0
  435. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/verifiers/math_verifier.py +0 -0
  436. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/verifiers/models.py +0 -0
  437. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/camel/verifiers/physics_verifier.py +0 -0
  438. {camel_ai-0.2.69a2 → camel_ai-0.2.69a4}/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.69a2
3
+ Version: 0.2.69a4
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
@@ -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.69a2'
17
+ __version__ = '0.2.69a4'
18
18
 
19
19
  __all__ = [
20
20
  '__version__',
@@ -1919,7 +1919,7 @@ class ChatAgent(BaseAgent):
1919
1919
  self.memory.get_context_creator(), "token_limit", None
1920
1920
  ),
1921
1921
  output_language=self._output_language,
1922
- tools=list(self._internal_tools.values()),
1922
+ tools=[tool.func for tool in self._internal_tools.values()],
1923
1923
  external_tools=[
1924
1924
  schema for schema in self._external_tool_schemas.values()
1925
1925
  ],
@@ -284,6 +284,13 @@ class SingleAgentWorker(Worker):
284
284
  response = await worker_agent.astep(
285
285
  prompt, response_format=TaskResult
286
286
  )
287
+
288
+ # Get token usage from the response
289
+ usage_info = response.info.get("usage") or response.info.get(
290
+ "token_usage"
291
+ )
292
+ total_tokens = usage_info.get("total_tokens", 0)
293
+
287
294
  except Exception as e:
288
295
  print(
289
296
  f"{Fore.RED}Error processing task {task.id}: "
@@ -294,13 +301,6 @@ class SingleAgentWorker(Worker):
294
301
  # Return agent to pool or let it be garbage collected
295
302
  await self._return_worker_agent(worker_agent)
296
303
 
297
- # Get actual token usage from the agent that processed this task
298
- try:
299
- _, total_token_count = worker_agent.memory.get_context()
300
- except Exception:
301
- # Fallback if memory context unavailable
302
- total_token_count = 0
303
-
304
304
  # Populate additional_info with worker attempt details
305
305
  if task.additional_info is None:
306
306
  task.additional_info = {}
@@ -321,7 +321,7 @@ class SingleAgentWorker(Worker):
321
321
  f"to process task {task.content}",
322
322
  "response_content": response.msg.content,
323
323
  "tool_calls": response.info.get("tool_calls"),
324
- "total_token_count": total_token_count,
324
+ "total_tokens": total_tokens,
325
325
  }
326
326
 
327
327
  # Store the worker attempt in additional_info
@@ -330,9 +330,7 @@ class SingleAgentWorker(Worker):
330
330
  task.additional_info["worker_attempts"].append(worker_attempt_details)
331
331
 
332
332
  # Store the actual token usage for this specific task
333
- task.additional_info["token_usage"] = {
334
- "total_tokens": total_token_count
335
- }
333
+ task.additional_info["token_usage"] = {"total_tokens": total_tokens}
336
334
 
337
335
  print(f"======\n{Fore.GREEN}Reply from {self}:{Fore.RESET}")
338
336
 
@@ -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:
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "camel-ai"
7
- version = "0.2.69a2"
7
+ version = "0.2.69a4"
8
8
  description = "Communicative Agents for AI Society Study"
9
9
  authors = [{ name = "CAMEL-AI.org" }]
10
10
  requires-python = ">=3.10,<3.13"
File without changes
File without changes
File without changes