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 QWEN_API_PARAMS, QwenConfig
22
- from camel.messages import OpenAIMessage
18
+ from camel.configs import QwenConfig
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,
@@ -54,6 +46,10 @@ class QwenModel(OpenAICompatibleModel):
54
46
  API calls. If not provided, will fall back to the MODEL_TIMEOUT
55
47
  environment variable or default to 180 seconds.
56
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.
57
53
  """
58
54
 
59
55
  @api_keys_required(
@@ -69,6 +65,8 @@ class QwenModel(OpenAICompatibleModel):
69
65
  url: Optional[str] = None,
70
66
  token_counter: Optional[BaseTokenCounter] = None,
71
67
  timeout: Optional[float] = None,
68
+ max_retries: int = 3,
69
+ **kwargs: Any,
72
70
  ) -> None:
73
71
  if model_config_dict is None:
74
72
  model_config_dict = QwenConfig().as_dict()
@@ -85,184 +83,6 @@ class QwenModel(OpenAICompatibleModel):
85
83
  url=url,
86
84
  token_counter=token_counter,
87
85
  timeout=timeout,
86
+ max_retries=max_retries,
87
+ **kwargs,
88
88
  )
89
-
90
- def _post_handle_response(
91
- self, response: Union[ChatCompletion, Stream[ChatCompletionChunk]]
92
- ) -> ChatCompletion:
93
- r"""Handle reasoning content with <think> tags at the beginning."""
94
- if not isinstance(response, Stream):
95
- # Handle non-streaming response (existing logic)
96
- if self.model_config_dict.get("extra_body", {}).get(
97
- "enable_thinking", False
98
- ):
99
- reasoning_content = response.choices[
100
- 0
101
- ].message.reasoning_content # type: ignore[attr-defined]
102
- combined_content = (
103
- f"<think>\n{reasoning_content}\n</think>\n"
104
- if reasoning_content
105
- else ""
106
- )
107
- response_content = response.choices[0].message.content or ""
108
- combined_content += response_content
109
-
110
- # Construct a new ChatCompletion with combined content
111
- return ChatCompletion.construct(
112
- id=response.id,
113
- choices=[
114
- dict(
115
- finish_reason=response.choices[0].finish_reason,
116
- index=response.choices[0].index,
117
- logprobs=response.choices[0].logprobs,
118
- message=dict(
119
- role=response.choices[0].message.role,
120
- content=combined_content,
121
- ),
122
- )
123
- ],
124
- created=response.created,
125
- model=response.model,
126
- object="chat.completion",
127
- system_fingerprint=response.system_fingerprint,
128
- usage=response.usage,
129
- )
130
- else:
131
- return response # Return original if no thinking enabled
132
-
133
- # Handle streaming response
134
- accumulated_reasoning = ""
135
- accumulated_content = ""
136
- final_chunk = None
137
- usage_data = None # Initialize usage data
138
- role = "assistant" # Default role
139
-
140
- for chunk in response:
141
- final_chunk = chunk # Keep track of the last chunk for metadata
142
- if chunk.choices:
143
- delta = chunk.choices[0].delta
144
- if delta.role:
145
- role = delta.role # Update role if provided
146
- if (
147
- hasattr(delta, 'reasoning_content')
148
- and delta.reasoning_content
149
- ):
150
- accumulated_reasoning += delta.reasoning_content
151
- if delta.content:
152
- accumulated_content += delta.content
153
-
154
- if hasattr(chunk, 'usage') and chunk.usage:
155
- usage_data = chunk.usage
156
-
157
- combined_content = (
158
- f"<think>\n{accumulated_reasoning}\n</think>\n"
159
- if accumulated_reasoning
160
- else ""
161
- ) + accumulated_content
162
-
163
- # Construct the final ChatCompletion object from accumulated
164
- # stream data
165
- if final_chunk:
166
- finish_reason = "stop" # Default finish reason
167
- logprobs = None
168
- if final_chunk.choices:
169
- finish_reason = (
170
- final_chunk.choices[0].finish_reason or finish_reason
171
- )
172
- if hasattr(final_chunk.choices[0], 'logprobs'):
173
- logprobs = final_chunk.choices[0].logprobs
174
-
175
- return ChatCompletion.construct(
176
- # Use data from the final chunk or defaults
177
- id=final_chunk.id
178
- if hasattr(final_chunk, 'id')
179
- else "streamed-completion",
180
- choices=[
181
- dict(
182
- finish_reason=finish_reason,
183
- index=0,
184
- logprobs=logprobs,
185
- message=dict(
186
- role=role,
187
- content=combined_content,
188
- ),
189
- )
190
- ],
191
- created=final_chunk.created
192
- if hasattr(final_chunk, 'created')
193
- else int(time.time()),
194
- model=final_chunk.model
195
- if hasattr(final_chunk, 'model')
196
- else self.model_type,
197
- object="chat.completion",
198
- system_fingerprint=final_chunk.system_fingerprint
199
- if hasattr(final_chunk, 'system_fingerprint')
200
- else None,
201
- usage=usage_data,
202
- )
203
- else:
204
- # Handle cases where the stream was empty or invalid
205
- return ChatCompletion.construct(
206
- id="empty-stream",
207
- choices=[
208
- dict(
209
- finish_reason="error",
210
- index=0,
211
- message=dict(role="assistant", content=""),
212
- )
213
- ],
214
- created=int(time.time()),
215
- model=self.model_type,
216
- object="chat.completion",
217
- usage=usage_data,
218
- )
219
-
220
- def _request_chat_completion(
221
- self,
222
- messages: List[OpenAIMessage],
223
- tools: Optional[List[Dict[str, Any]]] = None,
224
- ) -> Union[ChatCompletion, Stream[ChatCompletionChunk]]:
225
- request_config = self.model_config_dict.copy()
226
-
227
- if tools:
228
- request_config["tools"] = tools
229
-
230
- return self._post_handle_response(
231
- self._client.chat.completions.create(
232
- messages=messages,
233
- model=self.model_type,
234
- **request_config,
235
- )
236
- )
237
-
238
- async def _arequest_chat_completion(
239
- self,
240
- messages: List[OpenAIMessage],
241
- tools: Optional[List[Dict[str, Any]]] = None,
242
- ) -> Union[ChatCompletion, AsyncStream[ChatCompletionChunk]]:
243
- request_config = self.model_config_dict.copy()
244
-
245
- if tools:
246
- request_config["tools"] = tools
247
-
248
- response = await self._async_client.chat.completions.create(
249
- messages=messages,
250
- model=self.model_type,
251
- **request_config,
252
- )
253
- return self._post_handle_response(response)
254
-
255
- def check_model_config(self):
256
- r"""Check whether the model configuration contains any
257
- unexpected arguments to Qwen API.
258
-
259
- Raises:
260
- ValueError: If the model configuration dictionary contains any
261
- unexpected arguments to Qwen API.
262
- """
263
- for param in self.model_config_dict:
264
- if param not in QWEN_API_PARAMS:
265
- raise ValueError(
266
- f"Unexpected argument `{param}` is "
267
- "input into Qwen model backend."
268
- )
@@ -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,13 +10,13 @@
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
15
  from typing import TYPE_CHECKING, Any, Dict, List, Optional, Type, Union
16
16
 
17
17
  from pydantic import BaseModel
18
18
 
19
- from camel.configs import REKA_API_PARAMS, RekaConfig
19
+ from camel.configs import RekaConfig
20
20
  from camel.messages import OpenAIMessage
21
21
  from camel.models import BaseModelBackend
22
22
  from camel.types import ChatCompletion, ModelType
@@ -25,9 +25,7 @@ from camel.utils import (
25
25
  OpenAITokenCounter,
26
26
  api_keys_required,
27
27
  dependencies_required,
28
- get_current_agent_session_id,
29
28
  update_current_observation,
30
- update_langfuse_trace,
31
29
  )
32
30
 
33
31
  if os.environ.get("LANGFUSE_ENABLED", "False").lower() == "true":
@@ -72,6 +70,8 @@ class RekaModel(BaseModelBackend):
72
70
  API calls. If not provided, will fall back to the MODEL_TIMEOUT
73
71
  environment variable or default to 180 seconds.
74
72
  (default: :obj:`None`)
73
+ **kwargs (Any): Additional arguments to pass to the client
74
+ initialization.
75
75
  """
