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,12 +10,15 @@
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 ast
15
+ import asyncio
16
+ import functools
15
17
  import inspect
16
18
  import logging
17
19
  import textwrap
18
20
  import warnings
21
+ from concurrent.futures import ThreadPoolExecutor
19
22
  from inspect import Parameter, getsource, signature
20
23
  from typing import Any, Callable, Dict, Mapping, Optional, Tuple, Type
21
24
 
@@ -31,6 +34,9 @@ from camel.utils import get_pydantic_object_schema, to_pascal
31
34
 
32
35
  logger = logging.getLogger(__name__)
33
36
 
37
+ # Shared thread pool for running sync tools without blocking the event loop
38
+ _SYNC_TOOL_EXECUTOR = ThreadPoolExecutor(max_workers=64)
39
+
34
40
 
35
41
  def _remove_a_key(d: Dict, remove_key: Any) -> None:
36
42
  r"""Remove a key from a dictionary recursively."""
@@ -156,7 +162,12 @@ def get_openai_tool_schema(func: Callable) -> Dict[str, Any]:
156
162
  if (name := param.arg_name) in parameters_dict["properties"] and (
157
163
  description := param.description
158
164
  ):
159
- parameters_dict["properties"][name]["description"] = description
165
+ # OpenAI does not allow descriptions on properties that use $ref.
166
+ # To avoid schema errors, we only add the description if "$ref" is
167
+ # not present.
168
+ prop = parameters_dict["properties"][name]
169
+ if "$ref" not in prop:
170
+ prop["description"] = description
160
171
 
161
172
  short_description = docstring.short_description or ""
162
173
  long_description = docstring.long_description or ""
@@ -190,7 +201,9 @@ def sanitize_and_enforce_required(parameters_dict):
190
201
  r"""Cleans and updates the function schema to conform with OpenAI's
191
202
  requirements:
192
203
  - Removes invalid 'default' fields from the parameters schema.
193
- - Ensures all fields or function parameters are marked as required.
204
+ - Ensures all fields are marked as required or have null type for optional
205
+ fields.
206
+ - Recursively adds additionalProperties: false to all nested objects.
194
207
 
195
208
  Args:
196
209
  parameters_dict (dict): The dictionary representing the function
@@ -198,8 +211,38 @@ def sanitize_and_enforce_required(parameters_dict):
198
211
 
199
212
  Returns:
200
213
  dict: The updated dictionary with invalid defaults removed and all
201
- fields set as required.
214
+ fields properly configured for strict mode.
202
215
  """
216
+
217
+ def _add_additional_properties_false(obj):
218
+ r"""Recursively add additionalProperties: false to all objects."""
219
+ if isinstance(obj, dict):
220
+ if (
221
+ obj.get("type") == "object"
222
+ and "additionalProperties" not in obj
223
+ ):
224
+ obj["additionalProperties"] = False
225
+
226
+ # Process nested structures
227
+ for key, value in obj.items():
228
+ if key == "properties" and isinstance(value, dict):
229
+ for prop_value in value.values():
230
+ _add_additional_properties_false(prop_value)
231
+ elif key in [
232
+ "items",
233
+ "allOf",
234
+ "oneOf",
235
+ "anyOf",
236
+ ] and isinstance(value, (dict, list)):
237
+ if isinstance(value, dict):
238
+ _add_additional_properties_false(value)
239
+ elif isinstance(value, list):
240
+ for item in value:
241
+ _add_additional_properties_false(item)
242
+ elif key == "$defs" and isinstance(value, dict):
243
+ for def_value in value.values():
244
+ _add_additional_properties_false(def_value)
245
+
203
246
  # Check if 'function' and 'parameters' exist
