scrapegraphai 2.1.2__tar.gz → 2.1.4__tar.gz

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.
Files changed (386) hide show
  1. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/CHANGELOG.md +43 -0
  2. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/PKG-INFO +7 -5
  3. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/README.md +5 -3
  4. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/pyproject.toml +2 -2
  5. scrapegraphai-2.1.4/scrapegraphai/docloaders/__init__.py +30 -0
  6. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/docloaders/chromium.py +9 -2
  7. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/helpers/models_tokens.py +1 -5
  8. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/fetch_node.py +1 -1
  9. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/robots_node.py +1 -1
  10. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/research_web.py +42 -7
  11. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/conftest.py +15 -0
  12. scrapegraphai-2.1.4/tests/test_minimax_models.py +62 -0
  13. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/uv.lock +269 -1449
  14. scrapegraphai-2.1.2/scrapegraphai/docloaders/__init__.py +0 -15
  15. scrapegraphai-2.1.2/tests/test_minimax_models.py +0 -55
  16. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/.gitattributes +0 -0
  17. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/.github/FUNDING.yml +0 -0
  18. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  19. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/.github/ISSUE_TEMPLATE/custom.md +0 -0
  20. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  21. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/.github/workflows/codeql.yml +0 -0
  22. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/.github/workflows/dependency-review.yml +0 -0
  23. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/.github/workflows/release.yml +0 -0
  24. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/.github/workflows/test-suite.yml +0 -0
  25. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/.gitignore +0 -0
  26. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/.pre-commit-config.yaml +0 -0
  27. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/.releaserc.yml +0 -0
  28. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/.semantic-commits-applied +0 -0
  29. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/CODE_OF_CONDUCT.md +0 -0
  30. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/CONTRIBUTING.md +0 -0
  31. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/Dockerfile +0 -0
  32. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/LICENSE +0 -0
  33. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/Makefile +0 -0
  34. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/PullRequests/PR_1027_reviews.md +0 -0
  35. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/SECURITY.md +0 -0
  36. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/SEMANTIC_COMMITS.md +0 -0
  37. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/TESTING_INFRASTRUCTURE.md +0 -0
  38. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/citation.cff +0 -0
  39. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/codebeaver.yml +0 -0
  40. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docker-compose.yml +0 -0
  41. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/assets/api-banner.png +0 -0
  42. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/assets/api_banner.png +0 -0
  43. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/assets/apikey_1.png +0 -0
  44. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/assets/apikey_2.png +0 -0
  45. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/assets/apikey_3.png +0 -0
  46. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/assets/apikey_4.png +0 -0
  47. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/assets/browserbase_logo.png +0 -0
  48. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/assets/codespaces-badge.png +0 -0
  49. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/assets/histogram.png +0 -0
  50. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/assets/omniscrapergraph.png +0 -0
  51. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/assets/omnisearchgraph.png +0 -0
  52. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/assets/project_overview_diagram.fig +0 -0
  53. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/assets/project_overview_diagram.png +0 -0
  54. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/assets/scrapegraphai_logo.png +0 -0
  55. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/assets/scrapegraphai_logo.svg +0 -0
  56. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/assets/scriptcreatorgraph.png +0 -0
  57. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/assets/searchgraph.png +0 -0
  58. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/assets/sgai-hero.png +0 -0
  59. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/assets/smartscrapergraph.png +0 -0
  60. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/assets/speechgraph.png +0 -0
  61. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/chinese.md +0 -0
  62. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/french.md +0 -0
  63. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/german.md +0 -0
  64. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/italian.md +0 -0
  65. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/japanese.md +0 -0
  66. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/korean.md +0 -0
  67. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/portuguese.md +0 -0
  68. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/russian.md +0 -0
  69. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/spanish.md +0 -0
  70. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/timeout_configuration.md +0 -0
  71. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/docs/turkish.md +0 -0
  72. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/ScrapegraphAI_cookbook.ipynb +0 -0
  73. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/code_generator_graph/.env.example +0 -0
  74. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/code_generator_graph/README.md +0 -0
  75. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/code_generator_graph/ollama/code_generator_graph_ollama.py +0 -0
  76. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/code_generator_graph/openai/code_generator_graph_openai.py +0 -0
  77. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/csv_scraper_graph/.env.example +0 -0
  78. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/csv_scraper_graph/README.md +0 -0
  79. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/csv_scraper_graph/ollama/csv_scraper_graph_multi_ollama.py +0 -0
  80. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/csv_scraper_graph/ollama/csv_scraper_ollama.py +0 -0
  81. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/csv_scraper_graph/ollama/inputs/username.csv +0 -0
  82. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/csv_scraper_graph/openai/csv_scraper_graph_multi_openai.py +0 -0
  83. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/csv_scraper_graph/openai/csv_scraper_openai.py +0 -0
  84. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/csv_scraper_graph/openai/inputs/username.csv +0 -0
  85. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/custom_graph/.env.example +0 -0
  86. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/custom_graph/README.md +0 -0
  87. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/custom_graph/ollama/custom_graph_ollama.py +0 -0
  88. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/custom_graph/openai/custom_graph_openai.py +0 -0
  89. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/depth_search_graph/.env.example +0 -0
  90. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/depth_search_graph/README.md +0 -0
  91. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/depth_search_graph/ollama/depth_search_graph_ollama.py +0 -0
  92. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/depth_search_graph/openai/depth_search_graph_openai.py +0 -0
  93. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/document_scraper_graph/.env.example +0 -0
  94. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/document_scraper_graph/README.md +0 -0
  95. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/document_scraper_graph/ollama/document_scraper_ollama.py +0 -0
  96. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/document_scraper_graph/ollama/inputs/plain_html_example.txt +0 -0
  97. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/document_scraper_graph/openai/document_scraper_openai.py +0 -0
  98. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/document_scraper_graph/openai/inputs/markdown_example.md +0 -0
  99. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/document_scraper_graph/openai/inputs/plain_html_example.txt +0 -0
  100. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/extras/.env.example +0 -0
  101. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/extras/Savedscreenshots/test_image.jpeg +0 -0
  102. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/extras/authenticated_playwright.py +0 -0
  103. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/extras/browser_base_integration.py +0 -0
  104. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/extras/chromium_selenium.py +0 -0
  105. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/extras/cond_smartscraper_usage.py +0 -0
  106. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/extras/conditional_usage.py +0 -0
  107. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/extras/custom_prompt.py +0 -0
  108. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/extras/example.yml +0 -0
  109. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/extras/force_mode.py +0 -0
  110. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/extras/html_mode.py +0 -0
  111. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/extras/load_yml.py +0 -0
  112. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/extras/no_cut.py +0 -0
  113. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/extras/proxy_rotation.py +0 -0
  114. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/extras/rag_caching.py +0 -0
  115. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/extras/reasoning.py +0 -0
  116. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/extras/scrape_do.py +0 -0
  117. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/extras/screenshot_scaping.py +0 -0
  118. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/extras/serch_graph_scehma.py +0 -0
  119. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/extras/slow_mo.py +0 -0
  120. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/extras/undected_playwright.py +0 -0
  121. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/json_scraper_graph/.env.example +0 -0
  122. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/json_scraper_graph/README.md +0 -0
  123. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/json_scraper_graph/ollama/inputs/example.json +0 -0
  124. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/json_scraper_graph/ollama/json_scraper_multi_ollama.py +0 -0
  125. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/json_scraper_graph/ollama/json_scraper_ollama.py +0 -0
  126. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/json_scraper_graph/openai/inputs/example.json +0 -0
  127. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/json_scraper_graph/openai/json_scraper_multi_openai.py +0 -0
  128. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/json_scraper_graph/openai/json_scraper_openai.py +0 -0
  129. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/json_scraper_graph/openai/md_scraper_openai.py +0 -0
  130. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/json_scraper_graph/openai/omni_scraper_openai.py +0 -0
  131. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/markdownify/.env.example +0 -0
  132. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/markdownify/markdownify_scrapegraphai.py +0 -0
  133. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/markdownify/markdownify_scrapegraphai_v3.py +0 -0
  134. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/markdownify/readme.md +0 -0
  135. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/omni_scraper_graph/.env.example +0 -0
  136. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/omni_scraper_graph/README.md +0 -0
  137. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/omni_scraper_graph/omni_search_openai.py +0 -0
  138. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/readme.md +0 -0
  139. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/script_generator_graph/.env.example +0 -0
  140. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/script_generator_graph/README.md +0 -0
  141. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/script_generator_graph/ollama/script_generator_ollama.py +0 -0
  142. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/script_generator_graph/ollama/script_multi_generator_ollama.py +0 -0
  143. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/script_generator_graph/openai/script_generator_multi_openai.py +0 -0
  144. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/script_generator_graph/openai/script_generator_openai.py +0 -0
  145. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/script_generator_graph/openai/script_generator_schema_openai.py +0 -0
  146. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/search_graph/.env.example +0 -0
  147. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/search_graph/README.md +0 -0
  148. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/search_graph/ollama/search_graph_ollama.py +0 -0
  149. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/search_graph/ollama/search_graph_schema_ollama.py +0 -0
  150. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/search_graph/openai/search_graph_openai.py +0 -0
  151. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/search_graph/openai/search_graph_schema_openai.py +0 -0
  152. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/search_graph/openai/search_link_graph_openai.py +0 -0
  153. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/search_graph/scrapegraphai/.env.example +0 -0
  154. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/search_graph/scrapegraphai/readme.md +0 -0
  155. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/search_graph/scrapegraphai/searchscraper_scrapegraphai.py +0 -0
  156. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/search_graph/scrapegraphai/searchscraper_scrapegraphai_v3.py +0 -0
  157. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/smart_scraper_graph/.env.example +0 -0
  158. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/smart_scraper_graph/nvidia/smart_scraper_nvidia.py +0 -0
  159. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/smart_scraper_graph/ollama/smart_scraper_lite_ollama.py +0 -0
  160. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/smart_scraper_graph/ollama/smart_scraper_multi_concat_ollama.py +0 -0
  161. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/smart_scraper_graph/ollama/smart_scraper_multi_lite_ollama.py +0 -0
  162. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/smart_scraper_graph/ollama/smart_scraper_multi_ollama.py +0 -0
  163. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/smart_scraper_graph/ollama/smart_scraper_ollama.py +0 -0
  164. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/smart_scraper_graph/ollama/smart_scraper_schema_ollama.py +0 -0
  165. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/smart_scraper_graph/openai/smart_scraper_lite_openai.py +0 -0
  166. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/smart_scraper_graph/openai/smart_scraper_multi_concat_openai.py +0 -0
  167. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/smart_scraper_graph/openai/smart_scraper_multi_lite_openai.py +0 -0
  168. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/smart_scraper_graph/openai/smart_scraper_multi_openai.py +0 -0
  169. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/smart_scraper_graph/openai/smart_scraper_openai.py +0 -0
  170. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/smart_scraper_graph/openai/smart_scraper_schema_openai.py +0 -0
  171. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/smart_scraper_graph/scrapegraphai/.env.example +0 -0
  172. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/smart_scraper_graph/scrapegraphai/readme.md +0 -0
  173. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/smart_scraper_graph/scrapegraphai/smartscraper_scrapegraphai.py +0 -0
  174. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/smart_scraper_graph/scrapegraphai/smartscraper_scrapegraphai_v3.py +0 -0
  175. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/speech_graph/.env.example +0 -0
  176. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/speech_graph/README.md +0 -0
  177. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/speech_graph/speech_graph_openai.py +0 -0
  178. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/xml_scraper_graph/.env.example +0 -0
  179. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/xml_scraper_graph/README.md +0 -0
  180. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/xml_scraper_graph/ollama/inputs/books.xml +0 -0
  181. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/xml_scraper_graph/ollama/xml_scraper_graph_multi_ollama.py +0 -0
  182. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/xml_scraper_graph/ollama/xml_scraper_ollama.py +0 -0
  183. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/xml_scraper_graph/openai/inputs/books.xml +0 -0
  184. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/xml_scraper_graph/openai/xml_scraper_graph_multi_openai.py +0 -0
  185. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/examples/xml_scraper_graph/openai/xml_scraper_openai.py +0 -0
  186. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/media/banner.png +0 -0
  187. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/pytest.ini +0 -0
  188. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/__init__.py +0 -0
  189. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/builders/__init__.py +0 -0
  190. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/builders/graph_builder.py +0 -0
  191. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/docloaders/browser_base.py +0 -0
  192. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/docloaders/plasmate.py +0 -0
  193. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/docloaders/scrape_do.py +0 -0
  194. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/__init__.py +0 -0
  195. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/abstract_graph.py +0 -0
  196. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/base_graph.py +0 -0
  197. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/code_generator_graph.py +0 -0
  198. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/csv_scraper_graph.py +0 -0
  199. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/csv_scraper_multi_graph.py +0 -0
  200. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/depth_search_graph.py +0 -0
  201. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/document_scraper_graph.py +0 -0
  202. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/document_scraper_multi_graph.py +0 -0
  203. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/json_scraper_graph.py +0 -0
  204. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/json_scraper_multi_graph.py +0 -0
  205. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/markdownify_graph.py +0 -0
  206. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/omni_scraper_graph.py +0 -0
  207. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/omni_search_graph.py +0 -0
  208. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/screenshot_scraper_graph.py +0 -0
  209. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/script_creator_graph.py +0 -0
  210. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/script_creator_multi_graph.py +0 -0
  211. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/search_graph.py +0 -0
  212. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/search_link_graph.py +0 -0
  213. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/smart_scraper_graph.py +0 -0
  214. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/smart_scraper_lite_graph.py +0 -0
  215. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/smart_scraper_multi_batch_graph.py +0 -0
  216. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/smart_scraper_multi_concat_graph.py +0 -0
  217. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/smart_scraper_multi_graph.py +0 -0
  218. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/smart_scraper_multi_lite_graph.py +0 -0
  219. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/speech_graph.py +0 -0
  220. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/xml_scraper_graph.py +0 -0
  221. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/graphs/xml_scraper_multi_graph.py +0 -0
  222. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/helpers/__init__.py +0 -0
  223. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/helpers/default_filters.py +0 -0
  224. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/helpers/nodes_metadata.py +0 -0
  225. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/helpers/robots.py +0 -0
  226. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/helpers/schemas.py +0 -0
  227. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/integrations/__init__.py +0 -0
  228. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/integrations/burr_bridge.py +0 -0
  229. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/integrations/indexify_node.py +0 -0
  230. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/integrations/scrapegraph_py_compat.py +0 -0
  231. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/models/__init__.py +0 -0
  232. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/models/clod.py +0 -0
  233. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/models/deepseek.py +0 -0
  234. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/models/minimax.py +0 -0
  235. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/models/nvidia.py +0 -0
  236. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/models/oneapi.py +0 -0
  237. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/models/openai_itt.py +0 -0
  238. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/models/openai_tts.py +0 -0
  239. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/models/xai.py +0 -0
  240. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/__init__.py +0 -0
  241. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/base_node.py +0 -0
  242. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/batch_generate_answer_node.py +0 -0
  243. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/concat_answers_node.py +0 -0
  244. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/conditional_node.py +0 -0
  245. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/description_node.py +0 -0
  246. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/fetch_node_level_k.py +0 -0
  247. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/fetch_screen_node.py +0 -0
  248. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/generate_answer_csv_node.py +0 -0
  249. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/generate_answer_from_image_node.py +0 -0
  250. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/generate_answer_node.py +0 -0
  251. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/generate_answer_node_k_level.py +0 -0
  252. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/generate_answer_omni_node.py +0 -0
  253. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/generate_code_node.py +0 -0
  254. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/generate_scraper_node.py +0 -0
  255. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/get_probable_tags_node.py +0 -0
  256. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/graph_iterator_node.py +0 -0
  257. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/html_analyzer_node.py +0 -0
  258. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/image_to_text_node.py +0 -0
  259. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/markdownify_node.py +0 -0
  260. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/merge_answers_node.py +0 -0
  261. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/merge_generated_scripts_node.py +0 -0
  262. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/parse_node.py +0 -0
  263. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/parse_node_depth_k_node.py +0 -0
  264. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/prompt_refiner_node.py +0 -0
  265. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/rag_node.py +0 -0
  266. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/reasoning_node.py +0 -0
  267. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/search_internet_node.py +0 -0
  268. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/search_link_node.py +0 -0
  269. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/search_node_with_context.py +0 -0
  270. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/nodes/text_to_speech_node.py +0 -0
  271. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/prompts/__init__.py +0 -0
  272. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/prompts/description_node_prompts.py +0 -0
  273. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/prompts/generate_answer_node_csv_prompts.py +0 -0
  274. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/prompts/generate_answer_node_omni_prompts.py +0 -0
  275. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/prompts/generate_answer_node_pdf_prompts.py +0 -0
  276. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/prompts/generate_answer_node_prompts.py +0 -0
  277. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/prompts/generate_code_node_prompts.py +0 -0
  278. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/prompts/get_probable_tags_node_prompts.py +0 -0
  279. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/prompts/html_analyzer_node_prompts.py +0 -0
  280. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/prompts/merge_answer_node_prompts.py +0 -0
  281. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/prompts/merge_generated_scripts_prompts.py +0 -0
  282. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/prompts/prompt_refiner_node_prompts.py +0 -0
  283. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/prompts/reasoning_node_prompts.py +0 -0
  284. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/prompts/robots_node_prompts.py +0 -0
  285. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/prompts/search_internet_node_prompts.py +0 -0
  286. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/prompts/search_link_node_prompts.py +0 -0
  287. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/prompts/search_node_with_context_prompts.py +0 -0
  288. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/telemetry/__init__.py +0 -0
  289. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/telemetry/telemetry.py +0 -0
  290. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/__init__.py +0 -0
  291. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/batch_api.py +0 -0
  292. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/cleanup_code.py +0 -0
  293. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/cleanup_html.py +0 -0
  294. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/code_error_analysis.py +0 -0
  295. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/code_error_correction.py +0 -0
  296. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/convert_to_md.py +0 -0
  297. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/copy.py +0 -0
  298. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/custom_callback.py +0 -0
  299. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/data_export.py +0 -0
  300. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/dict_content_compare.py +0 -0
  301. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/llm_callback_manager.py +0 -0
  302. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/logging.py +0 -0
  303. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/model_costs.py +0 -0
  304. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/output_parser.py +0 -0
  305. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/parse_state_keys.py +0 -0
  306. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/prettify_exec_info.py +0 -0
  307. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/proxy_rotation.py +0 -0
  308. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/save_audio_from_bytes.py +0 -0
  309. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/save_code_to_file.py +0 -0
  310. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/schema_trasform.py +0 -0
  311. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/screenshot_scraping/__init__.py +0 -0
  312. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/screenshot_scraping/screenshot_preparation.py +0 -0
  313. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/screenshot_scraping/text_detection.py +0 -0
  314. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/split_text_into_chunks.py +0 -0
  315. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/sys_dynamic_import.py +0 -0
  316. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/tokenizer.py +0 -0
  317. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/tokenizers/tokenizer_mistral.py +0 -0
  318. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/tokenizers/tokenizer_ollama.py +0 -0
  319. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/scrapegraphai/utils/tokenizers/tokenizer_openai.py +0 -0
  320. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/test +0 -0
  321. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/QUICKSTART.md +0 -0
  322. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/README_TESTING.md +0 -0
  323. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/Readme.md +0 -0
  324. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/fixtures/benchmarking.py +0 -0
  325. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/fixtures/helpers.py +0 -0
  326. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/fixtures/mock_server/__init__.py +0 -0
  327. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/fixtures/mock_server/server.py +0 -0
  328. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/graphs/.env.example +0 -0
  329. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/graphs/abstract_graph_test.py +0 -0
  330. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/graphs/code_generator_graph_openai_test.py +0 -0
  331. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/graphs/depth_search_graph_openai_test.py +0 -0
  332. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/graphs/inputs/books.xml +0 -0
  333. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/graphs/inputs/example.json +0 -0
  334. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/graphs/inputs/plain_html_example.txt +0 -0
  335. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/graphs/inputs/username.csv +0 -0
  336. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/graphs/scrape_plain_text_mistral_test.py +0 -0
  337. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/graphs/scrape_xml_ollama_test.py +0 -0
  338. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/graphs/screenshot_scraper_test.py +0 -0
  339. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/graphs/script_generator_test.py +0 -0
  340. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/graphs/search_graph_openai_test.py +0 -0
  341. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/graphs/search_link_ollama.py +0 -0
  342. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/graphs/smart_scraper_clod_test.py +0 -0
  343. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/graphs/smart_scraper_ernie_test.py +0 -0
  344. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/graphs/smart_scraper_fireworks_test.py +0 -0
  345. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/graphs/smart_scraper_multi_lite_graph_openai_test.py +0 -0
  346. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/graphs/smart_scraper_ollama_test.py +0 -0
  347. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/graphs/smart_scraper_openai_test.py +0 -0
  348. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/graphs/xml_scraper_openai_test.py +0 -0
  349. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/inputs/books.xml +0 -0
  350. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/inputs/example.json +0 -0
  351. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/inputs/plain_html_example.txt +0 -0
  352. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/inputs/username.csv +0 -0
  353. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/integration/__init__.py +0 -0
  354. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/integration/test_file_formats_integration.py +0 -0
  355. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/integration/test_multi_graph_integration.py +0 -0
  356. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/integration/test_smart_scraper_integration.py +0 -0
  357. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/nodes/fetch_node_test.py +0 -0
  358. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/nodes/inputs/books.xml +0 -0
  359. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/nodes/inputs/example.json +0 -0
  360. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/nodes/inputs/plain_html_example.txt +0 -0
  361. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/nodes/inputs/username.csv +0 -0
  362. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/nodes/robot_node_test.py +0 -0
  363. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/nodes/search_internet_node_test.py +0 -0
  364. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/nodes/search_link_node_test.py +0 -0
  365. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/test_batch_api.py +0 -0
  366. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/test_chromium.py +0 -0
  367. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/test_cleanup_html.py +0 -0
  368. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/test_csv_scraper_multi_graph.py +0 -0
  369. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/test_depth_search_graph.py +0 -0
  370. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/test_fetch_node_timeout.py +0 -0
  371. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/test_generate_answer_node.py +0 -0
  372. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/test_json_scraper_graph.py +0 -0
  373. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/test_json_scraper_multi_graph.py +0 -0
  374. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/test_models_tokens.py +0 -0
  375. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/test_omni_search_graph.py +0 -0
  376. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/test_plasmate.py +0 -0
  377. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/test_scrape_do.py +0 -0
  378. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/test_script_creator_multi_graph.py +0 -0
  379. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/test_search_graph.py +0 -0
  380. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/test_smart_scraper_multi_concat_graph.py +0 -0
  381. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/utils/convert_to_md_test.py +0 -0
  382. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/utils/copy_utils_test.py +0 -0
  383. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/utils/parse_state_keys_test.py +0 -0
  384. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/utils/research_web_test.py +0 -0
  385. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/utils/test_proxy_rotation.py +0 -0
  386. {scrapegraphai-2.1.2 → scrapegraphai-2.1.4}/tests/utils/test_sys_dynamic_import.py +0 -0
