scrapegraphai 2.2.3__tar.gz → 2.2.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 (391) hide show
  1. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/CHANGELOG.md +35 -0
  2. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/PKG-INFO +1 -1
  3. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/pyproject.toml +1 -1
  4. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/helpers/models_tokens.py +9 -0
  5. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/telemetry/telemetry.py +23 -5
  6. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/test_models_tokens.py +97 -66
  7. scrapegraphai-2.2.4/tests/test_telemetry_flag.py +70 -0
  8. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/.gitattributes +0 -0
  9. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/.github/FUNDING.yml +0 -0
  10. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  11. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/.github/ISSUE_TEMPLATE/custom.md +0 -0
  12. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  13. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/.github/workflows/codeql.yml +0 -0
  14. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/.github/workflows/dependency-review.yml +0 -0
  15. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/.github/workflows/release.yml +0 -0
  16. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/.github/workflows/test-suite.yml +0 -0
  17. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/.gitignore +0 -0
  18. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/.pre-commit-config.yaml +0 -0
  19. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/.releaserc.yml +0 -0
  20. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/.semantic-commits-applied +0 -0
  21. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/AGENTS.md +0 -0
  22. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/CODE_OF_CONDUCT.md +0 -0
  23. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/CONTRIBUTING.md +0 -0
  24. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/Dockerfile +0 -0
  25. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/LICENSE +0 -0
  26. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/Makefile +0 -0
  27. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/PullRequests/PR_1027_reviews.md +0 -0
  28. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/README.md +0 -0
  29. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/SECURITY.md +0 -0
  30. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/SEMANTIC_COMMITS.md +0 -0
  31. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/TESTING_INFRASTRUCTURE.md +0 -0
  32. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/citation.cff +0 -0
  33. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/codebeaver.yml +0 -0
  34. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docker-compose.yml +0 -0
  35. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/assets/api-banner.png +0 -0
  36. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/assets/api_banner.png +0 -0
  37. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/assets/apikey_1.png +0 -0
  38. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/assets/apikey_2.png +0 -0
  39. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/assets/apikey_3.png +0 -0
  40. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/assets/apikey_4.png +0 -0
  41. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/assets/browserbase_logo.png +0 -0
  42. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/assets/codespaces-badge.png +0 -0
  43. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/assets/histogram.png +0 -0
  44. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/assets/nodemaven-banner.png +0 -0
  45. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/assets/omniscrapergraph.png +0 -0
  46. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/assets/omnisearchgraph.png +0 -0
  47. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/assets/project_overview_diagram.fig +0 -0
  48. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/assets/project_overview_diagram.png +0 -0
  49. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/assets/scrapegraphai_logo.png +0 -0
  50. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/assets/scrapegraphai_logo.svg +0 -0
  51. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/assets/scriptcreatorgraph.png +0 -0
  52. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/assets/searchgraph.png +0 -0
  53. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/assets/sgai-hero.png +0 -0
  54. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/assets/smartscrapergraph.png +0 -0
  55. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/assets/speechgraph.png +0 -0
  56. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/chinese.md +0 -0
  57. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/french.md +0 -0
  58. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/german.md +0 -0
  59. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/italian.md +0 -0
  60. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/japanese.md +0 -0
  61. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/korean.md +0 -0
  62. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/portuguese.md +0 -0
  63. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/russian.md +0 -0
  64. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/spanish.md +0 -0
  65. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/timeout_configuration.md +0 -0
  66. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/docs/turkish.md +0 -0
  67. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/ScrapegraphAI_cookbook.ipynb +0 -0
  68. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/code_generator_graph/.env.example +0 -0
  69. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/code_generator_graph/README.md +0 -0
  70. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/code_generator_graph/ollama/code_generator_graph_ollama.py +0 -0
  71. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/code_generator_graph/openai/code_generator_graph_openai.py +0 -0
  72. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/csv_scraper_graph/.env.example +0 -0
  73. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/csv_scraper_graph/README.md +0 -0
  74. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/csv_scraper_graph/ollama/csv_scraper_graph_multi_ollama.py +0 -0
  75. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/csv_scraper_graph/ollama/csv_scraper_ollama.py +0 -0
  76. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/csv_scraper_graph/ollama/inputs/username.csv +0 -0
  77. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/csv_scraper_graph/openai/csv_scraper_graph_multi_openai.py +0 -0
  78. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/csv_scraper_graph/openai/csv_scraper_openai.py +0 -0
  79. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/csv_scraper_graph/openai/inputs/username.csv +0 -0
  80. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/custom_graph/.env.example +0 -0
  81. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/custom_graph/README.md +0 -0
  82. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/custom_graph/ollama/custom_graph_ollama.py +0 -0
  83. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/custom_graph/openai/custom_graph_openai.py +0 -0
  84. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/depth_search_graph/.env.example +0 -0
  85. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/depth_search_graph/README.md +0 -0
  86. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/depth_search_graph/ollama/depth_search_graph_ollama.py +0 -0
  87. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/depth_search_graph/openai/depth_search_graph_openai.py +0 -0
  88. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/document_scraper_graph/.env.example +0 -0
  89. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/document_scraper_graph/README.md +0 -0
  90. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/document_scraper_graph/ollama/document_scraper_ollama.py +0 -0
  91. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/document_scraper_graph/ollama/inputs/plain_html_example.txt +0 -0
  92. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/document_scraper_graph/openai/document_scraper_openai.py +0 -0
  93. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/document_scraper_graph/openai/inputs/markdown_example.md +0 -0
  94. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/document_scraper_graph/openai/inputs/plain_html_example.txt +0 -0
  95. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/extras/.env.example +0 -0
  96. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/extras/Savedscreenshots/test_image.jpeg +0 -0
  97. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/extras/authenticated_playwright.py +0 -0
  98. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/extras/browser_base_integration.py +0 -0
  99. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/extras/chromium_selenium.py +0 -0
  100. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/extras/cond_smartscraper_usage.py +0 -0
  101. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/extras/conditional_usage.py +0 -0
  102. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/extras/custom_prompt.py +0 -0
  103. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/extras/example.yml +0 -0
  104. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/extras/force_mode.py +0 -0
  105. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/extras/html_mode.py +0 -0
  106. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/extras/load_yml.py +0 -0
  107. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/extras/no_cut.py +0 -0
  108. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/extras/proxy_rotation.py +0 -0
  109. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/extras/rag_caching.py +0 -0
  110. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/extras/reasoning.py +0 -0
  111. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/extras/scrape_do.py +0 -0
  112. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/extras/screenshot_scaping.py +0 -0
  113. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/extras/serch_graph_scehma.py +0 -0
  114. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/extras/slow_mo.py +0 -0
  115. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/extras/undected_playwright.py +0 -0
  116. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/json_scraper_graph/.env.example +0 -0
  117. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/json_scraper_graph/README.md +0 -0
  118. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/json_scraper_graph/ollama/inputs/example.json +0 -0
  119. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/json_scraper_graph/ollama/json_scraper_multi_ollama.py +0 -0
  120. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/json_scraper_graph/ollama/json_scraper_ollama.py +0 -0
  121. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/json_scraper_graph/openai/inputs/example.json +0 -0
  122. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/json_scraper_graph/openai/json_scraper_multi_openai.py +0 -0
  123. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/json_scraper_graph/openai/json_scraper_openai.py +0 -0
  124. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/json_scraper_graph/openai/md_scraper_openai.py +0 -0
  125. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/json_scraper_graph/openai/omni_scraper_openai.py +0 -0
  126. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/markdownify/.env.example +0 -0
  127. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/markdownify/markdownify_scrapegraphai.py +0 -0
  128. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/markdownify/markdownify_scrapegraphai_v3.py +0 -0
  129. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/markdownify/readme.md +0 -0
  130. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/omni_scraper_graph/.env.example +0 -0
  131. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/omni_scraper_graph/README.md +0 -0
  132. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/omni_scraper_graph/omni_search_openai.py +0 -0
  133. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/readme.md +0 -0
  134. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/script_generator_graph/.env.example +0 -0
  135. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/script_generator_graph/README.md +0 -0
  136. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/script_generator_graph/ollama/script_generator_ollama.py +0 -0
  137. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/script_generator_graph/ollama/script_multi_generator_ollama.py +0 -0
  138. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/script_generator_graph/openai/script_generator_multi_openai.py +0 -0
  139. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/script_generator_graph/openai/script_generator_openai.py +0 -0
  140. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/script_generator_graph/openai/script_generator_schema_openai.py +0 -0
  141. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/search_graph/.env.example +0 -0
  142. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/search_graph/README.md +0 -0
  143. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/search_graph/ollama/search_graph_ollama.py +0 -0
  144. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/search_graph/ollama/search_graph_schema_ollama.py +0 -0
  145. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/search_graph/openai/search_graph_openai.py +0 -0
  146. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/search_graph/openai/search_graph_schema_openai.py +0 -0
  147. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/search_graph/openai/search_link_graph_openai.py +0 -0
  148. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/search_graph/scrapegraphai/.env.example +0 -0
  149. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/search_graph/scrapegraphai/readme.md +0 -0
  150. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/search_graph/scrapegraphai/searchscraper_scrapegraphai.py +0 -0
  151. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/search_graph/scrapegraphai/searchscraper_scrapegraphai_v3.py +0 -0
  152. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/.env.example +0 -0
  153. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/nvidia/smart_scraper_nvidia.py +0 -0
  154. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/ollama/smart_scraper_lite_ollama.py +0 -0
  155. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/ollama/smart_scraper_multi_concat_ollama.py +0 -0
  156. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/ollama/smart_scraper_multi_lite_ollama.py +0 -0
  157. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/ollama/smart_scraper_multi_ollama.py +0 -0
  158. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/ollama/smart_scraper_ollama.py +0 -0
  159. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/ollama/smart_scraper_schema_ollama.py +0 -0
  160. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/openai/smart_scraper_lite_openai.py +0 -0
  161. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/openai/smart_scraper_multi_concat_openai.py +0 -0
  162. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/openai/smart_scraper_multi_lite_openai.py +0 -0
  163. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/openai/smart_scraper_multi_openai.py +0 -0
  164. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/openai/smart_scraper_openai.py +0 -0
  165. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/openai/smart_scraper_schema_openai.py +0 -0
  166. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/scrapegraphai/.env.example +0 -0
  167. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/scrapegraphai/readme.md +0 -0
  168. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/scrapegraphai/smartscraper_scrapegraphai.py +0 -0
  169. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/scrapegraphai/smartscraper_scrapegraphai_v3.py +0 -0
  170. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/speech_graph/.env.example +0 -0
  171. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/speech_graph/README.md +0 -0
  172. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/speech_graph/speech_graph_openai.py +0 -0
  173. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/xml_scraper_graph/.env.example +0 -0
  174. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/xml_scraper_graph/README.md +0 -0
  175. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/xml_scraper_graph/ollama/inputs/books.xml +0 -0
  176. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/xml_scraper_graph/ollama/xml_scraper_graph_multi_ollama.py +0 -0
  177. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/xml_scraper_graph/ollama/xml_scraper_ollama.py +0 -0
  178. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/xml_scraper_graph/openai/inputs/books.xml +0 -0
  179. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/xml_scraper_graph/openai/xml_scraper_graph_multi_openai.py +0 -0
  180. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/examples/xml_scraper_graph/openai/xml_scraper_openai.py +0 -0
  181. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/media/banner.png +0 -0
  182. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/pytest.ini +0 -0
  183. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/__init__.py +0 -0
  184. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/builders/__init__.py +0 -0
  185. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/builders/graph_builder.py +0 -0
  186. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/docloaders/__init__.py +0 -0
  187. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/docloaders/browser_base.py +0 -0
  188. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/docloaders/chromium.py +0 -0
  189. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/docloaders/plasmate.py +0 -0
  190. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/docloaders/scrape_do.py +0 -0
  191. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/__init__.py +0 -0
  192. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/abstract_graph.py +0 -0
  193. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/base_graph.py +0 -0
  194. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/code_generator_graph.py +0 -0
  195. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/csv_scraper_graph.py +0 -0
  196. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/csv_scraper_multi_graph.py +0 -0
  197. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/depth_search_graph.py +0 -0
  198. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/document_scraper_graph.py +0 -0
  199. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/document_scraper_multi_graph.py +0 -0
  200. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/json_scraper_graph.py +0 -0
  201. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/json_scraper_multi_graph.py +0 -0
  202. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/markdownify_graph.py +0 -0
  203. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/omni_scraper_graph.py +0 -0
  204. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/omni_search_graph.py +0 -0
  205. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/screenshot_scraper_graph.py +0 -0
  206. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/script_creator_graph.py +0 -0
  207. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/script_creator_multi_graph.py +0 -0
  208. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/search_graph.py +0 -0
  209. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/search_link_graph.py +0 -0
  210. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/smart_scraper_graph.py +0 -0
  211. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/smart_scraper_lite_graph.py +0 -0
  212. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/smart_scraper_multi_batch_graph.py +0 -0
  213. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/smart_scraper_multi_concat_graph.py +0 -0
  214. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/smart_scraper_multi_graph.py +0 -0
  215. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/smart_scraper_multi_lite_graph.py +0 -0
  216. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/speech_graph.py +0 -0
  217. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/xml_scraper_graph.py +0 -0
  218. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/graphs/xml_scraper_multi_graph.py +0 -0
  219. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/helpers/__init__.py +0 -0
  220. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/helpers/default_filters.py +0 -0
  221. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/helpers/nodes_metadata.py +0 -0
  222. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/helpers/robots.py +0 -0
  223. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/helpers/schemas.py +0 -0
  224. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/integrations/__init__.py +0 -0
  225. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/integrations/burr_bridge.py +0 -0
  226. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/integrations/indexify_node.py +0 -0
  227. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/integrations/scrapegraph_py_compat.py +0 -0
  228. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/models/__init__.py +0 -0
  229. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/models/atlascloud.py +0 -0
  230. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/models/clod.py +0 -0
  231. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/models/deepseek.py +0 -0
  232. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/models/minimax.py +0 -0
  233. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/models/nvidia.py +0 -0
  234. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/models/oneapi.py +0 -0
  235. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/models/openai_itt.py +0 -0
  236. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/models/openai_tts.py +0 -0
  237. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/models/xai.py +0 -0
  238. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/__init__.py +0 -0
  239. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/base_node.py +0 -0
  240. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/batch_generate_answer_node.py +0 -0
  241. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/concat_answers_node.py +0 -0
  242. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/conditional_node.py +0 -0
  243. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/description_node.py +0 -0
  244. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/fetch_node.py +0 -0
  245. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/fetch_node_level_k.py +0 -0
  246. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/fetch_screen_node.py +0 -0
  247. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/generate_answer_csv_node.py +0 -0
  248. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/generate_answer_from_image_node.py +0 -0
  249. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/generate_answer_node.py +0 -0
  250. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/generate_answer_node_k_level.py +0 -0
  251. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/generate_answer_omni_node.py +0 -0
  252. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/generate_code_node.py +0 -0
  253. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/generate_scraper_node.py +0 -0
  254. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/get_probable_tags_node.py +0 -0
  255. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/graph_iterator_node.py +0 -0
  256. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/html_analyzer_node.py +0 -0
  257. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/image_to_text_node.py +0 -0
  258. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/markdownify_node.py +0 -0
  259. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/merge_answers_node.py +0 -0
  260. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/merge_generated_scripts_node.py +0 -0
  261. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/parse_node.py +0 -0
  262. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/parse_node_depth_k_node.py +0 -0
  263. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/prompt_refiner_node.py +0 -0
  264. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/rag_node.py +0 -0
  265. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/reasoning_node.py +0 -0
  266. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/robots_node.py +0 -0
  267. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/search_internet_node.py +0 -0
  268. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/search_link_node.py +0 -0
  269. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/search_node_with_context.py +0 -0
  270. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/nodes/text_to_speech_node.py +0 -0
  271. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/prompts/__init__.py +0 -0
  272. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/prompts/description_node_prompts.py +0 -0
  273. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/prompts/generate_answer_node_csv_prompts.py +0 -0
  274. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/prompts/generate_answer_node_omni_prompts.py +0 -0
  275. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/prompts/generate_answer_node_pdf_prompts.py +0 -0
  276. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/prompts/generate_answer_node_prompts.py +0 -0
  277. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/prompts/generate_code_node_prompts.py +0 -0
  278. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/prompts/get_probable_tags_node_prompts.py +0 -0
  279. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/prompts/html_analyzer_node_prompts.py +0 -0
  280. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/prompts/merge_answer_node_prompts.py +0 -0
  281. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/prompts/merge_generated_scripts_prompts.py +0 -0
  282. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/prompts/prompt_refiner_node_prompts.py +0 -0
  283. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/prompts/reasoning_node_prompts.py +0 -0
  284. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/prompts/robots_node_prompts.py +0 -0
  285. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/prompts/search_internet_node_prompts.py +0 -0
  286. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/prompts/search_link_node_prompts.py +0 -0
  287. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/prompts/search_node_with_context_prompts.py +0 -0
  288. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/telemetry/__init__.py +0 -0
  289. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/__init__.py +0 -0
  290. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/batch_api.py +0 -0
  291. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/cleanup_code.py +0 -0
  292. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/cleanup_html.py +0 -0
  293. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/code_error_analysis.py +0 -0
  294. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/code_error_correction.py +0 -0
  295. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/convert_to_md.py +0 -0
  296. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/copy.py +0 -0
  297. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/custom_callback.py +0 -0
  298. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/data_export.py +0 -0
  299. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/dict_content_compare.py +0 -0
  300. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/llm_callback_manager.py +0 -0
  301. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/logging.py +0 -0
  302. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/model_costs.py +0 -0
  303. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/output_parser.py +0 -0
  304. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/parse_state_keys.py +0 -0
  305. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/prettify_exec_info.py +0 -0
  306. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/proxy_rotation.py +0 -0
  307. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/research_web.py +0 -0
  308. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/save_audio_from_bytes.py +0 -0
  309. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/save_code_to_file.py +0 -0
  310. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/schema_trasform.py +0 -0
  311. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/screenshot_scraping/__init__.py +0 -0
  312. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/screenshot_scraping/screenshot_preparation.py +0 -0
  313. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/screenshot_scraping/text_detection.py +0 -0
  314. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/split_text_into_chunks.py +0 -0
  315. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/sys_dynamic_import.py +0 -0
  316. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/tokenizer.py +0 -0
  317. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/tokenizers/tokenizer_mistral.py +0 -0
  318. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/tokenizers/tokenizer_ollama.py +0 -0
  319. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/scrapegraphai/utils/tokenizers/tokenizer_openai.py +0 -0
  320. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/test +0 -0
  321. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/QUICKSTART.md +0 -0
  322. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/README_TESTING.md +0 -0
  323. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/Readme.md +0 -0
  324. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/conftest.py +0 -0
  325. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/fixtures/benchmarking.py +0 -0
  326. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/fixtures/helpers.py +0 -0
  327. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/fixtures/mock_server/__init__.py +0 -0
  328. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/fixtures/mock_server/server.py +0 -0
  329. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/graphs/.env.example +0 -0
  330. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/graphs/abstract_graph_test.py +0 -0
  331. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/graphs/code_generator_graph_openai_test.py +0 -0
  332. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/graphs/depth_search_graph_openai_test.py +0 -0
  333. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/graphs/inputs/books.xml +0 -0
  334. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/graphs/inputs/example.json +0 -0
  335. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/graphs/inputs/plain_html_example.txt +0 -0
  336. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/graphs/inputs/username.csv +0 -0
  337. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/graphs/scrape_plain_text_mistral_test.py +0 -0
  338. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/graphs/scrape_xml_ollama_test.py +0 -0
  339. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/graphs/screenshot_scraper_test.py +0 -0
  340. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/graphs/script_generator_test.py +0 -0
  341. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/graphs/search_graph_openai_test.py +0 -0
  342. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/graphs/search_link_ollama.py +0 -0
  343. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/graphs/smart_scraper_clod_test.py +0 -0
  344. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/graphs/smart_scraper_ernie_test.py +0 -0
  345. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/graphs/smart_scraper_fireworks_test.py +0 -0
  346. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/graphs/smart_scraper_multi_lite_graph_openai_test.py +0 -0
  347. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/graphs/smart_scraper_ollama_test.py +0 -0
  348. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/graphs/smart_scraper_openai_test.py +0 -0
  349. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/graphs/xml_scraper_openai_test.py +0 -0
  350. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/inputs/books.xml +0 -0
  351. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/inputs/example.json +0 -0
  352. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/inputs/plain_html_example.txt +0 -0
  353. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/inputs/username.csv +0 -0
  354. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/integration/__init__.py +0 -0
  355. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/integration/test_file_formats_integration.py +0 -0
  356. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/integration/test_multi_graph_integration.py +0 -0
  357. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/integration/test_smart_scraper_integration.py +0 -0
  358. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/nodes/fetch_node_test.py +0 -0
  359. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/nodes/inputs/books.xml +0 -0
  360. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/nodes/inputs/example.json +0 -0
  361. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/nodes/inputs/plain_html_example.txt +0 -0
  362. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/nodes/inputs/username.csv +0 -0
  363. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/nodes/robot_node_test.py +0 -0
  364. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/nodes/search_internet_node_test.py +0 -0
  365. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/nodes/search_link_node_test.py +0 -0
  366. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/test_atlascloud_model.py +0 -0
  367. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/test_batch_api.py +0 -0
  368. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/test_chromium.py +0 -0
  369. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/test_cleanup_html.py +0 -0
  370. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/test_csv_scraper_multi_graph.py +0 -0
  371. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/test_depth_search_graph.py +0 -0
  372. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/test_error_page_detection.py +0 -0
  373. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/test_fetch_node_timeout.py +0 -0
  374. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/test_generate_answer_node.py +0 -0
  375. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/test_json_scraper_graph.py +0 -0
  376. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/test_json_scraper_multi_graph.py +0 -0
  377. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/test_minimax_models.py +0 -0
  378. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/test_omni_search_graph.py +0 -0
  379. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/test_plasmate.py +0 -0
  380. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/test_scrape_do.py +0 -0
  381. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/test_script_creator_multi_graph.py +0 -0
  382. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/test_search_graph.py +0 -0
  383. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/test_smart_scraper_multi_concat_graph.py +0 -0
  384. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/utils/convert_to_md_test.py +0 -0
  385. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/utils/copy_utils_test.py +0 -0
  386. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/utils/output_parser_test.py +0 -0
  387. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/utils/parse_state_keys_test.py +0 -0
  388. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/utils/research_web_test.py +0 -0
  389. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/utils/test_proxy_rotation.py +0 -0
  390. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/tests/utils/test_sys_dynamic_import.py +0 -0
  391. {scrapegraphai-2.2.3 → scrapegraphai-2.2.4}/uv.lock +0 -0
