scrapegraphai 2.2.0b3__tar.gz → 2.2.0b4__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.0b3 → scrapegraphai-2.2.0b4}/CHANGELOG.md +7 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/PKG-INFO +1 -1
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/pyproject.toml +1 -1
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/generate_answer_node.py +5 -3
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/output_parser.py +41 -1
- scrapegraphai-2.2.0b4/tests/utils/output_parser_test.py +44 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/.gitattributes +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/.github/FUNDING.yml +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/.github/ISSUE_TEMPLATE/custom.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/.github/workflows/codeql.yml +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/.github/workflows/dependency-review.yml +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/.github/workflows/release.yml +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/.github/workflows/test-suite.yml +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/.gitignore +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/.pre-commit-config.yaml +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/.releaserc.yml +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/.semantic-commits-applied +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/CODE_OF_CONDUCT.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/CONTRIBUTING.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/Dockerfile +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/LICENSE +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/Makefile +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/PullRequests/PR_1027_reviews.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/README.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/SECURITY.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/SEMANTIC_COMMITS.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/TESTING_INFRASTRUCTURE.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/citation.cff +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/codebeaver.yml +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docker-compose.yml +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/assets/api-banner.png +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/assets/api_banner.png +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/assets/apikey_1.png +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/assets/apikey_2.png +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/assets/apikey_3.png +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/assets/apikey_4.png +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/assets/browserbase_logo.png +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/assets/codespaces-badge.png +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/assets/histogram.png +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/assets/omniscrapergraph.png +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/assets/omnisearchgraph.png +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/assets/project_overview_diagram.fig +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/assets/project_overview_diagram.png +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/assets/scrapegraphai_logo.png +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/assets/scrapegraphai_logo.svg +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/assets/scriptcreatorgraph.png +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/assets/searchgraph.png +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/assets/sgai-hero.png +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/assets/smartscrapergraph.png +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/assets/speechgraph.png +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/chinese.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/french.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/german.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/italian.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/japanese.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/korean.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/portuguese.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/russian.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/spanish.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/timeout_configuration.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/docs/turkish.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/ScrapegraphAI_cookbook.ipynb +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/code_generator_graph/.env.example +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/code_generator_graph/README.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/code_generator_graph/ollama/code_generator_graph_ollama.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/code_generator_graph/openai/code_generator_graph_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/csv_scraper_graph/.env.example +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/csv_scraper_graph/README.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/csv_scraper_graph/ollama/csv_scraper_graph_multi_ollama.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/csv_scraper_graph/ollama/csv_scraper_ollama.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/csv_scraper_graph/ollama/inputs/username.csv +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/csv_scraper_graph/openai/csv_scraper_graph_multi_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/csv_scraper_graph/openai/csv_scraper_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/csv_scraper_graph/openai/inputs/username.csv +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/custom_graph/.env.example +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/custom_graph/README.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/custom_graph/ollama/custom_graph_ollama.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/custom_graph/openai/custom_graph_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/depth_search_graph/.env.example +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/depth_search_graph/README.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/depth_search_graph/ollama/depth_search_graph_ollama.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/depth_search_graph/openai/depth_search_graph_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/document_scraper_graph/.env.example +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/document_scraper_graph/README.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/document_scraper_graph/ollama/document_scraper_ollama.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/document_scraper_graph/ollama/inputs/plain_html_example.txt +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/document_scraper_graph/openai/document_scraper_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/document_scraper_graph/openai/inputs/markdown_example.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/document_scraper_graph/openai/inputs/plain_html_example.txt +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/extras/.env.example +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/extras/Savedscreenshots/test_image.jpeg +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/extras/authenticated_playwright.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/extras/browser_base_integration.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/extras/chromium_selenium.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/extras/cond_smartscraper_usage.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/extras/conditional_usage.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/extras/custom_prompt.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/extras/example.yml +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/extras/force_mode.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/extras/html_mode.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/extras/load_yml.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/extras/no_cut.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/extras/proxy_rotation.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/extras/rag_caching.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/extras/reasoning.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/extras/scrape_do.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/extras/screenshot_scaping.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/extras/serch_graph_scehma.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/extras/slow_mo.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/extras/undected_playwright.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/json_scraper_graph/.env.example +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/json_scraper_graph/README.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/json_scraper_graph/ollama/inputs/example.json +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/json_scraper_graph/ollama/json_scraper_multi_ollama.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/json_scraper_graph/ollama/json_scraper_ollama.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/json_scraper_graph/openai/inputs/example.json +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/json_scraper_graph/openai/json_scraper_multi_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/json_scraper_graph/openai/json_scraper_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/json_scraper_graph/openai/md_scraper_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/json_scraper_graph/openai/omni_scraper_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/markdownify/.env.example +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/markdownify/markdownify_scrapegraphai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/markdownify/markdownify_scrapegraphai_v3.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/markdownify/readme.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/omni_scraper_graph/.env.example +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/omni_scraper_graph/README.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/omni_scraper_graph/omni_search_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/readme.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/script_generator_graph/.env.example +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/script_generator_graph/README.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/script_generator_graph/ollama/script_generator_ollama.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/script_generator_graph/ollama/script_multi_generator_ollama.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/script_generator_graph/openai/script_generator_multi_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/script_generator_graph/openai/script_generator_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/script_generator_graph/openai/script_generator_schema_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/search_graph/.env.example +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/search_graph/README.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/search_graph/ollama/search_graph_ollama.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/search_graph/ollama/search_graph_schema_ollama.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/search_graph/openai/search_graph_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/search_graph/openai/search_graph_schema_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/search_graph/openai/search_link_graph_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/search_graph/scrapegraphai/.env.example +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/search_graph/scrapegraphai/readme.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/search_graph/scrapegraphai/searchscraper_scrapegraphai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/search_graph/scrapegraphai/searchscraper_scrapegraphai_v3.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/smart_scraper_graph/.env.example +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/smart_scraper_graph/nvidia/smart_scraper_nvidia.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/smart_scraper_graph/ollama/smart_scraper_lite_ollama.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/smart_scraper_graph/ollama/smart_scraper_multi_concat_ollama.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/smart_scraper_graph/ollama/smart_scraper_multi_lite_ollama.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/smart_scraper_graph/ollama/smart_scraper_multi_ollama.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/smart_scraper_graph/ollama/smart_scraper_ollama.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/smart_scraper_graph/ollama/smart_scraper_schema_ollama.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/smart_scraper_graph/openai/smart_scraper_lite_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/smart_scraper_graph/openai/smart_scraper_multi_concat_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/smart_scraper_graph/openai/smart_scraper_multi_lite_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/smart_scraper_graph/openai/smart_scraper_multi_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/smart_scraper_graph/openai/smart_scraper_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/smart_scraper_graph/openai/smart_scraper_schema_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/smart_scraper_graph/scrapegraphai/.env.example +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/smart_scraper_graph/scrapegraphai/readme.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/smart_scraper_graph/scrapegraphai/smartscraper_scrapegraphai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/smart_scraper_graph/scrapegraphai/smartscraper_scrapegraphai_v3.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/speech_graph/.env.example +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/speech_graph/README.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/speech_graph/speech_graph_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/xml_scraper_graph/.env.example +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/xml_scraper_graph/README.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/xml_scraper_graph/ollama/inputs/books.xml +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/xml_scraper_graph/ollama/xml_scraper_graph_multi_ollama.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/xml_scraper_graph/ollama/xml_scraper_ollama.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/xml_scraper_graph/openai/inputs/books.xml +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/xml_scraper_graph/openai/xml_scraper_graph_multi_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/xml_scraper_graph/openai/xml_scraper_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/media/banner.png +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/pytest.ini +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/__init__.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/builders/__init__.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/builders/graph_builder.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/docloaders/__init__.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/docloaders/browser_base.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/docloaders/chromium.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/docloaders/plasmate.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/docloaders/scrape_do.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/__init__.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/abstract_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/base_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/code_generator_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/csv_scraper_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/csv_scraper_multi_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/depth_search_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/document_scraper_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/document_scraper_multi_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/json_scraper_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/json_scraper_multi_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/markdownify_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/omni_scraper_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/omni_search_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/screenshot_scraper_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/script_creator_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/script_creator_multi_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/search_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/search_link_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/smart_scraper_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/smart_scraper_lite_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/smart_scraper_multi_batch_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/smart_scraper_multi_concat_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/smart_scraper_multi_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/smart_scraper_multi_lite_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/speech_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/xml_scraper_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/graphs/xml_scraper_multi_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/helpers/__init__.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/helpers/default_filters.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/helpers/models_tokens.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/helpers/nodes_metadata.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/helpers/robots.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/helpers/schemas.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/integrations/__init__.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/integrations/burr_bridge.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/integrations/indexify_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/integrations/scrapegraph_py_compat.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/models/__init__.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/models/clod.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/models/deepseek.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/models/minimax.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/models/nvidia.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/models/oneapi.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/models/openai_itt.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/models/openai_tts.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/models/xai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/__init__.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/base_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/batch_generate_answer_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/concat_answers_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/conditional_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/description_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/fetch_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/fetch_node_level_k.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/fetch_screen_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/generate_answer_csv_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/generate_answer_from_image_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/generate_answer_node_k_level.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/generate_answer_omni_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/generate_code_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/generate_scraper_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/get_probable_tags_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/graph_iterator_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/html_analyzer_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/image_to_text_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/markdownify_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/merge_answers_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/merge_generated_scripts_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/parse_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/parse_node_depth_k_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/prompt_refiner_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/rag_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/reasoning_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/robots_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/search_internet_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/search_link_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/search_node_with_context.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/nodes/text_to_speech_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/prompts/__init__.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/prompts/description_node_prompts.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/prompts/generate_answer_node_csv_prompts.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/prompts/generate_answer_node_omni_prompts.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/prompts/generate_answer_node_pdf_prompts.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/prompts/generate_answer_node_prompts.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/prompts/generate_code_node_prompts.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/prompts/get_probable_tags_node_prompts.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/prompts/html_analyzer_node_prompts.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/prompts/merge_answer_node_prompts.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/prompts/merge_generated_scripts_prompts.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/prompts/prompt_refiner_node_prompts.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/prompts/reasoning_node_prompts.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/prompts/robots_node_prompts.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/prompts/search_internet_node_prompts.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/prompts/search_link_node_prompts.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/prompts/search_node_with_context_prompts.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/telemetry/__init__.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/telemetry/telemetry.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/__init__.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/batch_api.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/cleanup_code.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/cleanup_html.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/code_error_analysis.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/code_error_correction.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/convert_to_md.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/copy.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/custom_callback.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/data_export.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/dict_content_compare.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/llm_callback_manager.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/logging.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/model_costs.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/parse_state_keys.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/prettify_exec_info.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/proxy_rotation.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/research_web.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/save_audio_from_bytes.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/save_code_to_file.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/schema_trasform.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/screenshot_scraping/__init__.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/screenshot_scraping/screenshot_preparation.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/screenshot_scraping/text_detection.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/split_text_into_chunks.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/sys_dynamic_import.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/tokenizer.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/tokenizers/tokenizer_mistral.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/tokenizers/tokenizer_ollama.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/scrapegraphai/utils/tokenizers/tokenizer_openai.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/test +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/QUICKSTART.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/README_TESTING.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/Readme.md +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/conftest.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/fixtures/benchmarking.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/fixtures/helpers.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/fixtures/mock_server/__init__.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/fixtures/mock_server/server.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/graphs/.env.example +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/graphs/abstract_graph_test.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/graphs/code_generator_graph_openai_test.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/graphs/depth_search_graph_openai_test.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/graphs/inputs/books.xml +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/graphs/inputs/example.json +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/graphs/inputs/plain_html_example.txt +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/graphs/inputs/username.csv +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/graphs/scrape_plain_text_mistral_test.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/graphs/scrape_xml_ollama_test.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/graphs/screenshot_scraper_test.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/graphs/script_generator_test.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/graphs/search_graph_openai_test.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/graphs/search_link_ollama.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/graphs/smart_scraper_clod_test.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/graphs/smart_scraper_ernie_test.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/graphs/smart_scraper_fireworks_test.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/graphs/smart_scraper_multi_lite_graph_openai_test.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/graphs/smart_scraper_ollama_test.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/graphs/smart_scraper_openai_test.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/graphs/xml_scraper_openai_test.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/inputs/books.xml +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/inputs/example.json +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/inputs/plain_html_example.txt +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/inputs/username.csv +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/integration/__init__.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/integration/test_file_formats_integration.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/integration/test_multi_graph_integration.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/integration/test_smart_scraper_integration.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/nodes/fetch_node_test.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/nodes/inputs/books.xml +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/nodes/inputs/example.json +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/nodes/inputs/plain_html_example.txt +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/nodes/inputs/username.csv +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/nodes/robot_node_test.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/nodes/search_internet_node_test.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/nodes/search_link_node_test.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/test_batch_api.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/test_chromium.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/test_cleanup_html.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/test_csv_scraper_multi_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/test_depth_search_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/test_fetch_node_timeout.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/test_generate_answer_node.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/test_json_scraper_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/test_json_scraper_multi_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/test_minimax_models.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/test_models_tokens.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/test_omni_search_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/test_plasmate.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/test_scrape_do.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/test_script_creator_multi_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/test_search_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/test_smart_scraper_multi_concat_graph.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/utils/convert_to_md_test.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/utils/copy_utils_test.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/utils/parse_state_keys_test.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/utils/research_web_test.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/utils/test_proxy_rotation.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/tests/utils/test_sys_dynamic_import.py +0 -0
- {scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/uv.lock +0 -0
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
## [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)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* **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))
|
|
7
|
+
|
|
1
8
|
## [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)
|
|
2
9
|
|
|
3
10
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: scrapegraphai
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.0b4
|
|
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
|
|
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.2.0b3 → scrapegraphai-2.2.0b4}/examples/custom_graph/ollama/custom_graph_ollama.py
RENAMED
|
File without changes
|
{scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/custom_graph/openai/custom_graph_openai.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/document_scraper_graph/.env.example
RENAMED
|
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.2.0b3 → scrapegraphai-2.2.0b4}/examples/extras/Savedscreenshots/test_image.jpeg
RENAMED
|
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.2.0b3 → scrapegraphai-2.2.0b4}/examples/markdownify/markdownify_scrapegraphai.py
RENAMED
|
File without changes
|
{scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/markdownify/markdownify_scrapegraphai_v3.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/omni_scraper_graph/omni_search_openai.py
RENAMED
|
File without changes
|
|
File without changes
|
{scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/script_generator_graph/.env.example
RENAMED
|
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.2.0b3 → scrapegraphai-2.2.0b4}/examples/search_graph/ollama/search_graph_ollama.py
RENAMED
|
File without changes
|
|
File without changes
|
{scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/search_graph/openai/search_graph_openai.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/search_graph/scrapegraphai/.env.example
RENAMED
|
File without changes
|
{scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/search_graph/scrapegraphai/readme.md
RENAMED
|
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.2.0b3 → scrapegraphai-2.2.0b4}/examples/smart_scraper_graph/scrapegraphai/readme.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/speech_graph/speech_graph_openai.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{scrapegraphai-2.2.0b3 → scrapegraphai-2.2.0b4}/examples/xml_scraper_graph/ollama/inputs/books.xml
RENAMED
|
File without changes
|
|
File without changes
|