camel-ai 0.2.75a3__tar.gz → 0.2.75a5__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 (474) hide show
  1. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/PKG-INFO +4 -3
  2. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/__init__.py +1 -1
  3. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit_ts.py +35 -5
  4. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/hybrid_browser_toolkit/ts/src/browser-session.ts +124 -29
  5. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/hybrid_browser_toolkit/ts/src/config-loader.ts +1 -1
  6. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/hybrid_browser_toolkit/ts/src/hybrid-browser-toolkit.ts +103 -40
  7. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/hybrid_browser_toolkit/ts/src/types.ts +3 -2
  8. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/hybrid_browser_toolkit/ts/websocket-server.js +8 -1
  9. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/hybrid_browser_toolkit/ws_wrapper.py +55 -0
  10. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/openai_image_toolkit.py +55 -24
  11. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/types/enums.py +3 -9
  12. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/pyproject.toml +4 -3
  13. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/.gitignore +0 -0
  14. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/LICENSE +0 -0
  15. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/README.md +0 -0
  16. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/agents/__init__.py +0 -0
  17. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/agents/_types.py +0 -0
  18. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/agents/_utils.py +0 -0
  19. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/agents/base.py +0 -0
  20. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/agents/chat_agent.py +0 -0
  21. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/agents/critic_agent.py +0 -0
  22. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/agents/deductive_reasoner_agent.py +0 -0
  23. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/agents/embodied_agent.py +0 -0
  24. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/agents/knowledge_graph_agent.py +0 -0
  25. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/agents/mcp_agent.py +0 -0
  26. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/agents/multi_hop_generator_agent.py +0 -0
  27. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/agents/programmed_agent_instruction.py +0 -0
  28. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/agents/repo_agent.py +0 -0
  29. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/agents/role_assignment_agent.py +0 -0
  30. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/agents/search_agent.py +0 -0
  31. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/agents/task_agent.py +0 -0
  32. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/agents/tool_agents/__init__.py +0 -0
  33. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/agents/tool_agents/base.py +0 -0
  34. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/agents/tool_agents/hugging_face_tool_agent.py +0 -0
  35. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/benchmarks/__init__.py +0 -0
  36. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/benchmarks/apibank.py +0 -0
  37. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/benchmarks/apibench.py +0 -0
  38. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/benchmarks/base.py +0 -0
  39. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/benchmarks/browsecomp.py +0 -0
  40. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/benchmarks/gaia.py +0 -0
  41. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/benchmarks/mock_website/README.md +0 -0
  42. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/benchmarks/mock_website/mock_web.py +0 -0
  43. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/benchmarks/mock_website/requirements.txt +0 -0
  44. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/benchmarks/mock_website/shopping_mall/app.py +0 -0
  45. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/benchmarks/mock_website/task.json +0 -0
  46. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/benchmarks/nexus.py +0 -0
  47. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/benchmarks/ragbench.py +0 -0
  48. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/bots/__init__.py +0 -0
  49. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/bots/discord/__init__.py +0 -0
  50. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/bots/discord/discord_app.py +0 -0
  51. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/bots/discord/discord_installation.py +0 -0
  52. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/bots/discord/discord_store.py +0 -0
  53. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/bots/slack/__init__.py +0 -0
  54. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/bots/slack/models.py +0 -0
  55. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/bots/slack/slack_app.py +0 -0
  56. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/bots/telegram_bot.py +0 -0
  57. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/__init__.py +0 -0
  58. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/aiml_config.py +0 -0
  59. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/anthropic_config.py +0 -0
  60. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/base_config.py +0 -0
  61. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/bedrock_config.py +0 -0
  62. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/cohere_config.py +0 -0
  63. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/crynux_config.py +0 -0
  64. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/deepseek_config.py +0 -0
  65. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/gemini_config.py +0 -0
  66. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/groq_config.py +0 -0
  67. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/internlm_config.py +0 -0
  68. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/litellm_config.py +0 -0
  69. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/lmstudio_config.py +0 -0
  70. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/mistral_config.py +0 -0
  71. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/modelscope_config.py +0 -0
  72. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/moonshot_config.py +0 -0
  73. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/netmind_config.py +0 -0
  74. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/novita_config.py +0 -0
  75. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/nvidia_config.py +0 -0
  76. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/ollama_config.py +0 -0
  77. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/openai_config.py +0 -0
  78. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/openrouter_config.py +0 -0
  79. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/ppio_config.py +0 -0
  80. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/qianfan_config.py +0 -0
  81. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/qwen_config.py +0 -0
  82. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/reka_config.py +0 -0
  83. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/samba_config.py +0 -0
  84. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/sglang_config.py +0 -0
  85. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/siliconflow_config.py +0 -0
  86. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/togetherai_config.py +0 -0
  87. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/vllm_config.py +0 -0
  88. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/watsonx_config.py +0 -0
  89. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/yi_config.py +0 -0
  90. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/configs/zhipuai_config.py +0 -0
  91. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/data_collectors/__init__.py +0 -0
  92. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/data_collectors/alpaca_collector.py +0 -0
  93. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/data_collectors/base.py +0 -0
  94. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/data_collectors/sharegpt_collector.py +0 -0
  95. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datagen/__init__.py +0 -0
  96. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datagen/cot_datagen.py +0 -0
  97. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datagen/evol_instruct/__init__.py +0 -0
  98. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datagen/evol_instruct/evol_instruct.py +0 -0
  99. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datagen/evol_instruct/scorer.py +0 -0
  100. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datagen/evol_instruct/templates.py +0 -0
  101. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datagen/self_improving_cot.py +0 -0
  102. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datagen/self_instruct/__init__.py +0 -0
  103. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datagen/self_instruct/filter/__init__.py +0 -0
  104. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datagen/self_instruct/filter/filter_function.py +0 -0
  105. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datagen/self_instruct/filter/filter_registry.py +0 -0
  106. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datagen/self_instruct/filter/instruction_filter.py +0 -0
  107. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datagen/self_instruct/self_instruct.py +0 -0
  108. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datagen/self_instruct/templates.py +0 -0
  109. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datagen/source2synth/__init__.py +0 -0
  110. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datagen/source2synth/data_processor.py +0 -0
  111. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datagen/source2synth/models.py +0 -0
  112. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datagen/source2synth/user_data_processor_config.py +0 -0
  113. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datahubs/__init__.py +0 -0
  114. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datahubs/base.py +0 -0
  115. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datahubs/huggingface.py +0 -0
  116. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datahubs/models.py +0 -0
  117. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datasets/__init__.py +0 -0
  118. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datasets/base_generator.py +0 -0
  119. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datasets/few_shot_generator.py +0 -0
  120. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datasets/models.py +0 -0
  121. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datasets/self_instruct_generator.py +0 -0
  122. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/datasets/static_dataset.py +0 -0
  123. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/embeddings/__init__.py +0 -0
  124. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/embeddings/azure_embedding.py +0 -0
  125. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/embeddings/base.py +0 -0
  126. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/embeddings/gemini_embedding.py +0 -0
  127. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/embeddings/jina_embedding.py +0 -0
  128. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/embeddings/mistral_embedding.py +0 -0
  129. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/embeddings/openai_compatible_embedding.py +0 -0
  130. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/embeddings/openai_embedding.py +0 -0
  131. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/embeddings/sentence_transformers_embeddings.py +0 -0
  132. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/embeddings/together_embedding.py +0 -0
  133. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/embeddings/vlm_embedding.py +0 -0
  134. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/environments/__init__.py +0 -0
  135. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/environments/models.py +0 -0
  136. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/environments/multi_step.py +0 -0
  137. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/environments/rlcards_env.py +0 -0
  138. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/environments/single_step.py +0 -0
  139. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/environments/tic_tac_toe.py +0 -0
  140. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/extractors/__init__.py +0 -0
  141. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/extractors/base.py +0 -0
  142. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/extractors/python_strategies.py +0 -0
  143. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/generators.py +0 -0
  144. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/human.py +0 -0
  145. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/interpreters/__init__.py +0 -0
  146. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/interpreters/base.py +0 -0
  147. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/interpreters/docker/Dockerfile +0 -0
  148. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/interpreters/docker_interpreter.py +0 -0
  149. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/interpreters/e2b_interpreter.py +0 -0
  150. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/interpreters/internal_python_interpreter.py +0 -0
  151. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/interpreters/interpreter_error.py +0 -0
  152. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/interpreters/ipython_interpreter.py +0 -0
  153. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/interpreters/subprocess_interpreter.py +0 -0
  154. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/loaders/__init__.py +0 -0
  155. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/loaders/apify_reader.py +0 -0
  156. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/loaders/base_io.py +0 -0
  157. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/loaders/base_loader.py +0 -0
  158. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/loaders/chunkr_reader.py +0 -0
  159. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/loaders/crawl4ai_reader.py +0 -0
  160. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/loaders/firecrawl_reader.py +0 -0
  161. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/loaders/jina_url_reader.py +0 -0
  162. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/loaders/markitdown.py +0 -0
  163. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/loaders/mineru_extractor.py +0 -0
  164. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/loaders/mistral_reader.py +0 -0
  165. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/loaders/pandas_reader.py +0 -0
  166. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/loaders/scrapegraph_reader.py +0 -0
  167. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/loaders/unstructured_io.py +0 -0
  168. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/logger.py +0 -0
  169. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/memories/__init__.py +0 -0
  170. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/memories/agent_memories.py +0 -0
  171. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/memories/base.py +0 -0
  172. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/memories/blocks/__init__.py +0 -0
  173. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/memories/blocks/chat_history_block.py +0 -0
  174. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/memories/blocks/vectordb_block.py +0 -0
  175. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/memories/context_creators/__init__.py +0 -0
  176. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/memories/context_creators/score_based.py +0 -0
  177. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/memories/records.py +0 -0
  178. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/messages/__init__.py +0 -0
  179. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/messages/base.py +0 -0
  180. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/messages/conversion/__init__.py +0 -0
  181. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/messages/conversion/alpaca.py +0 -0
  182. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/messages/conversion/conversation_models.py +0 -0
  183. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/messages/conversion/sharegpt/__init__.py +0 -0
  184. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/messages/conversion/sharegpt/function_call_formatter.py +0 -0
  185. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/messages/conversion/sharegpt/hermes/__init__.py +0 -0
  186. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +0 -0
  187. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/messages/func_message.py +0 -0
  188. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/__init__.py +0 -0
  189. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/_utils.py +0 -0
  190. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/aiml_model.py +0 -0
  191. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/anthropic_model.py +0 -0
  192. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/aws_bedrock_model.py +0 -0
  193. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/azure_openai_model.py +0 -0
  194. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/base_audio_model.py +0 -0
  195. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/base_model.py +0 -0
  196. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/cohere_model.py +0 -0
  197. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/crynux_model.py +0 -0
  198. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/deepseek_model.py +0 -0
  199. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/fish_audio_model.py +0 -0
  200. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/gemini_model.py +0 -0
  201. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/groq_model.py +0 -0
  202. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/internlm_model.py +0 -0
  203. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/litellm_model.py +0 -0
  204. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/lmstudio_model.py +0 -0
  205. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/mistral_model.py +0 -0
  206. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/model_factory.py +0 -0
  207. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/model_manager.py +0 -0
  208. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/modelscope_model.py +0 -0
  209. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/moonshot_model.py +0 -0
  210. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/nemotron_model.py +0 -0
  211. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/netmind_model.py +0 -0
  212. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/novita_model.py +0 -0
  213. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/nvidia_model.py +0 -0
  214. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/ollama_model.py +0 -0
  215. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/openai_audio_models.py +0 -0
  216. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/openai_compatible_model.py +0 -0
  217. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/openai_model.py +0 -0
  218. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/openrouter_model.py +0 -0
  219. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/ppio_model.py +0 -0
  220. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/qianfan_model.py +0 -0
  221. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/qwen_model.py +0 -0
  222. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/reka_model.py +0 -0
  223. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/reward/__init__.py +0 -0
  224. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/reward/base_reward_model.py +0 -0
  225. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/reward/evaluator.py +0 -0
  226. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/reward/nemotron_model.py +0 -0
  227. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/reward/skywork_model.py +0 -0
  228. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/samba_model.py +0 -0
  229. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/sglang_model.py +0 -0
  230. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/siliconflow_model.py +0 -0
  231. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/stub_model.py +0 -0
  232. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/togetherai_model.py +0 -0
  233. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/vllm_model.py +0 -0
  234. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/volcano_model.py +0 -0
  235. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/watsonx_model.py +0 -0
  236. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/yi_model.py +0 -0
  237. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/models/zhipuai_model.py +0 -0
  238. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/personas/__init__.py +0 -0
  239. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/personas/persona.py +0 -0
  240. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/personas/persona_hub.py +0 -0
  241. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/prompts/__init__.py +0 -0
  242. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/prompts/ai_society.py +0 -0
  243. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/prompts/base.py +0 -0
  244. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/prompts/code.py +0 -0
  245. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/prompts/evaluation.py +0 -0
  246. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/prompts/generate_text_embedding_data.py +0 -0
  247. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/prompts/image_craft.py +0 -0
  248. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/prompts/misalignment.py +0 -0
  249. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/prompts/multi_condition_image_craft.py +0 -0
  250. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/prompts/object_recognition.py +0 -0
  251. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/prompts/persona_hub.py +0 -0
  252. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/prompts/prompt_templates.py +0 -0
  253. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/prompts/role_description_prompt_template.py +0 -0
  254. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/prompts/solution_extraction.py +0 -0
  255. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/prompts/task_prompt_template.py +0 -0
  256. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/prompts/translation.py +0 -0
  257. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/prompts/video_description_prompt.py +0 -0
  258. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/py.typed +0 -0
  259. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/responses/__init__.py +0 -0
  260. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/responses/agent_responses.py +0 -0
  261. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/retrievers/__init__.py +0 -0
  262. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/retrievers/auto_retriever.py +0 -0
  263. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/retrievers/base.py +0 -0
  264. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/retrievers/bm25_retriever.py +0 -0
  265. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/retrievers/cohere_rerank_retriever.py +0 -0
  266. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/retrievers/hybrid_retrival.py +0 -0
  267. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/retrievers/vector_retriever.py +0 -0
  268. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/runtimes/__init__.py +0 -0
  269. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/runtimes/api.py +0 -0
  270. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/runtimes/base.py +0 -0
  271. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/runtimes/configs.py +0 -0
  272. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/runtimes/daytona_runtime.py +0 -0
  273. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/runtimes/docker_runtime.py +0 -0
  274. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/runtimes/llm_guard_runtime.py +0 -0
  275. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/runtimes/remote_http_runtime.py +0 -0
  276. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/runtimes/ubuntu_docker_runtime.py +0 -0
  277. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/runtimes/utils/__init__.py +0 -0
  278. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/runtimes/utils/function_risk_toolkit.py +0 -0
  279. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/runtimes/utils/ignore_risk_toolkit.py +0 -0
  280. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/schemas/__init__.py +0 -0
  281. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/schemas/base.py +0 -0
  282. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/schemas/openai_converter.py +0 -0
  283. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/schemas/outlines_converter.py +0 -0
  284. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/services/agent_openapi_server.py +0 -0
  285. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/societies/__init__.py +0 -0
  286. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/societies/babyagi_playing.py +0 -0
  287. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/societies/role_playing.py +0 -0
  288. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/societies/workforce/__init__.py +0 -0
  289. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/societies/workforce/base.py +0 -0
  290. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/societies/workforce/prompts.py +0 -0
  291. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/societies/workforce/role_playing_worker.py +0 -0
  292. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/societies/workforce/single_agent_worker.py +0 -0
  293. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/societies/workforce/structured_output_handler.py +0 -0
  294. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/societies/workforce/task_channel.py +0 -0
  295. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/societies/workforce/utils.py +0 -0
  296. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/societies/workforce/worker.py +0 -0
  297. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/societies/workforce/workforce.py +0 -0
  298. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/societies/workforce/workforce_logger.py +0 -0
  299. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/__init__.py +0 -0
  300. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/graph_storages/__init__.py +0 -0
  301. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/graph_storages/base.py +0 -0
  302. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/graph_storages/graph_element.py +0 -0
  303. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/graph_storages/nebula_graph.py +0 -0
  304. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/graph_storages/neo4j_graph.py +0 -0
  305. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/key_value_storages/__init__.py +0 -0
  306. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/key_value_storages/base.py +0 -0
  307. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/key_value_storages/in_memory.py +0 -0
  308. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/key_value_storages/json.py +0 -0
  309. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/key_value_storages/mem0_cloud.py +0 -0
  310. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/key_value_storages/redis.py +0 -0
  311. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/object_storages/__init__.py +0 -0
  312. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/object_storages/amazon_s3.py +0 -0
  313. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/object_storages/azure_blob.py +0 -0
  314. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/object_storages/base.py +0 -0
  315. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/object_storages/google_cloud.py +0 -0
  316. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/vectordb_storages/__init__.py +0 -0
  317. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/vectordb_storages/base.py +0 -0
  318. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/vectordb_storages/chroma.py +0 -0
  319. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/vectordb_storages/faiss.py +0 -0
  320. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/vectordb_storages/milvus.py +0 -0
  321. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/vectordb_storages/oceanbase.py +0 -0
  322. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/vectordb_storages/pgvector.py +0 -0
  323. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/vectordb_storages/qdrant.py +0 -0
  324. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/vectordb_storages/surreal.py +0 -0
  325. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/vectordb_storages/tidb.py +0 -0
  326. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/storages/vectordb_storages/weaviate.py +0 -0
  327. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/tasks/__init__.py +0 -0
  328. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/tasks/task.py +0 -0
  329. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/tasks/task_prompt.py +0 -0
  330. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/terminators/__init__.py +0 -0
  331. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/terminators/base.py +0 -0
  332. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/terminators/response_terminator.py +0 -0
  333. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/terminators/token_limit_terminator.py +0 -0
  334. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/__init__.py +0 -0
  335. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/aci_toolkit.py +0 -0
  336. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/arxiv_toolkit.py +0 -0
  337. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/ask_news_toolkit.py +0 -0
  338. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/async_browser_toolkit.py +0 -0
  339. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/audio_analysis_toolkit.py +0 -0
  340. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/base.py +0 -0
  341. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/bohrium_toolkit.py +0 -0
  342. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/browser_toolkit.py +0 -0
  343. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/browser_toolkit_commons.py +0 -0
  344. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/code_execution.py +0 -0
  345. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/craw4ai_toolkit.py +0 -0
  346. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/dappier_toolkit.py +0 -0
  347. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/data_commons_toolkit.py +0 -0
  348. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/edgeone_pages_mcp_toolkit.py +0 -0
  349. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/excel_toolkit.py +0 -0
  350. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/file_write_toolkit.py +0 -0
  351. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/function_tool.py +0 -0
  352. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/github_toolkit.py +0 -0
  353. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/google_calendar_toolkit.py +0 -0
  354. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/google_drive_mcp_toolkit.py +0 -0
  355. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/google_maps_toolkit.py +0 -0
  356. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/google_scholar_toolkit.py +0 -0
  357. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/human_toolkit.py +0 -0
  358. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/hybrid_browser_toolkit/__init__.py +0 -0
  359. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/hybrid_browser_toolkit/config_loader.py +0 -0
  360. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py +0 -0
  361. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/hybrid_browser_toolkit/ts/package-lock.json +0 -0
  362. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/hybrid_browser_toolkit/ts/package.json +0 -0
  363. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/hybrid_browser_toolkit/ts/src/browser-scripts.js +0 -0
  364. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/hybrid_browser_toolkit/ts/src/index.ts +0 -0
  365. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/hybrid_browser_toolkit/ts/tsconfig.json +0 -0
  366. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/hybrid_browser_toolkit_py/__init__.py +0 -0
  367. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/hybrid_browser_toolkit_py/actions.py +0 -0
  368. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/hybrid_browser_toolkit_py/agent.py +0 -0
  369. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/hybrid_browser_toolkit_py/browser_session.py +0 -0
  370. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/hybrid_browser_toolkit_py/config_loader.py +0 -0
  371. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/hybrid_browser_toolkit_py/hybrid_browser_toolkit.py +0 -0
  372. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/hybrid_browser_toolkit_py/snapshot.py +0 -0
  373. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/hybrid_browser_toolkit_py/stealth_script.js +0 -0
  374. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/hybrid_browser_toolkit_py/unified_analyzer.js +0 -0
  375. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/image_analysis_toolkit.py +0 -0
  376. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/jina_reranker_toolkit.py +0 -0
  377. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/klavis_toolkit.py +0 -0
  378. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/linkedin_toolkit.py +0 -0
  379. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/markitdown_toolkit.py +0 -0
  380. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/math_toolkit.py +0 -0
  381. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/mcp_toolkit.py +0 -0
  382. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/memory_toolkit.py +0 -0
  383. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/meshy_toolkit.py +0 -0
  384. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/message_agent_toolkit.py +0 -0
  385. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/message_integration.py +0 -0
  386. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/mineru_toolkit.py +0 -0
  387. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/networkx_toolkit.py +0 -0
  388. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/note_taking_toolkit.py +0 -0
  389. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/notion_mcp_toolkit.py +0 -0
  390. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/notion_toolkit.py +0 -0
  391. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_specs/biztoc/__init__.py +0 -0
  392. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_specs/biztoc/ai-plugin.json +0 -0
  393. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_specs/biztoc/openapi.yaml +0 -0
  394. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_specs/coursera/__init__.py +0 -0
  395. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_specs/coursera/openapi.yaml +0 -0
  396. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_specs/create_qr_code/__init__.py +0 -0
  397. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_specs/create_qr_code/openapi.yaml +0 -0
  398. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_specs/klarna/__init__.py +0 -0
  399. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_specs/klarna/openapi.yaml +0 -0
  400. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_specs/nasa_apod/__init__.py +0 -0
  401. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_specs/nasa_apod/openapi.yaml +0 -0
  402. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_specs/outschool/__init__.py +0 -0
  403. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_specs/outschool/ai-plugin.json +0 -0
  404. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_specs/outschool/openapi.yaml +0 -0
  405. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_specs/outschool/paths/__init__.py +0 -0
  406. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_specs/outschool/paths/get_classes.py +0 -0
  407. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +0 -0
  408. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_specs/security_config.py +0 -0
  409. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_specs/speak/__init__.py +0 -0
  410. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_specs/speak/openapi.yaml +0 -0
  411. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_specs/web_scraper/__init__.py +0 -0
  412. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +0 -0
  413. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_specs/web_scraper/openapi.yaml +0 -0
  414. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +0 -0
  415. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +0 -0
  416. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/open_api_toolkit.py +0 -0
  417. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/openbb_toolkit.py +0 -0
  418. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/origene_mcp_toolkit.py +0 -0
  419. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/page_script.js +0 -0
  420. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/playwright_mcp_toolkit.py +0 -0
  421. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/pptx_toolkit.py +0 -0
  422. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/pubmed_toolkit.py +0 -0
  423. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/pulse_mcp_search_toolkit.py +0 -0
  424. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/pyautogui_toolkit.py +0 -0
  425. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/reddit_toolkit.py +0 -0
  426. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/retrieval_toolkit.py +0 -0
  427. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/screenshot_toolkit.py +0 -0
  428. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/search_toolkit.py +0 -0
  429. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/searxng_toolkit.py +0 -0
  430. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/semantic_scholar_toolkit.py +0 -0
  431. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/slack_toolkit.py +0 -0
  432. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/stripe_toolkit.py +0 -0
  433. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/sympy_toolkit.py +0 -0
  434. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/task_planning_toolkit.py +0 -0
  435. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/terminal_toolkit.py +0 -0
  436. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/thinking_toolkit.py +0 -0
  437. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/twitter_toolkit.py +0 -0
  438. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/video_analysis_toolkit.py +0 -0
  439. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/video_download_toolkit.py +0 -0
  440. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/weather_toolkit.py +0 -0
  441. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/web_deploy_toolkit.py +0 -0
  442. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/whatsapp_toolkit.py +0 -0
  443. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/wolfram_alpha_toolkit.py +0 -0
  444. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/toolkits/zapier_toolkit.py +0 -0
  445. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/types/__init__.py +0 -0
  446. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/types/agents/__init__.py +0 -0
  447. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/types/agents/tool_calling_record.py +0 -0
  448. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/types/mcp_registries.py +0 -0
  449. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/types/openai_types.py +0 -0
  450. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/types/unified_model_type.py +0 -0
  451. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/utils/__init__.py +0 -0
  452. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/utils/async_func.py +0 -0
  453. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/utils/chunker/__init__.py +0 -0
  454. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/utils/chunker/base.py +0 -0
  455. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/utils/chunker/code_chunker.py +0 -0
  456. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/utils/chunker/uio_chunker.py +0 -0
  457. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/utils/commons.py +0 -0
  458. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/utils/constants.py +0 -0
  459. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/utils/deduplication.py +0 -0
  460. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/utils/filename.py +0 -0
  461. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/utils/langfuse.py +0 -0
  462. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/utils/mcp.py +0 -0
  463. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/utils/mcp_client.py +0 -0
  464. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/utils/message_summarizer.py +0 -0
  465. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/utils/response_format.py +0 -0
  466. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/utils/token_counting.py +0 -0
  467. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/utils/tool_result.py +0 -0
  468. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/verifiers/__init__.py +0 -0
  469. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/verifiers/base.py +0 -0
  470. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/verifiers/math_verifier.py +0 -0
  471. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/verifiers/models.py +0 -0
  472. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/verifiers/physics_verifier.py +0 -0
  473. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/camel/verifiers/python_verifier.py +0 -0
  474. {camel_ai-0.2.75a3 → camel_ai-0.2.75a5}/hatch_build_npm.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: camel-ai
