camel-ai 0.2.59__py3-none-any.whl → 0.2.82__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (506) hide show
  1. camel/__init__.py +3 -3
  2. camel/agents/__init__.py +2 -2
  3. camel/agents/_types.py +9 -4
  4. camel/agents/_utils.py +40 -2
  5. camel/agents/base.py +2 -2
  6. camel/agents/chat_agent.py +5012 -902
  7. camel/agents/critic_agent.py +2 -2
  8. camel/agents/deductive_reasoner_agent.py +56 -56
  9. camel/agents/embodied_agent.py +2 -2
  10. camel/agents/knowledge_graph_agent.py +20 -20
  11. camel/agents/mcp_agent.py +39 -36
  12. camel/agents/multi_hop_generator_agent.py +3 -3
  13. camel/agents/programmed_agent_instruction.py +2 -2
  14. camel/agents/repo_agent.py +4 -3
  15. camel/agents/role_assignment_agent.py +2 -2
  16. camel/agents/search_agent.py +2 -2
  17. camel/agents/task_agent.py +2 -2
  18. camel/agents/tool_agents/__init__.py +2 -2
  19. camel/agents/tool_agents/base.py +2 -2
  20. camel/agents/tool_agents/hugging_face_tool_agent.py +3 -3
  21. camel/benchmarks/__init__.py +2 -2
  22. camel/benchmarks/apibank.py +5 -5
  23. camel/benchmarks/apibench.py +2 -2
  24. camel/benchmarks/base.py +2 -2
  25. camel/benchmarks/browsecomp.py +44 -33
  26. camel/benchmarks/gaia.py +17 -13
  27. camel/benchmarks/mock_website/README.md +94 -0
  28. camel/benchmarks/mock_website/mock_web.py +299 -0
  29. camel/benchmarks/mock_website/requirements.txt +3 -0
  30. camel/benchmarks/mock_website/shopping_mall/app.py +465 -0
  31. camel/benchmarks/mock_website/task.json +104 -0
  32. camel/benchmarks/nexus.py +3 -3
  33. camel/benchmarks/ragbench.py +2 -2
  34. camel/bots/__init__.py +2 -2
  35. camel/bots/discord/__init__.py +2 -2
  36. camel/bots/discord/discord_app.py +2 -2
  37. camel/bots/discord/discord_installation.py +2 -2
  38. camel/bots/discord/discord_store.py +3 -3
  39. camel/bots/slack/__init__.py +2 -2
  40. camel/bots/slack/models.py +4 -4
  41. camel/bots/slack/slack_app.py +2 -2
  42. camel/bots/telegram_bot.py +2 -2
  43. camel/configs/__init__.py +26 -2
  44. camel/configs/aihubmix_config.py +90 -0
  45. camel/configs/aiml_config.py +2 -2
  46. camel/configs/amd_config.py +70 -0
  47. camel/configs/anthropic_config.py +8 -7
  48. camel/configs/base_config.py +2 -2
  49. camel/configs/bedrock_config.py +5 -3
  50. camel/configs/cerebras_config.py +98 -0
  51. camel/configs/cohere_config.py +3 -3
  52. camel/configs/cometapi_config.py +106 -0
  53. camel/configs/crynux_config.py +94 -0
  54. camel/configs/deepseek_config.py +9 -8
  55. camel/configs/gemini_config.py +6 -4
  56. camel/configs/groq_config.py +6 -4
  57. camel/configs/internlm_config.py +6 -4
  58. camel/configs/litellm_config.py +2 -2
  59. camel/configs/lmstudio_config.py +6 -4
  60. camel/configs/minimax_config.py +95 -0
  61. camel/configs/mistral_config.py +3 -3
  62. camel/configs/modelscope_config.py +5 -3
  63. camel/configs/moonshot_config.py +2 -2
  64. camel/configs/nebius_config.py +105 -0
  65. camel/configs/netmind_config.py +2 -2
  66. camel/configs/novita_config.py +2 -2
  67. camel/configs/nvidia_config.py +2 -2
  68. camel/configs/ollama_config.py +2 -2
  69. camel/configs/openai_config.py +8 -3
  70. camel/configs/openrouter_config.py +6 -4
  71. camel/configs/ppio_config.py +2 -2
  72. camel/configs/qianfan_config.py +85 -0
  73. camel/configs/qwen_config.py +2 -2
  74. camel/configs/reka_config.py +3 -3
  75. camel/configs/samba_config.py +8 -6
  76. camel/configs/sglang_config.py +2 -2
  77. camel/configs/siliconflow_config.py +2 -2
  78. camel/configs/togetherai_config.py +2 -2
  79. camel/configs/vllm_config.py +4 -2
  80. camel/configs/watsonx_config.py +2 -2
  81. camel/configs/yi_config.py +6 -4
  82. camel/configs/zhipuai_config.py +6 -4
  83. camel/{data_collector → data_collectors}/__init__.py +2 -2
  84. camel/{data_collector → data_collectors}/alpaca_collector.py +19 -10
  85. camel/{data_collector → data_collectors}/base.py +2 -2
  86. camel/{data_collector → data_collectors}/sharegpt_collector.py +3 -3
  87. camel/datagen/__init__.py +2 -2
  88. camel/datagen/cot_datagen.py +32 -37
  89. camel/datagen/evol_instruct/__init__.py +2 -2
  90. camel/datagen/evol_instruct/evol_instruct.py +2 -2
  91. camel/datagen/evol_instruct/scorer.py +24 -25
  92. camel/datagen/evol_instruct/templates.py +48 -48
  93. camel/datagen/self_improving_cot.py +5 -5
  94. camel/datagen/self_instruct/__init__.py +2 -2
  95. camel/datagen/self_instruct/filter/__init__.py +2 -2
  96. camel/datagen/self_instruct/filter/filter_function.py +2 -2
  97. camel/datagen/self_instruct/filter/filter_registry.py +2 -2
  98. camel/datagen/self_instruct/filter/instruction_filter.py +2 -2
  99. camel/datagen/self_instruct/self_instruct.py +2 -2
  100. camel/datagen/self_instruct/templates.py +47 -47
  101. camel/datagen/source2synth/__init__.py +2 -2
  102. camel/datagen/source2synth/data_processor.py +2 -2
  103. camel/datagen/source2synth/models.py +2 -2
  104. camel/datagen/source2synth/user_data_processor_config.py +2 -2
  105. camel/datahubs/__init__.py +2 -2
  106. camel/datahubs/base.py +2 -2
  107. camel/datahubs/huggingface.py +2 -2
  108. camel/datahubs/models.py +2 -2
  109. camel/datasets/__init__.py +2 -2
  110. camel/datasets/base_generator.py +41 -12
  111. camel/datasets/few_shot_generator.py +18 -18
  112. camel/datasets/models.py +3 -3
  113. camel/datasets/self_instruct_generator.py +2 -2
  114. camel/datasets/static_dataset.py +152 -2
  115. camel/embeddings/__init__.py +2 -2
  116. camel/embeddings/azure_embedding.py +2 -2
  117. camel/embeddings/base.py +2 -2
  118. camel/embeddings/gemini_embedding.py +2 -2
  119. camel/embeddings/jina_embedding.py +10 -3
  120. camel/embeddings/mistral_embedding.py +2 -2
  121. camel/embeddings/openai_compatible_embedding.py +2 -2
  122. camel/embeddings/openai_embedding.py +2 -2
  123. camel/embeddings/sentence_transformers_embeddings.py +4 -4
  124. camel/embeddings/together_embedding.py +2 -2
  125. camel/embeddings/vlm_embedding.py +11 -4
  126. camel/environments/__init__.py +14 -2
  127. camel/environments/models.py +2 -2
  128. camel/environments/multi_step.py +2 -2
  129. camel/environments/rlcards_env.py +860 -0
  130. camel/environments/single_step.py +30 -5
  131. camel/environments/tic_tac_toe.py +3 -3
  132. camel/extractors/__init__.py +2 -2
  133. camel/extractors/base.py +2 -2
  134. camel/extractors/python_strategies.py +2 -2
  135. camel/generators.py +2 -2
  136. camel/human.py +2 -2
  137. camel/interpreters/__init__.py +4 -2
  138. camel/interpreters/base.py +16 -3
  139. camel/interpreters/docker/Dockerfile +53 -7
  140. camel/interpreters/docker_interpreter.py +70 -11
  141. camel/interpreters/e2b_interpreter.py +59 -11
  142. camel/interpreters/internal_python_interpreter.py +81 -4
  143. camel/interpreters/interpreter_error.py +2 -2
  144. camel/interpreters/ipython_interpreter.py +23 -5
  145. camel/interpreters/microsandbox_interpreter.py +395 -0
  146. camel/interpreters/subprocess_interpreter.py +36 -4
  147. camel/loaders/__init__.py +17 -5
  148. camel/loaders/apify_reader.py +2 -2
  149. camel/loaders/base_io.py +2 -2
  150. camel/loaders/base_loader.py +85 -0
  151. camel/loaders/chunkr_reader.py +128 -93
  152. camel/loaders/crawl4ai_reader.py +2 -2
  153. camel/loaders/firecrawl_reader.py +6 -6
  154. camel/loaders/jina_url_reader.py +2 -2
  155. camel/loaders/markitdown.py +2 -2
  156. camel/loaders/mineru_extractor.py +2 -2
  157. camel/loaders/mistral_reader.py +148 -0
  158. camel/loaders/scrapegraph_reader.py +2 -2
  159. camel/loaders/unstructured_io.py +2 -2
  160. camel/logger.py +5 -5
  161. camel/memories/__init__.py +2 -2
  162. camel/memories/agent_memories.py +86 -3
  163. camel/memories/base.py +36 -2
  164. camel/memories/blocks/__init__.py +2 -2
  165. camel/memories/blocks/chat_history_block.py +126 -9
  166. camel/memories/blocks/vectordb_block.py +10 -3
  167. camel/memories/context_creators/__init__.py +2 -2
  168. camel/memories/context_creators/score_based.py +31 -239
  169. camel/memories/records.py +98 -13
  170. camel/messages/__init__.py +2 -2
  171. camel/messages/base.py +193 -46
  172. camel/messages/conversion/__init__.py +2 -2
  173. camel/messages/conversion/alpaca.py +2 -2
  174. camel/messages/conversion/conversation_models.py +2 -2
  175. camel/messages/conversion/sharegpt/__init__.py +2 -2
  176. camel/messages/conversion/sharegpt/function_call_formatter.py +2 -2
  177. camel/messages/conversion/sharegpt/hermes/__init__.py +2 -2
  178. camel/messages/conversion/sharegpt/hermes/hermes_function_formatter.py +2 -2
  179. camel/messages/func_message.py +54 -17
  180. camel/models/__init__.py +18 -2
  181. camel/models/_utils.py +3 -3
  182. camel/models/aihubmix_model.py +83 -0
  183. camel/models/aiml_model.py +11 -18
  184. camel/models/amd_model.py +101 -0
  185. camel/models/anthropic_model.py +127 -20
  186. camel/models/aws_bedrock_model.py +12 -35
  187. camel/models/azure_openai_model.py +263 -63
  188. camel/models/base_audio_model.py +5 -3
  189. camel/models/base_model.py +195 -26
  190. camel/models/cerebras_model.py +83 -0
  191. camel/models/cohere_model.py +81 -21
  192. camel/models/cometapi_model.py +83 -0
  193. camel/models/crynux_model.py +87 -0
  194. camel/models/deepseek_model.py +61 -59
  195. camel/models/fish_audio_model.py +8 -2
  196. camel/models/gemini_model.py +439 -30
  197. camel/models/groq_model.py +11 -19
  198. camel/models/internlm_model.py +11 -18
  199. camel/models/litellm_model.py +94 -34
  200. camel/models/lmstudio_model.py +17 -20
  201. camel/models/minimax_model.py +83 -0
  202. camel/models/mistral_model.py +84 -19
  203. camel/models/model_factory.py +49 -6
  204. camel/models/model_manager.py +33 -11
  205. camel/models/modelscope_model.py +13 -193
  206. camel/models/moonshot_model.py +195 -21
  207. camel/models/nebius_model.py +83 -0
  208. camel/models/nemotron_model.py +19 -9
  209. camel/models/netmind_model.py +11 -18
  210. camel/models/novita_model.py +11 -18
  211. camel/models/nvidia_model.py +11 -18
  212. camel/models/ollama_model.py +14 -21
  213. camel/models/openai_audio_models.py +2 -2
  214. camel/models/openai_compatible_model.py +234 -27
  215. camel/models/openai_model.py +255 -39
  216. camel/models/openrouter_model.py +11 -19
  217. camel/models/ppio_model.py +11 -18
  218. camel/models/qianfan_model.py +89 -0
  219. camel/models/qwen_model.py +13 -193
  220. camel/models/reka_model.py +90 -21
  221. camel/models/reward/__init__.py +2 -2
  222. camel/models/reward/base_reward_model.py +2 -2
  223. camel/models/reward/evaluator.py +2 -2
  224. camel/models/reward/nemotron_model.py +2 -2
  225. camel/models/reward/skywork_model.py +2 -2
  226. camel/models/samba_model.py +117 -49
  227. camel/models/sglang_model.py +162 -42
  228. camel/models/siliconflow_model.py +12 -35
  229. camel/models/stub_model.py +10 -7
  230. camel/models/togetherai_model.py +11 -18
  231. camel/models/vllm_model.py +10 -18
  232. camel/models/volcano_model.py +16 -20
  233. camel/models/watsonx_model.py +69 -19
  234. camel/models/yi_model.py +11 -18
  235. camel/models/zhipuai_model.py +70 -18
  236. camel/parsers/__init__.py +18 -0
  237. camel/parsers/mcp_tool_call_parser.py +176 -0
  238. camel/personas/__init__.py +2 -2
  239. camel/personas/persona.py +2 -2
  240. camel/personas/persona_hub.py +2 -2
  241. camel/prompts/__init__.py +2 -2
  242. camel/prompts/ai_society.py +2 -2
  243. camel/prompts/base.py +2 -2
  244. camel/prompts/code.py +2 -2
  245. camel/prompts/evaluation.py +2 -2
  246. camel/prompts/generate_text_embedding_data.py +2 -2
  247. camel/prompts/image_craft.py +2 -2
  248. camel/prompts/misalignment.py +2 -2
  249. camel/prompts/multi_condition_image_craft.py +2 -2
  250. camel/prompts/object_recognition.py +2 -2
  251. camel/prompts/persona_hub.py +3 -3
  252. camel/prompts/prompt_templates.py +2 -2
  253. camel/prompts/role_description_prompt_template.py +2 -2
  254. camel/prompts/solution_extraction.py +8 -8
  255. camel/prompts/task_prompt_template.py +2 -2
  256. camel/prompts/translation.py +2 -2
  257. camel/prompts/video_description_prompt.py +3 -3
  258. camel/responses/__init__.py +2 -2
  259. camel/responses/agent_responses.py +2 -2
  260. camel/retrievers/__init__.py +2 -2
  261. camel/retrievers/auto_retriever.py +23 -3
  262. camel/retrievers/base.py +2 -2
  263. camel/retrievers/bm25_retriever.py +3 -4
  264. camel/retrievers/cohere_rerank_retriever.py +2 -2
  265. camel/retrievers/hybrid_retrival.py +4 -4
  266. camel/retrievers/vector_retriever.py +2 -2
  267. camel/runtimes/Dockerfile.multi-toolkit +90 -0
  268. camel/{runtime → runtimes}/__init__.py +2 -2
  269. camel/runtimes/api.py +153 -0
  270. camel/{runtime → runtimes}/base.py +2 -2
  271. camel/{runtime → runtimes}/configs.py +13 -13
  272. camel/{runtime → runtimes}/daytona_runtime.py +18 -19
  273. camel/{runtime → runtimes}/docker_runtime.py +13 -13
  274. camel/{runtime → runtimes}/llm_guard_runtime.py +28 -28
  275. camel/{runtime → runtimes}/remote_http_runtime.py +12 -12
  276. camel/{runtime → runtimes}/ubuntu_docker_runtime.py +3 -3
  277. camel/{runtime → runtimes}/utils/__init__.py +2 -2
  278. camel/{runtime → runtimes}/utils/function_risk_toolkit.py +2 -2
  279. camel/{runtime → runtimes}/utils/ignore_risk_toolkit.py +2 -2
  280. camel/schemas/__init__.py +2 -2
  281. camel/schemas/base.py +2 -2
  282. camel/schemas/openai_converter.py +3 -3
  283. camel/schemas/outlines_converter.py +2 -2
  284. camel/services/agent_openapi_server.py +380 -0
  285. camel/societies/__init__.py +4 -2
  286. camel/societies/babyagi_playing.py +2 -2
  287. camel/societies/role_playing.py +201 -80
  288. camel/societies/workforce/__init__.py +10 -3
  289. camel/societies/workforce/base.py +9 -5
  290. camel/societies/workforce/events.py +143 -0
  291. camel/societies/workforce/prompts.py +258 -33
  292. camel/societies/workforce/role_playing_worker.py +95 -30
  293. camel/societies/workforce/single_agent_worker.py +659 -30
  294. camel/societies/workforce/structured_output_handler.py +512 -0
  295. camel/societies/workforce/task_channel.py +182 -38
  296. camel/societies/workforce/utils.py +784 -18
  297. camel/societies/workforce/worker.py +96 -28
  298. camel/societies/workforce/workflow_memory_manager.py +1746 -0
  299. camel/societies/workforce/workforce.py +5730 -366
  300. camel/societies/workforce/workforce_callback.py +103 -0
  301. camel/societies/workforce/workforce_logger.py +647 -0
  302. camel/societies/workforce/workforce_metrics.py +33 -0
  303. camel/storages/__init__.py +10 -2
  304. camel/storages/graph_storages/__init__.py +2 -2
  305. camel/storages/graph_storages/base.py +2 -2
  306. camel/storages/graph_storages/graph_element.py +2 -2
  307. camel/storages/graph_storages/nebula_graph.py +4 -4
  308. camel/storages/graph_storages/neo4j_graph.py +7 -7
  309. camel/storages/key_value_storages/__init__.py +2 -2
  310. camel/storages/key_value_storages/base.py +2 -2
  311. camel/storages/key_value_storages/in_memory.py +2 -2
  312. camel/storages/key_value_storages/json.py +17 -4
  313. camel/storages/key_value_storages/mem0_cloud.py +50 -49
  314. camel/storages/key_value_storages/redis.py +2 -2
  315. camel/storages/object_storages/__init__.py +2 -2
  316. camel/storages/object_storages/amazon_s3.py +2 -2
  317. camel/storages/object_storages/azure_blob.py +2 -2
  318. camel/storages/object_storages/base.py +2 -2
  319. camel/storages/object_storages/google_cloud.py +3 -3
  320. camel/storages/vectordb_storages/__init__.py +12 -2
  321. camel/storages/vectordb_storages/base.py +2 -2
  322. camel/storages/vectordb_storages/chroma.py +731 -0
  323. camel/storages/vectordb_storages/faiss.py +712 -0
  324. camel/storages/vectordb_storages/milvus.py +2 -2
  325. camel/storages/vectordb_storages/oceanbase.py +16 -17
  326. camel/storages/vectordb_storages/pgvector.py +349 -0
  327. camel/storages/vectordb_storages/qdrant.py +6 -6
  328. camel/storages/vectordb_storages/surreal.py +372 -0
  329. camel/storages/vectordb_storages/tidb.py +11 -8
  330. camel/storages/vectordb_storages/weaviate.py +714 -0
  331. camel/tasks/__init__.py +2 -2
  332. camel/tasks/task.py +366 -27
  333. camel/tasks/task_prompt.py +3 -3
  334. camel/terminators/__init__.py +2 -2
  335. camel/terminators/base.py +2 -2
  336. camel/terminators/response_terminator.py +2 -2
  337. camel/terminators/token_limit_terminator.py +2 -2
  338. camel/toolkits/__init__.py +58 -10
  339. camel/toolkits/aci_toolkit.py +66 -21
  340. camel/toolkits/arxiv_toolkit.py +8 -8
  341. camel/toolkits/ask_news_toolkit.py +2 -2
  342. camel/toolkits/async_browser_toolkit.py +174 -575
  343. camel/toolkits/audio_analysis_toolkit.py +3 -3
  344. camel/toolkits/base.py +65 -7
  345. camel/toolkits/bohrium_toolkit.py +318 -0
  346. camel/toolkits/browser_toolkit.py +306 -566
  347. camel/toolkits/browser_toolkit_commons.py +568 -0
  348. camel/toolkits/code_execution.py +67 -11
  349. camel/toolkits/context_summarizer_toolkit.py +684 -0
  350. camel/toolkits/craw4ai_toolkit.py +93 -0
  351. camel/toolkits/dappier_toolkit.py +12 -8
  352. camel/toolkits/data_commons_toolkit.py +2 -2
  353. camel/toolkits/dingtalk.py +1135 -0
  354. camel/toolkits/earth_science_toolkit.py +5367 -0
  355. camel/toolkits/edgeone_pages_mcp_toolkit.py +49 -0
  356. camel/toolkits/excel_toolkit.py +910 -70
  357. camel/toolkits/file_toolkit.py +1402 -0
  358. camel/toolkits/function_tool.py +128 -20
  359. camel/toolkits/github_toolkit.py +148 -43
  360. camel/toolkits/gmail_toolkit.py +1839 -0
  361. camel/toolkits/google_calendar_toolkit.py +40 -6
  362. camel/toolkits/google_drive_mcp_toolkit.py +54 -0
  363. camel/toolkits/google_maps_toolkit.py +2 -2
  364. camel/toolkits/google_scholar_toolkit.py +2 -2
  365. camel/toolkits/human_toolkit.py +36 -12
  366. camel/toolkits/hybrid_browser_toolkit/__init__.py +18 -0
  367. camel/toolkits/hybrid_browser_toolkit/config_loader.py +185 -0
  368. camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit.py +246 -0
  369. camel/toolkits/hybrid_browser_toolkit/hybrid_browser_toolkit_ts.py +1973 -0
  370. camel/toolkits/hybrid_browser_toolkit/installer.py +203 -0
  371. camel/toolkits/hybrid_browser_toolkit/ts/package-lock.json +4589 -0
  372. camel/toolkits/hybrid_browser_toolkit/ts/package.json +33 -0
  373. camel/toolkits/hybrid_browser_toolkit/ts/src/browser-scripts.js +125 -0
  374. camel/toolkits/hybrid_browser_toolkit/ts/src/browser-session.ts +1929 -0
  375. camel/toolkits/hybrid_browser_toolkit/ts/src/config-loader.ts +233 -0
  376. camel/toolkits/hybrid_browser_toolkit/ts/src/hybrid-browser-toolkit.ts +589 -0
  377. camel/toolkits/hybrid_browser_toolkit/ts/src/index.ts +7 -0
  378. camel/toolkits/hybrid_browser_toolkit/ts/src/parent-child-filter.ts +226 -0
  379. camel/toolkits/hybrid_browser_toolkit/ts/src/snapshot-parser.ts +219 -0
  380. camel/toolkits/hybrid_browser_toolkit/ts/src/som-screenshot-injected.ts +543 -0
  381. camel/toolkits/hybrid_browser_toolkit/ts/src/types.ts +129 -0
  382. camel/toolkits/hybrid_browser_toolkit/ts/tsconfig.json +27 -0
  383. camel/toolkits/hybrid_browser_toolkit/ts/websocket-server.js +319 -0
  384. camel/toolkits/hybrid_browser_toolkit/ws_wrapper.py +1037 -0
  385. camel/toolkits/hybrid_browser_toolkit_py/__init__.py +17 -0
  386. camel/toolkits/hybrid_browser_toolkit_py/actions.py +575 -0
  387. camel/toolkits/hybrid_browser_toolkit_py/agent.py +311 -0
  388. camel/toolkits/hybrid_browser_toolkit_py/browser_session.py +787 -0
  389. camel/toolkits/hybrid_browser_toolkit_py/config_loader.py +490 -0
  390. camel/toolkits/hybrid_browser_toolkit_py/hybrid_browser_toolkit.py +2390 -0
  391. camel/toolkits/hybrid_browser_toolkit_py/snapshot.py +233 -0
  392. camel/toolkits/hybrid_browser_toolkit_py/stealth_script.js +0 -0
  393. camel/toolkits/hybrid_browser_toolkit_py/unified_analyzer.js +1043 -0
  394. camel/toolkits/image_analysis_toolkit.py +3 -3
  395. camel/toolkits/image_generation_toolkit.py +390 -0
  396. camel/toolkits/jina_reranker_toolkit.py +195 -79
  397. camel/toolkits/klavis_toolkit.py +7 -3
  398. camel/toolkits/linkedin_toolkit.py +2 -2
  399. camel/toolkits/markitdown_toolkit.py +104 -0
  400. camel/toolkits/math_toolkit.py +66 -12
  401. camel/toolkits/mcp_toolkit.py +841 -600
  402. camel/toolkits/memory_toolkit.py +7 -3
  403. camel/toolkits/meshy_toolkit.py +2 -2
  404. camel/toolkits/message_agent_toolkit.py +608 -0
  405. camel/toolkits/message_integration.py +724 -0
  406. camel/toolkits/mineru_toolkit.py +2 -2
  407. camel/toolkits/minimax_mcp_toolkit.py +195 -0
  408. camel/toolkits/networkx_toolkit.py +2 -2
  409. camel/toolkits/note_taking_toolkit.py +277 -0
  410. camel/toolkits/notion_mcp_toolkit.py +224 -0
  411. camel/toolkits/notion_toolkit.py +2 -2
  412. camel/toolkits/open_api_specs/biztoc/__init__.py +2 -2
  413. camel/toolkits/open_api_specs/biztoc/ai-plugin.json +1 -1
  414. camel/toolkits/open_api_specs/coursera/__init__.py +2 -2
  415. camel/toolkits/open_api_specs/create_qr_code/__init__.py +2 -2
  416. camel/toolkits/open_api_specs/klarna/__init__.py +2 -2
  417. camel/toolkits/open_api_specs/nasa_apod/__init__.py +2 -2
  418. camel/toolkits/open_api_specs/outschool/__init__.py +2 -2
  419. camel/toolkits/open_api_specs/outschool/ai-plugin.json +1 -1
  420. camel/toolkits/open_api_specs/outschool/openapi.yaml +1 -1
  421. camel/toolkits/open_api_specs/outschool/paths/__init__.py +2 -2
  422. camel/toolkits/open_api_specs/outschool/paths/get_classes.py +2 -2
  423. camel/toolkits/open_api_specs/outschool/paths/search_teachers.py +2 -2
  424. camel/toolkits/open_api_specs/security_config.py +2 -2
  425. camel/toolkits/open_api_specs/speak/__init__.py +2 -2
  426. camel/toolkits/open_api_specs/web_scraper/__init__.py +2 -2
  427. camel/toolkits/open_api_specs/web_scraper/ai-plugin.json +1 -1
  428. camel/toolkits/open_api_specs/web_scraper/paths/__init__.py +2 -2
  429. camel/toolkits/open_api_specs/web_scraper/paths/scraper.py +2 -2
  430. camel/toolkits/open_api_toolkit.py +2 -2
  431. camel/toolkits/openbb_toolkit.py +7 -3
  432. camel/toolkits/origene_mcp_toolkit.py +56 -0
  433. camel/toolkits/page_script.js +86 -74
  434. camel/toolkits/playwright_mcp_toolkit.py +27 -32
  435. camel/toolkits/pptx_toolkit.py +790 -0
  436. camel/toolkits/pubmed_toolkit.py +2 -2
  437. camel/toolkits/pulse_mcp_search_toolkit.py +2 -2
  438. camel/toolkits/pyautogui_toolkit.py +2 -2
  439. camel/toolkits/reddit_toolkit.py +2 -2
  440. camel/toolkits/resend_toolkit.py +168 -0
  441. camel/toolkits/retrieval_toolkit.py +2 -2
  442. camel/toolkits/screenshot_toolkit.py +213 -0
  443. camel/toolkits/search_toolkit.py +539 -146
  444. camel/toolkits/searxng_toolkit.py +2 -2
  445. camel/toolkits/semantic_scholar_toolkit.py +2 -2
  446. camel/toolkits/slack_toolkit.py +108 -58
  447. camel/toolkits/sql_toolkit.py +712 -0
  448. camel/toolkits/stripe_toolkit.py +2 -2
  449. camel/toolkits/sympy_toolkit.py +3 -3
  450. camel/toolkits/task_planning_toolkit.py +134 -0
  451. camel/toolkits/terminal_toolkit/__init__.py +18 -0
  452. camel/toolkits/terminal_toolkit/terminal_toolkit.py +1070 -0
  453. camel/toolkits/terminal_toolkit/utils.py +532 -0
  454. camel/toolkits/thinking_toolkit.py +3 -3
  455. camel/toolkits/twitter_toolkit.py +8 -3
  456. camel/toolkits/vertex_ai_veo_toolkit.py +590 -0
  457. camel/toolkits/video_analysis_toolkit.py +112 -29
  458. camel/toolkits/video_download_toolkit.py +22 -16
  459. camel/toolkits/weather_toolkit.py +2 -2
  460. camel/toolkits/web_deploy_toolkit.py +1219 -0
  461. camel/toolkits/wechat_official_toolkit.py +483 -0
  462. camel/toolkits/whatsapp_toolkit.py +2 -2
  463. camel/toolkits/wolfram_alpha_toolkit.py +53 -25
  464. camel/toolkits/zapier_toolkit.py +7 -3
  465. camel/types/__init__.py +4 -4
  466. camel/types/agents/__init__.py +2 -2
  467. camel/types/agents/tool_calling_record.py +6 -3
  468. camel/types/enums.py +454 -35
  469. camel/types/mcp_registries.py +2 -2
  470. camel/types/openai_types.py +4 -4
  471. camel/types/unified_model_type.py +43 -6
  472. camel/utils/__init__.py +20 -2
  473. camel/utils/async_func.py +2 -2
  474. camel/utils/chunker/__init__.py +2 -2
  475. camel/utils/chunker/base.py +2 -2
  476. camel/utils/chunker/code_chunker.py +2 -2
  477. camel/utils/chunker/uio_chunker.py +2 -2
  478. camel/utils/commons.py +65 -7
  479. camel/utils/constants.py +5 -2
  480. camel/utils/context_utils.py +1134 -0
  481. camel/utils/deduplication.py +2 -2
  482. camel/utils/filename.py +2 -2
  483. camel/utils/langfuse.py +258 -0
  484. camel/utils/mcp.py +140 -6
  485. camel/utils/mcp_client.py +1056 -0
  486. camel/utils/message_summarizer.py +148 -0
  487. camel/utils/response_format.py +2 -2
  488. camel/utils/token_counting.py +45 -22
  489. camel/utils/tool_result.py +44 -0
  490. camel/verifiers/__init__.py +2 -2
  491. camel/verifiers/base.py +2 -2
  492. camel/verifiers/math_verifier.py +2 -2
  493. camel/verifiers/models.py +2 -2
  494. camel/verifiers/physics_verifier.py +2 -2
  495. camel/verifiers/python_verifier.py +2 -2
  496. {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/METADATA +349 -108
  497. camel_ai-0.2.82.dist-info/RECORD +507 -0
  498. {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/WHEEL +1 -1
  499. {camel_ai-0.2.59.dist-info → camel_ai-0.2.82.dist-info}/licenses/LICENSE +1 -1
  500. camel/loaders/pandas_reader.py +0 -368
  501. camel/runtime/api.py +0 -97
  502. camel/toolkits/dalle_toolkit.py +0 -171
  503. camel/toolkits/file_write_toolkit.py +0 -395
  504. camel/toolkits/openai_agent_toolkit.py +0 -135
  505. camel/toolkits/terminal_toolkit.py +0 -1037
  506. camel_ai-0.2.59.dist-info/RECORD +0 -410
@@ -1,4 +1,4 @@
1
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
1
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
2
2
  # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
@@ -10,27 +10,33 @@
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
13
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
  import json
15
- from typing import ClassVar, Dict, Optional, Type, Union
16
-
17
- import yaml
15
+ import os
16
+ from typing import Any, ClassVar, Dict, Optional, Type, Union
18
17
 
18
+ from camel.models.aihubmix_model import AihubMixModel
19
19
  from camel.models.aiml_model import AIMLModel
20
+ from camel.models.amd_model import AMDModel
20
21
  from camel.models.anthropic_model import AnthropicModel
21
22
  from camel.models.aws_bedrock_model import AWSBedrockModel
22
23
  from camel.models.azure_openai_model import AzureOpenAIModel
23
24
  from camel.models.base_model import BaseModelBackend
25
+ from camel.models.cerebras_model import CerebrasModel
24
26
  from camel.models.cohere_model import CohereModel
27
+ from camel.models.cometapi_model import CometAPIModel
28
+ from camel.models.crynux_model import CrynuxModel
25
29
  from camel.models.deepseek_model import DeepSeekModel
26
30
  from camel.models.gemini_model import GeminiModel
27
31
  from camel.models.groq_model import GroqModel
28
32
  from camel.models.internlm_model import InternLMModel
29
33
  from camel.models.litellm_model import LiteLLMModel
30
34
  from camel.models.lmstudio_model import LMStudioModel
35
+ from camel.models.minimax_model import MinimaxModel
31
36
  from camel.models.mistral_model import MistralModel
32
37
  from camel.models.modelscope_model import ModelScopeModel
33
38
  from camel.models.moonshot_model import MoonshotModel
39
+ from camel.models.nebius_model import NebiusModel
34
40
  from camel.models.netmind_model import NetmindModel
35
41
  from camel.models.novita_model import NovitaModel
36
42
  from camel.models.nvidia_model import NvidiaModel
@@ -39,6 +45,7 @@ from camel.models.openai_compatible_model import OpenAICompatibleModel
39
45
  from camel.models.openai_model import OpenAIModel
40
46
  from camel.models.openrouter_model import OpenRouterModel
41
47
  from camel.models.ppio_model import PPIOModel
48
+ from camel.models.qianfan_model import QianfanModel
42
49
  from camel.models.qwen_model import QwenModel
43
50
  from camel.models.reka_model import RekaModel
44
51
  from camel.models.samba_model import SambaModel
@@ -52,7 +59,7 @@ from camel.models.watsonx_model import WatsonXModel
52
59
  from camel.models.yi_model import YiModel
53
60
  from camel.models.zhipuai_model import ZhipuAIModel
54
61
  from camel.types import ModelPlatformType, ModelType, UnifiedModelType
55
- from camel.utils import BaseTokenCounter
62
+ from camel.utils import BaseTokenCounter, configure_langfuse
56
63
 
57
64
 
58
65
  class ModelFactory:
@@ -75,6 +82,7 @@ class ModelFactory:
75
82
  ModelPlatformType.AWS_BEDROCK: AWSBedrockModel,
76
83
  ModelPlatformType.NVIDIA: NvidiaModel,
77
84
  ModelPlatformType.SILICONFLOW: SiliconFlowModel,
85
+ ModelPlatformType.AMD: AMDModel,
78
86
  ModelPlatformType.AIML: AIMLModel,
79
87
  ModelPlatformType.VOLCANO: VolcanoModel,
80
88
  ModelPlatformType.NETMIND: NetmindModel,
@@ -82,7 +90,11 @@ class ModelFactory:
82
90
  ModelPlatformType.AZURE: AzureOpenAIModel,
83
91
  ModelPlatformType.ANTHROPIC: AnthropicModel,
84
92
  ModelPlatformType.GROQ: GroqModel,
93
+ ModelPlatformType.CEREBRAS: CerebrasModel,
94
+ ModelPlatformType.COMETAPI: CometAPIModel,
95
+ ModelPlatformType.NEBIUS: NebiusModel,
85
96
  ModelPlatformType.LMSTUDIO: LMStudioModel,
97
+ ModelPlatformType.MINIMAX: MinimaxModel,
86
98
  ModelPlatformType.OPENROUTER: OpenRouterModel,
87
99
  ModelPlatformType.ZHIPU: ZhipuAIModel,
88
100
  ModelPlatformType.GEMINI: GeminiModel,
@@ -98,6 +110,9 @@ class ModelFactory:
98
110
  ModelPlatformType.MODELSCOPE: ModelScopeModel,
99
111
  ModelPlatformType.NOVITA: NovitaModel,
100
112
  ModelPlatformType.WATSONX: WatsonXModel,
113
+ ModelPlatformType.QIANFAN: QianfanModel,
114
+ ModelPlatformType.CRYNUX: CrynuxModel,
115
+ ModelPlatformType.AIHUBMIX: AihubMixModel,
101
116
  }
102
117
 
103
118
  @staticmethod
@@ -109,6 +124,9 @@ class ModelFactory:
109
124
  api_key: Optional[str] = None,
110
125
  url: Optional[str] = None,
111
126
  timeout: Optional[float] = None,
127
+ max_retries: int = 3,
128
+ client: Optional[Any] = None,
129
+ async_client: Optional[Any] = None,
112
130
  **kwargs,
113
131
  ) -> BaseModelBackend:
