scrapegraphai 2.2.2__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.
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/CHANGELOG.md +47 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/PKG-INFO +1 -1
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/chinese.md +6 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/french.md +6 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/german.md +6 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/italian.md +6 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/japanese.md +6 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/korean.md +6 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/portuguese.md +6 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/russian.md +6 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/spanish.md +6 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/turkish.md +6 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/pyproject.toml +1 -1
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/helpers/models_tokens.py +9 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/telemetry/telemetry.py +23 -5
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/proxy_rotation.py +11 -6
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/test_models_tokens.py +97 -66
- scrapegraphai-2.2.4/tests/test_telemetry_flag.py +70 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/utils/test_proxy_rotation.py +13 -2
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/.gitattributes +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/.github/FUNDING.yml +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/.github/ISSUE_TEMPLATE/custom.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/.github/workflows/codeql.yml +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/.github/workflows/dependency-review.yml +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/.github/workflows/release.yml +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/.github/workflows/test-suite.yml +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/.gitignore +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/.pre-commit-config.yaml +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/.releaserc.yml +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/.semantic-commits-applied +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/AGENTS.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/CODE_OF_CONDUCT.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/CONTRIBUTING.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/Dockerfile +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/LICENSE +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/Makefile +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/PullRequests/PR_1027_reviews.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/README.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/SECURITY.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/SEMANTIC_COMMITS.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/TESTING_INFRASTRUCTURE.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/citation.cff +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/codebeaver.yml +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docker-compose.yml +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/assets/api-banner.png +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/assets/api_banner.png +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/assets/apikey_1.png +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/assets/apikey_2.png +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/assets/apikey_3.png +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/assets/apikey_4.png +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/assets/browserbase_logo.png +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/assets/codespaces-badge.png +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/assets/histogram.png +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/assets/nodemaven-banner.png +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/assets/omniscrapergraph.png +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/assets/omnisearchgraph.png +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/assets/project_overview_diagram.fig +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/assets/project_overview_diagram.png +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/assets/scrapegraphai_logo.png +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/assets/scrapegraphai_logo.svg +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/assets/scriptcreatorgraph.png +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/assets/searchgraph.png +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/assets/sgai-hero.png +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/assets/smartscrapergraph.png +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/assets/speechgraph.png +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/docs/timeout_configuration.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/ScrapegraphAI_cookbook.ipynb +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/code_generator_graph/.env.example +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/code_generator_graph/README.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/code_generator_graph/ollama/code_generator_graph_ollama.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/code_generator_graph/openai/code_generator_graph_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/csv_scraper_graph/.env.example +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/csv_scraper_graph/README.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/csv_scraper_graph/ollama/csv_scraper_graph_multi_ollama.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/csv_scraper_graph/ollama/csv_scraper_ollama.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/csv_scraper_graph/ollama/inputs/username.csv +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/csv_scraper_graph/openai/csv_scraper_graph_multi_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/csv_scraper_graph/openai/csv_scraper_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/csv_scraper_graph/openai/inputs/username.csv +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/custom_graph/.env.example +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/custom_graph/README.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/custom_graph/ollama/custom_graph_ollama.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/custom_graph/openai/custom_graph_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/depth_search_graph/.env.example +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/depth_search_graph/README.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/depth_search_graph/ollama/depth_search_graph_ollama.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/depth_search_graph/openai/depth_search_graph_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/document_scraper_graph/.env.example +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/document_scraper_graph/README.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/document_scraper_graph/ollama/document_scraper_ollama.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/document_scraper_graph/ollama/inputs/plain_html_example.txt +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/document_scraper_graph/openai/document_scraper_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/document_scraper_graph/openai/inputs/markdown_example.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/document_scraper_graph/openai/inputs/plain_html_example.txt +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/extras/.env.example +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/extras/Savedscreenshots/test_image.jpeg +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/extras/authenticated_playwright.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/extras/browser_base_integration.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/extras/chromium_selenium.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/extras/cond_smartscraper_usage.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/extras/conditional_usage.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/extras/custom_prompt.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/extras/example.yml +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/extras/force_mode.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/extras/html_mode.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/extras/load_yml.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/extras/no_cut.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/extras/proxy_rotation.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/extras/rag_caching.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/extras/reasoning.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/extras/scrape_do.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/extras/screenshot_scaping.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/extras/serch_graph_scehma.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/extras/slow_mo.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/extras/undected_playwright.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/json_scraper_graph/.env.example +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/json_scraper_graph/README.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/json_scraper_graph/ollama/inputs/example.json +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/json_scraper_graph/ollama/json_scraper_multi_ollama.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/json_scraper_graph/ollama/json_scraper_ollama.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/json_scraper_graph/openai/inputs/example.json +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/json_scraper_graph/openai/json_scraper_multi_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/json_scraper_graph/openai/json_scraper_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/json_scraper_graph/openai/md_scraper_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/json_scraper_graph/openai/omni_scraper_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/markdownify/.env.example +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/markdownify/markdownify_scrapegraphai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/markdownify/markdownify_scrapegraphai_v3.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/markdownify/readme.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/omni_scraper_graph/.env.example +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/omni_scraper_graph/README.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/omni_scraper_graph/omni_search_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/readme.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/script_generator_graph/.env.example +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/script_generator_graph/README.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/script_generator_graph/ollama/script_generator_ollama.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/script_generator_graph/ollama/script_multi_generator_ollama.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/script_generator_graph/openai/script_generator_multi_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/script_generator_graph/openai/script_generator_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/script_generator_graph/openai/script_generator_schema_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/search_graph/.env.example +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/search_graph/README.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/search_graph/ollama/search_graph_ollama.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/search_graph/ollama/search_graph_schema_ollama.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/search_graph/openai/search_graph_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/search_graph/openai/search_graph_schema_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/search_graph/openai/search_link_graph_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/search_graph/scrapegraphai/.env.example +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/search_graph/scrapegraphai/readme.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/search_graph/scrapegraphai/searchscraper_scrapegraphai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/search_graph/scrapegraphai/searchscraper_scrapegraphai_v3.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/.env.example +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/nvidia/smart_scraper_nvidia.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/ollama/smart_scraper_lite_ollama.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/ollama/smart_scraper_multi_concat_ollama.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/ollama/smart_scraper_multi_lite_ollama.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/ollama/smart_scraper_multi_ollama.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/ollama/smart_scraper_ollama.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/ollama/smart_scraper_schema_ollama.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/openai/smart_scraper_lite_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/openai/smart_scraper_multi_concat_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/openai/smart_scraper_multi_lite_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/openai/smart_scraper_multi_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/openai/smart_scraper_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/openai/smart_scraper_schema_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/scrapegraphai/.env.example +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/scrapegraphai/readme.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/scrapegraphai/smartscraper_scrapegraphai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/smart_scraper_graph/scrapegraphai/smartscraper_scrapegraphai_v3.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/speech_graph/.env.example +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/speech_graph/README.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/speech_graph/speech_graph_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/xml_scraper_graph/.env.example +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/xml_scraper_graph/README.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/xml_scraper_graph/ollama/inputs/books.xml +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/xml_scraper_graph/ollama/xml_scraper_graph_multi_ollama.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/xml_scraper_graph/ollama/xml_scraper_ollama.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/xml_scraper_graph/openai/inputs/books.xml +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/xml_scraper_graph/openai/xml_scraper_graph_multi_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/examples/xml_scraper_graph/openai/xml_scraper_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/media/banner.png +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/pytest.ini +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/__init__.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/builders/__init__.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/builders/graph_builder.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/docloaders/__init__.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/docloaders/browser_base.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/docloaders/chromium.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/docloaders/plasmate.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/docloaders/scrape_do.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/__init__.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/abstract_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/base_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/code_generator_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/csv_scraper_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/csv_scraper_multi_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/depth_search_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/document_scraper_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/document_scraper_multi_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/json_scraper_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/json_scraper_multi_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/markdownify_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/omni_scraper_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/omni_search_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/screenshot_scraper_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/script_creator_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/script_creator_multi_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/search_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/search_link_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/smart_scraper_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/smart_scraper_lite_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/smart_scraper_multi_batch_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/smart_scraper_multi_concat_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/smart_scraper_multi_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/smart_scraper_multi_lite_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/speech_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/xml_scraper_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/graphs/xml_scraper_multi_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/helpers/__init__.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/helpers/default_filters.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/helpers/nodes_metadata.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/helpers/robots.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/helpers/schemas.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/integrations/__init__.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/integrations/burr_bridge.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/integrations/indexify_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/integrations/scrapegraph_py_compat.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/models/__init__.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/models/atlascloud.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/models/clod.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/models/deepseek.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/models/minimax.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/models/nvidia.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/models/oneapi.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/models/openai_itt.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/models/openai_tts.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/models/xai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/__init__.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/base_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/batch_generate_answer_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/concat_answers_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/conditional_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/description_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/fetch_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/fetch_node_level_k.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/fetch_screen_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/generate_answer_csv_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/generate_answer_from_image_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/generate_answer_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/generate_answer_node_k_level.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/generate_answer_omni_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/generate_code_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/generate_scraper_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/get_probable_tags_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/graph_iterator_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/html_analyzer_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/image_to_text_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/markdownify_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/merge_answers_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/merge_generated_scripts_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/parse_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/parse_node_depth_k_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/prompt_refiner_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/rag_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/reasoning_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/robots_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/search_internet_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/search_link_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/search_node_with_context.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/nodes/text_to_speech_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/prompts/__init__.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/prompts/description_node_prompts.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/prompts/generate_answer_node_csv_prompts.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/prompts/generate_answer_node_omni_prompts.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/prompts/generate_answer_node_pdf_prompts.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/prompts/generate_answer_node_prompts.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/prompts/generate_code_node_prompts.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/prompts/get_probable_tags_node_prompts.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/prompts/html_analyzer_node_prompts.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/prompts/merge_answer_node_prompts.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/prompts/merge_generated_scripts_prompts.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/prompts/prompt_refiner_node_prompts.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/prompts/reasoning_node_prompts.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/prompts/robots_node_prompts.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/prompts/search_internet_node_prompts.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/prompts/search_link_node_prompts.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/prompts/search_node_with_context_prompts.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/telemetry/__init__.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/__init__.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/batch_api.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/cleanup_code.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/cleanup_html.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/code_error_analysis.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/code_error_correction.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/convert_to_md.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/copy.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/custom_callback.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/data_export.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/dict_content_compare.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/llm_callback_manager.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/logging.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/model_costs.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/output_parser.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/parse_state_keys.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/prettify_exec_info.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/research_web.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/save_audio_from_bytes.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/save_code_to_file.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/schema_trasform.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/screenshot_scraping/__init__.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/screenshot_scraping/screenshot_preparation.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/screenshot_scraping/text_detection.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/split_text_into_chunks.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/sys_dynamic_import.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/tokenizer.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/tokenizers/tokenizer_mistral.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/tokenizers/tokenizer_ollama.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/scrapegraphai/utils/tokenizers/tokenizer_openai.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/test +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/QUICKSTART.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/README_TESTING.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/Readme.md +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/conftest.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/fixtures/benchmarking.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/fixtures/helpers.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/fixtures/mock_server/__init__.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/fixtures/mock_server/server.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/graphs/.env.example +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/graphs/abstract_graph_test.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/graphs/code_generator_graph_openai_test.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/graphs/depth_search_graph_openai_test.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/graphs/inputs/books.xml +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/graphs/inputs/example.json +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/graphs/inputs/plain_html_example.txt +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/graphs/inputs/username.csv +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/graphs/scrape_plain_text_mistral_test.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/graphs/scrape_xml_ollama_test.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/graphs/screenshot_scraper_test.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/graphs/script_generator_test.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/graphs/search_graph_openai_test.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/graphs/search_link_ollama.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/graphs/smart_scraper_clod_test.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/graphs/smart_scraper_ernie_test.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/graphs/smart_scraper_fireworks_test.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/graphs/smart_scraper_multi_lite_graph_openai_test.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/graphs/smart_scraper_ollama_test.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/graphs/smart_scraper_openai_test.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/graphs/xml_scraper_openai_test.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/inputs/books.xml +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/inputs/example.json +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/inputs/plain_html_example.txt +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/inputs/username.csv +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/integration/__init__.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/integration/test_file_formats_integration.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/integration/test_multi_graph_integration.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/integration/test_smart_scraper_integration.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/nodes/fetch_node_test.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/nodes/inputs/books.xml +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/nodes/inputs/example.json +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/nodes/inputs/plain_html_example.txt +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/nodes/inputs/username.csv +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/nodes/robot_node_test.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/nodes/search_internet_node_test.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/nodes/search_link_node_test.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/test_atlascloud_model.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/test_batch_api.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/test_chromium.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/test_cleanup_html.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/test_csv_scraper_multi_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/test_depth_search_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/test_error_page_detection.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/test_fetch_node_timeout.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/test_generate_answer_node.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/test_json_scraper_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/test_json_scraper_multi_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/test_minimax_models.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/test_omni_search_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/test_plasmate.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/test_scrape_do.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/test_script_creator_multi_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/test_search_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/test_smart_scraper_multi_concat_graph.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/utils/convert_to_md_test.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/utils/copy_utils_test.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/utils/output_parser_test.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/utils/parse_state_keys_test.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/utils/research_web_test.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/tests/utils/test_sys_dynamic_import.py +0 -0
- {scrapegraphai-2.2.2 → scrapegraphai-2.2.4}/uv.lock +0 -0
|
@@ -1,3 +1,50 @@
|
|
|
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
|
+
|
|
36
|
+
## [2.2.3](https://github.com/ScrapeGraphAI/Scrapegraph-ai/compare/v2.2.2...v2.2.3) (2026-09-07)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
### Bug Fixes
|
|
40
|
+
|
|
41
|
+
* **proxy:** handle schemeless proxy server format and broker routing ([70dbd2d](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/70dbd2d26d63bdc7473293371a275a4d856737f9))
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
### Docs
|
|
45
|
+
|
|
46
|
+
* add NodeMaven sponsor to all README languages ([cc8568c](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/cc8568cc76f765f3d2bd2db0bdf5018d347af101))
|
|
47
|
+
|
|
1
48
|
## [2.2.2](https://github.com/ScrapeGraphAI/Scrapegraph-ai/compare/v2.2.1...v2.2.2) (2026-08-23)
|
|
2
49
|
|
|
3
50
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: scrapegraphai
|
|
3
|
-
Version: 2.2.
|
|
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
|
|
@@ -158,6 +158,12 @@ print(json.dumps(result, indent=4))
|
|
|
158
158
|
|
|
159
159
|
ScrapeGraphAI 的文档可以在[这里](https://docs.scrapegraphai.com/introduction)找到。
|
|
160
160
|
|
|
161
|
+
## 🏆 赞助商
|
|
162
|
+
|
|
163
|
+
[](https://go.nodemaven.com/scrapegraphyai)
|
|
164
|
+
|
|
165
|
+
ScrapeGraphAI 用户优惠码:`SCRAPEGRAPH35`(移动和住宅代理 35% 折扣),`SCRAPEGRAPH40`(ISP / 静态代理 40% 折扣)。
|
|
166
|
+
|
|
161
167
|
## 🤝 贡献
|
|
162
168
|
|
|
163
169
|
欢迎贡献并加入我们的 Discord 服务器与我们讨论改进和提出建议!
|
|
@@ -160,6 +160,12 @@ N'oubliez pas d'installer [Ollama](https://ollama.com/) et de télécharger les
|
|
|
160
160
|
|
|
161
161
|
La documentation pour ScrapeGraphAI se trouve [ici](https://docs.scrapegraphai.com/introduction).
|
|
162
162
|
|
|
163
|
+
## 🏆 Sponsors
|
|
164
|
+
|
|
165
|
+
[](https://go.nodemaven.com/scrapegraphyai)
|
|
166
|
+
|
|
167
|
+
Codes pour les utilisateurs de ScrapeGraphAI : `SCRAPEGRAPH35` (35 % sur les proxies mobile et résidentiels), `SCRAPEGRAPH40` (40 % sur les proxies ISP / statiques).
|
|
168
|
+
|
|
163
169
|
## 🤝 Contribuer
|
|
164
170
|
|
|
165
171
|
N'hésitez pas à contribuer et à rejoindre notre serveur Discord pour discuter avec nous des améliorations et nous donner des suggestions !
|
|
@@ -160,6 +160,12 @@ Denken Sie daran, [Ollama](https://ollama.com/) installiert zu haben und die Mod
|
|
|
160
160
|
|
|
161
161
|
Die Dokumentation zu ScrapeGraphAI finden Sie [hier](https://docs.scrapegraphai.com/introduction).
|
|
162
162
|
|
|
163
|
+
## 🏆 Sponsoren
|
|
164
|
+
|
|
165
|
+
[](https://go.nodemaven.com/scrapegraphyai)
|
|
166
|
+
|
|
167
|
+
Codes für ScrapeGraphAI-Nutzer: `SCRAPEGRAPH35` (35 % auf Mobile- und Residential-Proxys), `SCRAPEGRAPH40` (40 % auf ISP- / Static-Proxys).
|
|
168
|
+
|
|
163
169
|
## 🤝 Mitwirken
|
|
164
170
|
|
|
165
171
|
Fühlen Sie sich frei, beizutragen und treten Sie unserem Discord-Server bei, um mit uns über Verbesserungen zu diskutieren und uns Vorschläge zu machen!
|
|
@@ -162,6 +162,12 @@ Ricordati di avere [Ollama](https://ollama.com/) installato e di scaricare i mod
|
|
|
162
162
|
La documentazione di ScrapeGraphAI è disponibile [qui](https://scrapegraph-ai.readthedocs.io/en/latest/).
|
|
163
163
|
Consulta anche il Docusaurus [qui](https://docs-oss.scrapegraphai.com/).
|
|
164
164
|
|
|
165
|
+
## 🏆 Sponsor
|
|
166
|
+
|
|
167
|
+
[](https://go.nodemaven.com/scrapegraphyai)
|
|
168
|
+
|
|
169
|
+
Codici per gli utenti ScrapeGraphAI: `SCRAPEGRAPH35` (35% su proxy mobile e residenziali), `SCRAPEGRAPH40` (40% su proxy ISP / statici).
|
|
170
|
+
|
|
165
171
|
## 🤝 Vuoi contribuire?
|
|
166
172
|
|
|
167
173
|
Sentiti libero di contribuire e unisciti al nostro server Discord per discutere con noi su cosa migliorare e darci suggerimenti!
|
|
@@ -158,6 +158,12 @@ print(json.dumps(result, indent=4))
|
|
|
158
158
|
|
|
159
159
|
ScrapeGraphAIのドキュメントは[こちら](https://docs.scrapegraphai.com/introduction)で見ることができます。
|
|
160
160
|
|
|
161
|
+
## 🏆 スポンサー
|
|
162
|
+
|
|
163
|
+
[](https://go.nodemaven.com/scrapegraphyai)
|
|
164
|
+
|
|
165
|
+
ScrapeGraphAI ユーザー向けコード:`SCRAPEGRAPH35`(モバイル / 住宅用プロキシ 35% オフ)、`SCRAPEGRAPH40`(ISP / 静的プロキシ 40% オフ)。
|
|
166
|
+
|
|
161
167
|
## 🤝 貢献
|
|
162
168
|
|
|
163
169
|
貢献を歓迎し、Discordサーバーで改善や提案について話し合います!
|
|
@@ -158,6 +158,12 @@ OpenAI, Groq, Azure, Gemini와 같은 API를 통해 다양한 LLM을 사용할
|
|
|
158
158
|
|
|
159
159
|
ScrapeGraphAI 관련 문서는 [여기](https://docs.scrapegraphai.com/introduction)에서 확인하실 수 있습니다.
|
|
160
160
|
|
|
161
|
+
## 🏆 스폰서
|
|
162
|
+
|
|
163
|
+
[](https://go.nodemaven.com/scrapegraphyai)
|
|
164
|
+
|
|
165
|
+
ScrapeGraphAI 사용자 코드: `SCRAPEGRAPH35` (모바일 및 주거용 프록시 35% 할인), `SCRAPEGRAPH40` (ISP / 고정 프록시 40% 할인).
|
|
166
|
+
|
|
161
167
|
## 🤝 기여
|
|
162
168
|
|
|
163
169
|
자유롭게 기여하고 Discord 서버에 참여하여 개선 사항을 논의하고 제안해 주세요!
|
|
@@ -158,6 +158,12 @@ Lembre-se de ter o [Ollama](https://ollama.com/) instalado e baixar os modelos u
|
|
|
158
158
|
|
|
159
159
|
A documentação do ScrapeGraphAI pode ser encontrada [aqui](https://docs.scrapegraphai.com/introduction).
|
|
160
160
|
|
|
161
|
+
## 🏆 Patrocinadores
|
|
162
|
+
|
|
163
|
+
[](https://go.nodemaven.com/scrapegraphyai)
|
|
164
|
+
|
|
165
|
+
Códigos para usuários do ScrapeGraphAI: `SCRAPEGRAPH35` (35% em proxies móveis e residenciais), `SCRAPEGRAPH40` (40% em proxies ISP / estáticos).
|
|
166
|
+
|
|
161
167
|
## 🤝 Contribuindo
|
|
162
168
|
|
|
163
169
|
Sinta-se à vontade para contribuir e junte-se ao nosso servidor Discord para discutir melhorias e nos dar sugestões!
|
|
@@ -158,6 +158,12 @@ print(json.dumps(result, indent=4))
|
|
|
158
158
|
|
|
159
159
|
Документация для ScrapeGraphAI доступна [здесь](https://docs.scrapegraphai.com/introduction).
|
|
160
160
|
|
|
161
|
+
## 🏆 Спонсоры
|
|
162
|
+
|
|
163
|
+
[](https://go.nodemaven.com/scrapegraphyai)
|
|
164
|
+
|
|
165
|
+
Коды для пользователей ScrapeGraphAI: `SCRAPEGRAPH35` (скидка 35% на mobile и residential-прокси), `SCRAPEGRAPH40` (скидка 40% на ISP / static-прокси).
|
|
166
|
+
|
|
161
167
|
## 🤝 Участие
|
|
162
168
|
|
|
163
169
|
Не стесняйтесь вносить свой вклад и присоединяйтесь к нашему серверу Discord, чтобы обсудить с нами улучшения и дать нам предложения!
|
|
@@ -165,6 +165,12 @@ Recuerda tener [Ollama](https://ollama.com/) instalado y descargar los modelos c
|
|
|
165
165
|
|
|
166
166
|
La documentación de ScrapeGraphAI está disponible [aquí](https://docs.scrapegraphai.com/introduction).
|
|
167
167
|
|
|
168
|
+
## 🏆 Patrocinadores
|
|
169
|
+
|
|
170
|
+
[](https://go.nodemaven.com/scrapegraphyai)
|
|
171
|
+
|
|
172
|
+
Códigos para usuarios de ScrapeGraphAI: `SCRAPEGRAPH35` (35% en proxies móviles y residenciales), `SCRAPEGRAPH40` (40% en proxies ISP / estáticos).
|
|
173
|
+
|
|
168
174
|
## 🤝 Contribuciones
|
|
169
175
|
|
|
170
176
|
¡Siéntete libre de contribuir y únete a nuestro servidor de Discord para discutir mejoras y compartir sugerencias!
|
|
@@ -159,6 +159,12 @@ Yerel modelleri kullanmak istiyorsanız, [Ollama](https://ollama.com/) kurulu ol
|
|
|
159
159
|
|
|
160
160
|
ScrapeGraphAI dokümantasyonuna [buradan](https://docs.scrapegraphai.com/introduction) ulaşabilirsiniz.
|
|
161
161
|
|
|
162
|
+
## 🏆 Sponsorlar
|
|
163
|
+
|
|
164
|
+
[](https://go.nodemaven.com/scrapegraphyai)
|
|
165
|
+
|
|
166
|
+
ScrapeGraphAI kullanıcıları için kodlar: `SCRAPEGRAPH35` (mobil ve residential proxy'lerde %35 indirim), `SCRAPEGRAPH40` (ISP / static proxy'lerde %40 indirim).
|
|
167
|
+
|
|
162
168
|
## 🤝 Katkıda Bulunun
|
|
163
169
|
|
|
164
170
|
Projeye katkıda bulunmaktan çekinmeyin ve geliştirmeleri tartışmak ve bize önerilerde bulunmak için Discord sunucumuza katılın!
|
|
@@ -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
|
-
|
|
60
|
+
env_value = os.environ.get("SCRAPEGRAPHAI_TELEMETRY_ENABLED")
|
|
61
|
+
if env_value is not None:
|
|
48
62
|
try:
|
|
49
|
-
telemetry_enabled =
|
|
50
|
-
|
|
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
|
|
|
@@ -142,18 +142,18 @@ def _parse_proxy(proxy: ProxySettings) -> ProxySettings:
|
|
|
142
142
|
"""
|
|
143
143
|
assert "server" in proxy, "missing server in the proxy configuration"
|
|
144
144
|
|
|
145
|
-
|
|
145
|
+
authorization = [x in proxy for x in ("username", "password")]
|
|
146
146
|
|
|
147
147
|
message = "username and password must be provided in pairs or not at all"
|
|
148
148
|
|
|
149
|
-
assert all(
|
|
149
|
+
assert all(authorization) or not any(authorization), message
|
|
150
150
|
|
|
151
151
|
parsed = {"server": proxy["server"]}
|
|
152
152
|
|
|
153
153
|
if proxy.get("bypass"):
|
|
154
154
|
parsed["bypass"] = proxy["bypass"]
|
|
155
155
|
|
|
156
|
-
if all(
|
|
156
|
+
if all(authorization):
|
|
157
157
|
parsed["username"] = proxy["username"]
|
|
158
158
|
parsed["password"] = proxy["password"]
|
|
159
159
|
|
|
@@ -192,9 +192,14 @@ def parse_or_search_proxy(proxy: Proxy) -> ProxySettings:
|
|
|
192
192
|
"""
|
|
193
193
|
Parses a proxy configuration or searches for a matching one via broker.
|
|
194
194
|
"""
|
|
195
|
-
assert "server" in proxy, "
|
|
195
|
+
assert "server" in proxy, "missing server in the proxy configuration"
|
|
196
|
+
|
|
197
|
+
server = proxy["server"]
|
|
198
|
+
if server == "broker":
|
|
199
|
+
return _search_proxy(proxy)
|
|
196
200
|
|
|
197
|
-
|
|
201
|
+
server_with_scheme = server if "://" in server else f"http://{server}"
|
|
202
|
+
parsed_url = urlparse(server_with_scheme)
|
|
198
203
|
server_address = parsed_url.hostname
|
|
199
204
|
|
|
200
205
|
if server_address is None:
|
|
@@ -206,6 +211,6 @@ def parse_or_search_proxy(proxy: Proxy) -> ProxySettings:
|
|
|
206
211
|
):
|
|
207
212
|
return _parse_proxy(proxy)
|
|
208
213
|
|
|
209
|
-
assert proxy["server"] == "broker", f"
|
|
214
|
+
assert proxy["server"] == "broker", f"unknown proxy server type: {proxy['server']}"
|
|
210
215
|
|
|
211
216
|
return _search_proxy(proxy)
|
|
@@ -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
|
|
11
|
-
|
|
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
|
|
34
|
-
"
|
|
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
|
|
44
|
-
"
|
|
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
|
|
63
|
-
|
|
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
|
|
71
|
-
|
|
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(
|
|
78
|
-
|
|
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
|
|
85
|
-
|
|
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
|
|
93
|
-
"
|
|
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
|
|
99
|
-
"
|
|
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
|
|
105
|
-
"
|
|
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
|
|
111
|
-
|
|
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
|
|
118
|
-
"
|
|
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
|
|
127
|
-
|
|
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
|
|
135
|
-
"
|
|
136
|
-
)
|
|
137
|
-
assert
|
|
138
|
-
"
|
|
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
|
|
144
|
-
"
|
|
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
|
|
150
|
-
"
|
|
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
|
|
156
|
-
"
|
|
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
|
|
165
|
-
"
|
|
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
|
|
174
|
-
"
|
|
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
|
|
184
|
-
|
|
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
|
|
193
|
-
|
|
194
|
-
)
|
|
223
|
+
assert (
|
|
224
|
+
token == 4096
|
|
225
|
+
), f"Expected token limit for '{model}' in ernie to be 4096, got {token}"
|