3
- Version: 0.2.75a3
3
+ Version: 0.2.75a5
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
@@ -91,6 +91,7 @@ Requires-Dist: playwright>=1.50.0; extra == 'all'
91
91
  Requires-Dist: prance<24,>=23.6.21.0; extra == 'all'
92
92
  Requires-Dist: praw<8,>=7.7.1; extra == 'all'
93
93
  Requires-Dist: pre-commit<4,>=3; extra == 'all'
94
+ Requires-Dist: protobuf>=6.0.0; extra == 'all'
94
95
  Requires-Dist: psycopg[binary]<4,>=3.1.18; extra == 'all'
95
96
  Requires-Dist: pyautogui<0.10,>=0.9.54; extra == 'all'
96
97
  Requires-Dist: pydub<0.26,>=0.25.1; extra == 'all'
@@ -128,7 +129,6 @@ Requires-Dist: sympy<2,>=1.13.3; extra == 'all'
128
129
  Requires-Dist: tabulate>=0.9.0; extra == 'all'
129
130
  Requires-Dist: tavily-python<0.6,>=0.5.0; extra == 'all'
130
131
  Requires-Dist: textblob<0.18,>=0.17.1; extra == 'all'
131
- Requires-Dist: traceroot==0.0.4a5; extra == 'all'
132
132
  Requires-Dist: transformers<5,>=4; extra == 'all'