114
132
  r"""Creates an instance of `BaseModelBackend` of the specified type.
@@ -133,6 +151,16 @@ class ModelFactory:
133
151
  (default: :obj:`None`)
134
152
  timeout (Optional[float], optional): The timeout value in seconds
135
153
  for API calls. (default: :obj:`None`)
154
+ max_retries (int, optional): Maximum number of retries
155
+ for API calls. (default: :obj:`3`)
156
+ client (Optional[Any], optional): A custom synchronous client
157
+ instance. Supported by models that use OpenAI-compatible APIs
158
+ . The client should implement the appropriate client interface
159
+ for the platform. (default: :obj:`None`)
160
+ async_client (Optional[Any], optional): A custom asynchronous
161
+ client instance. Supported by models that use OpenAI-compatible
162
+ APIs. The client should implement the appropriate async client
163
+ interface for the platform. (default: :obj:`None`)
136
164
  **kwargs: Additional model-specific parameters that will be passed
137
165
  to the model constructor. For example, Azure OpenAI models may
138
166
  require `api_version`, `azure_deployment_name`,
@@ -144,6 +172,12 @@ class ModelFactory:
144
172
  Raises:
145
173
  ValueError: If there is no backend for the model.
146
174
  """
175
+
176
+ # Auto-configure Langfuse only if explicitly enabled
177
+ env_enabled_str = os.environ.get("LANGFUSE_ENABLED")
178
+ if env_enabled_str and env_enabled_str.lower() == "true":
179
+ configure_langfuse()
180
+
147
181
  # Convert string to ModelPlatformType enum if needed
