camel-ai 0.2.65__py3-none-any.whl → 0.2.83a6__py3-none-any.whl

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 (509) hide show
  1. camel/__init__.py +3 -3
  2. camel/agents/__init__.py +2 -2
  3. camel/agents/_types.py +9 -4
  4. camel/agents/_utils.py +40 -2
  5. camel/agents/base.py +2 -2
  6. camel/agents/chat_agent.py +5107 -995
  7. camel/agents/critic_agent.py +2 -2
  8. camel/agents/deductive_reasoner_agent.py +56 -56
  9. camel/agents/embodied_agent.py +2 -2
  10. camel/agents/knowledge_graph_agent.py +20 -20
  11. camel/agents/mcp_agent.py +35 -36
  12. camel/agents/multi_hop_generator_agent.py +3 -3
  13. camel/agents/programmed_agent_instruction.py +2 -2
  14. camel/agents/repo_agent.py +4 -3
  15. camel/agents/role_assignment_agent.py +2 -2
  16. camel/agents/search_agent.py +2 -2
  17. camel/agents/task_agent.py +2 -2
  18. camel/agents/tool_agents/__init__.py +2 -2
  19. camel/agents/tool_agents/base.py +2 -2
  20. camel/agents/tool_agents/hugging_face_tool_agent.py +3 -3
  21. camel/benchmarks/__init__.py +2 -2
  22. camel/benchmarks/apibank.py +5 -5
  23. camel/benchmarks/apibench.py +2 -2
  24. camel/benchmarks/base.py +2 -2
  25. camel/benchmarks/browsecomp.py +44 -33
  26. camel/benchmarks/gaia.py +17 -13
  27. camel/benchmarks/mock_website/README.md +1 -3
  28. camel/benchmarks/mock_website/mock_web.py +2 -2
  29. camel/benchmarks/mock_website/requirements.txt +1 -1
  30. camel/benchmarks/mock_website/shopping_mall/app.py +2 -2
  31. camel/benchmarks/mock_website/task.json +1 -1
  32. camel/benchmarks/nexus.py +3 -3
  33. camel/benchmarks/ragbench.py +2 -2
  34. camel/bots/__init__.py +2 -2
  35. camel/bots/discord/__init__.py +2 -2
  36. camel/bots/discord/discord_app.py +2 -2
  37. camel/bots/discord/discord_installation.py +2 -2
  38. camel/bots/discord/discord_store.py +3 -3
  39. camel/bots/slack/__init__.py +2 -2
  40. camel/bots/slack/models.py +4 -4
  41. camel/bots/slack/slack_app.py +2 -2
  42. camel/bots/telegram_bot.py +2 -2
  43. camel/configs/__init__.py +29 -2
  44. camel/configs/aihubmix_config.py +90 -0
  45. camel/configs/aiml_config.py +2 -2
  46. camel/configs/amd_config.py +70 -0
  47. camel/configs/anthropic_config.py +2 -2
  48. camel/configs/base_config.py +2 -2
  49. camel/configs/bedrock_config.py +5 -3
  50. camel/configs/cerebras_config.py +98 -0
  51. camel/configs/cohere_config.py +2 -2
  52. camel/configs/cometapi_config.py +106 -0
  53. camel/configs/crynux_config.py +2 -2
  54. camel/configs/deepseek_config.py +9 -8
  55. camel/configs/function_gemma_config.py +59 -0
  56. camel/configs/gemini_config.py +6 -4
  57. camel/configs/groq_config.py +6 -4
  58. camel/configs/internlm_config.py +6 -4
  59. camel/configs/litellm_config.py +2 -2
  60. camel/configs/lmstudio_config.py +6 -4
  61. camel/configs/minimax_config.py +95 -0
  62. camel/configs/mistral_config.py +2 -2
  63. camel/configs/modelscope_config.py +5 -3
  64. camel/configs/moonshot_config.py +2 -2
  65. camel/configs/nebius_config.py +105 -0
  66. camel/configs/netmind_config.py +2 -2
  67. camel/configs/novita_config.py +2 -2
  68. camel/configs/nvidia_config.py +2 -2
  69. camel/configs/ollama_config.py +2 -2
  70. camel/configs/openai_config.py +5 -3
  71. camel/configs/openrouter_config.py +6 -4
  72. camel/configs/ppio_config.py +2 -2
  73. camel/configs/qianfan_config.py +85 -0
  74. camel/configs/qwen_config.py +2 -2
  75. camel/configs/reka_config.py +2 -2
  76. camel/configs/samba_config.py +6 -4
  77. camel/configs/sglang_config.py +2 -2
  78. camel/configs/siliconflow_config.py +2 -2
  79. camel/configs/togetherai_config.py +2 -2
  80. camel/configs/vllm_config.py +4 -2
  81. camel/configs/watsonx_config.py +2 -2
  82. camel/configs/yi_config.py +6 -4
  83. camel/configs/zhipuai_config.py +6 -4
  84. camel/data_collectors/__init__.py +2 -2
  85. camel/data_collectors/alpaca_collector.py +18 -9
  86. camel/data_collectors/base.py +2 -2
  87. camel/data_collectors/sharegpt_collector.py +2 -2
  88. camel/datagen/__init__.py +2 -2
  89. camel/datagen/cot_datagen.py +3 -3
  90. camel/datagen/evol_instruct/__init__.py +2 -2
  91. camel/datagen/evol_instruct/evol_instruct.py +2 -2
  92. camel/datagen/evol_instruct/scorer.py +12 -12
  93. camel/datagen/evol_instruct/templates.py +16 -16
  94. camel/datagen/self_improving_cot.py +5 -5
  95. camel/datagen/self_instruct/__init__.py +2 -2
  96. camel/datagen/self_instruct/filter/__init__.py +2 -2
  97. camel/datagen/self_instruct/filter/filter_function.py +2 -2
  98. camel/datagen/self_instruct/filter/filter_registry.py +2 -2
  99. camel/datagen/self_instruct/filter/instruction_filter.py +2 -2
  100. camel/datagen/self_instruct/self_instruct.py +2 -2
  101. camel/datagen/self_instruct/templates.py +47 -47
  102. camel/datagen/source2synth/__init__.py +2 -2
  103. camel/datagen/source2synth/data_processor.py +2 -2
  104. camel/datagen/source2synth/models.py +2 -2
  105. camel/datagen/source2synth/user_data_processor_config.py +2 -2
  106. camel/datahubs/__init__.py +2 -2
  107. camel/datahubs/base.py +2 -2
  108. camel/datahubs/huggingface.py +2 -2
  109. camel/datahubs/models.py +2 -2
  110. camel/datasets/__init__.py +2 -2
  111. camel/datasets/base_generator.py +41 -12
  112. camel/datasets/few_shot_generator.py +18 -18
  113. camel/datasets/models.py +2 -2
  114. camel/datasets/self_instruct_generator.py +2 -2
  115. camel/datasets/static_dataset.py +2 -2
  116. camel/embeddings/__init__.py +2 -2
  117. camel/embeddings/azure_embedding.py +2 -2
  118. camel/embeddings/base.py +2 -2
  119. camel/embeddings/gemini_embedding.py +2 -2
  120. camel/embeddings/jina_embedding.py +2 -2
  121. camel/embeddings/mistral_embedding.py +2 -2
  122. camel/embeddings/openai_compatible_embedding.py +2 -2
  123. camel/embeddings/openai_embedding.py +2 -2
  124. camel/embeddings/sentence_transformers_embeddings.py +2 -2
  125. camel/embeddings/together_embedding.py +2 -2
  126. camel/embeddings/vlm_embedding.py +2 -2
  127. camel/environments/__init__.py +14 -2
  128. camel/environments/models.py +2 -2
  129. camel/environments/multi_step.py +2 -2
  130. camel/environments/rlcards_env.py +860 -0
  131. camel/environments/single_step.py +30 -5
  132. camel/environments/tic_tac_toe.py +3 -3
  133. camel/extractors/__init__.py +2 -2
  134. camel/extractors/base.py +2 -2
  135. camel/extractors/python_strategies.py +2 -2
  136. camel/generators.py +2 -2
  137. camel/human.py +2 -2
  138. camel/interpreters/__init__.py +4 -2
  139. camel/interpreters/base.py +2 -2
  140. camel/interpreters/docker/Dockerfile +14 -24
  141. camel/interpreters/docker_interpreter.py +5 -4
  142. camel/interpreters/e2b_interpreter.py +36 -3
  143. camel/interpreters/internal_python_interpreter.py +53 -4
  144. camel/interpreters/interpreter_error.py +2 -2
  145. camel/interpreters/ipython_interpreter.py +2 -2
  146. camel/interpreters/microsandbox_interpreter.py +395 -0
  147. camel/interpreters/subprocess_interpreter.py +2 -2
  148. camel/loaders/__init__.py +13 -4
  149. camel/loaders/apify_reader.py +2 -2
  150. camel/loaders/base_io.py +2 -2
  151. camel/loaders/base_loader.py +85 -0
  152. camel/loaders/chunkr_reader.py +11 -2
  153. camel/loaders/crawl4ai_reader.py +2 -2
  154. camel/loaders/firecrawl_reader.py +6 -6
  155. camel/loaders/jina_url_reader.py +2 -2
  156. camel/loaders/markitdown.py +2 -2
  157. camel/loaders/mineru_extractor.py +2 -2
  158. camel/loaders/mistral_reader.py +2 -2
  159. camel/loaders/scrapegraph_reader.py +2 -2
  160. camel/loaders/unstructured_io.py +2 -2
  161. camel/logger.py +5 -5
  162. camel/memories/__init__.py +2 -2
  163. camel/memories/agent_memories.py +86 -3
  164. camel/memories/base.py +36 -2
  165. camel/memories/blocks/__init__.py +2 -2
  166. camel/memories/blocks/chat_history_block.py +125 -7
  167. camel/memories/blocks/vectordb_block.py +10 -3
  168. camel/memories/context_creators/__init__.py +2 -2
  169. camel/memories/context_creators/score_based.py +109 -230
  170. camel/memories/records.py +90 -10
  171. camel/messages/__init__.py +2 -2
  172. camel/messages/base.py +178 -43
  173. camel/messages/conversion/__init__.py +2 -2
  174. camel/messages/conversion/alpaca.py +2 -2
  175. camel/messages/conversion/conversation_models.py +2 -2
  176. camel/messages/conversion/sharegpt/__init__.py +2 -2
  177. camel/messages/conversion/sharegpt/function_call_formatter.py +2 -2
  178. camel/messages/conversion/sharegpt/hermes/__init__.py +2 -2
  179. camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +2 -2
  180. camel/messages/func_message.py +54 -17
  181. camel/models/__init__.py +18 -2
  182. camel/models/_utils.py +3 -3
  183. camel/models/aihubmix_model.py +83 -0
  184. camel/models/aiml_model.py +11 -18
  185. camel/models/amd_model.py +101 -0
  186. camel/models/anthropic_model.py +127 -20
  187. camel/models/aws_bedrock_model.py +12 -35
  188. camel/models/azure_openai_model.py +214 -115
  189. camel/models/base_audio_model.py +5 -3
  190. camel/models/base_model.py +378 -31
  191. camel/models/cerebras_model.py +83 -0
  192. camel/models/cohere_model.py +18 -49
  193. camel/models/cometapi_model.py +83 -0
  194. camel/models/crynux_model.py +11 -18
  195. camel/models/deepseek_model.py +20 -84
  196. camel/models/fish_audio_model.py +8 -2
  197. camel/models/function_gemma_model.py +889 -0
  198. camel/models/gemini_model.py +391 -52
  199. camel/models/groq_model.py +11 -19
  200. camel/models/internlm_model.py +11 -18
  201. camel/models/litellm_model.py +57 -49
  202. camel/models/lmstudio_model.py +17 -20
  203. camel/models/minimax_model.py +83 -0
  204. camel/models/mistral_model.py +20 -47
  205. camel/models/model_factory.py +39 -3
  206. camel/models/model_manager.py +26 -8
  207. camel/models/modelscope_model.py +13 -193
  208. camel/models/moonshot_model.py +183 -21
  209. camel/models/nebius_model.py +83 -0
  210. camel/models/nemotron_model.py +19 -9
  211. camel/models/netmind_model.py +11 -18
  212. camel/models/novita_model.py +11 -18
  213. camel/models/nvidia_model.py +11 -18
  214. camel/models/ollama_model.py +14 -21
  215. camel/models/openai_audio_models.py +2 -2
  216. camel/models/openai_compatible_model.py +190 -71
  217. camel/models/openai_model.py +192 -86
  218. camel/models/openrouter_model.py +11 -19
  219. camel/models/ppio_model.py +11 -18
  220. camel/models/qianfan_model.py +89 -0
  221. camel/models/qwen_model.py +13 -193
  222. camel/models/reka_model.py +23 -49
  223. camel/models/reward/__init__.py +2 -2
  224. camel/models/reward/base_reward_model.py +2 -2
  225. camel/models/reward/evaluator.py +2 -2
  226. camel/models/reward/nemotron_model.py +2 -2
  227. camel/models/reward/skywork_model.py +2 -2
  228. camel/models/samba_model.py +50 -75
  229. camel/models/sglang_model.py +90 -68
  230. camel/models/siliconflow_model.py +12 -35
  231. camel/models/stub_model.py +10 -7
  232. camel/models/togetherai_model.py +11 -18
  233. camel/models/vllm_model.py +10 -18
  234. camel/models/volcano_model.py +158 -19
  235. camel/models/watsonx_model.py +9 -47
  236. camel/models/yi_model.py +11 -18
  237. camel/models/zhipuai_model.py +70 -18
  238. camel/parsers/__init__.py +18 -0
  239. camel/parsers/mcp_tool_call_parser.py +176 -0
  240. camel/personas/__init__.py +2 -2
  241. camel/personas/persona.py +2 -2
  242. camel/personas/persona_hub.py +2 -2
  243. camel/prompts/__init__.py +2 -2
  244. camel/prompts/ai_society.py +2 -2
  245. camel/prompts/base.py +2 -2
  246. camel/prompts/code.py +2 -2
  247. camel/prompts/evaluation.py +2 -2
  248. camel/prompts/generate_text_embedding_data.py +2 -2
  249. camel/prompts/image_craft.py +2 -2
  250. camel/prompts/misalignment.py +2 -2
  251. camel/prompts/multi_condition_image_craft.py +2 -2
  252. camel/prompts/object_recognition.py +2 -2
  253. camel/prompts/persona_hub.py +3 -3
  254. camel/prompts/prompt_templates.py +2 -2
  255. camel/prompts/role_description_prompt_template.py +2 -2
  256. camel/prompts/solution_extraction.py +8 -8
  257. camel/prompts/task_prompt_template.py +2 -2
  258. camel/prompts/translation.py +2 -2
  259. camel/prompts/video_description_prompt.py +3 -3
  260. camel/responses/__init__.py +2 -2
  261. camel/responses/agent_responses.py +2 -2
  262. camel/retrievers/__init__.py +2 -2
  263. camel/retrievers/auto_retriever.py +3 -2
  264. camel/retrievers/base.py +2 -2
  265. camel/retrievers/bm25_retriever.py +2 -2
  266. camel/retrievers/cohere_rerank_retriever.py +2 -2
  267. camel/retrievers/hybrid_retrival.py +2 -2
  268. camel/retrievers/vector_retriever.py +2 -2
  269. camel/runtimes/Dockerfile.multi-toolkit +90 -0
  270. camel/runtimes/__init__.py +2 -2
  271. camel/runtimes/api.py +79 -23
  272. camel/runtimes/base.py +2 -2
  273. camel/runtimes/configs.py +13 -13
  274. camel/runtimes/daytona_runtime.py +17 -18
  275. camel/runtimes/docker_runtime.py +12 -12
  276. camel/runtimes/llm_guard_runtime.py +26 -26
  277. camel/runtimes/remote_http_runtime.py +11 -11
  278. camel/runtimes/ubuntu_docker_runtime.py +2 -2
  279. camel/runtimes/utils/__init__.py +2 -2
  280. camel/runtimes/utils/function_risk_toolkit.py +2 -2
  281. camel/runtimes/utils/ignore_risk_toolkit.py +2 -2
  282. camel/schemas/__init__.py +2 -2
  283. camel/schemas/base.py +2 -2
  284. camel/schemas/openai_converter.py +3 -3
  285. camel/schemas/outlines_converter.py +2 -2
  286. camel/services/agent_openapi_server.py +380 -0
  287. camel/societies/__init__.py +4 -2
  288. camel/societies/babyagi_playing.py +2 -2
  289. camel/societies/role_playing.py +201 -80
  290. camel/societies/workforce/__init__.py +10 -3
  291. camel/societies/workforce/base.py +2 -2
  292. camel/societies/workforce/events.py +145 -0
  293. camel/societies/workforce/prompts.py +259 -33
  294. camel/societies/workforce/role_playing_worker.py +88 -31
  295. camel/societies/workforce/single_agent_worker.py +638 -40
  296. camel/societies/workforce/structured_output_handler.py +512 -0
  297. camel/societies/workforce/task_channel.py +182 -38
  298. camel/societies/workforce/utils.py +780 -65
  299. camel/societies/workforce/worker.py +92 -26
  300. camel/societies/workforce/workflow_memory_manager.py +1746 -0
  301. camel/societies/workforce/workforce.py +5354 -372
  302. camel/societies/workforce/workforce_callback.py +103 -0
  303. camel/societies/workforce/workforce_logger.py +647 -0
  304. camel/societies/workforce/workforce_metrics.py +33 -0
  305. camel/storages/__init__.py +6 -2
  306. camel/storages/graph_storages/__init__.py +2 -2
  307. camel/storages/graph_storages/base.py +2 -2
  308. camel/storages/graph_storages/graph_element.py +2 -2
  309. camel/storages/graph_storages/nebula_graph.py +4 -4
  310. camel/storages/graph_storages/neo4j_graph.py +7 -7
  311. camel/storages/key_value_storages/__init__.py +2 -2
  312. camel/storages/key_value_storages/base.py +2 -2
  313. camel/storages/key_value_storages/in_memory.py +2 -2
  314. camel/storages/key_value_storages/json.py +17 -4
  315. camel/storages/key_value_storages/mem0_cloud.py +50 -49
  316. camel/storages/key_value_storages/redis.py +2 -2
  317. camel/storages/object_storages/__init__.py +2 -2
  318. camel/storages/object_storages/amazon_s3.py +2 -2
  319. camel/storages/object_storages/azure_blob.py +2 -2
  320. camel/storages/object_storages/base.py +2 -2
  321. camel/storages/object_storages/google_cloud.py +3 -3
  322. camel/storages/vectordb_storages/__init__.py +8 -2
  323. camel/storages/vectordb_storages/base.py +2 -2
  324. camel/storages/vectordb_storages/chroma.py +731 -0
  325. camel/storages/vectordb_storages/faiss.py +2 -2
  326. camel/storages/vectordb_storages/milvus.py +2 -2
  327. camel/storages/vectordb_storages/oceanbase.py +15 -15
  328. camel/storages/vectordb_storages/pgvector.py +349 -0
  329. camel/storages/vectordb_storages/qdrant.py +6 -6
  330. camel/storages/vectordb_storages/surreal.py +372 -0
  331. camel/storages/vectordb_storages/tidb.py +11 -8
  332. camel/storages/vectordb_storages/weaviate.py +2 -2
  333. camel/tasks/__init__.py +2 -2
  334. camel/tasks/task.py +348 -26
  335. camel/tasks/task_prompt.py +3 -3
  336. camel/terminators/__init__.py +2 -2
  337. camel/terminators/base.py +2 -2
  338. camel/terminators/response_terminator.py +2 -2
  339. camel/terminators/token_limit_terminator.py +2 -2
  340. camel/toolkits/__init__.py +57 -10
  341. camel/toolkits/aci_toolkit.py +66 -21
  342. camel/toolkits/arxiv_toolkit.py +8 -8
  343. camel/toolkits/ask_news_toolkit.py +2 -2
  344. camel/toolkits/async_browser_toolkit.py +4 -4
  345. camel/toolkits/audio_analysis_toolkit.py +3 -3
  346. camel/toolkits/base.py +106 -6
  347. camel/toolkits/bohrium_toolkit.py +2 -2
  348. camel/toolkits/browser_toolkit.py +34 -21
  349. camel/toolkits/browser_toolkit_commons.py +4 -4
  350. camel/toolkits/code_execution.py +31 -4
  351. camel/toolkits/context_summarizer_toolkit.py +684 -0
  352. camel/toolkits/craw4ai_toolkit.py +93 -0
  353. camel/toolkits/dappier_toolkit.py +12 -8
  354. camel/toolkits/data_commons_toolkit.py +2 -2
  355. camel/toolkits/dingtalk.py +1135 -0
  356. camel/toolkits/earth_science_toolkit.py +5367 -0
  357. camel/toolkits/edgeone_pages_mcp_toolkit.py +49 -0
  358. camel/toolkits/excel_toolkit.py +905 -71
  359. camel/toolkits/file_toolkit.py +1402 -0
  360. camel/toolkits/function_tool.py +205 -27
  361. camel/toolkits/github_toolkit.py +109 -22
  362. camel/toolkits/gmail_toolkit.py +1839 -0
  363. camel/toolkits/google_calendar_toolkit.py +40 -6
  364. camel/toolkits/google_drive_mcp_toolkit.py +54 -0
  365. camel/toolkits/google_maps_toolkit.py +2 -2
  366. camel/toolkits/google_scholar_toolkit.py +2 -2
  367. camel/toolkits/human_toolkit.py +36 -12
  368. camel/toolkits/hybrid_browser_toolkit/__init__.py +18 -0
  369. camel/toolkits/hybrid_browser_toolkit/config_loader.py +185 -0
  370. camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py +246 -0
  371. camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit_ts.py +1958 -0
  372. camel/toolkits/hybrid_browser_toolkit/installer.py +203 -0
  373. camel/toolkits/hybrid_browser_toolkit/ts/package-lock.json +4589 -0
  374. camel/toolkits/hybrid_browser_toolkit/ts/package.json +33 -0
  375. camel/toolkits/hybrid_browser_toolkit/ts/src/browser-scripts.js +125 -0
  376. camel/toolkits/hybrid_browser_toolkit/ts/src/browser-session.ts +1940 -0
  377. camel/toolkits/hybrid_browser_toolkit/ts/src/config-loader.ts +233 -0
  378. camel/toolkits/hybrid_browser_toolkit/ts/src/hybrid-browser-toolkit.ts +589 -0
  379. camel/toolkits/hybrid_browser_toolkit/ts/src/index.ts +7 -0
  380. camel/toolkits/hybrid_browser_toolkit/ts/src/parent-child-filter.ts +226 -0
  381. camel/toolkits/hybrid_browser_toolkit/ts/src/snapshot-parser.ts +219 -0
  382. camel/toolkits/hybrid_browser_toolkit/ts/src/som-screenshot-injected.ts +543 -0
  383. camel/toolkits/hybrid_browser_toolkit/ts/src/types.ts +129 -0
  384. camel/toolkits/hybrid_browser_toolkit/ts/tsconfig.json +27 -0
  385. camel/toolkits/hybrid_browser_toolkit/ts/websocket-server.js +325 -0
  386. camel/toolkits/hybrid_browser_toolkit/ws_wrapper.py +1037 -0
  387. camel/toolkits/hybrid_browser_toolkit_py/__init__.py +17 -0
  388. camel/toolkits/hybrid_browser_toolkit_py/actions.py +575 -0
  389. camel/toolkits/hybrid_browser_toolkit_py/agent.py +311 -0
  390. camel/toolkits/hybrid_browser_toolkit_py/browser_session.py +787 -0
  391. camel/toolkits/hybrid_browser_toolkit_py/config_loader.py +490 -0
  392. camel/toolkits/hybrid_browser_toolkit_py/hybrid_browser_toolkit.py +2390 -0
  393. camel/toolkits/hybrid_browser_toolkit_py/snapshot.py +233 -0
  394. camel/toolkits/hybrid_browser_toolkit_py/stealth_script.js +0 -0
  395. camel/toolkits/hybrid_browser_toolkit_py/unified_analyzer.js +1043 -0
  396. camel/toolkits/image_analysis_toolkit.py +3 -6
  397. camel/toolkits/image_generation_toolkit.py +390 -0
  398. camel/toolkits/jina_reranker_toolkit.py +5 -6
  399. camel/toolkits/klavis_toolkit.py +7 -3
  400. camel/toolkits/linkedin_toolkit.py +2 -2
  401. camel/toolkits/markitdown_toolkit.py +104 -0
  402. camel/toolkits/math_toolkit.py +66 -12
  403. camel/toolkits/mcp_toolkit.py +412 -36
  404. camel/toolkits/memory_toolkit.py +7 -3
  405. camel/toolkits/meshy_toolkit.py +2 -2
  406. camel/toolkits/message_agent_toolkit.py +608 -0
  407. camel/toolkits/message_integration.py +728 -0
  408. camel/toolkits/microsoft_outlook_mail_toolkit.py +1885 -0
  409. camel/toolkits/mineru_toolkit.py +2 -2
  410. camel/toolkits/minimax_mcp_toolkit.py +195 -0
  411. camel/toolkits/networkx_toolkit.py +2 -2
  412. camel/toolkits/note_taking_toolkit.py +277 -0
  413. camel/toolkits/notion_mcp_toolkit.py +224 -0
  414. camel/toolkits/notion_toolkit.py +2 -2
  415. camel/toolkits/open_api_specs/biztoc/__init__.py +2 -2
  416. camel/toolkits/open_api_specs/biztoc/ai-plugin.json +1 -1
  417. camel/toolkits/open_api_specs/coursera/__init__.py +2 -2
  418. camel/toolkits/open_api_specs/create_qr_code/__init__.py +2 -2
  419. camel/toolkits/open_api_specs/klarna/__init__.py +2 -2
  420. camel/toolkits/open_api_specs/nasa_apod/__init__.py +2 -2
  421. camel/toolkits/open_api_specs/outschool/__init__.py +2 -2
  422. camel/toolkits/open_api_specs/outschool/ai-plugin.json +1 -1
  423. camel/toolkits/open_api_specs/outschool/openapi.yaml +1 -1
  424. camel/toolkits/open_api_specs/outschool/paths/__init__.py +2 -2
  425. camel/toolkits/open_api_specs/outschool/paths/get_classes.py +2 -2
  426. camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +2 -2
  427. camel/toolkits/open_api_specs/security_config.py +2 -2
  428. camel/toolkits/open_api_specs/speak/__init__.py +2 -2
  429. camel/toolkits/open_api_specs/web_scraper/__init__.py +2 -2
  430. camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +1 -1
  431. camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +2 -2
  432. camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +2 -2
  433. camel/toolkits/open_api_toolkit.py +2 -2
  434. camel/toolkits/openbb_toolkit.py +7 -3
  435. camel/toolkits/origene_mcp_toolkit.py +56 -0
  436. camel/toolkits/page_script.js +53 -53
  437. camel/toolkits/playwright_mcp_toolkit.py +13 -31
  438. camel/toolkits/pptx_toolkit.py +36 -23
  439. camel/toolkits/pubmed_toolkit.py +2 -2
  440. camel/toolkits/pulse_mcp_search_toolkit.py +2 -2
  441. camel/toolkits/pyautogui_toolkit.py +2 -2
  442. camel/toolkits/reddit_toolkit.py +2 -2
  443. camel/toolkits/resend_toolkit.py +168 -0
  444. camel/toolkits/retrieval_toolkit.py +2 -2
  445. camel/toolkits/screenshot_toolkit.py +213 -0
  446. camel/toolkits/search_toolkit.py +606 -156
  447. camel/toolkits/searxng_toolkit.py +2 -2
  448. camel/toolkits/semantic_scholar_toolkit.py +2 -2
  449. camel/toolkits/slack_toolkit.py +108 -58
  450. camel/toolkits/sql_toolkit.py +712 -0
  451. camel/toolkits/stripe_toolkit.py +2 -2
  452. camel/toolkits/sympy_toolkit.py +3 -3
  453. camel/toolkits/task_planning_toolkit.py +5 -5
  454. camel/toolkits/terminal_toolkit/__init__.py +18 -0
  455. camel/toolkits/terminal_toolkit/terminal_toolkit.py +1281 -0
  456. camel/toolkits/terminal_toolkit/utils.py +659 -0
  457. camel/toolkits/thinking_toolkit.py +3 -3
  458. camel/toolkits/twitter_toolkit.py +2 -2
  459. camel/toolkits/vertex_ai_veo_toolkit.py +590 -0
  460. camel/toolkits/video_analysis_toolkit.py +109 -29
  461. camel/toolkits/video_download_toolkit.py +19 -16
  462. camel/toolkits/weather_toolkit.py +2 -2
  463. camel/toolkits/web_deploy_toolkit.py +1219 -0
  464. camel/toolkits/wechat_official_toolkit.py +483 -0
  465. camel/toolkits/whatsapp_toolkit.py +2 -2
  466. camel/toolkits/wolfram_alpha_toolkit.py +2 -2
  467. camel/toolkits/zapier_toolkit.py +7 -3
  468. camel/types/__init__.py +4 -4
  469. camel/types/agents/__init__.py +2 -2
  470. camel/types/agents/tool_calling_record.py +6 -3
  471. camel/types/enums.py +381 -41
  472. camel/types/mcp_registries.py +2 -2
  473. camel/types/openai_types.py +4 -4
  474. camel/types/unified_model_type.py +46 -10
  475. camel/utils/__init__.py +5 -2
  476. camel/utils/agent_context.py +41 -0
  477. camel/utils/async_func.py +2 -2
  478. camel/utils/chunker/__init__.py +2 -2
  479. camel/utils/chunker/base.py +2 -2
  480. camel/utils/chunker/code_chunker.py +2 -2
  481. camel/utils/chunker/uio_chunker.py +2 -2
  482. camel/utils/commons.py +38 -7
  483. camel/utils/constants.py +5 -2
  484. camel/utils/context_utils.py +1134 -0
  485. camel/utils/deduplication.py +2 -2
  486. camel/utils/filename.py +2 -2
  487. camel/utils/langfuse.py +18 -10
  488. camel/utils/mcp.py +140 -6
  489. camel/utils/mcp_client.py +48 -38
  490. camel/utils/message_summarizer.py +148 -0
  491. camel/utils/response_format.py +2 -2
  492. camel/utils/token_counting.py +45 -22
  493. camel/utils/tool_result.py +44 -0
  494. camel/verifiers/__init__.py +2 -2
  495. camel/verifiers/base.py +2 -2
  496. camel/verifiers/math_verifier.py +2 -2
  497. camel/verifiers/models.py +2 -2
  498. camel/verifiers/physics_verifier.py +2 -2
  499. camel/verifiers/python_verifier.py +2 -2
  500. {camel_ai-0.2.65.dist-info → camel_ai-0.2.83a6.dist-info}/METADATA +355 -117
  501. camel_ai-0.2.83a6.dist-info/RECORD +511 -0
  502. {camel_ai-0.2.65.dist-info → camel_ai-0.2.83a6.dist-info}/WHEEL +1 -1
  503. {camel_ai-0.2.65.dist-info → camel_ai-0.2.83a6.dist-info}/licenses/LICENSE +1 -1
  504. camel/loaders/pandas_reader.py +0 -368
  505. camel/toolkits/dalle_toolkit.py +0 -175
  506. camel/toolkits/file_write_toolkit.py +0 -444
  507. camel/toolkits/openai_agent_toolkit.py +0 -135
  508. camel/toolkits/terminal_toolkit.py +0 -1037
  509. camel_ai-0.2.65.dist-info/RECORD +0 -426
