scrapegraphai 2.1.7__tar.gz → 2.2.0__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.1.7 → scrapegraphai-2.2.0}/.github/workflows/test-suite.yml +2 -0
- scrapegraphai-2.2.0/AGENTS.md +136 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/CHANGELOG.md +103 -2
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/PKG-INFO +1 -1
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/pyproject.toml +1 -1
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/generate_answer_node.py +5 -3
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/output_parser.py +41 -1
- scrapegraphai-2.2.0/tests/utils/output_parser_test.py +44 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/.gitattributes +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/.github/FUNDING.yml +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/.github/ISSUE_TEMPLATE/custom.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/.github/workflows/codeql.yml +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/.github/workflows/dependency-review.yml +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/.github/workflows/release.yml +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/.gitignore +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/.pre-commit-config.yaml +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/.releaserc.yml +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/.semantic-commits-applied +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/CODE_OF_CONDUCT.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/CONTRIBUTING.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/Dockerfile +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/LICENSE +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/Makefile +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/PullRequests/PR_1027_reviews.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/README.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/SECURITY.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/SEMANTIC_COMMITS.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/TESTING_INFRASTRUCTURE.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/citation.cff +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/codebeaver.yml +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docker-compose.yml +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/assets/api-banner.png +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/assets/api_banner.png +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/assets/apikey_1.png +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/assets/apikey_2.png +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/assets/apikey_3.png +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/assets/apikey_4.png +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/assets/browserbase_logo.png +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/assets/codespaces-badge.png +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/assets/histogram.png +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/assets/omniscrapergraph.png +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/assets/omnisearchgraph.png +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/assets/project_overview_diagram.fig +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/assets/project_overview_diagram.png +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/assets/scrapegraphai_logo.png +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/assets/scrapegraphai_logo.svg +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/assets/scriptcreatorgraph.png +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/assets/searchgraph.png +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/assets/sgai-hero.png +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/assets/smartscrapergraph.png +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/assets/speechgraph.png +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/chinese.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/french.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/german.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/italian.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/japanese.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/korean.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/portuguese.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/russian.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/spanish.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/timeout_configuration.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/docs/turkish.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/ScrapegraphAI_cookbook.ipynb +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/code_generator_graph/.env.example +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/code_generator_graph/README.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/code_generator_graph/ollama/code_generator_graph_ollama.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/code_generator_graph/openai/code_generator_graph_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/csv_scraper_graph/.env.example +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/csv_scraper_graph/README.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/csv_scraper_graph/ollama/csv_scraper_graph_multi_ollama.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/csv_scraper_graph/ollama/csv_scraper_ollama.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/csv_scraper_graph/ollama/inputs/username.csv +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/csv_scraper_graph/openai/csv_scraper_graph_multi_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/csv_scraper_graph/openai/csv_scraper_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/csv_scraper_graph/openai/inputs/username.csv +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/custom_graph/.env.example +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/custom_graph/README.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/custom_graph/ollama/custom_graph_ollama.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/custom_graph/openai/custom_graph_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/depth_search_graph/.env.example +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/depth_search_graph/README.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/depth_search_graph/ollama/depth_search_graph_ollama.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/depth_search_graph/openai/depth_search_graph_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/document_scraper_graph/.env.example +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/document_scraper_graph/README.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/document_scraper_graph/ollama/document_scraper_ollama.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/document_scraper_graph/ollama/inputs/plain_html_example.txt +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/document_scraper_graph/openai/document_scraper_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/document_scraper_graph/openai/inputs/markdown_example.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/document_scraper_graph/openai/inputs/plain_html_example.txt +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/extras/.env.example +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/extras/Savedscreenshots/test_image.jpeg +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/extras/authenticated_playwright.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/extras/browser_base_integration.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/extras/chromium_selenium.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/extras/cond_smartscraper_usage.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/extras/conditional_usage.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/extras/custom_prompt.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/extras/example.yml +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/extras/force_mode.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/extras/html_mode.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/extras/load_yml.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/extras/no_cut.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/extras/proxy_rotation.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/extras/rag_caching.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/extras/reasoning.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/extras/scrape_do.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/extras/screenshot_scaping.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/extras/serch_graph_scehma.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/extras/slow_mo.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/extras/undected_playwright.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/json_scraper_graph/.env.example +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/json_scraper_graph/README.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/json_scraper_graph/ollama/inputs/example.json +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/json_scraper_graph/ollama/json_scraper_multi_ollama.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/json_scraper_graph/ollama/json_scraper_ollama.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/json_scraper_graph/openai/inputs/example.json +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/json_scraper_graph/openai/json_scraper_multi_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/json_scraper_graph/openai/json_scraper_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/json_scraper_graph/openai/md_scraper_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/json_scraper_graph/openai/omni_scraper_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/markdownify/.env.example +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/markdownify/markdownify_scrapegraphai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/markdownify/markdownify_scrapegraphai_v3.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/markdownify/readme.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/omni_scraper_graph/.env.example +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/omni_scraper_graph/README.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/omni_scraper_graph/omni_search_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/readme.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/script_generator_graph/.env.example +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/script_generator_graph/README.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/script_generator_graph/ollama/script_generator_ollama.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/script_generator_graph/ollama/script_multi_generator_ollama.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/script_generator_graph/openai/script_generator_multi_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/script_generator_graph/openai/script_generator_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/script_generator_graph/openai/script_generator_schema_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/search_graph/.env.example +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/search_graph/README.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/search_graph/ollama/search_graph_ollama.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/search_graph/ollama/search_graph_schema_ollama.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/search_graph/openai/search_graph_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/search_graph/openai/search_graph_schema_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/search_graph/openai/search_link_graph_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/search_graph/scrapegraphai/.env.example +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/search_graph/scrapegraphai/readme.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/search_graph/scrapegraphai/searchscraper_scrapegraphai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/search_graph/scrapegraphai/searchscraper_scrapegraphai_v3.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/smart_scraper_graph/.env.example +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/smart_scraper_graph/nvidia/smart_scraper_nvidia.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/smart_scraper_graph/ollama/smart_scraper_lite_ollama.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/smart_scraper_graph/ollama/smart_scraper_multi_concat_ollama.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/smart_scraper_graph/ollama/smart_scraper_multi_lite_ollama.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/smart_scraper_graph/ollama/smart_scraper_multi_ollama.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/smart_scraper_graph/ollama/smart_scraper_ollama.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/smart_scraper_graph/ollama/smart_scraper_schema_ollama.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/smart_scraper_graph/openai/smart_scraper_lite_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/smart_scraper_graph/openai/smart_scraper_multi_concat_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/smart_scraper_graph/openai/smart_scraper_multi_lite_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/smart_scraper_graph/openai/smart_scraper_multi_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/smart_scraper_graph/openai/smart_scraper_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/smart_scraper_graph/openai/smart_scraper_schema_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/smart_scraper_graph/scrapegraphai/.env.example +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/smart_scraper_graph/scrapegraphai/readme.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/smart_scraper_graph/scrapegraphai/smartscraper_scrapegraphai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/smart_scraper_graph/scrapegraphai/smartscraper_scrapegraphai_v3.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/speech_graph/.env.example +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/speech_graph/README.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/speech_graph/speech_graph_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/xml_scraper_graph/.env.example +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/xml_scraper_graph/README.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/xml_scraper_graph/ollama/inputs/books.xml +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/xml_scraper_graph/ollama/xml_scraper_graph_multi_ollama.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/xml_scraper_graph/ollama/xml_scraper_ollama.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/xml_scraper_graph/openai/inputs/books.xml +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/xml_scraper_graph/openai/xml_scraper_graph_multi_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/xml_scraper_graph/openai/xml_scraper_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/media/banner.png +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/pytest.ini +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/__init__.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/builders/__init__.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/builders/graph_builder.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/docloaders/__init__.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/docloaders/browser_base.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/docloaders/chromium.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/docloaders/plasmate.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/docloaders/scrape_do.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/__init__.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/abstract_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/base_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/code_generator_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/csv_scraper_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/csv_scraper_multi_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/depth_search_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/document_scraper_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/document_scraper_multi_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/json_scraper_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/json_scraper_multi_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/markdownify_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/omni_scraper_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/omni_search_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/screenshot_scraper_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/script_creator_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/script_creator_multi_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/search_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/search_link_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/smart_scraper_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/smart_scraper_lite_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/smart_scraper_multi_batch_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/smart_scraper_multi_concat_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/smart_scraper_multi_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/smart_scraper_multi_lite_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/speech_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/xml_scraper_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/graphs/xml_scraper_multi_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/helpers/__init__.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/helpers/default_filters.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/helpers/models_tokens.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/helpers/nodes_metadata.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/helpers/robots.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/helpers/schemas.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/integrations/__init__.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/integrations/burr_bridge.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/integrations/indexify_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/integrations/scrapegraph_py_compat.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/models/__init__.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/models/atlascloud.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/models/clod.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/models/deepseek.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/models/minimax.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/models/nvidia.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/models/oneapi.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/models/openai_itt.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/models/openai_tts.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/models/xai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/__init__.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/base_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/batch_generate_answer_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/concat_answers_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/conditional_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/description_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/fetch_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/fetch_node_level_k.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/fetch_screen_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/generate_answer_csv_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/generate_answer_from_image_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/generate_answer_node_k_level.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/generate_answer_omni_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/generate_code_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/generate_scraper_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/get_probable_tags_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/graph_iterator_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/html_analyzer_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/image_to_text_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/markdownify_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/merge_answers_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/merge_generated_scripts_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/parse_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/parse_node_depth_k_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/prompt_refiner_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/rag_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/reasoning_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/robots_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/search_internet_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/search_link_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/search_node_with_context.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/nodes/text_to_speech_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/prompts/__init__.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/prompts/description_node_prompts.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/prompts/generate_answer_node_csv_prompts.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/prompts/generate_answer_node_omni_prompts.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/prompts/generate_answer_node_pdf_prompts.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/prompts/generate_answer_node_prompts.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/prompts/generate_code_node_prompts.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/prompts/get_probable_tags_node_prompts.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/prompts/html_analyzer_node_prompts.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/prompts/merge_answer_node_prompts.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/prompts/merge_generated_scripts_prompts.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/prompts/prompt_refiner_node_prompts.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/prompts/reasoning_node_prompts.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/prompts/robots_node_prompts.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/prompts/search_internet_node_prompts.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/prompts/search_link_node_prompts.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/prompts/search_node_with_context_prompts.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/telemetry/__init__.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/telemetry/telemetry.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/__init__.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/batch_api.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/cleanup_code.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/cleanup_html.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/code_error_analysis.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/code_error_correction.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/convert_to_md.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/copy.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/custom_callback.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/data_export.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/dict_content_compare.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/llm_callback_manager.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/logging.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/model_costs.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/parse_state_keys.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/prettify_exec_info.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/proxy_rotation.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/research_web.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/save_audio_from_bytes.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/save_code_to_file.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/schema_trasform.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/screenshot_scraping/__init__.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/screenshot_scraping/screenshot_preparation.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/screenshot_scraping/text_detection.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/split_text_into_chunks.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/sys_dynamic_import.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/tokenizer.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/tokenizers/tokenizer_mistral.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/tokenizers/tokenizer_ollama.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/scrapegraphai/utils/tokenizers/tokenizer_openai.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/test +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/QUICKSTART.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/README_TESTING.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/Readme.md +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/conftest.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/fixtures/benchmarking.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/fixtures/helpers.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/fixtures/mock_server/__init__.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/fixtures/mock_server/server.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/graphs/.env.example +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/graphs/abstract_graph_test.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/graphs/code_generator_graph_openai_test.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/graphs/depth_search_graph_openai_test.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/graphs/inputs/books.xml +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/graphs/inputs/example.json +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/graphs/inputs/plain_html_example.txt +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/graphs/inputs/username.csv +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/graphs/scrape_plain_text_mistral_test.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/graphs/scrape_xml_ollama_test.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/graphs/screenshot_scraper_test.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/graphs/script_generator_test.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/graphs/search_graph_openai_test.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/graphs/search_link_ollama.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/graphs/smart_scraper_clod_test.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/graphs/smart_scraper_ernie_test.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/graphs/smart_scraper_fireworks_test.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/graphs/smart_scraper_multi_lite_graph_openai_test.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/graphs/smart_scraper_ollama_test.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/graphs/smart_scraper_openai_test.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/graphs/xml_scraper_openai_test.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/inputs/books.xml +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/inputs/example.json +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/inputs/plain_html_example.txt +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/inputs/username.csv +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/integration/__init__.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/integration/test_file_formats_integration.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/integration/test_multi_graph_integration.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/integration/test_smart_scraper_integration.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/nodes/fetch_node_test.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/nodes/inputs/books.xml +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/nodes/inputs/example.json +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/nodes/inputs/plain_html_example.txt +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/nodes/inputs/username.csv +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/nodes/robot_node_test.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/nodes/search_internet_node_test.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/nodes/search_link_node_test.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/test_atlascloud_model.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/test_batch_api.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/test_chromium.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/test_cleanup_html.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/test_csv_scraper_multi_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/test_depth_search_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/test_fetch_node_timeout.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/test_generate_answer_node.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/test_json_scraper_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/test_json_scraper_multi_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/test_minimax_models.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/test_models_tokens.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/test_omni_search_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/test_plasmate.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/test_scrape_do.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/test_script_creator_multi_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/test_search_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/test_smart_scraper_multi_concat_graph.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/utils/convert_to_md_test.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/utils/copy_utils_test.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/utils/parse_state_keys_test.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/utils/research_web_test.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/utils/test_proxy_rotation.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/tests/utils/test_sys_dynamic_import.py +0 -0
- {scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/uv.lock +0 -0
|
@@ -38,6 +38,7 @@ jobs:
|
|
|
38
38
|
- name: Run unit tests
|
|
39
39
|
run: >
|
|
40
40
|
uv run pytest
|
|
41
|
+
tests/test_atlascloud_model.py
|
|
41
42
|
tests/test_batch_api.py
|
|
42
43
|
tests/test_csv_scraper_multi_graph.py
|
|
43
44
|
tests/test_depth_search_graph.py
|
|
@@ -46,4 +47,5 @@ jobs:
|
|
|
46
47
|
tests/test_scrape_do.py
|
|
47
48
|
tests/test_search_graph.py
|
|
48
49
|
tests/utils/convert_to_md_test.py
|
|
50
|
+
tests/utils/output_parser_test.py
|
|
49
51
|
tests/utils/parse_state_keys_test.py
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
Instructions for AI coding agents (Claude Code, Codex, Cursor, Copilot agents, …)
|
|
4
|
+
working on **ScrapeGraphAI**. Human contributors should read
|
|
5
|
+
[CONTRIBUTING.md](CONTRIBUTING.md); everything here is in addition to it.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. Golden rule: everything goes to `pre/beta`
|
|
10
|
+
|
|
11
|
+
**`main` is never written to directly. All work is based on and merged into `pre/beta`.**
|
|
12
|
+
|
|
13
|
+
`pre/beta` is the prerelease branch: pushes to it publish a `beta` prerelease via
|
|
14
|
+
semantic-release (see `.releaserc.yml`). `main` only receives releases when a
|
|
15
|
+
maintainer promotes `pre/beta`.
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# 1. always start from an up-to-date pre/beta
|
|
19
|
+
git fetch origin
|
|
20
|
+
git checkout -b feat/my-change origin/pre/beta
|
|
21
|
+
|
|
22
|
+
# 2. commit your work
|
|
23
|
+
git add <only the files you touched>
|
|
24
|
+
git commit -m "feat(nodes): add X"
|
|
25
|
+
|
|
26
|
+
# 3. push and open the PR against pre/beta
|
|
27
|
+
git push -u origin feat/my-change
|
|
28
|
+
gh pr create --base pre/beta --title "feat(nodes): add X" --body "..."
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Checklist before you commit:
|
|
32
|
+
|
|
33
|
+
- [ ] The branch is based on `origin/pre/beta` (`git merge-base --is-ancestor origin/pre/beta HEAD`).
|
|
34
|
+
- [ ] The PR base is `pre/beta`, **not** `main`.
|
|
35
|
+
- [ ] No commits directly on `main` or `pre/beta`, no force-push to either.
|
|
36
|
+
- [ ] One logical change per branch/PR.
|
|
37
|
+
|
|
38
|
+
If a task genuinely requires targeting `main` (e.g. a hotfix on a released
|
|
39
|
+
version), stop and ask a maintainer first.
|
|
40
|
+
|
|
41
|
+
## 2. Environment setup
|
|
42
|
+
|
|
43
|
+
Python `>=3.12`, dependencies managed with [uv](https://docs.astral.sh/uv/):
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
uv sync # create the venv and install deps
|
|
47
|
+
uv run pre-commit install # install the git hooks
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Never hand-edit `uv.lock`; regenerate it with `uv lock` / `uv sync` and commit
|
|
51
|
+
the result only when you actually changed dependencies in `pyproject.toml`.
|
|
52
|
+
|
|
53
|
+
## 3. Checks to run before pushing
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
make lint # ruff + black --check + isort --check-only
|
|
57
|
+
make type-check # mypy (strict)
|
|
58
|
+
make test # pytest with coverage
|
|
59
|
+
make pre-commit # run all hooks on all files
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Run at least `make lint` and the tests covering what you touched. Report the
|
|
63
|
+
real result: if something fails or you skipped a step, say so in the PR
|
|
64
|
+
description instead of implying a clean run.
|
|
65
|
+
|
|
66
|
+
Style: PEP 8 + Google Python docstrings, `black` formatting, line length 88.
|
|
67
|
+
Match the conventions of the surrounding file rather than introducing new ones.
|
|
68
|
+
|
|
69
|
+
## 4. Commit messages
|
|
70
|
+
|
|
71
|
+
Commits are parsed by semantic-release (Conventional Commits, `conventionalcommits`
|
|
72
|
+
preset), so the message decides the next version number. Use:
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
feat: ✨ new feature -> minor bump
|
|
76
|
+
fix: 🐛 bug fix -> patch bump
|
|
77
|
+
docs: 📚 documentation
|
|
78
|
+
style: 💅 formatting only
|
|
79
|
+
refactor: ♻️ no behaviour change
|
|
80
|
+
perf: ⚡ performance
|
|
81
|
+
test: 🧪 tests
|
|
82
|
+
build: 📦 build system / deps
|
|
83
|
+
ci: 🤖 CI configuration
|
|
84
|
+
chore: 🧹 everything else
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Format: `type(optional-scope): imperative summary`, optional body, and
|
|
88
|
+
`BREAKING CHANGE:` in the footer for incompatible changes. Reference issues with
|
|
89
|
+
`Fixes #123`.
|
|
90
|
+
|
|
91
|
+
## 5. Files agents must not touch
|
|
92
|
+
|
|
93
|
+
- `CHANGELOG.md` and the `version` field in `pyproject.toml` — owned by
|
|
94
|
+
semantic-release; editing them by hand breaks releases.
|
|
95
|
+
- Git tags and release notes on GitHub.
|
|
96
|
+
- `.github/workflows/*` — only when the task is explicitly about CI.
|
|
97
|
+
- Anything under `htmlcov/`, `coverage.xml`, `.pytest_cache/`, `__pycache__/`:
|
|
98
|
+
build artifacts, never commit them.
|
|
99
|
+
|
|
100
|
+
Also: never commit secrets. API keys go in a local `.env` (git-ignored) and are
|
|
101
|
+
read via `os.getenv`; examples and tests must use placeholders such as
|
|
102
|
+
`OPENAI_APIKEY` from the environment.
|
|
103
|
+
|
|
104
|
+
## 6. Repository layout
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
scrapegraphai/
|
|
108
|
+
├── graphs/ # pipelines (SmartScraperGraph, SearchGraph, …)
|
|
109
|
+
├── nodes/ # single graph steps (FetchNode, ParseNode, GenerateAnswerNode, …)
|
|
110
|
+
├── models/ # LLM wrappers and token/model metadata
|
|
111
|
+
├── docloaders/ # loaders (ChromiumLoader, …)
|
|
112
|
+
├── prompts/ # prompt templates
|
|
113
|
+
├── helpers/ # shared constants and schemas
|
|
114
|
+
├── integrations/ # third-party / managed-API integrations
|
|
115
|
+
└── utils/ # utilities (html cleanup, tokenization, …)
|
|
116
|
+
examples/ # runnable usage examples, one folder per graph
|
|
117
|
+
tests/ # pytest suite, mirrors the package layout
|
|
118
|
+
docs/ # documentation sources
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
When adding a node or graph, register it in the corresponding `__init__.py` and
|
|
122
|
+
add a test under `tests/` next to the existing ones for that layer. New
|
|
123
|
+
user-facing features need an entry in `examples/` and, when they change public
|
|
124
|
+
behaviour, a docs update.
|
|
125
|
+
|
|
126
|
+
## 7. Working style expected from agents
|
|
127
|
+
|
|
128
|
+
- Prefer small, reviewable diffs; do not reformat or "clean up" untouched files.
|
|
129
|
+
- Do not add dependencies unless the task requires it — say why in the PR.
|
|
130
|
+
- Write all commits, PR titles/bodies, issue comments, code comments and
|
|
131
|
+
docstrings **in English**.
|
|
132
|
+
- Do not delete or rewrite existing tests to make a change pass.
|
|
133
|
+
- If a test is already failing on `pre/beta`, mention it rather than silently
|
|
134
|
+
fixing unrelated things in the same PR.
|
|
135
|
+
- Never commit other people's in-progress work: check `git status` and stage
|
|
136
|
+
only the files belonging to your change.
|
|
@@ -1,3 +1,68 @@
|
|
|
1
|
+
## [2.2.0](https://github.com/ScrapeGraphAI/Scrapegraph-ai/compare/v2.1.7...v2.2.0) (2026-08-19)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* add OpenAI Batch API support for SmartScraperMultiGraph ([#1036](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1036)) ([9d4eba1](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/9d4eba1f154953e401982da7eff85686293b9a48))
|
|
7
|
+
* upgrade MiniMax default model to M3 ([#1080](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1080)) ([1b16c26](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/1b16c268f4e9044c1386ccfaf67b38692b487e5a))
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Bug Fixes
|
|
11
|
+
|
|
12
|
+
* lazy imports to prevent torchcodec FFmpeg DLL crash on Windows ([#1089](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1089)) ([2f55377](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/2f55377010fb16c81655aa1c8d08b88daa880797))
|
|
13
|
+
* **nodes:** tolerate doubled-brace JSON output from models like DeepSeek ([#1085](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1085)) ([aaa5d2c](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/aaa5d2cf6d2657f8e8a3b9020ab8b40cdb311c46))
|
|
14
|
+
* update broken test imports to match current API ([536e5ad](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/536e5adcde179a12ec146bd8a10cbf654e0eeeaa))
|
|
15
|
+
* **batch:** use langchain_core.prompts for PromptTemplate import ([24127da](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/24127dad8c049601befd0e9157ec8a26609b45e1))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Docs
|
|
19
|
+
|
|
20
|
+
* add AGENTS.md with contribution rules for AI agents ([3b2f986](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/3b2f986612bbc70879a0337197a1064cf5875245))
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
### CI
|
|
24
|
+
|
|
25
|
+
* **release:** 1.60.0-beta.2 [skip ci] ([54d1473](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/54d147309dc7a1ce1b191c3e4feb927ee3ff4392)), closes [#1036](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1036)
|
|
26
|
+
* **release:** 1.60.0-beta.3 [skip ci] ([637c696](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/637c696da77da1bb916a4ece03bd66fea50be47e))
|
|
27
|
+
* **release:** 1.76.0-beta.1 [skip ci] ([35ec272](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/35ec272b6f267a164fac67a26787396db548e2a7)), closes [#1036](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1036) [#1036](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1036)
|
|
28
|
+
* **release:** 2.1.0-beta.1 [skip ci] ([a2ea9eb](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/a2ea9eb45f1406aac054e057c19a6bbf806fc38a)), closes [#1036](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1036) [#1036](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1036) [#1036](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1036) [#1036](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1036)
|
|
29
|
+
* **release:** 2.2.0-beta.1 [skip ci] ([e7a75dc](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/e7a75dcb465feaa4ff2f87cf63777658728ecf3f)), closes [#1036](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1036) [#1036](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1036) [#1036](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1036) [#1036](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1036) [#1036](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1036) [#1036](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1036) [#1036](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1036) [#1036](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1036)
|
|
30
|
+
* **release:** 2.2.0-beta.2 [skip ci] ([73d850c](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/73d850c60d63d31201678de2cc1da68a9216b976)), closes [#1080](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1080)
|
|
31
|
+
* **release:** 2.2.0-beta.3 [skip ci] ([b528325](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/b528325f04ccaf84010decb32ca32efd6c281f90)), closes [#1076](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1076) [#1074](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1074) [#1076](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1076) [#1074](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1074)
|
|
32
|
+
* **release:** 2.2.0-beta.4 [skip ci] ([861ab77](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/861ab770abbe03314561f91835b1ac40ad6499f8)), closes [#1085](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1085)
|
|
33
|
+
* **release:** 2.2.0-beta.5 [skip ci] ([87655f8](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/87655f8208cd4814c34d9ebba55932c20817d7a1)), closes [#1089](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1089)
|
|
34
|
+
* **release:** 2.2.0-beta.6 [skip ci] ([cb8f9b5](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/cb8f9b58e0e9a7c27b2178a4818e6cdd5f9f07a1)), closes [#1121](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1121) [#1089](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1089) [#1092](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1092) [#1100](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1100) [#1082](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1082) [#1082](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1082) [#1103](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1103) [#1091](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1091) [#1082](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1082) [#1082](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1082) [#1089](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1089) [#1092](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1092) [#1100](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1100) [#1091](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1091) [#1095](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1095) [#1103](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1103) [#1121](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1121) [#1095](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1095) [#1104](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1104) [#1085](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1085)
|
|
35
|
+
* run the two new deterministic unit suites ([23e3d06](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/23e3d064e3850de222bcfc13907695278ca3bba9)), closes [#1104](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1104) [#1085](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1085)
|
|
36
|
+
|
|
37
|
+
## [2.2.0-beta.6](https://github.com/ScrapeGraphAI/Scrapegraph-ai/compare/v2.2.0-beta.5...v2.2.0-beta.6) (2026-08-19)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
### Bug Fixes
|
|
41
|
+
|
|
42
|
+
* **graph:** expose when the 8192 token fallback was used ([470da9d](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/470da9d51d6220a8020ee8a1d91b618d3d622042)), closes [#1121](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1121)
|
|
43
|
+
* lazy imports to prevent torchcodec FFmpeg DLL crash on Windows ([#1089](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1089)) ([#1092](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1092)) ([e5c2a42](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/e5c2a4292174bae948731379c88aafb14197ec6c))
|
|
44
|
+
* pop model_tokens so it is not forwarded to the model client ([#1100](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1100)) ([d2b970c](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/d2b970ca77da64b6b6b91fa2353f2e41b9cfe105))
|
|
45
|
+
* **search:** restore SearchGraph by migrating DuckDuckGo backend to ddgs ([#1083](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1083)) ([2139e37](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/2139e37c0addfb9039e3b985bb33801f20e4e05b)), closes [#1082](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1082) [#1082](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1082)
|
|
46
|
+
* update MiniMax model metadata and endpoints ([#1103](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1103)) ([e5f8f2b](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/e5f8f2bf008cd7ce7f3d5980bf6f98e6153b2264))
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
### Docs
|
|
50
|
+
|
|
51
|
+
* add AGENTS.md with contribution rules for AI agents ([3b2f986](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/3b2f986612bbc70879a0337197a1064cf5875245))
|
|
52
|
+
* **readme:** add Open Source vs Managed API comparison ([#1091](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1091)) ([ef3523b](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/ef3523b1e1c62052b5c0e6b14cebe7933441a7e5))
|
|
53
|
+
* swap Integrations infographic for new API banner; fix CTA links ([71ab440](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/71ab4406867ef02c22349c2dedc18c57d8bdfdec))
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
### CI
|
|
57
|
+
|
|
58
|
+
* **release:** 2.1.3 [skip ci] ([cfb815f](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/cfb815fb0bba3dfc8262a24a7ddab28e22e13893)), closes [#1082](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1082) [#1082](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1082)
|
|
59
|
+
* **release:** 2.1.4 [skip ci] ([7fc9c57](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/7fc9c57a0bb861d829f38ed672e35c5ba0e6c79c)), closes [#1089](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1089) [#1092](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1092)
|
|
60
|
+
* **release:** 2.1.5 [skip ci] ([c9e0bd0](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/c9e0bd036a1f5def8ac92759cda90ba52e3b35e5)), closes [#1100](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1100) [#1091](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1091) [#1095](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1095)
|
|
61
|
+
* **release:** 2.1.6 [skip ci] ([27d9d28](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/27d9d289f964844a28006f6d7d1518e293fd49ff)), closes [#1103](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1103)
|
|
62
|
+
* **release:** 2.1.7 [skip ci] ([ca112db](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/ca112db4d8b1bd34961e9f1b7e3adf0c7d600c01)), closes [#1121](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1121)
|
|
63
|
+
* run only deterministic unit suites in Test Suite workflow ([#1095](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1095)) ([037a42e](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/037a42ed73354c8b3eabd9dcc28236152602ef9e))
|
|
64
|
+
* run the two new deterministic unit suites ([23e3d06](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/23e3d064e3850de222bcfc13907695278ca3bba9)), closes [#1104](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1104) [#1085](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1085)
|
|
65
|
+
|
|
1
66
|
## [2.1.7](https://github.com/ScrapeGraphAI/Scrapegraph-ai/compare/v2.1.6...v2.1.7) (2026-08-19)
|
|
2
67
|
|
|
3
68
|
|
|
@@ -68,6 +133,44 @@
|
|
|
68
133
|
## [2.2.0-beta.2](https://github.com/ScrapeGraphAI/Scrapegraph-ai/compare/v2.2.0-beta.1...v2.2.0-beta.2) (2026-06-01)
|
|
69
134
|
|
|
70
135
|
|
|
136
|
+
### Features
|
|
137
|
+
|
|
138
|
+
* upgrade MiniMax default model to M3 ([#1080](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1080)) ([1b16c26](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/1b16c268f4e9044c1386ccfaf67b38692b487e5a))
|
|
139
|
+
|
|
140
|
+
## [2.2.0-beta.5](https://github.com/ScrapeGraphAI/Scrapegraph-ai/compare/v2.2.0-beta.4...v2.2.0-beta.5) (2026-06-23)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
### Bug Fixes
|
|
144
|
+
|
|
145
|
+
* lazy imports to prevent torchcodec FFmpeg DLL crash on Windows ([#1089](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1089)) ([2f55377](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/2f55377010fb16c81655aa1c8d08b88daa880797))
|
|
146
|
+
|
|
147
|
+
## [2.2.0-beta.4](https://github.com/ScrapeGraphAI/Scrapegraph-ai/compare/v2.2.0-beta.3...v2.2.0-beta.4) (2026-06-11)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
### Bug Fixes
|
|
151
|
+
|
|
152
|
+
* **nodes:** tolerate doubled-brace JSON output from models like DeepSeek ([#1085](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1085)) ([aaa5d2c](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/aaa5d2cf6d2657f8e8a3b9020ab8b40cdb311c46))
|
|
153
|
+
|
|
154
|
+
## [2.2.0-beta.3](https://github.com/ScrapeGraphAI/Scrapegraph-ai/compare/v2.2.0-beta.2...v2.2.0-beta.3) (2026-06-01)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
### Bug Fixes
|
|
158
|
+
|
|
159
|
+
* **nodes:** update outdated ChatOllama import path to langchain_ollama ([#1076](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1076)) ([e6054cb](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/e6054cbf19a7fe940899ea70b30706f676f86fa7))
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
### Docs
|
|
163
|
+
|
|
164
|
+
* 📚 Standardize and fix links across translated READMEs ([#1074](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1074)) ([458d36a](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/458d36a6b83f4a412206cdbe9935a059e9d47f57))
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
### CI
|
|
168
|
+
|
|
169
|
+
* **release:** 2.1.2 [skip ci] ([210c992](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/210c99280048863774fa27053412185a5c18150d)), closes [#1076](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1076) [#1074](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1074)
|
|
170
|
+
|
|
171
|
+
## [2.2.0-beta.2](https://github.com/ScrapeGraphAI/Scrapegraph-ai/compare/v2.2.0-beta.1...v2.2.0-beta.2) (2026-06-01)
|
|
172
|
+
|
|
173
|
+
|
|
71
174
|
### Features
|
|
72
175
|
|
|
73
176
|
* upgrade MiniMax default model to M3 ([#1080](https://github.com/ScrapeGraphAI/Scrapegraph-ai/issues/1080)) ([1b16c26](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/1b16c268f4e9044c1386ccfaf67b38692b487e5a))
|
|
@@ -1608,7 +1711,6 @@ Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
|
|
1608
1711
|
|
|
1609
1712
|
* implement ScrapeGraph class for only web scraping automation ([612c644](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/612c644623fa6f4fe77a64a5f1a6a4d6cd5f4254))
|
|
1610
1713
|
* Implement SmartScraperMultiParseMergeFirstGraph class that scrapes a list of URLs and merge the content first and finally generates answers to a given prompt. ([3e3e1b2](https://github.com/ScrapeGraphAI/Scrapegraph-ai/commit/3e3e1b2f3ae8ed803d03b3b44b199e139baa68d4))
|
|
1611
|
-
=======
|
|
1612
1714
|
## [1.26.7](https://github.com/ScrapeGraphAI/Scrapegraph-ai/compare/v1.26.6...v1.26.7) (2024-10-19)
|
|
1613
1715
|
|
|
1614
1716
|
|
|
@@ -3682,7 +3784,6 @@ Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
|
|
3682
3784
|
* **release:** 1.6.1 [skip ci] ([44fbd71](https://github.com/VinciGit00/Scrapegraph-ai/commit/44fbd71742a57a4b10f22ed33781bb67aa77e58d))
|
|
3683
3785
|
|
|
3684
3786
|
## [1.6.1](https://github.com/VinciGit00/Scrapegraph-ai/compare/v1.6.0...v1.6.1) (2024-06-15)
|
|
3685
|
-
=======
|
|
3686
3787
|
|
|
3687
3788
|
|
|
3688
3789
|
### Bug Fixes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: scrapegraphai
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.2.0
|
|
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
|
|
@@ -9,7 +9,6 @@ from typing import List, Optional
|
|
|
9
9
|
from langchain_core.prompts import PromptTemplate
|
|
10
10
|
from langchain_aws import ChatBedrock
|
|
11
11
|
from langchain_ollama import ChatOllama
|
|
12
|
-
from langchain_core.output_parsers import JsonOutputParser
|
|
13
12
|
from langchain_core.runnables import RunnableParallel
|
|
14
13
|
from langchain_openai import ChatOpenAI
|
|
15
14
|
from requests.exceptions import Timeout
|
|
@@ -23,7 +22,10 @@ from ..prompts import (
|
|
|
23
22
|
TEMPLATE_NO_CHUNKS,
|
|
24
23
|
TEMPLATE_NO_CHUNKS_MD,
|
|
25
24
|
)
|
|
26
|
-
from ..utils.output_parser import
|
|
25
|
+
from ..utils.output_parser import (
|
|
26
|
+
TolerantJsonOutputParser,
|
|
27
|
+
get_pydantic_output_parser,
|
|
28
|
+
)
|
|
27
29
|
from .base_node import BaseNode
|
|
28
30
|
|
|
29
31
|
|
|
@@ -148,7 +150,7 @@ class GenerateAnswerNode(BaseNode):
|
|
|
148
150
|
format_instructions = ""
|
|
149
151
|
else:
|
|
150
152
|
if not isinstance(self.llm_model, ChatBedrock):
|
|
151
|
-
output_parser =
|
|
153
|
+
output_parser = TolerantJsonOutputParser()
|
|
152
154
|
format_instructions = (
|
|
153
155
|
"You must respond with a JSON object. Your response should be formatted as a valid JSON "
|
|
154
156
|
"with a 'content' field containing your analysis. For example:\n"
|
|
@@ -2,13 +2,53 @@
|
|
|
2
2
|
Functions to retrieve the correct output parser and format instructions for the LLM model.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
-
from typing import Any, Callable, Dict, Type, Union
|
|
5
|
+
from typing import Any, Callable, Dict, List, Type, Union
|
|
6
6
|
|
|
7
|
+
from langchain_core.exceptions import OutputParserException
|
|
8
|
+
from langchain_core.outputs import Generation
|
|
7
9
|
from langchain_core.output_parsers import JsonOutputParser
|
|
8
10
|
from pydantic import BaseModel as BaseModelV2
|
|
9
11
|
from pydantic.v1 import BaseModel as BaseModelV1
|
|
10
12
|
|
|
11
13
|
|
|
14
|
+
def _strip_doubled_braces(text: str) -> str:
|
|
15
|
+
"""Strip one layer of the doubled braces some models echo from the prompt.
|
|
16
|
+
|
|
17
|
+
The default ``format_instructions`` show the expected shape using LangChain's
|
|
18
|
+
escaped braces, e.g. ``{{"content": "..."}}``. Strongly instruction-following
|
|
19
|
+
models (GPT-4o, etc.) emit single braces, but some models (notably DeepSeek)
|
|
20
|
+
copy the doubled braces verbatim, producing ``{{"content": "..."}}`` which is
|
|
21
|
+
not valid JSON. This normalizes that single case and is a no-op otherwise.
|
|
22
|
+
"""
|
|
23
|
+
stripped = text.strip()
|
|
24
|
+
if stripped.startswith("{{") and stripped.endswith("}}"):
|
|
25
|
+
return stripped[1:-1]
|
|
26
|
+
return text
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class TolerantJsonOutputParser(JsonOutputParser):
|
|
30
|
+
"""A :class:`JsonOutputParser` tolerant of doubled-brace output.
|
|
31
|
+
|
|
32
|
+
Behaviour is unchanged on the happy path: valid JSON is parsed by the parent
|
|
33
|
+
parser exactly as before. Only when parsing fails AND the output is wrapped in
|
|
34
|
+
doubled braces (``{{ ... }}``) does it retry once with a single layer of braces
|
|
35
|
+
removed. This keeps providers like DeepSeek working without altering output for
|
|
36
|
+
any model that already returns clean JSON.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
def parse_result(self, result: List[Generation], *, partial: bool = False) -> Any:
|
|
40
|
+
try:
|
|
41
|
+
return super().parse_result(result, partial=partial)
|
|
42
|
+
except OutputParserException:
|
|
43
|
+
text = result[0].text
|
|
44
|
+
normalized = _strip_doubled_braces(text)
|
|
45
|
+
if normalized != text:
|
|
46
|
+
return super().parse_result(
|
|
47
|
+
[Generation(text=normalized)], partial=partial
|
|
48
|
+
)
|
|
49
|
+
raise
|
|
50
|
+
|
|
51
|
+
|
|
12
52
|
def get_structured_output_parser(
|
|
13
53
|
schema: Union[Dict[str, Any], Type[BaseModelV1 | BaseModelV2], Type],
|
|
14
54
|
) -> Callable:
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""Tests for scrapegraphai.utils.output_parser.TolerantJsonOutputParser."""
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
|
|
5
|
+
from scrapegraphai.utils.output_parser import (
|
|
6
|
+
TolerantJsonOutputParser,
|
|
7
|
+
_strip_doubled_braces,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def test_strip_doubled_braces_unwraps_single_layer():
|
|
12
|
+
assert _strip_doubled_braces('{{"content": "hi"}}') == '{"content": "hi"}'
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def test_strip_doubled_braces_is_noop_for_clean_json():
|
|
16
|
+
text = '{"content": "hi"}'
|
|
17
|
+
assert _strip_doubled_braces(text) == text
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def test_strip_doubled_braces_ignores_unbalanced():
|
|
21
|
+
text = '{{"content": "hi"}'
|
|
22
|
+
assert _strip_doubled_braces(text) == text
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def test_tolerant_parser_parses_clean_json_unchanged():
|
|
26
|
+
parser = TolerantJsonOutputParser()
|
|
27
|
+
assert parser.parse('{"content": "hi"}') == {"content": "hi"}
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def test_tolerant_parser_recovers_doubled_braces():
|
|
31
|
+
"""Models such as DeepSeek echo the prompt's escaped braces verbatim."""
|
|
32
|
+
parser = TolerantJsonOutputParser()
|
|
33
|
+
assert parser.parse('{{"content": "hi"}}') == {"content": "hi"}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def test_tolerant_parser_recovers_doubled_braces_with_whitespace():
|
|
37
|
+
parser = TolerantJsonOutputParser()
|
|
38
|
+
assert parser.parse(' {{"content": "hi"}} ') == {"content": "hi"}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def test_tolerant_parser_still_raises_on_irrecoverable_output():
|
|
42
|
+
parser = TolerantJsonOutputParser()
|
|
43
|
+
with pytest.raises(Exception):
|
|
44
|
+
parser.parse("this is not json at all")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/csv_scraper_graph/ollama/csv_scraper_ollama.py
RENAMED
|
File without changes
|
{scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/csv_scraper_graph/ollama/inputs/username.csv
RENAMED
|
File without changes
|
|
File without changes
|
{scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/csv_scraper_graph/openai/csv_scraper_openai.py
RENAMED
|
File without changes
|
{scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/csv_scraper_graph/openai/inputs/username.csv
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/custom_graph/ollama/custom_graph_ollama.py
RENAMED
|
File without changes
|
{scrapegraphai-2.1.7 → scrapegraphai-2.2.0}/examples/custom_graph/openai/custom_graph_openai.py
RENAMED
|
File without changes
|