133
133
  Requires-Dist: tree-sitter-python<0.24,>=0.23.6; extra == 'all'
134
134
  Requires-Dist: tree-sitter<0.24,>=0.23.2; extra == 'all'
@@ -193,7 +193,6 @@ Requires-Dist: ipykernel<7,>=6.0.0; extra == 'dev-tools'
193
193
  Requires-Dist: jupyter-client<9,>=8.6.2; extra == 'dev-tools'
194
194
  Requires-Dist: langfuse>=2.60.5; extra == 'dev-tools'
195
195
  Requires-Dist: mcp>=1.3.0; extra == 'dev-tools'
196
- Requires-Dist: traceroot==0.0.4a5; extra == 'dev-tools'
197
196
  Requires-Dist: tree-sitter-python<0.24,>=0.23.6; extra == 'dev-tools'
198
197
  Requires-Dist: tree-sitter<0.24,>=0.23.2; extra == 'dev-tools'
199
198
  Requires-Dist: typer>=0.15.2; extra == 'dev-tools'
@@ -345,6 +344,7 @@ Requires-Dist: nebula3-python==3.8.2; extra == 'rag'
345
344
  Requires-Dist: neo4j<6,>=5.18.0; extra == 'rag'
346
345
  Requires-Dist: numpy<=2.2,>=1.2; extra == 'rag'
