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,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 NETMIND_API_PARAMS, NetmindConfig
18
+ from camel.configs import NetmindConfig
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 NetmindModel(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 NetmindModel(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 = NetmindConfig().as_dict()
@@ -78,19 +84,6 @@ class NetmindModel(OpenAICompatibleModel):
78
84
  url=url,
79
85
  token_counter=token_counter,
80
86
  timeout=timeout,
87
+ max_retries=max_retries,
88
+ **kwargs,
81
89
  )
82
-
83
- def check_model_config(self):
84
- r"""Check whether the model configuration contains any
85
- unexpected arguments to NETMIND API.
86
-
87
- Raises:
88
- ValueError: If the model configuration dictionary contains any
89
- unexpected arguments to NETMIND API.
90
- """
91
- for param in self.model_config_dict:
92
- if param not in NETMIND_API_PARAMS:
93
- raise ValueError(
94
- f"Unexpected argument `{param}` is "
95
- "input into NETMIND model backend."
96
- )
@@ -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 NOVITA_API_PARAMS, NovitaConfig
18
+ from camel.configs import NovitaConfig
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 NovitaModel(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 NovitaModel(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 = NovitaConfig().as_dict()
@@ -77,19 +83,6 @@ class NovitaModel(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 Novita API.
85
-
86
- Raises:
87
- ValueError: If the model configuration dictionary contains any
88
- unexpected arguments to Novita API.
89
- """
90
- for param in self.model_config_dict:
91
- if param not in NOVITA_API_PARAMS:
92
- raise ValueError(
93
- f"Unexpected argument `{param}` is "
94
- "input into Novita model backend."
95
- )
@@ -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 NVIDIA_API_PARAMS, NvidiaConfig
18
+ from camel.configs import NvidiaConfig
19
19
  from camel.models.openai_compatible_model import OpenAICompatibleModel
20
20
  from camel.types import ModelType
21
21
  from camel.utils import BaseTokenCounter, api_keys_required
@@ -43,6 +43,10 @@ class NvidiaModel(OpenAICompatibleModel):
43
43
  API calls. If not provided, will fall back to the MODEL_TIMEOUT
44
44
  environment variable or default to 180 seconds.
45
45
  (default: :obj:`None`)
46
+ max_retries (int, optional): Maximum number of retries for API calls.
47
+ (default: :obj:`3`)
48
+ **kwargs (Any): Additional arguments to pass to the client
49
+ initialization.
46
50
  """
47
51
 
48
52
  @api_keys_required(
@@ -58,6 +62,8 @@ class NvidiaModel(OpenAICompatibleModel):
58
62
  url: Optional[str] = None,
59
63
  token_counter: Optional[BaseTokenCounter] = None,
60
64
  timeout: Optional[float] = None,
65
+ max_retries: int = 3,
66
+ **kwargs: Any,
61
67
  ) -> None:
62
68
  if model_config_dict is None:
63
69
  model_config_dict = NvidiaConfig().as_dict()
@@ -73,19 +79,6 @@ class NvidiaModel(OpenAICompatibleModel):
73
79
  url=url,
74
80
  token_counter=token_counter,
75
81
  timeout=timeout,
82
+ max_retries=max_retries,
83
+ **kwargs,
76
84
  )
77
-
78
- def check_model_config(self):
79
- r"""Check whether the model configuration contains any
80
- unexpected arguments to NVIDIA API.
81
-
82
- Raises:
83
- ValueError: If the model configuration dictionary contains any
84
- unexpected arguments to NVIDIA API.
85
- """
86
- for param in self.model_config_dict:
87
- if param not in NVIDIA_API_PARAMS:
88
- raise ValueError(
89
- f"Unexpected argument `{param}` is "
90
- "input into NVIDIA 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
  import os
15
15
  import subprocess
16
16
  from typing import Any, Dict, Optional, Union
17
17
 
18
- from camel.configs import OLLAMA_API_PARAMS, OllamaConfig
18
+ from camel.configs import OllamaConfig
19
19
  from camel.logger import get_logger
20
20
  from camel.models.openai_compatible_model import OpenAICompatibleModel
21
21
  from camel.types import ModelType
@@ -35,8 +35,8 @@ class OllamaModel(OpenAICompatibleModel):
35
35
  If:obj:`None`, :obj:`OllamaConfig().as_dict()` will be used.
36
36
  (default: :obj:`None`)
37
37
  api_key (Optional[str], optional): The API key for authenticating with
38
- the model service. Ollama doesn't need API key, it would be
39
- ignored if set. (default: :obj:`None`)
38
+ the model service. Required for Ollama cloud services. If not
39
+ provided, defaults to "Not_Provided". (default: :obj:`None`)
40
40
  url (Optional[str], optional): The url to the model service.
41
41
  (default: :obj:`None`)
42
42
  token_counter (Optional[BaseTokenCounter], optional): Token counter to
@@ -47,6 +47,10 @@ class OllamaModel(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
  References:
52
56
  https://github.com/ollama/ollama/blob/main/docs/openai.md
@@ -60,6 +64,8 @@ class OllamaModel(OpenAICompatibleModel):
60
64
  url: Optional[str] = None,
61
65
  token_counter: Optional[BaseTokenCounter] = None,
62
66
  timeout: Optional[float] = None,
67
+ max_retries: int = 3,
68
+ **kwargs: Any,
63
69
  ) -> None:
64
70
  if model_config_dict is None:
65
71
  model_config_dict = OllamaConfig().as_dict()
@@ -73,10 +79,12 @@ class OllamaModel(OpenAICompatibleModel):
73
79
  super().__init__(
74
80
  model_type=self._model_type,
75
81
  model_config_dict=model_config_dict,
76
- api_key="Not_Used",
82
+ api_key=api_key or "Not_Provided",
77
83
  url=self._url,
78
84
  token_counter=token_counter,
79
85
  timeout=timeout,
86
+ max_retries=max_retries,
87
+ **kwargs,
80
88
  )
81
89
 
82
90
  def _start_server(self) -> None:
@@ -94,18 +102,3 @@ class OllamaModel(OpenAICompatibleModel):
94
102
  )
95
103
  except Exception as e:
96
104
  logger.error(f"Failed to start Ollama server: {e}.")
97
-
98
- def check_model_config(self):
99
- r"""Check whether the model configuration contains any
100
- unexpected arguments to Ollama API.
101
-
102
- Raises:
103
- ValueError: If the model configuration dictionary contains any
104
- unexpected arguments to OpenAI API.
105
- """
106
- for param in self.model_config_dict:
107
- if param not in OLLAMA_API_PARAMS:
108
- raise ValueError(
109
- f"Unexpected argument `{param}` is "
110
- "input into Ollama model backend."
111
- )
@@ -1,4 +1,4 @@
1
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
1
+ # ========= Copyright 2023-2026 @ CAMEL-AI.org. All Rights Reserved. =========
2
2
  # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
@@ -10,7 +10,7 @@
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
13
+ # ========= Copyright 2023-2026 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
  import base64
15
15
  import os
16
16
  from typing import Any, List, Optional, Union
@@ -1,4 +1,4 @@
1
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
1
+ # ========= Copyright 2023-2026 @ CAMEL-AI.org. All Rights Reserved. =========
2
2
  # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
@@ -10,13 +10,17 @@
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 json import JSONDecodeError
17
17
  from typing import Any, Dict, List, Optional, Type, Union
18
18
 
19
19
  from openai import AsyncOpenAI, AsyncStream, BadRequestError, OpenAI, Stream
20
+ from openai.lib.streaming.chat import (
21
+ AsyncChatCompletionStreamManager,
22
+ ChatCompletionStreamManager,
23
+ )
20
24
  from pydantic import BaseModel, ValidationError
21
25
 
22
26
  from camel.logger import get_logger
@@ -31,9 +35,7 @@ from camel.types import (
31
35
  from camel.utils import (
32
36
  BaseTokenCounter,
33
37
  OpenAITokenCounter,
34
- get_current_agent_session_id,
35
38
  is_langfuse_available,
36
- update_langfuse_trace,
37
39
  )
38
40
 
39
41
  if os.environ.get("LANGFUSE_ENABLED", "False").lower() == "true":
@@ -41,6 +43,11 @@ if os.environ.get("LANGFUSE_ENABLED", "False").lower() == "true":
41
43
  from langfuse.decorators import observe
42
44
  except ImportError:
43
45
  from camel.utils import observe
46
+ elif os.environ.get("TRACEROOT_ENABLED", "False").lower() == "true":
47
+ try:
48
+ from traceroot import trace as observe # type: ignore[import]
49
+ except ImportError:
50
+ from camel.utils import observe
44
51
  else:
45
52
  from camel.utils import observe
46
53
 
@@ -67,6 +74,23 @@ class OpenAICompatibleModel(BaseModelBackend):
67
74
  API calls. If not provided, will fall back to the MODEL_TIMEOUT
68
75
  environment variable or default to 180 seconds.
69
76
  (default: :obj:`None`)
77
+ max_retries (int, optional): Maximum number of retries for API calls.
78
+ (default: :obj:`3`)
79
+ client (Optional[Any], optional): A custom synchronous
80
+ OpenAI-compatible client instance. If provided, this client will
81
+ be used instead of creating a new one. Useful for RL frameworks
82
+ like AReaL or rLLM that provide OpenAI-compatible clients (e.g.,
83
+ ArealOpenAI). The client should implement the OpenAI client
84
+ interface with `.chat.completions.create()` and `.beta.chat.
85
+ completions.parse()` methods. (default: :obj:`None`)
86
+ async_client (Optional[Any], optional): A custom asynchronous
87
+ OpenAI-compatible client instance. If provided, this client will
88
+ be used instead of creating a new one. The client should implement
89
+ the AsyncOpenAI client interface. (default: :obj:`None`)
90
+ **kwargs (Any): Additional arguments to pass to the
91
+ OpenAI client initialization. These can include parameters like
92
+ 'organization', 'default_headers', 'http_client', etc.
93
+ Ignored if custom clients are provided.
70
94
  """
71
95
 
72
96
  def __init__(
@@ -77,42 +101,73 @@ class OpenAICompatibleModel(BaseModelBackend):
77
101
  url: Optional[str] = None,
78
102
  token_counter: Optional[BaseTokenCounter] = None,
79
103
  timeout: Optional[float] = None,
104
+ max_retries: int = 3,
105
+ client: Optional[Any] = None,
106
+ async_client: Optional[Any] = None,
107
+ **kwargs: Any,
80
108
  ) -> None:
81
109
  api_key = api_key or os.environ.get("OPENAI_COMPATIBILITY_API_KEY")
82
110
  url = url or os.environ.get("OPENAI_COMPATIBILITY_API_BASE_URL")
83
111
  timeout = timeout or float(os.environ.get("MODEL_TIMEOUT", 180))
112
+
84
113
  super().__init__(
85
- model_type, model_config_dict, api_key, url, token_counter, timeout
114
+ model_type,
115
+ model_config_dict,
116
+ api_key,
117
+ url,
118
+ token_counter,
119
+ timeout,
120
+ max_retries,
86
121
  )
87
- if is_langfuse_available():
88
- from langfuse.openai import AsyncOpenAI as LangfuseAsyncOpenAI
89
- from langfuse.openai import OpenAI as LangfuseOpenAI
90
-
91
- self._client = LangfuseOpenAI(
92
- timeout=self._timeout,
93
- max_retries=3,
94
- base_url=self._url,
95
- api_key=self._api_key,
96
- )
97
- self._async_client = LangfuseAsyncOpenAI(
98
- timeout=self._timeout,
99
- max_retries=3,
100
- base_url=self._url,
101
- api_key=self._api_key,
102
- )
122
+
123
+ # Use custom clients if provided, otherwise create new ones
124
+ if client is not None:
125
+ # Use the provided custom sync client
126
+ self._client = client
103
127
  else:
104
- self._client = OpenAI(
105
- timeout=self._timeout,
106
- max_retries=3,
107
- base_url=self._url,
108
- api_key=self._api_key,
109
- )
110
- self._async_client = AsyncOpenAI(
111
- timeout=self._timeout,
112
- max_retries=3,
113
- base_url=self._url,
114
- api_key=self._api_key,
115
- )
128
+ # Create default sync client
129
+ if is_langfuse_available():
130
+ from langfuse.openai import OpenAI as LangfuseOpenAI
131
+
132
+ self._client = LangfuseOpenAI(
133
+ timeout=self._timeout,
134
+ max_retries=max_retries,
135
+ base_url=self._url,
136
+ api_key=self._api_key,
137
+ **kwargs,
138
+ )
139
+ else:
140
+ self._client = OpenAI(
141
+ timeout=self._timeout,
142
+ max_retries=max_retries,
143
+ base_url=self._url,
144
+ api_key=self._api_key,
145
+ **kwargs,
146
+ )
147
+
148
+ if async_client is not None:
149
+ # Use the provided custom async client
150
+ self._async_client = async_client
151
+ else:
152
+ # Create default async client
153
+ if is_langfuse_available():
154
+ from langfuse.openai import AsyncOpenAI as LangfuseAsyncOpenAI
155
+
156
+ self._async_client = LangfuseAsyncOpenAI(
157
+ timeout=self._timeout,
158
+ max_retries=max_retries,
159
+ base_url=self._url,
160
+ api_key=self._api_key,
161
+ **kwargs,
162
+ )
163
+ else:
164
+ self._async_client = AsyncOpenAI(
165
+ timeout=self._timeout,
166
+ max_retries=max_retries,
167
+ base_url=self._url,
168
+ api_key=self._api_key,
169
+ **kwargs,
170
+ )
116
171
 
117
172
  @observe()
118
173
  def _run(
@@ -120,7 +175,11 @@ class OpenAICompatibleModel(BaseModelBackend):
120
175
  messages: List[OpenAIMessage],
121
176
  response_format: Optional[Type[BaseModel]] = None,
122
177
  tools: Optional[List[Dict[str, Any]]] = None,
123
- ) -> Union[ChatCompletion, Stream[ChatCompletionChunk]]:
178
+ ) -> Union[
179
+ ChatCompletion,
180
+ Stream[ChatCompletionChunk],
181
+ ChatCompletionStreamManager[BaseModel],
182
+ ]:
124
183
  r"""Runs inference of OpenAI chat completion.
125
184
 
126
185
  Args:
@@ -135,27 +194,27 @@ class OpenAICompatibleModel(BaseModelBackend):
135
194
  Union[ChatCompletion, Stream[ChatCompletionChunk]]:
136
195
  `ChatCompletion` in the non-stream mode, or
137
196
  `Stream[ChatCompletionChunk]` in the stream mode.
197
+ `ChatCompletionStreamManager[BaseModel]` for
198
+ structured output streaming.
138
199
  """
139
-
140
- # Update Langfuse trace with current agent session and metadata
141
- agent_session_id = get_current_agent_session_id()
142
- if agent_session_id:
143
- update_langfuse_trace(
144
- session_id=agent_session_id,
145
- metadata={
146
- "agent_id": agent_session_id,
147
- "model_type": str(self.model_type),
148
- },
149
- tags=["CAMEL-AI", str(self.model_type)],
150
- )
200
+ self._log_and_trace()
151
201
 
152
202
  response_format = response_format or self.model_config_dict.get(
153
203
  "response_format", None
154
204
  )
205
+
206
+ # Check if streaming is enabled
207
+ is_streaming = self.model_config_dict.get("stream", False)
208
+
155
209
  if response_format:
156
- result: Union[ChatCompletion, Stream[ChatCompletionChunk]] = (
157
- self._request_parse(messages, response_format, tools)
158
- )
210
+ if is_streaming:
211
+ # Use streaming parse for structured output
212
+ return self._request_stream_parse(
213
+ messages, response_format, tools
214
+ )
215
+ else:
216
+ # Use non-streaming parse for structured output
217
+ return self._request_parse(messages, response_format, tools)
159
218
  else:
160
219
  result = self._request_chat_completion(messages, tools)
161
220
 
@@ -167,7 +226,11 @@ class OpenAICompatibleModel(BaseModelBackend):
167
226
  messages: List[OpenAIMessage],
168
227
  response_format: Optional[Type[BaseModel]] = None,
169
228
  tools: Optional[List[Dict[str, Any]]] = None,
170
- ) -> Union[ChatCompletion, AsyncStream[ChatCompletionChunk]]:
229
+ ) -> Union[
230
+ ChatCompletion,
231
+ AsyncStream[ChatCompletionChunk],
232
+ AsyncChatCompletionStreamManager[BaseModel],
233
+ ]:
171
234
  r"""Runs inference of OpenAI chat completion in async mode.
172
235
 
173
236
  Args:
@@ -179,30 +242,33 @@ class OpenAICompatibleModel(BaseModelBackend):
179
242
  use for the request.
180
243
 
181
244
  Returns:
182
- Union[ChatCompletion, AsyncStream[ChatCompletionChunk]]:
183
- `ChatCompletion` in the non-stream mode, or
184
- `AsyncStream[ChatCompletionChunk]` in the stream mode.
245
+ Union[ChatCompletion, AsyncStream[ChatCompletionChunk],
246
+ AsyncChatCompletionStreamManager[BaseModel]]:
247
+ `ChatCompletion` in the non-stream mode,
248
+ `AsyncStream[ChatCompletionChunk]` in the stream mode,
249
+ or `AsyncChatCompletionStreamManager[BaseModel]` for
250
+ structured output streaming.
185
251
  """
186
-
187
- # Update Langfuse trace with current agent session and metadata
188
- agent_session_id = get_current_agent_session_id()
189
- if agent_session_id:
190
- update_langfuse_trace(
191
- session_id=agent_session_id,
192
- metadata={
193
- "agent_id": agent_session_id,
194
- "model_type": str(self.model_type),
195
- },
196
- tags=["CAMEL-AI", str(self.model_type)],
197
- )
252
+ self._log_and_trace()
198
253
 
199
254
  response_format = response_format or self.model_config_dict.get(
200
255
  "response_format", None
201
256
  )
257
+
258
+ # Check if streaming is enabled
259
+ is_streaming = self.model_config_dict.get("stream", False)
260
+
202
261
  if response_format:
203
- result: Union[
204
- ChatCompletion, AsyncStream[ChatCompletionChunk]
205
- ] = await self._arequest_parse(messages, response_format, tools)
262
+ if is_streaming:
263
+ # Use streaming parse for structured output
264
+ return await self._arequest_stream_parse(
265
+ messages, response_format, tools
266
+ )
267
+ else:
268
+ # Use non-streaming parse for structured output
269
+ return await self._arequest_parse(
270
+ messages, response_format, tools
271
+ )
206
272
  else:
207
273
  result = await self._arequest_chat_completion(messages, tools)
208
274
 
@@ -318,6 +384,62 @@ class OpenAICompatibleModel(BaseModelBackend):
318
384
  logger.error(f"Fallback attempt also failed: {e}")
319
385
  raise
320
386
 
387
+ def _request_stream_parse(
388
+ self,
389
+ messages: List[OpenAIMessage],
390
+ response_format: Type[BaseModel],
391
+ tools: Optional[List[Dict[str, Any]]] = None,
392
+ ) -> ChatCompletionStreamManager[BaseModel]:
393
+ r"""Request streaming structured output parsing.
394
+
395
+ Note: This uses OpenAI's beta streaming API for structured outputs.
396
+ """
397
+ import copy
398
+
399
+ request_config = copy.deepcopy(self.model_config_dict)
400
+
401
+ # Remove stream from config as it's handled by the stream method
402
+ request_config.pop("stream", None)
403
+
404
+ if tools is not None:
405
+ request_config["tools"] = tools
406
+
407
+ # Use the beta streaming API for structured outputs
408
+ return self._client.beta.chat.completions.stream(
409
+ messages=messages,
410
+ model=self.model_type,
411
+ response_format=response_format,
412
+ **request_config,
413
+ )
414
+
415
+ async def _arequest_stream_parse(
416
+ self,
417
+ messages: List[OpenAIMessage],
418
+ response_format: Type[BaseModel],
419
+ tools: Optional[List[Dict[str, Any]]] = None,
420
+ ) -> AsyncChatCompletionStreamManager[BaseModel]:
421
+ r"""Request async streaming structured output parsing.
422
+
423
+ Note: This uses OpenAI's beta streaming API for structured outputs.
424
+ """
425
+ import copy
426
+
427
+ request_config = copy.deepcopy(self.model_config_dict)
428
+
429
+ # Remove stream from config as it's handled by the stream method
430
+ request_config.pop("stream", None)
431
+
432
+ if tools is not None:
433
+ request_config["tools"] = tools
434
+
435
+ # Use the beta streaming API for structured outputs
436
+ return self._async_client.beta.chat.completions.stream(
437
+ messages=messages,
438
+ model=self.model_type,
439
+ response_format=response_format,
440
+ **request_config,
441
+ )
442
+
321
443
  @property
322
444
  def token_counter(self) -> BaseTokenCounter:
323
445
  r"""Initialize the token counter for the model backend.
@@ -340,6 +462,3 @@ class OpenAICompatibleModel(BaseModelBackend):
340
462
  bool: Whether the model is in stream mode.
341
463
  """
342
464
  return self.model_config_dict.get('stream', False)
343
-
344
- def check_model_config(self):
345
- pass