@@ -1,3 +1,38 @@
1
+ ## [2.2.4](https://github.com/ScrapeGraphAI/Scrapegraph-ai/compare/v2.2.3...v2.2.4) (2026-09-07)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * 🐛 read SCRAPEGRAPHAI_TELEMETRY_ENABLED from the environment, not the config file ([8769c3b](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/8769c3bddd7c865963cc7e245eefb496f55dc519))
7
+ * **models:** add Gemini 2.5 token limits so they are not truncated to 8192 ([c21af20](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/c21af206862c13be1848eac75b4c04250718c8d9))
8
+ * **fetch:** surface HTTP errors and missing content instead of answering NA ([f91478e](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/f91478eacf86485f6b9efcf843fc0c815dde1ec5)), closes [#1102](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1102) [#1102](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1102)
9
+
10
+
11
+ ### CI
12
+
13
+ * **release:** 2.2.0-beta.10 [skip ci] ([0bb8bc9](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/0bb8bc935028b4f0a91444db2866ec0142f97199))
14
+ * **release:** 2.2.0-beta.7 [skip ci] ([decfc6b](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/decfc6bb6eb10a29ed6aaabb07244b8915042604))
15
+ * **release:** 2.2.0-beta.8 [skip ci] ([d59c3df](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/d59c3dfceecdacbba4e17f237b017117cf7f1cee)), closes [#1102](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1102) [#1102](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1102)
16
+ * **release:** 2.2.0-beta.9 [skip ci] ([3047ef8](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/3047ef8eda694d19c6fe4654777ea6343744acba))
17
+ * **release:** 2.2.4-beta.1 [skip ci] ([8b3a97c](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/8b3a97c3b41aec29df0512e71f186a98ad747aa1)), closes [#1102](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1102) [#1102](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1102) [#1102](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1102) [#1102](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1102)
18
+
19
+ ## [2.2.4-beta.1](https://github.com/ScrapeGraphAI/Scrapegraph-ai/compare/v2.2.3...v2.2.4-beta.1) (2026-09-07)
20
+
21
+
22
+ ### Bug Fixes
23
+
24
+ * 🐛 read SCRAPEGRAPHAI_TELEMETRY_ENABLED from the environment, not the config file ([8769c3b](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/8769c3bddd7c865963cc7e245eefb496f55dc519))
25
+ * **models:** add Gemini 2.5 token limits so they are not truncated to 8192 ([c21af20](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/c21af206862c13be1848eac75b4c04250718c8d9))
26
+ * **fetch:** surface HTTP errors and missing content instead of answering NA ([f91478e](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/f91478eacf86485f6b9efcf843fc0c815dde1ec5)), closes [#1102](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1102) [#1102](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1102)
27
+
28
+
29
+ ### CI
30
+
31
+ * **release:** 2.2.0-beta.10 [skip ci] ([0bb8bc9](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/0bb8bc935028b4f0a91444db2866ec0142f97199))
32
+ * **release:** 2.2.0-beta.7 [skip ci] ([decfc6b](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/decfc6bb6eb10a29ed6aaabb07244b8915042604))
33
+ * **release:** 2.2.0-beta.8 [skip ci] ([d59c3df](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/d59c3dfceecdacbba4e17f237b017117cf7f1cee)), closes [#1102](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1102) [#1102](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1102)
34
+ * **release:** 2.2.0-beta.9 [skip ci] ([3047ef8](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/3047ef8eda694d19c6fe4654777ea6343744acba))
35
+
1
36
  ## [2.2.3](https://github.com/ScrapeGraphAI/Scrapegraph-ai/compare/v2.2.2...v2.2.3) (2026-09-07)
2
37
 
3
38
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: scrapegraphai
3
- Version: 2.2.3
3
+ Version: 2.2.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
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "scrapegraphai"
3
3
 
4
- version = "2.2.3"
4
+ version = "2.2.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 = [
@@ -140,6 +140,11 @@ models_tokens = {
140
140
  "gemini-2.0-flash-latest": 1000000,
141
141
  "gemini-2.0-flash-exp": 1000000,
142
142
  "gemini-2.0-pro-exp": 2000000,
143
+ "gemini-2.5-flash": 1000000,
144
+ "gemini-2.5-flash-latest": 1000000,
145
+ "gemini-2.5-flash-lite": 1000000,
146
+ "gemini-2.5-pro": 1000000,
147
+ "gemini-flash-latest": 1000000,
143
148
  "models/embedding-001": 2048,
144
149
  },
145
150
  "google_vertexai": {
@@ -150,6 +155,10 @@ models_tokens = {
150
155
  "gemini-2.0-flash-exp": 1048576,
151
156
  "gemini-2.0-pro": 2000000,
152
157
  "gemini-2.0-pro-exp": 2000000,
158
+ "gemini-2.5-flash": 1048576,
159
+ "gemini-2.5-flash-lite": 1048576,
160
+ "gemini-2.5-pro": 1048576,
161
+ "gemini-flash-latest": 1048576,
153
162
  },
154
163
  "ollama": {
155
164
  "command-r": 12800,
@@ -36,6 +36,19 @@ def _load_config(config_location: str) -> configparser.ConfigParser:
36
36
  return config
37
37
 
38
38
 
39
+ def _parse_bool(value: str) -> bool:
40
+ """Parse a boolean from a string using configparser's accepted spellings.
41
+
42
+ Accepts the same values as the config file does, so
43
+ ``SCRAPEGRAPHAI_TELEMETRY_ENABLED=false`` and ``telemetry_enabled = false``
44
+ behave identically. Raises ValueError on anything unrecognised.
45
+ """
46
+ try:
47
+ return configparser.ConfigParser.BOOLEAN_STATES[value.strip().lower()]
48
+ except KeyError:
49
+ raise ValueError(f"invalid boolean value: {value!r}")
50
+
51
+
39
52
  def _check_config_and_environ_for_telemetry_flag(default_value: bool, config_obj):
40
53
  telemetry_enabled = default_value
41
54
  if "telemetry_enabled" in config_obj["DEFAULT"]:
@@ -44,13 +57,18 @@ def _check_config_and_environ_for_telemetry_flag(default_value: bool, config_obj
44
57
  except Exception:
45
58
  pass
46
59
 
47
- if os.environ.get("SCRAPEGRAPHAI_TELEMETRY_ENABLED") is not None:
60
+ env_value = os.environ.get("SCRAPEGRAPHAI_TELEMETRY_ENABLED")
61
+ if env_value is not None:
48
62
  try:
49
- telemetry_enabled = config_obj.getboolean(
50
- "DEFAULT", "telemetry_enabled"
63
+ telemetry_enabled = _parse_bool(env_value)
64
+ except ValueError:
65
+ logger.warning(
66
+ "SCRAPEGRAPHAI_TELEMETRY_ENABLED is set to %r, which is not a "
67
+ "recognised boolean. Telemetry is left at %s. Use one of: "
68
+ "true/false, yes/no, on/off, 1/0.",
69
+ env_value,
70
+ telemetry_enabled,
51
71
  )
52
- except Exception:
53
- pass
54
72
 
55
73
  return telemetry_enabled
56
74
 
@@ -7,9 +7,9 @@ class TestModelsTokens:
7
7
  def test_openai_tokens(self):
8
8
  """Test that the 'openai' provider exists and its tokens are valid positive integers."""
9
9
  openai_models = models_tokens.get("openai")
10
- assert openai_models is not None, (
11
- "'openai' key should be present in models_tokens"
12
- )
10
+ assert (
11
+ openai_models is not None
12
+ ), "'openai' key should be present in models_tokens"
13
13
  for model, token in openai_models.items():
14
14
  assert isinstance(model, str), "Model name should be a string"
15
15
  assert isinstance(token, int), "Token limit should be an integer"
@@ -30,19 +30,50 @@ class TestModelsTokens:
30
30
  assert google_genai is not None, "'google_genai' key should be present"
31
31
  assert google_vertexai is not None, "'google_vertexai' key should be present"
32
32
  # Check a specific key from google_genai
33
- assert "gemini-pro" in google_genai, (
34
- "'gemini-pro' should be in google_genai models"
35
- )
33
+ assert (
34
+ "gemini-pro" in google_genai
35
+ ), "'gemini-pro' should be in google_genai models"
36
36
  # Validate token values types
37
37
  for provider in [google_genai, google_vertexai]:
38
38
  for token in provider.values():
39
39
  assert isinstance(token, int), "Token limit must be an integer"
40
40
 
41
+ def test_gemini_2_5_models_are_registered(self):
42
+ """Gemini 2.5 / flash-latest must be in the table so they are not truncated to 8192.
43
+
44
+ #1121: an unknown model silently falls back to an 8192-token window.
45
+ google_genai/gemini-2.5-flash is the reported case; gemini-flash-latest
46
+ is the current flash alias. Both have a 1M input context.
47
+ """
48
+ google_genai = models_tokens["google_genai"]
49
+ google_vertexai = models_tokens["google_vertexai"]
50
+
51
+ for model in (
52
+ "gemini-2.5-flash",
53
+ "gemini-2.5-flash-latest",
54
+ "gemini-2.5-flash-lite",
55
+ "gemini-2.5-pro",
56
+ "gemini-flash-latest",
57
+ ):
58
+ assert (
59
+ google_genai.get(model) == 1000000
60
+ ), f"Expected 1M context for {model} in google_genai"
61
+
62
+ for model in (
63
+ "gemini-2.5-flash",
64
+ "gemini-2.5-flash-lite",
65
+ "gemini-2.5-pro",
66
+ "gemini-flash-latest",
67
+ ):
68
+ assert (
69
+ google_vertexai.get(model) == 1048576
70
+ ), f"Expected 1M context for {model} in google_vertexai"
71
+
41
72
  def test_non_existent_provider(self):
42
73
  """Test that a non-existent provider returns None."""
43
- assert models_tokens.get("non_existent") is None, (
44
- "Non-existent provider should return None"
45
- )
74
+ assert (
75
+ models_tokens.get("non_existent") is None
76
+ ), "Non-existent provider should return None"
46
77
 
47
78
  def test_total_model_keys(self):
48
79
  """Test that the total number of models across all providers is above an expected count."""
@@ -59,120 +90,120 @@ class TestModelsTokens:
59
90
  """Ensure that model token names are non-empty strings."""
60
91
  for provider, model_dict in models_tokens.items():
61
92
  for model in model_dict.keys():
62
- assert model != "", (
63
- f"Model name in provider '{provider}' should not be empty."
64
- )
93
+ assert (
94
+ model != ""
95
+ ), f"Model name in provider '{provider}' should not be empty."
65
96
 
66
97
  def test_token_limits_range(self):
67
98
  """Test that token limits for all models fall within a plausible range (e.g., 1 to 300000)."""
68
99
  for provider, model_dict in models_tokens.items():
69
100
  for model, token in model_dict.items():
70
- assert 1 <= token <= 1100000, (
71
- f"Token limit for {model} in provider {provider} is out of plausible range."
72
- )
101
+ assert (
102
+ 1 <= token <= 1100000
103
+ ), f"Token limit for {model} in provider {provider} is out of plausible range."
73
104
 
74
105
  def test_provider_structure(self):
75
106
  """Test that every provider in models_tokens has a dictionary as its value."""
76
107
  for provider, models in models_tokens.items():
77
- assert isinstance(models, dict), (
78
- f"Provider {provider} should map to a dictionary, got {type(models).__name__}"
79
- )
108
+ assert isinstance(
109
+ models, dict
110
+ ), f"Provider {provider} should map to a dictionary, got {type(models).__name__}"
80
111
 
81
112
  def test_non_empty_provider(self):
82
113
  """Test that each provider dictionary is not empty."""
83
114
  for provider, models in models_tokens.items():
84
- assert len(models) > 0, (
85
- f"Provider {provider} should contain at least one model."
86
- )
115
+ assert (
116
+ len(models) > 0
117
+ ), f"Provider {provider} should contain at least one model."
87
118
 
88
119
  def test_specific_model_token_values(self):
89
120
  """Test specific expected token values for selected models from various providers."""
90
121
  # Verify a token for a selected model from the 'openai' provider
91
122
  openai = models_tokens.get("openai")
92
- assert openai.get("gpt-3.5-turbo-0125") == 16385, (
93
- "Expected token limit for gpt-3.5-turbo-0125 in openai to be 16385"
94
- )
123
+ assert (
124
+ openai.get("gpt-3.5-turbo-0125") == 16385
125
+ ), "Expected token limit for gpt-3.5-turbo-0125 in openai to be 16385"
95
126
 
96
127
  # Verify a token for a selected model from the 'azure_openai' provider
97
128
  azure = models_tokens.get("azure_openai")
98
- assert azure.get("gpt-3.5") == 4096, (
99
- "Expected token limit for gpt-3.5 in azure_openai to be 4096"
100
- )
129
+ assert (
130
+ azure.get("gpt-3.5") == 4096
131
+ ), "Expected token limit for gpt-3.5 in azure_openai to be 4096"
101
132
 
102
133
  # Verify a token for a selected model from the 'anthropic' provider
103
134
  anthropic = models_tokens.get("anthropic")
104
- assert anthropic.get("claude_instant") == 100000, (
105
- "Expected token limit for claude_instant in anthropic to be 100000"
106
- )
135
+ assert (
136
+ anthropic.get("claude_instant") == 100000
137
+ ), "Expected token limit for claude_instant in anthropic to be 100000"
107
138
 
108
139
  def test_providers_count(self):
109
140
  """Test that the total number of providers is as expected (at least 15)."""
110
- assert len(models_tokens) >= 15, (
111
- "Expected at least 15 providers in models_tokens"
112
- )
141
+ assert (
142
+ len(models_tokens) >= 15
143
+ ), "Expected at least 15 providers in models_tokens"
113
144
 
114
145
  def test_non_existent_model(self):
115
146
  """Test that a non-existent model within a valid provider returns None."""
116
147
  openai = models_tokens.get("openai")
117
- assert openai.get("non_existent_model") is None, (
118
- "Non-existent model should return None from a valid provider."
119
- )
148
+ assert (
149
+ openai.get("non_existent_model") is None
150
+ ), "Non-existent model should return None from a valid provider."
120
151
 
121
152
  def test_no_whitespace_in_model_names(self):
122
153
  """Test that model names do not contain leading or trailing whitespace."""
123
154
  for provider, model_dict in models_tokens.items():
124
155
  for model in model_dict.keys():
125
156
  # Assert that stripping whitespace does not change the model name
126
- assert model == model.strip(), (
127
- f"Model name '{model}' in provider '{provider}' contains leading or trailing whitespace."
128
- )
157
+ assert (
158
+ model == model.strip()
159
+ ), f"Model name '{model}' in provider '{provider}' contains leading or trailing whitespace."
129
160
 
130
161
  def test_specific_models_additional(self):
131
162
  """Test specific token values for additional models across various providers."""
132
163
  # Check some models in the 'ollama' provider
133
164
  ollama = models_tokens.get("ollama")
134
- assert ollama.get("llama2") == 4096, (
135
- "Expected token limit for 'llama2' in ollama to be 4096"
136
- )
137
- assert ollama.get("llama2:70b") == 4096, (
138
- "Expected token limit for 'llama2:70b' in ollama to be 4096"
139
- )
165
+ assert (
166
+ ollama.get("llama2") == 4096
167
+ ), "Expected token limit for 'llama2' in ollama to be 4096"
168
+ assert (
169
+ ollama.get("llama2:70b") == 4096
170
+ ), "Expected token limit for 'llama2:70b' in ollama to be 4096"
140
171
 
141
172
  # Check a specific model from the 'mistralai' provider
142
173
  mistralai = models_tokens.get("mistralai")
143
- assert mistralai.get("open-codestral-mamba") == 256000, (
144
- "Expected token limit for 'open-codestral-mamba' in mistralai to be 256000"
145
- )
174
+ assert (
175
+ mistralai.get("open-codestral-mamba") == 256000
176
+ ), "Expected token limit for 'open-codestral-mamba' in mistralai to be 256000"
146
177
 
147
178
  # Check a specific model from the 'deepseek' provider
148
179
  deepseek = models_tokens.get("deepseek")
149
- assert deepseek.get("deepseek-chat") == 28672, (
150
- "Expected token limit for 'deepseek-chat' in deepseek to be 28672"
151
- )
180
+ assert (
181
+ deepseek.get("deepseek-chat") == 28672
182
+ ), "Expected token limit for 'deepseek-chat' in deepseek to be 28672"
152
183
 
153
184
  # Check a model from the 'ernie' provider
154
185
  ernie = models_tokens.get("ernie")
155
- assert ernie.get("ernie-bot") == 4096, (
156
- "Expected token limit for 'ernie-bot' in ernie to be 4096"
157
- )
186
+ assert (
187
+ ernie.get("ernie-bot") == 4096
188
+ ), "Expected token limit for 'ernie-bot' in ernie to be 4096"
158
189
 
159
190
  def test_nvidia_specific(self):
160
191
  """Test specific token value for 'meta/codellama-70b' in the nvidia provider."""
161
192
  nvidia = models_tokens.get("nvidia")
162
193
  assert nvidia is not None, "'nvidia' provider should exist"
163
194
  # Verify token for 'meta/codellama-70b' equals 16384 as defined in the nvidia dictionary
164
- assert nvidia.get("meta/codellama-70b") == 16384, (
165
- "Expected token limit for 'meta/codellama-70b' in nvidia to be 16384"
166
- )
195
+ assert (
196
+ nvidia.get("meta/codellama-70b") == 16384
197
+ ), "Expected token limit for 'meta/codellama-70b' in nvidia to be 16384"
167
198
 
168
199
  def test_groq_specific(self):
169
200
  """Test specific token value for 'claude-3-haiku-20240307\'' in the groq provider."""
170
201
  groq = models_tokens.get("groq")
171
202
  assert groq is not None, "'groq' provider should exist"
172
203
  # Note: The model name has an embedded apostrophe at the end in its name.
173
- assert groq.get("claude-3-haiku-20240307'") == 8192, (
174
- "Expected token limit for 'claude-3-haiku-20240307\\'' in groq to be 8192"
175
- )
204
+ assert (
205
+ groq.get("claude-3-haiku-20240307'") == 8192
206
+ ), "Expected token limit for 'claude-3-haiku-20240307\\'' in groq to be 8192"
176
207
 
177
208
  def test_togetherai_specific(self):
178
209
  """Test specific token value for 'meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo' in the toghetherai provider."""
@@ -180,15 +211,15 @@ class TestModelsTokens:
180
211
  assert togetherai is not None, "'toghetherai' provider should exist"
181
212
  expected = 128000
182
213
  model_name = "meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo"
183
- assert togetherai.get(model_name) == expected, (
184
- f"Expected token limit for '{model_name}' in toghetherai to be {expected}"
185
- )
214
+ assert (
215
+ togetherai.get(model_name) == expected
216
+ ), f"Expected token limit for '{model_name}' in toghetherai to be {expected}"
186
217
 
187
218
  def test_ernie_all_values(self):
188
219
  """Test that all models in the 'ernie' provider have token values exactly 4096."""
189
220
  ernie = models_tokens.get("ernie")
190
221
  assert ernie is not None, "'ernie' provider should exist"
191
222
  for model, token in ernie.items():
192
- assert token == 4096, (
193
- f"Expected token limit for '{model}' in ernie to be 4096, got {token}"
194
- )
223
+ assert (
224
+ token == 4096
225
+ ), f"Expected token limit for '{model}' in ernie to be 4096, got {token}"
@@ -0,0 +1,70 @@
1
+ """Tests for the telemetry opt-out flag.
2
+
3
+ These cover the environment variable path, which previously read its value from
4
+ the config file instead of from the variable, so `SCRAPEGRAPHAI_TELEMETRY_ENABLED=false`
5
+ left telemetry enabled.
6
+ """
7
+
8
+ import configparser
9
+
10
+ import pytest
11
+
12
+ from scrapegraphai.telemetry.telemetry import (
13
+ _check_config_and_environ_for_telemetry_flag,
14
+ _parse_bool,
15
+ )
16
+
17
+
18
+ def _config(**defaults):
19
+ cfg = configparser.ConfigParser()
20
+ cfg["DEFAULT"] = {k: str(v) for k, v in defaults.items()}
21
+ return cfg
22
+
23
+
24
+ class TestParseBool:
25
+ @pytest.mark.parametrize("value", ["false", "False", "FALSE", "no", "off", "0", " false "])
26
+ def test_falsey_spellings(self, value):
27
+ assert _parse_bool(value) is False
28
+
29
+ @pytest.mark.parametrize("value", ["true", "True", "yes", "on", "1"])
30
+ def test_truthy_spellings(self, value):
31
+ assert _parse_bool(value) is True
32
+
33
+ def test_rejects_nonsense(self):
34
+ with pytest.raises(ValueError):
35
+ _parse_bool("maybe")
36
+
37
+
38
+ class TestTelemetryFlag:
39
+ def test_defaults_to_the_given_default(self):
40
+ assert _check_config_and_environ_for_telemetry_flag(True, _config()) is True
41
+
42
+ def test_config_file_can_disable(self):
43
+ cfg = _config(telemetry_enabled="False")
44
+ assert _check_config_and_environ_for_telemetry_flag(True, cfg) is False
45
+
46
+ def test_env_var_disables_with_no_config_key(self, monkeypatch):
47
+ """The regression. Previously returned True, because the value was read
48
+ out of the config file rather than out of the environment variable."""
49
+ monkeypatch.setenv("SCRAPEGRAPHAI_TELEMETRY_ENABLED", "false")
50
+ assert _check_config_and_environ_for_telemetry_flag(True, _config()) is False
51
+
52
+ def test_env_var_overrides_the_config_file(self, monkeypatch):
53
+ monkeypatch.setenv("SCRAPEGRAPHAI_TELEMETRY_ENABLED", "false")
54
+ cfg = _config(telemetry_enabled="True")
55
+ assert _check_config_and_environ_for_telemetry_flag(True, cfg) is False
56
+
57
+ def test_env_var_can_also_enable(self, monkeypatch):
58
+ monkeypatch.setenv("SCRAPEGRAPHAI_TELEMETRY_ENABLED", "true")
59
+ cfg = _config(telemetry_enabled="False")
60
+ assert _check_config_and_environ_for_telemetry_flag(True, cfg) is True
61
+
62
+ def test_unparseable_env_var_leaves_the_flag_alone(self, monkeypatch):
63
+ monkeypatch.setenv("SCRAPEGRAPHAI_TELEMETRY_ENABLED", "banana")
64
+ cfg = _config(telemetry_enabled="False")
65
+ assert _check_config_and_environ_for_telemetry_flag(True, cfg) is False
66
+
67
+ def test_unset_env_var_leaves_the_config_in_charge(self, monkeypatch):
68
+ monkeypatch.delenv("SCRAPEGRAPHAI_TELEMETRY_ENABLED", raising=False)
69
+ cfg = _config(telemetry_enabled="False")
70
+ assert _check_config_and_environ_for_telemetry_flag(True, cfg) is False
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes