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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of camel-ai might be problematic. Click here for more details.

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