camel-ai 0.2.54__tar.gz → 0.2.55__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 (406) hide show
  1. {camel_ai-0.2.54 → camel_ai-0.2.55}/PKG-INFO +1 -1
  2. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/__init__.py +1 -1
  3. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/agents/chat_agent.py +18 -12
  4. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/model_factory.py +45 -73
  5. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/__init__.py +2 -0
  6. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/klavis_toolkit.py +57 -13
  7. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/mcp_toolkit.py +55 -16
  8. camel_ai-0.2.55/camel/toolkits/pulse_mcp_search_toolkit.py +132 -0
  9. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/types/enums.py +16 -0
  10. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/utils/__init__.py +2 -1
  11. camel_ai-0.2.55/camel/utils/response_format.py +145 -0
  12. {camel_ai-0.2.54 → camel_ai-0.2.55}/pyproject.toml +1 -1
  13. camel_ai-0.2.54/camel/utils/response_format.py +0 -63
  14. {camel_ai-0.2.54 → camel_ai-0.2.55}/.gitignore +0 -0
  15. {camel_ai-0.2.54 → camel_ai-0.2.55}/LICENSE +0 -0
  16. {camel_ai-0.2.54 → camel_ai-0.2.55}/README.md +0 -0
  17. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/agents/__init__.py +0 -0
  18. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/agents/_types.py +0 -0
  19. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/agents/_utils.py +0 -0
  20. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/agents/base.py +0 -0
  21. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/agents/critic_agent.py +0 -0
  22. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/agents/deductive_reasoner_agent.py +0 -0
  23. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/agents/embodied_agent.py +0 -0
  24. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/agents/knowledge_graph_agent.py +0 -0
  25. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/agents/mcp_agent.py +0 -0
  26. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/agents/multi_hop_generator_agent.py +0 -0
  27. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/agents/programmed_agent_instruction.py +0 -0
  28. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/agents/repo_agent.py +0 -0
  29. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/agents/role_assignment_agent.py +0 -0
  30. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/agents/search_agent.py +0 -0
  31. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/agents/task_agent.py +0 -0
  32. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/agents/tool_agents/__init__.py +0 -0
  33. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/agents/tool_agents/base.py +0 -0
  34. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/agents/tool_agents/hugging_face_tool_agent.py +0 -0
  35. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/benchmarks/__init__.py +0 -0
  36. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/benchmarks/apibank.py +0 -0
  37. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/benchmarks/apibench.py +0 -0
  38. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/benchmarks/base.py +0 -0
  39. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/benchmarks/gaia.py +0 -0
  40. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/benchmarks/nexus.py +0 -0
  41. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/benchmarks/ragbench.py +0 -0
  42. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/bots/__init__.py +0 -0
  43. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/bots/discord/__init__.py +0 -0
  44. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/bots/discord/discord_app.py +0 -0
  45. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/bots/discord/discord_installation.py +0 -0
  46. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/bots/discord/discord_store.py +0 -0
  47. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/bots/slack/__init__.py +0 -0
  48. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/bots/slack/models.py +0 -0
  49. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/bots/slack/slack_app.py +0 -0
  50. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/bots/telegram_bot.py +0 -0
  51. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/__init__.py +0 -0
  52. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/aiml_config.py +0 -0
  53. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/anthropic_config.py +0 -0
  54. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/base_config.py +0 -0
  55. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/bedrock_config.py +0 -0
  56. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/cohere_config.py +0 -0
  57. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/deepseek_config.py +0 -0
  58. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/gemini_config.py +0 -0
  59. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/groq_config.py +0 -0
  60. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/internlm_config.py +0 -0
  61. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/litellm_config.py +0 -0
  62. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/lmstudio_config.py +0 -0
  63. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/mistral_config.py +0 -0
  64. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/modelscope_config.py +0 -0
  65. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/moonshot_config.py +0 -0
  66. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/netmind_config.py +0 -0
  67. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/novita_config.py +0 -0
  68. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/nvidia_config.py +0 -0
  69. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/ollama_config.py +0 -0
  70. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/openai_config.py +0 -0
  71. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/openrouter_config.py +0 -0
  72. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/ppio_config.py +0 -0
  73. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/qwen_config.py +0 -0
  74. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/reka_config.py +0 -0
  75. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/samba_config.py +0 -0
  76. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/sglang_config.py +0 -0
  77. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/siliconflow_config.py +0 -0
  78. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/togetherai_config.py +0 -0
  79. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/vllm_config.py +0 -0
  80. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/watsonx_config.py +0 -0
  81. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/yi_config.py +0 -0
  82. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/configs/zhipuai_config.py +0 -0
  83. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/data_collector/__init__.py +0 -0
  84. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/data_collector/alpaca_collector.py +0 -0
  85. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/data_collector/base.py +0 -0
  86. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/data_collector/sharegpt_collector.py +0 -0
  87. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datagen/__init__.py +0 -0
  88. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datagen/cot_datagen.py +0 -0
  89. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datagen/evol_instruct/__init__.py +0 -0
  90. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datagen/evol_instruct/evol_instruct.py +0 -0
  91. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datagen/evol_instruct/scorer.py +0 -0
  92. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datagen/evol_instruct/templates.py +0 -0
  93. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datagen/self_improving_cot.py +0 -0
  94. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datagen/self_instruct/__init__.py +0 -0
  95. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datagen/self_instruct/filter/__init__.py +0 -0
  96. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datagen/self_instruct/filter/filter_function.py +0 -0
  97. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datagen/self_instruct/filter/filter_registry.py +0 -0
  98. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datagen/self_instruct/filter/instruction_filter.py +0 -0
  99. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datagen/self_instruct/self_instruct.py +0 -0
  100. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datagen/self_instruct/templates.py +0 -0
  101. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datagen/source2synth/__init__.py +0 -0
  102. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datagen/source2synth/data_processor.py +0 -0
  103. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datagen/source2synth/models.py +0 -0
  104. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datagen/source2synth/user_data_processor_config.py +0 -0
  105. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datahubs/__init__.py +0 -0
  106. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datahubs/base.py +0 -0
  107. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datahubs/huggingface.py +0 -0
  108. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datahubs/models.py +0 -0
  109. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datasets/__init__.py +0 -0
  110. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datasets/base_generator.py +0 -0
  111. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datasets/few_shot_generator.py +0 -0
  112. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datasets/models.py +0 -0
  113. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datasets/self_instruct_generator.py +0 -0
  114. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/datasets/static_dataset.py +0 -0
  115. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/embeddings/__init__.py +0 -0
  116. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/embeddings/azure_embedding.py +0 -0
  117. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/embeddings/base.py +0 -0
  118. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/embeddings/gemini_embedding.py +0 -0
  119. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/embeddings/jina_embedding.py +0 -0
  120. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/embeddings/mistral_embedding.py +0 -0
  121. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/embeddings/openai_compatible_embedding.py +0 -0
  122. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/embeddings/openai_embedding.py +0 -0
  123. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/embeddings/sentence_transformers_embeddings.py +0 -0
  124. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/embeddings/together_embedding.py +0 -0
  125. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/embeddings/vlm_embedding.py +0 -0
  126. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/environments/__init__.py +0 -0
  127. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/environments/models.py +0 -0
  128. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/environments/multi_step.py +0 -0
  129. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/environments/single_step.py +0 -0
  130. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/environments/tic_tac_toe.py +0 -0
  131. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/extractors/__init__.py +0 -0
  132. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/extractors/base.py +0 -0
  133. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/extractors/python_strategies.py +0 -0
  134. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/generators.py +0 -0
  135. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/human.py +0 -0
  136. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/interpreters/__init__.py +0 -0
  137. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/interpreters/base.py +0 -0
  138. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/interpreters/docker/Dockerfile +0 -0
  139. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/interpreters/docker_interpreter.py +0 -0
  140. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/interpreters/e2b_interpreter.py +0 -0
  141. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/interpreters/internal_python_interpreter.py +0 -0
  142. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/interpreters/interpreter_error.py +0 -0
  143. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/interpreters/ipython_interpreter.py +0 -0
  144. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/interpreters/subprocess_interpreter.py +0 -0
  145. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/loaders/__init__.py +0 -0
  146. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/loaders/apify_reader.py +0 -0
  147. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/loaders/base_io.py +0 -0
  148. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/loaders/chunkr_reader.py +0 -0
  149. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/loaders/crawl4ai_reader.py +0 -0
  150. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/loaders/firecrawl_reader.py +0 -0
  151. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/loaders/jina_url_reader.py +0 -0
  152. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/loaders/mineru_extractor.py +0 -0
  153. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/loaders/pandas_reader.py +0 -0
  154. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/loaders/scrapegraph_reader.py +0 -0
  155. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/loaders/unstructured_io.py +0 -0
  156. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/logger.py +0 -0
  157. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/memories/__init__.py +0 -0
  158. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/memories/agent_memories.py +0 -0
  159. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/memories/base.py +0 -0
  160. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/memories/blocks/__init__.py +0 -0
  161. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/memories/blocks/chat_history_block.py +0 -0
  162. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/memories/blocks/vectordb_block.py +0 -0
  163. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/memories/context_creators/__init__.py +0 -0
  164. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/memories/context_creators/score_based.py +0 -0
  165. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/memories/records.py +0 -0
  166. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/messages/__init__.py +0 -0
  167. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/messages/base.py +0 -0
  168. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/messages/conversion/__init__.py +0 -0
  169. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/messages/conversion/alpaca.py +0 -0
  170. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/messages/conversion/conversation_models.py +0 -0
  171. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/messages/conversion/sharegpt/__init__.py +0 -0
  172. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/messages/conversion/sharegpt/function_call_formatter.py +0 -0
  173. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/messages/conversion/sharegpt/hermes/__init__.py +0 -0
  174. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +0 -0
  175. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/messages/func_message.py +0 -0
  176. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/__init__.py +0 -0
  177. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/_utils.py +0 -0
  178. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/aiml_model.py +0 -0
  179. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/anthropic_model.py +0 -0
  180. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/aws_bedrock_model.py +0 -0
  181. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/azure_openai_model.py +0 -0
  182. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/base_audio_model.py +0 -0
  183. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/base_model.py +0 -0
  184. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/cohere_model.py +0 -0
  185. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/deepseek_model.py +0 -0
  186. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/fish_audio_model.py +0 -0
  187. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/gemini_model.py +0 -0
  188. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/groq_model.py +0 -0
  189. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/internlm_model.py +0 -0
  190. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/litellm_model.py +0 -0
  191. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/lmstudio_model.py +0 -0
  192. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/mistral_model.py +0 -0
  193. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/model_manager.py +0 -0
  194. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/modelscope_model.py +0 -0
  195. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/moonshot_model.py +0 -0
  196. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/nemotron_model.py +0 -0
  197. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/netmind_model.py +0 -0
  198. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/novita_model.py +0 -0
  199. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/nvidia_model.py +0 -0
  200. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/ollama_model.py +0 -0
  201. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/openai_audio_models.py +0 -0
  202. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/openai_compatible_model.py +0 -0
  203. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/openai_model.py +0 -0
  204. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/openrouter_model.py +0 -0
  205. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/ppio_model.py +0 -0
  206. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/qwen_model.py +0 -0
  207. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/reka_model.py +0 -0
  208. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/reward/__init__.py +0 -0
  209. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/reward/base_reward_model.py +0 -0
  210. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/reward/evaluator.py +0 -0
  211. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/reward/nemotron_model.py +0 -0
  212. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/reward/skywork_model.py +0 -0
  213. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/samba_model.py +0 -0
  214. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/sglang_model.py +0 -0
  215. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/siliconflow_model.py +0 -0
  216. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/stub_model.py +0 -0
  217. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/togetherai_model.py +0 -0
  218. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/vllm_model.py +0 -0
  219. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/volcano_model.py +0 -0
  220. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/watsonx_model.py +0 -0
  221. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/yi_model.py +0 -0
  222. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/models/zhipuai_model.py +0 -0
  223. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/personas/__init__.py +0 -0
  224. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/personas/persona.py +0 -0
  225. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/personas/persona_hub.py +0 -0
  226. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/prompts/__init__.py +0 -0
  227. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/prompts/ai_society.py +0 -0
  228. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/prompts/base.py +0 -0
  229. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/prompts/code.py +0 -0
  230. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/prompts/evaluation.py +0 -0
  231. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/prompts/generate_text_embedding_data.py +0 -0
  232. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/prompts/image_craft.py +0 -0
  233. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/prompts/misalignment.py +0 -0
  234. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/prompts/multi_condition_image_craft.py +0 -0
  235. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/prompts/object_recognition.py +0 -0
  236. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/prompts/persona_hub.py +0 -0
  237. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/prompts/prompt_templates.py +0 -0
  238. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/prompts/role_description_prompt_template.py +0 -0
  239. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/prompts/solution_extraction.py +0 -0
  240. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/prompts/task_prompt_template.py +0 -0
  241. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/prompts/translation.py +0 -0
  242. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/prompts/video_description_prompt.py +0 -0
  243. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/py.typed +0 -0
  244. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/responses/__init__.py +0 -0
  245. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/responses/agent_responses.py +0 -0
  246. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/retrievers/__init__.py +0 -0
  247. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/retrievers/auto_retriever.py +0 -0
  248. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/retrievers/base.py +0 -0
  249. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/retrievers/bm25_retriever.py +0 -0
  250. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/retrievers/cohere_rerank_retriever.py +0 -0
  251. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/retrievers/hybrid_retrival.py +0 -0
  252. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/retrievers/vector_retriever.py +0 -0
  253. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/runtime/__init__.py +0 -0
  254. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/runtime/api.py +0 -0
  255. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/runtime/base.py +0 -0
  256. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/runtime/configs.py +0 -0
  257. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/runtime/daytona_runtime.py +0 -0
  258. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/runtime/docker_runtime.py +0 -0
  259. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/runtime/llm_guard_runtime.py +0 -0
  260. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/runtime/remote_http_runtime.py +0 -0
  261. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/runtime/ubuntu_docker_runtime.py +0 -0
  262. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/runtime/utils/__init__.py +0 -0
  263. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/runtime/utils/function_risk_toolkit.py +0 -0
  264. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/runtime/utils/ignore_risk_toolkit.py +0 -0
  265. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/schemas/__init__.py +0 -0
  266. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/schemas/base.py +0 -0
  267. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/schemas/openai_converter.py +0 -0
  268. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/schemas/outlines_converter.py +0 -0
  269. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/societies/__init__.py +0 -0
  270. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/societies/babyagi_playing.py +0 -0
  271. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/societies/role_playing.py +0 -0
  272. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/societies/workforce/__init__.py +0 -0
  273. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/societies/workforce/base.py +0 -0
  274. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/societies/workforce/prompts.py +0 -0
  275. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/societies/workforce/role_playing_worker.py +0 -0
  276. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/societies/workforce/single_agent_worker.py +0 -0
  277. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/societies/workforce/task_channel.py +0 -0
  278. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/societies/workforce/utils.py +0 -0
  279. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/societies/workforce/worker.py +0 -0
  280. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/societies/workforce/workforce.py +0 -0
  281. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/storages/__init__.py +0 -0
  282. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/storages/graph_storages/__init__.py +0 -0
  283. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/storages/graph_storages/base.py +0 -0
  284. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/storages/graph_storages/graph_element.py +0 -0
  285. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/storages/graph_storages/nebula_graph.py +0 -0
  286. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/storages/graph_storages/neo4j_graph.py +0 -0
  287. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/storages/key_value_storages/__init__.py +0 -0
  288. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/storages/key_value_storages/base.py +0 -0
  289. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/storages/key_value_storages/in_memory.py +0 -0
  290. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/storages/key_value_storages/json.py +0 -0
  291. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/storages/key_value_storages/mem0_cloud.py +0 -0
  292. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/storages/key_value_storages/redis.py +0 -0
  293. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/storages/object_storages/__init__.py +0 -0
  294. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/storages/object_storages/amazon_s3.py +0 -0
  295. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/storages/object_storages/azure_blob.py +0 -0
  296. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/storages/object_storages/base.py +0 -0
  297. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/storages/object_storages/google_cloud.py +0 -0
  298. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/storages/vectordb_storages/__init__.py +0 -0
  299. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/storages/vectordb_storages/base.py +0 -0
  300. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/storages/vectordb_storages/milvus.py +0 -0
  301. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/storages/vectordb_storages/oceanbase.py +0 -0
  302. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/storages/vectordb_storages/qdrant.py +0 -0
  303. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/storages/vectordb_storages/tidb.py +0 -0
  304. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/tasks/__init__.py +0 -0
  305. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/tasks/task.py +0 -0
  306. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/tasks/task_prompt.py +0 -0
  307. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/terminators/__init__.py +0 -0
  308. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/terminators/base.py +0 -0
  309. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/terminators/response_terminator.py +0 -0
  310. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/terminators/token_limit_terminator.py +0 -0
  311. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/aci_toolkit.py +0 -0
  312. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/arxiv_toolkit.py +0 -0
  313. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/ask_news_toolkit.py +0 -0
  314. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/audio_analysis_toolkit.py +0 -0
  315. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/base.py +0 -0
  316. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/browser_toolkit.py +0 -0
  317. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/code_execution.py +0 -0
  318. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/dalle_toolkit.py +0 -0
  319. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/dappier_toolkit.py +0 -0
  320. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/data_commons_toolkit.py +0 -0
  321. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/excel_toolkit.py +0 -0
  322. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/file_write_toolkit.py +0 -0
  323. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/function_tool.py +0 -0
  324. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/github_toolkit.py +0 -0
  325. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/google_calendar_toolkit.py +0 -0
  326. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/google_maps_toolkit.py +0 -0
  327. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/google_scholar_toolkit.py +0 -0
  328. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/human_toolkit.py +0 -0
  329. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/image_analysis_toolkit.py +0 -0
  330. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/jina_reranker_toolkit.py +0 -0
  331. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/linkedin_toolkit.py +0 -0
  332. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/math_toolkit.py +0 -0
  333. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/memory_toolkit.py +0 -0
  334. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/meshy_toolkit.py +0 -0
  335. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/mineru_toolkit.py +0 -0
  336. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/networkx_toolkit.py +0 -0
  337. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/notion_toolkit.py +0 -0
  338. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_specs/biztoc/__init__.py +0 -0
  339. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_specs/biztoc/ai-plugin.json +0 -0
  340. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_specs/biztoc/openapi.yaml +0 -0
  341. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_specs/coursera/__init__.py +0 -0
  342. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_specs/coursera/openapi.yaml +0 -0
  343. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_specs/create_qr_code/__init__.py +0 -0
  344. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_specs/create_qr_code/openapi.yaml +0 -0
  345. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_specs/klarna/__init__.py +0 -0
  346. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_specs/klarna/openapi.yaml +0 -0
  347. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_specs/nasa_apod/__init__.py +0 -0
  348. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_specs/nasa_apod/openapi.yaml +0 -0
  349. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_specs/outschool/__init__.py +0 -0
  350. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_specs/outschool/ai-plugin.json +0 -0
  351. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_specs/outschool/openapi.yaml +0 -0
  352. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_specs/outschool/paths/__init__.py +0 -0
  353. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_specs/outschool/paths/get_classes.py +0 -0
  354. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +0 -0
  355. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_specs/security_config.py +0 -0
  356. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_specs/speak/__init__.py +0 -0
  357. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_specs/speak/openapi.yaml +0 -0
  358. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_specs/web_scraper/__init__.py +0 -0
  359. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +0 -0
  360. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_specs/web_scraper/openapi.yaml +0 -0
  361. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +0 -0
  362. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +0 -0
  363. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/open_api_toolkit.py +0 -0
  364. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/openai_agent_toolkit.py +0 -0
  365. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/openbb_toolkit.py +0 -0
  366. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/page_script.js +0 -0
  367. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/pubmed_toolkit.py +0 -0
  368. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/pyautogui_toolkit.py +0 -0
  369. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/reddit_toolkit.py +0 -0
  370. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/retrieval_toolkit.py +0 -0
  371. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/search_toolkit.py +0 -0
  372. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/searxng_toolkit.py +0 -0
  373. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/semantic_scholar_toolkit.py +0 -0
  374. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/slack_toolkit.py +0 -0
  375. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/stripe_toolkit.py +0 -0
  376. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/sympy_toolkit.py +0 -0
  377. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/terminal_toolkit.py +0 -0
  378. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/thinking_toolkit.py +0 -0
  379. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/twitter_toolkit.py +0 -0
  380. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/video_analysis_toolkit.py +0 -0
  381. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/video_download_toolkit.py +0 -0
  382. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/weather_toolkit.py +0 -0
  383. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/whatsapp_toolkit.py +0 -0
  384. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/toolkits/zapier_toolkit.py +0 -0
  385. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/types/__init__.py +0 -0
  386. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/types/agents/__init__.py +0 -0
  387. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/types/agents/tool_calling_record.py +0 -0
  388. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/types/openai_types.py +0 -0
  389. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/types/unified_model_type.py +0 -0
  390. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/utils/async_func.py +0 -0
  391. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/utils/chunker/__init__.py +0 -0
  392. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/utils/chunker/base.py +0 -0
  393. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/utils/chunker/code_chunker.py +0 -0
  394. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/utils/chunker/uio_chunker.py +0 -0
  395. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/utils/commons.py +0 -0
  396. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/utils/constants.py +0 -0
  397. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/utils/deduplication.py +0 -0
  398. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/utils/filename.py +0 -0
  399. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/utils/mcp.py +0 -0
  400. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/utils/token_counting.py +0 -0
  401. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/verifiers/__init__.py +0 -0
  402. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/verifiers/base.py +0 -0
  403. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/verifiers/math_verifier.py +0 -0
  404. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/verifiers/models.py +0 -0
  405. {camel_ai-0.2.54 → camel_ai-0.2.55}/camel/verifiers/physics_verifier.py +0 -0
  406. {camel_ai-0.2.54 → camel_ai-0.2.55}/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.54