76
76
 
77
77
  @api_keys_required(
@@ -88,6 +88,7 @@ class RekaModel(BaseModelBackend):
88
88
  url: Optional[str] = None,
89
89
  token_counter: Optional[BaseTokenCounter] = None,
90
90
  timeout: Optional[float] = None,
91
+ **kwargs: Any,
91
92
  ) -> None:
92
93
  from reka.client import AsyncReka, Reka
93
94
 
@@ -97,13 +98,25 @@ class RekaModel(BaseModelBackend):
97
98
  url = url or os.environ.get("REKA_API_BASE_URL")
98
99
  timeout = timeout or float(os.environ.get("MODEL_TIMEOUT", 180))
99
100
  super().__init__(
100
- model_type, model_config_dict, api_key, url, token_counter, timeout
101
+ model_type,
102
+ model_config_dict,
103
+ api_key,
104
+ url,
105
+ token_counter,
106
+ timeout,
107
+ **kwargs,
101
108
  )
102
109
  self._client = Reka(
103
- api_key=self._api_key, base_url=self._url, timeout=self._timeout
110
+ api_key=self._api_key,
111
+ base_url=self._url,
112
+ timeout=self._timeout,
113
+ **kwargs,
104
114
  )
105
115
  self._async_client = AsyncReka(
106
- api_key=self._api_key, base_url=self._url, timeout=self._timeout
116
+ api_key=self._api_key,
117
+ base_url=self._url,
118
+ timeout=self._timeout,
119
+ **kwargs,
107
120
  )