148
182
  if isinstance(model_platform, str):
149
183
  try:
@@ -172,6 +206,12 @@ class ModelFactory:
172
206
  if model_class is None:
173
207
  raise ValueError(f"Unknown model platform `{model_platform}`")
174
208
 
209
+ # Pass client and async_client via kwargs if provided
210
+ if client is not None:
211
+ kwargs['client'] = client
212
+ if async_client is not None:
213
+ kwargs['async_client'] = async_client
214
+
175
215
  return model_class(
176
216
  model_type=model_type,
177
217
  model_config_dict=model_config_dict,
@@ -179,6 +219,7 @@ class ModelFactory:
179
219
  url=url,
180
220
  token_counter=token_counter,
181
221
  timeout=timeout,
222
+ max_retries=max_retries,
182
223
  **kwargs,
183
224
  )
184
225
 
@@ -221,6 +262,8 @@ class ModelFactory:
221
262
 
222
263
  @classmethod
223
264
  def __load_yaml(cls, filepath: str) -> Dict:
265
+ import yaml
266
+
224
267
  r"""Loads and parses a YAML file into a dictionary.
225
268
 
226
269
  Args:
@@ -1,4 +1,4 @@
1
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
1
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
2
2
  # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
@@ -10,8 +10,9 @@
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
13
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
 
15
+ import asyncio
15
16
  import logging
16
17
  from itertools import cycle
17
18
  from random import choice
@@ -26,6 +27,10 @@ from typing import (
26
27
  )
27
28
 
28
29
  from openai import AsyncStream, Stream
30
+ from openai.lib.streaming.chat import (
31
+ AsyncChatCompletionStreamManager,
32
+ ChatCompletionStreamManager,
33
+ )
29
34
  from pydantic import BaseModel
30
35
 
31
36
  from camel.messages import OpenAIMessage
@@ -69,6 +74,7 @@ class ModelManager:
69
74
  self.models = [models]
70
75
  self.models_cycle = cycle(self.models)
71
76
  self.current_model = self.models[0]
77
+ self.lock = asyncio.Lock()
72
78
 
73
79
  # Set the scheduling strategy; default is round-robin
74
80
  try:
@@ -194,7 +200,11 @@ class ModelManager:
194
200
  messages: List[OpenAIMessage],
195
201
  response_format: Optional[Type[BaseModel]] = None,
196
202
  tools: Optional[List[Dict[str, Any]]] = None,
197
- ) -> Union[ChatCompletion, Stream[ChatCompletionChunk]]:
203
+ ) -> Union[
204
+ ChatCompletion,
205
+ Stream[ChatCompletionChunk],
206
+ ChatCompletionStreamManager[BaseModel],
207
+ ]:
198
208
  r"""Process a list of messages by selecting a model based on