347
346
  Requires-Dist: pandasai<3,>=2.3.0; extra == 'rag'
347
+ Requires-Dist: protobuf>=6.0.0; extra == 'rag'
348
348
  Requires-Dist: pymilvus<3,>=2.4.0; extra == 'rag'
349
349
  Requires-Dist: pyobvector>=0.1.18; extra == 'rag'
350
350
  Requires-Dist: pytidb-experimental==0.0.1.dev4; extra == 'rag'
@@ -366,6 +366,7 @@ Requires-Dist: mem0ai>=0.1.73; extra == 'storage'
366
366
  Requires-Dist: nebula3-python==3.8.2; extra == 'storage'
367
367
  Requires-Dist: neo4j<6,>=5.18.0; extra == 'storage'
368
368
  Requires-Dist: pgvector<0.3,>=0.2.4; extra == 'storage'
369
+ Requires-Dist: protobuf>=6.0.0; extra == 'storage'
369
370
  Requires-Dist: psycopg[binary]<4,>=3.1.18; extra == 'storage'
370
371
  Requires-Dist: pymilvus<3,>=2.4.0; extra == 'storage'
371
372
  Requires-Dist: pyobvector>=0.1.18; extra == 'storage'
@@ -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.75a3'
17
+ __version__ = '0.2.75a5'
18
18
 