3
+ Version: 0.2.55
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.54'
17
+ __version__ = '0.2.55'
18
18
 
19
19
  __all__ = [
20
20
  '__version__',
@@ -752,7 +752,7 @@ class ChatAgent(BaseAgent):
752
752
  try:
753
753
  openai_messages, num_tokens = self.memory.get_context()
754
754
  except RuntimeError as e:
755
- return self._step_token_exceed(
755
+ return self._step_terminate(
756
756
  e.args[1], tool_call_records, "max_tokens_exceeded"
757
757
  )
758
758
  # Get response from model backend
@@ -765,8 +765,8 @@ class ChatAgent(BaseAgent):
765
765
 
766
766
  # Terminate Agent if stop_event is set
767
767
  if self.stop_event and self.stop_event.is_set():
768
- # Use the _step_token_exceed to terminate the agent with reason
769
- return self._step_token_exceed(
768
+ # Use the _step_terminate to terminate the agent with reason
769
+ return self._step_terminate(
770
770
  num_tokens, tool_call_records, "termination_triggered"
771
771
  )
772
772
 
@@ -851,7 +851,7 @@ class ChatAgent(BaseAgent):
851
851
  try:
852
852
  openai_messages, num_tokens = self.memory.get_context()
853
853
  except RuntimeError as e:
854
- return self._step_token_exceed(
854
+ return self._step_terminate(
855
855
  e.args[1], tool_call_records, "max_tokens_exceeded"
856
856
  )
857
857
 
@@ -864,8 +864,8 @@ class ChatAgent(BaseAgent):
864
864
 
865
865
  # Terminate Agent if stop_event is set
866
866
  if self.stop_event and self.stop_event.is_set():
867
- # Use the _step_token_exceed to terminate the agent with reason
868
- return self._step_token_exceed(
867
+ # Use the _step_terminate to terminate the agent with reason
868
+ return self._step_terminate(
869
869
  num_tokens, tool_call_records, "termination_triggered"
870
870
  )
871
871
 
@@ -1396,24 +1396,30 @@ class ChatAgent(BaseAgent):
1396
1396
  )
1397
1397
  output_messages.append(chat_message)
1398
1398
 
1399
- def _step_token_exceed(
1399
+ def _step_terminate(
1400
1400
  self,
1401
1401
  num_tokens: int,
1402
1402
  tool_calls: List[ToolCallingRecord],
1403
1403
  termination_reason: str,
1404
1404
  ) -> ChatAgentResponse:
1405
- r"""Return trivial response containing number of tokens and information
1406
- of called functions when the number of tokens exceeds.
1405
+ r"""Create a response when the agent execution is terminated.
1406
+
1407
+ This method is called when the agent needs to terminate its execution
1408
+ due to various reasons such as token limit exceeded, or other
1409
+ termination conditions. It creates a response with empty messages but
1410
+ includes termination information in the info dictionary.
1407
1411
 
1408
1412
  Args:
1409
1413
  num_tokens (int): Number of tokens in the messages.
1410
1414
  tool_calls (List[ToolCallingRecord]): List of information
1411
1415
  objects of functions called in the current step.
1412
- termination_reason (str): String of termination reason.
1416
+ termination_reason (str): String describing the reason for
1417
+ termination.
1413
1418
 
1414
1419
  Returns:
1415
- ChatAgentResponse: The struct containing trivial outputs and
1416
- information about token number and called functions.
1420
+ ChatAgentResponse: A response object with empty message list,
1421
+ terminated flag set to True, and an info dictionary containing
1422
+ termination details, token counts, and tool call information.
1417
1423
  """
1418
1424
  self.terminated = True
1419
1425
 
@@ -12,7 +12,7 @@
12
12
  # limitations under the License.
13
13
  # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
  import json
15
- from typing import Dict, Optional, Type, Union
15
+ from typing import ClassVar, Dict, Optional, Type, Union
16
16
 
17
17
  import yaml
18
18
 
@@ -62,6 +62,44 @@ class ModelFactory:
62
62
  ValueError: in case the provided model type is unknown.
63
63
  """
64
64
 
65
+ _MODEL_PLATFORM_TO_CLASS_MAP: ClassVar[
66
+ Dict[ModelPlatformType, Type[BaseModelBackend]]
67
+ ] = {
68
+ ModelPlatformType.OLLAMA: OllamaModel,
69
+ ModelPlatformType.VLLM: VLLMModel,
70
+ ModelPlatformType.SGLANG: SGLangModel,
71
+ ModelPlatformType.OPENAI_COMPATIBLE_MODEL: OpenAICompatibleModel,
72
+ ModelPlatformType.SAMBA: SambaModel,
73
+ ModelPlatformType.TOGETHER: TogetherAIModel,
74
+ ModelPlatformType.LITELLM: LiteLLMModel,
75
+ ModelPlatformType.AWS_BEDROCK: AWSBedrockModel,
76
+ ModelPlatformType.NVIDIA: NvidiaModel,
77
+ ModelPlatformType.SILICONFLOW: SiliconFlowModel,
78
+ ModelPlatformType.AIML: AIMLModel,
79
+ ModelPlatformType.VOLCANO: VolcanoModel,
80
+ ModelPlatformType.NETMIND: NetmindModel,
81
+ ModelPlatformType.OPENAI: OpenAIModel,
82
+ ModelPlatformType.AZURE: AzureOpenAIModel,
83
+ ModelPlatformType.ANTHROPIC: AnthropicModel,
84
+ ModelPlatformType.GROQ: GroqModel,
85
+ ModelPlatformType.LMSTUDIO: LMStudioModel,
86
+ ModelPlatformType.OPENROUTER: OpenRouterModel,
87
+ ModelPlatformType.ZHIPU: ZhipuAIModel,
88
+ ModelPlatformType.GEMINI: GeminiModel,
89
+ ModelPlatformType.MISTRAL: MistralModel,
90
+ ModelPlatformType.REKA: RekaModel,
91
+ ModelPlatformType.COHERE: CohereModel,
92
+ ModelPlatformType.YI: YiModel,
93
+ ModelPlatformType.QWEN: QwenModel,
94
+ ModelPlatformType.DEEPSEEK: DeepSeekModel,
95
+ ModelPlatformType.PPIO: PPIOModel,
96
+ ModelPlatformType.INTERNLM: InternLMModel,
97
+ ModelPlatformType.MOONSHOT: MoonshotModel,
98
+ ModelPlatformType.MODELSCOPE: ModelScopeModel,
99
+ ModelPlatformType.NOVITA: NovitaModel,
100
+ ModelPlatformType.WATSONX: WatsonXModel,
101
+ }
102
+
65
103
  @staticmethod
66
104
  def create(
67
105
  model_platform: Union[ModelPlatformType, str],
@@ -124,81 +162,15 @@ class ModelFactory:
124
162
  model_class: Optional[Type[BaseModelBackend]] = None
125
163
  model_type = UnifiedModelType(model_type)
126
164
 
127
- if model_platform.is_ollama:
128
- model_class = OllamaModel
129
- elif model_platform.is_vllm:
130
- model_class = VLLMModel
131
- elif model_platform.is_sglang:
132
- model_class = SGLangModel
133
- elif model_platform.is_openai_compatible_model:
134
- model_class = OpenAICompatibleModel
135
- elif model_platform.is_samba:
136
- model_class = SambaModel
137
- elif model_platform.is_together:
138
- model_class = TogetherAIModel
139
- elif model_platform.is_litellm:
140
- model_class = LiteLLMModel
141
- elif model_platform.is_aws_bedrock:
142
- model_class = AWSBedrockModel
143
- elif model_platform.is_nvidia:
144
- model_class = NvidiaModel
145
- elif model_platform.is_siliconflow:
146
- model_class = SiliconFlowModel
147
- elif model_platform.is_aiml:
148
- model_class = AIMLModel
149
- elif model_platform.is_volcano:
150
- model_class = VolcanoModel
151
- elif model_platform.is_netmind:
152
- model_class = NetmindModel
153
-
154
- elif model_platform.is_openai and model_type.is_openai:
155
- model_class = OpenAIModel
156
- elif model_platform.is_azure and model_type.is_azure_openai:
157
- model_class = AzureOpenAIModel
158
- elif model_platform.is_anthropic and model_type.is_anthropic:
159
- model_class = AnthropicModel
160
- elif model_platform.is_groq and model_type.is_groq:
161
- model_class = GroqModel
162
- elif model_platform.is_lmstudio and model_type.is_lmstudio:
163
- model_class = LMStudioModel
164
- elif model_platform.is_openrouter and model_type.is_openrouter:
165
- model_class = OpenRouterModel
166
- elif model_platform.is_zhipuai and model_type.is_zhipuai:
167
- model_class = ZhipuAIModel
168
- elif model_platform.is_gemini and model_type.is_gemini:
169
- model_class = GeminiModel
170
- elif model_platform.is_mistral and model_type.is_mistral:
171
- model_class = MistralModel
172
- elif model_platform.is_reka and model_type.is_reka:
173
- model_class = RekaModel
174
- elif model_platform.is_cohere and model_type.is_cohere:
175
- model_class = CohereModel
176
- elif model_platform.is_yi and model_type.is_yi:
177
- model_class = YiModel
178
- elif model_platform.is_qwen and model_type.is_qwen:
179
- model_class = QwenModel
180
- elif model_platform.is_deepseek:
181
- model_class = DeepSeekModel
182
- elif model_platform.is_ppio:
183
- model_class = PPIOModel
184
- elif model_platform.is_internlm and model_type.is_internlm:
185
- model_class = InternLMModel
186
- elif model_platform.is_moonshot and model_type.is_moonshot:
187
- model_class = MoonshotModel
188
- elif model_platform.is_modelscope:
189
- model_class = ModelScopeModel
190
- elif model_platform.is_novita:
191
- model_class = NovitaModel
192
- elif model_type == ModelType.STUB:
165
+ model_class = ModelFactory._MODEL_PLATFORM_TO_CLASS_MAP.get(
166
+ model_platform
167
+ )
168
+
169
+ if model_type == ModelType.STUB:
193
170
  model_class = StubModel
194
- elif model_type.is_watsonx:
195
- model_class = WatsonXModel
196
171
 
197
172
  if model_class is None:
198
- raise ValueError(
199
- f"Unknown pair of model platform `{model_platform}` "
200
- f"and model type `{model_type}`."
201
- )
173
+ raise ValueError(f"Unknown model platform `{model_platform}`")
202
174
 
203
175
  return model_class(
204
176
  model_type=model_type,
@@ -68,6 +68,7 @@ from .pyautogui_toolkit import PyAutoGUIToolkit
68
68
  from .openai_agent_toolkit import OpenAIAgentToolkit
69
69
  from .searxng_toolkit import SearxNGToolkit
70
70
  from .jina_reranker_toolkit import JinaRerankerToolkit
71
+ from .pulse_mcp_search_toolkit import PulseMCPSearchToolkit
71
72
  from .klavis_toolkit import KlavisToolkit
72
73
  from .aci_toolkit import ACIToolkit
73
74
 
@@ -126,6 +127,7 @@ __all__ = [
126
127
  'OpenAIAgentToolkit',
127
128
  'SearxNGToolkit',
128
129
  'JinaRerankerToolkit',
130
+ 'PulseMCPSearchToolkit',
129
131
  'KlavisToolkit',
130
132
  'ACIToolkit',
131
133
  ]
@@ -13,6 +13,7 @@
13
13
  # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
 
15
15
  import os
16
+ import urllib.parse
16
17
  from typing import Any, Dict, List, Optional
17
18
 
18
19
  import requests
@@ -169,18 +170,6 @@ class KlavisToolkit(BaseToolkit):
169
170
  endpoint = f"/mcp-server/instance/delete/{instance_id}"
170
171
  return self._request('DELETE', endpoint)
171
172
 
172
- def get_server_tools(self, server_name: str) -> Dict[str, Any]:
173
- r"""Get list of tool names for a specific MCP server.
174
-
175
- Args:
176
- server_name (str): The name of the target MCP server.
177
-
178
- Returns:
179
- Dict[str, Any]: List of tools available for the specified server.
180
- """
181
- endpoint = f"/mcp-server/tools/{server_name}"
182
- return self._request('GET', endpoint)
183
-
184
173
  def get_all_servers(self) -> Dict[str, Any]:
185
174
  r"""Get all MCP servers with their basic information.
186
175
 
@@ -209,6 +198,60 @@ class KlavisToolkit(BaseToolkit):
209
198
  'POST', endpoint, payload=payload, additional_headers=headers
210
199
  )
211
200
 
201
+ def list_tools(self, server_url: str) -> Dict[str, Any]:
202
+ r"""Lists all tools available for a specific remote MCP server.
203
+
204
+ Args:
205
+ server_url (str): The full URL for connecting to the MCP server
206
+ via Server-Sent Events (SSE).
207
+
208
+ Returns:
209
+ Dict[str, Any]: Response containing the list of tools or an error.
210
+ """
211
+
212
+ encoded_server_url = urllib.parse.quote(server_url, safe='')
213
+ endpoint = f"/mcp-server/list-tools/{encoded_server_url}"
214
+ return self._request('GET', endpoint)
215
+
216
+ def call_tool(
217
+ self,
218
+ server_url: str,
219
+ tool_name: str,
220
+ tool_args: Optional[Dict[str, Any]] = None,
221
+ ) -> Dict[str, Any]:
222
+ r"""Calls a remote MCP server tool directly using the provided server
223
+ URL.
224
+
225
+ Args:
226
+ server_url (str): The full URL for connecting to the MCP server
227
+ via Server-Sent Events (SSE).
228
+ tool_name (str): The name of the tool to call.
229
+ tool_args (Optional[Dict[str, Any]]): The input parameters for
230
+ the tool. Defaults to None, which might be treated as empty
231
+ args by the server. (default: :obj:`None`)
232
+
233
+ Returns:
234
+ Dict[str, Any]: Response containing the result of the tool call
235
+ or an error.
236
+ """
237
+ endpoint = "/mcp-server/call-tool"
238
+ payload: Dict[str, Any] = {
239
+ "serverUrl": server_url,
240
+ "toolName": tool_name,
241
+ }
242
+ # Add toolArgs only if provided, otherwise server might expect empty
243
+ # dict
244
+ if tool_args is not None:
245
+ payload["toolArgs"] = tool_args
246
+ else:
247
+ # Explicitly setting to empty dict based on schema interpretation
248
+ payload["toolArgs"] = {}
249
+
250
+ headers = {'Content-Type': 'application/json'}
251
+ return self._request(
252
+ 'POST', endpoint, payload=payload, additional_headers=headers
253
+ )
254
+
212
255
  def get_tools(self) -> List[FunctionTool]:
213
256
  r"""Returns a list of FunctionTool objects representing the functions
214
257
  in the toolkit.
@@ -222,7 +265,8 @@ class KlavisToolkit(BaseToolkit):
222
265
  FunctionTool(self.get_server_instance),
223
266
  FunctionTool(self.delete_auth_data),
224
267
  FunctionTool(self.delete_server_instance),
225
- FunctionTool(self.get_server_tools),
226
268
  FunctionTool(self.get_all_servers),
227
269
  FunctionTool(self.set_auth_token),
270
+ FunctionTool(self.list_tools),
271
+ FunctionTool(self.call_tool),
228
272
  ]
@@ -16,6 +16,7 @@ import json
16
16
  import os
17
17
  import shlex
18
18
  from contextlib import AsyncExitStack, asynccontextmanager
19
+ from datetime import timedelta
19
20
  from typing import (
20
21
  TYPE_CHECKING,
21
22
  Any,
@@ -52,14 +53,15 @@ class MCPClient(BaseToolkit):
52
53
 
53
54
  Attributes:
54
55
  command_or_url (str): URL for SSE mode or command executable for stdio
55
- mode. (default: :obj:`'None'`)
56
+ mode. (default: :obj:`None`)
56
57
  args (List[str]): List of command-line arguments if stdio mode is used.
57
- (default: :obj:`'None'`)
58
+ (default: :obj:`None`)
58
59
  env (Dict[str, str]): Environment variables for the stdio mode command.
59
- (default: :obj:`'None'`)
60
- timeout (Optional[float]): Connection timeout. (default: :obj:`'None'`)
60
+ (default: :obj:`None`)
61
+ timeout (Optional[float]): Connection timeout.
62
+ (default: :obj:`None`)
61
63
  headers (Dict[str, str]): Headers for the HTTP request.
62
- (default: :obj:`'None'`)
64
+ (default: :obj:`None`)
63
65
  strict (Optional[bool]): Whether to enforce strict mode for the
64
66
  function call. (default: :obj:`False`)
65
67
  """
@@ -111,6 +113,7 @@ class MCPClient(BaseToolkit):
111
113
  sse_client(
112
114
  self.command_or_url,
113
115
  headers=self.headers,
116
+ timeout=self.timeout,
114
117
  )
115
118
  )
116
119
  else:
@@ -138,7 +141,11 @@ class MCPClient(BaseToolkit):
138
141
  )
139
142
 
140
143
  self._session = await self._exit_stack.enter_async_context(
141
- ClientSession(read_stream, write_stream)
144
+ ClientSession(
145
+ read_stream,
146
+ write_stream,
147
+ timedelta(seconds=self.timeout) if self.timeout else None,
148
+ )
142
149
  )
143
150
  await self._session.initialize()
144
151
  list_tools_result = await self.list_mcp_tools()
@@ -399,17 +406,20 @@ class MCPToolkit(BaseToolkit):
399
406
 
400
407
  Args:
401
408
  servers (Optional[List[MCPClient]]): List of MCPClient
402
- instances to manage.
409
+ instances to manage. (default: :obj:`None`)
403
410
  config_path (Optional[str]): Path to a JSON configuration file
404
- defining MCP servers.
411
+ defining MCP servers. (default: :obj:`None`)
412
+ config_dict (Optional[Dict[str, Any]]): Dictionary containing MCP
413
+ server configurations in the same format as the config file.
414
+ (default: :obj:`None`)
405
415
  strict (Optional[bool]): Whether to enforce strict mode for the
406
416
  function call. (default: :obj:`False`)
407
417
 
408
418
  Note:
409
- Either `servers` or `config_path` must be provided. If both are
410
- provided, servers from both sources will be combined.
419
+ Either `servers`, `config_path`, or `config_dict` must be provided.
420
+ If multiple are provided, servers from all sources will be combined.
411
421
 
412
- For web servers in the config file, you can specify authorization
422
+ For web servers in the config, you can specify authorization
413
423
  headers using the "headers" field to connect to protected MCP server
414
424
  endpoints.
415
425
 
@@ -438,14 +448,19 @@ class MCPToolkit(BaseToolkit):
438
448
  self,
439
449
  servers: Optional[List[MCPClient]] = None,
440
450
  config_path: Optional[str] = None,
451
+ config_dict: Optional[Dict[str, Any]] = None,
441
452
  strict: Optional[bool] = False,
442
453
  ):
443
454
  super().__init__()
444
455
 
445
- if servers and config_path:
456
+ sources_provided = sum(
457
+ 1 for src in [servers, config_path, config_dict] if src is not None
458
+ )
459
+ if sources_provided > 1:
446
460
  logger.warning(
447
- "Both servers and config_path are provided. "
448
- "Servers from both sources will be combined."
461
+ "Multiple configuration sources provided "
462
+ f"({sources_provided}). Servers from all sources "
463
+ "will be combined."
449
464
  )
450
465
 
451
466
  self.servers: List[MCPClient] = servers or []
@@ -455,6 +470,9 @@ class MCPToolkit(BaseToolkit):
455
470
  self._load_servers_from_config(config_path, strict)
456
471
  )
457
472
 
473
+ if config_dict:
474
+ self.servers.extend(self._load_servers_from_dict(config_dict))
475
+
458
476
  self._exit_stack = AsyncExitStack()
459
477
  self._connected = False
460
478
 
@@ -484,9 +502,25 @@ class MCPToolkit(BaseToolkit):
484
502
  logger.warning(f"Config file not found: '{config_path}'")
485
503
  raise e
486
504
 
505
+ return self._load_servers_from_dict(config=data, strict=strict)
506
+
507
+ def _load_servers_from_dict(
508
+ self, config: Dict[str, Any], strict: Optional[bool] = False
509
+ ) -> List[MCPClient]:
510
+ r"""Loads MCP server configurations from a dictionary.
511
+
512
+ Args:
513
+ config (Dict[str, Any]): Dictionary containing server
514
+ configurations.
515
+ strict (bool): Whether to enforce strict mode for the
516
+ function call. (default: :obj:`False`)
517
+
518
+ Returns:
519
+ List[MCPClient]: List of configured MCPClient instances.
520
+ """
487
521
  all_servers = []
488
522
 
489
- mcp_servers = data.get("mcpServers", {})
523
+ mcp_servers = config.get("mcpServers", {})
490
524
  if not isinstance(mcp_servers, dict):
491
525
  logger.warning("'mcpServers' is not a dictionary, skipping...")
492
526
  mcp_servers = {}
@@ -505,11 +539,16 @@ class MCPToolkit(BaseToolkit):
505
539
  )
506
540
  continue
507
541
 
542
+ # Include headers if provided in the configuration
543
+ headers = cfg.get("headers", {})
544
+
545
+ cmd_or_url = cast(str, cfg.get("command") or cfg.get("url"))
508
546
  server = MCPClient(
509
- command_or_url=cast(str, cfg.get("command") or cfg.get("url")),
547
+ command_or_url=cmd_or_url,
510
548
  args=cfg.get("args", []),
511
549
  env={**os.environ, **cfg.get("env", {})},
512
550
  timeout=cfg.get("timeout", None),
551
+ headers=headers,
513
552
  strict=strict,
514
553
  )
515
554
  all_servers.append(server)
@@ -0,0 +1,132 @@
1
+ # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
+ # you may not use this file except in compliance with the License.
4
+ # You may obtain a copy of the License at
5
+ #
6
+ # http://www.apache.org/licenses/LICENSE-2.0
7
+ #
8
+ # Unless required by applicable law or agreed to in writing, software
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ # See the License for the specific language governing permissions and
12
+ # limitations under the License.
13
+ # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
14
+ from typing import Any, Dict, List, Optional
15
+
16
+ import requests
17
+
18
+ from camel.toolkits.base import BaseToolkit
19
+ from camel.toolkits.function_tool import FunctionTool
20
+ from camel.utils import MCPServer
21
+
22
+
23
+ @MCPServer()
24
+ class PulseMCPSearchToolkit(BaseToolkit):
25
+ r"""A toolkit for searching MCP servers using the PulseMCP API."""
26
+
27
+ def __init__(self, timeout: Optional[float] = None):
28
+ super().__init__(timeout=timeout)
29
+ self.api_base_url = "https://api.pulsemcp.com/v0beta"
30
+
31
+ def search_mcp_servers(
32
+ self,
33
+ query: Optional[str] = None,
34
+ top_k: Optional[int] = 5,
35
+ package_registry: Optional[str] = None,
36
+ count_per_page: int = 5000,
37
+ offset: int = 0,
38
+ ) -> Dict[str, Any]:
39
+ r"""Search for MCP servers using the PulseMCP API.
40
+
41
+ Args:
42
+ query (Optional[str]): The query to search for.
43
+ (default: :obj:`None`)
44
+ top_k (Optional[int]): After sorting, return only the top_k
45
+ servers. (default: :obj:`5`)
46
+ package_registry (Optional[str]): The package registry to search
47
+ for. (default: :obj:`None`)
48
+ count_per_page (int): The number of servers to return per page.
49
+ (default: :obj:`5000`)
50
+ offset (int): The offset to start the search from.
51
+ (default: :obj:`0`)
52
+
53
+ Returns:
54
+ Dict[str, Any]: A dictionary containing the search results or
55
+ an error message.
56
+ """
57
+ params: Dict[str, Any] = {
58
+ "count_per_page": min(count_per_page, 5000),
59
+ "offset": offset,
60
+ }
61
+ if query:
62
+ params["query"] = query
63
+
64
+ response = requests.get(f"{self.api_base_url}/servers", params=params)
65
+
66
+ if response.status_code != 200:
67
+ error_msg = f"Error searching MCP servers: {response.status_code}"
68
+ if response.text:
69
+ try:
70
+ error_info = response.json()
71
+ if "error" in error_info:
72
+ msg = error_info['error'].get('message', '')
73
+ error_msg = f"{error_msg} - {msg}"
74
+ except Exception:
75
+ error_msg = f"{error_msg} - {response.text}"
76
+ return {"error": error_msg}
77
+
78
+ data = response.json()
79
+ servers = data.get("servers", [])
80
+
81
+ if package_registry:
82
+ package_registry_lower = package_registry.lower()
83
+ servers = [
84
+ server
85
+ for server in servers
86
+ if isinstance(server.get("package_registry"), str)
87
+ and server.get("package_registry").lower()
88
+ == package_registry_lower
89
+ ]
90
+
91
+ if query:
92
+ query_lower = query.lower()
93
+ # Helper function to calculate score
94
+ # 1. With name +5
95
+ # 2. With description +3
96
+ # 3. With stars +1
97
+
98
+ def score(server: Dict[str, Any]) -> float:
99
+ name = server.get("name", "").lower()
100
+ desc = server.get("short_description", "").lower()
101
+ stars = server.get("github_stars", 0) or 0
102
+ score: float = 0.0
103
+ if query_lower in name:
104
+ score += 5
105
+ if query_lower in desc:
106
+ score += 3
107
+ score += stars / 1000
108
+ return score
109
+
110
+ servers = sorted(servers, key=score, reverse=True)
111
+ else:
112
+ servers = sorted(
113
+ servers,
114
+ key=lambda x: x.get("github_stars", 0) or 0,
115
+ reverse=True,
116
+ )
117
+
118
+ if top_k is not None:
119
+ servers = servers[:top_k]
120
+
121
+ return {"servers": servers}
122
+
123
+ def get_tools(self) -> List[FunctionTool]:
124
+ r"""Returns a list of FunctionTool objects representing the
125
+ functions in the toolkit.
126
+
127
+ Returns:
128
+ List[FunctionTool]: A list of FunctionTool objects.
129
+ """
130
+ return [
131
+ FunctionTool(self.search_mcp_servers),
132
+ ]
@@ -475,6 +475,16 @@ class ModelType(UnifiedModelType, Enum):
475
475
  ModelType.GPT_4_TURBO,
476
476
  ModelType.GPT_4O,
477
477
  ModelType.GPT_4O_MINI,
478
+ ModelType.O1,
479
+ ModelType.O1_PREVIEW,
480
+ ModelType.O1_MINI,
481
+ ModelType.O3_MINI,
482
+ ModelType.GPT_4_5_PREVIEW,
483
+ ModelType.GPT_4_1,
484
+ ModelType.GPT_4_1_MINI,
485
+ ModelType.GPT_4_1_NANO,
486
+ ModelType.O4_MINI,
487
+ ModelType.O3,
478
488
  }
479
489
 
480
490
  @property
@@ -1389,6 +1399,7 @@ class ModelPlatformType(Enum):
1389
1399
  MISTRAL = "mistral"
1390
1400
  REKA = "reka"
1391
1401
  TOGETHER = "together"
1402
+ STUB = "stub"
1392
1403
  OPENAI_COMPATIBLE_MODEL = "openai-compatible-model"
1393
1404
  SAMBA = "samba-nova"
1394
1405
  COHERE = "cohere"
@@ -1577,6 +1588,11 @@ class ModelPlatformType(Enum):
1577
1588
  r"""Returns whether this platform is Novita."""
1578
1589
  return self is ModelPlatformType.NOVITA
1579
1590
 
1591
+ @property
1592
+ def is_watsonx(self) -> bool:
1593
+ r"""Returns whether this platform is WatsonX."""
1594
+ return self is ModelPlatformType.WATSONX
1595
+
1580
1596
 
1581
1597
  class AudioModelType(Enum):
1582
1598
  TTS_1 = "tts-1"