199
209
  the scheduling strategy.
200
210
  Sends the entire list of messages to the selected model,
@@ -205,9 +215,12 @@ class ModelManager:
205
215
  history in OpenAI API format.
206
216
 
207
217
  Returns:
208
- Union[ChatCompletion, Stream[ChatCompletionChunk]]:
218
+ Union[ChatCompletion, Stream[ChatCompletionChunk],
219
+ ChatCompletionStreamManager[BaseModel]]:
209
220
  `ChatCompletion` in the non-stream mode, or
210
- `Stream[ChatCompletionChunk]` in the stream mode.
221
+ `Stream[ChatCompletionChunk]` in the stream mode, or
222
+ `ChatCompletionStreamManager[BaseModel]` for
223
+ structured-output stream.
211
224
  """
212
225
  self.current_model = self.scheduling_strategy()
213
226
 
@@ -231,7 +244,11 @@ class ModelManager:
231
244
  messages: List[OpenAIMessage],
232
245
  response_format: Optional[Type[BaseModel]] = None,
233
246
  tools: Optional[List[Dict[str, Any]]] = None,
234
- ) -> Union[ChatCompletion, AsyncStream[ChatCompletionChunk]]:
247
+ ) -> Union[
248
+ ChatCompletion,
249
+ AsyncStream[ChatCompletionChunk],
250
+ AsyncChatCompletionStreamManager[BaseModel],
251
+ ]:
235
252
  r"""Process a list of messages by selecting a model based on