108
121
 
109
122
  def _convert_reka_to_openai_response(
@@ -225,19 +238,7 @@ class RekaModel(BaseModelBackend):
225
238
  model=str(self.model_type),
226
239
  model_parameters=self.model_config_dict,
227
240
  )
228
- # Update Langfuse trace with current agent session and metadata
229
- agent_session_id = get_current_agent_session_id()
230
- if agent_session_id:
231
- update_langfuse_trace(
232
- session_id=agent_session_id,
233
- metadata={
234
- "source": "camel",
235
- "agent_id": agent_session_id,
236
- "agent_type": "camel_chat_agent",
237
- "model_type": str(self.model_type),
238
- },
239
- tags=["CAMEL-AI", str(self.model_type)],
240
- )
241
+ self._log_and_trace()
241
242
 
242
243
  reka_messages = self._convert_openai_to_reka_messages(messages)
243
244
 
@@ -295,19 +296,7 @@ class RekaModel(BaseModelBackend):
295
296
  model_parameters=self.model_config_dict,
296
297
  )
297
298
 
298
- # Update Langfuse trace with current agent session and metadata
299
- agent_session_id = get_current_agent_session_id()
300
- if agent_session_id:
301
- update_langfuse_trace(
302
- session_id=agent_session_id,
303
- metadata={
304
- "source": "camel",
305
- "agent_id": agent_session_id,
306
- "agent_type": "camel_chat_agent",
307
- "model_type": str(self.model_type),
308
- },
309
- tags=["CAMEL-AI", str(self.model_type)],
310
- )
299
+ self._log_and_trace()
311
300
 
312
301
  reka_messages = self._convert_openai_to_reka_messages(messages)
313
302
 
@@ -339,21 +328,6 @@ class RekaModel(BaseModelBackend):
339
328
 
340
329
  return openai_response
341
330
 
342
- def check_model_config(self):
343
- r"""Check whether the model configuration contains any
344
- unexpected arguments to Reka API.
345
-
346
- Raises:
347
- ValueError: If the model configuration dictionary contains any
348
- unexpected arguments to Reka API.
349
- """
350
- for param in self.model_config_dict:
351
- if param not in REKA_API_PARAMS:
352
- raise ValueError(
353
- f"Unexpected argument `{param}` is "
354
- "input into Reka model backend."
355
- )
356
-
357
331
  @property