204
247
  if (
205
248
  'function' in parameters_dict
@@ -209,12 +252,65 @@ def sanitize_and_enforce_required(parameters_dict):
209
252
  parameters = parameters_dict['function']['parameters']
210
253
  properties = parameters.get('properties', {})
211
254
 
212
- # Remove 'default' key from each property
213
- for field in properties.values():
214
- field.pop('default', None)
255
+ # Track which fields should be required vs optional
256
+ required_fields = []
257
+
258
+ # Process each property
259
+ for field_name, field_schema in properties.items():
260
+ # Check if this field had a default value (making it optional)
261
+ had_default = 'default' in field_schema
262
+
263
+ # Remove 'default' key from field schema as required by OpenAI
264
+ field_schema.pop('default', None)
265
+
266
+ if had_default:
267
+ # This field is optional - add null to its type
268
+ current_type = field_schema.get('type')
269
+ has_ref = '$ref' in field_schema
270
+ has_any_of = 'anyOf' in field_schema
271
+
272
+ if has_ref:
273
+ # Fields with $ref shouldn't have additional type field
274
+ # The $ref itself defines the type structure
275
+ pass
276
+ elif has_any_of:
277
+ # Field already has anyOf
278
+ any_of_types = field_schema['anyOf']
279
+ has_null_type = any(
280
+ item.get('type') == 'null' for item in any_of_types
281
+ )
282
+ if not has_null_type:
283
+ # Add null type to anyOf
284
+ field_schema['anyOf'].append({'type': 'null'})
285
+ # Remove conflicting type field if it exists
286
+ if 'type' in field_schema:
287
+ del field_schema['type']
288
+ elif current_type:
289
+ if isinstance(current_type, str):
290
+ # Single type - convert to array with null
291
+ field_schema['type'] = [current_type, 'null']
292
+ elif (
293
+ isinstance(current_type, list)
294
+ and 'null' not in current_type
295
+ ):
296
+ # Array of types - add null if not present
297
+ field_schema['type'] = [*current_type, 'null']
298
+ else:
299
+ # No type specified, add null type
300
+ field_schema['type'] = ['null']
301
+
302
+ # Optional fields are still marked as required in strict mode
303
+ # but with null type to indicate they can be omitted
304
+ required_fields.append(field_name)
305
+ else:
306
+ # This field is required
307
+ required_fields.append(field_name)
308
+
309
+ # Set all fields as required (strict mode requirement)
310
+ parameters['required'] = required_fields
215
311
 
216
- # Mark all keys in 'properties' as required
217
- parameters['required'] = list(properties.keys())
312
+ # Recursively add additionalProperties: false to all objects
313
+ _add_additional_properties_false(parameters)
218
314
 
219
315
  return parameters_dict
220
316
 
@@ -392,10 +488,15 @@ class FunctionTool:
392
488
  result = self.func(*args, **kwargs)
393
489
  return result
394
490
  except Exception as e:
491
+ parts = []
492
+ if args:
493
+ parts.append(f"args={args}")
494
+ if kwargs:
495
+ parts.append(f"kwargs={kwargs}")
496
+ args_str = ", ".join(parts) if parts else "no arguments"
395
497
  raise ValueError(
396
498
  f"Execution of function {self.func.__name__} failed with "
397
- f"arguments {args} and {kwargs}. "
398
- f"Error: {e}"
499
+ f"{args_str}. Error: {e}"
399
500
  )
400
501
 
401
502
  async def async_call(self, *args: Any, **kwargs: Any) -> Any:
@@ -405,7 +506,13 @@ class FunctionTool:
405
506
  if self.is_async:
406
507
  return await self.func(*args, **kwargs)
407
508
  else:
408
- return self.func(*args, **kwargs)
509
+ # Run sync function in executor to avoid blocking event loop
510
+ # Use functools.partial to properly capture args/kwargs
511
+ loop = asyncio.get_running_loop()
512
+ return await loop.run_in_executor(
513
+ _SYNC_TOOL_EXECUTOR,
514
+ functools.partial(self.func, *args, **kwargs),
515
+ )
409
516
 
410
517
  @property
411
518
  def is_async(self) -> bool:
@@ -437,8 +544,8 @@ class FunctionTool:
437
544
 
438
545
  # Check the function description, if no description then raise warming
439
546
  if not openai_tool_schema["function"].get("description"):
440
- warnings.warn(f"""Function description is missing for
441
- {openai_tool_schema['function']['name']}. This may
547
+ warnings.warn(f"""Function description is missing for
548
+ {openai_tool_schema['function']['name']}. This may
442
549
  affect the quality of tool calling.""")
443
550
 
444
551
  # Validate whether parameters
@@ -459,9 +566,10 @@ class FunctionTool:
459
566
  param_dict = properties[param_name]
460
567
  if "description" not in param_dict:
461
568
  warnings.warn(
462
- f"Parameter description is missing "
463
- f"for {param_dict}. This may affect the "
464
- f"quality of tool calling."
569
+ f"Parameter description is missing for the "
570
+ f"function '{openai_tool_schema['function']['name']}'. "
571
+ f"The parameter definition is {param_dict}. "
572
+ f"This may affect the quality of tool calling."
465
573
  )
466
574
 
467
575
  def get_openai_tool_schema(self) -> Dict[str, Any]:
@@ -547,7 +655,7 @@ class FunctionTool:
547
655
  """
548
656
  self.openai_tool_schema["function"]["description"] = description
549
657
 
550
- def get_paramter_description(self, param_name: str) -> str:
658
+ def get_parameter_description(self, param_name: str) -> str:
551
659
  r"""Gets the description of a specific parameter from the function
552
660
  schema.
553
661
 
@@ -563,7 +671,7 @@ class FunctionTool:
563
671
  param_name
564
672
  ]["description"]
565
673
 
566
- def set_paramter_description(
674
+ def set_parameter_description(
567
675
  self,
568
676
  param_name: str,
569
677
  description: str,
@@ -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,10 +10,11 @@
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
- # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
13
+ # ========= Copyright 2023-2025 @ CAMEL-AI.org. All Rights Reserved. =========
14
14
 
15
15
  import logging
16
16
  import os
17
+ import warnings
17
18
  from typing import Dict, List, Literal, Optional, Union
18
19
 
19
20
  from camel.toolkits import FunctionTool
@@ -32,7 +33,6 @@ class GithubToolkit(BaseToolkit):
32
33
  specific issues, and creating pull requests in a GitHub repository.
33
34
 
34
35
  Args:
35
- repo_name (str): The name of the GitHub repository.
36
36
  access_token (str, optional): The access token to authenticate with
37
37
  GitHub. If not provided, it will be obtained using the
38
38
  `get_github_access_token` method.
@@ -41,7 +41,6 @@ class GithubToolkit(BaseToolkit):
41
41
  @dependencies_required('github')
42
42
  def __init__(
43
43
  self,
44
- repo_name: str,
45
44
  access_token: Optional[str] = None,
46
45
  timeout: Optional[float] = None,
47
46
  ) -> None:
@@ -61,7 +60,6 @@ class GithubToolkit(BaseToolkit):
61
60
  access_token = self.get_github_access_token()
62
61
 
63
62
  self.github = Github(auth=Token(access_token))
64
- self.repo = self.github.get_repo(repo_name)
65
63
 
66
64
  def get_github_access_token(self) -> str:
67
65
  r"""Retrieve the GitHub access token from environment variables.
@@ -83,8 +81,9 @@ class GithubToolkit(BaseToolkit):
83
81
  )
84
82
  return GITHUB_ACCESS_TOKEN
85
83
 
86
- def create_pull_request(
84
+ def github_create_pull_request(
87
85
  self,
86
+ repo_name: str,
88
87
  file_path: str,
89
88
  new_content: str,
90
89
  pr_title: str,
@@ -98,6 +97,7 @@ class GithubToolkit(BaseToolkit):
98
97
  description contains information about the issue title and number.
99
98
 
100
99
  Args:
100
+ repo_name (str): The name of the GitHub repository.
101
101
  file_path (str): The path of the file to be updated in the
102
102
  repository.
103
103
  new_content (str): The specified new content of the specified file.
@@ -111,12 +111,13 @@ class GithubToolkit(BaseToolkit):
111
111
  str: A formatted report of whether the pull request was created
112
112
  successfully or not.
113
113
  """
114
- sb = self.repo.get_branch(self.repo.default_branch)
114
+ repo = self.github.get_repo(repo_name)
115
+ default_branch = repo.get_branch(repo.default_branch)
115
116
  from github.GithubException import GithubException
116
117
 
117
118
  try:
118
- self.repo.create_git_ref(
119
- ref=f"refs/heads/{branch_name}", sha=sb.commit.sha
119
+ repo.create_git_ref(
120
+ ref=f"refs/heads/{branch_name}", sha=default_branch.commit.sha
120
121
  )
121
122
  except GithubException as e:
122
123
  if e.message == "Reference already exists":
@@ -128,19 +129,19 @@ class GithubToolkit(BaseToolkit):
128
129
  else:
129
130
  raise
130
131
 
131
- file = self.repo.get_contents(file_path)
132
+ file = repo.get_contents(file_path)
132
133
 
133
134
  from github.ContentFile import ContentFile
134
135
 
135
136
  if isinstance(file, ContentFile):
136
- self.repo.update_file(
137
+ repo.update_file(
137
138
  file.path, body, new_content, file.sha, branch=branch_name
138
139
  )
139
- pr = self.repo.create_pull(
140
+ pr = repo.create_pull(
140
141
  title=pr_title,
141
142
  body=body,
142
143
  head=branch_name,
143
- base=self.repo.default_branch,
144
+ base=repo.default_branch,
144
145
  )
145
146
 
146
147
  if pr is not None:
@@ -150,14 +151,15 @@ class GithubToolkit(BaseToolkit):
150
151
  else:
151
152
  raise ValueError("PRs with multiple files aren't supported yet.")
152
153
 
153
- def get_issue_list(
154
- self, state: Literal["open", "closed", "all"] = "all"
154
+ def github_get_issue_list(
155
+ self, repo_name: str, state: Literal["open", "closed", "all"] = "all"
155
156
  ) -> List[Dict[str, object]]:
156
157
  r"""Retrieves all issues from the GitHub repository.
157
158
 
158
159
  Args:
160
+ repo_name (str): The name of the GitHub repository.
159
161
  state (Literal["open", "closed", "all"]): The state of pull
160
- requests to retrieve. (default: :obj: `all`)
162
+ requests to retrieve. (default: :obj:`all`)
161
163
  Options are:
162
164
  - "open": Retrieve only open pull requests.
163
165
  - "closed": Retrieve only closed pull requests.
@@ -167,37 +169,43 @@ class GithubToolkit(BaseToolkit):
167
169
  List[Dict[str, object]]: A list of dictionaries where each
168
170
  dictionary contains the issue number and title.
169
171
  """
172
+ repo = self.github.get_repo(repo_name)
170
173
  issues_info = []
171
- issues = self.repo.get_issues(state=state)
174
+ issues = repo.get_issues(state=state)
172
175
 
173
176
  for issue in issues:
174
177
  issues_info.append({"number": issue.number, "title": issue.title})
175
178
 
176
179
  return issues_info
177
180
 
178
- def get_issue_content(self, issue_number: int) -> str:
181
+ def github_get_issue_content(
182
+ self, repo_name: str, issue_number: int
183
+ ) -> str:
179
184
  r"""Retrieves the content of a specific issue by its number.
180
185
 
181
186
  Args:
187
+ repo_name (str): The name of the GitHub repository.
182
188
  issue_number (int): The number of the issue to retrieve.
183
189
 
184
190
  Returns:
185
191
  str: issues content details.
186
192
  """
187
193
  try:
188
- issue = self.repo.get_issue(number=issue_number)
194
+ repo = self.github.get_repo(repo_name)
195
+ issue = repo.get_issue(number=issue_number)
189
196
  return issue.body
190
197
  except Exception as e:
191
198
  return f"can't get Issue number {issue_number}: {e!s}"
192
199
 
193
- def get_pull_request_list(
194
- self, state: Literal["open", "closed", "all"] = "all"
200
+ def github_get_pull_request_list(
201
+ self, repo_name: str, state: Literal["open", "closed", "all"] = "all"
195
202
  ) -> List[Dict[str, object]]:
196
203
  r"""Retrieves all pull requests from the GitHub repository.
197
204
 
198
205
  Args:
206
+ repo_name (str): The name of the GitHub repository.
199
207
  state (Literal["open", "closed", "all"]): The state of pull
200
- requests to retrieve. (default: :obj: `all`)
208
+ requests to retrieve. (default: :obj:`all`)
201
209
  Options are:
202
210
  - "open": Retrieve only open pull requests.
203
211
  - "closed": Retrieve only closed pull requests.
@@ -207,18 +215,22 @@ class GithubToolkit(BaseToolkit):
207
215
  list: A list of dictionaries where each dictionary contains the
208
216
  pull request number and title.
209
217
  """
218
+ repo = self.github.get_repo(repo_name)
210
219
  pull_requests_info = []
211
- pull_requests = self.repo.get_pulls(state=state)
220
+ pull_requests = repo.get_pulls(state=state)
212
221
 
213
222
  for pr in pull_requests:
214
223
  pull_requests_info.append({"number": pr.number, "title": pr.title})
215
224
 
216
225
  return pull_requests_info
217
226
 
218
- def get_pull_request_code(self, pr_number: int) -> List[Dict[str, str]]:
227
+ def github_get_pull_request_code(
228
+ self, repo_name: str, pr_number: int
229
+ ) -> List[Dict[str, str]]:
219
230
  r"""Retrieves the code changes of a specific pull request.
220
231
 
221
232
  Args:
233
+ repo_name (str): The name of the GitHub repository.
222
234
  pr_number (int): The number of the pull request to retrieve.
223
235
 
224
236
  Returns:
@@ -226,8 +238,9 @@ class GithubToolkit(BaseToolkit):
226
238
  contains the file name and the corresponding code changes
227
239
  (patch).
228
240
  """
241
+ repo = self.github.get_repo(repo_name)
229
242
  # Retrieve the specific pull request
230
- pr = self.repo.get_pull(number=pr_number)
243
+ pr = repo.get_pull(number=pr_number)
231
244
 
232
245
  # Collect the file changes from the pull request
233
246
  files_changed = []
@@ -243,20 +256,22 @@ class GithubToolkit(BaseToolkit):
243
256
 
244
257
  return files_changed
245
258
 
246
- def get_pull_request_comments(
247
- self, pr_number: int
259
+ def github_get_pull_request_comments(
260
+ self, repo_name: str, pr_number: int
248
261
  ) -> List[Dict[str, str]]:
249
262
  r"""Retrieves the comments from a specific pull request.
250
263
 
251
264
  Args:
265
+ repo_name (str): The name of the GitHub repository.
252
266
  pr_number (int): The number of the pull request to retrieve.
253
267
 
254
268
  Returns:
255
269
  List[Dict[str, str]]: A list of dictionaries where each dictionary
256
270
  contains the user ID and the comment body.
257
271
  """
272
+ repo = self.github.get_repo(repo_name)
258
273
  # Retrieve the specific pull request
259
- pr = self.repo.get_pull(number=pr_number)
274
+ pr = repo.get_pull(number=pr_number)
260
275
 
261
276
  # Collect the comments from the pull request
262
277
  comments = []
@@ -266,13 +281,16 @@ class GithubToolkit(BaseToolkit):
266
281
 
267
282
  return comments
268
283
 
269
- def get_all_file_paths(self, path: str = "") -> List[str]:
284
+ def github_get_all_file_paths(
285
+ self, repo_name: str, path: str = ""
286
+ ) -> List[str]:
270
287
  r"""Recursively retrieves all file paths in the GitHub repository.
271
288
 
272
289
  Args:
290
+ repo_name (str): The name of the GitHub repository.
273
291
  path (str): The repository path to start the traversal from.
274
292
  empty string means starts from the root directory.
275
- (default: :obj: `""`)
293
+ (default: :obj:`""`)
276
294
 
277
295
  Returns:
278
296
  List[str]: A list of file paths within the specified directory
@@ -280,11 +298,13 @@ class GithubToolkit(BaseToolkit):
280
298
  """
281
299
  from github.ContentFile import ContentFile
282
300
 
301
+ repo = self.github.get_repo(repo_name)
302
+
283
303
  files: List[str] = []
284
304
 
285
305
  # Retrieves all contents of the current directory
286
- contents: Union[List[ContentFile], ContentFile] = (
287
- self.repo.get_contents(path)
306
+ contents: Union[List[ContentFile], ContentFile] = repo.get_contents(
307
+ path
288
308
  )
289
309
 
290
310
  if isinstance(contents, ContentFile):
@@ -293,16 +313,19 @@ class GithubToolkit(BaseToolkit):
293
313
  for content in contents:
294
314
  if content.type == "dir":
295
315
  # If it's a directory, recursively retrieve its file paths
296
- files.extend(self.get_all_file_paths(content.path))
316
+ files.extend(self.github_get_all_file_paths(content.path))
297
317
  else:
298
318
  # If it's a file, add its path to the list
299
319
  files.append(content.path)
300
320
  return files
301
321
 
302
- def retrieve_file_content(self, file_path: str) -> str:
322
+ def github_retrieve_file_content(
323
+ self, repo_name: str, file_path: str
324
+ ) -> str:
303
325
  r"""Retrieves the content of a file from the GitHub repository.
304
326
 
305
327
  Args:
328
+ repo_name (str): The name of the GitHub repository.
306
329
  file_path (str): The path of the file to retrieve.
307
330
 
308
331
  Returns:
@@ -310,7 +333,9 @@ class GithubToolkit(BaseToolkit):
310
333
  """
311
334
  from github.ContentFile import ContentFile
312
335
 
313
- file_content = self.repo.get_contents(file_path)
336
+ repo = self.github.get_repo(repo_name)
337
+
338
+ file_content = repo.get_contents(file_path)
314
339
  if isinstance(file_content, ContentFile):
315
340
  return file_content.decoded_content.decode()
316
341
  else:
@@ -325,12 +350,92 @@ class GithubToolkit(BaseToolkit):
325
350
  the functions in the toolkit.
326
351
  """
327
352
  return [
328
- FunctionTool(self.create_pull_request),
329
- FunctionTool(self.get_issue_list),
330
- FunctionTool(self.get_issue_content),
331
- FunctionTool(self.get_pull_request_list),
332
- FunctionTool(self.get_pull_request_code),
333
- FunctionTool(self.get_pull_request_comments),
334
- FunctionTool(self.get_all_file_paths),
335
- FunctionTool(self.retrieve_file_content),
353
+ FunctionTool(self.github_create_pull_request),
354
+ FunctionTool(self.github_get_issue_list),
355
+ FunctionTool(self.github_get_issue_content),
356
+ FunctionTool(self.github_get_pull_request_list),
357
+ FunctionTool(self.github_get_pull_request_code),
358
+ FunctionTool(self.github_get_pull_request_comments),
359
+ FunctionTool(self.github_get_all_file_paths),
360
+ FunctionTool(self.github_retrieve_file_content),
336
361
  ]
362
+
363
+ # Deprecated method aliases for backward compatibility
364
+ def create_pull_request(self, *args, **kwargs):
365
+ r"""Deprecated: Use github_create_pull_request instead."""
366
+ warnings.warn(
367
+ "create_pull_request is deprecated. Use "
368
+ "github_create_pull_request instead.",
369
+ DeprecationWarning,
370
+ stacklevel=2,
371
+ )
372
+ return self.github_create_pull_request(*args, **kwargs)
373
+
374
+ def get_issue_list(self, *args, **kwargs):
375
+ r"""Deprecated: Use github_get_issue_list instead."""
376
+ warnings.warn(
377
+ "get_issue_list is deprecated. Use github_get_issue_list instead.",
378
+ DeprecationWarning,
379
+ stacklevel=2,
380
+ )
381
+ return self.github_get_issue_list(*args, **kwargs)
382
+
383
+ def get_issue_content(self, *args, **kwargs):
384
+ r"""Deprecated: Use github_get_issue_content instead."""
385
+ warnings.warn(
386
+ "get_issue_content is deprecated. Use "
387
+ "github_get_issue_content instead.",
388
+ DeprecationWarning,
389
+ stacklevel=2,
390
+ )
391
+ return self.github_get_issue_content(*args, **kwargs)
392
+
393
+ def get_pull_request_list(self, *args, **kwargs):
394
+ r"""Deprecated: Use github_get_pull_request_list instead."""
395
+ warnings.warn(
396
+ "get_pull_request_list is deprecated. "
397
+ "Use github_get_pull_request_list instead.",
398
+ DeprecationWarning,
399
+ stacklevel=2,
400
+ )
401
+ return self.github_get_pull_request_list(*args, **kwargs)
402
+
403
+ def get_pull_request_code(self, *args, **kwargs):
404
+ r"""Deprecated: Use github_get_pull_request_code instead."""
405
+ warnings.warn(
406
+ "get_pull_request_code is deprecated. Use "
407
+ "github_get_pull_request_code instead.",
408
+ DeprecationWarning,
409
+ stacklevel=2,
410
+ )
411
+ return self.github_get_pull_request_code(*args, **kwargs)
412
+
413
+ def get_pull_request_comments(self, *args, **kwargs):
414
+ r"""Deprecated: Use github_get_pull_request_comments instead."""
415
+ warnings.warn(
416
+ "get_pull_request_comments is deprecated. "
417
+ "Use github_get_pull_request_comments instead.",
418
+ DeprecationWarning,
419
+ stacklevel=2,
420
+ )
421
+ return self.github_get_pull_request_comments(*args, **kwargs)
422
+
423
+ def get_all_file_paths(self, *args, **kwargs):
424
+ r"""Deprecated: Use github_get_all_file_paths instead."""
425
+ warnings.warn(
426
+ "get_all_file_paths is deprecated. Use "
427
+ "github_get_all_file_paths instead.",
428
+ DeprecationWarning,
429
+ stacklevel=2,
430
+ )
431
+ return self.github_get_all_file_paths(*args, **kwargs)
432
+
433
+ def retrieve_file_content(self, *args, **kwargs):
434
+ r"""Deprecated: Use github_retrieve_file_content instead."""
435
+ warnings.warn(
436
+ "retrieve_file_content is deprecated. "
437
+ "Use github_retrieve_file_content instead.",
438
+ DeprecationWarning,
439
+ stacklevel=2,
440
+ )
441
+ return self.github_retrieve_file_content(*args, **kwargs)