236
253
  the scheduling strategy.
237
254
  Sends the entire list of messages to the selected model,
@@ -242,11 +259,15 @@ class ModelManager:
242
259
  history in OpenAI API format.
243
260
 
244
261
  Returns:
245
- Union[ChatCompletion, AsyncStream[ChatCompletionChunk]]:
262
+ Union[ChatCompletion, AsyncStream[ChatCompletionChunk],
263
+ AsyncChatCompletionStreamManager[BaseModel]]:
246
264
  `ChatCompletion` in the non-stream mode, or
247
- `AsyncStream[ChatCompletionChunk]` in the stream mode.
265
+ `AsyncStream[ChatCompletionChunk]` in the stream mode, or
266
+ `AsyncChatCompletionStreamManager[BaseModel]` for
267
+ structured-output stream.
248
268
  """
249
- self.current_model = self.scheduling_strategy()
269
+ async with self.lock:
270
+ self.current_model = self.scheduling_strategy()
250
271
 
251
272
  # Pass all messages to the selected model and get the response
252
273
  try:
@@ -260,7 +281,8 @@ class ModelManager:
260
281
  logger.warning(
261
282
  "The scheduling strategy has been changed to 'round_robin'"
262
283
  )
263
- # Skip already used one
264
- self.current_model = self.scheduling_strategy()
284
+ async with self.lock:
285
+ # Skip already used one
286
+ self.current_model = self.scheduling_strategy()
265
287
  raise exc
266
288
  return response
@@ -1,4 +1,4 @@
1
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
1
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
2
2
  # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
@@ -10,22 +10,14 @@
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
13
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
 
15
15
  import os
16
- import time
17
- from typing import Any, Dict, List, Optional, Union
16
+ from typing import Any, Dict, Optional, Union
18
17
 
19
- from openai import AsyncStream, Stream
20
-
21
- from camel.configs import MODELSCOPE_API_PARAMS, ModelScopeConfig
22
- from camel.messages import OpenAIMessage
18
+ from camel.configs import ModelScopeConfig
23
19
  from camel.models.openai_compatible_model import OpenAICompatibleModel
24
- from camel.types import (
25
- ChatCompletion,
26
- ChatCompletionChunk,
27
- ModelType,
28
- )
20
+ from camel.types import ModelType
29
21
  from camel.utils import (
30
22
  BaseTokenCounter,
31
23
  api_keys_required,
@@ -56,6 +48,10 @@ class ModelScopeModel(OpenAICompatibleModel):
56
48
  API calls. If not provided, will fall back to the MODEL_TIMEOUT
57
49
  environment variable or default to 180 seconds.
58
50
  (default: :obj:`None`)
51
+ max_retries (int, optional): Maximum number of retries for API calls.
52
+ (default: :obj:`3`)
53
+ **kwargs (Any): Additional arguments to pass to the client
54
+ initialization.
59
55
  """
