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,15 +10,20 @@
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
15
  import warnings
16
16
  from typing import Any, Dict, List, Optional, Type, Union
17
17
 
18
18
  from openai import AsyncOpenAI, AsyncStream, OpenAI, Stream
19
+ from openai.lib.streaming.chat import (
20
+ AsyncChatCompletionStreamManager,
21
+ ChatCompletionStreamManager,
22
+ )
19
23
  from pydantic import BaseModel
20
24
 
21
- from camel.configs import OPENAI_API_PARAMS, ChatGPTConfig
25
+ from camel.configs import ChatGPTConfig
26
+ from camel.logger import get_logger
22
27
  from camel.messages import OpenAIMessage
23
28
  from camel.models import BaseModelBackend
24
29
  from camel.types import (
@@ -30,8 +35,27 @@ from camel.utils import (
30
35
  BaseTokenCounter,
31
36
  OpenAITokenCounter,
32
37
  api_keys_required,
38
+ get_current_agent_session_id,
39
+ is_langfuse_available,
40
+ update_langfuse_trace,
33
41
  )
34
42
 
43
+ logger = get_logger(__name__)
44
+
45
+ if os.environ.get("LANGFUSE_ENABLED", "False").lower() == "true":
46
+ try:
47
+ from langfuse.decorators import observe
48
+ except ImportError:
49
+ from camel.utils import observe
50
+ elif os.environ.get("TRACEROOT_ENABLED", "False").lower() == "true":
51
+ try:
52
+ from traceroot import trace as observe # type: ignore[import]
53
+ except ImportError:
54
+ from camel.utils import observe
55
+ else:
56
+ from camel.utils import observe
57
+
58
+
35
59
  UNSUPPORTED_PARAMS = {
36
60
  "temperature",
37
61
  "top_p",
@@ -64,6 +88,23 @@ class OpenAIModel(BaseModelBackend):
64
88
  API calls. If not provided, will fall back to the MODEL_TIMEOUT
65
89
  environment variable or default to 180 seconds.
66
90
  (default: :obj:`None`)
91
+ max_retries (int, optional): Maximum number of retries for API calls.
92
+ (default: :obj:`3`)
93
+ client (Optional[Any], optional): A custom synchronous OpenAI client
94
+ instance. If provided, this client will be used instead of
95
+ creating a new one. Useful for RL frameworks like AReaL or rLLM
96
+ that provide OpenAI-compatible clients. The client should
97
+ implement the OpenAI client interface with
98
+ `.chat.completions.create()` and `.beta.chat.completions.parse()`
99
+ methods. (default: :obj:`None`)
100
+ async_client (Optional[Any], optional): A custom asynchronous OpenAI
101
+ client instance. If provided, this client will be used instead of
102
+ creating a new one. The client should implement the AsyncOpenAI
103
+ client interface. (default: :obj:`None`)
104
+ **kwargs (Any): Additional arguments to pass to the
105
+ OpenAI client initialization. These can include parameters like
106
+ 'organization', 'default_headers', 'http_client', etc.
107
+ Ignored if custom clients are provided.
67
108
  """
68
109
 
69
110
  @api_keys_required(
@@ -79,6 +120,10 @@ class OpenAIModel(BaseModelBackend):
79
120
  url: Optional[str] = None,
80
121
  token_counter: Optional[BaseTokenCounter] = None,
81
122
  timeout: Optional[float] = None,
123
+ max_retries: int = 3,
124
+ client: Optional[Any] = None,
125
+ async_client: Optional[Any] = None,
126
+ **kwargs: Any,
82
127
  ) -> None:
83
128
  if model_config_dict is None:
84
129
  model_config_dict = ChatGPTConfig().as_dict()
@@ -86,22 +131,61 @@ class OpenAIModel(BaseModelBackend):
86
131
  url = url or os.environ.get("OPENAI_API_BASE_URL")
87
132
  timeout = timeout or float(os.environ.get("MODEL_TIMEOUT", 180))
88
133
 
134
+ # Store additional client args for later use
135
+ self._max_retries = max_retries
136
+
89
137
  super().__init__(
90
138
  model_type, model_config_dict, api_key, url, token_counter, timeout
91
139
  )
92
140
 
93
- self._client = OpenAI(
94
- timeout=self._timeout,
95
- max_retries=3,
96
- base_url=self._url,
97
- api_key=self._api_key,
98
- )
99
- self._async_client = AsyncOpenAI(
100
- timeout=self._timeout,
101
- max_retries=3,
102
- base_url=self._url,
103
- api_key=self._api_key,
104
- )
141
+ # Use custom clients if provided, otherwise create new ones
142
+ if client is not None:
143
+ # Use the provided custom sync client
144
+ self._client = client
145
+ else:
146
+ # Create default sync client
147
+ if is_langfuse_available():
148
+ from langfuse.openai import OpenAI as LangfuseOpenAI
149
+
150
+ self._client = LangfuseOpenAI(
151
+ timeout=self._timeout,
152
+ max_retries=self._max_retries,
153
+ base_url=self._url,
154
+ api_key=self._api_key,
155
+ **kwargs,
156
+ )
157
+ else:
158
+ self._client = OpenAI(
159
+ timeout=self._timeout,
160
+ max_retries=self._max_retries,
161
+ base_url=self._url,
162
+ api_key=self._api_key,
163
+ **kwargs,
164
+ )
165
+
166
+ if async_client is not None:
167
+ # Use the provided custom async client
168
+ self._async_client = async_client
169
+ else:
170
+ # Create default async client
171
+ if is_langfuse_available():
172
+ from langfuse.openai import AsyncOpenAI as LangfuseAsyncOpenAI
173
+
174
+ self._async_client = LangfuseAsyncOpenAI(
175
+ timeout=self._timeout,
176
+ max_retries=self._max_retries,
177
+ base_url=self._url,
178
+ api_key=self._api_key,
179
+ **kwargs,
180
+ )
181
+ else:
182
+ self._async_client = AsyncOpenAI(
183
+ timeout=self._timeout,
184
+ max_retries=self._max_retries,
185
+ base_url=self._url,
186
+ api_key=self._api_key,
187
+ **kwargs,
188
+ )
105
189
 
106
190
  def _sanitize_config(self, config_dict: Dict[str, Any]) -> Dict[str, Any]:
107
191
  r"""Sanitize the model configuration for O1 models."""
@@ -113,6 +197,7 @@ class OpenAIModel(BaseModelBackend):
113
197
  ModelType.O3_MINI,
114
198
  ModelType.O3,
115
199
  ModelType.O4_MINI,
200
+ ModelType.O3_PRO,
116
201
  ]:
117
202
  warnings.warn(
118
203
  "Warning: You are using an reasoning model (O series), "
@@ -185,12 +270,17 @@ class OpenAIModel(BaseModelBackend):
185
270
  self._token_counter = OpenAITokenCounter(self.model_type)
186
271
  return self._token_counter
187
272
 
273
+ @observe()
188
274
  def _run(
189
275
  self,
190
276
  messages: List[OpenAIMessage],
191
277
  response_format: Optional[Type[BaseModel]] = None,
192
278
  tools: Optional[List[Dict[str, Any]]] = None,
193
- ) -> Union[ChatCompletion, Stream[ChatCompletionChunk]]:
279
+ ) -> Union[
280
+ ChatCompletion,
281
+ Stream[ChatCompletionChunk],
282
+ ChatCompletionStreamManager[BaseModel],
283
+ ]:
194
284
  r"""Runs inference of OpenAI chat completion.
195
285
 
196
286
  Args:
@@ -202,25 +292,67 @@ class OpenAIModel(BaseModelBackend):
202
292
  use for the request.
203
293
 
204
294
  Returns:
205
- Union[ChatCompletion, Stream[ChatCompletionChunk]]:
206
- `ChatCompletion` in the non-stream mode, or
207
- `Stream[ChatCompletionChunk]` in the stream mode.
295
+ Union[ChatCompletion, Stream[ChatCompletionChunk],
296
+ ChatCompletionStreamManager[BaseModel]]:
297
+ `ChatCompletion` in the non-stream mode,
298
+ `Stream[ChatCompletionChunk]`in the stream mode,
299
+ or `ChatCompletionStreamManager[BaseModel]` for
300
+ structured output streaming.
208
301
  """
302
+
303
+ # Update Langfuse trace with current agent session and metadata
304
+ agent_session_id = get_current_agent_session_id()
305
+ model_type_str = str(self.model_type)
306
+ if not agent_session_id:
307
+ agent_session_id = "no-session-id"
308
+ metadata = {
309
+ "source": "camel",
310
+ "agent_id": agent_session_id,
311
+ "agent_type": "camel_chat_agent",
312
+ "model_type": model_type_str,
313
+ }
314
+ metadata = {k: str(v) for k, v in metadata.items()}
315
+ if agent_session_id:
316
+ update_langfuse_trace(
317
+ session_id=agent_session_id,
318
+ metadata=metadata,
319
+ tags=["CAMEL-AI", model_type_str],
320
+ )
321
+ logger.info(f"metadata: {metadata}")
322
+
209
323
  messages = self._adapt_messages_for_o1_models(messages)
210
324
  response_format = response_format or self.model_config_dict.get(
211
325
  "response_format", None
212
326
  )
327
+
328
+ # Check if streaming is enabled
329
+ is_streaming = self.model_config_dict.get("stream", False)
330
+
213
331
  if response_format:
214
- return self._request_parse(messages, response_format, tools)
332
+ if is_streaming:
333
+ # Use streaming parse for structured output
334
+ return self._request_stream_parse(
335
+ messages, response_format, tools
336
+ )
337
+ else:
338
+ # Use non-streaming parse for structured output
339
+ return self._request_parse(messages, response_format, tools)
215
340
  else:
216
- return self._request_chat_completion(messages, tools)
341
+ result = self._request_chat_completion(messages, tools)
342
+
343
+ return result
217
344
 
345
+ @observe()
218
346
  async def _arun(
219
347
  self,
220
348
  messages: List[OpenAIMessage],
221
349
  response_format: Optional[Type[BaseModel]] = None,
222
350
  tools: Optional[List[Dict[str, Any]]] = None,
223
- ) -> Union[ChatCompletion, AsyncStream[ChatCompletionChunk]]:
351
+ ) -> Union[
352
+ ChatCompletion,
353
+ AsyncStream[ChatCompletionChunk],
354
+ AsyncChatCompletionStreamManager[BaseModel],
355
+ ]:
224
356
  r"""Runs inference of OpenAI chat completion in async mode.
225
357
 
226
358
  Args:
@@ -232,17 +364,56 @@ class OpenAIModel(BaseModelBackend):
232
364
  use for the request.
233
365
 
234
366
  Returns:
235
- Union[ChatCompletion, AsyncStream[ChatCompletionChunk]]:
236
- `ChatCompletion` in the non-stream mode, or
237
- `AsyncStream[ChatCompletionChunk]` in the stream mode.
367
+ Union[ChatCompletion, AsyncStream[ChatCompletionChunk],
368
+ AsyncChatCompletionStreamManager[BaseModel]]:
369
+ `ChatCompletion` in the non-stream mode,
370
+ `AsyncStream[ChatCompletionChunk]` in the stream mode, or
371
+ `AsyncChatCompletionStreamManager[BaseModel]` for
372
+ structured output streaming.
238
373
  """
374
+
375
+ # Update Langfuse trace with current agent session and metadata
376
+ agent_session_id = get_current_agent_session_id()
377
+ model_type_str = str(self.model_type)
378
+ if not agent_session_id:
379
+ agent_session_id = "no-session-id"
380
+ metadata = {
381
+ "source": "camel",
382
+ "agent_id": agent_session_id,
383
+ "agent_type": "camel_chat_agent",
384
+ "model_type": model_type_str,
385
+ }
386
+ metadata = {k: str(v) for k, v in metadata.items()}
387
+ update_langfuse_trace(
388
+ session_id=agent_session_id,
389
+ metadata=metadata,
390
+ tags=["CAMEL-AI", model_type_str],
391
+ )
392
+ logger.info(f"metadata: {metadata}")
393
+
394
+ messages = self._adapt_messages_for_o1_models(messages)
239
395
  response_format = response_format or self.model_config_dict.get(
240
396
  "response_format", None
241
397
  )
398
+
399
+ # Check if streaming is enabled
400
+ is_streaming = self.model_config_dict.get("stream", False)
401
+
242
402
  if response_format:
243
- return await self._arequest_parse(messages, response_format, tools)
403
+ if is_streaming:
404
+ # Use streaming parse for structured output
405
+ return await self._arequest_stream_parse(
406
+ messages, response_format, tools
407
+ )
408
+ else:
409
+ # Use non-streaming parse for structured output
410
+ return await self._arequest_parse(
411
+ messages, response_format, tools
412
+ )
244
413
  else:
245
- return await self._arequest_chat_completion(messages, tools)
414
+ result = await self._arequest_chat_completion(messages, tools)
415
+
416
+ return result
246
417
 
247
418
  def _request_chat_completion(
248
419
  self,
@@ -334,20 +505,65 @@ class OpenAIModel(BaseModelBackend):
334
505
  **request_config,
335
506
  )
336
507
 
337
- def check_model_config(self):
338
- r"""Check whether the model configuration contains any
339
- unexpected arguments to OpenAI API.
508
+ def _request_stream_parse(
509
+ self,
510
+ messages: List[OpenAIMessage],
511
+ response_format: Type[BaseModel],
512
+ tools: Optional[List[Dict[str, Any]]] = None,
513
+ ) -> ChatCompletionStreamManager[BaseModel]:
514
+ r"""Request streaming structured output parsing.
340
515
 
341
- Raises:
342
- ValueError: If the model configuration dictionary contains any
343
- unexpected arguments to OpenAI API.
516
+ Note: This uses OpenAI's beta streaming API for structured outputs.
344
517
  """
345
- for param in self.model_config_dict:
346
- if param not in OPENAI_API_PARAMS:
347
- raise ValueError(
348
- f"Unexpected argument `{param}` is "
349
- "input into OpenAI model backend."
350
- )
518
+ import copy
519
+
520
+ request_config = copy.deepcopy(self.model_config_dict)
521
+
522
+ # Remove stream from config as it's handled by the stream method
523
+ request_config.pop("stream", None)
524
+
525
+ if tools is not None:
526
+ request_config["tools"] = tools
527
+
528
+ request_config = self._sanitize_config(request_config)
529
+
530
+ # Use the beta streaming API for structured outputs
531
+ return self._client.beta.chat.completions.stream(
532
+ messages=messages,
533
+ model=self.model_type,
534
+ response_format=response_format,
535
+ **request_config,
536
+ )
537
+
538
+ async def _arequest_stream_parse(
539
+ self,
540
+ messages: List[OpenAIMessage],
541
+ response_format: Type[BaseModel],
542
+ tools: Optional[List[Dict[str, Any]]] = None,
543
+ ) -> AsyncChatCompletionStreamManager[BaseModel]:
544
+ r"""Request async streaming structured output parsing.
545
+
546
+ Note: This uses OpenAI's beta streaming API for structured outputs.
547
+ """
548
+ import copy
549
+
550
+ request_config = copy.deepcopy(self.model_config_dict)
551
+
552
+ # Remove stream from config as it's handled by the stream method
553
+ request_config.pop("stream", None)
554
+
555
+ if tools is not None:
556
+ request_config["tools"] = tools
557
+
558
+ request_config = self._sanitize_config(request_config)
559
+
560
+ # Use the beta streaming API for structured outputs
561
+ return self._async_client.beta.chat.completions.stream(
562
+ messages=messages,
563
+ model=self.model_type,
564
+ response_format=response_format,
565
+ **request_config,
566
+ )
351
567
 
352
568
  @property
353
569
  def stream(self) -> bool:
@@ -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,11 +10,11 @@
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
15
  from typing import Any, Dict, Optional, Union
16
16
 
17
- from camel.configs import OPENROUTER_API_PARAMS, OpenRouterConfig
17
+ from camel.configs import OpenRouterConfig
18
18
  from camel.models.openai_compatible_model import OpenAICompatibleModel
19
19
  from camel.types import ModelType
20
20
  from camel.utils import (
@@ -46,6 +46,10 @@ class OpenRouterModel(OpenAICompatibleModel):
46
46
  API calls. If not provided, will fall back to the MODEL_TIMEOUT
47
47
  environment variable or default to 180 seconds.
48
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.
49
53
  """
50
54
 
51
55
  @api_keys_required([("api_key", "OPENROUTER_API_KEY")])
@@ -57,6 +61,8 @@ class OpenRouterModel(OpenAICompatibleModel):
57
61
  url: Optional[str] = None,
58
62
  token_counter: Optional[BaseTokenCounter] = None,
59
63
  timeout: Optional[float] = None,
64
+ max_retries: int = 3,
65
+ **kwargs: Any,
60
66
  ) -> None:
61
67
  if model_config_dict is None:
62
68
  model_config_dict = OpenRouterConfig().as_dict()
@@ -72,20 +78,6 @@ class OpenRouterModel(OpenAICompatibleModel):
72
78
  url=url,
73
79
  token_counter=token_counter,
74
80
  timeout=timeout,
81
+ max_retries=max_retries,
82
+ **kwargs,
75
83
  )
76
-
77
- def check_model_config(self):
78
- r"""Check whether the model configuration contains any unexpected
79
- arguments to OpenRouter API. But OpenRouter API does not have any
80
- additional arguments to check.
81
-
82
- Raises:
83
- ValueError: If the model configuration dictionary contains any
84
- unexpected arguments to OpenRouter API.
85
- """
86
- for param in self.model_config_dict:
87
- if param not in OPENROUTER_API_PARAMS:
88
- raise ValueError(
89
- f"Unexpected argument `{param}` is "
90
- "input into OpenRouter model backend."
91
- )
@@ -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,12 +10,12 @@
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
 
15
15
  import os
16
16
  from typing import Any, Dict, Optional, Union
17
17
 
18
- from camel.configs import PPIO_API_PARAMS, PPIOConfig
18
+ from camel.configs import PPIOConfig
19
19
  from camel.models.openai_compatible_model import OpenAICompatibleModel
20
20
  from camel.types import ModelType
21
21
  from camel.utils import (
@@ -47,6 +47,10 @@ class PPIOModel(OpenAICompatibleModel):
47
47
  API calls. If not provided, will fall back to the MODEL_TIMEOUT
48
48
  environment variable or default to 180 seconds.
49
49
  (default: :obj:`None`)
50
+ max_retries (int, optional): Maximum number of retries for API calls.
51
+ (default: :obj:`3`)
52
+ **kwargs (Any): Additional arguments to pass to the client
53
+ initialization.
50
54
  """
51
55
 
52
56
  @api_keys_required(
@@ -62,6 +66,8 @@ class PPIOModel(OpenAICompatibleModel):
62
66
  url: Optional[str] = None,
63
67
  token_counter: Optional[BaseTokenCounter] = None,
64
68
  timeout: Optional[float] = None,
69
+ max_retries: int = 3,
70
+ **kwargs: Any,
65
71
  ) -> None:
66
72
  if model_config_dict is None:
67
73
  model_config_dict = PPIOConfig().as_dict()
@@ -77,19 +83,6 @@ class PPIOModel(OpenAICompatibleModel):
77
83
  url=url,
78
84
  token_counter=token_counter,
79
85
  timeout=timeout,
86
+ max_retries=max_retries,
87
+ **kwargs,
80
88
  )
81
-
82
- def check_model_config(self):
83
- r"""Check whether the model configuration contains any
84
- unexpected arguments to PPIO API.
85
-
86
- Raises:
87
- ValueError: If the model configuration dictionary contains any
88
- unexpected arguments to PPIO API.
89
- """
90
- for param in self.model_config_dict:
91
- if param not in PPIO_API_PARAMS:
92
- raise ValueError(
93
- f"Unexpected argument `{param}` is "
94
- "input into PPIO model backend."
95
- )
@@ -0,0 +1,89 @@
1
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
+ # you may not use this file except in compliance with the License.
4
+ # You may obtain a copy of the License at
5
+ #
6
+ # http://www.apache.org/licenses/LICENSE-2.0
7
+ #
8
+ # Unless required by applicable law or agreed to in writing, software
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ # See the License for the specific language governing permissions and
12
+ # limitations under the License.
13
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
14
+
15
+ import os
16
+ from typing import Any, Dict, Optional, Union
17
+
18
+ from camel.configs import QianfanConfig
19
+ from camel.models.openai_compatible_model import OpenAICompatibleModel
20
+ from camel.types import ModelType
21
+ from camel.utils import (
22
+ BaseTokenCounter,
23
+ api_keys_required,
24
+ )
25
+
26
+
27
+ class QianfanModel(OpenAICompatibleModel):
28
+ r"""Constructor for Qianfan backend with OpenAI compatibility.
29
+
30
+ Args:
31
+ model_type (Union[ModelType, str]): Model for which a backend is
32
+ created, supported model can be found here:
33
+ https://cloud.baidu.com/doc/QIANFANWORKSHOP/s/Wm9cvy6rl
34
+ model_config_dict (Optional[Dict[str, Any]], optional): A dictionary
35
+ that will be fed into:obj:`openai.ChatCompletion.create()`. If
36
+ :obj:`None`, :obj:`QianfanConfig().as_dict()` will be used.
37
+ (default: :obj:`None`)
38
+ api_key (Optional[str], optional): The API key for authenticating with
39
+ the Qianfan service. (default: :obj:`None`)
40
+ url (Optional[str], optional): The url to the Qianfan service.
41
+ If not provided, "https://qianfan.baidubce.com/v2/chat/completions"
42
+ will be used.(default: :obj:`None`)
43
+ token_counter (Optional[BaseTokenCounter], optional): Token counter to
44
+ use for the model. If not provided, :obj:`OpenAITokenCounter(
45
+ ModelType.GPT_4O_MINI)` will be used.
46
+ timeout (Optional[float], optional): The timeout value in seconds for
47
+ API calls. If not provided, will fall back to the MODEL_TIMEOUT
48
+ environment variable or default to 180 seconds.
49
+ (default: :obj:`None`)
50
+ max_retries (Optional[int], optional): Maximum number of retries
51
+ for API calls. (default: :obj:`None`)
52
+ **kwargs: Additional model-specific parameters that will be passed
53
+ to the model constructor.
54
+ """
55
+
56
+ @api_keys_required(
57
+ [
58
+ ("api_key", 'QIANFAN_API_KEY'),
59
+ ]
60
+ )
61
+ def __init__(
62
+ self,
63
+ model_type: Union[ModelType, str],
64
+ model_config_dict: Optional[Dict[str, Any]] = None,
65
+ api_key: Optional[str] = None,
66
+ url: Optional[str] = None,
67
+ token_counter: Optional[BaseTokenCounter] = None,
68
+ timeout: Optional[float] = None,
69
+ max_retries: int = 3,
70
+ **kwargs,
71
+ ) -> None:
72
+ if model_config_dict is None:
73
+ model_config_dict = QianfanConfig().as_dict()
74
+ api_key = api_key or os.environ.get("QIANFAN_API_KEY")
75
+ url = url or os.environ.get(
76
+ "QIANFAN_API_BASE_URL",
77
+ "https://qianfan.baidubce.com/v2",
78
+ )
79
+ timeout = timeout or float(os.environ.get("MODEL_TIMEOUT", 180))
80
+ super().__init__(
81
+ model_type=model_type,
82
+ model_config_dict=model_config_dict,
83
+ api_key=api_key,
84
+ url=url,
85
+ token_counter=token_counter,
86
+ timeout=timeout,
87
+ max_retries=max_retries,
88
+ **kwargs,
89
+ )