@@ -1,3 +1,46 @@
1
+ ## [2.1.4](https://github.com/ScrapeGraphAI/Scrapegraph-ai/compare/v2.1.3...v2.1.4) (2026-06-23)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * lazy imports to prevent torchcodec FFmpeg DLL crash on Windows ([#1089](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1089)) ([#1092](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1092)) ([e5c2a42](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/e5c2a4292174bae948731379c88aafb14197ec6c))
7
+
8
+
9
+ ### Docs
10
+
11
+ * swap Integrations infographic for new API banner; fix CTA links ([71ab440](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/71ab4406867ef02c22349c2dedc18c57d8bdfdec))
12
+
13
+ ## [2.1.3](https://github.com/ScrapeGraphAI/Scrapegraph-ai/compare/v2.1.2...v2.1.3) (2026-06-02)
14
+
15
+
16
+ ### Bug Fixes
17
+
18
+ * **search:** restore SearchGraph by migrating DuckDuckGo backend to ddgs ([#1083](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1083)) ([2139e37](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/2139e37c0addfb9039e3b985bb33801f20e4e05b)), closes [#1082](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1082) [#1082](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1082)
19
+
20
+ ## [2.2.0-beta.3](https://github.com/ScrapeGraphAI/Scrapegraph-ai/compare/v2.2.0-beta.2...v2.2.0-beta.3) (2026-06-01)
21
+
22
+
23
+ ### Bug Fixes
24
+
25
+ * **nodes:** update outdated ChatOllama import path to langchain_ollama ([#1076](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1076)) ([e6054cb](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/e6054cbf19a7fe940899ea70b30706f676f86fa7))
26
+
27
+
28
+ ### Docs
29
+
30
+ * 📚 Standardize and fix links across translated READMEs ([#1074](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1074)) ([458d36a](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/458d36a6b83f4a412206cdbe9935a059e9d47f57))
31
+
32
+
33
+ ### CI
34
+
35
+ * **release:** 2.1.2 [skip ci] ([210c992](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/210c99280048863774fa27053412185a5c18150d)), closes [#1076](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1076) [#1074](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1074)
36
+
37
+ ## [2.2.0-beta.2](https://github.com/ScrapeGraphAI/Scrapegraph-ai/compare/v2.2.0-beta.1...v2.2.0-beta.2) (2026-06-01)
38
+
39
+
40
+ ### Features
41
+
42
+ * upgrade MiniMax default model to M3 ([#1080](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1080)) ([1b16c26](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/1b16c268f4e9044c1386ccfaf67b38692b487e5a))
43
+
1
44
  ## [2.1.2](https://github.com/ScrapeGraphAI/Scrapegraph-ai/compare/v2.1.1...v2.1.2) (2026-06-01)
2
45
 
3
46
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: scrapegraphai
3
- Version: 2.1.2
3
+ Version: 2.1.4
4
4
  Summary: A web scraping library based on LangChain which uses LLM and direct graph logic to create scraping pipelines.
5
5
  Author-email: Marco Vinciguerra <mvincig11@gmail.com>, Lorenzo Padoan <lorenzo.padoan977@gmail.com>
6
6
  Keywords: ai,artificial intelligence,gpt,graph,langchain,llm,machine learning,natural language processing,nlp,openai,rag,scrapegraph,scrapegraphai,scraping,web scraping,web scraping library,web scraping tool,webscraping
@@ -11,7 +11,7 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
11
11
  Requires-Python: <4.0,>=3.12
12
12
  Requires-Dist: async-timeout>=4.0.0
13
13
  Requires-Dist: beautifulsoup4>=4.14.3
14
- Requires-Dist: duckduckgo-search>=8.1.1
14
+ Requires-Dist: ddgs>=9.0.0
15
15
  Requires-Dist: free-proxy>=1.1.3
16
16
  Requires-Dist: html2text>=2025.4.15
17
17
  Requires-Dist: jsonschema>=4.25.1
@@ -81,7 +81,9 @@ Just say which information you want to extract and the library will do it for yo
81
81
  ScrapeGraphAI offers seamless integration with popular frameworks and tools to enhance your scraping capabilities. Whether you're building with Python or Node.js, using LLM frameworks, or working with no-code platforms, we've got you covered with our comprehensive integration options..
82
82
 
83
83
  <p align="center">
84
- <img src="https://raw.githubusercontent.com/ScrapeGraphAI/Scrapegraph-ai/main/docs/assets/sgai-hero.png" alt="ScrapeGraphAI Hero" style="width: 100%;">
84
+ <a href="https://scrapegraphai.com">
85
+ <img src="https://raw.githubusercontent.com/ScrapeGraphAI/.github/main/profile/assets/api_banner.png" alt="Web data extraction at scale? Try ScrapeGraphAI cloud" style="width: 100%;">
86
+ </a>
85
87
  </p>
86
88
 
87
89
  You can find more informations at the following [link](https://scrapegraphai.com)
@@ -219,9 +221,9 @@ Please see the [contributing guidelines](https://github.com/ScrapeGraphAI/Scrape
219
221
  [![My Skills](https://skillicons.dev/icons?i=twitter)](https://twitter.com/scrapegraphai)
220
222
 
221
223
  ## 🔗 ScrapeGraph API & SDKs
222
- If you are looking for a quick solution to integrate ScrapeGraph in your system, check out our powerful API [here!](https://dashboard.scrapegraphai.com/login)
224
+ If you are looking for a quick solution to integrate ScrapeGraph in your system, check out our powerful API [here!](https://scrapegraphai.com)
223
225
 
224
- [![API Banner](https://raw.githubusercontent.com/ScrapeGraphAI/Scrapegraph-ai/main/docs/assets/api_banner.png)](https://dashboard.scrapegraphai.com/login)
226
+ [![API Banner](https://raw.githubusercontent.com/ScrapeGraphAI/Scrapegraph-ai/main/docs/assets/api_banner.png)](https://scrapegraphai.com)
225
227
 
226
228
  We offer SDKs in both Python and Node.js, making it easy to integrate into your projects. Check them out below:
227
229
 
@@ -36,7 +36,9 @@ Just say which information you want to extract and the library will do it for yo
36
36
  ScrapeGraphAI offers seamless integration with popular frameworks and tools to enhance your scraping capabilities. Whether you're building with Python or Node.js, using LLM frameworks, or working with no-code platforms, we've got you covered with our comprehensive integration options..
37
37
 
38
38
  <p align="center">
39
- <img src="https://raw.githubusercontent.com/ScrapeGraphAI/Scrapegraph-ai/main/docs/assets/sgai-hero.png" alt="ScrapeGraphAI Hero" style="width: 100%;">
39
+ <a href="https://scrapegraphai.com">
40
+ <img src="https://raw.githubusercontent.com/ScrapeGraphAI/.github/main/profile/assets/api_banner.png" alt="Web data extraction at scale? Try ScrapeGraphAI cloud" style="width: 100%;">
41
+ </a>
40
42
  </p>
41
43
 
42
44
  You can find more informations at the following [link](https://scrapegraphai.com)
@@ -174,9 +176,9 @@ Please see the [contributing guidelines](https://github.com/ScrapeGraphAI/Scrape
174
176
  [![My Skills](https://skillicons.dev/icons?i=twitter)](https://twitter.com/scrapegraphai)
175
177
 
176
178
  ## 🔗 ScrapeGraph API & SDKs
177
- If you are looking for a quick solution to integrate ScrapeGraph in your system, check out our powerful API [here!](https://dashboard.scrapegraphai.com/login)
179
+ If you are looking for a quick solution to integrate ScrapeGraph in your system, check out our powerful API [here!](https://scrapegraphai.com)
178
180
 
179
- [![API Banner](https://raw.githubusercontent.com/ScrapeGraphAI/Scrapegraph-ai/main/docs/assets/api_banner.png)](https://dashboard.scrapegraphai.com/login)
181
+ [![API Banner](https://raw.githubusercontent.com/ScrapeGraphAI/Scrapegraph-ai/main/docs/assets/api_banner.png)](https://scrapegraphai.com)
180
182
 
181
183
  We offer SDKs in both Python and Node.js, making it easy to integrate into your projects. Check them out below:
182
184
 
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "scrapegraphai"
3
3
 
4
- version = "2.1.2"
4
+ version = "2.1.4"
5
5
 
6
6
  description = "A web scraping library based on LangChain which uses LLM and direct graph logic to create scraping pipelines."
7
7
  authors = [
@@ -30,7 +30,7 @@ dependencies = [
30
30
  "async-timeout>=4.0.0",
31
31
  "simpleeval>=1.0.3",
32
32
  "jsonschema>=4.25.1",
33
- "duckduckgo-search>=8.1.1",
33
+ "ddgs>=9.0.0",
34
34
  "pydantic>=2.12.5",
35
35
  "scrapegraph-py>=2.0.0",
36
36
  ]
@@ -0,0 +1,30 @@
1
+ """
2
+ This module handles document loading functionalities for the ScrapeGraphAI application.
3
+
4
+ Note: ChromiumLoader and PlasmateLoader are lazy-imported to avoid triggering
5
+ torchcodec/FFmpeg DLL loading at import time (sentence_transformers -> torchcodec chain).
6
+ """
7
+
8
+ from .browser_base import browser_base_fetch
9
+ from .scrape_do import scrape_do_fetch
10
+
11
+ _LAZY_MODULES = {
12
+ "ChromiumLoader": ".chromium",
13
+ "PlasmateLoader": ".plasmate",
14
+ }
15
+
16
+
17
+ def __getattr__(name):
18
+ if name in _LAZY_MODULES:
19
+ import importlib
20
+ module = importlib.import_module(_LAZY_MODULES[name], __package__)
21
+ return getattr(module, name)
22
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
23
+
24
+
25
+ __all__ = [
26
+ "browser_base_fetch",
27
+ "ChromiumLoader",
28
+ "PlasmateLoader",
29
+ "scrape_do_fetch",
30
+ ]
@@ -3,7 +3,6 @@ from typing import Any, AsyncIterator, Iterator, List, Optional, Union
3
3
 
4
4
  import aiohttp
5
5
  import async_timeout
6
- from langchain_community.document_loaders.base import BaseLoader
7
6
  from langchain_core.documents import Document
8
7
 
9
8
  from ..utils import Proxy, dynamic_import, get_logger, parse_or_search_proxy
@@ -11,7 +10,7 @@ from ..utils import Proxy, dynamic_import, get_logger, parse_or_search_proxy
11
10
  logger = get_logger("web-loader")
12
11
 
13
12
 
14
- class ChromiumLoader(BaseLoader):
13
+ class ChromiumLoader:
15
14
  """Scrapes HTML pages from URLs using a (headless) instance of the
16
15
  Chromium web driver with proxy protection.
17
16
 
@@ -436,6 +435,14 @@ class ChromiumLoader(BaseLoader):
436
435
  finally:
437
436
  await browser.close()
438
437
 
438
+ def load(self) -> List[Document]:
439
+ """Load all documents synchronously."""
440
+ return list(self.lazy_load())
441
+
442
+ async def aload(self) -> List[Document]:
443
+ """Load all documents asynchronously."""
444
+ return [doc async for doc in self.alazy_load()]
445
+
439
446
  def lazy_load(self) -> Iterator[Document]:
440
447
  """
441
448
  Lazily load text content from the provided URLs.
@@ -408,12 +408,8 @@ models_tokens = {
408
408
  "grok-beta": 128000,
409
409
  },
410
410
  "minimax": {
411
+ "MiniMax-M3": 524288,
411
412
  "MiniMax-M2.7": 204000,
412
413
  "MiniMax-M2.7-highspeed": 204000,
413
- "MiniMax-M1": 1000000,
414
- "MiniMax-M1-40k": 40000,
415
- "MiniMax-M2": 204000,
416
- "MiniMax-M2.5": 204000,
417
- "MiniMax-M2.5-highspeed": 204000,
418
414
  },
419
415
  }
@@ -7,7 +7,6 @@ from typing import List, Optional
7
7
  import concurrent.futures
8
8
 
9
9
  import requests
10
- from langchain_community.document_loaders import PyPDFLoader
11
10
  from langchain_core.documents import Document
12
11
  from langchain_openai import AzureChatOpenAI, ChatOpenAI
13
12
 
@@ -182,6 +181,7 @@ class FetchNode(BaseNode):
182
181
  """
183
182
 
184
183
  if input_type == "pdf":
184
+ from langchain_community.document_loaders import PyPDFLoader
185
185
  loader = PyPDFLoader(source)
186
186
  # PyPDFLoader.load() can be blocking for large PDFs. Run it in a thread and
187
187
  # enforce the configured timeout if provided.
@@ -7,7 +7,6 @@ from urllib.parse import urlparse
7
7
 
8
8
  from langchain_core.output_parsers import CommaSeparatedListOutputParser
9
9
  from langchain_core.prompts import PromptTemplate
10
- from langchain_community.document_loaders import AsyncChromiumLoader
11
10
 
12
11
  from ..helpers import robots_dictionary
13
12
  from ..prompts import TEMPLATE_ROBOT
@@ -90,6 +89,7 @@ class RobotsNode(BaseNode):
90
89
  else:
91
90
  parsed_url = urlparse(source)
92
91
  base_url = f"{parsed_url.scheme}://{parsed_url.netloc}"
92
+ from langchain_community.document_loaders import AsyncChromiumLoader
93
93
  loader = AsyncChromiumLoader(f"{base_url}/robots.txt")
94
94
  document = loader.load()
95
95
  if "ollama" in self.llm_model.model:
@@ -11,7 +11,6 @@ from typing import Dict, List, Optional, Union
11
11
 
12
12
  import requests
13
13
  from bs4 import BeautifulSoup
14
- from langchain_community.tools import DuckDuckGoSearchResults
15
14
  from pydantic import BaseModel, Field, validator
16
15
 
17
16
 
@@ -215,12 +214,9 @@ def search_on_web(
215
214
 
216
215
  results = []
217
216
  if config.search_engine == "duckduckgo":
218
- # Create a DuckDuckGo search object with max_results
219
- research = DuckDuckGoSearchResults(max_results=config.max_results)
220
- # Run the search
221
- res = research.run(config.query)
222
- # Extract URLs using regex
223
- results = re.findall(r"https?://[^\s,\]]+", res)
217
+ results = _search_duckduckgo(
218
+ config.query, config.max_results, formatted_proxy
219
+ )
224
220
 
225
221
  elif config.search_engine == "bing":
226
222
  results = _search_bing(
@@ -247,6 +243,45 @@ def search_on_web(
247
243
  raise SearchConfigError(f"Invalid search configuration: {str(e)}")
248
244
 
249
245
 
246
+ def _search_duckduckgo(
247
+ query: str, max_results: int, proxy: Optional[str] = None
248
+ ) -> List[str]:
249
+ """
250
+ Helper function for DuckDuckGo search using the ``ddgs`` package.
251
+
252
+ The ``duckduckgo-search`` package was renamed to ``ddgs``; recent
253
+ ``langchain-community`` releases import ``from ddgs import DDGS``, which
254
+ silently broke the previous langchain-based implementation. This calls
255
+ ``ddgs`` directly so results no longer depend on parsing a formatted string.
256
+
257
+ Args:
258
+ query (str): Search query
259
+ max_results (int): Maximum number of results to return
260
+ proxy (str, optional): Proxy configuration
261
+
262
+ Returns:
263
+ List[str]: List of URLs from search results
264
+ """
265
+ try:
266
+ from ddgs import DDGS
267
+ except ImportError as e:
268
+ raise ImportError(
269
+ "Could not import the 'ddgs' package required for DuckDuckGo "
270
+ "search. Please install it with `pip install -U ddgs`."
271
+ ) from e
272
+
273
+ try:
274
+ with DDGS(proxy=proxy) as ddgs:
275
+ results = [
276
+ result["href"]
277
+ for result in ddgs.text(query, max_results=max_results)
278
+ if result.get("href")
279
+ ]
280
+ return results
281
+ except Exception as e:
282
+ raise SearchRequestError(f"DuckDuckGo search failed: {str(e)}")
283
+
284
+
250
285
  def _search_bing(
251
286
  query: str, max_results: int, timeout: int, proxy: Optional[str] = None
252
287
  ) -> List[str]:
@@ -14,9 +14,24 @@ from pathlib import Path
14
14
  from typing import Any, Dict
15
15
  from unittest.mock import Mock
16
16
 
17
+ import sys
18
+ import types
19
+
17
20
  import pytest
18
21
  from dotenv import load_dotenv
19
22
 
23
+ # Mock torchcodec to prevent FFmpeg DLL crashes at import time.
24
+ # sentence_transformers -> torchcodec -> FFmpeg native DLLs can't load on some systems.
25
+ _tc = types.ModuleType("torchcodec")
26
+ _tc.__version__ = "0.0.0"
27
+ _tc.__file__ = "<mock>"
28
+ _tc.__spec__ = types.ModuleType("spec")
29
+ _tc.__spec__.name = "torchcodec"
30
+ _tc.__spec__.loader = None
31
+ _tc.__spec__.submodule_search_locations = []
32
+ if "torchcodec" not in sys.modules:
33
+ sys.modules["torchcodec"] = _tc
34
+
20
35
  # Load environment variables
21
36
  load_dotenv()
22
37
 
@@ -0,0 +1,62 @@
1
+ """Tests for MiniMax model configuration."""
2
+
3
+ import importlib.util
4
+ import os
5
+ import sys
6
+
7
+ import pytest
8
+
9
+
10
+ @pytest.fixture(scope="module")
11
+ def models_tokens():
12
+ """Import models_tokens directly to avoid triggering the full package init."""
13
+ spec = importlib.util.spec_from_file_location(
14
+ "models_tokens",
15
+ os.path.join(
16
+ os.path.dirname(__file__),
17
+ "..",
18
+ "scrapegraphai",
19
+ "helpers",
20
+ "models_tokens.py",
21
+ ),
22
+ )
23
+ module = importlib.util.module_from_spec(spec)
24
+ spec.loader.exec_module(module)
25
+ return module.models_tokens
26
+
27
+
28
+ def test_minimax_m3_in_model_list(models_tokens):
29
+ """MiniMax-M3 should be in the model list."""
30
+ minimax_models = models_tokens["minimax"]
31
+ assert "MiniMax-M3" in minimax_models
32
+
33
+
34
+ def test_minimax_m3_listed_first(models_tokens):
35
+ """MiniMax-M3 should be the first (default) model in the minimax dict."""
36
+ minimax_models = list(models_tokens["minimax"].keys())
37
+ assert minimax_models[0] == "MiniMax-M3"
38
+
39
+
40
+ def test_minimax_m27_still_available(models_tokens):
41
+ """MiniMax-M2.7 and its highspeed variant should remain as legacy options."""
42
+ minimax_models = models_tokens["minimax"]
43
+ assert "MiniMax-M2.7" in minimax_models
44
+ assert "MiniMax-M2.7-highspeed" in minimax_models
45
+
46
+
47
+ def test_minimax_deprecated_models_removed(models_tokens):
48
+ """Older deprecated MiniMax models should be removed from the list."""
49
+ minimax_models = models_tokens["minimax"]
50
+ assert "MiniMax-M2.5" not in minimax_models
51
+ assert "MiniMax-M2.5-highspeed" not in minimax_models
52
+ assert "MiniMax-M2" not in minimax_models
53
+ assert "MiniMax-M1" not in minimax_models
54
+ assert "MiniMax-M1-40k" not in minimax_models
55
+
56
+
57
+ def test_minimax_token_limits(models_tokens):
58
+ """MiniMax model token limits should match upstream documentation."""
59
+ minimax_models = models_tokens["minimax"]
60
+ assert minimax_models["MiniMax-M3"] == 524288
61
+ assert minimax_models["MiniMax-M2.7"] == 204000
62
+ assert minimax_models["MiniMax-M2.7-highspeed"] == 204000