camel-ai 0.2.59__py3-none-any.whl → 0.2.82__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 (506) 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 +5012 -902
  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 +39 -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 +94 -0
  28. camel/benchmarks/mock_website/mock_web.py +299 -0
  29. camel/benchmarks/mock_website/requirements.txt +3 -0
  30. camel/benchmarks/mock_website/shopping_mall/app.py +465 -0
  31. camel/benchmarks/mock_website/task.json +104 -0
  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 +26 -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 +8 -7
  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 +3 -3
  52. camel/configs/cometapi_config.py +106 -0
  53. camel/configs/crynux_config.py +94 -0
  54. camel/configs/deepseek_config.py +9 -8
  55. camel/configs/gemini_config.py +6 -4
  56. camel/configs/groq_config.py +6 -4
  57. camel/configs/internlm_config.py +6 -4
  58. camel/configs/litellm_config.py +2 -2
  59. camel/configs/lmstudio_config.py +6 -4
  60. camel/configs/minimax_config.py +95 -0
  61. camel/configs/mistral_config.py +3 -3
  62. camel/configs/modelscope_config.py +5 -3
  63. camel/configs/moonshot_config.py +2 -2
  64. camel/configs/nebius_config.py +105 -0
  65. camel/configs/netmind_config.py +2 -2
  66. camel/configs/novita_config.py +2 -2
  67. camel/configs/nvidia_config.py +2 -2
  68. camel/configs/ollama_config.py +2 -2
  69. camel/configs/openai_config.py +8 -3
  70. camel/configs/openrouter_config.py +6 -4
  71. camel/configs/ppio_config.py +2 -2
  72. camel/configs/qianfan_config.py +85 -0
  73. camel/configs/qwen_config.py +2 -2
  74. camel/configs/reka_config.py +3 -3
  75. camel/configs/samba_config.py +8 -6
  76. camel/configs/sglang_config.py +2 -2
  77. camel/configs/siliconflow_config.py +2 -2
  78. camel/configs/togetherai_config.py +2 -2
  79. camel/configs/vllm_config.py +4 -2
  80. camel/configs/watsonx_config.py +2 -2
  81. camel/configs/yi_config.py +6 -4
  82. camel/configs/zhipuai_config.py +6 -4
  83. camel/{data_collector → data_collectors}/__init__.py +2 -2
  84. camel/{data_collector → data_collectors}/alpaca_collector.py +19 -10
  85. camel/{data_collector → data_collectors}/base.py +2 -2
  86. camel/{data_collector → data_collectors}/sharegpt_collector.py +3 -3
  87. camel/datagen/__init__.py +2 -2
  88. camel/datagen/cot_datagen.py +32 -37
  89. camel/datagen/evol_instruct/__init__.py +2 -2
  90. camel/datagen/evol_instruct/evol_instruct.py +2 -2
  91. camel/datagen/evol_instruct/scorer.py +24 -25
  92. camel/datagen/evol_instruct/templates.py +48 -48
  93. camel/datagen/self_improving_cot.py +5 -5
  94. camel/datagen/self_instruct/__init__.py +2 -2
  95. camel/datagen/self_instruct/filter/__init__.py +2 -2
  96. camel/datagen/self_instruct/filter/filter_function.py +2 -2
  97. camel/datagen/self_instruct/filter/filter_registry.py +2 -2
  98. camel/datagen/self_instruct/filter/instruction_filter.py +2 -2
  99. camel/datagen/self_instruct/self_instruct.py +2 -2
  100. camel/datagen/self_instruct/templates.py +47 -47
  101. camel/datagen/source2synth/__init__.py +2 -2
  102. camel/datagen/source2synth/data_processor.py +2 -2
  103. camel/datagen/source2synth/models.py +2 -2
  104. camel/datagen/source2synth/user_data_processor_config.py +2 -2
  105. camel/datahubs/__init__.py +2 -2
  106. camel/datahubs/base.py +2 -2
  107. camel/datahubs/huggingface.py +2 -2
  108. camel/datahubs/models.py +2 -2
  109. camel/datasets/__init__.py +2 -2
  110. camel/datasets/base_generator.py +41 -12
  111. camel/datasets/few_shot_generator.py +18 -18
  112. camel/datasets/models.py +3 -3
  113. camel/datasets/self_instruct_generator.py +2 -2
  114. camel/datasets/static_dataset.py +152 -2
  115. camel/embeddings/__init__.py +2 -2
  116. camel/embeddings/azure_embedding.py +2 -2
  117. camel/embeddings/base.py +2 -2
  118. camel/embeddings/gemini_embedding.py +2 -2
  119. camel/embeddings/jina_embedding.py +10 -3
  120. camel/embeddings/mistral_embedding.py +2 -2
  121. camel/embeddings/openai_compatible_embedding.py +2 -2
  122. camel/embeddings/openai_embedding.py +2 -2
  123. camel/embeddings/sentence_transformers_embeddings.py +4 -4
  124. camel/embeddings/together_embedding.py +2 -2
  125. camel/embeddings/vlm_embedding.py +11 -4
  126. camel/environments/__init__.py +14 -2
  127. camel/environments/models.py +2 -2
  128. camel/environments/multi_step.py +2 -2
  129. camel/environments/rlcards_env.py +860 -0
  130. camel/environments/single_step.py +30 -5
  131. camel/environments/tic_tac_toe.py +3 -3
  132. camel/extractors/__init__.py +2 -2
  133. camel/extractors/base.py +2 -2
  134. camel/extractors/python_strategies.py +2 -2
  135. camel/generators.py +2 -2
  136. camel/human.py +2 -2
  137. camel/interpreters/__init__.py +4 -2
  138. camel/interpreters/base.py +16 -3
  139. camel/interpreters/docker/Dockerfile +53 -7
  140. camel/interpreters/docker_interpreter.py +70 -11
  141. camel/interpreters/e2b_interpreter.py +59 -11
  142. camel/interpreters/internal_python_interpreter.py +81 -4
  143. camel/interpreters/interpreter_error.py +2 -2
  144. camel/interpreters/ipython_interpreter.py +23 -5
  145. camel/interpreters/microsandbox_interpreter.py +395 -0
  146. camel/interpreters/subprocess_interpreter.py +36 -4
  147. camel/loaders/__init__.py +17 -5
  148. camel/loaders/apify_reader.py +2 -2
  149. camel/loaders/base_io.py +2 -2
  150. camel/loaders/base_loader.py +85 -0
  151. camel/loaders/chunkr_reader.py +128 -93
  152. camel/loaders/crawl4ai_reader.py +2 -2
  153. camel/loaders/firecrawl_reader.py +6 -6
  154. camel/loaders/jina_url_reader.py +2 -2
  155. camel/loaders/markitdown.py +2 -2
  156. camel/loaders/mineru_extractor.py +2 -2
  157. camel/loaders/mistral_reader.py +148 -0
  158. camel/loaders/scrapegraph_reader.py +2 -2
  159. camel/loaders/unstructured_io.py +2 -2
  160. camel/logger.py +5 -5
  161. camel/memories/__init__.py +2 -2
  162. camel/memories/agent_memories.py +86 -3
  163. camel/memories/base.py +36 -2
  164. camel/memories/blocks/__init__.py +2 -2
  165. camel/memories/blocks/chat_history_block.py +126 -9
  166. camel/memories/blocks/vectordb_block.py +10 -3
  167. camel/memories/context_creators/__init__.py +2 -2
  168. camel/memories/context_creators/score_based.py +31 -239
  169. camel/memories/records.py +98 -13
  170. camel/messages/__init__.py +2 -2
  171. camel/messages/base.py +193 -46
  172. camel/messages/conversion/__init__.py +2 -2
  173. camel/messages/conversion/alpaca.py +2 -2
  174. camel/messages/conversion/conversation_models.py +2 -2
  175. camel/messages/conversion/sharegpt/__init__.py +2 -2
  176. camel/messages/conversion/sharegpt/function_call_formatter.py +2 -2
  177. camel/messages/conversion/sharegpt/hermes/__init__.py +2 -2
  178. camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +2 -2
  179. camel/messages/func_message.py +54 -17
  180. camel/models/__init__.py +18 -2
  181. camel/models/_utils.py +3 -3
  182. camel/models/aihubmix_model.py +83 -0
  183. camel/models/aiml_model.py +11 -18
  184. camel/models/amd_model.py +101 -0
  185. camel/models/anthropic_model.py +127 -20
  186. camel/models/aws_bedrock_model.py +12 -35
  187. camel/models/azure_openai_model.py +263 -63
  188. camel/models/base_audio_model.py +5 -3
  189. camel/models/base_model.py +195 -26
  190. camel/models/cerebras_model.py +83 -0
  191. camel/models/cohere_model.py +81 -21
  192. camel/models/cometapi_model.py +83 -0
  193. camel/models/crynux_model.py +87 -0
  194. camel/models/deepseek_model.py +61 -59
  195. camel/models/fish_audio_model.py +8 -2
  196. camel/models/gemini_model.py +439 -30
  197. camel/models/groq_model.py +11 -19
  198. camel/models/internlm_model.py +11 -18
  199. camel/models/litellm_model.py +94 -34
  200. camel/models/lmstudio_model.py +17 -20
  201. camel/models/minimax_model.py +83 -0
  202. camel/models/mistral_model.py +84 -19
  203. camel/models/model_factory.py +49 -6
  204. camel/models/model_manager.py +33 -11
  205. camel/models/modelscope_model.py +13 -193
  206. camel/models/moonshot_model.py +195 -21
  207. camel/models/nebius_model.py +83 -0
  208. camel/models/nemotron_model.py +19 -9
  209. camel/models/netmind_model.py +11 -18
  210. camel/models/novita_model.py +11 -18
  211. camel/models/nvidia_model.py +11 -18
  212. camel/models/ollama_model.py +14 -21
  213. camel/models/openai_audio_models.py +2 -2
  214. camel/models/openai_compatible_model.py +234 -27
  215. camel/models/openai_model.py +255 -39
  216. camel/models/openrouter_model.py +11 -19
  217. camel/models/ppio_model.py +11 -18
  218. camel/models/qianfan_model.py +89 -0
  219. camel/models/qwen_model.py +13 -193
  220. camel/models/reka_model.py +90 -21
  221. camel/models/reward/__init__.py +2 -2
  222. camel/models/reward/base_reward_model.py +2 -2
  223. camel/models/reward/evaluator.py +2 -2
  224. camel/models/reward/nemotron_model.py +2 -2
  225. camel/models/reward/skywork_model.py +2 -2
  226. camel/models/samba_model.py +117 -49
  227. camel/models/sglang_model.py +162 -42
  228. camel/models/siliconflow_model.py +12 -35
  229. camel/models/stub_model.py +10 -7
  230. camel/models/togetherai_model.py +11 -18
  231. camel/models/vllm_model.py +10 -18
  232. camel/models/volcano_model.py +16 -20
  233. camel/models/watsonx_model.py +69 -19
  234. camel/models/yi_model.py +11 -18
  235. camel/models/zhipuai_model.py +70 -18
  236. camel/parsers/__init__.py +18 -0
  237. camel/parsers/mcp_tool_call_parser.py +176 -0
  238. camel/personas/__init__.py +2 -2
  239. camel/personas/persona.py +2 -2
  240. camel/personas/persona_hub.py +2 -2
  241. camel/prompts/__init__.py +2 -2
  242. camel/prompts/ai_society.py +2 -2
  243. camel/prompts/base.py +2 -2
  244. camel/prompts/code.py +2 -2
  245. camel/prompts/evaluation.py +2 -2
  246. camel/prompts/generate_text_embedding_data.py +2 -2
  247. camel/prompts/image_craft.py +2 -2
  248. camel/prompts/misalignment.py +2 -2
  249. camel/prompts/multi_condition_image_craft.py +2 -2
  250. camel/prompts/object_recognition.py +2 -2
  251. camel/prompts/persona_hub.py +3 -3
  252. camel/prompts/prompt_templates.py +2 -2
  253. camel/prompts/role_description_prompt_template.py +2 -2
  254. camel/prompts/solution_extraction.py +8 -8
  255. camel/prompts/task_prompt_template.py +2 -2
  256. camel/prompts/translation.py +2 -2
  257. camel/prompts/video_description_prompt.py +3 -3
  258. camel/responses/__init__.py +2 -2
  259. camel/responses/agent_responses.py +2 -2
  260. camel/retrievers/__init__.py +2 -2
  261. camel/retrievers/auto_retriever.py +23 -3
  262. camel/retrievers/base.py +2 -2
  263. camel/retrievers/bm25_retriever.py +3 -4
  264. camel/retrievers/cohere_rerank_retriever.py +2 -2
  265. camel/retrievers/hybrid_retrival.py +4 -4
  266. camel/retrievers/vector_retriever.py +2 -2
  267. camel/runtimes/Dockerfile.multi-toolkit +90 -0
  268. camel/{runtime → runtimes}/__init__.py +2 -2
  269. camel/runtimes/api.py +153 -0
  270. camel/{runtime → runtimes}/base.py +2 -2
  271. camel/{runtime → runtimes}/configs.py +13 -13
  272. camel/{runtime → runtimes}/daytona_runtime.py +18 -19
  273. camel/{runtime → runtimes}/docker_runtime.py +13 -13
  274. camel/{runtime → runtimes}/llm_guard_runtime.py +28 -28
  275. camel/{runtime → runtimes}/remote_http_runtime.py +12 -12
  276. camel/{runtime → runtimes}/ubuntu_docker_runtime.py +3 -3
  277. camel/{runtime → runtimes}/utils/__init__.py +2 -2
  278. camel/{runtime → runtimes}/utils/function_risk_toolkit.py +2 -2
  279. camel/{runtime → runtimes}/utils/ignore_risk_toolkit.py +2 -2
  280. camel/schemas/__init__.py +2 -2
  281. camel/schemas/base.py +2 -2
  282. camel/schemas/openai_converter.py +3 -3
  283. camel/schemas/outlines_converter.py +2 -2
  284. camel/services/agent_openapi_server.py +380 -0
  285. camel/societies/__init__.py +4 -2
  286. camel/societies/babyagi_playing.py +2 -2
  287. camel/societies/role_playing.py +201 -80
  288. camel/societies/workforce/__init__.py +10 -3
  289. camel/societies/workforce/base.py +9 -5
  290. camel/societies/workforce/events.py +143 -0
  291. camel/societies/workforce/prompts.py +258 -33
  292. camel/societies/workforce/role_playing_worker.py +95 -30
  293. camel/societies/workforce/single_agent_worker.py +659 -30
  294. camel/societies/workforce/structured_output_handler.py +512 -0
  295. camel/societies/workforce/task_channel.py +182 -38
  296. camel/societies/workforce/utils.py +784 -18
  297. camel/societies/workforce/worker.py +96 -28
  298. camel/societies/workforce/workflow_memory_manager.py +1746 -0
  299. camel/societies/workforce/workforce.py +5730 -366
  300. camel/societies/workforce/workforce_callback.py +103 -0
  301. camel/societies/workforce/workforce_logger.py +647 -0
  302. camel/societies/workforce/workforce_metrics.py +33 -0
  303. camel/storages/__init__.py +10 -2
  304. camel/storages/graph_storages/__init__.py +2 -2
  305. camel/storages/graph_storages/base.py +2 -2
  306. camel/storages/graph_storages/graph_element.py +2 -2
  307. camel/storages/graph_storages/nebula_graph.py +4 -4
  308. camel/storages/graph_storages/neo4j_graph.py +7 -7
  309. camel/storages/key_value_storages/__init__.py +2 -2
  310. camel/storages/key_value_storages/base.py +2 -2
  311. camel/storages/key_value_storages/in_memory.py +2 -2
  312. camel/storages/key_value_storages/json.py +17 -4
  313. camel/storages/key_value_storages/mem0_cloud.py +50 -49
  314. camel/storages/key_value_storages/redis.py +2 -2
  315. camel/storages/object_storages/__init__.py +2 -2
  316. camel/storages/object_storages/amazon_s3.py +2 -2
  317. camel/storages/object_storages/azure_blob.py +2 -2
  318. camel/storages/object_storages/base.py +2 -2
  319. camel/storages/object_storages/google_cloud.py +3 -3
  320. camel/storages/vectordb_storages/__init__.py +12 -2
  321. camel/storages/vectordb_storages/base.py +2 -2
  322. camel/storages/vectordb_storages/chroma.py +731 -0
  323. camel/storages/vectordb_storages/faiss.py +712 -0
  324. camel/storages/vectordb_storages/milvus.py +2 -2
  325. camel/storages/vectordb_storages/oceanbase.py +16 -17
  326. camel/storages/vectordb_storages/pgvector.py +349 -0
  327. camel/storages/vectordb_storages/qdrant.py +6 -6
  328. camel/storages/vectordb_storages/surreal.py +372 -0
  329. camel/storages/vectordb_storages/tidb.py +11 -8
  330. camel/storages/vectordb_storages/weaviate.py +714 -0
  331. camel/tasks/__init__.py +2 -2
  332. camel/tasks/task.py +366 -27
  333. camel/tasks/task_prompt.py +3 -3
  334. camel/terminators/__init__.py +2 -2
  335. camel/terminators/base.py +2 -2
  336. camel/terminators/response_terminator.py +2 -2
  337. camel/terminators/token_limit_terminator.py +2 -2
  338. camel/toolkits/__init__.py +58 -10
  339. camel/toolkits/aci_toolkit.py +66 -21
  340. camel/toolkits/arxiv_toolkit.py +8 -8
  341. camel/toolkits/ask_news_toolkit.py +2 -2
  342. camel/toolkits/async_browser_toolkit.py +174 -575
  343. camel/toolkits/audio_analysis_toolkit.py +3 -3
  344. camel/toolkits/base.py +65 -7
  345. camel/toolkits/bohrium_toolkit.py +318 -0
  346. camel/toolkits/browser_toolkit.py +306 -566
  347. camel/toolkits/browser_toolkit_commons.py +568 -0
  348. camel/toolkits/code_execution.py +67 -11
  349. camel/toolkits/context_summarizer_toolkit.py +684 -0
  350. camel/toolkits/craw4ai_toolkit.py +93 -0
  351. camel/toolkits/dappier_toolkit.py +12 -8
  352. camel/toolkits/data_commons_toolkit.py +2 -2
  353. camel/toolkits/dingtalk.py +1135 -0
  354. camel/toolkits/earth_science_toolkit.py +5367 -0
  355. camel/toolkits/edgeone_pages_mcp_toolkit.py +49 -0
  356. camel/toolkits/excel_toolkit.py +910 -70
  357. camel/toolkits/file_toolkit.py +1402 -0
  358. camel/toolkits/function_tool.py +128 -20
  359. camel/toolkits/github_toolkit.py +148 -43
  360. camel/toolkits/gmail_toolkit.py +1839 -0
  361. camel/toolkits/google_calendar_toolkit.py +40 -6
  362. camel/toolkits/google_drive_mcp_toolkit.py +54 -0
  363. camel/toolkits/google_maps_toolkit.py +2 -2
  364. camel/toolkits/google_scholar_toolkit.py +2 -2
  365. camel/toolkits/human_toolkit.py +36 -12
  366. camel/toolkits/hybrid_browser_toolkit/__init__.py +18 -0
  367. camel/toolkits/hybrid_browser_toolkit/config_loader.py +185 -0
  368. camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py +246 -0
  369. camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit_ts.py +1973 -0
  370. camel/toolkits/hybrid_browser_toolkit/installer.py +203 -0
  371. camel/toolkits/hybrid_browser_toolkit/ts/package-lock.json +4589 -0
  372. camel/toolkits/hybrid_browser_toolkit/ts/package.json +33 -0
  373. camel/toolkits/hybrid_browser_toolkit/ts/src/browser-scripts.js +125 -0
  374. camel/toolkits/hybrid_browser_toolkit/ts/src/browser-session.ts +1929 -0
  375. camel/toolkits/hybrid_browser_toolkit/ts/src/config-loader.ts +233 -0
  376. camel/toolkits/hybrid_browser_toolkit/ts/src/hybrid-browser-toolkit.ts +589 -0
  377. camel/toolkits/hybrid_browser_toolkit/ts/src/index.ts +7 -0
  378. camel/toolkits/hybrid_browser_toolkit/ts/src/parent-child-filter.ts +226 -0
  379. camel/toolkits/hybrid_browser_toolkit/ts/src/snapshot-parser.ts +219 -0
  380. camel/toolkits/hybrid_browser_toolkit/ts/src/som-screenshot-injected.ts +543 -0
  381. camel/toolkits/hybrid_browser_toolkit/ts/src/types.ts +129 -0
  382. camel/toolkits/hybrid_browser_toolkit/ts/tsconfig.json +27 -0
  383. camel/toolkits/hybrid_browser_toolkit/ts/websocket-server.js +319 -0
  384. camel/toolkits/hybrid_browser_toolkit/ws_wrapper.py +1037 -0
  385. camel/toolkits/hybrid_browser_toolkit_py/__init__.py +17 -0
  386. camel/toolkits/hybrid_browser_toolkit_py/actions.py +575 -0
  387. camel/toolkits/hybrid_browser_toolkit_py/agent.py +311 -0
  388. camel/toolkits/hybrid_browser_toolkit_py/browser_session.py +787 -0
  389. camel/toolkits/hybrid_browser_toolkit_py/config_loader.py +490 -0
  390. camel/toolkits/hybrid_browser_toolkit_py/hybrid_browser_toolkit.py +2390 -0
  391. camel/toolkits/hybrid_browser_toolkit_py/snapshot.py +233 -0
  392. camel/toolkits/hybrid_browser_toolkit_py/stealth_script.js +0 -0
  393. camel/toolkits/hybrid_browser_toolkit_py/unified_analyzer.js +1043 -0
  394. camel/toolkits/image_analysis_toolkit.py +3 -3
  395. camel/toolkits/image_generation_toolkit.py +390 -0
  396. camel/toolkits/jina_reranker_toolkit.py +195 -79
  397. camel/toolkits/klavis_toolkit.py +7 -3
  398. camel/toolkits/linkedin_toolkit.py +2 -2
  399. camel/toolkits/markitdown_toolkit.py +104 -0
  400. camel/toolkits/math_toolkit.py +66 -12
  401. camel/toolkits/mcp_toolkit.py +841 -600
  402. camel/toolkits/memory_toolkit.py +7 -3
  403. camel/toolkits/meshy_toolkit.py +2 -2
  404. camel/toolkits/message_agent_toolkit.py +608 -0
  405. camel/toolkits/message_integration.py +724 -0
  406. camel/toolkits/mineru_toolkit.py +2 -2
  407. camel/toolkits/minimax_mcp_toolkit.py +195 -0
  408. camel/toolkits/networkx_toolkit.py +2 -2
  409. camel/toolkits/note_taking_toolkit.py +277 -0
  410. camel/toolkits/notion_mcp_toolkit.py +224 -0
  411. camel/toolkits/notion_toolkit.py +2 -2
  412. camel/toolkits/open_api_specs/biztoc/__init__.py +2 -2
  413. camel/toolkits/open_api_specs/biztoc/ai-plugin.json +1 -1
  414. camel/toolkits/open_api_specs/coursera/__init__.py +2 -2
  415. camel/toolkits/open_api_specs/create_qr_code/__init__.py +2 -2
  416. camel/toolkits/open_api_specs/klarna/__init__.py +2 -2
  417. camel/toolkits/open_api_specs/nasa_apod/__init__.py +2 -2
  418. camel/toolkits/open_api_specs/outschool/__init__.py +2 -2
  419. camel/toolkits/open_api_specs/outschool/ai-plugin.json +1 -1
  420. camel/toolkits/open_api_specs/outschool/openapi.yaml +1 -1
  421. camel/toolkits/open_api_specs/outschool/paths/__init__.py +2 -2
  422. camel/toolkits/open_api_specs/outschool/paths/get_classes.py +2 -2
  423. camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +2 -2
  424. camel/toolkits/open_api_specs/security_config.py +2 -2
  425. camel/toolkits/open_api_specs/speak/__init__.py +2 -2
  426. camel/toolkits/open_api_specs/web_scraper/__init__.py +2 -2
  427. camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +1 -1
  428. camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +2 -2
  429. camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +2 -2
  430. camel/toolkits/open_api_toolkit.py +2 -2
  431. camel/toolkits/openbb_toolkit.py +7 -3
  432. camel/toolkits/origene_mcp_toolkit.py +56 -0
  433. camel/toolkits/page_script.js +86 -74
  434. camel/toolkits/playwright_mcp_toolkit.py +27 -32
  435. camel/toolkits/pptx_toolkit.py +790 -0
  436. camel/toolkits/pubmed_toolkit.py +2 -2
  437. camel/toolkits/pulse_mcp_search_toolkit.py +2 -2
  438. camel/toolkits/pyautogui_toolkit.py +2 -2
  439. camel/toolkits/reddit_toolkit.py +2 -2
  440. camel/toolkits/resend_toolkit.py +168 -0
  441. camel/toolkits/retrieval_toolkit.py +2 -2
  442. camel/toolkits/screenshot_toolkit.py +213 -0
  443. camel/toolkits/search_toolkit.py +539 -146
  444. camel/toolkits/searxng_toolkit.py +2 -2
  445. camel/toolkits/semantic_scholar_toolkit.py +2 -2
  446. camel/toolkits/slack_toolkit.py +108 -58
  447. camel/toolkits/sql_toolkit.py +712 -0
  448. camel/toolkits/stripe_toolkit.py +2 -2
  449. camel/toolkits/sympy_toolkit.py +3 -3
  450. camel/toolkits/task_planning_toolkit.py +134 -0
  451. camel/toolkits/terminal_toolkit/__init__.py +18 -0
  452. camel/toolkits/terminal_toolkit/terminal_toolkit.py +1070 -0
  453. camel/toolkits/terminal_toolkit/utils.py +532 -0
  454. camel/toolkits/thinking_toolkit.py +3 -3
  455. camel/toolkits/twitter_toolkit.py +8 -3
  456. camel/toolkits/vertex_ai_veo_toolkit.py +590 -0
  457. camel/toolkits/video_analysis_toolkit.py +112 -29
  458. camel/toolkits/video_download_toolkit.py +22 -16
  459. camel/toolkits/weather_toolkit.py +2 -2
  460. camel/toolkits/web_deploy_toolkit.py +1219 -0
  461. camel/toolkits/wechat_official_toolkit.py +483 -0
  462. camel/toolkits/whatsapp_toolkit.py +2 -2
  463. camel/toolkits/wolfram_alpha_toolkit.py +53 -25
  464. camel/toolkits/zapier_toolkit.py +7 -3
  465. camel/types/__init__.py +4 -4
  466. camel/types/agents/__init__.py +2 -2
  467. camel/types/agents/tool_calling_record.py +6 -3
  468. camel/types/enums.py +454 -35
  469. camel/types/mcp_registries.py +2 -2
  470. camel/types/openai_types.py +4 -4
  471. camel/types/unified_model_type.py +43 -6
  472. camel/utils/__init__.py +20 -2
  473. camel/utils/async_func.py +2 -2
  474. camel/utils/chunker/__init__.py +2 -2
  475. camel/utils/chunker/base.py +2 -2
  476. camel/utils/chunker/code_chunker.py +2 -2
  477. camel/utils/chunker/uio_chunker.py +2 -2
  478. camel/utils/commons.py +65 -7
  479. camel/utils/constants.py +5 -2
  480. camel/utils/context_utils.py +1134 -0
  481. camel/utils/deduplication.py +2 -2
  482. camel/utils/filename.py +2 -2
  483. camel/utils/langfuse.py +258 -0
  484. camel/utils/mcp.py +140 -6
  485. camel/utils/mcp_client.py +1056 -0
  486. camel/utils/message_summarizer.py +148 -0
  487. camel/utils/response_format.py +2 -2
  488. camel/utils/token_counting.py +45 -22
  489. camel/utils/tool_result.py +44 -0
  490. camel/verifiers/__init__.py +2 -2
  491. camel/verifiers/base.py +2 -2
  492. camel/verifiers/math_verifier.py +2 -2
  493. camel/verifiers/models.py +2 -2
  494. camel/verifiers/physics_verifier.py +2 -2
  495. camel/verifiers/python_verifier.py +2 -2
  496. {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/METADATA +349 -108
  497. camel_ai-0.2.82.dist-info/RECORD +507 -0
  498. {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/WHEEL +1 -1
  499. {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/licenses/LICENSE +1 -1
  500. camel/loaders/pandas_reader.py +0 -368
  501. camel/runtime/api.py +0 -97
  502. camel/toolkits/dalle_toolkit.py +0 -171
  503. camel/toolkits/file_write_toolkit.py +0 -395
  504. camel/toolkits/openai_agent_toolkit.py +0 -135
  505. camel/toolkits/terminal_toolkit.py +0 -1037
  506. camel_ai-0.2.59.dist-info/RECORD +0 -410
@@ -1,4 +1,4 @@
1
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
1
+ # ========= Copyright 2023-2025 @ 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-2025 @ 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,6 +36,9 @@ from camel.utils import (
38
36
  BaseTokenCounter,
39
37
  OpenAITokenCounter,
40
38
  api_keys_required,
39
+ get_current_agent_session_id,
40
+ update_current_observation,
41
+ update_langfuse_trace,
41
42
  )
42
43
 
43
44
  try:
@@ -48,6 +49,14 @@ try:
48
49
  except (ImportError, AttributeError):
49
50
  LLMEvent = None
50
51
 
52
+ if os.environ.get("LANGFUSE_ENABLED", "False").lower() == "true":
53
+ try:
54
+ from langfuse.decorators import observe
55
+ except ImportError:
56
+ from camel.utils import observe
57
+ else:
58
+ from camel.utils import observe
59
+
51
60
 
52
61
  class SambaModel(BaseModelBackend):
53
62
  r"""SambaNova service interface.
@@ -77,6 +86,18 @@ class SambaModel(BaseModelBackend):
77
86
  API calls. If not provided, will fall back to the MODEL_TIMEOUT
78
87
  environment variable or default to 180 seconds.
79
88
  (default: :obj:`None`)
89
+ max_retries (int, optional): Maximum number of retries for API calls.
90
+ (default: :obj:`3`)
91
+ client (Optional[Any], optional): A custom synchronous
92
+ OpenAI-compatible client instance. If provided, this client will
93
+ be used instead of creating a new one. Only applicable when using
94
+ SambaNova Cloud API. (default: :obj:`None`)
95
+ async_client (Optional[Any], optional): A custom asynchronous
96
+ OpenAI-compatible client instance. If provided, this client will
97
+ be used instead of creating a new one. Only applicable when using
98
+ SambaNova Cloud API. (default: :obj:`None`)
99
+ **kwargs (Any): Additional arguments to pass to the client
100
+ initialization. Ignored if custom clients are provided.
80
101
  """
81
102
 
82
103
  @api_keys_required(
@@ -92,6 +113,10 @@ class SambaModel(BaseModelBackend):
92
113
  url: Optional[str] = None,
93
114
  token_counter: Optional[BaseTokenCounter] = None,
94
115
  timeout: Optional[float] = None,
116
+ max_retries: int = 3,
117
+ client: Optional[Any] = None,
118
+ async_client: Optional[Any] = None,
119
+ **kwargs: Any,
95
120
  ) -> None:
96
121
  if model_config_dict is None:
97
122
  model_config_dict = SambaCloudAPIConfig().as_dict()
@@ -102,22 +127,39 @@ class SambaModel(BaseModelBackend):
102
127
  )
103
128
  timeout = timeout or float(os.environ.get("MODEL_TIMEOUT", 180))
104
129
  super().__init__(
105
- model_type, model_config_dict, api_key, url, token_counter, timeout
130
+ model_type,
131
+ model_config_dict,
132
+ api_key,
133
+ url,
134
+ token_counter,
135
+ timeout,
136
+ max_retries,
106
137
  )
107
138
 
139
+ # Only create clients for Cloud API mode
108
140
  if self._url == "https://api.sambanova.ai/v1":
109
- self._client = OpenAI(
110
- timeout=self._timeout,
111
- max_retries=3,
112
- base_url=self._url,
113
- api_key=self._api_key,
114
- )
115
- self._async_client = AsyncOpenAI(
116
- timeout=self._timeout,
117
- max_retries=3,
118
- base_url=self._url,
119
- api_key=self._api_key,
120
- )
141
+ # Use custom clients if provided, otherwise create new ones
142
+ if client is not None:
143
+ self._client = client
144
+ else:
145
+ self._client = OpenAI(
146
+ timeout=self._timeout,
147
+ max_retries=self._max_retries,
148
+ base_url=self._url,
149
+ api_key=self._api_key,
150
+ **kwargs,
151
+ )
152
+
153
+ if async_client is not None:
154
+ self._async_client = async_client
155
+ else:
156
+ self._async_client = AsyncOpenAI(
157
+ timeout=self._timeout,
158
+ max_retries=self._max_retries,
159
+ base_url=self._url,
160
+ api_key=self._api_key,
161
+ **kwargs,
162
+ )
121
163
 
122
164
  @property
123
165
  def token_counter(self) -> BaseTokenCounter:
@@ -131,36 +173,7 @@ class SambaModel(BaseModelBackend):
131
173
  self._token_counter = OpenAITokenCounter(ModelType.GPT_4O_MINI)
132
174
  return self._token_counter
133
175
 
134
- def check_model_config(self):
135
- r"""Check whether the model configuration contains any
136
- unexpected arguments to SambaNova API.
137
-
138
- Raises:
139
- ValueError: If the model configuration dictionary contains any
140
- unexpected arguments to SambaNova API.
141
- """
142
- if self._url == "https://sambaverse.sambanova.ai/api/predict":
143
- for param in self.model_config_dict:
144
- if param not in SAMBA_VERSE_API_PARAMS:
145
- raise ValueError(
146
- f"Unexpected argument `{param}` is "
147
- "input into SambaVerse API."
148
- )
149
-
150
- elif self._url == "https://api.sambanova.ai/v1":
151
- for param in self.model_config_dict:
152
- if param not in SAMBA_CLOUD_API_PARAMS:
153
- raise ValueError(
154
- f"Unexpected argument `{param}` is "
155
- "input into SambaCloud API."
156
- )
157
-
158
- else:
159
- raise ValueError(
160
- f"{self._url} is not supported, please check the url to the"
161
- " SambaNova service"
162
- )
163
-
176
+ @observe(as_type="generation")
164
177
  async def _arun( # type: ignore[misc]
165
178
  self,
166
179
  messages: List[OpenAIMessage],
@@ -178,13 +191,42 @@ class SambaModel(BaseModelBackend):
178
191
  `ChatCompletion` in the non-stream mode, or
179
192
  `AsyncStream[ChatCompletionChunk]` in the stream mode.
180
193
  """
194
+
195
+ update_current_observation(
196
+ input={
197
+ "messages": messages,
198
+ "tools": tools,
199
+ },
200
+ model=str(self.model_type),
201
+ model_parameters=self.model_config_dict,
202
+ )
203
+
204
+ # Update Langfuse trace with current agent session and metadata
205
+ agent_session_id = get_current_agent_session_id()
206
+ if agent_session_id:
207
+ update_langfuse_trace(
208
+ session_id=agent_session_id,
209
+ metadata={
210
+ "source": "camel",
211
+ "agent_id": agent_session_id,
212
+ "agent_type": "camel_chat_agent",
213
+ "model_type": str(self.model_type),
214
+ },
215
+ tags=["CAMEL-AI", str(self.model_type)],
216
+ )
217
+
181
218
  if "tools" in self.model_config_dict:
182
219
  del self.model_config_dict["tools"]
183
220
  if self.model_config_dict.get("stream") is True:
184
221
  return await self._arun_streaming(messages)
185
222
  else:
186
- return await self._arun_non_streaming(messages)
223
+ response = await self._arun_non_streaming(messages)
224
+ update_current_observation(
225
+ usage=response.usage,
226
+ )
227
+ return response
187
228
 
229
+ @observe(as_type="generation")
188
230
  def _run( # type: ignore[misc]
189
231
  self,
190
232
  messages: List[OpenAIMessage],
@@ -202,12 +244,38 @@ class SambaModel(BaseModelBackend):
202
244
  `ChatCompletion` in the non-stream mode, or
203
245
  `Stream[ChatCompletionChunk]` in the stream mode.
204
246
  """
247
+ update_current_observation(
248
+ input={
249
+ "messages": messages,
250
+ "tools": tools,
251
+ },
252
+ model=str(self.model_type),
253
+ model_parameters=self.model_config_dict,
254
+ )
255
+ # Update Langfuse trace with current agent session and metadata
256
+ agent_session_id = get_current_agent_session_id()
257
+ if agent_session_id:
258
+ update_langfuse_trace(
259
+ session_id=agent_session_id,
260
+ metadata={
261
+ "source": "camel",
262
+ "agent_id": agent_session_id,
263
+ "agent_type": "camel_chat_agent",
264
+ "model_type": str(self.model_type),
265
+ },
266
+ tags=["CAMEL-AI", str(self.model_type)],
267
+ )
268
+
205
269
  if "tools" in self.model_config_dict:
206
270
  del self.model_config_dict["tools"]
207
271
  if self.model_config_dict.get("stream") is True:
208
272
  return self._run_streaming(messages)
209
273
  else:
210
- return self._run_non_streaming(messages)
274
+ response = self._run_non_streaming(messages)
275
+ update_current_observation(
276
+ usage=response.usage,
277
+ )
278
+ return response
211
279
 
212
280
  def _run_streaming(
213
281
  self, messages: List[OpenAIMessage]
@@ -1,4 +1,4 @@
1
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
1
+ # ========= Copyright 2023-2025 @ 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-2025 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
  import logging
15
15
  import os
16
16
  import subprocess
@@ -21,7 +21,7 @@ from typing import Any, Dict, List, Optional, Type, Union
21
21
  from openai import AsyncOpenAI, AsyncStream, OpenAI, Stream
22
22
  from pydantic import BaseModel
23
23
 
24
- from camel.configs import SGLANG_API_PARAMS, SGLangConfig
24
+ from camel.configs import SGLangConfig
25
25
  from camel.messages import OpenAIMessage
26
26
  from camel.models import BaseModelBackend
27
27
  from camel.types import (
@@ -29,7 +29,21 @@ from camel.types import (
29
29
  ChatCompletionChunk,
30
30
  ModelType,
31
31
  )
32
- from camel.utils import BaseTokenCounter, OpenAITokenCounter
32
+ from camel.utils import (
33
+ BaseTokenCounter,
34
+ OpenAITokenCounter,
35
+ get_current_agent_session_id,
36
+ update_current_observation,
37
+ update_langfuse_trace,
38
+ )
39
+
40
+ if os.environ.get("LANGFUSE_ENABLED", "False").lower() == "true":
41
+ try:
42
+ from langfuse.decorators import observe
43
+ except ImportError:
44
+ from camel.utils import observe
45
+ else:
46
+ from camel.utils import observe
33
47
 
34
48
 
35
49
  class SGLangModel(BaseModelBackend):
@@ -56,8 +70,21 @@ class SGLangModel(BaseModelBackend):
56
70
  API calls. If not provided, will fall back to the MODEL_TIMEOUT
57
71
  environment variable or default to 180 seconds.
58
72
  (default: :obj:`None`)
59
-
60
- Reference: https://sgl-project.github.io/backend/openai_api_completions.html
73
+ max_retries (int, optional): Maximum number of retries for API calls.
74
+ (default: :obj:`3`)
75
+ client (Optional[Any], optional): A custom synchronous
76
+ OpenAI-compatible client instance. If provided, this client will
77
+ be used instead of creating a new one. Note: When using custom
78
+ clients with SGLang, server auto-start features will be disabled.
79
+ (default: :obj:`None`)
80
+ async_client (Optional[Any], optional): A custom asynchronous
81
+ OpenAI-compatible client instance. If provided, this client will
82
+ be used instead of creating a new one. (default: :obj:`None`)
83
+ **kwargs (Any): Additional arguments to pass to the client
84
+ initialization. Ignored if custom clients are provided.
85
+
86
+ Reference: https://sgl-project.github.io/backend/openai_api_completions.
87
+ html
61
88
  """
62
89
 
63
90
  def __init__(
@@ -68,6 +95,10 @@ class SGLangModel(BaseModelBackend):
68
95
  url: Optional[str] = None,
69
96
  token_counter: Optional[BaseTokenCounter] = None,
70
97
  timeout: Optional[float] = None,
98
+ max_retries: int = 3,
99
+ client: Optional[Any] = None,
100
+ async_client: Optional[Any] = None,
101
+ **kwargs: Any,
71
102
  ) -> None:
72
103
  if model_config_dict is None:
73
104
  model_config_dict = SGLangConfig().as_dict()
@@ -81,25 +112,42 @@ class SGLangModel(BaseModelBackend):
81
112
 
82
113
  timeout = timeout or float(os.environ.get("MODEL_TIMEOUT", 180))
83
114
  super().__init__(
84
- model_type, model_config_dict, api_key, url, token_counter, timeout
115
+ model_type,
116
+ model_config_dict,
117
+ api_key,
118
+ url,
119
+ token_counter,
120
+ timeout,
121
+ max_retries,
85
122
  )
86
123
 
87
- self._client = None
88
-
89
- if self._url:
124
+ # Use custom clients if provided, otherwise create new ones
125
+ if client is not None:
126
+ self._client = client
127
+ elif self._url:
90
128
  # Initialize the client if an existing URL is provided
91
129
  self._client = OpenAI(
92
130
  timeout=self._timeout,
93
- max_retries=3,
131
+ max_retries=self._max_retries,
94
132
  api_key="Set-but-ignored", # required but ignored
95
133
  base_url=self._url,
134
+ **kwargs,
96
135
  )
136
+ else:
137
+ self._client = None
138
+
139
+ if async_client is not None:
140
+ self._async_client = async_client
141
+ elif self._url:
97
142
  self._async_client = AsyncOpenAI(
98
143
  timeout=self._timeout,
99
- max_retries=3,
144
+ max_retries=self._max_retries,
100
145
  api_key="Set-but-ignored", # required but ignored
101
146
  base_url=self._url,
147
+ **kwargs,
102
148
  )
149
+ else:
150
+ self._async_client = None
103
151
 
104
152
  def _start_server(self) -> None:
105
153
  try:
@@ -130,13 +178,24 @@ class SGLangModel(BaseModelBackend):
130
178
  )
131
179
  self._inactivity_thread.start()
132
180
  self.last_run_time = time.time()
133
- # Initialize the client after the server starts
134
- self._client = OpenAI(
135
- timeout=self._timeout,
136
- max_retries=3,
137
- api_key="Set-but-ignored", # required but ignored
138
- base_url=self._url,
139
- )
181
+ # Initialize client after server starts if not already set
182
+ if self._client is None:
183
+ self._client = OpenAI(
184
+ timeout=self._timeout,
185
+ max_retries=self._max_retries,
186
+ api_key="Set-but-ignored", # required but ignored
187
+ base_url=self._url,
188
+ )
189
+ if (
190
+ not hasattr(self, '_async_client')
191
+ or self._async_client is None
192
+ ):
193
+ self._async_client = AsyncOpenAI(
194
+ timeout=self._timeout,
195
+ max_retries=self._max_retries,
196
+ api_key="Set-but-ignored", # required but ignored
197
+ base_url=self._url,
198
+ )
140
199
  except Exception as e:
141
200
  raise RuntimeError(f"Failed to start SGLang server: {e}") from e
142
201
 
@@ -180,21 +239,7 @@ class SGLangModel(BaseModelBackend):
180
239
  self._token_counter = OpenAITokenCounter(ModelType.GPT_4O_MINI)
181
240
  return self._token_counter
182
241
 
183
- def check_model_config(self):
184
- r"""Check whether the model configuration contains any
185
- unexpected arguments to SGLang API.
186
-
187
- Raises:
188
- ValueError: If the model configuration dictionary contains any
189
- unexpected arguments to OpenAI API.
190
- """
191
- for param in self.model_config_dict:
192
- if param not in SGLANG_API_PARAMS:
193
- raise ValueError(
194
- f"Unexpected argument `{param}` is "
195
- "input into SGLang model backend."
196
- )
197
-
242
+ @observe(as_type='generation')
198
243
  async def _arun(
199
244
  self,
200
245
  messages: List[OpenAIMessage],
@@ -213,26 +258,64 @@ class SGLangModel(BaseModelBackend):
213
258
  `AsyncStream[ChatCompletionChunk]` in the stream mode.
214
259
  """
215
260
 
261
+ update_current_observation(
262
+ input={
263
+ "messages": messages,
264
+ "tools": tools,
265
+ },
266
+ model=str(self.model_type),
267
+ model_parameters=self.model_config_dict,
268
+ )
269
+ # Update Langfuse trace with current agent session and metadata
270
+ agent_session_id = get_current_agent_session_id()
271
+ if agent_session_id:
272
+ update_langfuse_trace(
273
+ session_id=agent_session_id,
274
+ metadata={
275
+ "source": "camel",
276
+ "agent_id": agent_session_id,
277
+ "agent_type": "camel_chat_agent",
278
+ "model_type": str(self.model_type),
279
+ },
280
+ tags=["CAMEL-AI", str(self.model_type)],
281
+ )
282
+
216
283
  # Ensure server is running
217
284
  self._ensure_server_running()
218
285
 
219
286
  with self._lock:
220
287
  # Update last run time
221
288
  self.last_run_time = time.time()
289
+ async_client = self._async_client
222
290
 
223
- if self._client is None:
291
+ if async_client is None:
224
292
  raise RuntimeError(
225
293
  "Client is not initialized. Ensure the server is running."
226
294
  )
227
295
 
228
- response = await self._async_client.chat.completions.create(
296
+ # Prepare additional parameters
297
+ extra_params: Dict[str, Any] = {}
298
+ if response_format is not None:
299
+ extra_params["response_format"] = response_format
300
+ if tools is not None:
301
+ extra_params["tools"] = tools
302
+
303
+ response = await async_client.chat.completions.create(
229
304
  messages=messages,
230
305
  model=self.model_type,
306
+ **extra_params,
231
307
  **self.model_config_dict,
232
308
  )
233
-
309
+ update_current_observation(
310
+ usage_details={
311
+ "prompt_tokens": response.usage.prompt_tokens,
312
+ "completion_tokens": response.usage.completion_tokens,
313
+ "total_tokens": response.usage.total_tokens,
314
+ },
315
+ )
234
316
  return response
235
317
 
318
+ @observe(as_type='generation')
236
319
  def _run(
237
320
  self,
238
321
  messages: List[OpenAIMessage],
@@ -250,6 +333,27 @@ class SGLangModel(BaseModelBackend):
250
333
  `ChatCompletion` in the non-stream mode, or
251
334
  `Stream[ChatCompletionChunk]` in the stream mode.
252
335
  """
336
+ update_current_observation(
337
+ input={
338
+ "messages": messages,
339
+ "tools": tools,
340
+ },
341
+ model=str(self.model_type),
342
+ model_parameters=self.model_config_dict,
343
+ )
344
+ # Update Langfuse trace with current agent session and metadata
345
+ agent_session_id = get_current_agent_session_id()
346
+ if agent_session_id:
347
+ update_langfuse_trace(
348
+ session_id=agent_session_id,
349
+ metadata={
350
+ "source": "camel",
351
+ "agent_id": agent_session_id,
352
+ "agent_type": "camel_chat_agent",
353
+ "model_type": str(self.model_type),
354
+ },
355
+ tags=["CAMEL-AI", str(self.model_type)],
356
+ )
253
357
 
254
358
  # Ensure server is running
255
359
  self._ensure_server_running()
@@ -257,17 +361,33 @@ class SGLangModel(BaseModelBackend):
257
361
  with self._lock:
258
362
  # Update last run time
259
363
  self.last_run_time = time.time()
364
+ client = self._client
260
365
 
261
- if self._client is None:
366
+ if client is None:
262
367
  raise RuntimeError(
263
368
  "Client is not initialized. Ensure the server is running."
264
369
  )
265
370
 
266
- response = self._client.chat.completions.create(
371
+ # Prepare additional parameters
372
+ extra_params: Dict[str, Any] = {}
373
+ if response_format is not None:
374
+ extra_params["response_format"] = response_format
375
+ if tools is not None:
376
+ extra_params["tools"] = tools
377
+
378
+ response = client.chat.completions.create(
267
379
  messages=messages,
268
380
  model=self.model_type,
381
+ **extra_params,
269
382
  **self.model_config_dict,
270
383
  )
384
+ update_current_observation(
385
+ usage_details={
386
+ "prompt_tokens": response.usage.prompt_tokens,
387
+ "completion_tokens": response.usage.completion_tokens,
388
+ "total_tokens": response.usage.total_tokens,
389
+ },
390
+ )
271
391
 
272
392
  return response
273
393
 
@@ -384,10 +504,10 @@ def _wait_for_server(base_url: str, timeout: Optional[float] = 30) -> None:
384
504
  print(
385
505
  """\n
386
506
  NOTE: Typically, the server runs in a separate terminal.
387
- In this notebook, we run the server and notebook code
507
+ In this notebook, we run the server and notebook code
388
508
  together, so their outputs are combined.
389
- To improve clarity, the server logs are displayed in the
390
- original black color, while the notebook outputs are
509
+ To improve clarity, the server logs are displayed in the
510
+ original black color, while the notebook outputs are
391
511
  highlighted in blue.
392
512
  """
393
513
  )
@@ -1,4 +1,4 @@
1
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
1
+ # ========= Copyright 2023-2025 @ 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,19 +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-2025 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
  import os
15
- from typing import Any, Dict, List, Optional, Type, Union
15
+ from typing import Any, Dict, Optional, Union
16
16
 
17
- from openai import AsyncStream
18
- from pydantic import BaseModel
19
-
20
- from camel.configs import SILICONFLOW_API_PARAMS, SiliconFlowConfig
21
- from camel.messages import OpenAIMessage
17
+ from camel.configs import SiliconFlowConfig
22
18
  from camel.models.openai_compatible_model import OpenAICompatibleModel
23
19
  from camel.types import (
24
- ChatCompletion,
25
- ChatCompletionChunk,
26
20
  ModelType,
27
21
  )
28
22
  from camel.utils import (
@@ -54,6 +48,10 @@ class SiliconFlowModel(OpenAICompatibleModel):
54
48
  API calls. If not provided, will fall back to the MODEL_TIMEOUT
55
49
  environment variable or default to 180 seconds.
56
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.
57
55
  """
58
56
 
59
57
  @api_keys_required(
@@ -69,6 +67,8 @@ class SiliconFlowModel(OpenAICompatibleModel):
69
67
  url: Optional[str] = None,
70
68
  token_counter: Optional[BaseTokenCounter] = None,
71
69
  timeout: Optional[float] = None,
70
+ max_retries: int = 3,
71
+ **kwargs: Any,
72
72
  ) -> None:
73
73
  if model_config_dict is None:
74
74
  model_config_dict = SiliconFlowConfig().as_dict()
@@ -85,29 +85,6 @@ class SiliconFlowModel(OpenAICompatibleModel):
85
85
  url=url,
86
86
  token_counter=token_counter,
87
87
  timeout=timeout,
88
+ max_retries=max_retries,
89
+ **kwargs,
88
90
  )
89
-
90
- async def _arun(
91
- self,
92
- messages: List[OpenAIMessage],
93
- response_format: Optional[Type[BaseModel]] = None,
94
- tools: Optional[List[Dict[str, Any]]] = None,
95
- ) -> Union[ChatCompletion, AsyncStream[ChatCompletionChunk]]:
96
- raise NotImplementedError(
97
- "SiliconFlow does not support async inference."
98
- )
99
-
100
- def check_model_config(self):
101
- r"""Check whether the model configuration contains any
102
- unexpected arguments to SiliconFlow API.
103
-
104
- Raises:
105
- ValueError: If the model configuration dictionary contains any
106
- unexpected arguments to SiliconFlow API.
107
- """
108
- for param in self.model_config_dict:
109
- if param not in SILICONFLOW_API_PARAMS:
110
- raise ValueError(
111
- f"Unexpected argument `{param}` is "
112
- "input into SiliconFlow model backend."
113
- )