19
19
  __all__ = [
20
20
  '__version__',
@@ -674,12 +674,29 @@ class HybridBrowserToolkit(BaseToolkit, RegisteredAgentToolkit):
674
674
  "total_tabs": 0,
675
675
  }
676
676
 
677
- async def browser_type(self, *, ref: str, text: str) -> Dict[str, Any]:
678
- r"""Types text into an input element on the page.
677
+ async def browser_type(
678
+ self,
679
+ *,
680
+ ref: Optional[str] = None,
681
+ text: Optional[str] = None,
682
+ inputs: Optional[List[Dict[str, str]]] = None,
683
+ ) -> Dict[str, Any]:
684
+ r"""Types text into one or more input elements on the page.
685
+
686
+ This method supports two modes:
687
+ 1. Single input mode (backward compatible): Provide 'ref' and 'text'
688
+ 2. Multiple inputs mode: Provide 'inputs' as a list of dictionaries
689
+ with 'ref' and 'text' keys
679
690
 
680
691
  Args:
681
- ref (str): The `ref` ID of the input element, from a snapshot.
682
- text (str): The text to type into the element.
692
+ ref (Optional[str]): The `ref` ID of the input element, from a
693
+ snapshot. Required when using single input mode.
694
+ text (Optional[str]): The text to type into the element. Required
695
+ when using single input mode.
696
+ inputs (Optional[List[Dict[str, str]]]): List of dictionaries,
697
+ each containing 'ref' and 'text' keys for typing into multiple
698
+ elements. Example: [{'ref': '1', 'text': 'username'},
699
+ {'ref': '2', 'text': 'password'}]
683
700
 
684
701
  Returns:
685
702
  Dict[str, Any]: A dictionary with the result of the action:
@@ -689,10 +706,23 @@ class HybridBrowserToolkit(BaseToolkit, RegisteredAgentToolkit):
689
706
  - "tabs" (List[Dict]): Information about all open tabs.
690
707
  - "current_tab" (int): Index of the active tab.
691
708
  - "total_tabs" (int): Total number of open tabs.