358
332
  def stream(self) -> bool:
359
333
  r"""Returns whether the model is in stream mode, which sends partial
@@ -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,7 +10,7 @@
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
  from .base_reward_model import BaseRewardModel
15
15
  from .evaluator import Evaluator
16
16
  from .nemotron_model import NemotronRewardModel
@@ -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,7 +10,7 @@
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
  from abc import ABC, abstractmethod
15
15
  from typing import Dict, List, Optional, Union
16
16
 
@@ -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,7 +10,7 @@
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
  from typing import Dict, List
15
15
 
16
16
  from camel.models.reward import BaseRewardModel
@@ -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,7 +10,7 @@
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
15
  from typing import Dict, List, Optional, Union
16
16
 
@@ -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,7 +10,7 @@
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
  from typing import Dict, List, Optional, Union
15
15
 
16
16
  import torch
@@ -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,7 +10,7 @@
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 json
15
15
  import os
16
16
  import time
@@ -22,8 +22,6 @@ from openai import AsyncOpenAI, AsyncStream, OpenAI, Stream
22
22
  from pydantic import BaseModel
23
23
 
24
24
  from camel.configs import (
25
- SAMBA_CLOUD_API_PARAMS,
26
- SAMBA_VERSE_API_PARAMS,
27
25
  SambaCloudAPIConfig,
28
26
  )
29
27
  from camel.messages import OpenAIMessage
@@ -38,9 +36,7 @@ from camel.utils import (
38
36
  BaseTokenCounter,
39
37
  OpenAITokenCounter,
40
38
  api_keys_required,
41
- get_current_agent_session_id,
42
39
  update_current_observation,
43
- update_langfuse_trace,
44
40
  )
45
41
 
46
42
  try:
@@ -88,6 +84,18 @@ class SambaModel(BaseModelBackend):
88
84
  API calls. If not provided, will fall back to the MODEL_TIMEOUT
89
85
  environment variable or default to 180 seconds.
90
86
  (default: :obj:`None`)
87
+ max_retries (int, optional): Maximum number of retries for API calls.
88
+ (default: :obj:`3`)
89
+ client (Optional[Any], optional): A custom synchronous
90
+ OpenAI-compatible client instance. If provided, this client will
91
+ be used instead of creating a new one. Only applicable when using
92
+ SambaNova Cloud API. (default: :obj:`None`)
93
+ async_client (Optional[Any], optional): A custom asynchronous
94
+ OpenAI-compatible client instance. If provided, this client will
95
+ be used instead of creating a new one. Only applicable when using
96
+ SambaNova Cloud API. (default: :obj:`None`)
97
+ **kwargs (Any): Additional arguments to pass to the client
98
+ initialization. Ignored if custom clients are provided.
91
99
  """
92
100
 
93
101
  @api_keys_required(
@@ -103,6 +111,10 @@ class SambaModel(BaseModelBackend):
103
111
  url: Optional[str] = None,
104
112
  token_counter: Optional[BaseTokenCounter] = None,
105
113
  timeout: Optional[float] = None,
114
+ max_retries: int = 3,
115
+ client: Optional[Any] = None,
116
+ async_client: Optional[Any] = None,
117
+ **kwargs: Any,
106
118
  ) -> None:
107
119
  if model_config_dict is None:
108
120
  model_config_dict = SambaCloudAPIConfig().as_dict()
@@ -113,22 +125,39 @@ class SambaModel(BaseModelBackend):
113
125
  )
114
126
  timeout = timeout or float(os.environ.get("MODEL_TIMEOUT", 180))
115
127
  super().__init__(
116
- model_type, model_config_dict, api_key, url, token_counter, timeout
128
+ model_type,
129
+ model_config_dict,
130
+ api_key,
131
+ url,
132
+ token_counter,
133
+ timeout,
134
+ max_retries,
117
135
  )
118
136
 
137
+ # Only create clients for Cloud API mode
119
138
  if self._url == "https://api.sambanova.ai/v1":