@@ -1,4 +1,4 @@
1
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
1
+ # ========= Copyright 2023-2026 @ CAMEL-AI.org. All Rights Reserved. =========
2
2
  # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
@@ -10,22 +10,14 @@
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
13
+ # ========= Copyright 2023-2026 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
 
15
15
  import os
16
- import time
17
- from typing import Any, Dict, List, Optional, Union
16
+ from typing import Any, Dict, Optional, Union
18
17
 
19
- from openai import AsyncStream, Stream
20
-
21
- from camel.configs import MODELSCOPE_API_PARAMS, ModelScopeConfig
22
- from camel.messages import OpenAIMessage
18
+ from camel.configs import ModelScopeConfig
23
19
  from camel.models.openai_compatible_model import OpenAICompatibleModel
24
- from camel.types import (
25
- ChatCompletion,
26
- ChatCompletionChunk,
27
- ModelType,
28
- )
20
+ from camel.types import ModelType
29
21
  from camel.utils import (
30
22
  BaseTokenCounter,
31
23
  api_keys_required,
@@ -56,6 +48,10 @@ class ModelScopeModel(OpenAICompatibleModel):
56
48
  API calls. If not provided, will fall back to the MODEL_TIMEOUT
57
49
  environment variable or default to 180 seconds.
58
50
  (default: :obj:`None`)
51
+ max_retries (int, optional): Maximum number of retries for API calls.
52
+ (default: :obj:`3`)
53
+ **kwargs (Any): Additional arguments to pass to the client
54
+ initialization.
59
55
  """
60
56
 
61
57
  @api_keys_required(
@@ -71,6 +67,8 @@ class ModelScopeModel(OpenAICompatibleModel):
71
67
  url: Optional[str] = None,
72
68
  token_counter: Optional[BaseTokenCounter] = None,
73
69
  timeout: Optional[float] = None,
70
+ max_retries: int = 3,
71
+ **kwargs: Any,
74
72
  ) -> None:
75
73
  if model_config_dict is None:
76
74
  model_config_dict = ModelScopeConfig().as_dict()
@@ -87,184 +85,6 @@ class ModelScopeModel(OpenAICompatibleModel):
87
85
  url=url,
88
86
  token_counter=token_counter,
89
87
  timeout=timeout,
88
+ max_retries=max_retries,
89
+ **kwargs,
90
90
  )
91
-
92
- def _post_handle_response(
93
- self, response: Union[ChatCompletion, Stream[ChatCompletionChunk]]
94
- ) -> ChatCompletion:
95
- r"""Handle reasoning content with <think> tags at the beginning."""
96
- if not isinstance(response, Stream):
97
- # Handle non-streaming response (existing logic)
98
- if self.model_config_dict.get("extra_body", {}).get(
99
- "enable_thinking", False
100
- ):
101
- reasoning_content = response.choices[
102
- 0
103
- ].message.reasoning_content # type: ignore[attr-defined]
104
- combined_content = (
105
- f"<think>\n{reasoning_content}\n</think>\n"
106
- if reasoning_content
107
- else ""
108
- )
109
- response_content = response.choices[0].message.content or ""
110
- combined_content += response_content
111
-
112
- # Construct a new ChatCompletion with combined content
113
- return ChatCompletion.construct(
114
- id=response.id,
115
- choices=[
116
- dict(
117
- finish_reason=response.choices[0].finish_reason,
118
- index=response.choices[0].index,
119
- logprobs=response.choices[0].logprobs,
120
- message=dict(
121
- role=response.choices[0].message.role,
122
- content=combined_content,
123
- ),
124
- )
125
- ],
126
- created=response.created,
127
- model=response.model,
128
- object="chat.completion",
129
- system_fingerprint=response.system_fingerprint,
130
- usage=response.usage,
131
- )
132
- else:
133
- return response # Return original if no thinking enabled
134
-
135
- # Handle streaming response
136
- accumulated_reasoning = ""
137
- accumulated_content = ""
138
- final_chunk = None
139
- usage_data = None # Initialize usage data
140
- role = "assistant" # Default role
141
-
142
- for chunk in response:
143
- final_chunk = chunk # Keep track of the last chunk for metadata
144
- if chunk.choices:
145
- delta = chunk.choices[0].delta
146
- if delta.role:
147
- role = delta.role # Update role if provided
148
- if (
149
- hasattr(delta, 'reasoning_content')
150
- and delta.reasoning_content
151
- ):
152
- accumulated_reasoning += delta.reasoning_content
153
- if delta.content:
154
- accumulated_content += delta.content
155
-
156
- if hasattr(chunk, 'usage') and chunk.usage:
157
- usage_data = chunk.usage
158
-
159
- combined_content = (
160
- f"<think>\n{accumulated_reasoning}\n</think>\n"
161
- if accumulated_reasoning
162
- else ""
163
- ) + accumulated_content
164
-
165
- # Construct the final ChatCompletion object from accumulated
166
- # stream data
167
- if final_chunk:
168
- finish_reason = "stop" # Default finish reason
169
- logprobs = None
170
- if final_chunk.choices:
171
- finish_reason = (
172
- final_chunk.choices[0].finish_reason or finish_reason
173
- )
174
- if hasattr(final_chunk.choices[0], 'logprobs'):
175
- logprobs = final_chunk.choices[0].logprobs
176
-
177
- return ChatCompletion.construct(
178
- # Use data from the final chunk or defaults
179
- id=final_chunk.id
180
- if hasattr(final_chunk, 'id')
181
- else "streamed-completion",
182
- choices=[
183
- dict(
184
- finish_reason=finish_reason,
185
- index=0,
186
- logprobs=logprobs,
187
- message=dict(
188
- role=role,
189
- content=combined_content,
190
- ),
191
- )
192
- ],
193
- created=final_chunk.created
194
- if hasattr(final_chunk, 'created')
195
- else int(time.time()),
196
- model=final_chunk.model
197
- if hasattr(final_chunk, 'model')
198
- else self.model_type,
199
- object="chat.completion",
200
- system_fingerprint=final_chunk.system_fingerprint
201
- if hasattr(final_chunk, 'system_fingerprint')
202
- else None,
203
- usage=usage_data,
204
- )
205
- else:
206
- # Handle cases where the stream was empty or invalid
207
- return ChatCompletion.construct(
208
- id="empty-stream",
209
- choices=[
210
- dict(
211
- finish_reason="error",
212
- index=0,
213
- message=dict(role="assistant", content=""),
214
- )
215
- ],
216
- created=int(time.time()),
217
- model=self.model_type,
218
- object="chat.completion",
219
- usage=usage_data,
220
- )
221
-
222
- def _request_chat_completion(
223
- self,
224
- messages: List[OpenAIMessage],
225
- tools: Optional[List[Dict[str, Any]]] = None,
226
- ) -> Union[ChatCompletion, Stream[ChatCompletionChunk]]:
227
- request_config = self.model_config_dict.copy()
228
-
229
- if tools:
230
- request_config["tools"] = tools
231
-
232
- return self._post_handle_response(
233
- self._client.chat.completions.create(
234
- messages=messages,
235
- model=self.model_type,
236
- **request_config,
237
- )
238
- )
239
-
240
- async def _arequest_chat_completion(
241
- self,
242
- messages: List[OpenAIMessage],
243
- tools: Optional[List[Dict[str, Any]]] = None,
244
- ) -> Union[ChatCompletion, AsyncStream[ChatCompletionChunk]]:
245
- request_config = self.model_config_dict.copy()
246
-
247
- if tools:
248
- request_config["tools"] = tools
249
-
250
- response = await self._async_client.chat.completions.create(
251
- messages=messages,
252
- model=self.model_type,
253
- **request_config,
254
- )
255
- return self._post_handle_response(response)
256
-
257
- def check_model_config(self):
258
- r"""Check whether the model configuration contains any
259
- unexpected arguments to ModelScope API.
260
-
261
- Raises:
262
- ValueError: If the model configuration dictionary contains any
263
- unexpected arguments to ModelScope API.
264
- """
265
- for param in self.model_config_dict:
266
- if param not in MODELSCOPE_API_PARAMS:
267
- raise ValueError(
268
- f"Unexpected argument `{param}` is "
269
- "input into ModelScope model backend."
270
- )
@@ -1,4 +1,4 @@
1
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
1
+ # ========= Copyright 2023-2026 @ CAMEL-AI.org. All Rights Reserved. =========
2
2
  # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
@@ -10,16 +10,19 @@
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
13
+ # ========= Copyright 2023-2026 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
 
15
+ import copy
15
16
  import os
16
17
  from typing import Any, Dict, List, Optional, Type, Union
17
18
 
18
19
  from openai import AsyncStream
19
20
  from pydantic import BaseModel
20
21
 
21
- from camel.configs import MOONSHOT_API_PARAMS, MoonshotConfig
22
+ from camel.configs import MoonshotConfig
23
+ from camel.logger import get_logger
22
24
  from camel.messages import OpenAIMessage
25
+ from camel.models._utils import try_modify_message_with_format
23
26
  from camel.models.openai_compatible_model import OpenAICompatibleModel
24
27
  from camel.types import (
25
28
  ChatCompletion,
@@ -31,6 +34,21 @@ from camel.utils import (
31
34
  api_keys_required,
32
35
  )
33
36
 
37
+ logger = get_logger(__name__)
38
+
39
+ if os.environ.get("LANGFUSE_ENABLED", "False").lower() == "true":
40
+ try:
41
+ from langfuse.decorators import observe
42
+ except ImportError:
43
+ from camel.utils import observe
44
+ elif os.environ.get("TRACEROOT_ENABLED", "False").lower() == "true":
45
+ try:
46
+ from traceroot import trace as observe # type: ignore[import]
47
+ except ImportError:
48
+ from camel.utils import observe
49
+ else:
50
+ from camel.utils import observe
51
+
34
52
 
35
53
  class MoonshotModel(OpenAICompatibleModel):
36
54
  r"""Moonshot API in a unified OpenAICompatibleModel interface.
@@ -45,7 +63,9 @@ class MoonshotModel(OpenAICompatibleModel):
45
63
  api_key (Optional[str], optional): The API key for authenticating with
46
64
  the Moonshot service. (default: :obj:`None`)
47
65
  url (Optional[str], optional): The url to the Moonshot service.
48
- (default: :obj:`https://api.moonshot.cn/v1`)
66
+ For Chinese users, use :obj:`https://api.moonshot.cn/v1`.
67
+ For overseas users, the default endpoint will be used.
68
+ (default: :obj:`https://api.moonshot.ai/v1`)
49
69
  token_counter (Optional[BaseTokenCounter], optional): Token counter to
50
70
  use for the model. If not provided, :obj:`OpenAITokenCounter(
51
71
  ModelType.GPT_4)` will be used.
@@ -54,6 +74,10 @@ class MoonshotModel(OpenAICompatibleModel):
54
74
  API calls. If not provided, will fall back to the MODEL_TIMEOUT
55
75
  environment variable or default to 180 seconds.
56
76
  (default: :obj:`None`)
77
+ max_retries (int, optional): Maximum number of retries for API calls.
78
+ (default: :obj:`3`)
79
+ **kwargs (Any): Additional arguments to pass to the client
80
+ initialization.
57
81
  """
58
82
 
59
83
  @api_keys_required([("api_key", "MOONSHOT_API_KEY")])
@@ -65,14 +89,18 @@ class MoonshotModel(OpenAICompatibleModel):
65
89
  url: Optional[str] = None,
66
90
  token_counter: Optional[BaseTokenCounter] = None,
67
91
  timeout: Optional[float] = None,
92
+ max_retries: int = 3,
93
+ **kwargs: Any,
68
94
  ) -> None:
69
95
  if model_config_dict is None:
70
96
  model_config_dict = MoonshotConfig().as_dict()
71
97
  api_key = api_key or os.environ.get("MOONSHOT_API_KEY")
72
- url = url or os.environ.get(
73
- "MOONSHOT_API_BASE_URL",
74
- "https://api.moonshot.cn/v1",
75
- )
98
+ # Preserve default URL if not provided
99
+ if url is None:
100
+ url = (
101
+ os.environ.get("MOONSHOT_API_BASE_URL")
102
+ or "https://api.moonshot.ai/v1"
103
+ )
76
104
  timeout = timeout or float(os.environ.get("MODEL_TIMEOUT", 180))
77
105
  super().__init__(
78
106
  model_type=model_type,
@@ -81,27 +109,161 @@ class MoonshotModel(OpenAICompatibleModel):
81
109
  url=url,
82
110
  token_counter=token_counter,
83
111
  timeout=timeout,
112
+ max_retries=max_retries,
113
+ **kwargs,
84
114
  )
85
115
 
116
+ def _prepare_request(
117
+ self,
118
+ messages: List[OpenAIMessage],
119
+ response_format: Optional[Type[BaseModel]] = None,
120
+ tools: Optional[List[Dict[str, Any]]] = None,
121
+ ) -> Dict[str, Any]:
122
+ r"""Prepare the request configuration for Moonshot API.
123
+
124
+ Args:
125
+ messages (List[OpenAIMessage]): Message list with the chat history
126
+ in OpenAI API format.
127
+ response_format (Optional[Type[BaseModel]]): The format of the
128
+ response.
129
+ tools (Optional[List[Dict[str, Any]]]): The schema of the tools to
130
+ use for the request.
131
+
132
+ Returns:
133
+ Dict[str, Any]: The prepared request configuration.
134
+ """
135
+ request_config = copy.deepcopy(self.model_config_dict)
136
+
137
+ if tools:
138
+ # Clean tools to remove null types (Moonshot API incompatibility)
139
+ cleaned_tools = self._clean_tool_schemas(tools)
140
+ request_config["tools"] = cleaned_tools
141
+ elif response_format:
142
+ # Use the same approach as DeepSeek for structured output
143
+ try_modify_message_with_format(messages[-1], response_format)
144
+ request_config["response_format"] = {"type": "json_object"}
145
+
146
+ return request_config
147
+
148
+ def _clean_tool_schemas(
149
+ self, tools: List[Dict[str, Any]]
150
+ ) -> List[Dict[str, Any]]:
151
+ r"""Clean tool schemas to remove null types for Moonshot compatibility.
152
+
153
+ Moonshot API doesn't accept {"type": "null"} in anyOf schemas.
154
+ This method removes null type definitions from parameters.
155
+
156
+ Args:
157
+ tools (List[Dict[str, Any]]): Original tool schemas.
158
+
159
+ Returns:
160
+ List[Dict[str, Any]]: Cleaned tool schemas.
161
+ """
162
+
163
+ def remove_null_from_schema(schema: Any) -> Any:
164
+ """Recursively remove null types from schema."""
165
+ if isinstance(schema, dict):
166
+ # Create a copy to avoid modifying the original
167
+ result = {}
168
+
169
+ for key, value in schema.items():
170
+ if key == 'type' and isinstance(value, list):
171
+ # Handle type arrays like ["string", "null"]
172
+ filtered_types = [t for t in value if t != 'null']
173
+ if len(filtered_types) == 1:
174
+ # Single type remains, convert to string
175
+ result[key] = filtered_types[0]
176
+ elif len(filtered_types) > 1:
177
+ # Multiple types remain, keep as array
178
+ result[key] = filtered_types
179
+ else:
180
+ # All were null, use string as fallback
181
+ logger.warning(
182
+ "All types in tool schema type array "
183
+ "were null, falling back to 'string' "
184
+ "type for Moonshot API compatibility. "
185
+ "Original tool schema may need review."
186
+ )
187
+ result[key] = 'string'
188
+ elif key == 'anyOf':
189
+ # Handle anyOf with null types
190
+ filtered = [
191
+ item
192
+ for item in value
193
+ if not (
194
+ isinstance(item, dict)
195
+ and item.get('type') == 'null'
196
+ )
197
+ ]
198
+ if len(filtered) == 1:
199
+ # If only one type remains, flatten it
200
+ return remove_null_from_schema(filtered[0])
201
+ elif len(filtered) > 1:
202
+ result[key] = [
203
+ remove_null_from_schema(item)
204
+ for item in filtered
205
+ ]
206
+ else:
207
+ # All were null, return string type as fallback
208
+ logger.warning(
209
+ "All types in tool schema anyOf were null, "
210
+ "falling back to 'string' type for "
211
+ "Moonshot API compatibility. Original "
212
+ "tool schema may need review."
213
+ )
214
+ return {"type": "string"}
215
+ else:
216
+ # Recursively process other values
217
+ result[key] = remove_null_from_schema(value)
218
+
219
+ return result
220
+ elif isinstance(schema, list):
221
+ return [remove_null_from_schema(item) for item in schema]
222
+ else:
223
+ return schema
224
+
225
+ cleaned_tools = copy.deepcopy(tools)
226
+ for tool in cleaned_tools:
227
+ if 'function' in tool and 'parameters' in tool['function']:
228
+ params = tool['function']['parameters']
229
+ if 'properties' in params:
230
+ params['properties'] = remove_null_from_schema(
231
+ params['properties']
232
+ )
233
+
234
+ return cleaned_tools
235
+
236
+ @observe()
86
237
  async def _arun(
87
238
  self,
88
239
  messages: List[OpenAIMessage],
89
240
  response_format: Optional[Type[BaseModel]] = None,
90
241
  tools: Optional[List[Dict[str, Any]]] = None,
91
242
  ) -> Union[ChatCompletion, AsyncStream[ChatCompletionChunk]]:
92
- raise NotImplementedError("Moonshot does not support async inference.")
243
+ r"""Runs inference of Moonshot chat completion asynchronously.
93
244
 
94
- def check_model_config(self):
95
- r"""Check whether the model configuration contains any
96
- unexpected arguments to Moonshot API.
245
+ Args:
246
+ messages (List[OpenAIMessage]): Message list with the chat history
247
+ in OpenAI API format.
248
+ response_format (Optional[Type[BaseModel]]): The format of the
249
+ response.
250
+ tools (Optional[List[Dict[str, Any]]]): The schema of the tools to
251
+ use for the request.
97
252
 
98
- Raises:
99
- ValueError: If the model configuration dictionary contains any
100
- unexpected arguments to Moonshot API.
253
+ Returns:
254
+ Union[ChatCompletion, AsyncStream[ChatCompletionChunk]]:
255
+ `ChatCompletion` in the non-stream mode, or
256
+ `AsyncStream[ChatCompletionChunk]` in the stream mode.
101
257
  """
102
- for param in self.model_config_dict:
103
- if param not in MOONSHOT_API_PARAMS:
104
- raise ValueError(
105
- f"Unexpected argument `{param}` is "
106
- "input into Moonshot model backend."
107
- )
258
+
259
+ self._log_and_trace()
260
+
261
+ request_config = self._prepare_request(
262
+ messages, response_format, tools
263
+ )
264
+
265
+ return await self._async_client.chat.completions.create(
266
+ messages=messages,
267
+ model=self.model_type,
268
+ **request_config,
269
+ )
@@ -0,0 +1,83 @@
1
+ # ========= Copyright 2023-2026 @ 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-2026 @ CAMEL-AI.org. All Rights Reserved. =========
14
+ import os
15
+ from typing import Any, Dict, Optional, Union
16
+
17
+ from camel.configs import NebiusConfig
18
+ from camel.models.openai_compatible_model import OpenAICompatibleModel
19
+ from camel.types import ModelType
20
+ from camel.utils import (
21
+ BaseTokenCounter,
22
+ api_keys_required,
23
+ )
24
+
25
+
26
+ class NebiusModel(OpenAICompatibleModel):
27
+ r"""LLM API served by Nebius AI Studio in a unified OpenAICompatibleModel
28
+ interface.
29
+
30
+ Args:
31
+ model_type (Union[ModelType, str]): Model for which a backend is
32
+ created.
33
+ model_config_dict (Optional[Dict[str, Any]], optional): A dictionary
34
+ that will be fed into:obj:`openai.ChatCompletion.create()`.
35
+ If:obj:`None`, :obj:`NebiusConfig().as_dict()` will be used.
36
+ (default: :obj:`None`)
37
+ api_key (Optional[str], optional): The API key for authenticating
38
+ with the Nebius AI Studio service. (default: :obj:`None`).
39
+ url (Optional[str], optional): The url to the Nebius AI Studio service.
40
+ (default: :obj:`None`)
41
+ token_counter (Optional[BaseTokenCounter], optional): Token counter to
42
+ use for the model. If not provided, :obj:`OpenAITokenCounter(
43
+ ModelType.GPT_4O_MINI)` will be used.
44
+ (default: :obj:`None`)
45
+ timeout (Optional[float], optional): The timeout value in seconds for
46
+ API calls. If not provided, will fall back to the MODEL_TIMEOUT
47
+ environment variable or default to 180 seconds.
48
+ (default: :obj:`None`)
49
+ max_retries (int, optional): Maximum number of retries for API calls.
50
+ (default: :obj:`3`)
51
+ **kwargs (Any): Additional arguments to pass to the client
52
+ initialization.
53
+ """
54
+
55
+ @api_keys_required([("api_key", "NEBIUS_API_KEY")])
56
+ def __init__(
57
+ self,
58
+ model_type: Union[ModelType, str],
59
+ model_config_dict: Optional[Dict[str, Any]] = None,
60
+ api_key: Optional[str] = None,
61
+ url: Optional[str] = None,
62
+ token_counter: Optional[BaseTokenCounter] = None,
63
+ timeout: Optional[float] = None,
64
+ max_retries: int = 3,
65
+ **kwargs: Any,
66
+ ) -> None:
67
+ if model_config_dict is None:
68
+ model_config_dict = NebiusConfig().as_dict()
69
+ api_key = api_key or os.environ.get("NEBIUS_API_KEY")
70
+ url = url or os.environ.get(
71
+ "NEBIUS_API_BASE_URL", "https://api.studio.nebius.com/v1"
72
+ )
73
+ timeout = timeout or float(os.environ.get("MODEL_TIMEOUT", 180))
74
+ super().__init__(
75
+ model_type=model_type,
76
+ model_config_dict=model_config_dict,
77
+ api_key=api_key,
78
+ url=url,
79
+ token_counter=token_counter,
80
+ timeout=timeout,
81
+ max_retries=max_retries,
82
+ **kwargs,
83
+ )
@@ -1,4 +1,4 @@
1
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
1
+ # ========= Copyright 2023-2026 @ CAMEL-AI.org. All Rights Reserved. =========
2
2
  # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
@@ -10,9 +10,9 @@
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
13
+ # ========= Copyright 2023-2026 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
  import os
15
- from typing import Optional, Union
15
+ from typing import Any, Optional, Union
16
16
 
17
17
  from camel.models.openai_compatible_model import OpenAICompatibleModel
18
18
  from camel.types import ModelType
@@ -36,6 +36,10 @@ class NemotronModel(OpenAICompatibleModel):
36
36
  API calls. If not provided, will fall back to the MODEL_TIMEOUT
37
37
  environment variable or default to 180 seconds.
38
38
  (default: :obj:`None`)
39
+ max_retries (int, optional): Maximum number of retries for API calls.
40
+ (default: :obj:`3`)
41
+ **kwargs (Any): Additional arguments to pass to the client
42
+ initialization.
39
43
 
40
44
  Notes:
41
45
  Nemotron model doesn't support additional model config like OpenAI.
@@ -52,21 +56,27 @@ class NemotronModel(OpenAICompatibleModel):
52
56
  api_key: Optional[str] = None,
53
57
  url: Optional[str] = None,
54
58
  timeout: Optional[float] = None,
59
+ max_retries: int = 3,
60
+ **kwargs: Any,
55
61
  ) -> None:
56
62
  url = url or os.environ.get(
57
63
  "NVIDIA_API_BASE_URL", "https://integrate.api.nvidia.com/v1"
58
64
  )
59
65
  api_key = api_key or os.environ.get("NVIDIA_API_KEY")
60
66
  timeout = timeout or float(os.environ.get("MODEL_TIMEOUT", 180))
61
- super().__init__(model_type, {}, api_key, url, None, timeout)
67
+ super().__init__(
68
+ model_type,
69
+ {},
70
+ api_key,
71
+ url,
72
+ None,
73
+ timeout,
74
+ max_retries=max_retries,
75
+ **kwargs,
76
+ )
62
77
 
63
78
  @property
64
79
  def token_counter(self) -> BaseTokenCounter:
65
80
  raise NotImplementedError(
66
81
  "Nemotron model doesn't support token counter."
67
82
  )
68
-
69
- def check_model_config(self):
70
- raise NotImplementedError(
71
- "Nemotron model doesn't support model config."
72
- )