709
+ - "details" (Dict[str, Any]): When using multiple inputs,
710
+ contains success/error status for each ref.
692
711
  """
693
712
  try:
694
713
  ws_wrapper = await self._get_ws_wrapper()
695
- result = await ws_wrapper.type(ref, text)
714
+
715
+ # Handle single input mode (backward compatibility)
716
+ if ref is not None and text is not None:
717
+ result = await ws_wrapper.type(ref, text)
718
+ # Handle multiple inputs mode
719
+ elif inputs is not None:
720
+ result = await ws_wrapper.type_multiple(inputs)
721
+ else:
722
+ raise ValueError(
723
+ "Either provide 'ref' and 'text' for single input, "
724
+ "or 'inputs' for multiple inputs"
725
+ )
696
726
 
697
727
  # Add tab information
698
728
  tab_info = await ws_wrapper.get_tab_info()
@@ -72,21 +72,19 @@ export class HybridBrowserSession {
72
72
  this.context = await this.browser.newContext(contextOptions);
73
73
  }
74
74
 
75
- // Handle existing pages
76
75
  const pages = this.context.pages();
77
76
  if (pages.length > 0) {
78
- // Map existing pages - for CDP, only use pages with about:blank URL
77
+ // Map existing pages - for CDP, find ONE available blank page
79
78
  let availablePageFound = false;
80
79
  for (const page of pages) {
81
80
  const pageUrl = page.url();
82
- // In CDP mode, only consider pages with about:blank as available
83
- if (pageUrl === 'about:blank') {
81
+ if (this.isBlankPageUrl(pageUrl)) {
84
82
  const tabId = this.generateTabId();
85
83
  this.registerNewPage(tabId, page);
86
- if (!this.currentTabId) {
87
- this.currentTabId = tabId;
88
- availablePageFound = true;
89
- }
84
+ this.currentTabId = tabId;
85
+ availablePageFound = true;
86
+ console.log(`[CDP] Registered blank page as initial tab: ${tabId}, URL: ${pageUrl}`);
87
+ break; // Only register ONE page initially
90
88
  }
91
89
  }
92
90
 
@@ -157,8 +155,45 @@ export class HybridBrowserSession {
157
155
  return `${browserConfig.tabIdPrefix}${String(++this.tabCounter).padStart(browserConfig.tabCounterPadding, '0')}`;
158
156
  }
159
157
 
158
+ private isBlankPageUrl(url: string): boolean {
159
+ // Unified blank page detection logic used across the codebase
160
+ const browserConfig = this.configLoader.getBrowserConfig();
161
+ return (
162
+ // Standard about:blank variations (prefix match for query params)
163
+ url === 'about:blank' ||
164
+ url.startsWith('about:blank?') ||
165
+ // Configured blank page URLs (exact match for compatibility)
166
+ browserConfig.blankPageUrls.includes(url) ||
167
+ // Empty URL
168
+ url === '' ||
169
+ // Data URLs (often used for blank pages)
170
+ url.startsWith(browserConfig.dataUrlPrefix || 'data:')
171
+ );
172
+ }
173
+
160
174
  async getCurrentPage(): Promise<Page> {
161
175
  if (!this.currentTabId || !this.pages.has(this.currentTabId)) {
176
+ // In CDP mode, try to create a new page if none exists
177
+ const browserConfig = this.configLoader.getBrowserConfig();
178
+ if (browserConfig.connectOverCdp && this.context) {
179
+ console.log('[CDP] No active page found, attempting to create new page...');
180
+ try {
181
+ const newPage = await this.context.newPage();
182
+ const newTabId = this.generateTabId();
183
+ this.registerNewPage(newTabId, newPage);
184
+ this.currentTabId = newTabId;
185
+
186
+ // Set page timeouts
187
+ newPage.setDefaultNavigationTimeout(browserConfig.navigationTimeout);
188
+ newPage.setDefaultTimeout(browserConfig.navigationTimeout);
189
+
190
+ console.log(`[CDP] Created new page with tab ID: ${newTabId}`);
191
+ return newPage;
192
+ } catch (error) {
193
+ console.error('[CDP] Failed to create new page:', error);
194
+ throw new Error('No active page available and failed to create new page in CDP mode');
195
+ }
196
+ }
162
197
  throw new Error('No active page available');
163
198
  }
164
199
  return this.pages.get(this.currentTabId)!;
@@ -416,25 +451,67 @@ export class HybridBrowserSession {
416
451
 
417
452
  /**
418
453
  * Simplified type implementation using Playwright's aria-ref selector
454
+ * Supports both single and multiple input operations
419
455
  */
420
- private async performType(page: Page, ref: string, text: string): Promise<{ success: boolean; error?: string }> {
456
+ private async performType(page: Page, ref: string | undefined, text: string | undefined, inputs?: Array<{ ref: string; text: string }>): Promise<{ success: boolean; error?: string; details?: Record<string, any> }> {
421
457
  try {
422
458
  // Ensure we have the latest snapshot
423
459
  await (page as any)._snapshotForAI();
424
460
 
425
- // Use Playwright's aria-ref selector
426
- const selector = `aria-ref=${ref}`;
427
- const element = await page.locator(selector).first();
428
-
429
- const exists = await element.count() > 0;
430
- if (!exists) {
431
- return { success: false, error: `Element with ref ${ref} not found` };
461
+ // Handle multiple inputs if provided
462
+ if (inputs && inputs.length > 0) {
463
+ const results: Record<string, { success: boolean; error?: string }> = {};
464
+
465
+ for (const input of inputs) {
466
+ const selector = `aria-ref=${input.ref}`;
467
+ const element = await page.locator(selector).first();
468
+
469
+ const exists = await element.count() > 0;
470
+ if (!exists) {
471
+ results[input.ref] = { success: false, error: `Element with ref ${input.ref} not found` };
472
+ continue;
473
+ }
474
+
475
+ try {
476
+ // Type text using Playwright's built-in fill method
477
+ await element.fill(input.text);
478
+ results[input.ref] = { success: true };
479
+ } catch (error) {
480
+ results[input.ref] = { success: false, error: `Type failed: ${error}` };
481
+ }
482
+ }
483
+
484
+ // Check if all inputs were successful
485
+ const allSuccess = Object.values(results).every(r => r.success);
486
+ const errors = Object.entries(results)
487
+ .filter(([_, r]) => !r.success)
488
+ .map(([ref, r]) => `${ref}: ${r.error}`)
489
+ .join('; ');
490
+
491
+ return {
492
+ success: allSuccess,
493
+ error: allSuccess ? undefined : `Some inputs failed: ${errors}`,
494
+ details: results
495
+ };
432
496
  }
433
497
 
434
- // Type text using Playwright's built-in fill method
435
- await element.fill(text);
498
+ // Handle single input (backward compatibility)
499
+ if (ref && text !== undefined) {
500
+ const selector = `aria-ref=${ref}`;
501
+ const element = await page.locator(selector).first();
502
+
503
+ const exists = await element.count() > 0;
504
+ if (!exists) {
505
+ return { success: false, error: `Element with ref ${ref} not found` };
506
+ }
507
+
508
+ // Type text using Playwright's built-in fill method
509
+ await element.fill(text);
510
+
511
+ return { success: true };
512
+ }
436
513
 
437
- return { success: true };
514
+ return { success: false, error: 'No valid input provided' };
438
515
  } catch (error) {
439
516
  return { success: false, error: `Type failed: ${error}` };
440
517
  }
@@ -572,6 +649,8 @@ export class HybridBrowserSession {
572
649
  // No need to pre-fetch snapshot - each action method handles this
573
650
 
574
651
  let newTabId: string | undefined;
652
+ let customMessage: string | undefined;
653
+ let actionDetails: Record<string, any> | undefined;
575
654
 
576
655
  switch (action.type) {
577
656
  case 'click': {
@@ -596,12 +675,20 @@ export class HybridBrowserSession {
596
675
  elementSearchTime = Date.now() - elementSearchStart;
597
676
  const typeStart = Date.now();
598
677
 
599
- const typeResult = await this.performType(page, action.ref, action.text);
678
+ const typeResult = await this.performType(page, action.ref, action.text, action.inputs);
600
679
 
601
680
  if (!typeResult.success) {
602
681
  throw new Error(`Type failed: ${typeResult.error}`);
603
682
  }
604
683
 
684
+ // Set custom message and details if multiple inputs were used
685
+ if (typeResult.details) {
686
+ const successCount = Object.values(typeResult.details).filter((r: any) => r.success).length;
687
+ const totalCount = Object.keys(typeResult.details).length;
688
+ customMessage = `Typed text into ${successCount}/${totalCount} elements`;
689
+ actionDetails = typeResult.details;
690
+ }
691
+
605
692
  actionExecutionTime = Date.now() - typeStart;
606
693
  break;
607
694
  }
@@ -689,7 +776,7 @@ export class HybridBrowserSession {
689
776
 
690
777
  return {
691
778
  success: true,
692
- message: `Action ${action.type} executed successfully`,
779
+ message: customMessage || `Action ${action.type} executed successfully`,
693
780
  timing: {
694
781
  total_time_ms: totalTime,
695
782
  element_search_time_ms: elementSearchTime,
@@ -699,6 +786,7 @@ export class HybridBrowserSession {
699
786
  network_idle_time_ms: stabilityResult.networkIdleTime,
700
787
  },
701
788
  ...(newTabId && { newTabId }), // Include new tab ID if present
789
+ ...(actionDetails && { details: actionDetails }), // Include action details if present
702
790
  };
703
791
  } catch (error) {
704
792
  const totalTime = Date.now() - startTime;
@@ -740,16 +828,23 @@ export class HybridBrowserSession {
740
828
 
741
829
  try {
742
830
  // Get current page to check if it's blank
743
- const currentPage = await this.getCurrentPage();
744
- const currentUrl = currentPage.url();
831
+ let currentPage: Page;
832
+ let currentUrl: string;
833
+
834
+ try {
835
+ currentPage = await this.getCurrentPage();
836
+ currentUrl = currentPage.url();
837
+ } catch (error: any) {
838
+ // If no active page is available, getCurrentPage() will create one in CDP mode
839
+ console.log('[visitPage] Failed to get current page:', error);
840
+ throw new Error(`No active page available: ${error?.message || error}`);
841
+ }
745
842
 
746
843
  // Check if current page is blank or if this is the first navigation
747
844
  const browserConfig = this.configLoader.getBrowserConfig();
748
- const isBlankPage = (
749
- browserConfig.blankPageUrls.includes(currentUrl) ||
750
- currentUrl === browserConfig.defaultStartUrl ||
751
- currentUrl.startsWith(browserConfig.dataUrlPrefix) // data URLs are often used for blank pages
752
- );
845
+
846
+ // Use unified blank page detection
847
+ const isBlankPage = this.isBlankPageUrl(currentUrl) || currentUrl === browserConfig.defaultStartUrl;
753
848
 
754
849
  const shouldUseCurrentTab = isBlankPage || !this.hasNavigatedBefore;
755
850
 
@@ -804,7 +899,7 @@ export class HybridBrowserSession {
804
899
  const pageUrl = page.url();
805
900
  // Check if this page is not already tracked and is blank
806
901
  const isTracked = Array.from(this.pages.values()).includes(page);
807
- if (!isTracked && pageUrl === 'about:blank') {
902
+ if (!isTracked && this.isBlankPageUrl(pageUrl)) {
808
903
  newPage = page;
809
904
  newTabId = this.generateTabId();
810
905
  this.registerNewPage(newTabId, newPage);
@@ -117,7 +117,7 @@ function getDefaultBrowserConfig(): BrowserConfig {
117
117
  consoleLogLimit: 1000,
118
118
  scrollPositionScale: 0.1,
119
119
  navigationDelay: 100,
120
- blankPageUrls: ['about:blank', ''],
120
+ blankPageUrls: [],
121
121
  dataUrlPrefix: 'data:',
122
122
  domContentLoadedState: 'domcontentloaded',
123
123
  networkIdleState: 'networkidle',
@@ -69,35 +69,52 @@ export class HybridBrowserToolkit {
69
69
  }
70
70
 
71
71
  async visitPage(url: string): Promise<any> {
72
- const result = await this.session.visitPage(url);
73
-
74
- // Format response for Python layer compatibility
75
- const response: any = {
76
- result: result.message,
77
- snapshot: '',
78
- };
79
-
80
- if (result.success) {
81
- const snapshotStart = Date.now();
82
- response.snapshot = await this.getPageSnapshot(this.viewportLimit);
83
- const snapshotTime = Date.now() - snapshotStart;
72
+ try {
73
+ // Ensure browser is initialized before visiting page
74
+ await this.session.ensureBrowser();
75
+
76
+ const result = await this.session.visitPage(url);
77
+
78
+ // Format response for Python layer compatibility
79
+ const response: any = {
80
+ result: result.message,
81
+ snapshot: '',
82
+ };
83
+
84
+ if (result.success) {
85
+ const snapshotStart = Date.now();
86
+ response.snapshot = await this.getPageSnapshot(this.viewportLimit);
87
+ const snapshotTime = Date.now() - snapshotStart;
88
+
89
+ if (result.timing) {
90
+ result.timing.snapshot_time_ms = snapshotTime;
91
+ }
92
+ }
84
93
 
94
+ // Include timing if available
85
95
  if (result.timing) {
86
- result.timing.snapshot_time_ms = snapshotTime;
96
+ response.timing = result.timing;
87
97
  }
98
+
99
+ // Include newTabId if present
100
+ if (result.newTabId) {
101
+ response.newTabId = result.newTabId;
102
+ }
103
+
104
+ return response;
105
+ } catch (error) {
106
+ console.error('[visitPage] Error:', error);
107
+ return {
108
+ result: `Navigation to ${url} failed: ${error}`,
109
+ snapshot: '',
110
+ timing: {
111
+ total_time_ms: 0,
112
+ navigation_time_ms: 0,
113
+ dom_content_loaded_time_ms: 0,
114
+ network_idle_time_ms: 0,
115
+ }
116
+ };
88
117
  }
89
-
90
- // Include timing if available
91
- if (result.timing) {
92
- response.timing = result.timing;
93
- }
94
-
95
- // Include newTabId if present
96
- if (result.newTabId) {
97
- response.newTabId = result.newTabId;
98
- }
99
-
100
- return response;
101
118
  }
102
119
 
103
120
  async getPageSnapshot(viewportLimit: boolean = false): Promise<string> {
@@ -179,7 +196,40 @@ export class HybridBrowserToolkit {
179
196
  // Use sharp for image processing
180
197
  const sharp = require('sharp');
181
198
  const page = await this.session.getCurrentPage();
182
- const viewport = page.viewportSize() || { width: 1280, height: 720 };
199
+ let viewport = page.viewportSize();
200
+
201
+ // In CDP mode, viewportSize might be null, get it from window dimensions
202
+ if (!viewport) {
203
+ const windowSize = await page.evaluate(() => ({
204
+ width: window.innerWidth,
205
+ height: window.innerHeight
206
+ }));
207
+ viewport = windowSize;
208
+ }
209
+
210
+ // Get device pixel ratio to handle high DPI screens
211
+ const dpr = await page.evaluate(() => window.devicePixelRatio) || 1;
212
+
213
+ // Get actual screenshot dimensions
214
+ const metadata = await sharp(screenshotBuffer).metadata();
215
+ const screenshotWidth = metadata.width || viewport.width;
216
+ const screenshotHeight = metadata.height || viewport.height;
217
+
218
+ // Calculate scaling factor between CSS pixels and screenshot pixels
219
+ const scaleX = screenshotWidth / viewport.width;
220
+ const scaleY = screenshotHeight / viewport.height;
221
+
222
+ // Debug logging for CDP mode
223
+ if (process.env.HYBRID_BROWSER_DEBUG === '1') {
224
+ console.log('[CDP Debug] Viewport size:', viewport);
225
+ console.log('[CDP Debug] Device pixel ratio:', dpr);
226
+ console.log('[CDP Debug] Screenshot dimensions:', { width: screenshotWidth, height: screenshotHeight });
227
+ console.log('[CDP Debug] Scale factors:', { scaleX, scaleY });
228
+ console.log('[CDP Debug] Elements with coordinates:', elementsWithCoords.length);
229
+ elementsWithCoords.slice(0, 3).forEach(([ref, element]) => {
230
+ console.log(`[CDP Debug] Element ${ref}:`, element.coordinates);
231
+ });
232
+ }
183
233
 
184
234
  // Filter elements visible in viewport
185
235
  const visibleElements = elementsWithCoords.filter(([ref, element]) => {
@@ -198,18 +248,19 @@ export class HybridBrowserToolkit {
198
248
  const coords = element.coordinates!;
199
249
  const isClickable = clickableElements.has(ref);
200
250
 
201
- // Use original coordinates for elements within viewport
202
- // Clamp only to prevent marks from extending beyond screenshot bounds
203
- const x = Math.max(0, coords.x);
204
- const y = Math.max(0, coords.y);
205
- const maxWidth = viewport.width - x;
206
- const maxHeight = viewport.height - y;
207
- const width = Math.min(coords.width, maxWidth);
208
- const height = Math.min(coords.height, maxHeight);
251
+ // Scale coordinates from CSS pixels to screenshot pixels
252
+ const x = Math.max(0, coords.x * scaleX);
253
+ const y = Math.max(0, coords.y * scaleY);
254
+ const width = coords.width * scaleX;
255
+ const height = coords.height * scaleY;
256
+
257
+ // Clamp to screenshot bounds
258
+ const clampedWidth = Math.min(width, screenshotWidth - x);
259
+ const clampedHeight = Math.min(height, screenshotHeight - y);
209
260
 
210
261
  // Position text to be visible even if element is partially cut off
211
- const textX = Math.max(2, Math.min(x + 2, viewport.width - 40));
212
- const textY = Math.max(14, Math.min(y + 14, viewport.height - 4));
262
+ const textX = Math.max(2, Math.min(x + 2, screenshotWidth - 40));
263
+ const textY = Math.max(14, Math.min(y + 14, screenshotHeight - 4));
213
264
 
214
265
  // Different colors for clickable vs non-clickable elements
215
266
  const colors = isClickable ? {
@@ -223,7 +274,7 @@ export class HybridBrowserToolkit {
223
274
  };
224
275
 
225
276
  return `
226
- <rect x="${x}" y="${y}" width="${width}" height="${height}"
277
+ <rect x="${x}" y="${y}" width="${clampedWidth}" height="${clampedHeight}"
227
278
  fill="${colors.fill}" stroke="${colors.stroke}" stroke-width="2" rx="2"/>
228
279
  <text x="${textX}" y="${textY}" font-family="Arial, sans-serif"
229
280
  font-size="12" fill="${colors.textFill}" font-weight="bold">${ref}</text>
@@ -231,7 +282,7 @@ export class HybridBrowserToolkit {
231
282
  }).join('');
232
283
 
233
284
  const svgOverlay = `
234
- <svg width="${viewport.width}" height="${viewport.height}" xmlns="http://www.w3.org/2000/svg">
285
+ <svg width="${screenshotWidth}" height="${screenshotHeight}" xmlns="http://www.w3.org/2000/svg">
235
286
  ${marks}
236
287
  </svg>
237
288
  `;
@@ -363,8 +414,20 @@ export class HybridBrowserToolkit {
363
414
  return this.executeActionWithSnapshot(action);
364
415
  }
365
416
 
366
- async type(ref: string, text: string): Promise<any> {
367
- const action: BrowserAction = { type: 'type', ref, text };
417
+ async type(refOrInputs: string | Array<{ ref: string; text: string }>, text?: string): Promise<any> {
418
+ let action: BrowserAction;
419
+
420
+ if (typeof refOrInputs === 'string') {
421
+ // Single input mode (backward compatibility)
422
+ if (text === undefined) {
423
+ throw new Error('Text parameter is required when ref is a string');
424
+ }
425
+ action = { type: 'type', ref: refOrInputs, text };
426
+ } else {
427
+ // Multiple inputs mode
428
+ action = { type: 'type', inputs: refOrInputs };
429
+ }
430
+
368
431
  return this.executeActionWithSnapshot(action);
369
432
  }
370
433
 
@@ -81,8 +81,9 @@ export interface ClickAction {
81
81
 
82
82
  export interface TypeAction {
83
83
  type: 'type';
84
- ref: string;
85
- text: string;
84
+ ref?: string; // Optional for backward compatibility
85
+ text?: string; // Optional for backward compatibility
86
+ inputs?: Array<{ ref: string; text: string }>; // New field for multiple inputs
86
87
  }
87
88
 
88
89
  export interface SelectAction {
@@ -160,7 +160,14 @@ class WebSocketBrowserServer {
160
160
 
161
161
  case 'type':
162
162
  if (!this.toolkit) throw new Error('Toolkit not initialized');
163
- return await this.toolkit.type(params.ref, params.text);
163
+ // Handle both single input and multiple inputs
164
+ if (params.inputs) {
165
+ // Multiple inputs mode - pass inputs array directly
166
+ return await this.toolkit.type(params.inputs);
167
+ } else {
168
+ // Single input mode - pass ref and text
169
+ return await this.toolkit.type(params.ref, params.text);
170
+ }
164
171
 
165
172
  case 'select':
166
173
  if (!this.toolkit) throw new Error('Toolkit not initialized');
@@ -396,6 +396,9 @@ class WebSocketBrowserWrapper:
396
396
  """Send a command to the WebSocket server and get response."""
397
397
  await self._ensure_connection()
398
398
 
399
+ # Process params to ensure refs have 'e' prefix
400
+ params = self._process_refs_in_params(params)
401
+
399
402
  message_id = str(uuid.uuid4())
400
403
  message = {'id': message_id, 'command': command, 'params': params}
401
404
 
@@ -503,6 +506,50 @@ class WebSocketBrowserWrapper:
503
506
 
504
507
  return ToolResult(text=response['text'], images=response['images'])
505
508
 
509
+ def _ensure_ref_prefix(self, ref: str) -> str:
510
+ """Ensure ref has 'e' prefix."""
511
+ if ref and not ref.startswith('e'):
512
+ return f'e{ref}'
513
+ return ref
514
+
515
+ def _process_refs_in_params(
516
+ self, params: Dict[str, Any]
517
+ ) -> Dict[str, Any]:
518
+ """Process parameters to ensure all refs have 'e' prefix."""
519
+ if not params:
520
+ return params
521
+
522
+ # Create a copy to avoid modifying the original
523
+ processed = params.copy()
524
+
525
+ # Handle direct ref parameters
526
+ if 'ref' in processed:
527
+ processed['ref'] = self._ensure_ref_prefix(processed['ref'])
528
+
529
+ # Handle from_ref and to_ref for drag operations
530
+ if 'from_ref' in processed:
531
+ processed['from_ref'] = self._ensure_ref_prefix(
532
+ processed['from_ref']
533
+ )
534
+ if 'to_ref' in processed:
535
+ processed['to_ref'] = self._ensure_ref_prefix(processed['to_ref'])
536
+
537
+ # Handle inputs array for type_multiple
538
+ if 'inputs' in processed and isinstance(processed['inputs'], list):
539
+ processed_inputs = []
540
+ for input_item in processed['inputs']:
541
+ if isinstance(input_item, dict) and 'ref' in input_item:
542
+ processed_input = input_item.copy()
543
+ processed_input['ref'] = self._ensure_ref_prefix(
544
+ input_item['ref']
545
+ )
546
+ processed_inputs.append(processed_input)
547
+ else:
548
+ processed_inputs.append(input_item)
549
+ processed['inputs'] = processed_inputs
550
+
551
+ return processed
552
+
506
553
  @action_logger
507
554
  async def click(self, ref: str) -> Dict[str, Any]:
508
555
  """Click an element."""
@@ -515,6 +562,14 @@ class WebSocketBrowserWrapper:
515
562
  response = await self._send_command('type', {'ref': ref, 'text': text})
516
563
  return response
517
564
 
565
+ @action_logger
566
+ async def type_multiple(
567
+ self, inputs: List[Dict[str, str]]
568
+ ) -> Dict[str, Any]:
569
+ """Type text into multiple elements."""
570
+ response = await self._send_command('type', {'inputs': inputs})
571
+ return response
572
+
518
573
  @action_logger
519
574
  async def select(self, ref: str, value: str) -> Dict[str, Any]:
520
575
  """Select an option."""