60
56
 
61
57
  @api_keys_required(
@@ -71,6 +67,8 @@ class ModelScopeModel(OpenAICompatibleModel):
71
67
  url: Optional[str] = None,
72
68
  token_counter: Optional[BaseTokenCounter] = None,
73
69
  timeout: Optional[float] = None,
70
+ max_retries: int = 3,
71
+ **kwargs: Any,
74
72
  ) -> None:
75
73
  if model_config_dict is None:
76
74
  model_config_dict = ModelScopeConfig().as_dict()
@@ -87,184 +85,6 @@ class ModelScopeModel(OpenAICompatibleModel):
87
85
  url=url,
88
86
  token_counter=token_counter,
89
87
  timeout=timeout,
88
+ max_retries=max_retries,
89
+ **kwargs,
90
90
  )
91
-
92
- def _post_handle_response(
93
- self, response: Union[ChatCompletion, Stream[ChatCompletionChunk]]
94
- ) -> ChatCompletion:
95
- r"""Handle reasoning content with <think> tags at the beginning."""
96
- if not isinstance(response, Stream):
97
- # Handle non-streaming response (existing logic)
98
- if self.model_config_dict.get("extra_body", {}).get(
99
- "enable_thinking", False
100
- ):
101
- reasoning_content = response.choices[
102
- 0
103
- ].message.reasoning_content # type: ignore[attr-defined]
104
- combined_content = (
105
- f"<think>\n{reasoning_content}\n</think>\n"
106
- if reasoning_content
107
- else ""
108
- )
109
- response_content = response.choices[0].message.content or ""
110
- combined_content += response_content
111
-
112
- # Construct a new ChatCompletion with combined content
113
- return ChatCompletion.construct(
114
- id=response.id,
115
- choices=[
116
- dict(
117
- finish_reason=response.choices[0].finish_reason,
118
- index=response.choices[0].index,
119
- logprobs=response.choices[0].logprobs,
120
- message=dict(
121
- role=response.choices[0].message.role,
122
- content=combined_content,
123
- ),
124
- )
125
- ],
126
- created=response.created,
127
- model=response.model,
128
- object="chat.completion",
129
- system_fingerprint=response.system_fingerprint,
130
- usage=response.usage,
131
- )
132
- else:
133
- return response # Return original if no thinking enabled
134
-
135
- # Handle streaming response
136
- accumulated_reasoning = ""
137
- accumulated_content = ""
138
- final_chunk = None
139
- usage_data = None # Initialize usage data
140
- role = "assistant" # Default role
141
-
142
- for chunk in response:
143
- final_chunk = chunk # Keep track of the last chunk for metadata
144
- if chunk.choices:
145
- delta = chunk.choices[0].delta
146
- if delta.role:
147
- role = delta.role # Update role if provided
148
- if (
149
- hasattr(delta, 'reasoning_content')
150
- and delta.reasoning_content
151
- ):
152
- accumulated_reasoning += delta.reasoning_content
153
- if delta.content:
154
- accumulated_content += delta.content
155
-
156
- if hasattr(chunk, 'usage') and chunk.usage:
157
- usage_data = chunk.usage
158
-
159
- combined_content = (
160
- f"<think>\n{accumulated_reasoning}\n</think>\n"
161
- if accumulated_reasoning
162
- else ""
163
- ) + accumulated_content
164
-
165
- # Construct the final ChatCompletion object from accumulated
166
- # stream data
167
- if final_chunk:
168
- finish_reason = "stop" # Default finish reason
169
- logprobs = None
170
- if final_chunk.choices:
171
- finish_reason = (
172
- final_chunk.choices[0].finish_reason or finish_reason
173
- )
174
- if hasattr(final_chunk.choices[0], 'logprobs'):
175
- logprobs = final_chunk.choices[0].logprobs
176
-
177
- return ChatCompletion.construct(
178
- # Use data from the final chunk or defaults
179
- id=final_chunk.id
180
- if hasattr(final_chunk, 'id')
181
- else "streamed-completion",
182
- choices=[
183
- dict(
184
- finish_reason=finish_reason,
185
- index=0,
186
- logprobs=logprobs,
187
- message=dict(
188
- role=role,
189
- content=combined_content,
190
- ),
191
- )
192
- ],
193
- created=final_chunk.created
194
- if hasattr(final_chunk, 'created')
195
- else int(time.time()),
196
- model=final_chunk.model
197
- if hasattr(final_chunk, 'model')
198
- else self.model_type,
199
- object="chat.completion",
200
- system_fingerprint=final_chunk.system_fingerprint
201
- if hasattr(final_chunk, 'system_fingerprint')
202
- else None,
203
- usage=usage_data,
204
- )
205
- else:
206
- # Handle cases where the stream was empty or invalid
207
- return ChatCompletion.construct(
208
- id="empty-stream",
209
- choices=[
210
- dict(
211
- finish_reason="error",
212
- index=0,
213
- message=dict(role="assistant", content=""),
214
- )
215
- ],
216
- created=int(time.time()),
217
- model=self.model_type,
218
- object="chat.completion",
219
- usage=usage_data,
220
- )
221
-
222
- def _request_chat_completion(
223
- self,
224
- messages: List[OpenAIMessage],
225
- tools: Optional[List[Dict[str, Any]]] = None,
226
- ) -> Union[ChatCompletion, Stream[ChatCompletionChunk]]:
227
- request_config = self.model_config_dict.copy()
228
-
229
- if tools:
230
- request_config["tools"] = tools
231
-
232
- return self._post_handle_response(
233
- self._client.chat.completions.create(
234
- messages=messages,
235
- model=self.model_type,
236
- **request_config,
237
- )
238
- )
239
-
240
- async def _arequest_chat_completion(
241
- self,
242
- messages: List[OpenAIMessage],
243
- tools: Optional[List[Dict[str, Any]]] = None,
244
- ) -> Union[ChatCompletion, AsyncStream[ChatCompletionChunk]]:
245
- request_config = self.model_config_dict.copy()
246
-
247
- if tools:
248
- request_config["tools"] = tools
249
-
250
- response = await self._async_client.chat.completions.create(
251
- messages=messages,
252
- model=self.model_type,
253
- **request_config,
254
- )
255
- return self._post_handle_response(response)
256
-
257
- def check_model_config(self):
258
- r"""Check whether the model configuration contains any
259
- unexpected arguments to ModelScope API.
260
-
261
- Raises:
262
- ValueError: If the model configuration dictionary contains any
263
- unexpected arguments to ModelScope API.
264
- """
265
- for param in self.model_config_dict:
266
- if param not in MODELSCOPE_API_PARAMS:
267
- raise ValueError(
268
- f"Unexpected argument `{param}` is "
269
- "input into ModelScope model backend."
270
- )