120
- self._client = OpenAI(
121
- timeout=self._timeout,
122
- max_retries=3,
123
- base_url=self._url,
124
- api_key=self._api_key,
125
- )
126
- self._async_client = AsyncOpenAI(
127
- timeout=self._timeout,
128
- max_retries=3,
129
- base_url=self._url,
130
- api_key=self._api_key,
131
- )
139
+ # Use custom clients if provided, otherwise create new ones
140
+ if client is not None:
141
+ self._client = client
142
+ else:
143
+ self._client = OpenAI(
144
+ timeout=self._timeout,
145
+ max_retries=self._max_retries,
146
+ base_url=self._url,
147
+ api_key=self._api_key,
148
+ **kwargs,
149
+ )
150
+
151
+ if async_client is not None:
152
+ self._async_client = async_client
153
+ else:
154
+ self._async_client = AsyncOpenAI(
155
+ timeout=self._timeout,
156
+ max_retries=self._max_retries,
157
+ base_url=self._url,
158
+ api_key=self._api_key,
159
+ **kwargs,
160
+ )
132
161
 
133
162
  @property
134
163
  def token_counter(self) -> BaseTokenCounter:
@@ -142,36 +171,6 @@ class SambaModel(BaseModelBackend):
142
171
  self._token_counter = OpenAITokenCounter(ModelType.GPT_4O_MINI)
143
172
  return self._token_counter
144
173
 
145
- def check_model_config(self):
146
- r"""Check whether the model configuration contains any
147
- unexpected arguments to SambaNova API.
148
-
149
- Raises:
150
- ValueError: If the model configuration dictionary contains any
151
- unexpected arguments to SambaNova API.
152
- """
153
- if self._url == "https://sambaverse.sambanova.ai/api/predict":
154
- for param in self.model_config_dict:
155
- if param not in SAMBA_VERSE_API_PARAMS:
156
- raise ValueError(
157
- f"Unexpected argument `{param}` is "
158
- "input into SambaVerse API."
159
- )
160
-
161
- elif self._url == "https://api.sambanova.ai/v1":
162
- for param in self.model_config_dict:
163
- if param not in SAMBA_CLOUD_API_PARAMS:
164
- raise ValueError(
165
- f"Unexpected argument `{param}` is "
166
- "input into SambaCloud API."
167
- )
168
-
169
- else:
170
- raise ValueError(
171
- f"{self._url} is not supported, please check the url to the"
172
- " SambaNova service"
173
- )
174
-
175
174
  @observe(as_type="generation")
176
175
  async def _arun( # type: ignore[misc]
177
176
  self,
@@ -200,19 +199,7 @@ class SambaModel(BaseModelBackend):
200
199
  model_parameters=self.model_config_dict,
201
200
  )
202
201
 
203
- # Update Langfuse trace with current agent session and metadata
204
- agent_session_id = get_current_agent_session_id()
205
- if agent_session_id:
206
- update_langfuse_trace(
207
- session_id=agent_session_id,
208
- metadata={
209
- "source": "camel",
210
- "agent_id": agent_session_id,
211
- "agent_type": "camel_chat_agent",
212
- "model_type": str(self.model_type),
213
- },
214
- tags=["CAMEL-AI", str(self.model_type)],
215
- )
202
+ self._log_and_trace()
216
203
 
217
204
  if "tools" in self.model_config_dict:
218
205
  del self.model_config_dict["tools"]
@@ -251,19 +238,7 @@ class SambaModel(BaseModelBackend):
251
238
  model=str(self.model_type),
252
239
  model_parameters=self.model_config_dict,
253
240
  )
254
- # Update Langfuse trace with current agent session and metadata
255
- agent_session_id = get_current_agent_session_id()
256
- if agent_session_id:
257
- update_langfuse_trace(
258
- session_id=agent_session_id,
259
- metadata={
260
- "source": "camel",
261
- "agent_id": agent_session_id,
262
- "agent_type": "camel_chat_agent",
263
- "model_type": str(self.model_type),
264
- },
265
- tags=["CAMEL-AI", str(self.model_type)],
266
- )
241
+ self._log_and_trace()
267
242
 
268
243
  if "tools" in self.model_config_dict:
269
244
  del self.model_config_dict["tools"]