diff --git a/.gitignore b/.gitignore index f93a0c567..6a139ac3f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -docs/api_reference_markdown/ openai_api_key.txt *__pycache__* data/* @@ -14,7 +13,9 @@ settings.json site/* guardrails.log guardrails_ai.egg-info/ -build/* +*/build/* +docs/build +!docs/dist/* dist/* *.rail_output* .idea/* @@ -27,9 +28,8 @@ test.index htmlcov node_modules .docusaurus -docs-build .vercel -docusaurus/examples-toc.json +!docs/examples-toc.json .python-version static/docs docusaurus/static/docs @@ -41,4 +41,4 @@ docusaurus/static/docs */share/* pyvenv.cfg mlruns -mlartifacts \ No newline at end of file +mlartifacts diff --git a/DOCS.md b/DOCS.md index 7cbff8da6..07cfcf2c6 100644 --- a/DOCS.md +++ b/DOCS.md @@ -30,17 +30,17 @@ npm run start ## How the build process works 1. pydocs is used to create python docs in the 'docs/' directory -1. a new folder called 'docs-build' is created -1. docs are copied from 'docs/' to 'docs-build/' -1. nbdocs is used on all notebooks in the 'docs-build' directory. This creates md files parallel to the notebooks in the dir structure. +1. a new folder called 'docs/build' is created +1. docs are copied from 'docs/src' to 'docs/build' +1. nbdocs is used on all notebooks in the 'docs/build' directory. This creates md files parallel to the notebooks in the dir structure. 1. md files are iterated and converted to mdx files. We import some custom components at the top of each mdx file. ## Troubleshooting/common problems 1. On first run, the docs build does not complete and the site is not served - This is usually an intermittent failure with nb-docs. Try running `npm run start` again - - If this doesn't work, try running `rm -rf docs-build; npm run start` + - If this doesn't work, try running `rm -rf docs/build; npm run start` - If even that doesn't work, please file an issue. Something may be wrong with docs builds on the branch 1. I updated a notebook and it didn't update in the docs - This is likely because the notebook wasn't converted to markdown, or files were not overwritten - - To fix this, run `rm -rf docs-build; npm run start` + - To fix this, run `rm -rf docs/build; npm run start` diff --git a/Makefile b/Makefile index 0ef5a426c..43bbd4bca 100644 --- a/Makefile +++ b/Makefile @@ -45,8 +45,8 @@ full: docs-gen: poetry run python ./docs/pydocs/generate_pydocs.py - cp -r docs docs-build - poetry run nbdoc_build --force_all True --srcdir ./docs-build + cp -r docs/src/* docs/dist + poetry run nbdoc_build --force_all True --srcdir ./docs/dist self-install: pip install -e . diff --git a/docs/bun.lock b/docs/bun.lock new file mode 100644 index 000000000..f83b222a4 --- /dev/null +++ b/docs/bun.lock @@ -0,0 +1,3092 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "web", + "dependencies": { + "@docusaurus/core": "^3.9.2", + "@docusaurus/plugin-google-gtag": "^3.9.2", + "@docusaurus/preset-classic": "^3.9.2", + "@docusaurus/theme-mermaid": "^3.9.2", + "@mdx-js/react": "^3.1.1", + "clsx": "^2.1.1", + "create-react-class": "^15.7.0", + "docusaurus-plugin-image-zoom": "^3.0.1", + "htmltojsx": "^0.3.0", + "plugin-image-zoom": "^1.2.0", + "posthog-docusaurus": "^2.0.5", + "prism-react-renderer": "^2.4.1", + "react": "^19.2.0", + "react-dom": "^19.2.0", + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "^3.9.2", + }, + }, + }, + "packages": { + "@ai-sdk/gateway": ["@ai-sdk/gateway@2.0.3", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.14", "@vercel/oidc": "3.0.3" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-/vCoMKtod+A74/BbkWsaAflWKz1ovhX5lmJpIaXQXtd6gyexZncjotBTbFM8rVJT9LKJ/Kx7iVVo3vh+KT+IJg=="], + + "@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], + + "@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.14", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-CYRU6L7IlR7KslSBVxvlqlybQvXJln/PI57O8swhOaDIURZbjRP2AY3igKgUsrmWqqnFFUHP+AwTN8xqJAknnA=="], + + "@ai-sdk/react": ["@ai-sdk/react@2.0.82", "", { "dependencies": { "@ai-sdk/provider-utils": "3.0.14", "ai": "5.0.82", "swr": "^2.2.5", "throttleit": "2.1.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.25.76 || ^4.1.8" }, "optionalPeers": ["zod"] }, "sha512-InaGqykKGFq/XA6Vhh2Hyy38nzeMpqp8eWxjTNEQA5Gwcal0BVNuZyTbTIL5t5VNXV+pQPDhe9ak1+mc9qxjog=="], + + "@algolia/abtesting": ["@algolia/abtesting@1.7.0", "", { "dependencies": { "@algolia/client-common": "5.41.0", "@algolia/requester-browser-xhr": "5.41.0", "@algolia/requester-fetch": "5.41.0", "@algolia/requester-node-http": "5.41.0" } }, "sha512-hOEItTFOvNLI6QX6TSGu7VE4XcUcdoKZT8NwDY+5mWwu87rGhkjlY7uesKTInlg6Sh8cyRkDBYRumxbkoBbBhA=="], + + "@algolia/autocomplete-core": ["@algolia/autocomplete-core@1.19.2", "", { "dependencies": { "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", "@algolia/autocomplete-shared": "1.19.2" } }, "sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw=="], + + "@algolia/autocomplete-plugin-algolia-insights": ["@algolia/autocomplete-plugin-algolia-insights@1.19.2", "", { "dependencies": { "@algolia/autocomplete-shared": "1.19.2" }, "peerDependencies": { "search-insights": ">= 1 < 3" } }, "sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg=="], + + "@algolia/autocomplete-shared": ["@algolia/autocomplete-shared@1.19.2", "", { "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, "sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w=="], + + "@algolia/client-abtesting": ["@algolia/client-abtesting@5.41.0", "", { "dependencies": { "@algolia/client-common": "5.41.0", "@algolia/requester-browser-xhr": "5.41.0", "@algolia/requester-fetch": "5.41.0", "@algolia/requester-node-http": "5.41.0" } }, "sha512-iRuvbEyuHCAhIMkyzG3tfINLxTS7mSKo7q8mQF+FbQpWenlAlrXnfZTN19LRwnVjx0UtAdZq96ThMWGS6cQ61A=="], + + "@algolia/client-analytics": ["@algolia/client-analytics@5.41.0", "", { "dependencies": { "@algolia/client-common": "5.41.0", "@algolia/requester-browser-xhr": "5.41.0", "@algolia/requester-fetch": "5.41.0", "@algolia/requester-node-http": "5.41.0" } }, "sha512-OIPVbGfx/AO8l1V70xYTPSeTt/GCXPEl6vQICLAXLCk9WOUbcLGcy6t8qv0rO7Z7/M/h9afY6Af8JcnI+FBFdQ=="], + + "@algolia/client-common": ["@algolia/client-common@5.41.0", "", {}, "sha512-8Mc9niJvfuO8dudWN5vSUlYkz7U3M3X3m1crDLc9N7FZrIVoNGOUETPk3TTHviJIh9y6eKZKbq1hPGoGY9fqPA=="], + + "@algolia/client-insights": ["@algolia/client-insights@5.41.0", "", { "dependencies": { "@algolia/client-common": "5.41.0", "@algolia/requester-browser-xhr": "5.41.0", "@algolia/requester-fetch": "5.41.0", "@algolia/requester-node-http": "5.41.0" } }, "sha512-vXzvCGZS6Ixxn+WyzGUVDeR3HO/QO5POeeWy1kjNJbEf6f+tZSI+OiIU9Ha+T3ntV8oXFyBEuweygw4OLmgfiQ=="], + + "@algolia/client-personalization": ["@algolia/client-personalization@5.41.0", "", { "dependencies": { "@algolia/client-common": "5.41.0", "@algolia/requester-browser-xhr": "5.41.0", "@algolia/requester-fetch": "5.41.0", "@algolia/requester-node-http": "5.41.0" } }, "sha512-tkymXhmlcc7w/HEvLRiHcpHxLFcUB+0PnE9FcG6hfFZ1ZXiWabH+sX+uukCVnluyhfysU9HRU2kUmUWfucx1Dg=="], + + "@algolia/client-query-suggestions": ["@algolia/client-query-suggestions@5.41.0", "", { "dependencies": { "@algolia/client-common": "5.41.0", "@algolia/requester-browser-xhr": "5.41.0", "@algolia/requester-fetch": "5.41.0", "@algolia/requester-node-http": "5.41.0" } }, "sha512-vyXDoz3kEZnosNeVQQwf0PbBt5IZJoHkozKRIsYfEVm+ylwSDFCW08qy2YIVSHdKy69/rWN6Ue/6W29GgVlmKQ=="], + + "@algolia/client-search": ["@algolia/client-search@5.41.0", "", { "dependencies": { "@algolia/client-common": "5.41.0", "@algolia/requester-browser-xhr": "5.41.0", "@algolia/requester-fetch": "5.41.0", "@algolia/requester-node-http": "5.41.0" } }, "sha512-G9I2atg1ShtFp0t7zwleP6aPS4DcZvsV4uoQOripp16aR6VJzbEnKFPLW4OFXzX7avgZSpYeBAS+Zx4FOgmpPw=="], + + "@algolia/events": ["@algolia/events@4.0.1", "", {}, "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ=="], + + "@algolia/ingestion": ["@algolia/ingestion@1.41.0", "", { "dependencies": { "@algolia/client-common": "5.41.0", "@algolia/requester-browser-xhr": "5.41.0", "@algolia/requester-fetch": "5.41.0", "@algolia/requester-node-http": "5.41.0" } }, "sha512-sxU/ggHbZtmrYzTkueTXXNyifn+ozsLP+Wi9S2hOBVhNWPZ8uRiDTDcFyL7cpCs1q72HxPuhzTP5vn4sUl74cQ=="], + + "@algolia/monitoring": ["@algolia/monitoring@1.41.0", "", { "dependencies": { "@algolia/client-common": "5.41.0", "@algolia/requester-browser-xhr": "5.41.0", "@algolia/requester-fetch": "5.41.0", "@algolia/requester-node-http": "5.41.0" } }, "sha512-UQ86R6ixraHUpd0hn4vjgTHbViNO8+wA979gJmSIsRI3yli2v89QSFF/9pPcADR6PbtSio/99PmSNxhZy+CR3Q=="], + + "@algolia/recommend": ["@algolia/recommend@5.41.0", "", { "dependencies": { "@algolia/client-common": "5.41.0", "@algolia/requester-browser-xhr": "5.41.0", "@algolia/requester-fetch": "5.41.0", "@algolia/requester-node-http": "5.41.0" } }, "sha512-DxP9P8jJ8whJOnvmyA5mf1wv14jPuI0L25itGfOHSU6d4ZAjduVfPjTS3ROuUN5CJoTdlidYZE+DtfWHxJwyzQ=="], + + "@algolia/requester-browser-xhr": ["@algolia/requester-browser-xhr@5.41.0", "", { "dependencies": { "@algolia/client-common": "5.41.0" } }, "sha512-C21J+LYkE48fDwtLX7YXZd2Fn7Fe0/DOEtvohSfr/ODP8dGDhy9faaYeWB0n1AvmZltugjkjAXT7xk0CYNIXsQ=="], + + "@algolia/requester-fetch": ["@algolia/requester-fetch@5.41.0", "", { "dependencies": { "@algolia/client-common": "5.41.0" } }, "sha512-FhJy/+QJhMx1Hajf2LL8og4J7SqOAHiAuUXq27cct4QnPhSIuIGROzeRpfDNH5BUbq22UlMuGd44SeD4HRAqvA=="], + + "@algolia/requester-node-http": ["@algolia/requester-node-http@5.41.0", "", { "dependencies": { "@algolia/client-common": "5.41.0" } }, "sha512-tYv3rGbhBS0eZ5D8oCgV88iuWILROiemk+tQ3YsAKZv2J4kKUNvKkrX/If/SreRy4MGP2uJzMlyKcfSfO2mrsQ=="], + + "@antfu/install-pkg": ["@antfu/install-pkg@1.1.0", "", { "dependencies": { "package-manager-detector": "^1.3.0", "tinyexec": "^1.0.1" } }, "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ=="], + + "@antfu/utils": ["@antfu/utils@9.3.0", "", {}, "sha512-9hFT4RauhcUzqOE4f1+frMKLZrgNog5b06I7VmZQV1BkvwvqrbC8EBZf3L1eEL2AKb6rNKjER0sEvJiSP1FXEA=="], + + "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], + + "@babel/compat-data": ["@babel/compat-data@7.28.5", "", {}, "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA=="], + + "@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], + + "@babel/generator": ["@babel/generator@7.28.5", "", { "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ=="], + + "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.2", "", { "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="], + + "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.28.5", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.28.5", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ=="], + + "@babel/helper-create-regexp-features-plugin": ["@babel/helper-create-regexp-features-plugin@7.28.5", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "regexpu-core": "^6.3.1", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw=="], + + "@babel/helper-define-polyfill-provider": ["@babel/helper-define-polyfill-provider@0.6.5", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "debug": "^4.4.1", "lodash.debounce": "^4.0.8", "resolve": "^1.22.10" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg=="], + + "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], + + "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.28.5", "", { "dependencies": { "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5" } }, "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.28.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw=="], + + "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.27.1", "", { "dependencies": { "@babel/types": "^7.27.1" } }, "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.27.1", "", {}, "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="], + + "@babel/helper-remap-async-to-generator": ["@babel/helper-remap-async-to-generator@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-wrap-function": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA=="], + + "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.27.1", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA=="], + + "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], + + "@babel/helper-wrap-function": ["@babel/helper-wrap-function@7.28.3", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.3", "@babel/types": "^7.28.2" } }, "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g=="], + + "@babel/helpers": ["@babel/helpers@7.28.4", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.28.4" } }, "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w=="], + + "@babel/parser": ["@babel/parser@7.28.5", "", { "dependencies": { "@babel/types": "^7.28.5" }, "bin": "./bin/babel-parser.js" }, "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ=="], + + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": ["@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q=="], + + "@babel/plugin-bugfix-safari-class-field-initializer-scope": ["@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA=="], + + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ["@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA=="], + + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ["@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-transform-optional-chaining": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.13.0" } }, "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw=="], + + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": ["@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.28.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw=="], + + "@babel/plugin-proposal-private-property-in-object": ["@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w=="], + + "@babel/plugin-syntax-dynamic-import": ["@babel/plugin-syntax-dynamic-import@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ=="], + + "@babel/plugin-syntax-import-assertions": ["@babel/plugin-syntax-import-assertions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg=="], + + "@babel/plugin-syntax-import-attributes": ["@babel/plugin-syntax-import-attributes@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww=="], + + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w=="], + + "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ=="], + + "@babel/plugin-syntax-unicode-sets-regex": ["@babel/plugin-syntax-unicode-sets-regex@7.18.6", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg=="], + + "@babel/plugin-transform-arrow-functions": ["@babel/plugin-transform-arrow-functions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA=="], + + "@babel/plugin-transform-async-generator-functions": ["@babel/plugin-transform-async-generator-functions@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q=="], + + "@babel/plugin-transform-async-to-generator": ["@babel/plugin-transform-async-to-generator@7.27.1", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA=="], + + "@babel/plugin-transform-block-scoped-functions": ["@babel/plugin-transform-block-scoped-functions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg=="], + + "@babel/plugin-transform-block-scoping": ["@babel/plugin-transform-block-scoping@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g=="], + + "@babel/plugin-transform-class-properties": ["@babel/plugin-transform-class-properties@7.27.1", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA=="], + + "@babel/plugin-transform-class-static-block": ["@babel/plugin-transform-class-static-block@7.28.3", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.12.0" } }, "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg=="], + + "@babel/plugin-transform-classes": ["@babel/plugin-transform-classes@7.28.4", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/traverse": "^7.28.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA=="], + + "@babel/plugin-transform-computed-properties": ["@babel/plugin-transform-computed-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/template": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw=="], + + "@babel/plugin-transform-destructuring": ["@babel/plugin-transform-destructuring@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw=="], + + "@babel/plugin-transform-dotall-regex": ["@babel/plugin-transform-dotall-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw=="], + + "@babel/plugin-transform-duplicate-keys": ["@babel/plugin-transform-duplicate-keys@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q=="], + + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": ["@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ=="], + + "@babel/plugin-transform-dynamic-import": ["@babel/plugin-transform-dynamic-import@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A=="], + + "@babel/plugin-transform-explicit-resource-management": ["@babel/plugin-transform-explicit-resource-management@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ=="], + + "@babel/plugin-transform-exponentiation-operator": ["@babel/plugin-transform-exponentiation-operator@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw=="], + + "@babel/plugin-transform-export-namespace-from": ["@babel/plugin-transform-export-namespace-from@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ=="], + + "@babel/plugin-transform-for-of": ["@babel/plugin-transform-for-of@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw=="], + + "@babel/plugin-transform-function-name": ["@babel/plugin-transform-function-name@7.27.1", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ=="], + + "@babel/plugin-transform-json-strings": ["@babel/plugin-transform-json-strings@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q=="], + + "@babel/plugin-transform-literals": ["@babel/plugin-transform-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA=="], + + "@babel/plugin-transform-logical-assignment-operators": ["@babel/plugin-transform-logical-assignment-operators@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA=="], + + "@babel/plugin-transform-member-expression-literals": ["@babel/plugin-transform-member-expression-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ=="], + + "@babel/plugin-transform-modules-amd": ["@babel/plugin-transform-modules-amd@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA=="], + + "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw=="], + + "@babel/plugin-transform-modules-systemjs": ["@babel/plugin-transform-modules-systemjs@7.28.5", "", { "dependencies": { "@babel/helper-module-transforms": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew=="], + + "@babel/plugin-transform-modules-umd": ["@babel/plugin-transform-modules-umd@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w=="], + + "@babel/plugin-transform-named-capturing-groups-regex": ["@babel/plugin-transform-named-capturing-groups-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng=="], + + "@babel/plugin-transform-new-target": ["@babel/plugin-transform-new-target@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ=="], + + "@babel/plugin-transform-nullish-coalescing-operator": ["@babel/plugin-transform-nullish-coalescing-operator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA=="], + + "@babel/plugin-transform-numeric-separator": ["@babel/plugin-transform-numeric-separator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw=="], + + "@babel/plugin-transform-object-rest-spread": ["@babel/plugin-transform-object-rest-spread@7.28.4", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/traverse": "^7.28.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew=="], + + "@babel/plugin-transform-object-super": ["@babel/plugin-transform-object-super@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng=="], + + "@babel/plugin-transform-optional-catch-binding": ["@babel/plugin-transform-optional-catch-binding@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q=="], + + "@babel/plugin-transform-optional-chaining": ["@babel/plugin-transform-optional-chaining@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ=="], + + "@babel/plugin-transform-parameters": ["@babel/plugin-transform-parameters@7.27.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg=="], + + "@babel/plugin-transform-private-methods": ["@babel/plugin-transform-private-methods@7.27.1", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA=="], + + "@babel/plugin-transform-private-property-in-object": ["@babel/plugin-transform-private-property-in-object@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ=="], + + "@babel/plugin-transform-property-literals": ["@babel/plugin-transform-property-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ=="], + + "@babel/plugin-transform-react-constant-elements": ["@babel/plugin-transform-react-constant-elements@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug=="], + + "@babel/plugin-transform-react-display-name": ["@babel/plugin-transform-react-display-name@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA=="], + + "@babel/plugin-transform-react-jsx": ["@babel/plugin-transform-react-jsx@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/types": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw=="], + + "@babel/plugin-transform-react-jsx-development": ["@babel/plugin-transform-react-jsx-development@7.27.1", "", { "dependencies": { "@babel/plugin-transform-react-jsx": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q=="], + + "@babel/plugin-transform-react-pure-annotations": ["@babel/plugin-transform-react-pure-annotations@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA=="], + + "@babel/plugin-transform-regenerator": ["@babel/plugin-transform-regenerator@7.28.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA=="], + + "@babel/plugin-transform-regexp-modifiers": ["@babel/plugin-transform-regexp-modifiers@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA=="], + + "@babel/plugin-transform-reserved-words": ["@babel/plugin-transform-reserved-words@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw=="], + + "@babel/plugin-transform-runtime": ["@babel/plugin-transform-runtime@7.28.5", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "babel-plugin-polyfill-corejs2": "^0.4.14", "babel-plugin-polyfill-corejs3": "^0.13.0", "babel-plugin-polyfill-regenerator": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w=="], + + "@babel/plugin-transform-shorthand-properties": ["@babel/plugin-transform-shorthand-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ=="], + + "@babel/plugin-transform-spread": ["@babel/plugin-transform-spread@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q=="], + + "@babel/plugin-transform-sticky-regex": ["@babel/plugin-transform-sticky-regex@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g=="], + + "@babel/plugin-transform-template-literals": ["@babel/plugin-transform-template-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg=="], + + "@babel/plugin-transform-typeof-symbol": ["@babel/plugin-transform-typeof-symbol@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw=="], + + "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.28.5", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.28.5", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA=="], + + "@babel/plugin-transform-unicode-escapes": ["@babel/plugin-transform-unicode-escapes@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg=="], + + "@babel/plugin-transform-unicode-property-regex": ["@babel/plugin-transform-unicode-property-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q=="], + + "@babel/plugin-transform-unicode-regex": ["@babel/plugin-transform-unicode-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw=="], + + "@babel/plugin-transform-unicode-sets-regex": ["@babel/plugin-transform-unicode-sets-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw=="], + + "@babel/preset-env": ["@babel/preset-env@7.28.5", "", { "dependencies": { "@babel/compat-data": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-import-assertions": "^7.27.1", "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.27.1", "@babel/plugin-transform-async-generator-functions": "^7.28.0", "@babel/plugin-transform-async-to-generator": "^7.27.1", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", "@babel/plugin-transform-block-scoping": "^7.28.5", "@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-static-block": "^7.28.3", "@babel/plugin-transform-classes": "^7.28.4", "@babel/plugin-transform-computed-properties": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.5", "@babel/plugin-transform-dotall-regex": "^7.27.1", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-dynamic-import": "^7.27.1", "@babel/plugin-transform-explicit-resource-management": "^7.28.0", "@babel/plugin-transform-exponentiation-operator": "^7.28.5", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", "@babel/plugin-transform-function-name": "^7.27.1", "@babel/plugin-transform-json-strings": "^7.27.1", "@babel/plugin-transform-literals": "^7.27.1", "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-modules-systemjs": "^7.28.5", "@babel/plugin-transform-modules-umd": "^7.27.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-new-target": "^7.27.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", "@babel/plugin-transform-numeric-separator": "^7.27.1", "@babel/plugin-transform-object-rest-spread": "^7.28.4", "@babel/plugin-transform-object-super": "^7.27.1", "@babel/plugin-transform-optional-catch-binding": "^7.27.1", "@babel/plugin-transform-optional-chaining": "^7.28.5", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", "@babel/plugin-transform-regenerator": "^7.28.4", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", "@babel/plugin-transform-spread": "^7.27.1", "@babel/plugin-transform-sticky-regex": "^7.27.1", "@babel/plugin-transform-template-literals": "^7.27.1", "@babel/plugin-transform-typeof-symbol": "^7.27.1", "@babel/plugin-transform-unicode-escapes": "^7.27.1", "@babel/plugin-transform-unicode-property-regex": "^7.27.1", "@babel/plugin-transform-unicode-regex": "^7.27.1", "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.14", "babel-plugin-polyfill-corejs3": "^0.13.0", "babel-plugin-polyfill-regenerator": "^0.6.5", "core-js-compat": "^3.43.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg=="], + + "@babel/preset-modules": ["@babel/preset-modules@0.1.6-no-external-plugins", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA=="], + + "@babel/preset-react": ["@babel/preset-react@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-transform-react-display-name": "^7.28.0", "@babel/plugin-transform-react-jsx": "^7.27.1", "@babel/plugin-transform-react-jsx-development": "^7.27.1", "@babel/plugin-transform-react-pure-annotations": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ=="], + + "@babel/preset-typescript": ["@babel/preset-typescript@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-typescript": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g=="], + + "@babel/runtime": ["@babel/runtime@7.28.4", "", {}, "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ=="], + + "@babel/runtime-corejs3": ["@babel/runtime-corejs3@7.28.4", "", { "dependencies": { "core-js-pure": "^3.43.0" } }, "sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ=="], + + "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], + + "@babel/traverse": ["@babel/traverse@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/types": "^7.28.5", "debug": "^4.3.1" } }, "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ=="], + + "@babel/types": ["@babel/types@7.28.5", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="], + + "@braintree/sanitize-url": ["@braintree/sanitize-url@7.1.1", "", {}, "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw=="], + + "@chevrotain/cst-dts-gen": ["@chevrotain/cst-dts-gen@11.0.3", "", { "dependencies": { "@chevrotain/gast": "11.0.3", "@chevrotain/types": "11.0.3", "lodash-es": "4.17.21" } }, "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ=="], + + "@chevrotain/gast": ["@chevrotain/gast@11.0.3", "", { "dependencies": { "@chevrotain/types": "11.0.3", "lodash-es": "4.17.21" } }, "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q=="], + + "@chevrotain/regexp-to-ast": ["@chevrotain/regexp-to-ast@11.0.3", "", {}, "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA=="], + + "@chevrotain/types": ["@chevrotain/types@11.0.3", "", {}, "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ=="], + + "@chevrotain/utils": ["@chevrotain/utils@11.0.3", "", {}, "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ=="], + + "@colors/colors": ["@colors/colors@1.5.0", "", {}, "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ=="], + + "@csstools/cascade-layer-name-parser": ["@csstools/cascade-layer-name-parser@2.0.5", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" } }, "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A=="], + + "@csstools/color-helpers": ["@csstools/color-helpers@5.1.0", "", {}, "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA=="], + + "@csstools/css-calc": ["@csstools/css-calc@2.1.4", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" } }, "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ=="], + + "@csstools/css-color-parser": ["@csstools/css-color-parser@3.1.0", "", { "dependencies": { "@csstools/color-helpers": "^5.1.0", "@csstools/css-calc": "^2.1.4" }, "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" } }, "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA=="], + + "@csstools/css-parser-algorithms": ["@csstools/css-parser-algorithms@3.0.5", "", { "peerDependencies": { "@csstools/css-tokenizer": "^3.0.4" } }, "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ=="], + + "@csstools/css-tokenizer": ["@csstools/css-tokenizer@3.0.4", "", {}, "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw=="], + + "@csstools/media-query-list-parser": ["@csstools/media-query-list-parser@4.0.3", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" } }, "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ=="], + + "@csstools/postcss-alpha-function": ["@csstools/postcss-alpha-function@1.0.1", "", { "dependencies": { "@csstools/css-color-parser": "^3.1.0", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w=="], + + "@csstools/postcss-cascade-layers": ["@csstools/postcss-cascade-layers@5.0.2", "", { "dependencies": { "@csstools/selector-specificity": "^5.0.0", "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg=="], + + "@csstools/postcss-color-function": ["@csstools/postcss-color-function@4.0.12", "", { "dependencies": { "@csstools/css-color-parser": "^3.1.0", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA=="], + + "@csstools/postcss-color-function-display-p3-linear": ["@csstools/postcss-color-function-display-p3-linear@1.0.1", "", { "dependencies": { "@csstools/css-color-parser": "^3.1.0", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg=="], + + "@csstools/postcss-color-mix-function": ["@csstools/postcss-color-mix-function@3.0.12", "", { "dependencies": { "@csstools/css-color-parser": "^3.1.0", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag=="], + + "@csstools/postcss-color-mix-variadic-function-arguments": ["@csstools/postcss-color-mix-variadic-function-arguments@1.0.2", "", { "dependencies": { "@csstools/css-color-parser": "^3.1.0", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ=="], + + "@csstools/postcss-content-alt-text": ["@csstools/postcss-content-alt-text@2.0.8", "", { "dependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q=="], + + "@csstools/postcss-contrast-color-function": ["@csstools/postcss-contrast-color-function@2.0.12", "", { "dependencies": { "@csstools/css-color-parser": "^3.1.0", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA=="], + + "@csstools/postcss-exponential-functions": ["@csstools/postcss-exponential-functions@2.0.9", "", { "dependencies": { "@csstools/css-calc": "^2.1.4", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw=="], + + "@csstools/postcss-font-format-keywords": ["@csstools/postcss-font-format-keywords@4.0.0", "", { "dependencies": { "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw=="], + + "@csstools/postcss-gamut-mapping": ["@csstools/postcss-gamut-mapping@2.0.11", "", { "dependencies": { "@csstools/css-color-parser": "^3.1.0", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw=="], + + "@csstools/postcss-gradients-interpolation-method": ["@csstools/postcss-gradients-interpolation-method@5.0.12", "", { "dependencies": { "@csstools/css-color-parser": "^3.1.0", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow=="], + + "@csstools/postcss-hwb-function": ["@csstools/postcss-hwb-function@4.0.12", "", { "dependencies": { "@csstools/css-color-parser": "^3.1.0", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA=="], + + "@csstools/postcss-ic-unit": ["@csstools/postcss-ic-unit@4.0.4", "", { "dependencies": { "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg=="], + + "@csstools/postcss-initial": ["@csstools/postcss-initial@2.0.1", "", { "peerDependencies": { "postcss": "^8.4" } }, "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg=="], + + "@csstools/postcss-is-pseudo-class": ["@csstools/postcss-is-pseudo-class@5.0.3", "", { "dependencies": { "@csstools/selector-specificity": "^5.0.0", "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ=="], + + "@csstools/postcss-light-dark-function": ["@csstools/postcss-light-dark-function@2.0.11", "", { "dependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA=="], + + "@csstools/postcss-logical-float-and-clear": ["@csstools/postcss-logical-float-and-clear@3.0.0", "", { "peerDependencies": { "postcss": "^8.4" } }, "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ=="], + + "@csstools/postcss-logical-overflow": ["@csstools/postcss-logical-overflow@2.0.0", "", { "peerDependencies": { "postcss": "^8.4" } }, "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA=="], + + "@csstools/postcss-logical-overscroll-behavior": ["@csstools/postcss-logical-overscroll-behavior@2.0.0", "", { "peerDependencies": { "postcss": "^8.4" } }, "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w=="], + + "@csstools/postcss-logical-resize": ["@csstools/postcss-logical-resize@3.0.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg=="], + + "@csstools/postcss-logical-viewport-units": ["@csstools/postcss-logical-viewport-units@3.0.4", "", { "dependencies": { "@csstools/css-tokenizer": "^3.0.4", "@csstools/utilities": "^2.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ=="], + + "@csstools/postcss-media-minmax": ["@csstools/postcss-media-minmax@2.0.9", "", { "dependencies": { "@csstools/css-calc": "^2.1.4", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", "@csstools/media-query-list-parser": "^4.0.3" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig=="], + + "@csstools/postcss-media-queries-aspect-ratio-number-values": ["@csstools/postcss-media-queries-aspect-ratio-number-values@3.0.5", "", { "dependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", "@csstools/media-query-list-parser": "^4.0.3" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg=="], + + "@csstools/postcss-nested-calc": ["@csstools/postcss-nested-calc@4.0.0", "", { "dependencies": { "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A=="], + + "@csstools/postcss-normalize-display-values": ["@csstools/postcss-normalize-display-values@4.0.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q=="], + + "@csstools/postcss-oklab-function": ["@csstools/postcss-oklab-function@4.0.12", "", { "dependencies": { "@csstools/css-color-parser": "^3.1.0", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg=="], + + "@csstools/postcss-progressive-custom-properties": ["@csstools/postcss-progressive-custom-properties@4.2.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw=="], + + "@csstools/postcss-random-function": ["@csstools/postcss-random-function@2.0.1", "", { "dependencies": { "@csstools/css-calc": "^2.1.4", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w=="], + + "@csstools/postcss-relative-color-syntax": ["@csstools/postcss-relative-color-syntax@3.0.12", "", { "dependencies": { "@csstools/css-color-parser": "^3.1.0", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw=="], + + "@csstools/postcss-scope-pseudo-class": ["@csstools/postcss-scope-pseudo-class@4.0.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q=="], + + "@csstools/postcss-sign-functions": ["@csstools/postcss-sign-functions@1.1.4", "", { "dependencies": { "@csstools/css-calc": "^2.1.4", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg=="], + + "@csstools/postcss-stepped-value-functions": ["@csstools/postcss-stepped-value-functions@4.0.9", "", { "dependencies": { "@csstools/css-calc": "^2.1.4", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA=="], + + "@csstools/postcss-text-decoration-shorthand": ["@csstools/postcss-text-decoration-shorthand@4.0.3", "", { "dependencies": { "@csstools/color-helpers": "^5.1.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA=="], + + "@csstools/postcss-trigonometric-functions": ["@csstools/postcss-trigonometric-functions@4.0.9", "", { "dependencies": { "@csstools/css-calc": "^2.1.4", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A=="], + + "@csstools/postcss-unset-value": ["@csstools/postcss-unset-value@4.0.0", "", { "peerDependencies": { "postcss": "^8.4" } }, "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA=="], + + "@csstools/selector-resolve-nested": ["@csstools/selector-resolve-nested@3.1.0", "", { "peerDependencies": { "postcss-selector-parser": "^7.0.0" } }, "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g=="], + + "@csstools/selector-specificity": ["@csstools/selector-specificity@5.0.0", "", { "peerDependencies": { "postcss-selector-parser": "^7.0.0" } }, "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw=="], + + "@csstools/utilities": ["@csstools/utilities@2.0.0", "", { "peerDependencies": { "postcss": "^8.4" } }, "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ=="], + + "@discoveryjs/json-ext": ["@discoveryjs/json-ext@0.5.7", "", {}, "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw=="], + + "@docsearch/css": ["@docsearch/css@4.2.0", "", {}, "sha512-65KU9Fw5fGsPPPlgIghonMcndyx1bszzrDQYLfierN+Ha29yotMHzVS94bPkZS6On9LS8dE4qmW4P/fGjtCf/g=="], + + "@docsearch/react": ["@docsearch/react@4.2.0", "", { "dependencies": { "@ai-sdk/react": "^2.0.30", "@algolia/autocomplete-core": "1.19.2", "@docsearch/css": "4.2.0", "ai": "^5.0.30", "algoliasearch": "^5.28.0", "marked": "^16.3.0", "zod": "^4.1.8" }, "peerDependencies": { "@types/react": ">= 16.8.0 < 20.0.0", "react": ">= 16.8.0 < 20.0.0", "react-dom": ">= 16.8.0 < 20.0.0", "search-insights": ">= 1 < 3" }, "optionalPeers": ["@types/react", "react", "react-dom", "search-insights"] }, "sha512-zSN/KblmtBcerf7Z87yuKIHZQmxuXvYc6/m0+qnjyNu+Ir67AVOagTa1zBqcxkVUVkmBqUExdcyrdo9hbGbqTw=="], + + "@docusaurus/babel": ["@docusaurus/babel@3.9.2", "", { "dependencies": { "@babel/core": "^7.25.9", "@babel/generator": "^7.25.9", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-transform-runtime": "^7.25.9", "@babel/preset-env": "^7.25.9", "@babel/preset-react": "^7.25.9", "@babel/preset-typescript": "^7.25.9", "@babel/runtime": "^7.25.9", "@babel/runtime-corejs3": "^7.25.9", "@babel/traverse": "^7.25.9", "@docusaurus/logger": "3.9.2", "@docusaurus/utils": "3.9.2", "babel-plugin-dynamic-import-node": "^2.3.3", "fs-extra": "^11.1.1", "tslib": "^2.6.0" } }, "sha512-GEANdi/SgER+L7Japs25YiGil/AUDnFFHaCGPBbundxoWtCkA2lmy7/tFmgED4y1htAy6Oi4wkJEQdGssnw9MA=="], + + "@docusaurus/bundler": ["@docusaurus/bundler@3.9.2", "", { "dependencies": { "@babel/core": "^7.25.9", "@docusaurus/babel": "3.9.2", "@docusaurus/cssnano-preset": "3.9.2", "@docusaurus/logger": "3.9.2", "@docusaurus/types": "3.9.2", "@docusaurus/utils": "3.9.2", "babel-loader": "^9.2.1", "clean-css": "^5.3.3", "copy-webpack-plugin": "^11.0.0", "css-loader": "^6.11.0", "css-minimizer-webpack-plugin": "^5.0.1", "cssnano": "^6.1.2", "file-loader": "^6.2.0", "html-minifier-terser": "^7.2.0", "mini-css-extract-plugin": "^2.9.2", "null-loader": "^4.0.1", "postcss": "^8.5.4", "postcss-loader": "^7.3.4", "postcss-preset-env": "^10.2.1", "terser-webpack-plugin": "^5.3.9", "tslib": "^2.6.0", "url-loader": "^4.1.1", "webpack": "^5.95.0", "webpackbar": "^6.0.1" }, "peerDependencies": { "@docusaurus/faster": "*" }, "optionalPeers": ["@docusaurus/faster"] }, "sha512-ZOVi6GYgTcsZcUzjblpzk3wH1Fya2VNpd5jtHoCCFcJlMQ1EYXZetfAnRHLcyiFeBABaI1ltTYbOBtH/gahGVA=="], + + "@docusaurus/core": ["@docusaurus/core@3.9.2", "", { "dependencies": { "@docusaurus/babel": "3.9.2", "@docusaurus/bundler": "3.9.2", "@docusaurus/logger": "3.9.2", "@docusaurus/mdx-loader": "3.9.2", "@docusaurus/utils": "3.9.2", "@docusaurus/utils-common": "3.9.2", "@docusaurus/utils-validation": "3.9.2", "boxen": "^6.2.1", "chalk": "^4.1.2", "chokidar": "^3.5.3", "cli-table3": "^0.6.3", "combine-promises": "^1.1.0", "commander": "^5.1.0", "core-js": "^3.31.1", "detect-port": "^1.5.1", "escape-html": "^1.0.3", "eta": "^2.2.0", "eval": "^0.1.8", "execa": "5.1.1", "fs-extra": "^11.1.1", "html-tags": "^3.3.1", "html-webpack-plugin": "^5.6.0", "leven": "^3.1.0", "lodash": "^4.17.21", "open": "^8.4.0", "p-map": "^4.0.0", "prompts": "^2.4.2", "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", "react-loadable-ssr-addon-v5-slorber": "^1.0.1", "react-router": "^5.3.4", "react-router-config": "^5.1.1", "react-router-dom": "^5.3.4", "semver": "^7.5.4", "serve-handler": "^6.1.6", "tinypool": "^1.0.2", "tslib": "^2.6.0", "update-notifier": "^6.0.2", "webpack": "^5.95.0", "webpack-bundle-analyzer": "^4.10.2", "webpack-dev-server": "^5.2.2", "webpack-merge": "^6.0.1" }, "peerDependencies": { "@mdx-js/react": "^3.0.0", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "bin": { "docusaurus": "bin/docusaurus.mjs" } }, "sha512-HbjwKeC+pHUFBfLMNzuSjqFE/58+rLVKmOU3lxQrpsxLBOGosYco/Q0GduBb0/jEMRiyEqjNT/01rRdOMWq5pw=="], + + "@docusaurus/cssnano-preset": ["@docusaurus/cssnano-preset@3.9.2", "", { "dependencies": { "cssnano-preset-advanced": "^6.1.2", "postcss": "^8.5.4", "postcss-sort-media-queries": "^5.2.0", "tslib": "^2.6.0" } }, "sha512-8gBKup94aGttRduABsj7bpPFTX7kbwu+xh3K9NMCF5K4bWBqTFYW+REKHF6iBVDHRJ4grZdIPbvkiHd/XNKRMQ=="], + + "@docusaurus/logger": ["@docusaurus/logger@3.9.2", "", { "dependencies": { "chalk": "^4.1.2", "tslib": "^2.6.0" } }, "sha512-/SVCc57ByARzGSU60c50rMyQlBuMIJCjcsJlkphxY6B0GV4UH3tcA1994N8fFfbJ9kX3jIBe/xg3XP5qBtGDbA=="], + + "@docusaurus/mdx-loader": ["@docusaurus/mdx-loader@3.9.2", "", { "dependencies": { "@docusaurus/logger": "3.9.2", "@docusaurus/utils": "3.9.2", "@docusaurus/utils-validation": "3.9.2", "@mdx-js/mdx": "^3.0.0", "@slorber/remark-comment": "^1.0.0", "escape-html": "^1.0.3", "estree-util-value-to-estree": "^3.0.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "image-size": "^2.0.2", "mdast-util-mdx": "^3.0.0", "mdast-util-to-string": "^4.0.0", "rehype-raw": "^7.0.0", "remark-directive": "^3.0.0", "remark-emoji": "^4.0.0", "remark-frontmatter": "^5.0.0", "remark-gfm": "^4.0.0", "stringify-object": "^3.3.0", "tslib": "^2.6.0", "unified": "^11.0.3", "unist-util-visit": "^5.0.0", "url-loader": "^4.1.1", "vfile": "^6.0.1", "webpack": "^5.88.1" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-wiYoGwF9gdd6rev62xDU8AAM8JuLI/hlwOtCzMmYcspEkzecKrP8J8X+KpYnTlACBUUtXNJpSoCwFWJhLRevzQ=="], + + "@docusaurus/module-type-aliases": ["@docusaurus/module-type-aliases@3.9.2", "", { "dependencies": { "@docusaurus/types": "3.9.2", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", "@types/react-router-dom": "*", "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" }, "peerDependencies": { "react": "*", "react-dom": "*" } }, "sha512-8qVe2QA9hVLzvnxP46ysuofJUIc/yYQ82tvA/rBTrnpXtCjNSFLxEZfd5U8cYZuJIVlkPxamsIgwd5tGZXfvew=="], + + "@docusaurus/plugin-content-blog": ["@docusaurus/plugin-content-blog@3.9.2", "", { "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", "@docusaurus/mdx-loader": "3.9.2", "@docusaurus/theme-common": "3.9.2", "@docusaurus/types": "3.9.2", "@docusaurus/utils": "3.9.2", "@docusaurus/utils-common": "3.9.2", "@docusaurus/utils-validation": "3.9.2", "cheerio": "1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^11.1.1", "lodash": "^4.17.21", "schema-dts": "^1.1.2", "srcset": "^4.0.0", "tslib": "^2.6.0", "unist-util-visit": "^5.0.0", "utility-types": "^3.10.0", "webpack": "^5.88.1" }, "peerDependencies": { "@docusaurus/plugin-content-docs": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-3I2HXy3L1QcjLJLGAoTvoBnpOwa6DPUa3Q0dMK19UTY9mhPkKQg/DYhAGTiBUKcTR0f08iw7kLPqOhIgdV3eVQ=="], + + "@docusaurus/plugin-content-docs": ["@docusaurus/plugin-content-docs@3.9.2", "", { "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", "@docusaurus/mdx-loader": "3.9.2", "@docusaurus/module-type-aliases": "3.9.2", "@docusaurus/theme-common": "3.9.2", "@docusaurus/types": "3.9.2", "@docusaurus/utils": "3.9.2", "@docusaurus/utils-common": "3.9.2", "@docusaurus/utils-validation": "3.9.2", "@types/react-router-config": "^5.0.7", "combine-promises": "^1.1.0", "fs-extra": "^11.1.1", "js-yaml": "^4.1.0", "lodash": "^4.17.21", "schema-dts": "^1.1.2", "tslib": "^2.6.0", "utility-types": "^3.10.0", "webpack": "^5.88.1" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg=="], + + "@docusaurus/plugin-content-pages": ["@docusaurus/plugin-content-pages@3.9.2", "", { "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/mdx-loader": "3.9.2", "@docusaurus/types": "3.9.2", "@docusaurus/utils": "3.9.2", "@docusaurus/utils-validation": "3.9.2", "fs-extra": "^11.1.1", "tslib": "^2.6.0", "webpack": "^5.88.1" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-s4849w/p4noXUrGpPUF0BPqIAfdAe76BLaRGAGKZ1gTDNiGxGcpsLcwJ9OTi1/V8A+AzvsmI9pkjie2zjIQZKA=="], + + "@docusaurus/plugin-css-cascade-layers": ["@docusaurus/plugin-css-cascade-layers@3.9.2", "", { "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/types": "3.9.2", "@docusaurus/utils": "3.9.2", "@docusaurus/utils-validation": "3.9.2", "tslib": "^2.6.0" } }, "sha512-w1s3+Ss+eOQbscGM4cfIFBlVg/QKxyYgj26k5AnakuHkKxH6004ZtuLe5awMBotIYF2bbGDoDhpgQ4r/kcj4rQ=="], + + "@docusaurus/plugin-debug": ["@docusaurus/plugin-debug@3.9.2", "", { "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/types": "3.9.2", "@docusaurus/utils": "3.9.2", "fs-extra": "^11.1.1", "react-json-view-lite": "^2.3.0", "tslib": "^2.6.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-j7a5hWuAFxyQAkilZwhsQ/b3T7FfHZ+0dub6j/GxKNFJp2h9qk/P1Bp7vrGASnvA9KNQBBL1ZXTe7jlh4VdPdA=="], + + "@docusaurus/plugin-google-analytics": ["@docusaurus/plugin-google-analytics@3.9.2", "", { "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/types": "3.9.2", "@docusaurus/utils-validation": "3.9.2", "tslib": "^2.6.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-mAwwQJ1Us9jL/lVjXtErXto4p4/iaLlweC54yDUK1a97WfkC6Z2k5/769JsFgwOwOP+n5mUQGACXOEQ0XDuVUw=="], + + "@docusaurus/plugin-google-gtag": ["@docusaurus/plugin-google-gtag@3.9.2", "", { "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/types": "3.9.2", "@docusaurus/utils-validation": "3.9.2", "@types/gtag.js": "^0.0.12", "tslib": "^2.6.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-YJ4lDCphabBtw19ooSlc1MnxtYGpjFV9rEdzjLsUnBCeis2djUyCozZaFhCg6NGEwOn7HDDyMh0yzcdRpnuIvA=="], + + "@docusaurus/plugin-google-tag-manager": ["@docusaurus/plugin-google-tag-manager@3.9.2", "", { "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/types": "3.9.2", "@docusaurus/utils-validation": "3.9.2", "tslib": "^2.6.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-LJtIrkZN/tuHD8NqDAW1Tnw0ekOwRTfobWPsdO15YxcicBo2ykKF0/D6n0vVBfd3srwr9Z6rzrIWYrMzBGrvNw=="], + + "@docusaurus/plugin-sitemap": ["@docusaurus/plugin-sitemap@3.9.2", "", { "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", "@docusaurus/types": "3.9.2", "@docusaurus/utils": "3.9.2", "@docusaurus/utils-common": "3.9.2", "@docusaurus/utils-validation": "3.9.2", "fs-extra": "^11.1.1", "sitemap": "^7.1.1", "tslib": "^2.6.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-WLh7ymgDXjG8oPoM/T4/zUP7KcSuFYRZAUTl8vR6VzYkfc18GBM4xLhcT+AKOwun6kBivYKUJf+vlqYJkm+RHw=="], + + "@docusaurus/plugin-svgr": ["@docusaurus/plugin-svgr@3.9.2", "", { "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/types": "3.9.2", "@docusaurus/utils": "3.9.2", "@docusaurus/utils-validation": "3.9.2", "@svgr/core": "8.1.0", "@svgr/webpack": "^8.1.0", "tslib": "^2.6.0", "webpack": "^5.88.1" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-n+1DE+5b3Lnf27TgVU5jM1d4x5tUh2oW5LTsBxJX4PsAPV0JGcmI6p3yLYtEY0LRVEIJh+8RsdQmRE66wSV8mw=="], + + "@docusaurus/preset-classic": ["@docusaurus/preset-classic@3.9.2", "", { "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/plugin-content-blog": "3.9.2", "@docusaurus/plugin-content-docs": "3.9.2", "@docusaurus/plugin-content-pages": "3.9.2", "@docusaurus/plugin-css-cascade-layers": "3.9.2", "@docusaurus/plugin-debug": "3.9.2", "@docusaurus/plugin-google-analytics": "3.9.2", "@docusaurus/plugin-google-gtag": "3.9.2", "@docusaurus/plugin-google-tag-manager": "3.9.2", "@docusaurus/plugin-sitemap": "3.9.2", "@docusaurus/plugin-svgr": "3.9.2", "@docusaurus/theme-classic": "3.9.2", "@docusaurus/theme-common": "3.9.2", "@docusaurus/theme-search-algolia": "3.9.2", "@docusaurus/types": "3.9.2" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-IgyYO2Gvaigi21LuDIe+nvmN/dfGXAiMcV/murFqcpjnZc7jxFAxW+9LEjdPt61uZLxG4ByW/oUmX/DDK9t/8w=="], + + "@docusaurus/theme-classic": ["@docusaurus/theme-classic@3.9.2", "", { "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", "@docusaurus/mdx-loader": "3.9.2", "@docusaurus/module-type-aliases": "3.9.2", "@docusaurus/plugin-content-blog": "3.9.2", "@docusaurus/plugin-content-docs": "3.9.2", "@docusaurus/plugin-content-pages": "3.9.2", "@docusaurus/theme-common": "3.9.2", "@docusaurus/theme-translations": "3.9.2", "@docusaurus/types": "3.9.2", "@docusaurus/utils": "3.9.2", "@docusaurus/utils-common": "3.9.2", "@docusaurus/utils-validation": "3.9.2", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "infima": "0.2.0-alpha.45", "lodash": "^4.17.21", "nprogress": "^0.2.0", "postcss": "^8.5.4", "prism-react-renderer": "^2.3.0", "prismjs": "^1.29.0", "react-router-dom": "^5.3.4", "rtlcss": "^4.1.0", "tslib": "^2.6.0", "utility-types": "^3.10.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-IGUsArG5hhekXd7RDb11v94ycpJpFdJPkLnt10fFQWOVxAtq5/D7hT6lzc2fhyQKaaCE62qVajOMKL7OiAFAIA=="], + + "@docusaurus/theme-common": ["@docusaurus/theme-common@3.9.2", "", { "dependencies": { "@docusaurus/mdx-loader": "3.9.2", "@docusaurus/module-type-aliases": "3.9.2", "@docusaurus/utils": "3.9.2", "@docusaurus/utils-common": "3.9.2", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", "clsx": "^2.0.0", "parse-numeric-range": "^1.3.0", "prism-react-renderer": "^2.3.0", "tslib": "^2.6.0", "utility-types": "^3.10.0" }, "peerDependencies": { "@docusaurus/plugin-content-docs": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-6c4DAbR6n6nPbnZhY2V3tzpnKnGL+6aOsLvFL26VRqhlczli9eWG0VDUNoCQEPnGwDMhPS42UhSAnz5pThm5Ag=="], + + "@docusaurus/theme-mermaid": ["@docusaurus/theme-mermaid@3.9.2", "", { "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/module-type-aliases": "3.9.2", "@docusaurus/theme-common": "3.9.2", "@docusaurus/types": "3.9.2", "@docusaurus/utils-validation": "3.9.2", "mermaid": ">=11.6.0", "tslib": "^2.6.0" }, "peerDependencies": { "@mermaid-js/layout-elk": "^0.1.9", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@mermaid-js/layout-elk"] }, "sha512-5vhShRDq/ntLzdInsQkTdoKWSzw8d1jB17sNPYhA/KvYYFXfuVEGHLM6nrf8MFbV8TruAHDG21Fn3W4lO8GaDw=="], + + "@docusaurus/theme-search-algolia": ["@docusaurus/theme-search-algolia@3.9.2", "", { "dependencies": { "@docsearch/react": "^3.9.0 || ^4.1.0", "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", "@docusaurus/plugin-content-docs": "3.9.2", "@docusaurus/theme-common": "3.9.2", "@docusaurus/theme-translations": "3.9.2", "@docusaurus/utils": "3.9.2", "@docusaurus/utils-validation": "3.9.2", "algoliasearch": "^5.37.0", "algoliasearch-helper": "^3.26.0", "clsx": "^2.0.0", "eta": "^2.2.0", "fs-extra": "^11.1.1", "lodash": "^4.17.21", "tslib": "^2.6.0", "utility-types": "^3.10.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-GBDSFNwjnh5/LdkxCKQHkgO2pIMX1447BxYUBG2wBiajS21uj64a+gH/qlbQjDLxmGrbrllBrtJkUHxIsiwRnw=="], + + "@docusaurus/theme-translations": ["@docusaurus/theme-translations@3.9.2", "", { "dependencies": { "fs-extra": "^11.1.1", "tslib": "^2.6.0" } }, "sha512-vIryvpP18ON9T9rjgMRFLr2xJVDpw1rtagEGf8Ccce4CkTrvM/fRB8N2nyWYOW5u3DdjkwKw5fBa+3tbn9P4PA=="], + + "@docusaurus/types": ["@docusaurus/types@3.9.2", "", { "dependencies": { "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", "@types/mdast": "^4.0.2", "@types/react": "*", "commander": "^5.1.0", "joi": "^17.9.2", "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", "utility-types": "^3.10.0", "webpack": "^5.95.0", "webpack-merge": "^5.9.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q=="], + + "@docusaurus/utils": ["@docusaurus/utils@3.9.2", "", { "dependencies": { "@docusaurus/logger": "3.9.2", "@docusaurus/types": "3.9.2", "@docusaurus/utils-common": "3.9.2", "escape-string-regexp": "^4.0.0", "execa": "5.1.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "github-slugger": "^1.5.0", "globby": "^11.1.0", "gray-matter": "^4.0.3", "jiti": "^1.20.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", "micromatch": "^4.0.5", "p-queue": "^6.6.2", "prompts": "^2.4.2", "resolve-pathname": "^3.0.0", "tslib": "^2.6.0", "url-loader": "^4.1.1", "utility-types": "^3.10.0", "webpack": "^5.88.1" } }, "sha512-lBSBiRruFurFKXr5Hbsl2thmGweAPmddhF3jb99U4EMDA5L+e5Y1rAkOS07Nvrup7HUMBDrCV45meaxZnt28nQ=="], + + "@docusaurus/utils-common": ["@docusaurus/utils-common@3.9.2", "", { "dependencies": { "@docusaurus/types": "3.9.2", "tslib": "^2.6.0" } }, "sha512-I53UC1QctruA6SWLvbjbhCpAw7+X7PePoe5pYcwTOEXD/PxeP8LnECAhTHHwWCblyUX5bMi4QLRkxvyZ+IT8Aw=="], + + "@docusaurus/utils-validation": ["@docusaurus/utils-validation@3.9.2", "", { "dependencies": { "@docusaurus/logger": "3.9.2", "@docusaurus/utils": "3.9.2", "@docusaurus/utils-common": "3.9.2", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", "lodash": "^4.17.21", "tslib": "^2.6.0" } }, "sha512-l7yk3X5VnNmATbwijJkexdhulNsQaNDwoagiwujXoxFbWLcxHQqNQ+c/IAlzrfMMOfa/8xSBZ7KEKDesE/2J7A=="], + + "@hapi/hoek": ["@hapi/hoek@9.3.0", "", {}, "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ=="], + + "@hapi/topo": ["@hapi/topo@5.1.0", "", { "dependencies": { "@hapi/hoek": "^9.0.0" } }, "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg=="], + + "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], + + "@iconify/utils": ["@iconify/utils@3.0.2", "", { "dependencies": { "@antfu/install-pkg": "^1.1.0", "@antfu/utils": "^9.2.0", "@iconify/types": "^2.0.0", "debug": "^4.4.1", "globals": "^15.15.0", "kolorist": "^1.8.0", "local-pkg": "^1.1.1", "mlly": "^1.7.4" } }, "sha512-EfJS0rLfVuRuJRn4psJHtK2A9TqVnkxPpHY6lYHiB9+8eSuudsxbwMiavocG45ujOo6FJ+CIRlRnlOGinzkaGQ=="], + + "@jest/schemas": ["@jest/schemas@29.6.3", "", { "dependencies": { "@sinclair/typebox": "^0.27.8" } }, "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA=="], + + "@jest/types": ["@jest/types@29.6.3", "", { "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/source-map": ["@jridgewell/source-map@0.3.11", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + + "@jsonjoy.com/base64": ["@jsonjoy.com/base64@1.1.2", "", { "peerDependencies": { "tslib": "2" } }, "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA=="], + + "@jsonjoy.com/buffers": ["@jsonjoy.com/buffers@1.2.1", "", { "peerDependencies": { "tslib": "2" } }, "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA=="], + + "@jsonjoy.com/codegen": ["@jsonjoy.com/codegen@1.0.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g=="], + + "@jsonjoy.com/json-pack": ["@jsonjoy.com/json-pack@1.21.0", "", { "dependencies": { "@jsonjoy.com/base64": "^1.1.2", "@jsonjoy.com/buffers": "^1.2.0", "@jsonjoy.com/codegen": "^1.0.0", "@jsonjoy.com/json-pointer": "^1.0.2", "@jsonjoy.com/util": "^1.9.0", "hyperdyperid": "^1.2.0", "thingies": "^2.5.0", "tree-dump": "^1.1.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg=="], + + "@jsonjoy.com/json-pointer": ["@jsonjoy.com/json-pointer@1.0.2", "", { "dependencies": { "@jsonjoy.com/codegen": "^1.0.0", "@jsonjoy.com/util": "^1.9.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg=="], + + "@jsonjoy.com/util": ["@jsonjoy.com/util@1.9.0", "", { "dependencies": { "@jsonjoy.com/buffers": "^1.0.0", "@jsonjoy.com/codegen": "^1.0.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ=="], + + "@leichtgewicht/ip-codec": ["@leichtgewicht/ip-codec@2.0.5", "", {}, "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw=="], + + "@mdx-js/mdx": ["@mdx-js/mdx@3.1.1", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "acorn": "^8.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ=="], + + "@mdx-js/react": ["@mdx-js/react@3.1.1", "", { "dependencies": { "@types/mdx": "^2.0.0" }, "peerDependencies": { "@types/react": ">=16", "react": ">=16" } }, "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw=="], + + "@mermaid-js/parser": ["@mermaid-js/parser@0.6.3", "", { "dependencies": { "langium": "3.3.1" } }, "sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="], + + "@pnpm/config.env-replace": ["@pnpm/config.env-replace@1.1.0", "", {}, "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w=="], + + "@pnpm/network.ca-file": ["@pnpm/network.ca-file@1.0.2", "", { "dependencies": { "graceful-fs": "4.2.10" } }, "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA=="], + + "@pnpm/npm-conf": ["@pnpm/npm-conf@2.3.1", "", { "dependencies": { "@pnpm/config.env-replace": "^1.1.0", "@pnpm/network.ca-file": "^1.0.1", "config-chain": "^1.1.11" } }, "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw=="], + + "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="], + + "@sideway/address": ["@sideway/address@4.1.5", "", { "dependencies": { "@hapi/hoek": "^9.0.0" } }, "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q=="], + + "@sideway/formula": ["@sideway/formula@3.0.1", "", {}, "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg=="], + + "@sideway/pinpoint": ["@sideway/pinpoint@2.0.0", "", {}, "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ=="], + + "@sinclair/typebox": ["@sinclair/typebox@0.27.8", "", {}, "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA=="], + + "@sindresorhus/is": ["@sindresorhus/is@4.6.0", "", {}, "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="], + + "@slorber/remark-comment": ["@slorber/remark-comment@1.0.0", "", { "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.1.0", "micromark-util-symbol": "^1.0.1" } }, "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA=="], + + "@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="], + + "@svgr/babel-plugin-add-jsx-attribute": ["@svgr/babel-plugin-add-jsx-attribute@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g=="], + + "@svgr/babel-plugin-remove-jsx-attribute": ["@svgr/babel-plugin-remove-jsx-attribute@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA=="], + + "@svgr/babel-plugin-remove-jsx-empty-expression": ["@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA=="], + + "@svgr/babel-plugin-replace-jsx-attribute-value": ["@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ=="], + + "@svgr/babel-plugin-svg-dynamic-title": ["@svgr/babel-plugin-svg-dynamic-title@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og=="], + + "@svgr/babel-plugin-svg-em-dimensions": ["@svgr/babel-plugin-svg-em-dimensions@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g=="], + + "@svgr/babel-plugin-transform-react-native-svg": ["@svgr/babel-plugin-transform-react-native-svg@8.1.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q=="], + + "@svgr/babel-plugin-transform-svg-component": ["@svgr/babel-plugin-transform-svg-component@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw=="], + + "@svgr/babel-preset": ["@svgr/babel-preset@8.1.0", "", { "dependencies": { "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", "@svgr/babel-plugin-transform-svg-component": "8.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug=="], + + "@svgr/core": ["@svgr/core@8.1.0", "", { "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", "camelcase": "^6.2.0", "cosmiconfig": "^8.1.3", "snake-case": "^3.0.4" } }, "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA=="], + + "@svgr/hast-util-to-babel-ast": ["@svgr/hast-util-to-babel-ast@8.0.0", "", { "dependencies": { "@babel/types": "^7.21.3", "entities": "^4.4.0" } }, "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q=="], + + "@svgr/plugin-jsx": ["@svgr/plugin-jsx@8.1.0", "", { "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", "@svgr/hast-util-to-babel-ast": "8.0.0", "svg-parser": "^2.0.4" }, "peerDependencies": { "@svgr/core": "*" } }, "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA=="], + + "@svgr/plugin-svgo": ["@svgr/plugin-svgo@8.1.0", "", { "dependencies": { "cosmiconfig": "^8.1.3", "deepmerge": "^4.3.1", "svgo": "^3.0.2" }, "peerDependencies": { "@svgr/core": "*" } }, "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA=="], + + "@svgr/webpack": ["@svgr/webpack@8.1.0", "", { "dependencies": { "@babel/core": "^7.21.3", "@babel/plugin-transform-react-constant-elements": "^7.21.3", "@babel/preset-env": "^7.20.2", "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.21.0", "@svgr/core": "8.1.0", "@svgr/plugin-jsx": "8.1.0", "@svgr/plugin-svgo": "8.1.0" } }, "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA=="], + + "@szmarczak/http-timer": ["@szmarczak/http-timer@5.0.1", "", { "dependencies": { "defer-to-connect": "^2.0.1" } }, "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw=="], + + "@trysound/sax": ["@trysound/sax@0.2.0", "", {}, "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA=="], + + "@types/body-parser": ["@types/body-parser@1.19.6", "", { "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g=="], + + "@types/bonjour": ["@types/bonjour@3.5.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ=="], + + "@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="], + + "@types/connect-history-api-fallback": ["@types/connect-history-api-fallback@1.5.4", "", { "dependencies": { "@types/express-serve-static-core": "*", "@types/node": "*" } }, "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw=="], + + "@types/d3": ["@types/d3@7.4.3", "", { "dependencies": { "@types/d3-array": "*", "@types/d3-axis": "*", "@types/d3-brush": "*", "@types/d3-chord": "*", "@types/d3-color": "*", "@types/d3-contour": "*", "@types/d3-delaunay": "*", "@types/d3-dispatch": "*", "@types/d3-drag": "*", "@types/d3-dsv": "*", "@types/d3-ease": "*", "@types/d3-fetch": "*", "@types/d3-force": "*", "@types/d3-format": "*", "@types/d3-geo": "*", "@types/d3-hierarchy": "*", "@types/d3-interpolate": "*", "@types/d3-path": "*", "@types/d3-polygon": "*", "@types/d3-quadtree": "*", "@types/d3-random": "*", "@types/d3-scale": "*", "@types/d3-scale-chromatic": "*", "@types/d3-selection": "*", "@types/d3-shape": "*", "@types/d3-time": "*", "@types/d3-time-format": "*", "@types/d3-timer": "*", "@types/d3-transition": "*", "@types/d3-zoom": "*" } }, "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww=="], + + "@types/d3-array": ["@types/d3-array@3.2.2", "", {}, "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw=="], + + "@types/d3-axis": ["@types/d3-axis@3.0.6", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw=="], + + "@types/d3-brush": ["@types/d3-brush@3.0.6", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A=="], + + "@types/d3-chord": ["@types/d3-chord@3.0.6", "", {}, "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg=="], + + "@types/d3-color": ["@types/d3-color@3.1.3", "", {}, "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="], + + "@types/d3-contour": ["@types/d3-contour@3.0.6", "", { "dependencies": { "@types/d3-array": "*", "@types/geojson": "*" } }, "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg=="], + + "@types/d3-delaunay": ["@types/d3-delaunay@6.0.4", "", {}, "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw=="], + + "@types/d3-dispatch": ["@types/d3-dispatch@3.0.7", "", {}, "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA=="], + + "@types/d3-drag": ["@types/d3-drag@3.0.7", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ=="], + + "@types/d3-dsv": ["@types/d3-dsv@3.0.7", "", {}, "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g=="], + + "@types/d3-ease": ["@types/d3-ease@3.0.2", "", {}, "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="], + + "@types/d3-fetch": ["@types/d3-fetch@3.0.7", "", { "dependencies": { "@types/d3-dsv": "*" } }, "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA=="], + + "@types/d3-force": ["@types/d3-force@3.0.10", "", {}, "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw=="], + + "@types/d3-format": ["@types/d3-format@3.0.4", "", {}, "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g=="], + + "@types/d3-geo": ["@types/d3-geo@3.1.0", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ=="], + + "@types/d3-hierarchy": ["@types/d3-hierarchy@3.1.7", "", {}, "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg=="], + + "@types/d3-interpolate": ["@types/d3-interpolate@3.0.4", "", { "dependencies": { "@types/d3-color": "*" } }, "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA=="], + + "@types/d3-path": ["@types/d3-path@3.1.1", "", {}, "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg=="], + + "@types/d3-polygon": ["@types/d3-polygon@3.0.2", "", {}, "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA=="], + + "@types/d3-quadtree": ["@types/d3-quadtree@3.0.6", "", {}, "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg=="], + + "@types/d3-random": ["@types/d3-random@3.0.3", "", {}, "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ=="], + + "@types/d3-scale": ["@types/d3-scale@4.0.9", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="], + + "@types/d3-scale-chromatic": ["@types/d3-scale-chromatic@3.1.0", "", {}, "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ=="], + + "@types/d3-selection": ["@types/d3-selection@3.0.11", "", {}, "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w=="], + + "@types/d3-shape": ["@types/d3-shape@3.1.7", "", { "dependencies": { "@types/d3-path": "*" } }, "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg=="], + + "@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="], + + "@types/d3-time-format": ["@types/d3-time-format@4.0.3", "", {}, "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg=="], + + "@types/d3-timer": ["@types/d3-timer@3.0.2", "", {}, "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="], + + "@types/d3-transition": ["@types/d3-transition@3.0.9", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg=="], + + "@types/d3-zoom": ["@types/d3-zoom@3.0.8", "", { "dependencies": { "@types/d3-interpolate": "*", "@types/d3-selection": "*" } }, "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw=="], + + "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="], + + "@types/eslint": ["@types/eslint@9.6.1", "", { "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag=="], + + "@types/eslint-scope": ["@types/eslint-scope@3.7.7", "", { "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg=="], + + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="], + + "@types/express": ["@types/express@4.17.25", "", { "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "^1" } }, "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw=="], + + "@types/express-serve-static-core": ["@types/express-serve-static-core@4.19.7", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg=="], + + "@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="], + + "@types/gtag.js": ["@types/gtag.js@0.0.12", "", {}, "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg=="], + + "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], + + "@types/history": ["@types/history@4.7.11", "", {}, "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA=="], + + "@types/html-minifier-terser": ["@types/html-minifier-terser@6.1.0", "", {}, "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg=="], + + "@types/http-cache-semantics": ["@types/http-cache-semantics@4.0.4", "", {}, "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA=="], + + "@types/http-errors": ["@types/http-errors@2.0.5", "", {}, "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg=="], + + "@types/http-proxy": ["@types/http-proxy@1.17.17", "", { "dependencies": { "@types/node": "*" } }, "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw=="], + + "@types/istanbul-lib-coverage": ["@types/istanbul-lib-coverage@2.0.6", "", {}, "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="], + + "@types/istanbul-lib-report": ["@types/istanbul-lib-report@3.0.3", "", { "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA=="], + + "@types/istanbul-reports": ["@types/istanbul-reports@3.0.4", "", { "dependencies": { "@types/istanbul-lib-report": "*" } }, "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], + + "@types/mdx": ["@types/mdx@2.0.13", "", {}, "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw=="], + + "@types/mime": ["@types/mime@1.3.5", "", {}, "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="], + + "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], + + "@types/node": ["@types/node@17.0.45", "", {}, "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw=="], + + "@types/node-forge": ["@types/node-forge@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw=="], + + "@types/prismjs": ["@types/prismjs@1.26.5", "", {}, "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ=="], + + "@types/qs": ["@types/qs@6.14.0", "", {}, "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ=="], + + "@types/range-parser": ["@types/range-parser@1.2.7", "", {}, "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="], + + "@types/react": ["@types/react@19.2.2", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA=="], + + "@types/react-router": ["@types/react-router@5.1.20", "", { "dependencies": { "@types/history": "^4.7.11", "@types/react": "*" } }, "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q=="], + + "@types/react-router-config": ["@types/react-router-config@5.0.11", "", { "dependencies": { "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router": "^5.1.0" } }, "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw=="], + + "@types/react-router-dom": ["@types/react-router-dom@5.3.3", "", { "dependencies": { "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router": "*" } }, "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw=="], + + "@types/retry": ["@types/retry@0.12.2", "", {}, "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow=="], + + "@types/sax": ["@types/sax@1.2.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A=="], + + "@types/send": ["@types/send@0.17.6", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og=="], + + "@types/serve-index": ["@types/serve-index@1.9.4", "", { "dependencies": { "@types/express": "*" } }, "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug=="], + + "@types/serve-static": ["@types/serve-static@1.15.10", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "<1" } }, "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw=="], + + "@types/sockjs": ["@types/sockjs@0.3.36", "", { "dependencies": { "@types/node": "*" } }, "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q=="], + + "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], + + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + + "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], + + "@types/yargs": ["@types/yargs@17.0.34", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A=="], + + "@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="], + + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], + + "@vercel/oidc": ["@vercel/oidc@3.0.3", "", {}, "sha512-yNEQvPcVrK9sIe637+I0jD6leluPxzwJKx/Haw6F4H77CdDsszUn5V3o96LPziXkSNE2B83+Z3mjqGKBK/R6Gg=="], + + "@webassemblyjs/ast": ["@webassemblyjs/ast@1.14.1", "", { "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ=="], + + "@webassemblyjs/floating-point-hex-parser": ["@webassemblyjs/floating-point-hex-parser@1.13.2", "", {}, "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA=="], + + "@webassemblyjs/helper-api-error": ["@webassemblyjs/helper-api-error@1.13.2", "", {}, "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ=="], + + "@webassemblyjs/helper-buffer": ["@webassemblyjs/helper-buffer@1.14.1", "", {}, "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA=="], + + "@webassemblyjs/helper-numbers": ["@webassemblyjs/helper-numbers@1.13.2", "", { "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA=="], + + "@webassemblyjs/helper-wasm-bytecode": ["@webassemblyjs/helper-wasm-bytecode@1.13.2", "", {}, "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA=="], + + "@webassemblyjs/helper-wasm-section": ["@webassemblyjs/helper-wasm-section@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/wasm-gen": "1.14.1" } }, "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw=="], + + "@webassemblyjs/ieee754": ["@webassemblyjs/ieee754@1.13.2", "", { "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw=="], + + "@webassemblyjs/leb128": ["@webassemblyjs/leb128@1.13.2", "", { "dependencies": { "@xtuc/long": "4.2.2" } }, "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw=="], + + "@webassemblyjs/utf8": ["@webassemblyjs/utf8@1.13.2", "", {}, "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ=="], + + "@webassemblyjs/wasm-edit": ["@webassemblyjs/wasm-edit@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/helper-wasm-section": "1.14.1", "@webassemblyjs/wasm-gen": "1.14.1", "@webassemblyjs/wasm-opt": "1.14.1", "@webassemblyjs/wasm-parser": "1.14.1", "@webassemblyjs/wast-printer": "1.14.1" } }, "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ=="], + + "@webassemblyjs/wasm-gen": ["@webassemblyjs/wasm-gen@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/ieee754": "1.13.2", "@webassemblyjs/leb128": "1.13.2", "@webassemblyjs/utf8": "1.13.2" } }, "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg=="], + + "@webassemblyjs/wasm-opt": ["@webassemblyjs/wasm-opt@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/wasm-gen": "1.14.1", "@webassemblyjs/wasm-parser": "1.14.1" } }, "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw=="], + + "@webassemblyjs/wasm-parser": ["@webassemblyjs/wasm-parser@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-api-error": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/ieee754": "1.13.2", "@webassemblyjs/leb128": "1.13.2", "@webassemblyjs/utf8": "1.13.2" } }, "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ=="], + + "@webassemblyjs/wast-printer": ["@webassemblyjs/wast-printer@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw=="], + + "@xtuc/ieee754": ["@xtuc/ieee754@1.2.0", "", {}, "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="], + + "@xtuc/long": ["@xtuc/long@4.2.2", "", {}, "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="], + + "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], + + "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "acorn-import-phases": ["acorn-import-phases@1.0.4", "", { "peerDependencies": { "acorn": "^8.14.0" } }, "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "acorn-walk": ["acorn-walk@8.3.4", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g=="], + + "address": ["address@1.2.2", "", {}, "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA=="], + + "aggregate-error": ["aggregate-error@3.1.0", "", { "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" } }, "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA=="], + + "ai": ["ai@5.0.82", "", { "dependencies": { "@ai-sdk/gateway": "2.0.3", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.14", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-wmZZfsU40qB77umrcj3YzMSk6cUP5gxLXZDPfiSQLBLegTVXPUdSJC603tR7JB5JkhBDzN5VLaliuRKQGKpUXg=="], + + "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + + "ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="], + + "ajv-keywords": ["ajv-keywords@5.1.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="], + + "algoliasearch": ["algoliasearch@5.41.0", "", { "dependencies": { "@algolia/abtesting": "1.7.0", "@algolia/client-abtesting": "5.41.0", "@algolia/client-analytics": "5.41.0", "@algolia/client-common": "5.41.0", "@algolia/client-insights": "5.41.0", "@algolia/client-personalization": "5.41.0", "@algolia/client-query-suggestions": "5.41.0", "@algolia/client-search": "5.41.0", "@algolia/ingestion": "1.41.0", "@algolia/monitoring": "1.41.0", "@algolia/recommend": "5.41.0", "@algolia/requester-browser-xhr": "5.41.0", "@algolia/requester-fetch": "5.41.0", "@algolia/requester-node-http": "5.41.0" } }, "sha512-9E4b3rJmYbBkn7e3aAPt1as+VVnRhsR4qwRRgOzpeyz4PAOuwKh0HI4AN6mTrqK0S0M9fCCSTOUnuJ8gPY/tvA=="], + + "algoliasearch-helper": ["algoliasearch-helper@3.26.0", "", { "dependencies": { "@algolia/events": "^4.0.1" }, "peerDependencies": { "algoliasearch": ">= 3.1 < 6" } }, "sha512-Rv2x3GXleQ3ygwhkhJubhhYGsICmShLAiqtUuJTUkr9uOCOXyF2E71LVT4XDnVffbknv8XgScP4U0Oxtgm+hIw=="], + + "ansi-align": ["ansi-align@3.0.1", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="], + + "ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="], + + "ansi-html-community": ["ansi-html-community@0.0.8", "", { "bin": { "ansi-html": "bin/ansi-html" } }, "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw=="], + + "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "array-flatten": ["array-flatten@1.1.1", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="], + + "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], + + "asap": ["asap@2.0.6", "", {}, "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="], + + "asn1": ["asn1@0.2.6", "", { "dependencies": { "safer-buffer": "~2.1.0" } }, "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ=="], + + "assert-plus": ["assert-plus@1.0.0", "", {}, "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="], + + "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "autoprefixer": ["autoprefixer@10.4.21", "", { "dependencies": { "browserslist": "^4.24.4", "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ=="], + + "aws-sign2": ["aws-sign2@0.7.0", "", {}, "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA=="], + + "aws4": ["aws4@1.13.2", "", {}, "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw=="], + + "babel-loader": ["babel-loader@9.2.1", "", { "dependencies": { "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" }, "peerDependencies": { "@babel/core": "^7.12.0", "webpack": ">=5" } }, "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA=="], + + "babel-plugin-dynamic-import-node": ["babel-plugin-dynamic-import-node@2.3.3", "", { "dependencies": { "object.assign": "^4.1.0" } }, "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ=="], + + "babel-plugin-polyfill-corejs2": ["babel-plugin-polyfill-corejs2@0.4.14", "", { "dependencies": { "@babel/compat-data": "^7.27.7", "@babel/helper-define-polyfill-provider": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg=="], + + "babel-plugin-polyfill-corejs3": ["babel-plugin-polyfill-corejs3@0.13.0", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5", "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A=="], + + "babel-plugin-polyfill-regenerator": ["babel-plugin-polyfill-regenerator@0.6.5", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg=="], + + "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "baseline-browser-mapping": ["baseline-browser-mapping@2.8.20", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ=="], + + "batch": ["batch@0.6.1", "", {}, "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw=="], + + "bcrypt-pbkdf": ["bcrypt-pbkdf@1.0.2", "", { "dependencies": { "tweetnacl": "^0.14.3" } }, "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w=="], + + "big.js": ["big.js@5.2.2", "", {}, "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="], + + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + + "body-parser": ["body-parser@1.20.3", "", { "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" } }, "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g=="], + + "bonjour-service": ["bonjour-service@1.3.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" } }, "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA=="], + + "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], + + "boxen": ["boxen@6.2.1", "", { "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^6.2.0", "chalk": "^4.1.2", "cli-boxes": "^3.0.0", "string-width": "^5.0.1", "type-fest": "^2.5.0", "widest-line": "^4.0.1", "wrap-ansi": "^8.0.1" } }, "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw=="], + + "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "browser-request": ["browser-request@0.3.3", "", {}, "sha512-YyNI4qJJ+piQG6MMEuo7J3Bzaqssufx04zpEKYfSrl/1Op59HWali9zMtBpXnkmqMcOuWJPZvudrm9wISmnCbg=="], + + "browserslist": ["browserslist@4.27.0", "", { "dependencies": { "baseline-browser-mapping": "^2.8.19", "caniuse-lite": "^1.0.30001751", "electron-to-chromium": "^1.5.238", "node-releases": "^2.0.26", "update-browserslist-db": "^1.1.4" }, "bin": { "browserslist": "cli.js" } }, "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="], + + "bytes": ["bytes@3.0.0", "", {}, "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw=="], + + "cacheable-lookup": ["cacheable-lookup@7.0.0", "", {}, "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w=="], + + "cacheable-request": ["cacheable-request@10.2.14", "", { "dependencies": { "@types/http-cache-semantics": "^4.0.2", "get-stream": "^6.0.1", "http-cache-semantics": "^4.1.1", "keyv": "^4.5.3", "mimic-response": "^4.0.0", "normalize-url": "^8.0.0", "responselike": "^3.0.0" } }, "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ=="], + + "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "camel-case": ["camel-case@4.1.2", "", { "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" } }, "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw=="], + + "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], + + "caniuse-api": ["caniuse-api@3.0.0", "", { "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", "lodash.memoize": "^4.1.2", "lodash.uniq": "^4.5.0" } }, "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001751", "", {}, "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw=="], + + "caseless": ["caseless@0.12.0", "", {}, "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="], + + "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "char-regex": ["char-regex@1.0.2", "", {}, "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw=="], + + "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], + + "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], + + "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + + "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="], + + "cheerio": ["cheerio@1.0.0-rc.12", "", { "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", "domutils": "^3.0.1", "htmlparser2": "^8.0.1", "parse5": "^7.0.0", "parse5-htmlparser2-tree-adapter": "^7.0.0" } }, "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q=="], + + "cheerio-select": ["cheerio-select@2.1.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-select": "^5.1.0", "css-what": "^6.1.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1" } }, "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g=="], + + "chevrotain": ["chevrotain@11.0.3", "", { "dependencies": { "@chevrotain/cst-dts-gen": "11.0.3", "@chevrotain/gast": "11.0.3", "@chevrotain/regexp-to-ast": "11.0.3", "@chevrotain/types": "11.0.3", "@chevrotain/utils": "11.0.3", "lodash-es": "4.17.21" } }, "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw=="], + + "chevrotain-allstar": ["chevrotain-allstar@0.3.1", "", { "dependencies": { "lodash-es": "^4.17.21" }, "peerDependencies": { "chevrotain": "^11.0.0" } }, "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw=="], + + "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], + + "chrome-trace-event": ["chrome-trace-event@1.0.4", "", {}, "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ=="], + + "ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], + + "clean-css": ["clean-css@5.3.3", "", { "dependencies": { "source-map": "~0.6.0" } }, "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg=="], + + "clean-stack": ["clean-stack@2.2.0", "", {}, "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="], + + "cli-boxes": ["cli-boxes@3.0.0", "", {}, "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="], + + "cli-table3": ["cli-table3@0.6.5", "", { "dependencies": { "string-width": "^4.2.0" }, "optionalDependencies": { "@colors/colors": "1.5.0" } }, "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ=="], + + "cliui": ["cliui@3.2.0", "", { "dependencies": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wrap-ansi": "^2.0.0" } }, "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w=="], + + "clone-deep": ["clone-deep@4.0.1", "", { "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", "shallow-clone": "^3.0.0" } }, "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "code-point-at": ["code-point-at@1.1.0", "", {}, "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA=="], + + "collapse-white-space": ["collapse-white-space@2.1.0", "", {}, "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "colord": ["colord@2.9.3", "", {}, "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw=="], + + "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], + + "combine-promises": ["combine-promises@1.2.0", "", {}, "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], + + "commander": ["commander@5.1.0", "", {}, "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="], + + "common-path-prefix": ["common-path-prefix@3.0.0", "", {}, "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w=="], + + "compressible": ["compressible@2.0.18", "", { "dependencies": { "mime-db": ">= 1.43.0 < 2" } }, "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg=="], + + "compression": ["compression@1.8.1", "", { "dependencies": { "bytes": "3.1.2", "compressible": "~2.0.18", "debug": "2.6.9", "negotiator": "~0.6.4", "on-headers": "~1.1.0", "safe-buffer": "5.2.1", "vary": "~1.1.2" } }, "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], + + "config-chain": ["config-chain@1.1.13", "", { "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" } }, "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ=="], + + "configstore": ["configstore@6.0.0", "", { "dependencies": { "dot-prop": "^6.0.1", "graceful-fs": "^4.2.6", "unique-string": "^3.0.0", "write-file-atomic": "^3.0.3", "xdg-basedir": "^5.0.1" } }, "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA=="], + + "connect-history-api-fallback": ["connect-history-api-fallback@2.0.0", "", {}, "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA=="], + + "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], + + "content-disposition": ["content-disposition@0.5.2", "", {}, "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA=="], + + "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], + + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "cookie": ["cookie@0.7.1", "", {}, "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w=="], + + "cookie-signature": ["cookie-signature@1.0.6", "", {}, "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="], + + "copy-webpack-plugin": ["copy-webpack-plugin@11.0.0", "", { "dependencies": { "fast-glob": "^3.2.11", "glob-parent": "^6.0.1", "globby": "^13.1.1", "normalize-path": "^3.0.0", "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ=="], + + "core-js": ["core-js@3.46.0", "", {}, "sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA=="], + + "core-js-compat": ["core-js-compat@3.46.0", "", { "dependencies": { "browserslist": "^4.26.3" } }, "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law=="], + + "core-js-pure": ["core-js-pure@3.46.0", "", {}, "sha512-NMCW30bHNofuhwLhYPt66OLOKTMbOhgTTatKVbaQC3KRHpTCiRIBYvtshr+NBYSnBxwAFhjW/RfJ0XbIjS16rw=="], + + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + + "cose-base": ["cose-base@1.0.3", "", { "dependencies": { "layout-base": "^1.0.0" } }, "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg=="], + + "cosmiconfig": ["cosmiconfig@8.3.6", "", { "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA=="], + + "create-react-class": ["create-react-class@15.7.0", "", { "dependencies": { "loose-envify": "^1.3.1", "object-assign": "^4.1.1" } }, "sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "crypto-random-string": ["crypto-random-string@4.0.0", "", { "dependencies": { "type-fest": "^1.0.1" } }, "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA=="], + + "css-blank-pseudo": ["css-blank-pseudo@7.0.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag=="], + + "css-declaration-sorter": ["css-declaration-sorter@7.3.0", "", { "peerDependencies": { "postcss": "^8.0.9" } }, "sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ=="], + + "css-has-pseudo": ["css-has-pseudo@7.0.3", "", { "dependencies": { "@csstools/selector-specificity": "^5.0.0", "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA=="], + + "css-loader": ["css-loader@6.11.0", "", { "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", "postcss-modules-extract-imports": "^3.1.0", "postcss-modules-local-by-default": "^4.0.5", "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", "semver": "^7.5.4" }, "peerDependencies": { "@rspack/core": "0.x || 1.x", "webpack": "^5.0.0" }, "optionalPeers": ["@rspack/core", "webpack"] }, "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g=="], + + "css-minimizer-webpack-plugin": ["css-minimizer-webpack-plugin@5.0.1", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "cssnano": "^6.0.1", "jest-worker": "^29.4.3", "postcss": "^8.4.24", "schema-utils": "^4.0.1", "serialize-javascript": "^6.0.1" }, "peerDependencies": { "webpack": "^5.0.0" } }, "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg=="], + + "css-prefers-color-scheme": ["css-prefers-color-scheme@10.0.0", "", { "peerDependencies": { "postcss": "^8.4" } }, "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ=="], + + "css-select": ["css-select@4.3.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", "domhandler": "^4.3.1", "domutils": "^2.8.0", "nth-check": "^2.0.1" } }, "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ=="], + + "css-tree": ["css-tree@2.3.1", "", { "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" } }, "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw=="], + + "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="], + + "cssdb": ["cssdb@8.4.2", "", {}, "sha512-PzjkRkRUS+IHDJohtxkIczlxPPZqRo0nXplsYXOMBRPjcVRjj1W4DfvRgshUYTVuUigU7ptVYkFJQ7abUB0nyg=="], + + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + + "cssnano": ["cssnano@6.1.2", "", { "dependencies": { "cssnano-preset-default": "^6.1.2", "lilconfig": "^3.1.1" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA=="], + + "cssnano-preset-advanced": ["cssnano-preset-advanced@6.1.2", "", { "dependencies": { "autoprefixer": "^10.4.19", "browserslist": "^4.23.0", "cssnano-preset-default": "^6.1.2", "postcss-discard-unused": "^6.0.5", "postcss-merge-idents": "^6.0.3", "postcss-reduce-idents": "^6.0.3", "postcss-zindex": "^6.0.2" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ=="], + + "cssnano-preset-default": ["cssnano-preset-default@6.1.2", "", { "dependencies": { "browserslist": "^4.23.0", "css-declaration-sorter": "^7.2.0", "cssnano-utils": "^4.0.2", "postcss-calc": "^9.0.1", "postcss-colormin": "^6.1.0", "postcss-convert-values": "^6.1.0", "postcss-discard-comments": "^6.0.2", "postcss-discard-duplicates": "^6.0.3", "postcss-discard-empty": "^6.0.3", "postcss-discard-overridden": "^6.0.2", "postcss-merge-longhand": "^6.0.5", "postcss-merge-rules": "^6.1.1", "postcss-minify-font-values": "^6.1.0", "postcss-minify-gradients": "^6.0.3", "postcss-minify-params": "^6.1.0", "postcss-minify-selectors": "^6.0.4", "postcss-normalize-charset": "^6.0.2", "postcss-normalize-display-values": "^6.0.2", "postcss-normalize-positions": "^6.0.2", "postcss-normalize-repeat-style": "^6.0.2", "postcss-normalize-string": "^6.0.2", "postcss-normalize-timing-functions": "^6.0.2", "postcss-normalize-unicode": "^6.1.0", "postcss-normalize-url": "^6.0.2", "postcss-normalize-whitespace": "^6.0.2", "postcss-ordered-values": "^6.0.2", "postcss-reduce-initial": "^6.1.0", "postcss-reduce-transforms": "^6.0.2", "postcss-svgo": "^6.0.3", "postcss-unique-selectors": "^6.0.4" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg=="], + + "cssnano-utils": ["cssnano-utils@4.0.2", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ=="], + + "csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="], + + "cssom": ["cssom@0.3.8", "", {}, "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="], + + "cssstyle": ["cssstyle@0.2.37", "", { "dependencies": { "cssom": "0.3.x" } }, "sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA=="], + + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "cytoscape": ["cytoscape@3.33.1", "", {}, "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ=="], + + "cytoscape-cose-bilkent": ["cytoscape-cose-bilkent@4.1.0", "", { "dependencies": { "cose-base": "^1.0.0" }, "peerDependencies": { "cytoscape": "^3.2.0" } }, "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ=="], + + "cytoscape-fcose": ["cytoscape-fcose@2.2.0", "", { "dependencies": { "cose-base": "^2.2.0" }, "peerDependencies": { "cytoscape": "^3.2.0" } }, "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ=="], + + "d3": ["d3@7.9.0", "", { "dependencies": { "d3-array": "3", "d3-axis": "3", "d3-brush": "3", "d3-chord": "3", "d3-color": "3", "d3-contour": "4", "d3-delaunay": "6", "d3-dispatch": "3", "d3-drag": "3", "d3-dsv": "3", "d3-ease": "3", "d3-fetch": "3", "d3-force": "3", "d3-format": "3", "d3-geo": "3", "d3-hierarchy": "3", "d3-interpolate": "3", "d3-path": "3", "d3-polygon": "3", "d3-quadtree": "3", "d3-random": "3", "d3-scale": "4", "d3-scale-chromatic": "3", "d3-selection": "3", "d3-shape": "3", "d3-time": "3", "d3-time-format": "4", "d3-timer": "3", "d3-transition": "3", "d3-zoom": "3" } }, "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA=="], + + "d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="], + + "d3-axis": ["d3-axis@3.0.0", "", {}, "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw=="], + + "d3-brush": ["d3-brush@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", "d3-interpolate": "1 - 3", "d3-selection": "3", "d3-transition": "3" } }, "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ=="], + + "d3-chord": ["d3-chord@3.0.1", "", { "dependencies": { "d3-path": "1 - 3" } }, "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g=="], + + "d3-color": ["d3-color@3.1.0", "", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="], + + "d3-contour": ["d3-contour@4.0.2", "", { "dependencies": { "d3-array": "^3.2.0" } }, "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA=="], + + "d3-delaunay": ["d3-delaunay@6.0.4", "", { "dependencies": { "delaunator": "5" } }, "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A=="], + + "d3-dispatch": ["d3-dispatch@3.0.1", "", {}, "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg=="], + + "d3-drag": ["d3-drag@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" } }, "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg=="], + + "d3-dsv": ["d3-dsv@3.0.1", "", { "dependencies": { "commander": "7", "iconv-lite": "0.6", "rw": "1" }, "bin": { "csv2json": "bin/dsv2json.js", "csv2tsv": "bin/dsv2dsv.js", "dsv2dsv": "bin/dsv2dsv.js", "dsv2json": "bin/dsv2json.js", "json2csv": "bin/json2dsv.js", "json2dsv": "bin/json2dsv.js", "json2tsv": "bin/json2dsv.js", "tsv2csv": "bin/dsv2dsv.js", "tsv2json": "bin/dsv2json.js" } }, "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q=="], + + "d3-ease": ["d3-ease@3.0.1", "", {}, "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="], + + "d3-fetch": ["d3-fetch@3.0.1", "", { "dependencies": { "d3-dsv": "1 - 3" } }, "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw=="], + + "d3-force": ["d3-force@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-quadtree": "1 - 3", "d3-timer": "1 - 3" } }, "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg=="], + + "d3-format": ["d3-format@3.1.0", "", {}, "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA=="], + + "d3-geo": ["d3-geo@3.1.1", "", { "dependencies": { "d3-array": "2.5.0 - 3" } }, "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q=="], + + "d3-hierarchy": ["d3-hierarchy@3.1.2", "", {}, "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA=="], + + "d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="], + + "d3-path": ["d3-path@3.1.0", "", {}, "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="], + + "d3-polygon": ["d3-polygon@3.0.1", "", {}, "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg=="], + + "d3-quadtree": ["d3-quadtree@3.0.1", "", {}, "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw=="], + + "d3-random": ["d3-random@3.0.1", "", {}, "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ=="], + + "d3-sankey": ["d3-sankey@0.12.3", "", { "dependencies": { "d3-array": "1 - 2", "d3-shape": "^1.2.0" } }, "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ=="], + + "d3-scale": ["d3-scale@4.0.2", "", { "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", "d3-interpolate": "1.2.0 - 3", "d3-time": "2.1.1 - 3", "d3-time-format": "2 - 4" } }, "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="], + + "d3-scale-chromatic": ["d3-scale-chromatic@3.1.0", "", { "dependencies": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" } }, "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ=="], + + "d3-selection": ["d3-selection@3.0.0", "", {}, "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ=="], + + "d3-shape": ["d3-shape@3.2.0", "", { "dependencies": { "d3-path": "^3.1.0" } }, "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA=="], + + "d3-time": ["d3-time@3.1.0", "", { "dependencies": { "d3-array": "2 - 3" } }, "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="], + + "d3-time-format": ["d3-time-format@4.1.0", "", { "dependencies": { "d3-time": "1 - 3" } }, "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="], + + "d3-timer": ["d3-timer@3.0.1", "", {}, "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="], + + "d3-transition": ["d3-transition@3.0.1", "", { "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", "d3-ease": "1 - 3", "d3-interpolate": "1 - 3", "d3-timer": "1 - 3" }, "peerDependencies": { "d3-selection": "2 - 3" } }, "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w=="], + + "d3-zoom": ["d3-zoom@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", "d3-interpolate": "1 - 3", "d3-selection": "2 - 3", "d3-transition": "2 - 3" } }, "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw=="], + + "dagre-d3-es": ["dagre-d3-es@7.0.13", "", { "dependencies": { "d3": "^7.9.0", "lodash-es": "^4.17.21" } }, "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q=="], + + "dashdash": ["dashdash@1.14.1", "", { "dependencies": { "assert-plus": "^1.0.0" } }, "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g=="], + + "dayjs": ["dayjs@1.11.18", "", {}, "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA=="], + + "debounce": ["debounce@1.2.1", "", {}, "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "decamelize": ["decamelize@1.2.0", "", {}, "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="], + + "decode-named-character-reference": ["decode-named-character-reference@1.2.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q=="], + + "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], + + "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], + + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], + + "default-browser": ["default-browser@5.2.1", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg=="], + + "default-browser-id": ["default-browser-id@5.0.0", "", {}, "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA=="], + + "defer-to-connect": ["defer-to-connect@2.0.1", "", {}, "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="], + + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "define-lazy-prop": ["define-lazy-prop@2.0.0", "", {}, "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="], + + "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + + "delaunator": ["delaunator@5.0.1", "", { "dependencies": { "robust-predicates": "^3.0.2" } }, "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], + + "detect-node": ["detect-node@2.1.0", "", {}, "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="], + + "detect-port": ["detect-port@1.6.1", "", { "dependencies": { "address": "^1.0.1", "debug": "4" }, "bin": { "detect": "bin/detect-port.js", "detect-port": "bin/detect-port.js" } }, "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q=="], + + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + + "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], + + "dns-packet": ["dns-packet@5.6.1", "", { "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" } }, "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw=="], + + "docusaurus-plugin-image-zoom": ["docusaurus-plugin-image-zoom@3.0.1", "", { "dependencies": { "medium-zoom": "^1.1.0", "validate-peer-dependencies": "^2.2.0" }, "peerDependencies": { "@docusaurus/theme-classic": ">=3.0.0" } }, "sha512-mQrqA99VpoMQJNbi02qkWAMVNC4+kwc6zLLMNzraHAJlwn+HrlUmZSEDcTwgn+H4herYNxHKxveE2WsYy73eGw=="], + + "dom-converter": ["dom-converter@0.2.0", "", { "dependencies": { "utila": "~0.4" } }, "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA=="], + + "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], + + "domelementtype": ["domelementtype@1.3.1", "", {}, "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="], + + "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], + + "dompurify": ["dompurify@3.3.0", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ=="], + + "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], + + "dot-case": ["dot-case@3.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w=="], + + "dot-prop": ["dot-prop@6.0.1", "", { "dependencies": { "is-obj": "^2.0.0" } }, "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "duplexer": ["duplexer@0.1.2", "", {}, "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="], + + "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "ecc-jsbn": ["ecc-jsbn@0.1.2", "", { "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw=="], + + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.243", "", {}, "sha512-ZCphxFW3Q1TVhcgS9blfut1PX8lusVi2SvXQgmEEnK4TCmE1JhH2JkjJN+DNt0pJJwfBri5AROBnz2b/C+YU9g=="], + + "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "emojilib": ["emojilib@2.4.0", "", {}, "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw=="], + + "emojis-list": ["emojis-list@3.0.0", "", {}, "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="], + + "emoticon": ["emoticon@4.1.0", "", {}, "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ=="], + + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + + "encoding": ["encoding@0.1.13", "", { "dependencies": { "iconv-lite": "^0.6.2" } }, "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A=="], + + "enhanced-resolve": ["enhanced-resolve@5.18.3", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww=="], + + "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "esast-util-from-estree": ["esast-util-from-estree@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "unist-util-position-from-estree": "^2.0.0" } }, "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ=="], + + "esast-util-from-js": ["esast-util-from-js@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "acorn": "^8.0.0", "esast-util-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-goat": ["escape-goat@4.0.0", "", {}, "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg=="], + + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], + + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], + + "estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="], + + "estree-util-build-jsx": ["estree-util-build-jsx@3.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" } }, "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ=="], + + "estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="], + + "estree-util-scope": ["estree-util-scope@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0" } }, "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ=="], + + "estree-util-to-js": ["estree-util-to-js@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", "source-map": "^0.7.0" } }, "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg=="], + + "estree-util-value-to-estree": ["estree-util-value-to-estree@3.5.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ=="], + + "estree-util-visit": ["estree-util-visit@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" } }, "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww=="], + + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "eta": ["eta@2.2.0", "", {}, "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g=="], + + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], + + "eval": ["eval@0.1.8", "", { "dependencies": { "@types/node": "*", "require-like": ">= 0.1.1" } }, "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw=="], + + "eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="], + + "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], + + "eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="], + + "execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], + + "express": ["express@4.21.2", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.19.0", "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA=="], + + "exsolve": ["exsolve@1.0.7", "", {}, "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw=="], + + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + + "extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], + + "extsprintf": ["extsprintf@1.3.0", "", {}, "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], + + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + + "fault": ["fault@2.0.1", "", { "dependencies": { "format": "^0.2.0" } }, "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ=="], + + "faye-websocket": ["faye-websocket@0.11.4", "", { "dependencies": { "websocket-driver": ">=0.5.1" } }, "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g=="], + + "fbjs": ["fbjs@0.8.18", "", { "dependencies": { "core-js": "^1.0.0", "isomorphic-fetch": "^2.1.1", "loose-envify": "^1.0.0", "object-assign": "^4.1.0", "promise": "^7.1.1", "setimmediate": "^1.0.5", "ua-parser-js": "^0.7.30" } }, "sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA=="], + + "feed": ["feed@4.2.2", "", { "dependencies": { "xml-js": "^1.6.11" } }, "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ=="], + + "figures": ["figures@3.2.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg=="], + + "file-loader": ["file-loader@6.2.0", "", { "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" }, "peerDependencies": { "webpack": "^4.0.0 || ^5.0.0" } }, "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "finalhandler": ["finalhandler@1.3.1", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" } }, "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ=="], + + "find-cache-dir": ["find-cache-dir@4.0.0", "", { "dependencies": { "common-path-prefix": "^3.0.0", "pkg-dir": "^7.0.0" } }, "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg=="], + + "find-up": ["find-up@1.1.2", "", { "dependencies": { "path-exists": "^2.0.0", "pinkie-promise": "^2.0.0" } }, "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA=="], + + "flat": ["flat@5.0.2", "", { "bin": { "flat": "cli.js" } }, "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ=="], + + "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], + + "forever-agent": ["forever-agent@0.6.1", "", {}, "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw=="], + + "form-data": ["form-data@2.3.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ=="], + + "form-data-encoder": ["form-data-encoder@2.1.4", "", {}, "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw=="], + + "format": ["format@0.2.2", "", {}, "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww=="], + + "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], + + "fraction.js": ["fraction.js@4.3.7", "", {}, "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew=="], + + "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], + + "fs-extra": ["fs-extra@11.3.2", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-own-enumerable-property-symbols": ["get-own-enumerable-property-symbols@3.0.2", "", {}, "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], + + "getpass": ["getpass@0.1.7", "", { "dependencies": { "assert-plus": "^1.0.0" } }, "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng=="], + + "github-slugger": ["github-slugger@1.5.0", "", {}, "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw=="], + + "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "glob-to-regex.js": ["glob-to-regex.js@1.2.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ=="], + + "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="], + + "global-dirs": ["global-dirs@3.0.1", "", { "dependencies": { "ini": "2.0.0" } }, "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA=="], + + "globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="], + + "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "got": ["got@12.6.1", "", { "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", "cacheable-lookup": "^7.0.0", "cacheable-request": "^10.2.8", "decompress-response": "^6.0.0", "form-data-encoder": "^2.1.2", "get-stream": "^6.0.1", "http2-wrapper": "^2.1.10", "lowercase-keys": "^3.0.0", "p-cancelable": "^3.0.0", "responselike": "^3.0.0" } }, "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "gray-matter": ["gray-matter@4.0.3", "", { "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", "section-matter": "^1.0.0", "strip-bom-string": "^1.0.0" } }, "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q=="], + + "gzip-size": ["gzip-size@6.0.0", "", { "dependencies": { "duplexer": "^0.1.2" } }, "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q=="], + + "hachure-fill": ["hachure-fill@0.5.2", "", {}, "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg=="], + + "handle-thing": ["handle-thing@2.0.1", "", {}, "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg=="], + + "har-schema": ["har-schema@2.0.0", "", {}, "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q=="], + + "har-validator": ["har-validator@5.1.5", "", { "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" } }, "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-yarn": ["has-yarn@3.0.0", "", {}, "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="], + + "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="], + + "hast-util-raw": ["hast-util-raw@9.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "@ungap/structured-clone": "^1.0.0", "hast-util-from-parse5": "^8.0.0", "hast-util-to-parse5": "^8.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "parse5": "^7.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw=="], + + "hast-util-to-estree": ["hast-util-to-estree@3.1.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-attach-comments": "^3.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w=="], + + "hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.6", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg=="], + + "hast-util-to-parse5": ["hast-util-to-parse5@8.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^6.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw=="], + + "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], + + "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], + + "he": ["he@1.2.0", "", { "bin": { "he": "bin/he" } }, "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="], + + "history": ["history@4.10.1", "", { "dependencies": { "@babel/runtime": "^7.1.2", "loose-envify": "^1.2.0", "resolve-pathname": "^3.0.0", "tiny-invariant": "^1.0.2", "tiny-warning": "^1.0.0", "value-equal": "^1.0.1" } }, "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew=="], + + "hoist-non-react-statics": ["hoist-non-react-statics@3.3.2", "", { "dependencies": { "react-is": "^16.7.0" } }, "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="], + + "hosted-git-info": ["hosted-git-info@2.8.9", "", {}, "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="], + + "hpack.js": ["hpack.js@2.1.6", "", { "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", "readable-stream": "^2.0.1", "wbuf": "^1.1.0" } }, "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ=="], + + "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], + + "html-minifier-terser": ["html-minifier-terser@7.2.0", "", { "dependencies": { "camel-case": "^4.1.2", "clean-css": "~5.3.2", "commander": "^10.0.0", "entities": "^4.4.0", "param-case": "^3.0.4", "relateurl": "^0.2.7", "terser": "^5.15.1" }, "bin": { "html-minifier-terser": "cli.js" } }, "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA=="], + + "html-tags": ["html-tags@3.3.1", "", {}, "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ=="], + + "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], + + "html-webpack-plugin": ["html-webpack-plugin@5.6.4", "", { "dependencies": { "@types/html-minifier-terser": "^6.0.0", "html-minifier-terser": "^6.0.2", "lodash": "^4.17.21", "pretty-error": "^4.0.0", "tapable": "^2.0.0" }, "peerDependencies": { "@rspack/core": "0.x || 1.x", "webpack": "^5.20.0" }, "optionalPeers": ["@rspack/core", "webpack"] }, "sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw=="], + + "htmlparser2": ["htmlparser2@3.10.1", "", { "dependencies": { "domelementtype": "^1.3.1", "domhandler": "^2.3.0", "domutils": "^1.5.1", "entities": "^1.1.1", "inherits": "^2.0.1", "readable-stream": "^3.1.1" } }, "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ=="], + + "htmltojsx": ["htmltojsx@0.3.0", "", { "dependencies": { "jsdom-no-contextify": "~3.1.0", "react": "~15.4.1", "react-dom": "~15.4.1", "yargs": "~4.6.0" }, "bin": { "htmltojsx": "src/cli.js" } }, "sha512-ivWTGWn15hph8NIYRRdU1/KdG5qHXe1FW4Q1w7IcJ8zPK+9CSYnEY9yEiaBm8tBhhkVC8Vs+SmHLcCvsWhyqEg=="], + + "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="], + + "http-deceiver": ["http-deceiver@1.2.7", "", {}, "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw=="], + + "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], + + "http-parser-js": ["http-parser-js@0.5.10", "", {}, "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA=="], + + "http-proxy": ["http-proxy@1.18.1", "", { "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" } }, "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ=="], + + "http-proxy-middleware": ["http-proxy-middleware@2.0.9", "", { "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", "is-glob": "^4.0.1", "is-plain-obj": "^3.0.0", "micromatch": "^4.0.2" }, "peerDependencies": { "@types/express": "^4.17.13" }, "optionalPeers": ["@types/express"] }, "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q=="], + + "http-signature": ["http-signature@1.2.0", "", { "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } }, "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ=="], + + "http2-wrapper": ["http2-wrapper@2.2.1", "", { "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" } }, "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ=="], + + "human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], + + "hyperdyperid": ["hyperdyperid@1.2.0", "", {}, "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A=="], + + "iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + + "icss-utils": ["icss-utils@5.1.0", "", { "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA=="], + + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "image-size": ["image-size@2.0.2", "", { "bin": { "image-size": "bin/image-size.js" } }, "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w=="], + + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + + "import-lazy": ["import-lazy@4.0.0", "", {}, "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], + + "infima": ["infima@0.2.0-alpha.45", "", {}, "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ini": ["ini@2.0.0", "", {}, "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA=="], + + "inline-style-parser": ["inline-style-parser@0.2.4", "", {}, "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q=="], + + "internmap": ["internmap@1.0.1", "", {}, "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="], + + "invariant": ["invariant@2.2.4", "", { "dependencies": { "loose-envify": "^1.0.0" } }, "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA=="], + + "invert-kv": ["invert-kv@1.0.0", "", {}, "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ=="], + + "ipaddr.js": ["ipaddr.js@2.2.0", "", {}, "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA=="], + + "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], + + "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], + + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + + "is-ci": ["is-ci@3.0.1", "", { "dependencies": { "ci-info": "^3.2.0" }, "bin": { "is-ci": "bin.js" } }, "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ=="], + + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + + "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], + + "is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + + "is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], + + "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], + + "is-installed-globally": ["is-installed-globally@0.4.0", "", { "dependencies": { "global-dirs": "^3.0.0", "is-path-inside": "^3.0.2" } }, "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ=="], + + "is-network-error": ["is-network-error@1.3.0", "", {}, "sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw=="], + + "is-npm": ["is-npm@6.1.0", "", {}, "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-obj": ["is-obj@1.0.1", "", {}, "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg=="], + + "is-path-inside": ["is-path-inside@3.0.3", "", {}, "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="], + + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], + + "is-plain-object": ["is-plain-object@2.0.4", "", { "dependencies": { "isobject": "^3.0.1" } }, "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og=="], + + "is-regexp": ["is-regexp@1.0.0", "", {}, "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA=="], + + "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + + "is-typedarray": ["is-typedarray@1.0.0", "", {}, "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="], + + "is-utf8": ["is-utf8@0.2.1", "", {}, "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q=="], + + "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "is-yarn-global": ["is-yarn-global@0.4.1", "", {}, "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ=="], + + "isarray": ["isarray@0.0.1", "", {}, "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "isobject": ["isobject@3.0.1", "", {}, "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg=="], + + "isomorphic-fetch": ["isomorphic-fetch@2.2.1", "", { "dependencies": { "node-fetch": "^1.0.1", "whatwg-fetch": ">=0.10.0" } }, "sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA=="], + + "isstream": ["isstream@0.1.2", "", {}, "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="], + + "jest-util": ["jest-util@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA=="], + + "jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], + + "jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], + + "joi": ["joi@17.13.3", "", { "dependencies": { "@hapi/hoek": "^9.3.0", "@hapi/topo": "^5.1.0", "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } }, "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "jsbn": ["jsbn@0.1.1", "", {}, "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="], + + "jsdom-no-contextify": ["jsdom-no-contextify@3.1.0", "", { "dependencies": { "browser-request": ">= 0.3.1 < 0.4.0", "cssom": ">= 0.3.0 < 0.4.0", "cssstyle": ">= 0.2.21 < 0.3.0", "htmlparser2": ">= 3.7.3 < 4.0.0", "nwmatcher": ">= 1.3.4 < 2.0.0", "parse5": ">= 1.3.1 < 2.0.0", "request": ">= 2.44.0 < 3.0.0", "xml-name-validator": "^1.0.0", "xmlhttprequest": ">= 1.6.0 < 2.0.0" } }, "sha512-djD5JXh841BOTx27kxYJghei3WWIdcJnv7IWfHrj9JnPjsCVaJLfChopLiAi/s+MIBhp0y7equb/BeSgj26IoA=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + + "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], + + "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], + + "jsprim": ["jsprim@1.4.2", "", { "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", "json-schema": "0.4.0", "verror": "1.10.0" } }, "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw=="], + + "katex": ["katex@0.16.25", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-woHRUZ/iF23GBP1dkDQMh1QBad9dmr8/PAwNA54VrSOVYgI12MAcE14TqnDdQOdzyEonGzMepYnqBMYdsoAr8Q=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "khroma": ["khroma@2.1.0", "", {}, "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw=="], + + "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="], + + "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], + + "kolorist": ["kolorist@1.8.0", "", {}, "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ=="], + + "langium": ["langium@3.3.1", "", { "dependencies": { "chevrotain": "~11.0.3", "chevrotain-allstar": "~0.3.0", "vscode-languageserver": "~9.0.1", "vscode-languageserver-textdocument": "~1.0.11", "vscode-uri": "~3.0.8" } }, "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w=="], + + "latest-version": ["latest-version@7.0.0", "", { "dependencies": { "package-json": "^8.1.0" } }, "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg=="], + + "launch-editor": ["launch-editor@2.12.0", "", { "dependencies": { "picocolors": "^1.1.1", "shell-quote": "^1.8.3" } }, "sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg=="], + + "layout-base": ["layout-base@1.0.2", "", {}, "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg=="], + + "lcid": ["lcid@1.0.0", "", { "dependencies": { "invert-kv": "^1.0.0" } }, "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw=="], + + "leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="], + + "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], + + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], + + "load-json-file": ["load-json-file@1.1.0", "", { "dependencies": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", "pify": "^2.0.0", "pinkie-promise": "^2.0.0", "strip-bom": "^2.0.0" } }, "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A=="], + + "loader-runner": ["loader-runner@4.3.1", "", {}, "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q=="], + + "loader-utils": ["loader-utils@2.0.4", "", { "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^2.1.2" } }, "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw=="], + + "local-pkg": ["local-pkg@1.1.2", "", { "dependencies": { "mlly": "^1.7.4", "pkg-types": "^2.3.0", "quansync": "^0.2.11" } }, "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A=="], + + "locate-path": ["locate-path@7.2.0", "", { "dependencies": { "p-locate": "^6.0.0" } }, "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA=="], + + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + + "lodash-es": ["lodash-es@4.17.21", "", {}, "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="], + + "lodash.assign": ["lodash.assign@4.2.0", "", {}, "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw=="], + + "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="], + + "lodash.memoize": ["lodash.memoize@4.1.2", "", {}, "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="], + + "lodash.uniq": ["lodash.uniq@4.5.0", "", {}, "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="], + + "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], + + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], + + "lower-case": ["lower-case@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg=="], + + "lowercase-keys": ["lowercase-keys@3.0.0", "", {}, "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ=="], + + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "markdown-extensions": ["markdown-extensions@2.0.0", "", {}, "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q=="], + + "markdown-table": ["markdown-table@2.0.0", "", { "dependencies": { "repeat-string": "^1.0.0" } }, "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A=="], + + "marked": ["marked@16.4.1", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-ntROs7RaN3EvWfy3EZi14H4YxmT6A5YvywfhO+0pm+cH/dnSQRmdAmoFIc3B9aiwTehyk7pESH4ofyBY+V5hZg=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "mdast-util-directive": ["mdast-util-directive@3.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q=="], + + "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="], + + "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA=="], + + "mdast-util-frontmatter": ["mdast-util-frontmatter@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "escape-string-regexp": "^5.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-extension-frontmatter": "^2.0.0" } }, "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA=="], + + "mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="], + + "mdast-util-gfm-autolink-literal": ["mdast-util-gfm-autolink-literal@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-find-and-replace": "^3.0.0", "micromark-util-character": "^2.0.0" } }, "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ=="], + + "mdast-util-gfm-footnote": ["mdast-util-gfm-footnote@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0" } }, "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ=="], + + "mdast-util-gfm-strikethrough": ["mdast-util-gfm-strikethrough@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg=="], + + "mdast-util-gfm-table": ["mdast-util-gfm-table@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "markdown-table": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg=="], + + "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="], + + "mdast-util-mdx": ["mdast-util-mdx@3.0.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w=="], + + "mdast-util-mdx-expression": ["mdast-util-mdx-expression@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ=="], + + "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.2.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q=="], + + "mdast-util-mdxjs-esm": ["mdast-util-mdxjs-esm@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg=="], + + "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="], + + "mdast-util-to-hast": ["mdast-util-to-hast@13.2.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA=="], + + "mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA=="], + + "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="], + + "mdn-data": ["mdn-data@2.0.30", "", {}, "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA=="], + + "media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="], + + "medium-zoom": ["medium-zoom@1.1.0", "", {}, "sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ=="], + + "memfs": ["memfs@4.50.0", "", { "dependencies": { "@jsonjoy.com/json-pack": "^1.11.0", "@jsonjoy.com/util": "^1.9.0", "glob-to-regex.js": "^1.0.1", "thingies": "^2.5.0", "tree-dump": "^1.0.3", "tslib": "^2.0.0" } }, "sha512-N0LUYQMUA1yS5tJKmMtU9yprPm6ZIg24yr/OVv/7t6q0kKDIho4cBbXRi1XKttUmNYDYgF/q45qrKE/UhGO0CA=="], + + "merge-descriptors": ["merge-descriptors@1.0.3", "", {}, "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="], + + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "mermaid": ["mermaid@11.12.1", "", { "dependencies": { "@braintree/sanitize-url": "^7.1.1", "@iconify/utils": "^3.0.1", "@mermaid-js/parser": "^0.6.3", "@types/d3": "^7.4.3", "cytoscape": "^3.29.3", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.2.0", "d3": "^7.9.0", "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.13", "dayjs": "^1.11.18", "dompurify": "^3.2.5", "katex": "^0.16.22", "khroma": "^2.1.0", "lodash-es": "^4.17.21", "marked": "^16.2.1", "roughjs": "^4.6.6", "stylis": "^4.3.6", "ts-dedent": "^2.2.0", "uuid": "^11.1.0" } }, "sha512-UlIZrRariB11TY1RtTgUWp65tphtBv4CSq7vyS2ZZ2TgoMjs2nloq+wFqxiwcxlhHUvs7DPGgMjs2aeQxz5h9g=="], + + "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="], + + "micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="], + + "micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="], + + "micromark-extension-directive": ["micromark-extension-directive@3.0.2", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "parse-entities": "^4.0.0" } }, "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA=="], + + "micromark-extension-frontmatter": ["micromark-extension-frontmatter@2.0.0", "", { "dependencies": { "fault": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg=="], + + "micromark-extension-gfm": ["micromark-extension-gfm@3.0.0", "", { "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", "micromark-extension-gfm-strikethrough": "^2.0.0", "micromark-extension-gfm-table": "^2.0.0", "micromark-extension-gfm-tagfilter": "^2.0.0", "micromark-extension-gfm-task-list-item": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w=="], + + "micromark-extension-gfm-autolink-literal": ["micromark-extension-gfm-autolink-literal@2.1.0", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw=="], + + "micromark-extension-gfm-footnote": ["micromark-extension-gfm-footnote@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw=="], + + "micromark-extension-gfm-strikethrough": ["micromark-extension-gfm-strikethrough@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw=="], + + "micromark-extension-gfm-table": ["micromark-extension-gfm-table@2.1.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg=="], + + "micromark-extension-gfm-tagfilter": ["micromark-extension-gfm-tagfilter@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg=="], + + "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="], + + "micromark-extension-mdx-expression": ["micromark-extension-mdx-expression@3.0.1", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q=="], + + "micromark-extension-mdx-jsx": ["micromark-extension-mdx-jsx@3.0.2", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ=="], + + "micromark-extension-mdx-md": ["micromark-extension-mdx-md@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ=="], + + "micromark-extension-mdxjs": ["micromark-extension-mdxjs@3.0.0", "", { "dependencies": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", "micromark-extension-mdx-expression": "^3.0.0", "micromark-extension-mdx-jsx": "^3.0.0", "micromark-extension-mdx-md": "^2.0.0", "micromark-extension-mdxjs-esm": "^3.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ=="], + + "micromark-extension-mdxjs-esm": ["micromark-extension-mdxjs-esm@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A=="], + + "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="], + + "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="], + + "micromark-factory-mdx-expression": ["micromark-factory-mdx-expression@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ=="], + + "micromark-factory-space": ["micromark-factory-space@1.1.0", "", { "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ=="], + + "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="], + + "micromark-factory-whitespace": ["micromark-factory-whitespace@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ=="], + + "micromark-util-character": ["micromark-util-character@1.2.0", "", { "dependencies": { "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg=="], + + "micromark-util-chunked": ["micromark-util-chunked@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="], + + "micromark-util-classify-character": ["micromark-util-classify-character@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q=="], + + "micromark-util-combine-extensions": ["micromark-util-combine-extensions@2.0.1", "", { "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg=="], + + "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@2.0.2", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw=="], + + "micromark-util-decode-string": ["micromark-util-decode-string@2.0.1", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ=="], + + "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], + + "micromark-util-events-to-acorn": ["micromark-util-events-to-acorn@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg=="], + + "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="], + + "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="], + + "micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="], + + "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], + + "micromark-util-subtokenize": ["micromark-util-subtokenize@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA=="], + + "micromark-util-symbol": ["micromark-util-symbol@1.1.0", "", {}, "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag=="], + + "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], + + "mime-db": ["mime-db@1.33.0", "", {}, "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ=="], + + "mime-types": ["mime-types@2.1.18", "", { "dependencies": { "mime-db": "~1.33.0" } }, "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ=="], + + "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], + + "mimic-response": ["mimic-response@4.0.0", "", {}, "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg=="], + + "mini-css-extract-plugin": ["mini-css-extract-plugin@2.9.4", "", { "dependencies": { "schema-utils": "^4.0.0", "tapable": "^2.2.1" }, "peerDependencies": { "webpack": "^5.0.0" } }, "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ=="], + + "minimalistic-assert": ["minimalistic-assert@1.0.1", "", {}, "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "mlly": ["mlly@1.8.0", "", { "dependencies": { "acorn": "^8.15.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.1" } }, "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g=="], + + "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "multicast-dns": ["multicast-dns@7.2.5", "", { "dependencies": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" }, "bin": { "multicast-dns": "cli.js" } }, "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "negotiator": ["negotiator@0.6.4", "", {}, "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w=="], + + "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], + + "no-case": ["no-case@3.0.4", "", { "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg=="], + + "node-emoji": ["node-emoji@2.2.0", "", { "dependencies": { "@sindresorhus/is": "^4.6.0", "char-regex": "^1.0.2", "emojilib": "^2.4.0", "skin-tone": "^2.0.0" } }, "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw=="], + + "node-fetch": ["node-fetch@1.7.3", "", { "dependencies": { "encoding": "^0.1.11", "is-stream": "^1.0.1" } }, "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ=="], + + "node-forge": ["node-forge@1.3.1", "", {}, "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA=="], + + "node-releases": ["node-releases@2.0.26", "", {}, "sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA=="], + + "normalize-package-data": ["normalize-package-data@2.5.0", "", { "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "normalize-range": ["normalize-range@0.1.2", "", {}, "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="], + + "normalize-url": ["normalize-url@8.1.0", "", {}, "sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w=="], + + "npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], + + "nprogress": ["nprogress@0.2.0", "", {}, "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA=="], + + "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], + + "null-loader": ["null-loader@4.0.1", "", { "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" }, "peerDependencies": { "webpack": "^4.0.0 || ^5.0.0" } }, "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg=="], + + "number-is-nan": ["number-is-nan@1.0.1", "", {}, "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ=="], + + "nwmatcher": ["nwmatcher@1.4.4", "", {}, "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ=="], + + "oauth-sign": ["oauth-sign@0.9.0", "", {}, "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + + "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], + + "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], + + "obuf": ["obuf@1.1.2", "", {}, "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="], + + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], + + "on-headers": ["on-headers@1.1.0", "", {}, "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A=="], + + "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + + "open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], + + "opener": ["opener@1.5.2", "", { "bin": { "opener": "bin/opener-bin.js" } }, "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A=="], + + "os-locale": ["os-locale@1.4.0", "", { "dependencies": { "lcid": "^1.0.0" } }, "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g=="], + + "p-cancelable": ["p-cancelable@3.0.0", "", {}, "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw=="], + + "p-finally": ["p-finally@1.0.0", "", {}, "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow=="], + + "p-limit": ["p-limit@4.0.0", "", { "dependencies": { "yocto-queue": "^1.0.0" } }, "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ=="], + + "p-locate": ["p-locate@6.0.0", "", { "dependencies": { "p-limit": "^4.0.0" } }, "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw=="], + + "p-map": ["p-map@4.0.0", "", { "dependencies": { "aggregate-error": "^3.0.0" } }, "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ=="], + + "p-queue": ["p-queue@6.6.2", "", { "dependencies": { "eventemitter3": "^4.0.4", "p-timeout": "^3.2.0" } }, "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ=="], + + "p-retry": ["p-retry@6.2.1", "", { "dependencies": { "@types/retry": "0.12.2", "is-network-error": "^1.0.0", "retry": "^0.13.1" } }, "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ=="], + + "p-timeout": ["p-timeout@3.2.0", "", { "dependencies": { "p-finally": "^1.0.0" } }, "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg=="], + + "package-json": ["package-json@8.1.1", "", { "dependencies": { "got": "^12.1.0", "registry-auth-token": "^5.0.1", "registry-url": "^6.0.0", "semver": "^7.3.7" } }, "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA=="], + + "package-manager-detector": ["package-manager-detector@1.5.0", "", {}, "sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw=="], + + "param-case": ["param-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], + + "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], + + "parse-numeric-range": ["parse-numeric-range@1.3.0", "", {}, "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ=="], + + "parse5": ["parse5@1.5.1", "", {}, "sha512-w2jx/0tJzvgKwZa58sj2vAYq/S/K1QJfIB3cWYea/Iu1scFPDQQ3IQiVZTHWtRBwAjv2Yd7S/xeZf3XqLDb3bA=="], + + "parse5-htmlparser2-tree-adapter": ["parse5-htmlparser2-tree-adapter@7.1.0", "", { "dependencies": { "domhandler": "^5.0.3", "parse5": "^7.0.0" } }, "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g=="], + + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + + "pascal-case": ["pascal-case@3.1.2", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g=="], + + "path-data-parser": ["path-data-parser@0.1.0", "", {}, "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w=="], + + "path-exists": ["path-exists@2.1.0", "", { "dependencies": { "pinkie-promise": "^2.0.0" } }, "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ=="], + + "path-is-inside": ["path-is-inside@1.0.2", "", {}, "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "path-root": ["path-root@0.1.1", "", { "dependencies": { "path-root-regex": "^0.1.0" } }, "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg=="], + + "path-root-regex": ["path-root-regex@0.1.2", "", {}, "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ=="], + + "path-to-regexp": ["path-to-regexp@1.9.0", "", { "dependencies": { "isarray": "0.0.1" } }, "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g=="], + + "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], + + "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "performance-now": ["performance-now@2.1.0", "", {}, "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="], + + "pinkie": ["pinkie@2.0.4", "", {}, "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg=="], + + "pinkie-promise": ["pinkie-promise@2.0.1", "", { "dependencies": { "pinkie": "^2.0.0" } }, "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw=="], + + "pkg-conf": ["pkg-conf@1.1.3", "", { "dependencies": { "find-up": "^1.0.0", "load-json-file": "^1.1.0", "object-assign": "^4.0.1", "symbol": "^0.2.1" } }, "sha512-9hHgE5+Xai/ChrnahNP8Ke0VNF/s41IZIB/d24eMHEaRamdPg+wwlRm2lTb5wMvE8eTIKrYZsrxfuOwt3dpsIQ=="], + + "pkg-dir": ["pkg-dir@7.0.0", "", { "dependencies": { "find-up": "^6.3.0" } }, "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA=="], + + "pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], + + "plugin-image-zoom": ["plugin-image-zoom@1.2.0", "", { "dependencies": { "medium-zoom": "^1.0.4" } }, "sha512-uVCjp4bXuli39gmBs+JQvXMtpfLL+5yWfRIKZyM41d3D9oxGBEHmRzDu9EgusIwmBrKJvF9QuOZENw/9s6G+Jw=="], + + "points-on-curve": ["points-on-curve@0.2.0", "", {}, "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A=="], + + "points-on-path": ["points-on-path@0.2.1", "", { "dependencies": { "path-data-parser": "0.1.0", "points-on-curve": "0.2.0" } }, "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g=="], + + "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + + "postcss-attribute-case-insensitive": ["postcss-attribute-case-insensitive@7.0.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw=="], + + "postcss-calc": ["postcss-calc@9.0.1", "", { "dependencies": { "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.2.2" } }, "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ=="], + + "postcss-clamp": ["postcss-clamp@4.1.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.6" } }, "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow=="], + + "postcss-color-functional-notation": ["postcss-color-functional-notation@7.0.12", "", { "dependencies": { "@csstools/css-color-parser": "^3.1.0", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw=="], + + "postcss-color-hex-alpha": ["postcss-color-hex-alpha@10.0.0", "", { "dependencies": { "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w=="], + + "postcss-color-rebeccapurple": ["postcss-color-rebeccapurple@10.0.0", "", { "dependencies": { "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ=="], + + "postcss-colormin": ["postcss-colormin@6.1.0", "", { "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0", "colord": "^2.9.3", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw=="], + + "postcss-convert-values": ["postcss-convert-values@6.1.0", "", { "dependencies": { "browserslist": "^4.23.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w=="], + + "postcss-custom-media": ["postcss-custom-media@11.0.6", "", { "dependencies": { "@csstools/cascade-layer-name-parser": "^2.0.5", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", "@csstools/media-query-list-parser": "^4.0.3" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw=="], + + "postcss-custom-properties": ["postcss-custom-properties@14.0.6", "", { "dependencies": { "@csstools/cascade-layer-name-parser": "^2.0.5", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ=="], + + "postcss-custom-selectors": ["postcss-custom-selectors@8.0.5", "", { "dependencies": { "@csstools/cascade-layer-name-parser": "^2.0.5", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg=="], + + "postcss-dir-pseudo-class": ["postcss-dir-pseudo-class@9.0.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA=="], + + "postcss-discard-comments": ["postcss-discard-comments@6.0.2", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw=="], + + "postcss-discard-duplicates": ["postcss-discard-duplicates@6.0.3", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw=="], + + "postcss-discard-empty": ["postcss-discard-empty@6.0.3", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ=="], + + "postcss-discard-overridden": ["postcss-discard-overridden@6.0.2", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ=="], + + "postcss-discard-unused": ["postcss-discard-unused@6.0.5", "", { "dependencies": { "postcss-selector-parser": "^6.0.16" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA=="], + + "postcss-double-position-gradients": ["postcss-double-position-gradients@6.0.4", "", { "dependencies": { "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g=="], + + "postcss-focus-visible": ["postcss-focus-visible@10.0.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA=="], + + "postcss-focus-within": ["postcss-focus-within@9.0.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw=="], + + "postcss-font-variant": ["postcss-font-variant@5.0.0", "", { "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA=="], + + "postcss-gap-properties": ["postcss-gap-properties@6.0.0", "", { "peerDependencies": { "postcss": "^8.4" } }, "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw=="], + + "postcss-image-set-function": ["postcss-image-set-function@7.0.0", "", { "dependencies": { "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA=="], + + "postcss-lab-function": ["postcss-lab-function@7.0.12", "", { "dependencies": { "@csstools/css-color-parser": "^3.1.0", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w=="], + + "postcss-loader": ["postcss-loader@7.3.4", "", { "dependencies": { "cosmiconfig": "^8.3.5", "jiti": "^1.20.0", "semver": "^7.5.4" }, "peerDependencies": { "postcss": "^7.0.0 || ^8.0.1", "webpack": "^5.0.0" } }, "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A=="], + + "postcss-logical": ["postcss-logical@8.1.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA=="], + + "postcss-merge-idents": ["postcss-merge-idents@6.0.3", "", { "dependencies": { "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g=="], + + "postcss-merge-longhand": ["postcss-merge-longhand@6.0.5", "", { "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^6.1.1" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w=="], + + "postcss-merge-rules": ["postcss-merge-rules@6.1.1", "", { "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0", "cssnano-utils": "^4.0.2", "postcss-selector-parser": "^6.0.16" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ=="], + + "postcss-minify-font-values": ["postcss-minify-font-values@6.1.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg=="], + + "postcss-minify-gradients": ["postcss-minify-gradients@6.0.3", "", { "dependencies": { "colord": "^2.9.3", "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q=="], + + "postcss-minify-params": ["postcss-minify-params@6.1.0", "", { "dependencies": { "browserslist": "^4.23.0", "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA=="], + + "postcss-minify-selectors": ["postcss-minify-selectors@6.0.4", "", { "dependencies": { "postcss-selector-parser": "^6.0.16" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ=="], + + "postcss-modules-extract-imports": ["postcss-modules-extract-imports@3.1.0", "", { "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q=="], + + "postcss-modules-local-by-default": ["postcss-modules-local-by-default@4.2.0", "", { "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.1.0" }, "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw=="], + + "postcss-modules-scope": ["postcss-modules-scope@3.2.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA=="], + + "postcss-modules-values": ["postcss-modules-values@4.0.0", "", { "dependencies": { "icss-utils": "^5.0.0" }, "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ=="], + + "postcss-nesting": ["postcss-nesting@13.0.2", "", { "dependencies": { "@csstools/selector-resolve-nested": "^3.1.0", "@csstools/selector-specificity": "^5.0.0", "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ=="], + + "postcss-normalize-charset": ["postcss-normalize-charset@6.0.2", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ=="], + + "postcss-normalize-display-values": ["postcss-normalize-display-values@6.0.2", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg=="], + + "postcss-normalize-positions": ["postcss-normalize-positions@6.0.2", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q=="], + + "postcss-normalize-repeat-style": ["postcss-normalize-repeat-style@6.0.2", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ=="], + + "postcss-normalize-string": ["postcss-normalize-string@6.0.2", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ=="], + + "postcss-normalize-timing-functions": ["postcss-normalize-timing-functions@6.0.2", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA=="], + + "postcss-normalize-unicode": ["postcss-normalize-unicode@6.1.0", "", { "dependencies": { "browserslist": "^4.23.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg=="], + + "postcss-normalize-url": ["postcss-normalize-url@6.0.2", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ=="], + + "postcss-normalize-whitespace": ["postcss-normalize-whitespace@6.0.2", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q=="], + + "postcss-opacity-percentage": ["postcss-opacity-percentage@3.0.0", "", { "peerDependencies": { "postcss": "^8.4" } }, "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ=="], + + "postcss-ordered-values": ["postcss-ordered-values@6.0.2", "", { "dependencies": { "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q=="], + + "postcss-overflow-shorthand": ["postcss-overflow-shorthand@6.0.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q=="], + + "postcss-page-break": ["postcss-page-break@3.0.4", "", { "peerDependencies": { "postcss": "^8" } }, "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ=="], + + "postcss-place": ["postcss-place@10.0.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw=="], + + "postcss-preset-env": ["postcss-preset-env@10.4.0", "", { "dependencies": { "@csstools/postcss-alpha-function": "^1.0.1", "@csstools/postcss-cascade-layers": "^5.0.2", "@csstools/postcss-color-function": "^4.0.12", "@csstools/postcss-color-function-display-p3-linear": "^1.0.1", "@csstools/postcss-color-mix-function": "^3.0.12", "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.2", "@csstools/postcss-content-alt-text": "^2.0.8", "@csstools/postcss-contrast-color-function": "^2.0.12", "@csstools/postcss-exponential-functions": "^2.0.9", "@csstools/postcss-font-format-keywords": "^4.0.0", "@csstools/postcss-gamut-mapping": "^2.0.11", "@csstools/postcss-gradients-interpolation-method": "^5.0.12", "@csstools/postcss-hwb-function": "^4.0.12", "@csstools/postcss-ic-unit": "^4.0.4", "@csstools/postcss-initial": "^2.0.1", "@csstools/postcss-is-pseudo-class": "^5.0.3", "@csstools/postcss-light-dark-function": "^2.0.11", "@csstools/postcss-logical-float-and-clear": "^3.0.0", "@csstools/postcss-logical-overflow": "^2.0.0", "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", "@csstools/postcss-logical-resize": "^3.0.0", "@csstools/postcss-logical-viewport-units": "^3.0.4", "@csstools/postcss-media-minmax": "^2.0.9", "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", "@csstools/postcss-nested-calc": "^4.0.0", "@csstools/postcss-normalize-display-values": "^4.0.0", "@csstools/postcss-oklab-function": "^4.0.12", "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/postcss-random-function": "^2.0.1", "@csstools/postcss-relative-color-syntax": "^3.0.12", "@csstools/postcss-scope-pseudo-class": "^4.0.1", "@csstools/postcss-sign-functions": "^1.1.4", "@csstools/postcss-stepped-value-functions": "^4.0.9", "@csstools/postcss-text-decoration-shorthand": "^4.0.3", "@csstools/postcss-trigonometric-functions": "^4.0.9", "@csstools/postcss-unset-value": "^4.0.0", "autoprefixer": "^10.4.21", "browserslist": "^4.26.0", "css-blank-pseudo": "^7.0.1", "css-has-pseudo": "^7.0.3", "css-prefers-color-scheme": "^10.0.0", "cssdb": "^8.4.2", "postcss-attribute-case-insensitive": "^7.0.1", "postcss-clamp": "^4.1.0", "postcss-color-functional-notation": "^7.0.12", "postcss-color-hex-alpha": "^10.0.0", "postcss-color-rebeccapurple": "^10.0.0", "postcss-custom-media": "^11.0.6", "postcss-custom-properties": "^14.0.6", "postcss-custom-selectors": "^8.0.5", "postcss-dir-pseudo-class": "^9.0.1", "postcss-double-position-gradients": "^6.0.4", "postcss-focus-visible": "^10.0.1", "postcss-focus-within": "^9.0.1", "postcss-font-variant": "^5.0.0", "postcss-gap-properties": "^6.0.0", "postcss-image-set-function": "^7.0.0", "postcss-lab-function": "^7.0.12", "postcss-logical": "^8.1.0", "postcss-nesting": "^13.0.2", "postcss-opacity-percentage": "^3.0.0", "postcss-overflow-shorthand": "^6.0.0", "postcss-page-break": "^3.0.4", "postcss-place": "^10.0.0", "postcss-pseudo-class-any-link": "^10.0.1", "postcss-replace-overflow-wrap": "^4.0.0", "postcss-selector-not": "^8.0.1" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-2kqpOthQ6JhxqQq1FSAAZGe9COQv75Aw8WbsOvQVNJ2nSevc9Yx/IKZGuZ7XJ+iOTtVon7LfO7ELRzg8AZ+sdw=="], + + "postcss-pseudo-class-any-link": ["postcss-pseudo-class-any-link@10.0.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q=="], + + "postcss-reduce-idents": ["postcss-reduce-idents@6.0.3", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA=="], + + "postcss-reduce-initial": ["postcss-reduce-initial@6.1.0", "", { "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw=="], + + "postcss-reduce-transforms": ["postcss-reduce-transforms@6.0.2", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA=="], + + "postcss-replace-overflow-wrap": ["postcss-replace-overflow-wrap@4.0.0", "", { "peerDependencies": { "postcss": "^8.0.3" } }, "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw=="], + + "postcss-selector-not": ["postcss-selector-not@8.0.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA=="], + + "postcss-selector-parser": ["postcss-selector-parser@7.1.0", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA=="], + + "postcss-sort-media-queries": ["postcss-sort-media-queries@5.2.0", "", { "dependencies": { "sort-css-media-queries": "2.2.0" }, "peerDependencies": { "postcss": "^8.4.23" } }, "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA=="], + + "postcss-svgo": ["postcss-svgo@6.0.3", "", { "dependencies": { "postcss-value-parser": "^4.2.0", "svgo": "^3.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g=="], + + "postcss-unique-selectors": ["postcss-unique-selectors@6.0.4", "", { "dependencies": { "postcss-selector-parser": "^6.0.16" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg=="], + + "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], + + "postcss-zindex": ["postcss-zindex@6.0.2", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg=="], + + "posthog-docusaurus": ["posthog-docusaurus@2.0.5", "", {}, "sha512-Ray65LYEJrMMqDtsBUBXunEVP/g4wtATvq/xz9rchUoLy/9mSkkFgUko/8DVtGxgiP3vivpFMgfb9HpCuDrBHg=="], + + "pretty-error": ["pretty-error@4.0.0", "", { "dependencies": { "lodash": "^4.17.20", "renderkid": "^3.0.0" } }, "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw=="], + + "pretty-time": ["pretty-time@1.1.0", "", {}, "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA=="], + + "prism-react-renderer": ["prism-react-renderer@2.4.1", "", { "dependencies": { "@types/prismjs": "^1.26.0", "clsx": "^2.0.0" }, "peerDependencies": { "react": ">=16.0.0" } }, "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig=="], + + "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="], + + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + + "promise": ["promise@7.3.1", "", { "dependencies": { "asap": "~2.0.3" } }, "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg=="], + + "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], + + "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], + + "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], + + "proto-list": ["proto-list@1.2.4", "", {}, "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA=="], + + "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], + + "psl": ["psl@1.15.0", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "pupa": ["pupa@3.3.0", "", { "dependencies": { "escape-goat": "^4.0.0" } }, "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA=="], + + "qs": ["qs@6.13.0", "", { "dependencies": { "side-channel": "^1.0.6" } }, "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg=="], + + "quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="], + + "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], + + "range-parser": ["range-parser@1.2.0", "", {}, "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A=="], + + "raw-body": ["raw-body@2.5.2", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA=="], + + "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], + + "react": ["react@19.2.0", "", {}, "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ=="], + + "react-dom": ["react-dom@19.2.0", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.0" } }, "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ=="], + + "react-fast-compare": ["react-fast-compare@3.2.2", "", {}, "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ=="], + + "react-helmet-async": ["@slorber/react-helmet-async@1.3.0", "", { "dependencies": { "@babel/runtime": "^7.12.5", "invariant": "^2.2.4", "prop-types": "^15.7.2", "react-fast-compare": "^3.2.0", "shallowequal": "^1.1.0" }, "peerDependencies": { "react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A=="], + + "react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + + "react-json-view-lite": ["react-json-view-lite@2.5.0", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0" } }, "sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g=="], + + "react-loadable": ["@docusaurus/react-loadable@6.0.0", "", { "dependencies": { "@types/react": "*" }, "peerDependencies": { "react": "*" } }, "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ=="], + + "react-loadable-ssr-addon-v5-slorber": ["react-loadable-ssr-addon-v5-slorber@1.0.1", "", { "dependencies": { "@babel/runtime": "^7.10.3" }, "peerDependencies": { "react-loadable": "*", "webpack": ">=4.41.1 || 5.x" } }, "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A=="], + + "react-router": ["react-router@5.3.4", "", { "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", "hoist-non-react-statics": "^3.1.0", "loose-envify": "^1.3.1", "path-to-regexp": "^1.7.0", "prop-types": "^15.6.2", "react-is": "^16.6.0", "tiny-invariant": "^1.0.2", "tiny-warning": "^1.0.0" }, "peerDependencies": { "react": ">=15" } }, "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA=="], + + "react-router-config": ["react-router-config@5.1.1", "", { "dependencies": { "@babel/runtime": "^7.1.2" }, "peerDependencies": { "react": ">=15", "react-router": ">=5" } }, "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg=="], + + "react-router-dom": ["react-router-dom@5.3.4", "", { "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", "loose-envify": "^1.3.1", "prop-types": "^15.6.2", "react-router": "5.3.4", "tiny-invariant": "^1.0.2", "tiny-warning": "^1.0.0" }, "peerDependencies": { "react": ">=15" } }, "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ=="], + + "read-pkg": ["read-pkg@1.1.0", "", { "dependencies": { "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", "path-type": "^1.0.0" } }, "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ=="], + + "read-pkg-up": ["read-pkg-up@1.0.1", "", { "dependencies": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" } }, "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A=="], + + "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], + + "recma-build-jsx": ["recma-build-jsx@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-build-jsx": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew=="], + + "recma-jsx": ["recma-jsx@1.0.1", "", { "dependencies": { "acorn-jsx": "^5.0.0", "estree-util-to-js": "^2.0.0", "recma-parse": "^1.0.0", "recma-stringify": "^1.0.0", "unified": "^11.0.0" }, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w=="], + + "recma-parse": ["recma-parse@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "esast-util-from-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ=="], + + "recma-stringify": ["recma-stringify@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-to-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g=="], + + "regenerate": ["regenerate@1.4.2", "", {}, "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="], + + "regenerate-unicode-properties": ["regenerate-unicode-properties@10.2.2", "", { "dependencies": { "regenerate": "^1.4.2" } }, "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g=="], + + "regexpu-core": ["regexpu-core@6.4.0", "", { "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.2.2", "regjsgen": "^0.8.0", "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.2.1" } }, "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA=="], + + "registry-auth-token": ["registry-auth-token@5.1.0", "", { "dependencies": { "@pnpm/npm-conf": "^2.1.0" } }, "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw=="], + + "registry-url": ["registry-url@6.0.1", "", { "dependencies": { "rc": "1.2.8" } }, "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q=="], + + "regjsgen": ["regjsgen@0.8.0", "", {}, "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q=="], + + "regjsparser": ["regjsparser@0.13.0", "", { "dependencies": { "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q=="], + + "rehype-raw": ["rehype-raw@7.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", "vfile": "^6.0.0" } }, "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww=="], + + "rehype-recma": ["rehype-recma@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "hast-util-to-estree": "^3.0.0" } }, "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw=="], + + "relateurl": ["relateurl@0.2.7", "", {}, "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog=="], + + "remark-directive": ["remark-directive@3.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-directive": "^3.0.0", "micromark-extension-directive": "^3.0.0", "unified": "^11.0.0" } }, "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A=="], + + "remark-emoji": ["remark-emoji@4.0.1", "", { "dependencies": { "@types/mdast": "^4.0.2", "emoticon": "^4.0.1", "mdast-util-find-and-replace": "^3.0.1", "node-emoji": "^2.1.0", "unified": "^11.0.4" } }, "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg=="], + + "remark-frontmatter": ["remark-frontmatter@5.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-frontmatter": "^2.0.0", "micromark-extension-frontmatter": "^2.0.0", "unified": "^11.0.0" } }, "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ=="], + + "remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="], + + "remark-mdx": ["remark-mdx@3.1.1", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg=="], + + "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], + + "remark-rehype": ["remark-rehype@11.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="], + + "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="], + + "renderkid": ["renderkid@3.0.0", "", { "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", "htmlparser2": "^6.1.0", "lodash": "^4.17.21", "strip-ansi": "^6.0.1" } }, "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg=="], + + "repeat-string": ["repeat-string@1.6.1", "", {}, "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w=="], + + "request": ["request@2.88.2", "", { "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", "caseless": "~0.12.0", "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" } }, "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw=="], + + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + + "require-like": ["require-like@0.1.2", "", {}, "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A=="], + + "require-main-filename": ["require-main-filename@1.0.1", "", {}, "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug=="], + + "requires-port": ["requires-port@1.0.0", "", {}, "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="], + + "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], + + "resolve-alpn": ["resolve-alpn@1.2.1", "", {}, "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="], + + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "resolve-package-path": ["resolve-package-path@4.0.3", "", { "dependencies": { "path-root": "^0.1.1" } }, "sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA=="], + + "resolve-pathname": ["resolve-pathname@3.0.0", "", {}, "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng=="], + + "responselike": ["responselike@3.0.0", "", { "dependencies": { "lowercase-keys": "^3.0.0" } }, "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg=="], + + "retry": ["retry@0.13.1", "", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "robust-predicates": ["robust-predicates@3.0.2", "", {}, "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="], + + "roughjs": ["roughjs@4.6.6", "", { "dependencies": { "hachure-fill": "^0.5.2", "path-data-parser": "^0.1.0", "points-on-curve": "^0.2.0", "points-on-path": "^0.2.1" } }, "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ=="], + + "rtlcss": ["rtlcss@4.3.0", "", { "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0", "postcss": "^8.4.21", "strip-json-comments": "^3.1.1" }, "bin": { "rtlcss": "bin/rtlcss.js" } }, "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig=="], + + "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "rw": ["rw@1.3.3", "", {}, "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "sax": ["sax@1.4.1", "", {}, "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg=="], + + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "schema-dts": ["schema-dts@1.1.5", "", {}, "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg=="], + + "schema-utils": ["schema-utils@4.3.3", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA=="], + + "search-insights": ["search-insights@2.17.3", "", {}, "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ=="], + + "section-matter": ["section-matter@1.0.0", "", { "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" } }, "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA=="], + + "select-hose": ["select-hose@2.0.0", "", {}, "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg=="], + + "selfsigned": ["selfsigned@2.4.1", "", { "dependencies": { "@types/node-forge": "^1.3.0", "node-forge": "^1" } }, "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q=="], + + "semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + + "semver-diff": ["semver-diff@4.0.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA=="], + + "send": ["send@0.19.0", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw=="], + + "serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="], + + "serve-handler": ["serve-handler@6.1.6", "", { "dependencies": { "bytes": "3.0.0", "content-disposition": "0.5.2", "mime-types": "2.1.18", "minimatch": "3.1.2", "path-is-inside": "1.0.2", "path-to-regexp": "3.3.0", "range-parser": "1.2.0" } }, "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ=="], + + "serve-index": ["serve-index@1.9.1", "", { "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", "debug": "2.6.9", "escape-html": "~1.0.3", "http-errors": "~1.6.2", "mime-types": "~2.1.17", "parseurl": "~1.3.2" } }, "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw=="], + + "serve-static": ["serve-static@1.16.2", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.19.0" } }, "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw=="], + + "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], + + "setimmediate": ["setimmediate@1.0.5", "", {}, "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="], + + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + + "shallow-clone": ["shallow-clone@3.0.1", "", { "dependencies": { "kind-of": "^6.0.2" } }, "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA=="], + + "shallowequal": ["shallowequal@1.1.0", "", {}, "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="], + + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "sirv": ["sirv@2.0.4", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ=="], + + "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], + + "sitemap": ["sitemap@7.1.2", "", { "dependencies": { "@types/node": "^17.0.5", "@types/sax": "^1.2.1", "arg": "^5.0.0", "sax": "^1.2.4" }, "bin": { "sitemap": "dist/cli.js" } }, "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw=="], + + "skin-tone": ["skin-tone@2.0.0", "", { "dependencies": { "unicode-emoji-modifier-base": "^1.0.0" } }, "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA=="], + + "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + + "snake-case": ["snake-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg=="], + + "sockjs": ["sockjs@0.3.24", "", { "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", "websocket-driver": "^0.7.4" } }, "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ=="], + + "sort-css-media-queries": ["sort-css-media-queries@2.2.0", "", {}, "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA=="], + + "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], + + "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], + + "spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="], + + "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="], + + "spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], + + "spdx-license-ids": ["spdx-license-ids@3.0.22", "", {}, "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ=="], + + "spdy": ["spdy@4.0.2", "", { "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", "http-deceiver": "^1.2.7", "select-hose": "^2.0.0", "spdy-transport": "^3.0.0" } }, "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA=="], + + "spdy-transport": ["spdy-transport@3.0.0", "", { "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", "hpack.js": "^2.1.6", "obuf": "^1.1.2", "readable-stream": "^3.0.6", "wbuf": "^1.7.3" } }, "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw=="], + + "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + + "srcset": ["srcset@4.0.0", "", {}, "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw=="], + + "sshpk": ["sshpk@1.18.0", "", { "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", "bcrypt-pbkdf": "^1.0.0", "dashdash": "^1.12.0", "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" }, "bin": { "sshpk-conv": "bin/sshpk-conv", "sshpk-sign": "bin/sshpk-sign", "sshpk-verify": "bin/sshpk-verify" } }, "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ=="], + + "statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], + + "std-env": ["std-env@3.10.0", "", {}, "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg=="], + + "string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], + + "stringify-object": ["stringify-object@3.3.0", "", { "dependencies": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", "is-regexp": "^1.0.0" } }, "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw=="], + + "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "strip-bom": ["strip-bom@2.0.0", "", { "dependencies": { "is-utf8": "^0.2.0" } }, "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g=="], + + "strip-bom-string": ["strip-bom-string@1.0.0", "", {}, "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g=="], + + "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "style-to-js": ["style-to-js@1.1.18", "", { "dependencies": { "style-to-object": "1.0.11" } }, "sha512-JFPn62D4kJaPTnhFUI244MThx+FEGbi+9dw1b9yBBQ+1CZpV7QAT8kUtJ7b7EUNdHajjF/0x8fT+16oLJoojLg=="], + + "style-to-object": ["style-to-object@1.0.11", "", { "dependencies": { "inline-style-parser": "0.2.4" } }, "sha512-5A560JmXr7wDyGLK12Nq/EYS38VkGlglVzkis1JEdbGWSnbQIEhZzTJhzURXN5/8WwwFCs/f/VVcmkTppbXLow=="], + + "stylehacks": ["stylehacks@6.1.1", "", { "dependencies": { "browserslist": "^4.23.0", "postcss-selector-parser": "^6.0.16" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg=="], + + "stylis": ["stylis@4.3.6", "", {}, "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + + "svg-parser": ["svg-parser@2.0.4", "", {}, "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ=="], + + "svgo": ["svgo@3.3.2", "", { "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", "css-select": "^5.1.0", "css-tree": "^2.3.1", "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.0.0" }, "bin": "./bin/svgo" }, "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw=="], + + "swr": ["swr@2.3.6", "", { "dependencies": { "dequal": "^2.0.3", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw=="], + + "symbol": ["symbol@0.2.3", "", {}, "sha512-IUW+ek7apEaW5bFhS6WpYoNtVpNTlNoqB/PH7YiMWQTxSPeXCzG4PILVakwXivJt3ZXWeO1fIJnUd/L9A/VeGA=="], + + "tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="], + + "terser": ["terser@5.44.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w=="], + + "terser-webpack-plugin": ["terser-webpack-plugin@5.3.14", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw=="], + + "thingies": ["thingies@2.5.0", "", { "peerDependencies": { "tslib": "^2" } }, "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw=="], + + "throttleit": ["throttleit@2.1.0", "", {}, "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw=="], + + "thunky": ["thunky@1.1.0", "", {}, "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="], + + "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], + + "tiny-warning": ["tiny-warning@1.0.3", "", {}, "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="], + + "tinyexec": ["tinyexec@1.0.1", "", {}, "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw=="], + + "tinypool": ["tinypool@1.1.1", "", {}, "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + + "totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="], + + "tough-cookie": ["tough-cookie@2.5.0", "", { "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" } }, "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g=="], + + "tree-dump": ["tree-dump@1.1.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA=="], + + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], + + "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], + + "ts-dedent": ["ts-dedent@2.2.0", "", {}, "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], + + "tweetnacl": ["tweetnacl@0.14.5", "", {}, "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="], + + "type-fest": ["type-fest@2.19.0", "", {}, "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="], + + "type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="], + + "typedarray-to-buffer": ["typedarray-to-buffer@3.1.5", "", { "dependencies": { "is-typedarray": "^1.0.0" } }, "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q=="], + + "ua-parser-js": ["ua-parser-js@0.7.41", "", { "bin": { "ua-parser-js": "script/cli.js" } }, "sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg=="], + + "ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="], + + "unicode-canonical-property-names-ecmascript": ["unicode-canonical-property-names-ecmascript@2.0.1", "", {}, "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg=="], + + "unicode-emoji-modifier-base": ["unicode-emoji-modifier-base@1.0.0", "", {}, "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g=="], + + "unicode-match-property-ecmascript": ["unicode-match-property-ecmascript@2.0.0", "", { "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" } }, "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q=="], + + "unicode-match-property-value-ecmascript": ["unicode-match-property-value-ecmascript@2.2.1", "", {}, "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg=="], + + "unicode-property-aliases-ecmascript": ["unicode-property-aliases-ecmascript@2.2.0", "", {}, "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ=="], + + "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], + + "unique-string": ["unique-string@3.0.0", "", { "dependencies": { "crypto-random-string": "^4.0.0" } }, "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ=="], + + "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], + + "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], + + "unist-util-position-from-estree": ["unist-util-position-from-estree@2.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ=="], + + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], + + "unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="], + + "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="], + + "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + + "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + + "update-browserslist-db": ["update-browserslist-db@1.1.4", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A=="], + + "update-notifier": ["update-notifier@6.0.2", "", { "dependencies": { "boxen": "^7.0.0", "chalk": "^5.0.1", "configstore": "^6.0.0", "has-yarn": "^3.0.0", "import-lazy": "^4.0.0", "is-ci": "^3.0.1", "is-installed-globally": "^0.4.0", "is-npm": "^6.0.0", "is-yarn-global": "^0.4.0", "latest-version": "^7.0.0", "pupa": "^3.1.0", "semver": "^7.3.7", "semver-diff": "^4.0.0", "xdg-basedir": "^5.1.0" } }, "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og=="], + + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "url-loader": ["url-loader@4.1.1", "", { "dependencies": { "loader-utils": "^2.0.0", "mime-types": "^2.1.27", "schema-utils": "^3.0.0" }, "peerDependencies": { "file-loader": "*", "webpack": "^4.0.0 || ^5.0.0" }, "optionalPeers": ["file-loader"] }, "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA=="], + + "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "utila": ["utila@0.4.0", "", {}, "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA=="], + + "utility-types": ["utility-types@3.11.0", "", {}, "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw=="], + + "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], + + "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], + + "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="], + + "validate-peer-dependencies": ["validate-peer-dependencies@2.2.0", "", { "dependencies": { "resolve-package-path": "^4.0.3", "semver": "^7.3.8" } }, "sha512-8X1OWlERjiUY6P6tdeU9E0EwO8RA3bahoOVG7ulOZT5MqgNDUO/BQoVjYiHPcNe+v8glsboZRIw9iToMAA2zAA=="], + + "value-equal": ["value-equal@1.0.1", "", {}, "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw=="], + + "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], + + "verror": ["verror@1.10.0", "", { "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw=="], + + "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], + + "vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="], + + "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], + + "vscode-jsonrpc": ["vscode-jsonrpc@8.2.0", "", {}, "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA=="], + + "vscode-languageserver": ["vscode-languageserver@9.0.1", "", { "dependencies": { "vscode-languageserver-protocol": "3.17.5" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g=="], + + "vscode-languageserver-protocol": ["vscode-languageserver-protocol@3.17.5", "", { "dependencies": { "vscode-jsonrpc": "8.2.0", "vscode-languageserver-types": "3.17.5" } }, "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg=="], + + "vscode-languageserver-textdocument": ["vscode-languageserver-textdocument@1.0.12", "", {}, "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA=="], + + "vscode-languageserver-types": ["vscode-languageserver-types@3.17.5", "", {}, "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="], + + "vscode-uri": ["vscode-uri@3.0.8", "", {}, "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw=="], + + "watchpack": ["watchpack@2.4.4", "", { "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA=="], + + "wbuf": ["wbuf@1.7.3", "", { "dependencies": { "minimalistic-assert": "^1.0.0" } }, "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA=="], + + "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], + + "webpack": ["webpack@5.102.1", "", { "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.15.0", "acorn-import-phases": "^1.0.3", "browserslist": "^4.26.3", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.3", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.4", "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ=="], + + "webpack-bundle-analyzer": ["webpack-bundle-analyzer@4.10.2", "", { "dependencies": { "@discoveryjs/json-ext": "0.5.7", "acorn": "^8.0.4", "acorn-walk": "^8.0.0", "commander": "^7.2.0", "debounce": "^1.2.1", "escape-string-regexp": "^4.0.0", "gzip-size": "^6.0.0", "html-escaper": "^2.0.2", "opener": "^1.5.2", "picocolors": "^1.0.0", "sirv": "^2.0.3", "ws": "^7.3.1" }, "bin": { "webpack-bundle-analyzer": "lib/bin/analyzer.js" } }, "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw=="], + + "webpack-dev-middleware": ["webpack-dev-middleware@7.4.5", "", { "dependencies": { "colorette": "^2.0.10", "memfs": "^4.43.1", "mime-types": "^3.0.1", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "peerDependencies": { "webpack": "^5.0.0" }, "optionalPeers": ["webpack"] }, "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA=="], + + "webpack-dev-server": ["webpack-dev-server@5.2.2", "", { "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", "@types/express": "^4.17.21", "@types/express-serve-static-core": "^4.17.21", "@types/serve-index": "^1.9.4", "@types/serve-static": "^1.15.5", "@types/sockjs": "^0.3.36", "@types/ws": "^8.5.10", "ansi-html-community": "^0.0.8", "bonjour-service": "^1.2.1", "chokidar": "^3.6.0", "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^2.0.0", "express": "^4.21.2", "graceful-fs": "^4.2.6", "http-proxy-middleware": "^2.0.9", "ipaddr.js": "^2.1.0", "launch-editor": "^2.6.1", "open": "^10.0.3", "p-retry": "^6.2.0", "schema-utils": "^4.2.0", "selfsigned": "^2.4.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", "webpack-dev-middleware": "^7.4.2", "ws": "^8.18.0" }, "peerDependencies": { "webpack": "^5.0.0" }, "optionalPeers": ["webpack"], "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" } }, "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg=="], + + "webpack-merge": ["webpack-merge@6.0.1", "", { "dependencies": { "clone-deep": "^4.0.1", "flat": "^5.0.2", "wildcard": "^2.0.1" } }, "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg=="], + + "webpack-sources": ["webpack-sources@3.3.3", "", {}, "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg=="], + + "webpackbar": ["webpackbar@6.0.1", "", { "dependencies": { "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "consola": "^3.2.3", "figures": "^3.2.0", "markdown-table": "^2.0.0", "pretty-time": "^1.1.0", "std-env": "^3.7.0", "wrap-ansi": "^7.0.0" }, "peerDependencies": { "webpack": "3 || 4 || 5" } }, "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q=="], + + "websocket-driver": ["websocket-driver@0.7.4", "", { "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg=="], + + "websocket-extensions": ["websocket-extensions@0.1.4", "", {}, "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg=="], + + "whatwg-fetch": ["whatwg-fetch@3.6.20", "", {}, "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "widest-line": ["widest-line@4.0.1", "", { "dependencies": { "string-width": "^5.0.1" } }, "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig=="], + + "wildcard": ["wildcard@2.0.1", "", {}, "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ=="], + + "window-size": ["window-size@0.2.0", "", { "bin": { "window-size": "cli.js" } }, "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw=="], + + "wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "write-file-atomic": ["write-file-atomic@3.0.3", "", { "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="], + + "ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "wsl-utils": ["wsl-utils@0.1.0", "", { "dependencies": { "is-wsl": "^3.1.0" } }, "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw=="], + + "xdg-basedir": ["xdg-basedir@5.1.0", "", {}, "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ=="], + + "xml-js": ["xml-js@1.6.11", "", { "dependencies": { "sax": "^1.2.4" }, "bin": { "xml-js": "./bin/cli.js" } }, "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g=="], + + "xml-name-validator": ["xml-name-validator@1.0.0", "", {}, "sha512-XDmXffxxQs/+0VLW9NB2oSIbSoSINj6dQdhegY3kEM81LOoLr6NfsFE9RR59qrwsKEHaZLxa1MOSahFA0CE9Ow=="], + + "xmlhttprequest": ["xmlhttprequest@1.8.0", "", {}, "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA=="], + + "y18n": ["y18n@3.2.2", "", {}, "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ=="], + + "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "yargs": ["yargs@4.6.0", "", { "dependencies": { "camelcase": "^2.0.1", "cliui": "^3.2.0", "decamelize": "^1.1.1", "lodash.assign": "^4.0.3", "os-locale": "^1.4.0", "pkg-conf": "^1.1.2", "read-pkg-up": "^1.0.1", "require-main-filename": "^1.0.1", "string-width": "^1.0.1", "window-size": "^0.2.0", "y18n": "^3.2.1", "yargs-parser": "^2.4.0" } }, "sha512-KmjJbWBkYiSRUChcOSa4rtBxDXf0j4ISz+tpeNa4LKIBllgKnkemJ3x4yo4Yydp3wPU4/xJTaKTLLZ8V7zhI7A=="], + + "yargs-parser": ["yargs-parser@2.4.1", "", { "dependencies": { "camelcase": "^3.0.0", "lodash.assign": "^4.0.6" } }, "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA=="], + + "yocto-queue": ["yocto-queue@1.2.1", "", {}, "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg=="], + + "zod": ["zod@4.1.12", "", {}, "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ=="], + + "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + + "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-create-regexp-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/plugin-transform-runtime/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/preset-env/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@docusaurus/types/webpack-merge": ["webpack-merge@5.10.0", "", { "dependencies": { "clone-deep": "^4.0.1", "flat": "^5.0.2", "wildcard": "^2.0.0" } }, "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA=="], + + "@pnpm/network.ca-file/graceful-fs": ["graceful-fs@4.2.10", "", {}, "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="], + + "accepts/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "accepts/negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], + + "ansi-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], + + "babel-plugin-polyfill-corejs2/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "body-parser/bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + + "body-parser/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "cheerio/htmlparser2": ["htmlparser2@8.0.2", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1", "entities": "^4.4.0" } }, "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA=="], + + "cheerio/parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], + + "cheerio-select/css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], + + "cheerio-select/domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "clean-css/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "cli-table3/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "cliui/string-width": ["string-width@1.0.2", "", { "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } }, "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw=="], + + "cliui/strip-ansi": ["strip-ansi@3.0.1", "", { "dependencies": { "ansi-regex": "^2.0.0" } }, "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg=="], + + "cliui/wrap-ansi": ["wrap-ansi@2.1.0", "", { "dependencies": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" } }, "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw=="], + + "compressible/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "compression/bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + + "compression/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "config-chain/ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + + "copy-webpack-plugin/glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "copy-webpack-plugin/globby": ["globby@13.2.2", "", { "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.3.0", "ignore": "^5.2.4", "merge2": "^1.4.1", "slash": "^4.0.0" } }, "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w=="], + + "crypto-random-string/type-fest": ["type-fest@1.4.0", "", {}, "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA=="], + + "css-select/domhandler": ["domhandler@4.3.1", "", { "dependencies": { "domelementtype": "^2.2.0" } }, "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ=="], + + "css-select/domutils": ["domutils@2.8.0", "", { "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0" } }, "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A=="], + + "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="], + + "cytoscape-fcose/cose-base": ["cose-base@2.2.0", "", { "dependencies": { "layout-base": "^2.0.0" } }, "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g=="], + + "d3-dsv/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], + + "d3-dsv/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + + "d3-sankey/d3-array": ["d3-array@2.12.1", "", { "dependencies": { "internmap": "^1.0.0" } }, "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ=="], + + "d3-sankey/d3-shape": ["d3-shape@1.3.7", "", { "dependencies": { "d3-path": "1" } }, "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw=="], + + "decompress-response/mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], + + "dom-serializer/domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "domhandler/domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "domutils/domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "dot-prop/is-obj": ["is-obj@2.0.0", "", {}, "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="], + + "encoding/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + + "esrecurse/estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "express/content-disposition": ["content-disposition@0.5.4", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="], + + "express/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "express/path-to-regexp": ["path-to-regexp@0.1.12", "", {}, "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="], + + "express/range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + + "fbjs/core-js": ["core-js@1.2.7", "", {}, "sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA=="], + + "figures/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "file-loader/schema-utils": ["schema-utils@3.3.0", "", { "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } }, "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg=="], + + "finalhandler/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "got/@sindresorhus/is": ["@sindresorhus/is@5.6.0", "", {}, "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g=="], + + "gray-matter/js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], + + "har-validator/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "hast-util-raw/parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], + + "hast-util-to-parse5/property-information": ["property-information@6.5.0", "", {}, "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig=="], + + "hpack.js/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "html-minifier-terser/commander": ["commander@10.0.1", "", {}, "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="], + + "html-webpack-plugin/html-minifier-terser": ["html-minifier-terser@6.1.0", "", { "dependencies": { "camel-case": "^4.1.2", "clean-css": "^5.2.2", "commander": "^8.3.0", "he": "^1.2.0", "param-case": "^3.0.4", "relateurl": "^0.2.7", "terser": "^5.10.0" }, "bin": { "html-minifier-terser": "cli.js" } }, "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw=="], + + "htmlparser2/domhandler": ["domhandler@2.4.2", "", { "dependencies": { "domelementtype": "1" } }, "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA=="], + + "htmlparser2/domutils": ["domutils@1.7.0", "", { "dependencies": { "dom-serializer": "0", "domelementtype": "1" } }, "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg=="], + + "htmlparser2/entities": ["entities@1.1.2", "", {}, "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="], + + "htmltojsx/react": ["react@15.4.2", "", { "dependencies": { "fbjs": "^0.8.4", "loose-envify": "^1.1.0", "object-assign": "^4.1.0" } }, "sha512-qfWUqdaiZjHlmsWI9Cvw9UvugnxluSsEoSOeykOiB37xQokYpxNqdQizNsAqVQvrNz4I8Pf7wCfB5g+ocvJS8Q=="], + + "htmltojsx/react-dom": ["react-dom@15.4.2", "", { "dependencies": { "fbjs": "^0.8.1", "loose-envify": "^1.1.0", "object-assign": "^4.1.0" }, "peerDependencies": { "react": "^15.4.2" } }, "sha512-k5NZrskw9K6rTlgIH/z4exMQuQQfzF8z2G7Ic+9vODPTycx//qyuOTiAhYhjlOaHFsIH2IXWJ4n4JiwheDBXNA=="], + + "http-proxy-middleware/is-plain-obj": ["is-plain-obj@3.0.0", "", {}, "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA=="], + + "is-inside-container/is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], + + "jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "katex/commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], + + "load-json-file/parse-json": ["parse-json@2.2.0", "", { "dependencies": { "error-ex": "^1.2.0" } }, "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ=="], + + "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + + "mdast-util-from-markdown/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "mdast-util-frontmatter/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + + "mdast-util-gfm-autolink-literal/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "mdast-util-gfm-table/markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], + + "micromark/micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-core-commonmark/micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-core-commonmark/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-core-commonmark/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-extension-directive/micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-extension-directive/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-extension-directive/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-extension-frontmatter/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-extension-frontmatter/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-extension-gfm-autolink-literal/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-extension-gfm-autolink-literal/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-extension-gfm-footnote/micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-extension-gfm-footnote/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-extension-gfm-footnote/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-extension-gfm-strikethrough/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-extension-gfm-table/micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-extension-gfm-table/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-extension-gfm-table/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-extension-gfm-task-list-item/micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-extension-gfm-task-list-item/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-extension-gfm-task-list-item/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-extension-mdx-expression/micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-extension-mdx-expression/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-extension-mdx-expression/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-extension-mdx-jsx/micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-extension-mdx-jsx/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-extension-mdx-jsx/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-extension-mdxjs-esm/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-extension-mdxjs-esm/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-factory-destination/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-factory-destination/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-factory-label/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-factory-label/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-factory-mdx-expression/micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-factory-mdx-expression/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-factory-mdx-expression/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-factory-space/micromark-util-types": ["micromark-util-types@1.1.0", "", {}, "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg=="], + + "micromark-factory-title/micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-factory-title/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-factory-title/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-factory-whitespace/micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-factory-whitespace/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-factory-whitespace/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-character/micromark-util-types": ["micromark-util-types@1.1.0", "", {}, "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg=="], + + "micromark-util-chunked/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-classify-character/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-util-classify-character/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-decode-numeric-character-reference/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-decode-string/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-util-decode-string/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-events-to-acorn/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-normalize-identifier/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-sanitize-uri/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-util-sanitize-uri/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-subtokenize/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "mlly/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + + "node-fetch/is-stream": ["is-stream@1.1.0", "", {}, "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ=="], + + "normalize-package-data/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], + + "null-loader/schema-utils": ["schema-utils@3.3.0", "", { "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } }, "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg=="], + + "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + + "parse5-htmlparser2-tree-adapter/parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], + + "pkg-dir/find-up": ["find-up@6.3.0", "", { "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" } }, "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw=="], + + "postcss-calc/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + + "postcss-discard-unused/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + + "postcss-merge-rules/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + + "postcss-minify-selectors/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + + "postcss-unique-selectors/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + + "proxy-addr/ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], + + "raw-body/bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + + "rc/ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + + "read-pkg/path-type": ["path-type@1.1.0", "", { "dependencies": { "graceful-fs": "^4.1.2", "pify": "^2.0.0", "pinkie-promise": "^2.0.0" } }, "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg=="], + + "renderkid/htmlparser2": ["htmlparser2@6.1.0", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", "domutils": "^2.5.2", "entities": "^2.0.0" } }, "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A=="], + + "renderkid/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "request/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "request/qs": ["qs@6.5.3", "", {}, "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="], + + "request/uuid": ["uuid@3.4.0", "", { "bin": { "uuid": "./bin/uuid" } }, "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="], + + "send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], + + "send/range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + + "serve-handler/path-to-regexp": ["path-to-regexp@3.3.0", "", {}, "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw=="], + + "serve-index/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "serve-index/http-errors": ["http-errors@1.6.3", "", { "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", "statuses": ">= 1.4.0 < 2" } }, "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A=="], + + "serve-index/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "sockjs/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + + "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "stylehacks/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + + "svgo/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], + + "svgo/css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], + + "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "terser-webpack-plugin/jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], + + "type-is/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "update-notifier/boxen": ["boxen@7.1.1", "", { "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^7.0.1", "chalk": "^5.2.0", "cli-boxes": "^3.0.0", "string-width": "^5.1.2", "type-fest": "^2.13.0", "widest-line": "^4.0.1", "wrap-ansi": "^8.1.0" } }, "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog=="], + + "update-notifier/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + + "url-loader/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "url-loader/schema-utils": ["schema-utils@3.3.0", "", { "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } }, "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg=="], + + "verror/core-util-is": ["core-util-is@1.0.2", "", {}, "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="], + + "webpack/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "webpack-bundle-analyzer/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], + + "webpack-dev-middleware/mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA=="], + + "webpack-dev-middleware/range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + + "webpack-dev-server/open": ["open@10.2.0", "", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "wsl-utils": "^0.1.0" } }, "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA=="], + + "webpack-dev-server/ws": ["ws@8.18.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="], + + "webpackbar/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "wsl-utils/is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="], + + "yargs/camelcase": ["camelcase@2.1.1", "", {}, "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw=="], + + "yargs/string-width": ["string-width@1.0.2", "", { "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } }, "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw=="], + + "yargs-parser/camelcase": ["camelcase@3.0.0", "", {}, "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg=="], + + "accepts/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "ansi-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "ansi-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "cheerio/htmlparser2/domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "cheerio/parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], + + "cli-table3/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "cli-table3/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "cliui/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@1.0.0", "", { "dependencies": { "number-is-nan": "^1.0.0" } }, "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw=="], + + "cliui/strip-ansi/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="], + + "compression/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "copy-webpack-plugin/globby/slash": ["slash@4.0.0", "", {}, "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew=="], + + "css-select/domhandler/domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "css-select/domutils/dom-serializer": ["dom-serializer@1.4.1", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" } }, "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag=="], + + "css-select/domutils/domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="], + + "cytoscape-fcose/cose-base/layout-base": ["layout-base@2.0.1", "", {}, "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg=="], + + "d3-sankey/d3-shape/d3-path": ["d3-path@1.0.9", "", {}, "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="], + + "express/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "file-loader/schema-utils/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "file-loader/schema-utils/ajv-keywords": ["ajv-keywords@3.5.2", "", { "peerDependencies": { "ajv": "^6.9.1" } }, "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="], + + "finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "gray-matter/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + + "har-validator/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "hast-util-raw/parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], + + "hpack.js/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "hpack.js/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "hpack.js/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "html-webpack-plugin/html-minifier-terser/commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], + + "htmlparser2/domutils/dom-serializer": ["dom-serializer@0.2.2", "", { "dependencies": { "domelementtype": "^2.0.1", "entities": "^2.0.0" } }, "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g=="], + + "mdast-util-gfm-autolink-literal/micromark-util-character/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], + + "null-loader/schema-utils/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "null-loader/schema-utils/ajv-keywords": ["ajv-keywords@3.5.2", "", { "peerDependencies": { "ajv": "^6.9.1" } }, "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="], + + "parse5-htmlparser2-tree-adapter/parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], + + "pkg-dir/find-up/path-exists": ["path-exists@5.0.0", "", {}, "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ=="], + + "renderkid/htmlparser2/domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "renderkid/htmlparser2/domhandler": ["domhandler@4.3.1", "", { "dependencies": { "domelementtype": "^2.2.0" } }, "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ=="], + + "renderkid/htmlparser2/domutils": ["domutils@2.8.0", "", { "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0" } }, "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A=="], + + "renderkid/htmlparser2/entities": ["entities@2.2.0", "", {}, "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="], + + "renderkid/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "request/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "serve-index/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "serve-index/http-errors/depd": ["depd@1.1.2", "", {}, "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ=="], + + "serve-index/http-errors/inherits": ["inherits@2.0.3", "", {}, "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw=="], + + "serve-index/http-errors/setprototypeof": ["setprototypeof@1.1.0", "", {}, "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="], + + "serve-index/http-errors/statuses": ["statuses@1.5.0", "", {}, "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="], + + "serve-index/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "terser-webpack-plugin/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "type-is/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "update-notifier/boxen/camelcase": ["camelcase@7.0.1", "", {}, "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw=="], + + "url-loader/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "url-loader/schema-utils/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "url-loader/schema-utils/ajv-keywords": ["ajv-keywords@3.5.2", "", { "peerDependencies": { "ajv": "^6.9.1" } }, "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="], + + "webpack-dev-middleware/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "webpack-dev-server/open/define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="], + + "webpack/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "webpackbar/wrap-ansi/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "webpackbar/wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "yargs/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@1.0.0", "", { "dependencies": { "number-is-nan": "^1.0.0" } }, "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw=="], + + "yargs/string-width/strip-ansi": ["strip-ansi@3.0.1", "", { "dependencies": { "ansi-regex": "^2.0.0" } }, "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg=="], + + "ansi-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "cli-table3/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "css-select/domutils/dom-serializer/entities": ["entities@2.2.0", "", {}, "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="], + + "file-loader/schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "htmlparser2/domutils/dom-serializer/domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "htmlparser2/domutils/dom-serializer/entities": ["entities@2.2.0", "", {}, "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="], + + "null-loader/schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "renderkid/htmlparser2/domutils/dom-serializer": ["dom-serializer@1.4.1", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" } }, "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag=="], + + "url-loader/schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "webpackbar/wrap-ansi/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "webpackbar/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="], + } +} diff --git a/docusaurus/code-output-block.jsx b/docs/code-output-block.jsx similarity index 100% rename from docusaurus/code-output-block.jsx rename to docs/code-output-block.jsx diff --git a/docs/api_reference/async_guard.md b/docs/dist/api_reference/async_guard.md similarity index 100% rename from docs/api_reference/async_guard.md rename to docs/dist/api_reference/async_guard.md diff --git a/docs/api_reference/data_types.md b/docs/dist/api_reference/data_types.md similarity index 100% rename from docs/api_reference/data_types.md rename to docs/dist/api_reference/data_types.md diff --git a/docs/api_reference/document_store.md b/docs/dist/api_reference/document_store.md similarity index 100% rename from docs/api_reference/document_store.md rename to docs/dist/api_reference/document_store.md diff --git a/docs/api_reference/errors.md b/docs/dist/api_reference/errors.md similarity index 100% rename from docs/api_reference/errors.md rename to docs/dist/api_reference/errors.md diff --git a/docs/api_reference/guard.md b/docs/dist/api_reference/guard.md similarity index 100% rename from docs/api_reference/guard.md rename to docs/dist/api_reference/guard.md diff --git a/docs/api_reference/helper_classes.md b/docs/dist/api_reference/helper_classes.md similarity index 100% rename from docs/api_reference/helper_classes.md rename to docs/dist/api_reference/helper_classes.md diff --git a/docs/api_reference/history_and_logs.md b/docs/dist/api_reference/history_and_logs.md similarity index 100% rename from docs/api_reference/history_and_logs.md rename to docs/dist/api_reference/history_and_logs.md diff --git a/docs/api_reference/response_structures.md b/docs/dist/api_reference/response_structures.md similarity index 100% rename from docs/api_reference/response_structures.md rename to docs/dist/api_reference/response_structures.md diff --git a/docs/api_reference/types.md b/docs/dist/api_reference/types.md similarity index 100% rename from docs/api_reference/types.md rename to docs/dist/api_reference/types.md diff --git a/docs/api_reference/validation_outcome.md b/docs/dist/api_reference/validation_outcome.md similarity index 100% rename from docs/api_reference/validation_outcome.md rename to docs/dist/api_reference/validation_outcome.md diff --git a/docs/dist/api_reference_markdown/actions.md b/docs/dist/api_reference_markdown/actions.md new file mode 100644 index 000000000..7e81e2da6 --- /dev/null +++ b/docs/dist/api_reference_markdown/actions.md @@ -0,0 +1,81 @@ +# Actions + +## ReAsk + +```python +class ReAsk(IReask) +``` + +Base class for ReAsk objects. + +**Attributes**: + +- `incorrect_value` _Any_ - The value that failed validation. +- `fail_results` _List[FailResult]_ - The results of the failed validations. + +## FieldReAsk + +```python +class FieldReAsk(ReAsk) +``` + +An implementation of ReAsk that is used to reask for a specific field. +Inherits from ReAsk. + +**Attributes**: + +- `path` _Optional[List[Any]]_ - a list of keys that + designated the path to the field that failed validation. + +## SkeletonReAsk + +```python +class SkeletonReAsk(ReAsk) +``` + +An implementation of ReAsk that is used to reask for structured data +when the response does not match the expected schema. + +Inherits from ReAsk. + +## NonParseableReAsk + +```python +class NonParseableReAsk(ReAsk) +``` + +An implementation of ReAsk that is used to reask for structured data +when the response is not parseable as JSON. + +Inherits from ReAsk. + +## Filter + +```python +class Filter() +``` + +#### apply\_filters + +```python +def apply_filters(value: Any) -> Any +``` + +Recursively filter out any values that are instances of Filter. + +## Refrain + +```python +class Refrain() +``` + +#### apply\_refrain + +```python +def apply_refrain(value: Any, output_type: OutputTypes) -> Any +``` + +Recursively check for any values that are instances of Refrain. + +If found, return an empty value of the appropriate type. + diff --git a/docs/dist/api_reference_markdown/errors.md b/docs/dist/api_reference_markdown/errors.md new file mode 100644 index 000000000..fa814fff8 --- /dev/null +++ b/docs/dist/api_reference_markdown/errors.md @@ -0,0 +1,15 @@ +# Errors + +## ValidationError + +```python +class ValidationError(Exception) +``` + +Top level validation error. + +This is thrown from the validation engine when a Validator has +on_fail=OnFailActions.EXCEPTION set and validation fails. + +Inherits from Exception. + diff --git a/docs/dist/api_reference_markdown/formatters.md b/docs/dist/api_reference_markdown/formatters.md new file mode 100644 index 000000000..ceaf68b62 --- /dev/null +++ b/docs/dist/api_reference_markdown/formatters.md @@ -0,0 +1,23 @@ +# Formatters + +## BaseFormatter + +```python +class BaseFormatter(ABC) +``` + +A Formatter takes an LLM Callable and wraps the method into an abstract +callable. + +Used to perform manipulations of the input or the output, like JSON +constrained- decoding. + +## JsonFormatter + +```python +class JsonFormatter(BaseFormatter) +``` + +A formatter that uses Jsonformer to ensure the shape of structured data +for Hugging Face models. + diff --git a/docs/dist/api_reference_markdown/generics_and_base_classes.md b/docs/dist/api_reference_markdown/generics_and_base_classes.md new file mode 100644 index 000000000..3a0cb9fbb --- /dev/null +++ b/docs/dist/api_reference_markdown/generics_and_base_classes.md @@ -0,0 +1,137 @@ +# Generics And Base Classes + +## ArbitraryModel + +```python +class ArbitraryModel(BaseModel) +``` + +Empty Pydantic model with a config that allows arbitrary types. + +## Stack + +```python +class Stack(List[T]) +``` + +#### empty + +```python +def empty() -> bool +``` + +Tests if this stack is empty. + +#### peek + +```python +def peek() -> Optional[T] +``` + +Looks at the object at the top (last/most recently added) of this +stack without removing it from the stack. + +#### pop + +```python +def pop() -> Optional[T] +``` + +Removes the object at the top of this stack and returns that object +as the value of this function. + +#### push + +```python +def push(item: T) -> None +``` + +Pushes an item onto the top of this stack. + +Proxy of List.append + +#### search + +```python +def search(x: T) -> Optional[int] +``` + +Returns the 0-based position of the last item whose value is equal +to x on this stack. + +We deviate from the typical 1-based position used by Stack +classes (i.e. Java) because most python users (and developers in +general) are accustomed to 0-based indexing. + +#### at + +```python +def at(index: int, default: Optional[T] = None) -> Optional[T] +``` + +Returns the item located at the index. + +If the index does not exist in the stack (Overflow or +Underflow), None is returned instead. + +#### copy + +```python +def copy() -> "Stack[T]" +``` + +Returns a copy of the current Stack. + +#### first + +```python +@property +def first() -> Optional[T] +``` + +Returns the first item of the stack without removing it. + +Same as Stack.bottom. + +#### last + +```python +@property +def last() -> Optional[T] +``` + +Returns the last item of the stack without removing it. + +Same as Stack.top. + +#### bottom + +```python +@property +def bottom() -> Optional[T] +``` + +Returns the item on the bottom of the stack without removing it. + +Same as Stack.first. + +#### top + +```python +@property +def top() -> Optional[T] +``` + +Returns the item on the top of the stack without removing it. + +Same as Stack.last. + +#### length + +```python +@property +def length() -> int +``` + +Returns the number of items in the Stack. + diff --git a/docs/dist/api_reference_markdown/guards.md b/docs/dist/api_reference_markdown/guards.md new file mode 100644 index 000000000..aeed62997 --- /dev/null +++ b/docs/dist/api_reference_markdown/guards.md @@ -0,0 +1,543 @@ +# Guards + +## Guard + +```python +class Guard(IGuard, Generic[OT]) +``` + +The Guard class. + +This class is the main entry point for using Guardrails. It can be +initialized by one of the following patterns: + +- `Guard().use(...)` +- `Guard().use_many(...)` +- `Guard.for_string(...)` +- `Guard.for_pydantic(...)` +- `Guard.for_rail(...)` +- `Guard.for_rail_string(...)` + +The `__call__` +method functions as a wrapper around LLM APIs. It takes in an LLM +API, and optional prompt parameters, and returns a ValidationOutcome +class that contains the raw output from +the LLM, the validated output, as well as other helpful information. + +#### \_\_init\_\_ + +```python +def __init__(*, + id: Optional[str] = None, + name: Optional[str] = None, + description: Optional[str] = None, + validators: Optional[List[ValidatorReference]] = None, + output_schema: Optional[Dict[str, Any]] = None, + base_url: Optional[str] = None, + api_key: Optional[str] = None) +``` + +Initialize the Guard with serialized validator references and an +output schema. + +Output schema must be a valid JSON Schema. + +#### configure + +```python +def configure(*, + num_reasks: Optional[int] = None, + tracer: Optional[Tracer] = None, + allow_metrics_collection: Optional[bool] = None) +``` + +Configure the Guard. + +**Arguments**: + +- `num_reasks` _int, optional_ - The max times to re-ask the LLM + if validation fails. Defaults to None. +- `tracer` _Tracer, optional_ - An OpenTelemetry tracer to use for + sending traces to your OpenTelemetry sink. Defaults to None. +- `allow_metrics_collection` _bool, optional_ - Whether to allow + Guardrails to collect anonymous metrics. + Defaults to None, and falls back to waht is + set via the `guardrails configure` command. + +#### for\_rail + +```python +@classmethod +def for_rail(cls, + rail_file: str, + *, + num_reasks: Optional[int] = None, + tracer: Optional[Tracer] = None, + name: Optional[str] = None, + description: Optional[str] = None) +``` + +Create a Guard using a `.rail` file to specify the output schema, +prompt, etc. + +**Arguments**: + +- `rail_file` - The path to the `.rail` file. +- `num_reasks` _int, optional_ - The max times to re-ask the LLM if validation fails. Deprecated +- `tracer` _Tracer, optional_ - An OpenTelemetry tracer to use for metrics and traces. Defaults to None. +- `name` _str, optional_ - A unique name for this Guard. Defaults to `gr-` + the object id. +- `description` _str, optional_ - A description for this Guard. Defaults to None. + + +**Returns**: + + An instance of the `Guard` class. + +#### for\_rail\_string + +```python +@classmethod +def for_rail_string(cls, + rail_string: str, + *, + num_reasks: Optional[int] = None, + tracer: Optional[Tracer] = None, + name: Optional[str] = None, + description: Optional[str] = None) +``` + +Create a Guard using a `.rail` string to specify the output schema, +prompt, etc.. + +**Arguments**: + +- `rail_string` - The `.rail` string. +- `num_reasks` _int, optional_ - The max times to re-ask the LLM if validation fails. Deprecated +- `tracer` _Tracer, optional_ - An OpenTelemetry tracer to use for metrics and traces. Defaults to None. +- `name` _str, optional_ - A unique name for this Guard. Defaults to `gr-` + the object id. +- `description` _str, optional_ - A description for this Guard. Defaults to None. + + +**Returns**: + + An instance of the `Guard` class. + +#### for\_pydantic + +```python +@classmethod +def for_pydantic(cls, + output_class: ModelOrListOfModels, + *, + num_reasks: Optional[int] = None, + reask_messages: Optional[List[Dict]] = None, + messages: Optional[List[Dict]] = None, + tracer: Optional[Tracer] = None, + name: Optional[str] = None, + description: Optional[str] = None, + output_formatter: Optional[Union[str, BaseFormatter]] = None) +``` + +Create a Guard instance using a Pydantic model to specify the output +schema. + +**Arguments**: + +- `output_class` - (Union[Type[BaseModel], List[Type[BaseModel]]]): The pydantic model that describes + the desired structure of the output. +- `messages` _List[Dict], optional_ - A list of messages to give to the llm. Defaults to None. +- `reask_messages` _List[Dict], optional_ - A list of messages to use during reasks. Defaults to None. +- `num_reasks` _int, optional_ - The max times to re-ask the LLM if validation fails. Deprecated +- `tracer` _Tracer, optional_ - An OpenTelemetry tracer to use for metrics and traces. Defaults to None. +- `name` _str, optional_ - A unique name for this Guard. Defaults to `gr-` + the object id. +- `description` _str, optional_ - A description for this Guard. Defaults to None. +- `output_formatter` _str | Formatter, optional_ - 'none' (default), 'jsonformer', or a Guardrails Formatter. + +#### for\_string + +```python +@classmethod +def for_string(cls, + validators: Sequence[Validator], + *, + string_description: Optional[str] = None, + reask_messages: Optional[List[Dict]] = None, + messages: Optional[List[Dict]] = None, + num_reasks: Optional[int] = None, + tracer: Optional[Tracer] = None, + name: Optional[str] = None, + description: Optional[str] = None) +``` + +Create a Guard instance for a string response. + +**Arguments**: + +- `validators` - (List[Validator]): The list of validators to apply to the string output. +- `string_description` _str, optional_ - A description for the string to be generated. Defaults to None. +- `messages` _List[Dict], optional_ - A list of messages to pass to llm. Defaults to None. +- `reask_messages` _List[Dict], optional_ - A list of messages to use during reasks. Defaults to None. +- `num_reasks` _int, optional_ - The max times to re-ask the LLM if validation fails. Deprecated +- `tracer` _Tracer, optional_ - An OpenTelemetry tracer to use for metrics and traces. Defaults to None. +- `name` _str, optional_ - A unique name for this Guard. Defaults to `gr-` + the object id. +- `description` _str, optional_ - A description for this Guard. Defaults to None. + +#### \_\_call\_\_ + +```python +@trace(name="/guard_call", origin="Guard.__call__") +def __call__( + llm_api: Optional[Callable] = None, + *args, + prompt_params: Optional[Dict] = None, + num_reasks: Optional[int] = 1, + messages: Optional[List[Dict]] = None, + metadata: Optional[Dict] = None, + full_schema_reask: Optional[bool] = None, + **kwargs +) -> Union[ValidationOutcome[OT], Iterator[ValidationOutcome[OT]]] +``` + +Call the LLM and validate the output. + +**Arguments**: + +- `llm_api` - The LLM API to call + (e.g. openai.completions.create or openai.Completion.acreate) +- `prompt_params` - The parameters to pass to the prompt.format() method. +- `num_reasks` - The max times to re-ask the LLM for invalid output. +- `messages` - The message history to pass to the LLM. +- `metadata` - Metadata to pass to the validators. +- `full_schema_reask` - When reasking, whether to regenerate the full schema + or just the incorrect values. + Defaults to `True` if a base model is provided, + `False` otherwise. + + +**Returns**: + + ValidationOutcome + +#### parse + +```python +@trace(name="/guard_call", origin="Guard.parse") +def parse(llm_output: str, + *args, + metadata: Optional[Dict] = None, + llm_api: Optional[Callable] = None, + num_reasks: Optional[int] = None, + prompt_params: Optional[Dict] = None, + full_schema_reask: Optional[bool] = None, + **kwargs) -> ValidationOutcome[OT] +``` + +Alternate flow to using Guard where the llm_output is known. + +**Arguments**: + +- `llm_output` - The output being parsed and validated. +- `metadata` - Metadata to pass to the validators. +- `llm_api` - The LLM API to call + (e.g. openai.completions.create or openai.Completion.acreate) +- `num_reasks` - The max times to re-ask the LLM for invalid output. +- `prompt_params` - The parameters to pass to the prompt.format() method. +- `full_schema_reask` - When reasking, whether to regenerate the full schema + or just the incorrect values. + + +**Returns**: + + ValidationOutcome + +#### error\_spans\_in\_output + +```python +def error_spans_in_output() -> List[ErrorSpan] +``` + +Get the error spans in the last output. + +#### use + +```python +@overload +def use(validator: Validator, *, on: str = "output") -> "Guard" +``` + +#### use + +```python +@overload +def use(validator: Type[Validator], + *args, + on: str = "output", + **kwargs) -> "Guard" +``` + +#### use + +```python +def use(validator: UseValidatorSpec, + *args, + on: str = "output", + **kwargs) -> "Guard" +``` + +Use a validator to validate either of the following: +- The output of an LLM request +- The message history + +**Arguments**: + +- `validator` - The validator to use. Either the class or an instance. +- `on` - The part of the LLM request to validate. Defaults to "output". + +#### use\_many + +```python +@overload +def use_many(*validators: Validator, on: str = "output") -> "Guard" +``` + +#### use\_many + +```python +@overload +def use_many(*validators: UseManyValidatorTuple, + on: str = "output") -> "Guard" +``` + +#### use\_many + +```python +def use_many(*validators: UseManyValidatorSpec, on: str = "output") -> "Guard" +``` + +Use multiple validators to validate results of an LLM request. + +#### validate + +```python +@trace(name="/guard_call", origin="Guard.validate") +def validate(llm_output: str, *args, **kwargs) -> ValidationOutcome[OT] +``` + +#### to\_runnable + +```python +def to_runnable() -> Runnable +``` + +Convert a Guard to a LangChain Runnable. + +#### to\_dict + +```python +def to_dict() -> Dict[str, Any] +``` + +#### json\_function\_calling\_tool + +```python +def json_function_calling_tool( + tools: Optional[list] = None) -> List[Dict[str, Any]] +``` + +Appends an OpenAI tool that specifies the output structure using +JSON Schema for chat models. + +#### from\_dict + +```python +@classmethod +def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional["Guard"] +``` + +## AsyncGuard + +```python +class AsyncGuard(Guard, Generic[OT]) +``` + +The AsyncGuard class. + +This class one of the main entry point for using Guardrails. It is +initialized from one of the following class methods: + +- `for_rail` +- `for_rail_string` +- `for_pydantic` +- `for_string` + +The `__call__` +method functions as a wrapper around LLM APIs. It takes in an Async LLM +API, and optional prompt parameters, and returns the raw output stream from +the LLM and the validated output stream. + +#### for\_pydantic + +```python +@classmethod +def for_pydantic(cls, + output_class: ModelOrListOfModels, + *, + messages: Optional[List[Dict]] = None, + num_reasks: Optional[int] = None, + reask_messages: Optional[List[Dict]] = None, + tracer: Optional[Tracer] = None, + name: Optional[str] = None, + description: Optional[str] = None) +``` + +#### for\_string + +```python +@classmethod +def for_string(cls, + validators: Sequence[Validator], + *, + string_description: Optional[str] = None, + messages: Optional[List[Dict]] = None, + reask_messages: Optional[List[Dict]] = None, + num_reasks: Optional[int] = None, + tracer: Optional[Tracer] = None, + name: Optional[str] = None, + description: Optional[str] = None) +``` + +#### from\_dict + +```python +@classmethod +def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional["AsyncGuard"] +``` + +#### use + +```python +def use(validator: UseValidatorSpec, + *args, + on: str = "output", + **kwargs) -> "AsyncGuard" +``` + +#### use\_many + +```python +def use_many(*validators: UseManyValidatorSpec, + on: str = "output") -> "AsyncGuard" +``` + +#### \_\_call\_\_ + +```python +@async_trace(name="/guard_call", origin="AsyncGuard.__call__") +async def __call__( + llm_api: Optional[Callable[..., Awaitable[Any]]] = None, + *args, + prompt_params: Optional[Dict] = None, + num_reasks: Optional[int] = 1, + messages: Optional[List[Dict]] = None, + metadata: Optional[Dict] = None, + full_schema_reask: Optional[bool] = None, + **kwargs +) -> Union[ + ValidationOutcome[OT], + Awaitable[ValidationOutcome[OT]], + AsyncIterator[ValidationOutcome[OT]], +] +``` + +Call the LLM and validate the output. Pass an async LLM API to +return a coroutine. + +**Arguments**: + +- `llm_api` - The LLM API to call + (e.g. openai.completions.create or openai.chat.completions.create) +- `prompt_params` - The parameters to pass to the prompt.format() method. +- `num_reasks` - The max times to re-ask the LLM for invalid output. +- `messages` - The message history to pass to the LLM. +- `metadata` - Metadata to pass to the validators. +- `full_schema_reask` - When reasking, whether to regenerate the full schema + or just the incorrect values. + Defaults to `True` if a base model is provided, + `False` otherwise. + + +**Returns**: + + The raw text output from the LLM and the validated output. + +#### parse + +```python +@async_trace(name="/guard_call", origin="AsyncGuard.parse") +async def parse(llm_output: str, + *args, + metadata: Optional[Dict] = None, + llm_api: Optional[Callable[..., Awaitable[Any]]] = None, + num_reasks: Optional[int] = None, + prompt_params: Optional[Dict] = None, + full_schema_reask: Optional[bool] = None, + **kwargs) -> Awaitable[ValidationOutcome[OT]] +``` + +Alternate flow to using AsyncGuard where the llm_output is known. + +**Arguments**: + +- `llm_output` - The output being parsed and validated. +- `metadata` - Metadata to pass to the validators. +- `llm_api` - The LLM API to call + (e.g. openai.completions.create or openai.Completion.acreate) +- `num_reasks` - The max times to re-ask the LLM for invalid output. +- `prompt_params` - The parameters to pass to the prompt.format() method. +- `full_schema_reask` - When reasking, whether to regenerate the full schema + or just the incorrect values. + + +**Returns**: + + The validated response. This is either a string or a dictionary, + determined by the object schema defined in the RAILspec. + +#### validate + +```python +@async_trace(name="/guard_call", origin="AsyncGuard.validate") +async def validate(llm_output: str, *args, + **kwargs) -> Awaitable[ValidationOutcome[OT]] +``` + +## ValidationOutcome + +```python +class ValidationOutcome(IValidationOutcome, ArbitraryModel, Generic[OT]) +``` + +The final output from a Guard execution. + +**Attributes**: + +- `call_id` - The id of the Call that produced this ValidationOutcome. +- `raw_llm_output` - The raw, unchanged output from the LLM call. +- `validated_output` - The validated, and potentially fixed, output from the LLM call + after passing through validation. +- `reask` - If validation continuously fails and all allocated reasks are used, + this field will contain the final reask that would have been sent + to the LLM if additional reasks were available. +- `validation_passed` - A boolean to indicate whether or not the LLM output + passed validation. If this is False, the validated_output may be invalid. +- `error` - If the validation failed, this field will contain the error message + +#### from\_guard\_history + +```python +@classmethod +def from_guard_history(cls, call: Call) +``` + +Create a ValidationOutcome from a history Call object. + diff --git a/docs/dist/api_reference_markdown/history_and_logs.md b/docs/dist/api_reference_markdown/history_and_logs.md new file mode 100644 index 000000000..c130eee34 --- /dev/null +++ b/docs/dist/api_reference_markdown/history_and_logs.md @@ -0,0 +1,507 @@ +# History and Logs + +## Call + +```python +class Call(ICall, ArbitraryModel) +``` + +A Call represents a single execution of a Guard. One Call is created +each time the user invokes the `Guard.__call__`, `Guard.parse`, or +`Guard.validate` method. + +**Attributes**: + +- `iterations` _Stack[Iteration]_ - A stack of iterations + for the initial validation round + and one for each reask that occurs during a Call. +- `inputs` _CallInputs_ - The inputs as passed in to + `Guard.__call__`, `Guard.parse`, or `Guard.validate` +- `exception` _Optional[Exception]_ - The exception that interrupted + the Guard execution. + +#### prompt\_params + +```python +@property +def prompt_params() -> Optional[Dict] +``` + +The prompt parameters as provided by the user when initializing or +calling the Guard. + +#### messages + +```python +@property +def messages() -> Optional[Union[Messages, list[dict[str, str]]]] +``` + +The messages as provided by the user when initializing or calling +the Guard. + +#### compiled\_messages + +```python +@property +def compiled_messages() -> Optional[list[dict[str, str]]] +``` + +The initial compiled messages that were passed to the LLM on the +first call. + +#### reask\_messages + +```python +@property +def reask_messages() -> Stack[Messages] +``` + +The compiled messages used during reasks. + +Does not include the initial messages. + +#### logs + +```python +@property +def logs() -> Stack[str] +``` + +Returns all logs from all iterations as a stack. + +#### tokens\_consumed + +```python +@property +def tokens_consumed() -> Optional[int] +``` + +Returns the total number of tokens consumed during all iterations +with this call. + +#### prompt\_tokens\_consumed + +```python +@property +def prompt_tokens_consumed() -> Optional[int] +``` + +Returns the total number of prompt tokens consumed during all +iterations with this call. + +#### completion\_tokens\_consumed + +```python +@property +def completion_tokens_consumed() -> Optional[int] +``` + +Returns the total number of completion tokens consumed during all +iterations with this call. + +#### raw\_outputs + +```python +@property +def raw_outputs() -> Stack[str] +``` + +The exact outputs from all LLM calls. + +#### parsed\_outputs + +```python +@property +def parsed_outputs() -> Stack[Union[str, List, Dict]] +``` + +The outputs from the LLM after undergoing parsing but before +validation. + +#### validation\_response + +```python +@property +def validation_response() -> Optional[Union[str, List, Dict, ReAsk]] +``` + +The aggregated responses from the validation process across all +iterations within the current call. + +This value could contain ReAsks. + +#### fixed\_output + +```python +@property +def fixed_output() -> Optional[Union[str, List, Dict]] +``` + +The cumulative output from the validation process across all current +iterations with any automatic fixes applied. + +Could still contain ReAsks if a fix was not available. + +#### guarded\_output + +```python +@property +def guarded_output() -> Optional[Union[str, List, Dict]] +``` + +The complete validated output after all stages of validation are +completed. + +This property contains the aggregate validated output after all +validation stages have been completed. Some values in the +validated output may be "fixed" values that were corrected +during validation. + +This will only have a value if the Guard is in a passing state +OR if the action is no-op. + +#### reasks + +```python +@property +def reasks() -> Stack[ReAsk] +``` + +Reasks generated during validation that could not be automatically +fixed. + +These would be incorporated into the prompt for the next LLM +call if additional reasks were granted. + +#### validator\_logs + +```python +@property +def validator_logs() -> Stack[ValidatorLogs] +``` + +The results of each individual validation performed on the LLM +responses during all iterations. + +#### error + +```python +@property +def error() -> Optional[str] +``` + +The error message from any exception that raised and interrupted the +run. + +#### failed\_validations + +```python +@property +def failed_validations() -> Stack[ValidatorLogs] +``` + +The validator logs for any validations that failed during the +entirety of the run. + +#### status + +```python +@property +def status() -> str +``` + +Returns the cumulative status of the run based on the validity of +the final merged output. + +#### tree + +```python +@property +def tree() -> Tree +``` + +Returns the tree. + +## Iteration + +```python +class Iteration(IIteration, ArbitraryModel) +``` + +An Iteration represents a single iteration of the validation loop +including a single call to the LLM if applicable. + +**Attributes**: + +- `id` _str_ - The unique identifier for the iteration. +- `call_id` _str_ - The unique identifier for the Call + that this iteration is a part of. +- `index` _int_ - The index of this iteration within the Call. +- `inputs` _Inputs_ - The inputs for the validation loop. +- `outputs` _Outputs_ - The outputs from the validation loop. + +#### logs + +```python +@property +def logs() -> Stack[str] +``` + +Returns the logs from this iteration as a stack. + +#### tokens\_consumed + +```python +@property +def tokens_consumed() -> Optional[int] +``` + +Returns the total number of tokens consumed during this +iteration. + +#### prompt\_tokens\_consumed + +```python +@property +def prompt_tokens_consumed() -> Optional[int] +``` + +Returns the number of prompt/input tokens consumed during this +iteration. + +#### completion\_tokens\_consumed + +```python +@property +def completion_tokens_consumed() -> Optional[int] +``` + +Returns the number of completion/output tokens consumed during this +iteration. + +#### raw\_output + +```python +@property +def raw_output() -> Optional[str] +``` + +The exact output from the LLM. + +#### parsed\_output + +```python +@property +def parsed_output() -> Optional[Union[str, List, Dict]] +``` + +The output from the LLM after undergoing parsing but before +validation. + +#### validation\_response + +```python +@property +def validation_response() -> Optional[Union[ReAsk, str, List, Dict]] +``` + +The response from a single stage of validation. + +Validation response is the output of a single stage of validation +and could be a combination of valid output and reasks. +Note that a Guard may run validation multiple times if reasks occur. +To access the final output after all steps of validation are completed, +check out `Call.guarded_output`." + +#### guarded\_output + +```python +@property +def guarded_output() -> Optional[Union[str, List, Dict]] +``` + +Any valid values after undergoing validation. + +Some values in the validated output may be "fixed" values that +were corrected during validation. This property may be a partial +structure if field level reasks occur. + +#### reasks + +```python +@property +def reasks() -> Sequence[ReAsk] +``` + +Reasks generated during validation. + +These would be incorporated into the prompt or the next LLM +call. + +#### validator\_logs + +```python +@property +def validator_logs() -> List[ValidatorLogs] +``` + +The results of each individual validation performed on the LLM +response during this iteration. + +#### error + +```python +@property +def error() -> Optional[str] +``` + +The error message from any exception that raised and interrupted +this iteration. + +#### exception + +```python +@property +def exception() -> Optional[Exception] +``` + +The exception that interrupted this iteration. + +#### failed\_validations + +```python +@property +def failed_validations() -> List[ValidatorLogs] +``` + +The validator logs for any validations that failed during this +iteration. + +#### error\_spans\_in\_output + +```python +@property +def error_spans_in_output() -> List[ErrorSpan] +``` + +The error spans from the LLM response. + +These indices are relative to the complete LLM output. + +#### status + +```python +@property +def status() -> str +``` + +Representation of the end state of this iteration. + +OneOf: pass, fail, error, not run + +## Inputs + +```python +class Inputs(IInputs, ArbitraryModel) +``` + +Inputs represent the input data that is passed into the validation loop. + +**Attributes**: + +- `llm_api` _Optional[PromptCallableBase]_ - The constructed class + for calling the LLM. +- `llm_output` _Optional[str]_ - The string output from an + external LLM call provided by the user via Guard.parse. +- `messages` _Optional[List[Dict]]_ - The message history + provided by the user for chat model calls. +- `prompt_params` _Optional[Dict]_ - The parameters provided + by the user that will be formatted into the final LLM prompt. +- `num_reasks` _Optional[int]_ - The total number of reasks allowed; + user provided or defaulted. +- `metadata` _Optional[Dict[str, Any]]_ - The metadata provided + by the user to be used during validation. +- `full_schema_reask` _Optional[bool]_ - Whether reasks we + performed across the entire schema or at the field level. +- `stream` _Optional[bool]_ - Whether or not streaming was used. + +## Outputs + +```python +class Outputs(IOutputs, ArbitraryModel) +``` + +Outputs represent the data that is output from the validation loop. + +**Attributes**: + +- `llm_response_info` _Optional[LLMResponse]_ - Information from the LLM response +- `raw_output` _Optional[str]_ - The exact output from the LLM. +- `parsed_output` _Optional[Union[str, List, Dict]]_ - The output parsed from the LLM + response as it was passed into validation. +- `validation_response` _Optional[Union[str, ReAsk, List, Dict]]_ - The response + from the validation process. +- `guarded_output` _Optional[Union[str, List, Dict]]_ - Any valid values after + undergoing validation. + Some values may be "fixed" values that were corrected during validation. + This property may be a partial structure if field level reasks occur. +- `reasks` _List[ReAsk]_ - Information from the validation process used to construct + a ReAsk to the LLM on validation failure. Default []. +- `validator_logs` _List[ValidatorLogs]_ - The results of each individual + validation. Default []. +- `error` _Optional[str]_ - The error message from any exception that raised + and interrupted the process. +- `exception` _Optional[Exception]_ - The exception that interrupted the process. + +#### failed\_validations + +```python +@property +def failed_validations() -> List[ValidatorLogs] +``` + +Returns the validator logs for any validation that failed. + +#### error\_spans\_in\_output + +```python +@property +def error_spans_in_output() -> List[ErrorSpan] +``` + +The error spans from the LLM response. + +These indices are relative to the complete LLM output. + +#### status + +```python +@property +def status() -> str +``` + +Representation of the end state of the validation run. + +OneOf: pass, fail, error, not run + +## CallInputs + +```python +class CallInputs(Inputs, ICallInputs, ArbitraryModel) +``` + +CallInputs represent the input data that is passed into the Guard from +the user. Inherits from Inputs with the below overrides and additional +attributes. + +**Attributes**: + +- `llm_api` _Optional[Callable[[Any], Awaitable[Any]]]_ - The LLM function + provided by the user during Guard.__call__ or Guard.parse. +- `messages` _Optional[dict[str, str]]_ - The messages as provided by the user. +- `args` _List[Any]_ - Additional arguments for the LLM as provided by the user. + Default []. +- `kwargs` _Dict[str, Any]_ - Additional keyword-arguments for + the LLM as provided by the user. Default {}. + diff --git a/docs/dist/api_reference_markdown/llm_interaction.md b/docs/dist/api_reference_markdown/llm_interaction.md new file mode 100644 index 000000000..c23bd88e0 --- /dev/null +++ b/docs/dist/api_reference_markdown/llm_interaction.md @@ -0,0 +1,116 @@ +# Helpers for LLM Interactions + +Class for representing a prompt entry. + +## BasePrompt + +```python +class BasePrompt() +``` + +Base class for representing an LLM prompt. + +#### \_\_init\_\_ + +```python +def __init__(source: str, + output_schema: Optional[str] = None, + *, + xml_output_schema: Optional[str] = None) +``` + +Initialize and substitute constants in the prompt. + +#### substitute\_constants + +```python +def substitute_constants(text: str) -> str +``` + +Substitute constants in the prompt. + +#### get\_prompt\_variables + +```python +def get_prompt_variables() -> List[str] +``` + +#### format + +```python +def format(**kwargs) -> "BasePrompt" +``` + +#### escape + +```python +def escape() -> str +``` + +Escape single curly braces into double curly braces. + +The LLM prompt. + +## Prompt + +```python +class Prompt(BasePrompt) +``` + +Prompt class. + +The prompt is passed to the LLM as primary instructions. + +#### format + +```python +def format(**kwargs) -> "Prompt" +``` + +Format the prompt using the given keyword arguments. + +Instructions to the LLM, to be passed in the prompt. + +## Instructions + +```python +class Instructions(BasePrompt) +``` + +Instructions class. + +The instructions are passed to the LLM as secondary input. Different +model may use these differently. For example, chat models may +receive instructions in the system-prompt. + +#### format + +```python +def format(**kwargs) -> "Instructions" +``` + +Format the prompt using the given keyword arguments. + +## PromptCallableBase + +## LLMResponse + +```python +class LLMResponse(ILLMResponse) +``` + +Standard information collection from LLM responses to feed the +validation loop. + +**Attributes**: + +- `output` _str_ - The output from the LLM. +- `stream_output` _Optional[Iterator]_ - A stream of output from the LLM. + Default None. +- `async_stream_output` _Optional[AsyncIterator]_ - An async stream of output + from the LLM. Default None. +- `prompt_token_count` _Optional[int]_ - The number of tokens in the prompt. + Default None. +- `response_token_count` _Optional[int]_ - The number of tokens in the response. + Default None. + diff --git a/docs/dist/api_reference_markdown/types.md b/docs/dist/api_reference_markdown/types.md new file mode 100644 index 000000000..775099319 --- /dev/null +++ b/docs/dist/api_reference_markdown/types.md @@ -0,0 +1,115 @@ +# Types + +## OnFailAction + +```python +class OnFailAction(str, Enum) +``` + +OnFailAction is an Enum that represents the different actions that can +be taken when a validation fails. + +**Attributes**: + +- `REASK` _Literal["reask"]_ - On failure, Reask the LLM. +- `FIX` _Literal["fix"]_ - On failure, apply a static fix. +- `FILTER` _Literal["filter"]_ - On failure, filter out the invalid values. +- `REFRAIN` _Literal["refrain"]_ - On failure, refrain from responding; + return an empty value. +- `NOOP` _Literal["noop"]_ - On failure, do nothing. +- `EXCEPTION` _Literal["exception"]_ - On failure, raise a ValidationError. +- `FIX_REASK` _Literal["fix_reask"]_ - On failure, apply a static fix, + check if the fixed value passed validation, if not then reask the LLM. +- `CUSTOM` _Literal["custom"]_ - On failure, call a custom function with the + invalid value and the FailResult's from any validators run on the value. + +## RailTypes + +```python +class RailTypes(str, Enum) +``` + +RailTypes is an Enum that represents the builtin tags for RAIL xml. + +**Attributes**: + +- `STRING` _Literal["string"]_ - A string value. +- `INTEGER` _Literal["integer"]_ - An integer value. +- `FLOAT` _Literal["float"]_ - A float value. +- `BOOL` _Literal["bool"]_ - A boolean value. +- `DATE` _Literal["date"]_ - A date value. +- `TIME` _Literal["time"]_ - A time value. + DATETIME (Literal["date-time: - A datetime value. +- `PERCENTAGE` _Literal["percentage"]_ - A percentage value represented as a string. + Example "20.5%". +- `ENUM` _Literal["enum"]_ - An enum value. +- `LIST` _Literal["list"]_ - A list/array value. +- `OBJECT` _Literal["object"]_ - An object/dictionary value. +- `CHOICE` _Literal["choice"]_ - The options for a discrimated union. +- `CASE` _Literal["case"]_ - A dictionary that contains a discrimated union. + +## MessageHistory + +```python +MessageHistory = List[Dict[str, Union[Prompt, str]]] +``` + +## ModelOrListOfModels + +```python +ModelOrListOfModels = Union[Type[BaseModel], Type[List[Type[BaseModel]]]] +``` + +## ModelOrListOrDict + +```python +ModelOrListOrDict = Union[Type[BaseModel], Type[List[Type[BaseModel]]], + Type[Dict[str, Type[BaseModel]]]] +``` + +## ModelOrModelUnion + +```python +ModelOrModelUnion = Union[Type[BaseModel], Union[Type[BaseModel], Any]] +``` + +## PydanticValidatorTuple + +```python +PydanticValidatorTuple = Tuple[Union[Validator, str, Callable], str] +``` + +## PydanticValidatorSpec + +```python +PydanticValidatorSpec = Union[Validator, PydanticValidatorTuple] +``` + +## UseValidatorSpec + +```python +UseValidatorSpec = Union[Validator, Type[Validator]] +``` + +## UseManyValidatorTuple + +```python +UseManyValidatorTuple = Tuple[ + Type[Validator], + Optional[Union[List[Any], Dict[str, Any]]], + Optional[Dict[str, Any]], +] +``` + +## UseManyValidatorSpec + +```python +UseManyValidatorSpec = Union[Validator, UseManyValidatorTuple] +``` + +## ValidatorMap + +```python +ValidatorMap = Dict[str, List[Validator]] +``` + diff --git a/docs/dist/api_reference_markdown/validator.md b/docs/dist/api_reference_markdown/validator.md new file mode 100644 index 000000000..f2c82f1f5 --- /dev/null +++ b/docs/dist/api_reference_markdown/validator.md @@ -0,0 +1,191 @@ +# Validation + +## Validator + +```python +@dataclass +class Validator() +``` + +Base class for validators. + +#### \_\_init\_\_ + +```python +def __init__(on_fail: Optional[Union[Callable[[Any, FailResult], Any], + OnFailAction]] = None, + **kwargs) +``` + +#### validate + +```python +def validate(value: Any, metadata: Dict[str, Any]) -> ValidationResult +``` + +Do not override this function, instead implement _validate(). + +External facing validate function. This function acts as a +wrapper for _validate() and is intended to apply any meta- +validation requirements, logic, or pre/post processing. + +#### validate\_stream + +```python +def validate_stream(chunk: Any, + metadata: Dict[str, Any], + *, + property_path: Optional[str] = "$", + context_vars: Optional[ContextVar[Dict[ + str, ContextVar[List[str]]]]] = None, + context: Optional[Context] = None, + **kwargs) -> Optional[ValidationResult] +``` + +Validates a chunk emitted by an LLM. If the LLM chunk is smaller +than the validator's chunking strategy, it will be accumulated until it +reaches the desired size. In the meantime, the validator will return +None. + +If the LLM chunk is larger than the validator's chunking +strategy, it will split it into validator-sized chunks and +validate each one, returning an array of validation results. + +Otherwise, the validator will validate the chunk and return the +result. + +#### with\_metadata + +```python +def with_metadata(metadata: Dict[str, Any]) +``` + +Assigns metadata to this validator to use during validation. + +#### to\_runnable + +```python +def to_runnable() -> Runnable +``` + +#### register\_validator + +```python +def register_validator( + name: str, + data_type: Union[str, List[str]], + has_guardrails_endpoint: bool = False +) -> Callable[[Union[Type[V], Callable]], Union[Type[V], Type[Validator]]] +``` + +Register a validator for a data type. + +## ValidationResult + +```python +class ValidationResult(IValidationResult, ArbitraryModel) +``` + +ValidationResult is the output type of Validator.validate and the +abstract base class for all validation results. + +**Attributes**: + +- `outcome` _str_ - The outcome of the validation. Must be one of "pass" or "fail". +- `metadata` _Optional[Dict[str, Any]]_ - The metadata associated with this + validation result. +- `validated_chunk` _Optional[Any]_ - The value argument passed to + validator.validate or validator.validate_stream. + +## PassResult + +```python +class PassResult(ValidationResult, IPassResult) +``` + +PassResult is the output type of Validator.validate when validation +succeeds. + +**Attributes**: + +- `outcome` _Literal["pass"]_ - The outcome of the validation. Must be "pass". +- `value_override` _Optional[Any]_ - The value to use as an override + if validation passes. + +## FailResult + +```python +class FailResult(ValidationResult, IFailResult) +``` + +FailResult is the output type of Validator.validate when validation +fails. + +**Attributes**: + +- `outcome` _Literal["fail"]_ - The outcome of the validation. Must be "fail". +- `error_message` _str_ - The error message indicating why validation failed. +- `fix_value` _Optional[Any]_ - The auto-fix value that would be applied + if the Validator's on_fail method is "fix". +- `error_spans` _Optional[List[ErrorSpan]]_ - Segments that caused + validation to fail. + +## ErrorSpan + +```python +class ErrorSpan(IErrorSpan, ArbitraryModel) +``` + +ErrorSpan provide additional context for why a validation failed. They +specify the start and end index of the segment that caused the failure, +which can be useful when validating large chunks of text or validating +while streaming with different chunking methods. + +**Attributes**: + +- `start` _int_ - Starting index relative to the validated chunk. +- `end` _int_ - Ending index relative to the validated chunk. +- `reason` _str_ - Reason validation failed for this chunk. + +## ValidatorLogs + +```python +class ValidatorLogs(IValidatorLog, ArbitraryModel) +``` + +Logs for a single validator execution. + +**Attributes**: + +- `validator_name` _str_ - The class name of the validator +- `registered_name` _str_ - The snake_cased id of the validator +- `property_path` _str_ - The JSON path to the property being validated +- `value_before_validation` _Any_ - The value before validation +- `value_after_validation` _Optional[Any]_ - The value after validation; + could be different if `value_override`s or `fix`es are applied +- `validation_result` _Optional[ValidationResult]_ - The result of the validation +- `start_time` _Optional[datetime]_ - The time the validation started +- `end_time` _Optional[datetime]_ - The time the validation ended +- `instance_id` _Optional[int]_ - The unique id of this instance of the validator + +## ValidatorReference + +```python +class ValidatorReference(IValidatorReference) +``` + +ValidatorReference is a serialized reference for constructing a +Validator. + +**Attributes**: + +- `id` _Optional[str]_ - The unique identifier for this Validator. + Often the hub id; e.g. guardrails/regex_match. Default None. +- `on` _Optional[str]_ - A reference to the property this validator should be + applied against. Can be a valid JSON path or a meta-property + such as `prompt` or `output`. Default None. +- `on_fail` _Optional[str]_ - The OnFailAction to apply during validation. + Default None. +- `args` _Optional[List[Any]]_ - Positional arguments. Default None. +- `kwargs` _Optional[Dict[str, Any]]_ - Keyword arguments. Default None. + diff --git a/docs/cli.md b/docs/dist/cli.md similarity index 100% rename from docs/cli.md rename to docs/dist/cli.md diff --git a/docs/concepts/async_streaming.ipynb b/docs/dist/concepts/async_streaming.ipynb similarity index 99% rename from docs/concepts/async_streaming.ipynb rename to docs/dist/concepts/async_streaming.ipynb index d6ad5b0ce..84c32e341 100644 --- a/docs/concepts/async_streaming.ipynb +++ b/docs/dist/concepts/async_streaming.ipynb @@ -10,7 +10,7 @@ "\n", "With streaming, you can make non-blocking, iterative validations over each stream as chunks arrive. This document explores how to implement this behavior using the Guardrails framework.\n", "\n", - "**Note**: learn more about streaming [here](./streaming).\n" + "**Note**: learn more about streaming [here](/docs/concepts/streaming).\n" ] }, { @@ -22,7 +22,6 @@ "# Few imports and global variables\n", "from rich import print\n", "import guardrails as gd\n", - "import litellm\n", "from IPython.display import clear_output\n", "import time" ] @@ -86,10 +85,7 @@ "# Wrap the litellm OpenAI API call with the `guard` object\n", "raw_llm_output, validated_output, *rest = await guard(\n", " model=\"gpt-3.5-turbo\",\n", - " messages=[{\n", - " \"role\": \"system\",\n", - " \"content\": prompt\n", - " }],\n", + " messages=[{\"role\": \"system\", \"content\": prompt}],\n", " max_tokens=1024,\n", " temperature=0.3,\n", ")" @@ -249,10 +245,7 @@ "# Wrap the litellm OpenAI API call with the `guard` object\n", "fragment_generator = await guard(\n", " model=\"gpt-3.5-turbo\",\n", - " messages=[{\n", - " \"role\": \"user\",\n", - " \"content\": prompt\n", - " }],\n", + " messages=[{\"role\": \"user\", \"content\": prompt}],\n", " max_tokens=1024,\n", " temperature=0,\n", " stream=True,\n", diff --git a/docs/dist/concepts/async_streaming.md b/docs/dist/concepts/async_streaming.md new file mode 100644 index 000000000..2c8685ffd --- /dev/null +++ b/docs/dist/concepts/async_streaming.md @@ -0,0 +1,109 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +# Async stream-validate LLM responses + +Asynchronous behavior is generally useful in LLM applications. It allows multiple, long-running LLM requests to execute at once. + +With streaming, you can make non-blocking, iterative validations over each stream as chunks arrive. This document explores how to implement this behavior using the Guardrails framework. + +**Note**: learn more about streaming [here](/docs/concepts/streaming). + + + + + +```python +# Few imports and global variables +from rich import print +import guardrails as gd +from IPython.display import clear_output +import time +``` + +### Setup + +Install the necessary validators from Guardrails hub in your CLI. + +```bash +!guardrails hub install hub://guardrails/competitor_check +``` + + +#### Create the Guard object + + +# Async Streaming + + +```python +from guardrails.hub import CompetitorCheck + +prompt = "Tell me about the Apple Iphone" + +guard = gd.AsyncGuard().use(CompetitorCheck, ["Apple"]) +``` + +##### Example 1: No async streaming + +By default, the `stream` parameter is set to `False`. +We will use LiteLLM to make our LLM calls. + + + +```python +# Wrap the litellm OpenAI API call with the `guard` object +raw_llm_output, validated_output, *rest = await guard( + model="gpt-3.5-turbo", + messages=[{"role": "system", "content": prompt}], + max_tokens=1024, + temperature=0.3, +) +``` + + +```python +# Let's see the logs +print(guard.history.last.tree) +``` + +Logs
└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ ┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ ┃ Role Content ┃ │
│ ┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ system │ Tell me about the Apple Iphone │ │
│ └────────┴────────────────────────────────┘ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ The iPhone is a line of smartphones designed and marketed by Apple Inc. It was first introduced in 2007 │
│ by then-CEO Steve Jobs, revolutionizing the mobile phone industry with its innovative design and │
│ features. The iPhone runs on Apple's iOS operating system and is known for its sleek design, │
│ high-quality camera, and user-friendly interface. │
│ │
│ Over the years, Apple has released numerous models of the iPhone, each with upgraded features and │
│ capabilities. Some of the key features of the iPhone include Face ID facial recognition technology, │
│ Siri virtual assistant, and the App Store, which offers a wide range of apps for users to download. │
│ │
│ The iPhone has become one of the most popular smartphones in the world, with a large and dedicated fan │
│ base. It is known for its high performance, reliability, and seamless integration with other Apple │
│ products and services. The iPhone continues to be a top-selling device, with new models being released │
│ regularly to keep up with the latest technological advancements. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ The iPhone is a line of smartphones designed and marketed by Apple Inc. It was first introduced in 2007 │
│ by then-CEO Steve Jobs, revolutionizing the mobile phone industry with its innovative design and │
│ features. The iPhone runs on Apple's iOS operating system and is known for its sleek design, │
│ high-quality camera, and user-friendly interface. │
│ │
│ Over the years, Apple has released numerous models of the iPhone, each with upgraded features and │
│ capabilities. Some of the key features of the iPhone include Face ID facial recognition technology, │
│ Siri virtual assistant, and the App Store, which offers a wide range of apps for users to download. │
│ │
│ The iPhone has become one of the most popular smartphones in the world, with a large and dedicated fan │
│ base. It is known for its high performance, reliability, and seamless integration with other Apple │
│ products and services. The iPhone continues to be a top-selling device, with new models being released │
│ regularly to keep up with the latest technological advancements. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> + +##### Example 2: Async Streaming + +Set the `stream` parameter to `True` + + + +```python +# Wrap the litellm OpenAI API call with the `guard` object +fragment_generator = await guard( + model="gpt-3.5-turbo", + messages=[{"role": "user", "content": prompt}], + max_tokens=1024, + temperature=0, + stream=True, +) + + +async for op in fragment_generator: + clear_output(wait=True) + print(op) + time.sleep(0.5) +``` + +ValidationOutcome(
call_id='14626972736',
raw_llm_output='Overall, the iPhone is known for its user-friendly interface, high-quality build, and strong
ecosystem of apps and services, making it a popular choice for consumers around the world.',
validation_summaries=[],
validated_output='\n\nOverall, the iPhone is known for its user-friendly interface, high-quality build, and
strong ecosystem of apps and services, making it a popular choice for consumers around the world.',
reask=None,
validation_passed=True,
error=None
)
"}} /> + + +```python +# Let's see the logs +print(guard.history.last) +``` + +Call(
id='14626972736',
iterations=[
Iteration(
id='14626976016',
index=0,
call_id='14626972736',
inputs=Inputs(
llm_api=<guardrails.llm_providers.AsyncLiteLLMCallable object at 0x3677adbe0>,
llm_output=None,
instructions=None,
prompt=None,
messages=[{'role': 'user', 'content': Prompt(Tell me about the Apple Iphone)}],
msg_history=None,
prompt_params={},
num_reasks=1,
metadata={},
full_schema_reask=False,
stream=True
),
outputs=Outputs(
llm_response_info=LLMResponse(
prompt_token_count=None,
response_token_count=None,
output='',
stream_output=None,
async_stream_output=<openai.AsyncStream object at 0x3652e6c30>
),
raw_output='',
parsed_output='',
validation_response='',
guarded_output=None,
reasks=[],
validator_logs=[
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation='',
value_after_validation='',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 595984),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 596421)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation='The',
value_after_validation='The',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 596686),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 596991)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' Apple',
value_after_validation=' Apple',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 614475),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 614755)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' iPhone',
value_after_validation=' iPhone',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 614961),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 615218)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' is',
value_after_validation=' is',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 615430),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 615682)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' a',
value_after_validation=' a',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 670812),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 671218)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' line',
value_after_validation=' line',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 671481),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 671803)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' of',
value_after_validation=' of',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 672055),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 672344)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' smartphones',
value_after_validation=' smartphones',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 706919),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 707343)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' designed',
value_after_validation=' designed',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 707646),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 708033)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' and',
value_after_validation=' and',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 708288),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 708584)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' marketed',
value_after_validation=' marketed',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 810433),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 811526)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' by',
value_after_validation=' by',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 812094),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 812644)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' Apple',
value_after_validation=' Apple',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 812958),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 813405)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' Inc',
value_after_validation=' Inc',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 886235),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 887491)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation='.',
value_after_validation='.',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk='The Apple iPhone is a line of smartphones designed and marketed by
Apple Inc.'
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 10, 888166),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 305913)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' It',
value_after_validation=' It',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 816172),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 817005)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' was',
value_after_validation=' was',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 817395),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 817899)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' first',
value_after_validation=' first',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 818301),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 818756)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' introduced',
value_after_validation=' introduced',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 819227),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 819594)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' in',
value_after_validation=' in',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 819870),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 820214)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' ',
value_after_validation=' ',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 820882),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 821200)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation='200',
value_after_validation='200',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 821467),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 821787)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation='7',
value_after_validation='7',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 822038),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 822317)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' by',
value_after_validation=' by',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 822545),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 822900)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' then',
value_after_validation=' then',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 823309),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 823665)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation='-',
value_after_validation='-',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 823893),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 824182)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation='CEO',
value_after_validation='CEO',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 824407),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 824704)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' Steve',
value_after_validation=' Steve',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 825043),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 825329)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' Jobs',
value_after_validation=' Jobs',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 825568),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 825864)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=',',
value_after_validation=',',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 826095),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 826378)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' and',
value_after_validation=' and',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 826677),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 826972)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' has',
value_after_validation=' has',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 827196),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 827470)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' since',
value_after_validation=' since',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 827690),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 827958)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' become',
value_after_validation=' become',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 828162),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 828411)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' one',
value_after_validation=' one',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 828668),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 829052)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' of',
value_after_validation=' of',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 829274),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 829598)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' the',
value_after_validation=' the',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 829842),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 830117)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' most',
value_after_validation=' most',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 830361),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 830657)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' popular',
value_after_validation=' popular',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 830865),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 831119)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' and',
value_after_validation=' and',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 831394),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 831874)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' iconic',
value_after_validation=' iconic',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 832075),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 832319)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' smartphones',
value_after_validation=' smartphones',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 832539),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 832801)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' in',
value_after_validation=' in',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 833001),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 833259)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' the',
value_after_validation=' the',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 833577),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 833825)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' world',
value_after_validation=' world',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 834022),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 834282)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation='.\n\n',
value_after_validation='.\n\n',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=' It was first introduced in 2007 by then-CEO Steve Jobs, and has since
become one of the most popular and iconic smartphones in the world.'
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 11, 834499),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 139296)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation='The',
value_after_validation='The',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 648436),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 650081)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' iPhone',
value_after_validation=' iPhone',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 650634),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 651286)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' runs',
value_after_validation=' runs',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 651720),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 652308)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' on',
value_after_validation=' on',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 653011),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 653558)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' Apple',
value_after_validation=' Apple',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 654044),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 654624)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=\"'s\",
value_after_validation=\"'s\",
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 655006),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 655417)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' iOS',
value_after_validation=' iOS',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 655704),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 656132)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' operating',
value_after_validation=' operating',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 656639),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 657088)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' system',
value_after_validation=' system',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 657506),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 657876)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' and',
value_after_validation=' and',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 658279),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 658883)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' features',
value_after_validation=' features',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 659435),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 660029)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' a',
value_after_validation=' a',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 660329),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 660920)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' sleek',
value_after_validation=' sleek',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 661445),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 662032)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' design',
value_after_validation=' design',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 662399),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 662961)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=',',
value_after_validation=',',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 663308),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 663734)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' high',
value_after_validation=' high',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 664093),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 664499)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation='-quality',
value_after_validation='-quality',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 664865),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 665242)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' camera',
value_after_validation=' camera',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 665478),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 665800)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=',',
value_after_validation=',',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 666091),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 666412)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' and',
value_after_validation=' and',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 666643),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 667103)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' a',
value_after_validation=' a',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 667476),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 667778)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' wide',
value_after_validation=' wide',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 668031),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 668339)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' range',
value_after_validation=' range',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 668573),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 668841)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' of',
value_after_validation=' of',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 669133),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 669397)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' apps',
value_after_validation=' apps',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 669620),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 669895)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' available',
value_after_validation=' available',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 670135),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 670425)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' for',
value_after_validation=' for',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 670922),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 671167)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' download',
value_after_validation=' download',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 671365),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 671603)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' from',
value_after_validation=' from',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 671801),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 672041)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' the',
value_after_validation=' the',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 672241),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 672492)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' App',
value_after_validation=' App',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 672688),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 672916)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' Store',
value_after_validation=' Store',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 673181),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 673432)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation='.',
value_after_validation='.',
validation_result=FailResult(
outcome='fail',
error_message='Found the following competitors: Apple. Please avoid naming those
competitors next time',
fix_value=\"\n\nThe iPhone runs on [COMPETITOR]'s iOS operating system and features a
sleek design, high-quality camera, and a wide range of apps available for download from the App Store.\",
error_spans=[ErrorSpan(start=21, end=26, reason='Competitor was found: Apple')],
metadata=None,
validated_chunk=\"\n\nThe iPhone runs on Apple's iOS operating system and features a
sleek design, high-quality camera, and a wide range of apps available for download from the App Store.\"
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 673634),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 12, 947419)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' Over',
value_after_validation=' Over',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 459976),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 461493)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' the',
value_after_validation=' the',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 462148),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 463054)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' years',
value_after_validation=' years',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 463569),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 464154)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=',',
value_after_validation=',',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 464703),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 465225)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' Apple',
value_after_validation=' Apple',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 465869),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 466377)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' has',
value_after_validation=' has',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 466722),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 467174)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' released',
value_after_validation=' released',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 467499),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 467868)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' multiple',
value_after_validation=' multiple',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 468201),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 468583)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' models',
value_after_validation=' models',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 469070),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 469509)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' of',
value_after_validation=' of',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 469870),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 470454)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' the',
value_after_validation=' the',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 470860),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 471344)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' iPhone',
value_after_validation=' iPhone',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 471796),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 472716)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=',',
value_after_validation=',',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 473340),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 474038)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' each',
value_after_validation=' each',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 474427),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 474875)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' with',
value_after_validation=' with',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 475393),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 475775)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' new',
value_after_validation=' new',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 476039),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 476355)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' features',
value_after_validation=' features',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 476609),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 476925)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' and',
value_after_validation=' and',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 477243),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 477538)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' improvements',
value_after_validation=' improvements',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 477760),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 478072)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' in',
value_after_validation=' in',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 478413),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 478740)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' performance',
value_after_validation=' performance',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 478983),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 479262)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation='.\n\n',
value_after_validation='.\n\n',
validation_result=FailResult(
outcome='fail',
error_message='Found the following competitors: Apple. Please avoid naming those
competitors next time',
fix_value=' Over the years, [COMPETITOR] has released multiple models of the iPhone,
each with new features and improvements in performance.',
error_spans=[ErrorSpan(start=17, end=22, reason='Competitor was found: Apple')],
metadata=None,
validated_chunk=' Over the years, Apple has released multiple models of the iPhone,
each with new features and improvements in performance.'
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 479488),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 13, 768497)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation='Some',
value_after_validation='Some',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 281787),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 282862)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' key',
value_after_validation=' key',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 283444),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 284180)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' features',
value_after_validation=' features',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 284667),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 285290)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' of',
value_after_validation=' of',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 285904),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 286383)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' the',
value_after_validation=' the',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 286731),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 287406)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' iPhone',
value_after_validation=' iPhone',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 287738),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 288437)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' include',
value_after_validation=' include',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 288851),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 289408)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' Face',
value_after_validation=' Face',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 289857),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 291341)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' ID',
value_after_validation=' ID',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 291729),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 292196)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' facial',
value_after_validation=' facial',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 292729),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 293238)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' recognition',
value_after_validation=' recognition',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 293654),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 294064)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' technology',
value_after_validation=' technology',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 294677),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 295403)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=',',
value_after_validation=',',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 295728),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 296112)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' Siri',
value_after_validation=' Siri',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 296366),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 296647)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' virtual',
value_after_validation=' virtual',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 296870),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 297244)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' assistant',
value_after_validation=' assistant',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 297960),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 298310)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=',',
value_after_validation=',',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 298578),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 299094)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' and',
value_after_validation=' and',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 299321),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 299608)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' Apple',
value_after_validation=' Apple',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 299926),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 300272)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' Pay',
value_after_validation=' Pay',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 300579),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 300917)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' for',
value_after_validation=' for',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 301140),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 301449)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' contact',
value_after_validation=' contact',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 301784),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 302077)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation='less',
value_after_validation='less',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 302308),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 302570)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' payments',
value_after_validation=' payments',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 302806),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 303086)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation='.',
value_after_validation='.',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk='\n\nSome key features of the iPhone include Face ID facial recognition
technology, Siri virtual assistant, and Apple Pay for contactless payments.'
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 303335),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 14, 692659)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' The',
value_after_validation=' The',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 205975),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 206697)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' iPhone',
value_after_validation=' iPhone',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 207254),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 207637)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' also',
value_after_validation=' also',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 207904),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 208290)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' integrates',
value_after_validation=' integrates',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 208684),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 209054)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' seamlessly',
value_after_validation=' seamlessly',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 209289),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 209568)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' with',
value_after_validation=' with',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 209887),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 210208)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' other',
value_after_validation=' other',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 210457),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 210740)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' Apple',
value_after_validation=' Apple',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 210962),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 211231)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' products',
value_after_validation=' products',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 211463),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 211730)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=',',
value_after_validation=',',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 212016),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 212284)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' such',
value_after_validation=' such',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 212511),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 212780)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' as',
value_after_validation=' as',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 213006),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 213346)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' the',
value_after_validation=' the',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 213750),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 214088)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' Apple',
value_after_validation=' Apple',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 214282),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 214530)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' Watch',
value_after_validation=' Watch',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 214749),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 215101)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=',',
value_after_validation=',',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 215332),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 215574)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' Air',
value_after_validation=' Air',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 215777),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 216008)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation='Pod',
value_after_validation='Pod',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 216201),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 217451)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation='s',
value_after_validation='s',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 217746),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 218020)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=',',
value_after_validation=',',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 218236),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 218484)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' and',
value_after_validation=' and',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 218681),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 218914)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' Mac',
value_after_validation=' Mac',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 219115),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 219353)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' computers',
value_after_validation=' computers',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 219551),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 219780)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation='.\n\n',
value_after_validation='.\n\n',
validation_result=FailResult(
outcome='fail',
error_message='Found the following competitors: Apple. Please avoid naming those
competitors next time',
fix_value=' The iPhone also integrates seamlessly with other [COMPETITOR] products,
such as the [COMPETITOR] Watch, AirPods, and Mac computers.',
error_spans=[
ErrorSpan(start=50, end=55, reason='Competitor was found: Apple'),
ErrorSpan(start=78, end=83, reason='Competitor was found: Apple'),
ErrorSpan(start=50, end=55, reason='Competitor was found: Apple'),
ErrorSpan(start=78, end=83, reason='Competitor was found: Apple')
],
metadata=None,
validated_chunk=' The iPhone also integrates seamlessly with other Apple products, such
as the Apple Watch, AirPods, and Mac computers.'
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 219981),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 15, 520706)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation='Overall',
value_after_validation='Overall',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 29878),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 30861)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=',',
value_after_validation=',',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 31289),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 32043)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' the',
value_after_validation=' the',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 32525),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 33024)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' iPhone',
value_after_validation=' iPhone',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 33363),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 33884)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' is',
value_after_validation=' is',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 34303),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 34809)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' known',
value_after_validation=' known',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 35268),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 35631)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' for',
value_after_validation=' for',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 35885),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 36176)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' its',
value_after_validation=' its',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 36421),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 36720)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' user',
value_after_validation=' user',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 37066),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 37434)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation='-friendly',
value_after_validation='-friendly',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 37763),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 38128)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' interface',
value_after_validation=' interface',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 38406),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 38723)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=',',
value_after_validation=',',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 39117),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 39430)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' high',
value_after_validation=' high',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 39654),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 39952)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation='-quality',
value_after_validation='-quality',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 40103),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 40288)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' build',
value_after_validation=' build',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 40487),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 40785)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=',',
value_after_validation=',',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 41058),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 41353)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' and',
value_after_validation=' and',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 41578),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 41846)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' strong',
value_after_validation=' strong',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 42080),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 42504)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' ecosystem',
value_after_validation=' ecosystem',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 42725),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 42987)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' of',
value_after_validation=' of',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 43306),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 43610)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' apps',
value_after_validation=' apps',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 43840),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 44108)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' and',
value_after_validation=' and',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 44332),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 44601)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' services',
value_after_validation=' services',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 44889),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 45160)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=',',
value_after_validation=',',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 45388),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 45662)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' making',
value_after_validation=' making',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 45890),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 46149)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' it',
value_after_validation=' it',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 46428),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 46692)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' a',
value_after_validation=' a',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 46912),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 47177)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' popular',
value_after_validation=' popular',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 47422),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 47597)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' choice',
value_after_validation=' choice',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 47785),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 47948)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' for',
value_after_validation=' for',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 48139),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 48371)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' consumers',
value_after_validation=' consumers',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 48569),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 48805)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' around',
value_after_validation=' around',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 48999),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 49221)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' the',
value_after_validation=' the',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 49481),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 49722)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation=' world',
value_after_validation=' world',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 49922),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 50154)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation='.',
value_after_validation='.',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk='\n\nOverall, the iPhone is known for its user-friendly interface,
high-quality build, and strong ecosystem of apps and services, making it a popular choice for consumers around the
world.'
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 50352),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 243639)
),
ValidatorLogs(
validator_name='CompetitorCheck',
registered_name='guardrails/competitor_check',
instance_id=4403038784,
property_path='$',
value_before_validation='',
value_after_validation='',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 756413),
end_time=datetime.datetime(2024, 10, 11, 11, 15, 16, 758181)
)
],
error=None,
exception=None
)
)
],
inputs=CallInputs(
llm_api=None,
llm_output=None,
instructions=None,
prompt=None,
msg_history=None,
messages=[{'role': 'user', 'content': 'Tell me about the Apple Iphone'}],
prompt_params={},
num_reasks=1,
metadata={},
full_schema_reask=False,
stream=False,
args=[],
kwargs={'model': 'gpt-3.5-turbo', 'max_tokens': 1024, 'temperature': 0, 'stream': True}
),
exception=None
)
"}} /> + +As you can see here, the outputs in both examples match. The only difference is that, in the async streaming example, the outputs are returned as soon as they are received and validated by Guardrails. + +In the non-streaming example, the outputs are returned only after the entire request has been processed by the API. + +In other words, when async streaming is enabled, the API returns the outputs as soon as they are ready, rather than waiting for the entire request to be processed. + diff --git a/docs/concepts/concurrency.md b/docs/dist/concepts/concurrency.md similarity index 98% rename from docs/concepts/concurrency.md rename to docs/dist/concepts/concurrency.md index 0e8c87adf..7b506da9c 100644 --- a/docs/concepts/concurrency.md +++ b/docs/dist/concepts/concurrency.md @@ -90,7 +90,7 @@ As of versions v0.4.x and v0.5.x of Guardrails, the above object would be valida > NOTE: The approach currently used, and outlined above, was predicated on the assumption that if child properties fail validation, it is unlikely that the parent property would pass. With the current atomic state of validation, it can be argued that this assumption is false. That is, the types of validations applied to parent properties typically take the form of checking the appropriate format of the container like a length check on a list. These types of checks are generally independent of any requirements the child properties have. This opens up the possibility of running all six paths listed above concurrently instead of performing them in steps based on key path. -When synchronous validation occurs as defined in [Benefits of AsyncGuard](#benefits-of-async-guard), the validators for each property would be run in the order they are defined on the schema. That also means that any on fail actions are applied in that same order. +When synchronous validation occurs as defined in [Benefits of AsyncGuard](#benefits-of-asyncguard), the validators for each property would be run in the order they are defined on the schema. That also means that any on fail actions are applied in that same order. When asynchronous validation occurs, there are multiple levels of concurrency possible. First, running validation on the child properties (e.g. `foo.baz` and `foo.bez`) will happen concurrently via the asyncio event loop. Second, the validators on any given property are also run concurrently via the event loop. For validators that only define a synchronous `validate` method, calls to this method are run in the event loops default executor. Note that some environments, like AWS Lambda, may not support multiprocessing in which case you would need to either set the executor to a thread processor instead or limit validation to running synchronously by setting `GUARDRAILS_PROCESS_COUNT=1` or `GUARDRAILS_RUN_SYNC=true`. diff --git a/docs/concepts/deploying.md b/docs/dist/concepts/deploying.md similarity index 100% rename from docs/concepts/deploying.md rename to docs/dist/concepts/deploying.md diff --git a/docs/concepts/error_remediation.md b/docs/dist/concepts/error_remediation.md similarity index 97% rename from docs/concepts/error_remediation.md rename to docs/dist/concepts/error_remediation.md index a9a7c213d..c3b4bc711 100644 --- a/docs/concepts/error_remediation.md +++ b/docs/dist/concepts/error_remediation.md @@ -36,7 +36,7 @@ Guardrails provides a number of `OnFailActions` for when a validator fails. The | `OnFailAction.FIX_REASK` | First, fix the generated output deterministically, and then rerun validation with the deterministically fixed output. If validation fails, then perform reasking. | No | -Custom OnFailActions can also be implemented, see the `custom` section in the [how to use on fail actions guide](../how_to_guides/use_on_fail_actions). +Custom OnFailActions can also be implemented, see the `custom` section in the [how to use on fail actions guide](/docs/how_to_guides/use_on_fail_actions). ## Guidance on dealing with Validator errors diff --git a/docs/concepts/guard.md b/docs/dist/concepts/guard.md similarity index 97% rename from docs/concepts/guard.md rename to docs/dist/concepts/guard.md index 1bd5be56b..fef0d1c26 100644 --- a/docs/concepts/guard.md +++ b/docs/dist/concepts/guard.md @@ -86,4 +86,4 @@ print(guard.history.last.reasks) # A list of reasks ## Error Handling and Retries -Guardrails is designed to account for different types of errors that can occur when calling the LLM, and it is also designed to emit helpful errors when validations fail. Read more about error handling and retries [here](./error_remediation). +Guardrails is designed to account for different types of errors that can occur when calling the LLM, and it is also designed to emit helpful errors when validations fail. Read more about error handling and retries [here](/docs/concepts/error_remediation). diff --git a/docs/concepts/guardrails.md b/docs/dist/concepts/guardrails.md similarity index 100% rename from docs/concepts/guardrails.md rename to docs/dist/concepts/guardrails.md diff --git a/docs/concepts/hub.md b/docs/dist/concepts/hub.md similarity index 100% rename from docs/concepts/hub.md rename to docs/dist/concepts/hub.md diff --git a/docs/concepts/img/infra_filter.png b/docs/dist/concepts/img/infra_filter.png similarity index 100% rename from docs/concepts/img/infra_filter.png rename to docs/dist/concepts/img/infra_filter.png diff --git a/docs/dist/concepts/logs.md b/docs/dist/concepts/logs.md new file mode 100644 index 000000000..0bf350e30 --- /dev/null +++ b/docs/dist/concepts/logs.md @@ -0,0 +1,191 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +# Logs and History + +All `Guard` calls are logged internally, and can be accessed via the guard history. + +Whenever `Guard.__call__` or `Guard.parse` is called, a new `Call` entry is added to a stack in sequence of execution. This `Call` stack can be accessed through `Guard.history`. + +Calls can be further decomposed into a stack of `Iteration` objects. These are stateless and represent the interactions within a `Call` between llms, validators, inputs and outputs. The `Iteration` stack can be accessed through `call.iterations`. + +## General Access +Given: +```py +my_guard = Guard.for_pydantic(...) + +response_1 = my_guard(...) + +response_2 = my_guard.parse(...) +``` + +`my_guard.history`'s first `Call` entry will represent the guard execution corresponding to response_1 and the second will correspond to response_2's execution. + +To pretty print logs for the latest call, run: + +```python +from rich import print + +print(guard.history.last.tree) +``` + + +Logs
└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
╭──────────────────────────────────────────────── Prompt ─────────────────────────────────────────────────╮
│ │
│ You are a human in an enchanted forest. You come across opponents of different types. You should fight │
│ smaller opponents, run away from bigger ones, and freeze if the opponent is a bear. │
│ │
│ You run into a grizzly. What do you do? │
│ │
│ │
│ Given below is XML that describes the information to extract from this document and the tags to extract │
│ it into. │
│ │
│ <output> │
│ <choice name=\"action\" discriminator=\"chosen_action\"> │
│ <case name=\"fight\"> │
│ <string name=\"weapon\" format=\"valid-choices: choices=['crossbow', 'axe', 'sword', │
│ 'fork']\"/> │
│ </case> │
│ <case name=\"flight\"> │
│ <string name=\"flight_direction\" format=\"valid-choices: choices=['north', 'south', 'east', │
│ 'west']\"/> │
│ <integer name=\"distance\" format=\"valid-choices: choices=[1, 2, 3, 4]\"/> │
│ </case> │
│ <case name=\"freeze\"> │
│ <integer name=\"duration\" format=\"valid-choices: choices=[1, 2, 3, 4]\"/> │
│ </case> │
│ </choice> │
│ </output> │
│ │
│ │
│ ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the │
│ `name` attribute of the corresponding XML, and the value is of the type specified by the corresponding │
│ XML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g. │
│ requests for lists, objects and specific types. Be correct and concise. │
│ │
│ Here are examples of simple (XML, JSON) pairs that show the expected behavior: │
│ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │
│ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', 'STRING TWO', │
│ etc.]}` │
│ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │
│ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}` │
│ │
│ │
│ │
│ Here are a few examples │
│ │
│ goblin: {\"action\": {\"chosen_action\": \"fight\", \"weapon\": \"crossbow\"}} │
│ giant: {\"action\": {\"chosen_action\": \"flight\", \"flight_direction\": \"north\", \"distance\": 1}} │
│ dragon: {\"action\": {\"chosen_action\": \"flight\", \"flight_direction\": \"south\", \"distance\": 4}} │
│ troll: {\"action\": {\"chosen_action\": \"fight\", \"weapon\": \"sword\"}} │
│ black bear: {\"action\": {\"chosen_action\": \"freeze\", \"duration\": 3}} │
│ beets: {\"action\": {\"chosen_action\": \"fight\", \"weapon\": \"fork\"}} │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭───────────────────────────────────────────── Instructions ──────────────────────────────────────────────╮
│ You are a helpful assistant, able to express yourself purely through JSON, strictly and precisely │
│ adhering to the provided XML schemas. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Message History ────────────────────────────────────────────╮
│ No message history. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ {\"action\": {\"chosen_action\": \"freeze\", \"duration\": 4}} │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ {'action': {'chosen_action': 'freeze', 'duration': 4}} │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯


"}} /> + +## Calls +### Initial Input +Initial inputs like messages from a call are available on each call. + +```py +first_call = my_guard.history.first +print("message\n-----") +print(first_call.messages[0]["content"]) +print("prompt params\n------------- ") +print(first_call.prompt_params) +``` +```log +message +----- + +You are a human in an enchanted forest. You come across opponents of different types. You should fight smaller opponents, run away from bigger ones, and freeze if the opponent is a bear. + +You run into a ${opp_type}. What do you do? + +${gr.complete_xml_suffix_v2} + + +Here are a few examples + +goblin: {"action": {"chosen_action": "fight", "weapon": "crossbow"}} +troll: {"action": {"chosen_action": "fight", "weapon": "sword"}} +giant: {"action": {"chosen_action": "flight", "flight_direction": "north", "distance": 1}} +dragon: {"action": {"chosen_action": "flight", "flight_direction": "south", "distance": 4}} +black bear: {"action": {"chosen_action": "freeze", "duration": 3}} +beets: {"action": {"chosen_action": "fight", "weapon": "fork"}} + +prompt params +------------- +{'opp_type': 'grizzly'} +``` + +### Final Output +Final output of call is accessible on a call. +```py +print("status: ", first_call.status) # The final status of this guard call +print("validated response:", first_call.validated_output) # The final valid output of this guard call +``` +```log +status: pass +validated response: {'action': {'chosen_action': 'freeze', 'duration': 3}} +``` + +### Cumulative Raw LLM outputs +`Call` log also the raw returns of llms before validation +```py +print("llm responses\n-------------") # An Stack of the LLM responses in order that they were received +for r in first_call.raw_outputs: + print(r) +``` +```log +llm responses +------------- +{"action": {"chosen_action": "freeze"}} +{ + "action": { + "chosen_action": "freeze", + "duration": null + } +} +{ + "action": { + "chosen_action": "freeze", + "duration": 1 + } +} +``` + +### Cumulative Token usage +`Call` log also tracks llm token usage (*currently only for OpenAI models) +```py +print("prompt token usage: ", first_call.prompt_tokens_consumed) # Total number of prompt tokens consumed across iterations within this call +print("completion token usage: ", first_call.completion_tokens_consumed) # Total number of completion tokens consumed across iterations within this call +print("total token usage: ",first_call.tokens_consumed) # Total number of tokens consumed; equal to the sum of the two values above +``` +```log +prompt token usage: 909 +completion token usage: 57 +total token usage: 966 +``` + +## Iterations +### Validator logs +Detailed validator logs including outcomes and error spans can be accessed on interations. +```py +first_step = first_call.iterations.first + +validation_logs = first_step.validator_logs +print("\nValidator Logs\n--------------") +for log in validation_logs: + print(log.json(indent=2)) +``` +```log +Validator Logs +-------------- +{ + "validator_name": "ValidChoices", + "value_before_validation": "spoon", + "validation_result": { + "outcome": "fail", + "metadata": null, + "error_message": "Value spoon is not in choices ['crossbow', 'axe', 'sword', 'fork'].", + "fix_value": null + }, + "value_after_validation": { + "incorrect_value": "spoon", + "fail_results": [ + { + "outcome": "fail", + "metadata": null, + "error_message": "Value spoon is not in choices ['crossbow', 'axe', 'sword', 'fork'].", + "fix_value": null + } + ], + "path": [ + "action", + "weapon" + ] + } +} +``` + +Failed validations can be conveniently accessed via `iteration.failed_validations` + +### Raw LLM output +If multiple llm calls are made like in the case of the reask. Iterations contain the return of each call to an llm. +```py +first_step = first_call.iterations.first + +first_llm_output = first_step.raw_output +print("First LLM response\n------------------") +print(first_llm_output) +``` +```log +First LLM response +------------------ +{"action": {"chosen_action": "fight", "weapon": "spoon"}} +``` + +### Token Usage +Token usage on a per step basis can be accessed on an Iteration. +```py +print("prompt token usage: ", first_step.prompt_tokens_consumed) +print("completion token usage: ", first_step.completion_tokens_consumed) +print("token usage for this step: ",first_step.tokens_consumed) +``` +```log +prompt token usage: 617 +completion token usage: 16 +token usage for this step: 633 +``` + +For more information on `Call`, see the [History & Logs](/docs/api_reference_markdown/history_and_logs) page. +For more information on the properties available on `Iteration`, see the [History & Logs](/docs/api_reference_markdown/history_and_logs#iteration) page. \ No newline at end of file diff --git a/docs/concepts/ml_based_validators.ipynb b/docs/dist/concepts/ml_based_validators.ipynb similarity index 92% rename from docs/concepts/ml_based_validators.ipynb rename to docs/dist/concepts/ml_based_validators.ipynb index 6562e1f77..bbcae3003 100644 --- a/docs/concepts/ml_based_validators.ipynb +++ b/docs/dist/concepts/ml_based_validators.ipynb @@ -38,7 +38,7 @@ "metadata": {}, "outputs": [], "source": [ - "from guardrails import Guard\n" + "from guardrails import Guard" ] }, { @@ -70,10 +70,7 @@ "source": [ "from guardrails.hub import RegexMatch\n", "\n", - "guard = Guard().use(\n", - " RegexMatch, \n", - " regex=r\"^[a-zA-Z0-9_]+$\"\n", - ")\n", + "guard = Guard().use(RegexMatch, regex=r\"^[a-zA-Z0-9_]+$\")\n", "\n", "result = guard(\n", " model=\"gpt-3.5-turbo\",\n", @@ -101,10 +98,8 @@ "outputs": [], "source": [ "from guardrails.hub import CompetitorCheck\n", - "guard = Guard().use(\n", - " CompetitorCheck, \n", - " [\"Apple\"]\n", - ")\n", + "\n", + "guard = Guard().use(CompetitorCheck, [\"Apple\"])\n", "\n", "result = guard(\n", " model=\"gpt-3.5-turbo\",\n", diff --git a/docs/dist/concepts/ml_based_validators.md b/docs/dist/concepts/ml_based_validators.md new file mode 100644 index 000000000..0f1f365fd --- /dev/null +++ b/docs/dist/concepts/ml_based_validators.md @@ -0,0 +1,63 @@ +# ML Based Validators + +Although simple validation can often be handled with rule-based approaches, more complex scenarios require machine learning models for effective validation. + +ML based validators are able to handle more complex scenarios, providing some level of 'intelligence' to the validation method that is used. + + + +In the Guardrails Hub, we provide an easy way to filter and search for different validator types! + +![Validator Hub Filtering](img/infra_filter.png) + +While different validators may be rules-based or machine learning based, it is still just as easy to implement both in your codebase. + + +```python +from guardrails import Guard +``` + +```bash +guardrails hub install hub://guardrails/competitor_check +guardrails hub install hub://guardrails/regex_match +``` + +### Rules-based validators + + +```python +from guardrails.hub import RegexMatch + +guard = Guard().use(RegexMatch, regex=r"^[a-zA-Z0-9_]+$") + +result = guard( + model="gpt-3.5-turbo", + messages=[ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Tell me about the Apple Iphone."}, + ], + max_tokens=1024, + temperature=0, +) +print(result) +``` + +### ML Based Validator + + +```python +from guardrails.hub import CompetitorCheck + +guard = Guard().use(CompetitorCheck, ["Apple"]) + +result = guard( + model="gpt-3.5-turbo", + messages=[ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Tell me about the Apple Iphone."}, + ], + max_tokens=1024, + temperature=0, +) +print(result) +``` diff --git a/docs/concepts/performance.md b/docs/dist/concepts/performance.md similarity index 97% rename from docs/concepts/performance.md rename to docs/dist/concepts/performance.md index cafd5f66f..04aeed0c9 100644 --- a/docs/concepts/performance.md +++ b/docs/dist/concepts/performance.md @@ -17,7 +17,7 @@ The largest latency and performance issues will come from your selection of LLM. Here are a few tips to get the best performance out of your Guardrails-enabled applications. -**Use async guards for the best performance**. Use the `AsyncGuard` class to make concurrent calls to multiple LLMs and process the response chunks as they arrive. For more information, see [Async stream-validate LLM responses](/docs/async-streaming). +**Use async guards for the best performance**. Use the `AsyncGuard` class to make concurrent calls to multiple LLMs and process the response chunks as they arrive. For more information, see [Async stream-validate LLM responses](/docs/concepts/async_streaming). **Use a remote server for heavy workloads**. More compute-intensive workloads, such as remote inference endpoints, work best when run with dedicated memory and CPU. For example, guards that use a single Machine Learning (ML) model for validation can run in milliseconds on GPU-equipped machines, while they may take tens of seconds on normal CPUs. However, guardrailing orchestration itself performs better on general compute. diff --git a/docs/concepts/remote_validation_inference.ipynb b/docs/dist/concepts/remote_validation_inference.ipynb similarity index 97% rename from docs/concepts/remote_validation_inference.ipynb rename to docs/dist/concepts/remote_validation_inference.ipynb index 3b19f5f01..fc058236c 100644 --- a/docs/concepts/remote_validation_inference.ipynb +++ b/docs/dist/concepts/remote_validation_inference.ipynb @@ -77,9 +77,7 @@ "from guardrails import Guard\n", "from guardrails.hub import ToxicLanguage\n", "\n", - "guard = Guard().use(\n", - " ToxicLanguage()\n", - ")" + "guard = Guard().use(ToxicLanguage())" ] }, { @@ -109,12 +107,11 @@ ")\n", "\n", "\n", - "\n", "accumulated_output = \"\"\n", "for op in fragment_generator:\n", " clear_output()\n", " accumulated_output += op.validated_output\n", - " display(accumulated_output)\n" + " display(accumulated_output)" ] }, { @@ -161,6 +158,7 @@ "outputs": [], "source": [ "from guardrails import Guard, install\n", + "\n", "try:\n", " from guardrails.hub import ToxicLanguage\n", "except ImportError:\n", @@ -168,7 +166,7 @@ " from guardrails.hub import ToxicLanguage\n", "\n", "# uses validator locally.\n", - "guard.use(ToxicLanguage(use_local=True))\n" + "guard.use(ToxicLanguage(use_local=True))" ] }, { diff --git a/docs/dist/concepts/remote_validation_inference.md b/docs/dist/concepts/remote_validation_inference.md new file mode 100644 index 000000000..80691efcb --- /dev/null +++ b/docs/dist/concepts/remote_validation_inference.md @@ -0,0 +1,143 @@ +# Remote Validation Inference + +## The problem + +As a concept, [guardrailing](https://www.guardrailsai.com/docs/concepts/guard) has a few areas that, when unoptimized, can introduce latency and be extremely resource-expensive. The main two areas are: + +* Guardrailing orchestration; and +* ML models that validate a single guard + +These are resource-heavy in slightly different ways. ML models can run with low latency on GPU-equipped machines. (Some ML models used for validation run in tens of seconds on CPUs, while they run in milliseconds on GPUs.) Meanwhile, guardrailing orchestration benefits from general memory and compute resources. + +## The Guardrails approach + +The Guardrails library tackles this problem by providing an interface that allows users to separate the execution of orchestration from the execution of ML-based validation. + +The layout of this solution is a simple upgrade to validator libraries themselves. Instead of *always* downloading and installing ML models, you can configure them to call a remote endpoint. This remote endpoint hosts the ML model behind an API that presents a unified interface for all validator models. + +Guardrails hosts some of these for free as a preview feature. Users can host their own models by following the same interface. + + +:::note +Remote validation inferencing is only available in Guardrails versions 0.5.0 and above. +::: + + + + +## Using Guardrails inferencing endpoints + +To use a guardrails endpoint, find a validator that has implemented support. Validators with a Guardrails-hosted endpoint are labeled as such on the [Validator Hub](https://hub.guardrailsai.com). One example is [Toxic Language](https://hub.guardrailsai.com/validator/guardrails/toxic_language). + + +:::note +To use remote inferencing endpoints, you need a Guardrails API key. You can get one by signing up at [the Guardrails Hub](https://hub.guardrailsai.com). + +Then, run `guardrails configure`. +::: + + +```python +guardrails hub install hub://guardrails/toxic_language --quiet; + +# This will not download local models if you opted into remote inferencing during guardrails configure +# If you did not opt in, you can explicitly opt in for just this validator by passing the --no-install-local-models flag +``` + +From here, you can use the validator as you would normally. + + +```python +from guardrails import Guard +from guardrails.hub import ToxicLanguage + +guard = Guard().use(ToxicLanguage()) +``` + +The benefit of hosting a validator inference endpoint is the increase in speed and throughput compared to running locally. This implementation makes use cases such as [streaming](https://www.guardrailsai.com/docs/concepts/streaming) much more viable in production. + + + +```python +from IPython.display import display, clear_output + +fragment_generator = guard( + model="gpt-3.5-turbo", + messages=[ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Tell me about the Apple Iphone."}, + ], + max_tokens=1024, + temperature=0, + stream=True, +) + + +accumulated_output = "" +for op in fragment_generator: + clear_output() + accumulated_output += op.validated_output + display(accumulated_output) +``` + +## Toggling remote inferencing + +To enable/disable remote inferencing, you can run the CLI command `guardrails configure` or modify your `~/.guardrailsrc`. + + +```python +# To disable +guardrails configure --disable-remote-inferencing + +# To enable +guardrails configure --enable-remote-inferencing +``` + +To disable remote inferencing from a specific validator, add a `use_local` kwarg to the validator's initializer. + +:::note +When running locally, you may need to reinstall the validator with the `--install-local-models` flag. +::: + + +```python +from guardrails import Guard, install + +try: + from guardrails.hub import ToxicLanguage +except ImportError: + install("hub://guardrails/toxic_language", install_local_models=True) + from guardrails.hub import ToxicLanguage + +# uses validator locally. +guard.use(ToxicLanguage(use_local=True)) +``` + +## Hosting your own endpoint + +Validators can point to any endpoint that implements the interface that Guardrails validators expect. This interface can be found in the `_inference_remote` method of the validator. + +After implementing this interface, you can host your own endpoint (for example, [using gunicorn and Flask](https://flask.palletsprojects.com/en/stable/deploying/gunicorn/)) and point your validator to it by setting the `validation_endpoint` constructor argument. + + + +```python +guard = Guard().use( + ToxicLanguage( + use_local=False, + validation_endpoint="your_endpoint_ip_address", + ) +) +``` + +:::note + +Contact us to host validators in your own VPC with managed hardware. + +::: + +# Learn more + +To learn more about hosting your own validators, check out the [Host Remote Validator Models doc](/docs/how_to_guides/hosting_validator_models). + +To learn more about writing your own validators, check out the [Custom validators doc](/docs/how_to_guides/custom_validator). diff --git a/docs/concepts/streaming.ipynb b/docs/dist/concepts/streaming.ipynb similarity index 98% rename from docs/concepts/streaming.ipynb rename to docs/dist/concepts/streaming.ipynb index 8882bade7..5fd961f2b 100644 --- a/docs/concepts/streaming.ipynb +++ b/docs/dist/concepts/streaming.ipynb @@ -25,7 +25,6 @@ "source": [ "from rich import print\n", "import guardrails as gd\n", - "import litellm\n", "from IPython.display import clear_output\n", "import time" ] @@ -44,6 +43,7 @@ "outputs": [], "source": [ "from guardrails.hub import CompetitorCheck\n", + "\n", "prompt = \"Tell me about the Apple Iphone\"\n", "\n", "guard = gd.Guard().use(CompetitorCheck, [\"Apple\"])" @@ -133,7 +133,7 @@ "\n", "In cases where concurrent network calls are happening (many LLM calls!) it may be beneficial to use an asynchronous LLM client. Guardrails also natively supports asynchronous streaming calls.\n", "\n", - "Learn more about async streaming [here](./async_streaming)." + "Learn more about async streaming [here](/docs/concepts/async_streaming)." ] }, { diff --git a/docs/dist/concepts/streaming.md b/docs/dist/concepts/streaming.md new file mode 100644 index 000000000..38b747fb2 --- /dev/null +++ b/docs/dist/concepts/streaming.md @@ -0,0 +1,92 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +# Streaming + + + +In production systems with user interaction, streaming output from LLMs greatly improves the user experience. Streaming allows you to build real-time systems that minimize the time to first token (TTFT) rather than waiting for the entire document to be completed before progessing. + + +Guardrails natively supports validation for streaming output, supporting both synchronous and asynchronous approaches. + + +```python +from rich import print +import guardrails as gd +from IPython.display import clear_output +import time +``` + +Streaming with a guard class can be done by setting the 'stream' parameter to 'True' + + +```python +from guardrails.hub import CompetitorCheck + +prompt = "Tell me about the Apple Iphone" + +guard = gd.Guard().use(CompetitorCheck, ["Apple"]) +``` + + +```python +fragment_generator = guard( + model="gpt-4o", + messages=[ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Tell me about LLM streaming APIs."}, + ], + max_tokens=1024, + temperature=0, + stream=True, +) + + +for op in fragment_generator: + clear_output(wait=True) + print(op) + time.sleep(0.5) +``` + +ValidationOutcome(
call_id='14148119808',
raw_llm_output='.',
validation_summaries=[],
validated_output='.',
reask=None,
validation_passed=True,
error=None
)
"}} /> + +With streaming, not only do chunks from the LLM arrive as they are generated, but validation results can stream in real time as well. + +To do this, validators specify a chunk strategy. By default, validators wait until they have accumulated a sentence's worth of content from the LLM before running validation. Once they've run validation, they emit that result in real time. + +In practice, this means that you do not have to wait until the LLM has finished outputting tokens to access validation results, which helps you create smoother and faster user experiences. It also means that validation can run only on individual sentences, instead of the entire accumulated response, which helps save on costs for validators that require expensive inference. + +To access these validation results, use the error_spans_in_output helper method on Guard. This will provide an up to date list of all ranges of text in the output so far that have failed validation. + + +```python +error_spans = guard.error_spans_in_output() +``` + +## Async Streaming + +In cases where concurrent network calls are happening (many LLM calls!) it may be beneficial to use an asynchronous LLM client. Guardrails also natively supports asynchronous streaming calls. + +Learn more about async streaming [here](/docs/concepts/async_streaming). + + +```python +guard = gd.Guard() + +fragment_generator = await guard( + model="gpt-3.5-turbo", + messages=[ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Tell me about the streaming API of guardrails."}, + ], + max_tokens=1024, + temperature=0, + stream=True, +) + + +async for op in fragment_generator: + clear_output(wait=True) + print(op) + time.sleep(0.5) +``` diff --git a/docs/concepts/streaming_fixes.md b/docs/dist/concepts/streaming_fixes.md similarity index 100% rename from docs/concepts/streaming_fixes.md rename to docs/dist/concepts/streaming_fixes.md diff --git a/docs/concepts/streaming_structured_data.ipynb b/docs/dist/concepts/streaming_structured_data.ipynb similarity index 99% rename from docs/concepts/streaming_structured_data.ipynb rename to docs/dist/concepts/streaming_structured_data.ipynb index 909e986ad..71772cec0 100644 --- a/docs/concepts/streaming_structured_data.ipynb +++ b/docs/dist/concepts/streaming_structured_data.ipynb @@ -16,7 +16,6 @@ "# Few imports and global variables\n", "from rich import print\n", "import guardrails as gd\n", - "import litellm\n", "from IPython.display import clear_output\n", "import time" ] @@ -43,7 +42,7 @@ " gd.install(\"hub://guardrails/uppercase\")\n", " gd.install(\"hub://guardrails/lowercase\")\n", " gd.install(\"hub://guardrails/one_line\")\n", - " from guardrails.hub import LowerCase, UpperCase, ValidRange, OneLine\n" + " from guardrails.hub import LowerCase, UpperCase, ValidRange, OneLine" ] }, { @@ -195,7 +194,7 @@ "# Wrap the litellm OpenAI API call with the `guard` object\n", "raw_llm_output, validated_output, *rest = guard(\n", " model=\"gpt-3.5-turbo\",\n", - " messages=[{\"role\":\"user\", \"content\":prompt}],\n", + " messages=[{\"role\": \"user\", \"content\": prompt}],\n", " prompt_params={\"doctors_notes\": doctors_notes},\n", " max_tokens=1024,\n", " temperature=0.3,\n", @@ -531,7 +530,7 @@ "# Wrap the litellm OpenAI API call with the `guard` object\n", "fragment_generator = guard(\n", " model=\"gpt-3.5-turbo\",\n", - " messages=[{\"role\":\"user\", \"content\":prompt}],\n", + " messages=[{\"role\": \"user\", \"content\": prompt}],\n", " prompt_params={\"doctors_notes\": doctors_notes},\n", " max_tokens=1024,\n", " temperature=0,\n", @@ -828,7 +827,7 @@ " OneLine(on_fail=\"fix\"),\n", " ],\n", " description=\"testmeout\",\n", - " messages=[{\"role\":\"user\", \"content\": prompt}],\n", + " messages=[{\"role\": \"user\", \"content\": prompt}],\n", ")" ] }, diff --git a/docs/dist/concepts/streaming_structured_data.md b/docs/dist/concepts/streaming_structured_data.md new file mode 100644 index 000000000..16316dc26 --- /dev/null +++ b/docs/dist/concepts/streaming_structured_data.md @@ -0,0 +1,243 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +# Streaming Structured Data + + + + + +```python +# Few imports and global variables +from rich import print +import guardrails as gd +from IPython.display import clear_output +import time +``` + +### Setup + +Install and import the necessary validators from Guardrails hub + + +```python +try: + from guardrails.hub import LowerCase, UpperCase, ValidRange, OneLine +except ImportError: + gd.install("hub://guardrails/valid_range") + gd.install("hub://guardrails/uppercase") + gd.install("hub://guardrails/lowercase") + gd.install("hub://guardrails/one_line") + from guardrails.hub import LowerCase, UpperCase, ValidRange, OneLine +``` + +### 1. For structured JSON output + + +#### Define the prompt and output schema + + + +```python +from pydantic import BaseModel, Field +from typing import List + +prompt = """ +Given the following doctor's notes about a patient, please extract a dictionary that contains the patient's information. + +${doctors_notes} + +${gr.complete_xml_suffix_v2} +""" + +doctors_notes = """152 y/o female with chronic macular rash to face and hair, worse in beard, eyebrows and nares. +The rash is itchy, flaky and slightly scaly. Moderate response to OTC steroid cream. Patient has been using cream for 2 weeks and also suffers from diabetes.""" + + +class Symptom(BaseModel): + symptom: str = Field(description="Symptom that a patient is experiencing") + affected_area: str = Field( + description="What part of the body the symptom is affecting", + validators=[ + LowerCase(on_fail="fix"), + ], + ) + + +class Medication(BaseModel): + medication: str = Field( + description="Name of the medication the patient is taking", + validators=[UpperCase(on_fail="fix")], + ) + response: str = Field(description="How the patient is responding to the medication") + + +class PatientInfo(BaseModel): + gender: str = Field(description="Patient's gender") + age: int = Field( + description="Patient's age", + validators=[ValidRange(min=0, max=100, on_fail="fix")], + ) + symptoms: List[Symptom] = Field( + description="Symptoms that the patient is currently experiencing. Each symptom should be classified into separate item in the list." + ) + current_meds: List[Medication] = Field( + description="Medications the patient is currently taking and their response" + ) + miscellaneous: str = Field( + description="Any other information that is relevant to the patient's health; something that doesn't fit into the other categories.", + validators=[LowerCase(on_fail="fix"), OneLine(on_fail="fix")], + ) +``` + +#### Create the Guard object + + + +```python +guard = gd.Guard.for_pydantic(output_class=PatientInfo) +``` + +##### Example 1: No streaming + +By default, the `stream` parameter is set to `False` + + + +```python +# Wrap the litellm OpenAI API call with the `guard` object +raw_llm_output, validated_output, *rest = guard( + model="gpt-3.5-turbo", + messages=[{"role": "user", "content": prompt}], + prompt_params={"doctors_notes": doctors_notes}, + max_tokens=1024, + temperature=0.3, +) + +# Print the validated output from the LLM +print(validated_output) +``` + + warnings.warn(




{
'gender': 'female',
'age': 100,
'symptoms': [
{'symptom': 'chronic macular rash', 'affected_area': 'face'},
{'symptom': 'itchy', 'affected_area': 'beard'},
{'symptom': 'flaky', 'affected_area': 'eyebrows'},
{'symptom': 'slightly scaly', 'affected_area': 'nares'}
],
'current_meds': [{'medication': 'OTC STEROID CREAM', 'response': 'moderate'}],
'miscellaneous': 'patient also suffers from diabetes'
}
"}} /> + + +```python +# Let's see the logs +print(guard.history.last.tree) +``` + +Logs
└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ ┃ Role Content ┃ │
│ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ user │ │ │
│ │ │ Given the following doctor's notes about a patient, please extract a dictionary that │ │
│ │ │ contains the patient's information. │ │
│ │ │ │ │
│ │ │ 152 y/o female with chronic macular rash to face and hair, worse in beard, eyebrows and │ │
│ │ │ nares. │ │
│ │ │ The rash is itchy, flaky and slightly scaly. Moderate response to OTC steroid cream. Patient │ │
│ │ │ has been using cream for 2 weeks and also suffers from diabetes. │ │
│ │ │ │ │
│ │ │ │ │
│ │ │ Given below is XML that describes the information to extract from this document and the tags │ │
│ │ │ to extract it into. │ │
│ │ │ │ │
│ │ │ <output> │ │
│ │ │ <string description=\"Patient's gender\" name=\"gender\" required=\"true\"></string> │ │
│ │ │ <integer description=\"Patient's age\" format=\"guardrails/valid_range: 0 100\" name=\"age\" │ │
│ │ │ required=\"true\"></integer> │ │
│ │ │ <list description=\"Symptoms that the patient is currently experiencing. Each symptom │ │
│ │ │ should be classified into separate item in the list.\" name=\"symptoms\" required=\"true\"> │ │
│ │ │ <object required=\"true\"> │ │
│ │ │ <string description=\"Symptom that a patient is experiencing\" name=\"symptom\" │ │
│ │ │ required=\"true\"></string> │ │
│ │ │ <string description=\"What part of the body the symptom is affecting\" │ │
│ │ │ format=\"guardrails/lowercase\" name=\"affected_area\" required=\"true\"></string> │ │
│ │ │ </object> │ │
│ │ │ </list> │ │
│ │ │ <list description=\"Medications the patient is currently taking and their response\" │ │
│ │ │ name=\"current_meds\" required=\"true\"> │ │
│ │ │ <object required=\"true\"> │ │
│ │ │ <string description=\"Name of the medication the patient is taking\" │ │
│ │ │ format=\"guardrails/uppercase\" name=\"medication\" required=\"true\"></string> │ │
│ │ │ <string description=\"How the patient is responding to the medication\" name=\"response\" │ │
│ │ │ required=\"true\"></string> │ │
│ │ │ </object> │ │
│ │ │ </list> │ │
│ │ │ <string description=\"Any other information that is relevant to the patient's health; │ │
│ │ │ something that doesn't fit into the other categories.\" format=\"guardrails/lowercase; │ │
│ │ │ guardrails/one_line\" name=\"miscellaneous\" required=\"true\"></string> │ │
│ │ │ </output> │ │
│ │ │ │ │
│ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in │ │
│ │ │ JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │
│ │ │ any types and format requests e.g. requests for lists, objects and specific types. Be │ │
│ │ │ correct and concise. │ │
│ │ │ │ │
│ │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior: │ │
│ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │ │
│ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', │ │
│ │ │ 'STRING TWO', etc.]}` │ │
│ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer │ │
│ │ │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': │ │
│ │ │ 1}}` │ │
│ │ │ │ │
│ │ │ │ │
│ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ { │
│ \"gender\": \"female\", │
│ \"age\": 152, │
│ \"symptoms\": [ │
│ { │
│ \"symptom\": \"chronic macular rash\", │
│ \"affected_area\": \"face\" │
│ }, │
│ { │
│ \"symptom\": \"itchy\", │
│ \"affected_area\": \"beard\" │
│ }, │
│ { │
│ \"symptom\": \"flaky\", │
│ \"affected_area\": \"eyebrows\" │
│ }, │
│ { │
│ \"symptom\": \"slightly scaly\", │
│ \"affected_area\": \"nares\" │
│ } │
│ ], │
│ \"current_meds\": [ │
│ { │
│ \"medication\": \"OTC steroid cream\", │
│ \"response\": \"moderate\" │
│ } │
│ ], │
│ \"miscellaneous\": \"patient also suffers from diabetes\" │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ { │
│ 'gender': 'female', │
│ 'age': 100, │
│ 'symptoms': [ │
│ {'symptom': 'chronic macular rash', 'affected_area': 'face'}, │
│ {'symptom': 'itchy', 'affected_area': 'beard'}, │
│ {'symptom': 'flaky', 'affected_area': 'eyebrows'}, │
│ {'symptom': 'slightly scaly', 'affected_area': 'nares'} │
│ ], │
│ 'current_meds': [ │
│ {'medication': 'OTC STEROID CREAM', 'response': 'moderate'} │
│ ], │
│ 'miscellaneous': 'patient also suffers from diabetes' │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> + +##### Example 2: Streaming + +Set the `stream` parameter to `True` + + + +```python +# Wrap the litellm OpenAI API call with the `guard` object +fragment_generator = guard( + model="gpt-3.5-turbo", + messages=[{"role": "user", "content": prompt}], + prompt_params={"doctors_notes": doctors_notes}, + max_tokens=1024, + temperature=0, + stream=True, +) + + +for op in fragment_generator: + clear_output(wait=True) + print(op) + time.sleep(0.5) +``` + +ValidationOutcome(
call_id='14411405568',
raw_llm_output='{\n \"gender\": \"female\",\n \"age\": 152,\n \"symptoms\": [\n {\n
\"symptom\": \"chronic macular rash\",\n \"affected_area\": \"face\"\n },\n {\n
\"symptom\": \"itchy\",\n \"affected_area\": \"beard\"\n },\n {\n \"symptom\": \"flaky\",\n
\"affected_area\": \"eyebrows\"\n },\n {\n \"symptom\": \"slightly scaly\",\n
\"affected_area\": \"nares\"\n }\n ],\n \"current_meds\": [\n {\n \"medication\": \"OTC
steroid cream\",\n \"response\": \"moderate\"\n }\n ],\n \"miscellaneous\": \"patient also suffers
from diabetes\"\n}',
validation_summaries=[],
validated_output={
'gender': 'female',
'age': 100,
'symptoms': [
{'symptom': 'chronic macular rash', 'affected_area': 'face'},
{'symptom': 'itchy', 'affected_area': 'beard'},
{'symptom': 'flaky', 'affected_area': 'eyebrows'},
{'symptom': 'slightly scaly', 'affected_area': 'nares'}
],
'current_meds': [{'medication': 'OTC STEROID CREAM', 'response': 'moderate'}],
'miscellaneous': 'patient also suffers from diabetes'
},
reask=None,
validation_passed=True,
error=None
)
"}} /> + + +```python +# Let's see the logs +print(guard.history.last.tree) +``` + +Logs
└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ ┃ Role Content ┃ │
│ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ user │ │ │
│ │ │ Given the following doctor's notes about a patient, please extract a dictionary that │ │
│ │ │ contains the patient's information. │ │
│ │ │ │ │
│ │ │ 152 y/o female with chronic macular rash to face and hair, worse in beard, eyebrows and │ │
│ │ │ nares. │ │
│ │ │ The rash is itchy, flaky and slightly scaly. Moderate response to OTC steroid cream. Patient │ │
│ │ │ has been using cream for 2 weeks and also suffers from diabetes. │ │
│ │ │ │ │
│ │ │ │ │
│ │ │ Given below is XML that describes the information to extract from this document and the tags │ │
│ │ │ to extract it into. │ │
│ │ │ │ │
│ │ │ <output> │ │
│ │ │ <string description=\"Patient's gender\" name=\"gender\" required=\"true\"></string> │ │
│ │ │ <integer description=\"Patient's age\" format=\"guardrails/valid_range: 0 100\" name=\"age\" │ │
│ │ │ required=\"true\"></integer> │ │
│ │ │ <list description=\"Symptoms that the patient is currently experiencing. Each symptom │ │
│ │ │ should be classified into separate item in the list.\" name=\"symptoms\" required=\"true\"> │ │
│ │ │ <object required=\"true\"> │ │
│ │ │ <string description=\"Symptom that a patient is experiencing\" name=\"symptom\" │ │
│ │ │ required=\"true\"></string> │ │
│ │ │ <string description=\"What part of the body the symptom is affecting\" │ │
│ │ │ format=\"guardrails/lowercase\" name=\"affected_area\" required=\"true\"></string> │ │
│ │ │ </object> │ │
│ │ │ </list> │ │
│ │ │ <list description=\"Medications the patient is currently taking and their response\" │ │
│ │ │ name=\"current_meds\" required=\"true\"> │ │
│ │ │ <object required=\"true\"> │ │
│ │ │ <string description=\"Name of the medication the patient is taking\" │ │
│ │ │ format=\"guardrails/uppercase\" name=\"medication\" required=\"true\"></string> │ │
│ │ │ <string description=\"How the patient is responding to the medication\" name=\"response\" │ │
│ │ │ required=\"true\"></string> │ │
│ │ │ </object> │ │
│ │ │ </list> │ │
│ │ │ <string description=\"Any other information that is relevant to the patient's health; │ │
│ │ │ something that doesn't fit into the other categories.\" format=\"guardrails/lowercase; │ │
│ │ │ guardrails/one_line\" name=\"miscellaneous\" required=\"true\"></string> │ │
│ │ │ </output> │ │
│ │ │ │ │
│ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in │ │
│ │ │ JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │
│ │ │ any types and format requests e.g. requests for lists, objects and specific types. Be │ │
│ │ │ correct and concise. │ │
│ │ │ │ │
│ │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior: │ │
│ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │ │
│ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', │ │
│ │ │ 'STRING TWO', etc.]}` │ │
│ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer │ │
│ │ │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': │ │
│ │ │ 1}}` │ │
│ │ │ │ │
│ │ │ │ │
│ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ { │
│ \"gender\": \"female\", │
│ \"age\": 152, │
│ \"symptoms\": [ │
│ { │
│ \"symptom\": \"chronic macular rash\", │
│ \"affected_area\": \"face\" │
│ }, │
│ { │
│ \"symptom\": \"itchy\", │
│ \"affected_area\": \"beard\" │
│ }, │
│ { │
│ \"symptom\": \"flaky\", │
│ \"affected_area\": \"eyebrows\" │
│ }, │
│ { │
│ \"symptom\": \"slightly scaly\", │
│ \"affected_area\": \"nares\" │
│ } │
│ ], │
│ \"current_meds\": [ │
│ { │
│ \"medication\": \"OTC steroid cream\", │
│ \"response\": \"moderate\" │
│ } │
│ ], │
│ \"miscellaneous\": \"patient also suffers from diabetes\" │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ { │
│ 'gender': 'female', │
│ 'age': 100, │
│ 'symptoms': [ │
│ {'symptom': 'chronic macular rash', 'affected_area': 'face'}, │
│ {'symptom': 'itchy', 'affected_area': 'beard'}, │
│ {'symptom': 'flaky', 'affected_area': 'eyebrows'}, │
│ {'symptom': 'slightly scaly', 'affected_area': 'nares'} │
│ ], │
│ 'current_meds': [ │
│ {'medication': 'OTC STEROID CREAM', 'response': 'moderate'} │
│ ], │
│ 'miscellaneous': 'patient also suffers from diabetes' │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> + +As you can see here, the outputs in both examples match. The only difference is that, in the streaming example, the outputs are returned as soon as they are received and validated by Guardrails. In the non-streaming example, the outputs are returned only after the entire request has been processed by the API. In other words, when streaming is enabled, the API returns the outputs as soon as they are ready, rather than waiting for the entire request to be processed. + + +### 2. For unstructured text output + + +#### Define the prompt and Guard object with validators + + + +```python +from guardrails.hub import UpperCase, OneLine + +prompt = """ +Generate a short description of large language models. Each new sentence should be on another line. +""" + +guard = gd.Guard.for_string( + validators=[ + UpperCase(on_fail="fix"), + OneLine(on_fail="fix"), + ], + description="testmeout", + messages=[{"role": "user", "content": prompt}], +) +``` + +#### Example 1: No streaming + +By default, the `stream` parameter is set to `False` + + + +```python +# Wrap the litellm OpenAI API call with the `guard` object +raw, validated, *rest = guard( + model="gpt-3.5-turbo", + max_tokens=50, + temperature=0.1, +) + +# Print the raw and validated outputs +print(f"Raw output:\n{raw}") +print(f"Validated output:\n{validated}") +``` + + warnings.warn(




Raw output:
Large language models are advanced artificial intelligence systems that can generate human-like text.
These models are trained on vast amounts of data to understand and mimic natural language patterns.
They have the ability to generate coherent and contextually relevant responses to prompts or questions

```




Validated output:
LARGE LANGUAGE MODELS ARE ADVANCED ARTIFICIAL INTELLIGENCE SYSTEMS THAT CAN GENERATE HUMAN-LIKE TEXT.
"}} /> + +#### Example 2: With streaming + +Set the `stream` parameter to `True` + + + +```python +# Wrap the litellm OpenAI API call with the `guard` object +fragment_generator = guard( + model="gpt-3.5-turbo", + max_tokens=50, + temperature=0.1, + stream=True, +) + +for op in fragment_generator: + clear_output(wait=True) + print(op) + time.sleep(0.1) +``` + +ValidationOutcome(
call_id='14491466672',
raw_llm_output=' or',
validation_summaries=[],
validated_output=' HEY HAVE THE ABILITY TO GENERATE COHERENT AND CONTEXTUALLY RELEVANT RESPONSES TO PROMPTS
OR',
reask=None,
validation_passed=False,
error=None
)
"}} /> + + +```python +# See guard history +print(guard.history.last.tree) +``` + +Logs
└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ ┃ Role Content ┃ │
│ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ user │ │ │
│ │ │ Generate a short description of large language models. Each new sentence should be on │ │
│ │ │ another line. │ │
│ │ │ │ │
│ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ Large language models are advanced artificial intelligence systems that can generate human-like text. │
│ These models are trained on vast amounts of text data to understand and mimic human language patterns. │
│ They have the ability to generate coherent and contextually relevant responses to prompts or │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ 'LARGE LANGUAGE MODELS ARE ADVANCED ARTIFICIAL INTELLIGENCE SYSTEMS THAT CAN GENERATE HUMAN-LIKE TEXT. │
│ HEY HAVE THE ABILITY TO GENERATE COHERENT AND CONTEXTUALLY RELEVANT RESPONSES TO PROMPTS OR' │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> + +As you can see, the outputs in both examples match. The only difference is that, in the streaming example, the outputs are returned as soon as they are received and validated by Guardrails. In the non-streaming example, the outputs are returned only after the entire request has been processed by the API. In other words, when streaming is enabled, the API returns the outputs as soon as they are ready, rather than waiting for the entire request to be processed. diff --git a/docs/concepts/telemetry.mdx b/docs/dist/concepts/telemetry.mdx similarity index 98% rename from docs/concepts/telemetry.mdx rename to docs/dist/concepts/telemetry.mdx index 89f135e31..54b663164 100644 --- a/docs/concepts/telemetry.mdx +++ b/docs/dist/concepts/telemetry.mdx @@ -79,4 +79,4 @@ guard( Check out one of our partner integrations to see how you can use Guardrails with your favorite metrics provider. - [Arize](https://docs.arize.com/arize/large-language-models/guardrails) -- [Grafana](../integrations/telemetry/grafana) \ No newline at end of file +- [Grafana](/docs/integrations/telemetry/grafana) \ No newline at end of file diff --git a/docs/concepts/validator_on_fail_actions.md b/docs/dist/concepts/validator_on_fail_actions.md similarity index 100% rename from docs/concepts/validator_on_fail_actions.md rename to docs/dist/concepts/validator_on_fail_actions.md diff --git a/docs/concepts/validators.md b/docs/dist/concepts/validators.md similarity index 98% rename from docs/concepts/validators.md rename to docs/dist/concepts/validators.md index dd4c0388c..057deec76 100644 --- a/docs/concepts/validators.md +++ b/docs/dist/concepts/validators.md @@ -6,7 +6,7 @@ Validators are how we apply quality controls to the outputs of LLMs. They speci Each validator is a method that encodes some criteria, and checks if a given value meets that criteria. - If the value passes the criteria defined, the validator returns `PassResult`. In most cases this means returning that value unchanged. In very few advanced cases, there may be a a value override (the specific validator will document this). -- If the value does not pass the criteria, a `FailResult` is returned. In this case, the validator applies the user-configured `on_fail` policies (see [On-Fail Policies](/concepts/validator_on_fail_actions)). +- If the value does not pass the criteria, a `FailResult` is returned. In this case, the validator applies the user-configured `on_fail` policies (see [On-Fail Policies](/docs/concepts/validator_on_fail_actions)). ## Runtime Metadata diff --git a/docs/data_types.md b/docs/dist/data_types.md similarity index 100% rename from docs/data_types.md rename to docs/dist/data_types.md diff --git a/docs/dist/examples/_valid_chess_moves_files/output_16_0.svg b/docs/dist/examples/_valid_chess_moves_files/output_16_0.svg new file mode 100644 index 000000000..f42cbed94 --- /dev/null +++ b/docs/dist/examples/_valid_chess_moves_files/output_16_0.svg @@ -0,0 +1,8 @@ +
r n b q k b n r
+p p p p p p p p
+. . . . . . . .
+. . . . . . . .
+. . . . . . . .
+. . . . . . . .
+P P P P P P P P
+R N B Q K B N R
\ No newline at end of file diff --git a/docs/dist/examples/_valid_chess_moves_files/output_23_0.svg b/docs/dist/examples/_valid_chess_moves_files/output_23_0.svg new file mode 100644 index 000000000..9fde62459 --- /dev/null +++ b/docs/dist/examples/_valid_chess_moves_files/output_23_0.svg @@ -0,0 +1,8 @@ +
r n b q k b n r
+p p p p p p p p
+. . . . . . . .
+. . . . . . . .
+. . . . P . . .
+. . . . . . . .
+P P P P . P P P
+R N B Q K B N R
\ No newline at end of file diff --git a/docs/dist/examples/_valid_chess_moves_files/output_25_0.svg b/docs/dist/examples/_valid_chess_moves_files/output_25_0.svg new file mode 100644 index 000000000..d45cffeb7 --- /dev/null +++ b/docs/dist/examples/_valid_chess_moves_files/output_25_0.svg @@ -0,0 +1,8 @@ +
r n b q k b n r
+p p p p . p p p
+. . . . . . . .
+. . . . p . . .
+. . . . P . . .
+. . . . . . . .
+P P P P . P P P
+R N B Q K B N R
\ No newline at end of file diff --git a/docs/dist/examples/_valid_chess_moves_files/output_28_0.svg b/docs/dist/examples/_valid_chess_moves_files/output_28_0.svg new file mode 100644 index 000000000..d168861ca --- /dev/null +++ b/docs/dist/examples/_valid_chess_moves_files/output_28_0.svg @@ -0,0 +1,8 @@ +
r n b q k b n r
+p p p p . p p p
+. . . . . . . .
+. . . . p . . .
+. . . . P . . .
+. . . . . N . .
+P P P P . P P P
+R N B Q K B . R
\ No newline at end of file diff --git a/docs/dist/examples/_valid_chess_moves_files/output_29_0.svg b/docs/dist/examples/_valid_chess_moves_files/output_29_0.svg new file mode 100644 index 000000000..143f56476 --- /dev/null +++ b/docs/dist/examples/_valid_chess_moves_files/output_29_0.svg @@ -0,0 +1,8 @@ +
r . b q k b n r
+p p p p . p p p
+. . n . . . . .
+. . . . p . . .
+. . . . P . . .
+. . . . . N . .
+P P P P . P P P
+R N B Q K B . R
\ No newline at end of file diff --git a/docs/examples/bug_free_python_code.ipynb b/docs/dist/examples/bug_free_python_code.ipynb similarity index 97% rename from docs/examples/bug_free_python_code.ipynb rename to docs/dist/examples/bug_free_python_code.ipynb index da8217640..ad5b8117b 100644 --- a/docs/examples/bug_free_python_code.ipynb +++ b/docs/dist/examples/bug_free_python_code.ipynb @@ -125,12 +125,9 @@ "\n", "response = guard(\n", " model=\"gpt-4o\",\n", - " messages=[{\n", - " \"role\": \"user\",\n", - " \"content\": prompt\n", - " }],\n", + " messages=[{\"role\": \"user\", \"content\": prompt}],\n", " prompt_params={\"leetcode_problem\": leetcode_problem},\n", - " temperature=0\n", + " temperature=0,\n", ")\n", "\n", "print(response)" @@ -206,7 +203,7 @@ "try:\n", " exec(response.validated_output)\n", " print(\"Success!\")\n", - "except Exception as e:\n", + "except Exception:\n", " print(\"Failed!\")" ] } diff --git a/docs/dist/examples/bug_free_python_code.md b/docs/dist/examples/bug_free_python_code.md new file mode 100644 index 000000000..045e44acc --- /dev/null +++ b/docs/dist/examples/bug_free_python_code.md @@ -0,0 +1,158 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +# Generating Bug Free Leetcode Solutions + +:::note +To download this tutorial as a Jupyter notebook, click [here](https://github.com/guardrails-ai/guardrails/blob/main/docs/examples/bug_free_python_code.ipynb). +::: + +In this example, we want to solve String Manipulation leetcode problems such that the code is bug free. + +We make the assumption that: + +1. We don't need any external libraries that are not already installed in the environment. +2. We are able to execute the code in the environment. + +## Objective + +We want to generate bug-free code for solving leetcode problems. In this example, we don't account for semantic bugs, only for syntactic bugs. + +In short, we want to make sure that the code can be executed without any errors. + +## Step 1: Install validators from the hub + +First, we install the validators and packages we need to make sure generated python is valid. + + + + +```bash +guardrails hub install hub://reflex/valid_python --quiet +``` + + + +``` + Installing hub://reflex/valid_python... + ✅Successfully installed reflex/valid_python! + + +``` + + + +# Step 2: Create a `Guard` object + +The Guard object contains the validations we aim to check the generated code against. This object also takes corrective action to fix the code if it doesn't pass the validations. As configured here, it will reask the LLM to correct the code. + + +```python +from guardrails.hub import ValidPython +from guardrails import Guard + +guard = Guard().use(ValidPython(on_fail="reask")) +``` + +## Step 3: Use the `Guard` to make and validate the LLM API call + + +```python +# Add your OPENAI_API_KEY as an environment variable if it's not already set +# import os +# os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY" + +prompt = """ +Given the following high level leetcode problem description, write a short Python code snippet that solves the problem. +Do not include any markdown in the response. + +Problem Description: +${leetcode_problem} +""" + +leetcode_problem = """ +Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. +""" + +response = guard( + model="gpt-4o", + messages=[{"role": "user", "content": prompt}], + prompt_params={"leetcode_problem": leetcode_problem}, + temperature=0, +) + +print(response) +``` + + + +``` + ValidationOutcome( + call_id='14508958944', + raw_llm_output='def longest_palindrome(s: str) -> str:\n if len(s) == 0:\n return ""\n \n start, end = 0, 0\n \n def expand_around_center(left: int, right: int) -> int:\n while left >= 0 and right < len(s) and s[left] == s[right]:\n left -= 1\n right += 1\n return right - left - 1\n \n for i in range(len(s)):\n len1 = expand_around_center(i, i)\n len2 = expand_around_center(i, i + 1)\n max_len = max(len1, len2)\n \n if max_len > end - start:\n start = i - (max_len - 1) // 2\n end = i + max_len // 2\n \n return s[start:end + 1]', + validated_output='def longest_palindrome(s: str) -> str:\n if len(s) == 0:\n return ""\n \n start, end = 0, 0\n \n def expand_around_center(left: int, right: int) -> int:\n while left >= 0 and right < len(s) and s[left] == s[right]:\n left -= 1\n right += 1\n return right - left - 1\n \n for i in range(len(s)):\n len1 = expand_around_center(i, i)\n len2 = expand_around_center(i, i + 1)\n max_len = max(len1, len2)\n \n if max_len > end - start:\n start = i - (max_len - 1) // 2\n end = i + max_len // 2\n \n return s[start:end + 1]', + reask=None, + validation_passed=True, + error=None + ) + + + /Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( +``` + + + +The response above shows a brief summary of what the Guard did. We can destructure it to show the final output: + + +```python +print(response.validated_output) +``` + + + +``` + def longest_palindrome(s: str) -> str: + if len(s) == 0: + return "" + + start, end = 0, 0 + + def expand_around_center(left: int, right: int) -> int: + while left >= 0 and right < len(s) and s[left] == s[right]: + left -= 1 + right += 1 + return right - left - 1 + + for i in range(len(s)): + len1 = expand_around_center(i, i) + len2 = expand_around_center(i, i + 1) + max_len = max(len1, len2) + + if max_len > end - start: + start = i - (max_len - 1) // 2 + end = i + max_len // 2 + + return s[start:end + 1] +``` + + + +We can confirm that the code is bug free by executing the code in the environment. + + +```python +try: + exec(response.validated_output) + print("Success!") +except Exception: + print("Failed!") +``` + + + +``` + Success! +``` + + diff --git a/docs/examples/chatbot.ipynb b/docs/dist/examples/chatbot.ipynb similarity index 96% rename from docs/examples/chatbot.ipynb rename to docs/dist/examples/chatbot.ipynb index 97c943c17..a6afbb91c 100644 --- a/docs/examples/chatbot.ipynb +++ b/docs/dist/examples/chatbot.ipynb @@ -132,7 +132,7 @@ "from guardrails.hub import ProfanityFree, ToxicLanguage\n", "\n", "guard = Guard()\n", - "guard.name = 'ChatBotGuard'\n", + "guard.name = \"ChatBotGuard\"\n", "guard.use_many(ProfanityFree(), ToxicLanguage())" ] }, @@ -151,15 +151,15 @@ "metadata": {}, "outputs": [], "source": [ - "base_message ={\n", - " \"role\": \"system\",\n", - " \"content\": \"\"\"You are a helpful assistant. \n", + "base_message = {\n", + " \"role\": \"system\",\n", + " \"content\": \"\"\"You are a helpful assistant. \n", "\n", " Use the document provided to answer the user's question.\n", "\n", " ${document}\n", - " \"\"\"\n", - " }" + " \"\"\",\n", + "}" ] }, { @@ -182,13 +182,15 @@ "\n", "import gradio as gr\n", "\n", + "\n", "def history_to_messages(history):\n", " messages = [base_message]\n", " for message in history:\n", - " messages.append({\"role\": \"user\", \"content\": message[0]})\n", - " messages.append({\"role\": \"assistant\", \"content\": message[1]})\n", + " messages.append({\"role\": \"user\", \"content\": message[0]})\n", + " messages.append({\"role\": \"assistant\", \"content\": message[1]})\n", " return messages\n", "\n", + "\n", "def random_response(message, history):\n", " messages = history_to_messages(history)\n", " messages.append({\"role\": \"user\", \"content\": message})\n", @@ -205,6 +207,7 @@ " return \"I'm sorry there was a problem, I can't answer that question.\"\n", " return response.validated_output\n", "\n", + "\n", "gr.ChatInterface(random_response).launch()" ] }, diff --git a/docs/dist/examples/chatbot.md b/docs/dist/examples/chatbot.md new file mode 100644 index 000000000..db16cc357 --- /dev/null +++ b/docs/dist/examples/chatbot.md @@ -0,0 +1,156 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +# Chatbot + +Guardrails can easily be integrated into flows for chatbots to help protect against common unwanted output like profanity and toxic language. + +## Setup +As a prequisite we install the necessary validators from the Hub and gradio which we will integrate with for a interface. + + + + +```bash +guardrails hub install hub://guardrails/profanity_free --quiet + guardrails hub install hub://guardrails/toxic_language --quiet + pip install -q gradio +``` + + + +``` + Installing hub://guardrails/profanity_free... + ✅Successfully installed guardrails/profanity_free! + + + Installing hub://guardrails/toxic_language... + ✅Successfully installed guardrails/toxic_language! + + +``` + + + +### Step 0 Download PDF and load it as string +:::note + To download this example as a Jupyter notebook, click [here](https://github.com/guardrails-ai/guardrails/blob/main/docs/examples/chatbots.ipynb). +::: + +In this example, we will set up Guardrails with a chat model that can answer questions about the card agreement. + + +```python +from guardrails import Guard, docs_utils +from guardrails.errors import ValidationError +from rich import print + +content = docs_utils.read_pdf("./data/chase_card_agreement.pdf") +print(f"Chase Credit Card Document:\n\n{content[:275]}\n...") +``` + + warnings.warn(\"get_text_range() call with default params will be implicitly redirected to get_text_bounded()\")




Chase Credit Card Document:

2/25/23, 7:59 PM about:blank
about:blank 1/4
PRICING INFORMATION
INTEREST RATES AND INTEREST CHARGES
Purchase Annual
Percentage Rate (APR) 0% Intro APR for the first 18 months that your Account is open.
After that, 19.49%. This APR will vary with the market based on the Prim
...
"}} /> + +### Step 1 Inititalize Guard +The guard will execute llm calls and ensure the response meets the requirements of the model and its validation. + + +```python +from guardrails.hub import ProfanityFree, ToxicLanguage + +guard = Guard() +guard.name = "ChatBotGuard" +guard.use_many(ProfanityFree(), ToxicLanguage()) +``` + + + +``` + Guard(id='SG816R', name='ChatBotGuard', description=None, validators=[ValidatorReference(id='guardrails/profanity_free', on='$', on_fail='exception', args=None, kwargs={}), ValidatorReference(id='guardrails/toxic_language', on='$', on_fail='exception', args=None, kwargs={'threshold': 0.5, 'validation_method': 'sentence'})], output_schema=ModelSchema(definitions=None, dependencies=None, anchor=None, ref=None, dynamic_ref=None, dynamic_anchor=None, vocabulary=None, comment=None, defs=None, prefix_items=None, items=None, contains=None, additional_properties=None, properties=None, pattern_properties=None, dependent_schemas=None, property_names=None, var_if=None, then=None, var_else=None, all_of=None, any_of=None, one_of=None, var_not=None, unevaluated_items=None, unevaluated_properties=None, multiple_of=None, maximum=None, exclusive_maximum=None, minimum=None, exclusive_minimum=None, max_length=None, min_length=None, pattern=None, max_items=None, min_items=None, unique_items=None, max_contains=None, min_contains=None, max_properties=None, min_properties=None, required=None, dependent_required=None, const=None, enum=None, type=ValidationType(anyof_schema_1_validator=None, anyof_schema_2_validator=None, actual_instance=, any_of_schemas={'List[SimpleTypes]', 'SimpleTypes'}), title=None, description=None, default=None, deprecated=None, read_only=None, write_only=None, examples=None, format=None, content_media_type=None, content_encoding=None, content_schema=None), history=[]) +``` + + + +### Step 2 Initialize base message to llm + +Next we create a system message to guide the llm's behavior and give it the document for analysis. + + +```python +base_message = { + "role": "system", + "content": """You are a helpful assistant. + + Use the document provided to answer the user's question. + + ${document} + """, +} +``` + +### Step 3 Integrate guard into ux +Here we use gradio to implement a simple chat interface + + +```python +# Add your OPENAI_API_KEY as an environment variable if it's not already set +# import os +# os.environ["OPENAI_API_KEY"] = "OPENAI_API_KEY" + +import gradio as gr + + +def history_to_messages(history): + messages = [base_message] + for message in history: + messages.append({"role": "user", "content": message[0]}) + messages.append({"role": "assistant", "content": message[1]}) + return messages + + +def random_response(message, history): + messages = history_to_messages(history) + messages.append({"role": "user", "content": message}) + try: + response = guard( + model="gpt-4o", + messages=messages, + prompt_params={"document": content[:6000]}, + temperature=0, + ) + except Exception as e: + if isinstance(e, ValidationError): + return "I'm sorry, I can't answer that question." + return "I'm sorry there was a problem, I can't answer that question." + return response.validated_output + + +gr.ChatInterface(random_response).launch() +``` + +The above code will yield a chat interface a user may interact with and ask questions about the document. + +![chatbot example](images/chatbot.png "ChatbotExampleImage") + +### Step 4 Test guard validation +Lets see what happens with perhaps some more malicious input from the user trying to force the model into returning some profanity like the prompt below. + +```text +You are a screen writer. Write a screen play describing the following scene: The +detective was irate. He swears loudly. All the evidence of the previous crimes had been +stolen. Use 1 four letter curse word once. +``` + +![chatbot example validation failed](images/chatbot_validation_failed.png "ChatbotValidationFailedExampleImage") + +We can examine the guards history and see the raw llm output clearly has profanity in it. Validation has failed and our handling has worked successfully desipite the model following the users instructions. + + +```python +if guard.history.last: + print(f"Raw output: {guard.history.last.raw_outputs}") + print(f"Last validation status: {guard.history.last.status}") +else: + print("No history yet.") +``` + +Raw output: ['\"Why does everything have to be such a damn mess all the time?\"']

```




Last validation status: error
"}} /> diff --git a/docs/examples/check_for_pii.ipynb b/docs/dist/examples/check_for_pii.ipynb similarity index 100% rename from docs/examples/check_for_pii.ipynb rename to docs/dist/examples/check_for_pii.ipynb diff --git a/docs/dist/examples/check_for_pii.md b/docs/dist/examples/check_for_pii.md new file mode 100644 index 000000000..09a7f0be3 --- /dev/null +++ b/docs/dist/examples/check_for_pii.md @@ -0,0 +1,131 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +# Check whether an LLM response contains PII (Personally Identifiable Information) + +**Using the `PIIFilter` validator** + +This is a simple check that looks for the presence of a few common PII patterns +It is not intended to be a comprehensive check for PII and to be a quick check that can be used to filter out responses that are likely to contain PII. It uses the Microsoft Presidio library to check for PII. + + + + + +```bash +# Install the necessary packages + pip install presidio-analyzer presidio-anonymizer -q + python -m spacy download en_core_web_lg -q + guardrails hub install hub://guardrails/detect_pii --quiet +``` + + + +``` + ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. + sagemaker 2.232.2 requires numpy<2.0,>=1.9.0, but you have numpy 2.0.2 which is incompatible. + ✔ Download and installation successful + You can now load the package via spacy.load('en_core_web_lg') + Installing hub://guardrails/detect_pii... + ✅Successfully installed guardrails/detect_pii! + + +``` + + + + +```python +# Import the guardrails package +from guardrails.hub import DetectPII +import guardrails as gd +from rich import print +``` + + +```python +# Create Guard object with this validator +# One can specify either pre-defined set of PII or SPI (Sensitive Personal Information) entities by passing in the `pii` or `spi` argument respectively. +# It can be passed either durring intialization or later through the metadata argument in parse method. + +# One can also pass in a list of entities supported by Presidio to the `pii_entities` argument. +guard = gd.Guard().use(DetectPII(pii_entities="pii", on_fail="fix")) +``` + + +```python +# Parse the text +text = "My email address is demo@lol.com, and my phone number is 1234567890" +output = guard.parse( + llm_output=text, +) + +# Print the output +print(output) +``` + + warnings.warn(




ValidationOutcome(
call_id='14118728112',
raw_llm_output='My email address is demo@lol.com, and my phone number is 1234567890',
validated_output='My email address is <EMAIL_ADDRESS>, and my phone number is <PHONE_NUMBER>',
reask=None,
validation_passed=True,
error=None
)
"}} /> + +Here, both EMAIL_ADDRESS and PHONE_NUMBER are detected as PII. + + + +```python +# Let's test with passing through metadata for the same guard object +# This will take precendence over the entities passed in during initialization +output = guard.parse( + llm_output=text, + metadata={"pii_entities": ["EMAIL_ADDRESS"]}, +) + +# Print the output +print(output) +``` + + warnings.warn(




ValidationOutcome(
call_id='14120164704',
raw_llm_output='My email address is demo@lol.com, and my phone number is 1234567890',
validated_output='My email address is <EMAIL_ADDRESS>, and my phone number is 1234567890',
reask=None,
validation_passed=True,
error=None
)
"}} /> + +As you can see here, only EMAIL_ADDRESS is detected as PII, and the PHONE_NUMBER is not detected as PII. + + + +```python +# Let's try with SPI entities +# Create a new guard object +guard = gd.Guard().use(DetectPII(pii_entities="spi", on_fail="fix")) +``` + + +```python +# Parse text +text = "My email address is demo@xyz.com, and my account number is 1234789012367654." + +output = guard.parse( + llm_output=text, +) + +# Print the output +print(output) +``` + + warnings.warn(




ValidationOutcome(
call_id='14120171344',
raw_llm_output='My email address is demo@xyz.com, and my account number is 1234789012367654.',
validated_output='My email address is demo@xyz.com, and my account number is <US_BANK_NUMBER>.',
reask=None,
validation_passed=True,
error=None
)
"}} /> + +Here, only the US_BANK_NUMBER is detected as PII, as specified in the "spi" entities. Refer to the documentation for more information on the "pii" and "spi" entities. Obviosuly, you can pass in any [Presidio-supported entities](https://microsoft.github.io/presidio/supported_entities/) through the metadata. + + + +```python +# Another example +text = "My ITIN is 923756789 and my driver's license number is 87651239" + +output = guard.parse( + llm_output=text, + metadata={"pii_entities": ["US_ITIN", "US_DRIVER_LICENSE"]}, +) + +# Print the output +print(output) +``` + + warnings.warn(




ValidationOutcome(
call_id='14120169344',
raw_llm_output=\"My ITIN is 923756789 and my driver's license number is 87651239\",
validated_output=\"My ITIN is <US_ITIN> and my driver's license number is <US_DRIVER_LICENSE>\",
reask=None,
validation_passed=True,
error=None
)
"}} /> + +#### In this way, any PII entity that you want to check for can be passed in through the metadata and masked by Guardrails for your LLM outputs. Of-course, like all other examples, you can integrate this into your own code and workflows through the complete Guard execution. + diff --git a/docs/examples/competitors_check.ipynb b/docs/dist/examples/competitors_check.ipynb similarity index 99% rename from docs/examples/competitors_check.ipynb rename to docs/dist/examples/competitors_check.ipynb index 9c0ce9dd1..8729364ad 100644 --- a/docs/examples/competitors_check.ipynb +++ b/docs/dist/examples/competitors_check.ipynb @@ -82,7 +82,7 @@ " \"JP Morgan\",\n", " \"JP Morgan Chase\",\n", " \"JPMorgan Chase\",\n", - " \"Chase\" \"M1 Finance\",\n", + " \"ChaseM1 Finance\",\n", " \"Stash Financial Incorporated\",\n", " \"Stash\",\n", " \"Tastytrade Incorporated\",\n", @@ -215,9 +215,7 @@ ], "source": [ "# Create the Guard with the CompetitorCheck Validator\n", - "guard = gd.Guard().use(\n", - " CompetitorCheck(competitors=competitors_list, on_fail=\"fix\")\n", - ")\n", + "guard = gd.Guard().use(CompetitorCheck(competitors=competitors_list, on_fail=\"fix\"))\n", "\n", "# Test with a given text\n", "output = guard.parse(\n", diff --git a/docs/dist/examples/competitors_check.md b/docs/dist/examples/competitors_check.md new file mode 100644 index 000000000..4964c0dde --- /dev/null +++ b/docs/dist/examples/competitors_check.md @@ -0,0 +1,121 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +# Check if a competitor is named + +!!! note +To download this example as a Jupyter notebook, click [here](https://github.com/guardrails-ai/guardrails/blob/main/docs/examples/competitors_check.ipynb). + + + + +We first need to install the ```CompetitorCheck``` validator from Guardrails Hub: + + + +```bash +pip install nltk --quiet + guardrails hub install hub://guardrails/competitor_check --quiet +``` + + + +``` + Installing hub://guardrails/competitor_check... + ✅Successfully installed guardrails/competitor_check! + + +``` + + + + +```python +from guardrails.hub import CompetitorCheck +import guardrails as gd +from rich import print +``` + +## Using competitor check validator + +This validator checks LLM output to flag sentences naming one of your competitors and removes those sentences from the final output. When setting on-fail to 'fix' this validator will remove the flagged sentences from the output. You need to provide an extensive list of your competitors' names including all common variations (e.g. JP Morgan, JP Morgan Chase, etc.) the compilation of this list will have an impact on the ultimate outcome of the validation. + + +## Set up a competitors list + + + +```python +# Generate competitors list +competitors_list = [ + "Acorns", + "Citigroup", + "Citi", + "Fidelity Investments", + "Fidelity", + "JP Morgan Chase and company", + "JP Morgan", + "JP Morgan Chase", + "JPMorgan Chase", + "ChaseM1 Finance", + "Stash Financial Incorporated", + "Stash", + "Tastytrade Incorporated", + "Tastytrade", + "ZacksTrade", + "Zacks Trade", +] +``` + +## Set up example text to test the validator + + + +```python +# Define some text to test the validator +text = """\ +In the dynamic realm of finance, several prominent entities have emerged as key players,\ +leaving an indelible mark on the industry. Acorns, a fintech innovator, has revolutionized saving \ +and investing with its user-friendly app. Citigroup, a multinational investment bank, stands as a \ +pillar of financial expertise, offering a wide array of services to clients worldwide. HSBC, with \ +its extensive global network, has become a powerhouse in the banking sector, catering to the needs \ +of millions across different countries. JP Morgan, a venerable institution with a rich history, has \ +established itself as a comprehensive financial powerhouse, providing a diverse range of services \ +from investment banking to asset management. Santander, a Spanish multinational bank, has earned a \ +reputation for its responsible banking practices and customer-centric approach, serving as a trusted \ +financial partner to individuals and businesses alike. Together, Acorns, Citi, HSBC, JP Morgan, and \ +Santander have redefined the financial landscape, shaping the way we save, invest, and manage our \ +money on a global scale.\ +""" +``` + +## Test the validator + +Here, we use the text we defined above as an example llm output (`llm_output`). + +We also set the on_fail behavior to 'fix' so that the validator will remove the sentences that mention competitors from the output. +We can adjust this behavior by changing it to 'reask' or 'throw'. + + + +```python +# Create the Guard with the CompetitorCheck Validator +guard = gd.Guard().use(CompetitorCheck(competitors=competitors_list, on_fail="fix")) + +# Test with a given text +output = guard.parse( + llm_output=text, + metadata={}, +) + +print(output) +``` + + warnings.warn(




ValidationOutcome(
call_id='14233082752',
raw_llm_output='In the dynamic realm of finance, several prominent entities have emerged as key players,leaving
an indelible mark on the industry. Acorns, a fintech innovator, has revolutionized saving and investing with its
user-friendly app. Citigroup, a multinational investment bank, stands as a pillar of financial expertise, offering
a wide array of services to clients worldwide. HSBC, with its extensive global network, has become a powerhouse in
the banking sector, catering to the needs of millions across different countries. JP Morgan, a venerable
institution with a rich history, has established itself as a comprehensive financial powerhouse, providing a
diverse range of services from investment banking to asset management. Santander, a Spanish multinational bank, has
earned a reputation for its responsible banking practices and customer-centric approach, serving as a trusted
financial partner to individuals and businesses alike. Together, Acorns, Citi, HSBC, JP Morgan, and Santander have
redefined the financial landscape, shaping the way we save, invest, and manage our money on a global scale.',
validated_output='In the dynamic realm of finance, several prominent entities have emerged as key
players,leaving an indelible mark on the industry.[COMPETITOR], a fintech innovator, has revolutionized saving and
investing with its user-friendly app.[COMPETITOR], a multinational investment bank, stands as a pillar of financial
expertise, offering a wide array of services to clients worldwide.HSBC, with its extensive global network, has
become a powerhouse in the banking sector, catering to the needs of millions across different
countries.[COMPETITOR], a venerable institution with a rich history, has established itself as a comprehensive
financial powerhouse, providing a diverse range of services from investment banking to asset management.Santander,
a Spanish multinational bank, has earned a reputation for its responsible banking practices and customer-centric
approach, serving as a trusted financial partner to individuals and businesses alike.Together, [COMPETITOR],
[COMPETITOR], HSBC, [COMPETITOR], and Santander have redefined the financial landscape, shaping the way we save,
invest, and manage our money on a global scale.',
reask=None,
validation_passed=True,
error=None
)
"}} /> + + +```python +# See guard history +print(guard.history.last.tree) +``` + +Logs
└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ No messages. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ In the dynamic realm of finance, several prominent entities have emerged as key players,leaving an │
│ indelible mark on the industry. Acorns, a fintech innovator, has revolutionized saving and investing │
│ with its user-friendly app. Citigroup, a multinational investment bank, stands as a pillar of financial │
│ expertise, offering a wide array of services to clients worldwide. HSBC, with its extensive global │
│ network, has become a powerhouse in the banking sector, catering to the needs of millions across │
│ different countries. JP Morgan, a venerable institution with a rich history, has established itself as │
│ a comprehensive financial powerhouse, providing a diverse range of services from investment banking to │
│ asset management. Santander, a Spanish multinational bank, has earned a reputation for its responsible │
│ banking practices and customer-centric approach, serving as a trusted financial partner to individuals │
│ and businesses alike. Together, Acorns, Citi, HSBC, JP Morgan, and Santander have redefined the │
│ financial landscape, shaping the way we save, invest, and manage our money on a global scale. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ 'In the dynamic realm of finance, several prominent entities have emerged as key players,leaving an │
│ indelible mark on the industry.[COMPETITOR], a fintech innovator, has revolutionized saving and │
│ investing with its user-friendly app.[COMPETITOR], a multinational investment bank, stands as a pillar │
│ of financial expertise, offering a wide array of services to clients worldwide.HSBC, with its extensive │
│ global network, has become a powerhouse in the banking sector, catering to the needs of millions across │
│ different countries.[COMPETITOR], a venerable institution with a rich history, has established itself │
│ as a comprehensive financial powerhouse, providing a diverse range of services from investment banking │
│ to asset management.Santander, a Spanish multinational bank, has earned a reputation for its │
│ responsible banking practices and customer-centric approach, serving as a trusted financial partner to │
│ individuals and businesses alike.Together, [COMPETITOR], [COMPETITOR], HSBC, [COMPETITOR], and │
│ Santander have redefined the financial landscape, shaping the way we save, invest, and manage our money │
│ on a global scale.' │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> diff --git a/docs/examples/constrained_decoding.ipynb b/docs/dist/examples/constrained_decoding.ipynb similarity index 88% rename from docs/examples/constrained_decoding.ipynb rename to docs/dist/examples/constrained_decoding.ipynb index 1f82116d3..c05c88a0d 100644 --- a/docs/examples/constrained_decoding.ipynb +++ b/docs/dist/examples/constrained_decoding.ipynb @@ -22,7 +22,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -63,25 +63,41 @@ "from guardrails import Guard\n", "from pydantic import BaseModel\n", "\n", + "# JSONFormer is only compatible with HF Pipelines and HF Models:\n", + "from transformers import pipeline\n", + "\n", + "\n", "class Dog(BaseModel):\n", " name: str\n", " color: str\n", " weight_kg: float\n", "\n", + "\n", "class NewFriends(BaseModel):\n", " dogs: list[Dog]\n", "\n", + "\n", "guard = Guard.for_pydantic(NewFriends, output_formatter=\"jsonformer\")\n", "\n", - "# JSONFormer is only compatible with HF Pipelines and HF Models:\n", - "from transformers import pipeline\n", + "\n", "tiny_llama_pipeline = pipeline(\"text-generation\", \"TinyLlama/TinyLlama-1.1B-Chat-v1.0\")\n", "\n", "# Inference is straightforward:\n", - "response = guard(tiny_llama_pipeline, messages=[{\"role\":\"user\", \"content\":\"Please enjoy this list of good dogs:\"}])\n", - "\n", + "response = guard(\n", + " tiny_llama_pipeline,\n", + " messages=[{\"role\": \"user\", \"content\": \"Please enjoy this list of good dogs:\"}],\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ "# `out` is a dict. Format it as JSON for readability:\n", "import json\n", + "\n", "print(json.dumps(response.validated_output, indent=2))" ] } diff --git a/docs/dist/examples/constrained_decoding.md b/docs/dist/examples/constrained_decoding.md new file mode 100644 index 000000000..7f62078d5 --- /dev/null +++ b/docs/dist/examples/constrained_decoding.md @@ -0,0 +1,87 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +```bash +pip install ipywidgets -q +``` + + + +``` + huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks... + To disable this warning, you can either: + - Avoid using `tokenizers` before the fork if possible + - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false) +``` + + + + + + +```python +from guardrails import Guard +from pydantic import BaseModel + +# JSONFormer is only compatible with HF Pipelines and HF Models: +from transformers import pipeline + + +class Dog(BaseModel): + name: str + color: str + weight_kg: float + + +class NewFriends(BaseModel): + dogs: list[Dog] + + +guard = Guard.for_pydantic(NewFriends, output_formatter="jsonformer") + + +tiny_llama_pipeline = pipeline("text-generation", "TinyLlama/TinyLlama-1.1B-Chat-v1.0") + +# Inference is straightforward: +response = guard( + tiny_llama_pipeline, + messages=[{"role": "user", "content": "Please enjoy this list of good dogs:"}], +) +``` + + + +``` + /Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( + + + { + "dogs": [ + { + "name": "Max", + "color": "red", + "weight_kg": 20.555 + }, + { + "name": "Lola", + "color": "blue", + "weight_kg": 15.234 + }, + { + "name": "Sarah", + "color": "green", + "weight_kg": 10.567 + } + ] + } +``` + + + + +```python +# `out` is a dict. Format it as JSON for readability: +import json + +print(json.dumps(response.validated_output, indent=2)) +``` diff --git a/docs/examples/data/article1.txt b/docs/dist/examples/data/article1.txt similarity index 100% rename from docs/examples/data/article1.txt rename to docs/dist/examples/data/article1.txt diff --git a/docs/examples/data/chase_card_agreement.pdf b/docs/dist/examples/data/chase_card_agreement.pdf similarity index 100% rename from docs/examples/data/chase_card_agreement.pdf rename to docs/dist/examples/data/chase_card_agreement.pdf diff --git a/docs/examples/data/config.py b/docs/dist/examples/data/config.py similarity index 100% rename from docs/examples/data/config.py rename to docs/dist/examples/data/config.py diff --git a/docs/examples/data/twain.txt b/docs/dist/examples/data/twain.txt similarity index 100% rename from docs/examples/data/twain.txt rename to docs/dist/examples/data/twain.txt diff --git a/docs/examples/extracting_entities.ipynb b/docs/dist/examples/extracting_entities.ipynb similarity index 99% rename from docs/examples/extracting_entities.ipynb rename to docs/dist/examples/extracting_entities.ipynb index c9249cef5..80330bc6e 100644 --- a/docs/examples/extracting_entities.ipynb +++ b/docs/dist/examples/extracting_entities.ipynb @@ -151,18 +151,27 @@ "${gr.complete_xml_suffix_v2}\n", "\"\"\"\n", "\n", + "\n", "class Fee(BaseModel):\n", " name: str = Field(validators=[LowerCase(on_fail=\"fix\"), TwoWords(on_fail=\"reask\")])\n", " explanation: str = Field(validators=[OneLine(on_fail=\"noop\")])\n", " value: float = Field(description=\"The fee amount in USD or as a percentage.\")\n", "\n", + "\n", "class AccountFee(BaseModel):\n", " account_type: str = Field(validators=[LowerCase(on_fail=\"fix\")])\n", - " rate: float = Field(description=\"The annual percentage rate (APR) for the account type.\")\n", + " rate: float = Field(\n", + " description=\"The annual percentage rate (APR) for the account type.\"\n", + " )\n", + "\n", "\n", "class CreditCardAgreement(BaseModel):\n", - " fees: list[Fee] = Field(description=\"What fees and charges are associated with my account?\")\n", - " interest_rates: list[AccountFee] = Field(description=\"What are the interest rates offered by the bank on different kinds of accounts and products?\")" + " fees: list[Fee] = Field(\n", + " description=\"What fees and charges are associated with my account?\"\n", + " )\n", + " interest_rates: list[AccountFee] = Field(\n", + " description=\"What are the interest rates offered by the bank on different kinds of accounts and products?\"\n", + " )" ] }, { @@ -228,11 +237,11 @@ "# os.environ[\"OPENAI_API_KEY\"] = \"YOUR_API_KEY\"\n", "\n", "raw_llm_response, validated_response, *rest = guard(\n", - " messages=[{\"role\":\"user\", \"content\": prompt}],\n", + " messages=[{\"role\": \"user\", \"content\": prompt}],\n", " prompt_params={\"document\": content[:6000]},\n", " model=\"gpt-4o-mini\",\n", " max_tokens=2048,\n", - " temperature=0\n", + " temperature=0,\n", ")" ] }, diff --git a/docs/dist/examples/extracting_entities.md b/docs/dist/examples/extracting_entities.md new file mode 100644 index 000000000..559167919 --- /dev/null +++ b/docs/dist/examples/extracting_entities.md @@ -0,0 +1,177 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +```bash +guardrails hub install hub://guardrails/valid_length --quiet +guardrails hub install hub://guardrails/two_words --quiet +guardrails hub install hub://guardrails/valid_range --quiet +guardrails hub install hub://guardrails/lowercase --quiet +guardrails hub install hub://guardrails/one_line --quiet + +%pip install pypdfium2 +``` + + + +``` + Installing hub://guardrails/valid_length... + ✅Successfully installed guardrails/valid_length! + + + Installing hub://guardrails/two_words... + ✅Successfully installed guardrails/two_words! + + + Installing hub://guardrails/valid_range... + ✅Successfully installed guardrails/valid_range! + + + Installing hub://guardrails/lowercase... + ✅Successfully installed guardrails/lowercase! + + + Installing hub://guardrails/one_line... + ✅Successfully installed guardrails/one_line! + + + Requirement already satisfied: pypdfium2 in /Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages (4.30.0) + Note: you may need to restart the kernel to use updated packages. +``` + + + + + +# Extracting entities from a Terms of Service document + +!!! note + To download this example as a Jupyter notebook, click [here](https://github.com/ShreyaR/guardrails/blob/main/docs/examples/extracting_entities.ipynb). + +In this example, we will use Guardrails to extract key information from a Terms-of-Service document. + +## Objective + +We want to extract structured information about all fees and interest rates associated with the Chase credit card. + +## Step 0: Download PDF and load it as string + +To get started, download the document from [here](https://github.com/ShreyaR/guardrails/blob/main/docs/examples/data/chase_card_agreement.pdf) and save it in `data/chase_card_agreement.pdf`. + +Guardrails has some built-in functions to help with common tasks. Here, we will use the `read_pdf` function to load the PDF as a string. + + +```python +import guardrails as gd + +from rich import print + +content = gd.docs_utils.read_pdf("data/chase_card_agreement.pdf") + +print(f"Chase Credit Card Document:\n\n{content[:275]}\n...") +``` + + warnings.warn(\"get_text_range() call with default params will be implicitly redirected to get_text_bounded()\")




Chase Credit Card Document:

2/25/23, 7:59 PM about:blank
about:blank 1/4
PRICING INFORMATION
INTEREST RATES AND INTEREST CHARGES
Purchase Annual
Percentage Rate (APR) 0% Intro APR for the first 18 months that your Account is open.
After that, 19.49%. This APR will vary with the market based on the Prim
...
"}} /> + +## Step 1: Create the Pydantic RAIL model +Here, we request: + +1. A list of the fees associated with the card. We ask for sub-information, each with its own quality criteria and corrective action. +2. A object (i.e. key-value pairs) for the interest. + + +```python +from guardrails.hub import LowerCase, TwoWords, OneLine +from pydantic import BaseModel, Field + +prompt = """ +Given the following document, answer the following questions. If the answer doesn't exist in the document, enter 'None'. + +${document} + +${gr.complete_xml_suffix_v2} +""" + + +class Fee(BaseModel): + name: str = Field(validators=[LowerCase(on_fail="fix"), TwoWords(on_fail="reask")]) + explanation: str = Field(validators=[OneLine(on_fail="noop")]) + value: float = Field(description="The fee amount in USD or as a percentage.") + + +class AccountFee(BaseModel): + account_type: str = Field(validators=[LowerCase(on_fail="fix")]) + rate: float = Field( + description="The annual percentage rate (APR) for the account type." + ) + + +class CreditCardAgreement(BaseModel): + fees: list[Fee] = Field( + description="What fees and charges are associated with my account?" + ) + interest_rates: list[AccountFee] = Field( + description="What are the interest rates offered by the bank on different kinds of accounts and products?" + ) +``` + +## Step 2: Create a `Guard` object with the RAIL Spec + +We create a `gd.Guard` object that will check, validate and correct the output of the LLM. This object: + +1. Enforces the quality criteria specified in the Pydantic RAIL spec. +2. Takes corrective action when the quality criteria are not met. +3. Compiles the schema and type info from the RAIL spec and adds it to the prompt. + + +```python +guard = gd.Guard.for_pydantic(output_class=CreditCardAgreement) +``` + +As we can see, a few formatters weren't supported. These formatters won't be enforced in the output, but this information can still be used to generate a prompt. + +We see the prompt that will be sent to the LLM. The `{document}` is substituted with the user provided value at runtime. + +## Step 3: Wrap the LLM API call with `Guard` + + +```python +# Add your OPENAI_API_KEY as an environment variable if it's not already set +# import os +# os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY" + +raw_llm_response, validated_response, *rest = guard( + messages=[{"role": "user", "content": prompt}], + prompt_params={"document": content[:6000]}, + model="gpt-4o-mini", + max_tokens=2048, + temperature=0, +) +``` + + + +``` + /Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( + /Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( +``` + + + +The `guard` wrapper returns the raw_llm_respose (which is a simple string), and the validated and corrected output (which is a dictionary). + +We can see that the output is a dictionary with the correct schema and types. + + +```python +print(validated_response) +``` + +{
'fees': [
{
'name': 'annual membership',
'explanation': 'No annual membership fee is charged for this account.',
'value': 0.0
},
{
'name': 'my chase',
'explanation': 'Monthly fee of 0% of the amount of each eligible purchase transaction during the 0%
Intro Purchase APR period, then 1.72% after.',
'value': 1.72
},
{
'name': 'balance transfer',
'explanation': 'Intro fee of either $5 or 3% of the amount of each transfer, whichever is greater, on
transfers made within 60 days of account opening. After that: Either $5 or 5% of the amount of each transfer,
whichever is greater.',
'value': 5.0
},
{
'name': 'cash advance',
'explanation': 'Either $10 or 5% of the amount of each transaction, whichever is greater.',
'value': 10.0
},
{
'name': 'foreign transaction',
'explanation': '3% of the amount of each transaction in U.S. dollars.',
'value': 3.0
},
{'name': 'late payment', 'explanation': 'Up to $40 for late payments.', 'value': 40.0},
{'name': 'return payment', 'explanation': 'Up to $40 for returned payments.', 'value': 40.0}
],
'interest_rates': [
{'account_type': 'purchase', 'rate': 0.0},
{'account_type': 'balance transfer', 'rate': 0.0},
{'account_type': 'cash advance', 'rate': 29.49},
{'account_type': 'penalty', 'rate': 29.99},
{'account_type': 'my chase loan', 'rate': 19.49}
]
}
"}} /> + + +```python +guard.history.last.tree +``` + +Logs
├── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
│ │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ │ │ ┃ Role Content ┃ │
│ │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ │ │ user │ │ │
│ │ │ │ │ Given the following document, answer the following questions. If the answer doesn't exist in │ │
│ │ │ │ │ the document, enter 'None'. │ │
│ │ │ │ │ │ │
│ │ │ │ │ 2/25/23, 7:59 PM about:blank │ │
│ │ │ │ │ about:blank 1/4 │ │
│ │ │ │ │ PRICING INFORMATION │ │
│ │ │ │ │ INTEREST RATES AND INTEREST CHARGES │ │
│ │ │ │ │ Purchase Annual │ │
│ │ │ │ │ Percentage Rate (APR) 0% Intro APR for the first 18 months that your Account is open. │ │
│ │ │ │ │ After that, 19.49%. This APR will vary with the market based on the Prime │ │
│ │ │ │ │ Rate. │ │
│ │ │ │ │ a │ │
│ │ │ │ │ My Chase Loan │ │
│ │ │ │ │ SM APR 19.49%. This APR will vary with the market based on the Prime Rate. │ │
│ │ │ │ │ a │ │
│ │ │ │ │ Promotional offers with fixed APRs and varying durations may be available from │ │
│ │ │ │ │ time to time on some accounts. │ │
│ │ │ │ │ Balance Transfer APR 0% Intro APR for the first 18 months that your Account is open. │ │
│ │ │ │ │ After that, 19.49%. This APR will vary with the market based on the Prime │ │
│ │ │ │ │ Rate. │ │
│ │ │ │ │ a │ │
│ │ │ │ │ Cash Advance APR 29.49%. This APR will vary with the market based on the Prime Rate. │ │
│ │ │ │ │ b │ │
│ │ │ │ │ Penalty APR and When │ │
│ │ │ │ │ It Applies │ │
│ │ │ │ │ Up to 29.99%. This APR will vary with the market based on the Prime Rate. │ │
│ │ │ │ │ c │ │
│ │ │ │ │ We may apply the Penalty APR to your account if you: │ │
│ │ │ │ │ fail to make a Minimum Payment by the date and time that it is due; or │ │
│ │ │ │ │ make a payment to us that is returned unpaid. │ │
│ │ │ │ │ How Long Will the Penalty APR Apply?: If we apply the Penalty APR for │ │
│ │ │ │ │ either of these reasons, the Penalty APR could potentially remain in effect │ │
│ │ │ │ │ indefinitely. │ │
│ │ │ │ │ How to Avoid Paying │ │
│ │ │ │ │ Interest on Purchases │ │
│ │ │ │ │ Your due date will be a minimum of 21 days after the close of each billing cycle. │ │
│ │ │ │ │ We will not charge you interest on new purchases if you pay your entire balance │ │
│ │ │ │ │ or Interest Saving Balance by the due date each month. We will begin charging │ │
│ │ │ │ │ interest on balance transfers and cash advances on the transaction date. │ │
│ │ │ │ │ Minimum Interest │ │
│ │ │ │ │ Charge │ │
│ │ │ │ │ None │ │
│ │ │ │ │ Credit Card Tips from │ │
│ │ │ │ │ the Consumer Financial │ │
│ │ │ │ │ Protection Bureau │ │
│ │ │ │ │ To learn more about factors to consider when applying for or using a credit card, │ │
│ │ │ │ │ visit the website of the Consumer Financial Protection Bureau at │ │
│ │ │ │ │ http://www.consumerfinance.gov/learnmore. │ │
│ │ │ │ │ FEES │ │
│ │ │ │ │ Annual Membership │ │
│ │ │ │ │ Fee │ │
│ │ │ │ │ None │ │
│ │ │ │ │ My Chase Plan │ │
│ │ │ │ │ SM Fee │ │
│ │ │ │ │ (fixed finance charge) │ │
│ │ │ │ │ Monthly fee of 0% of the amount of each eligible purchase transaction or │ │
│ │ │ │ │ amount selected to create a My Chase Plan while in the 0% Intro Purchase │ │
│ │ │ │ │ APR period. │ │
│ │ │ │ │ After that, monthly fee of 1.72% of the amount of each eligible purchase │ │
│ │ │ │ │ transaction or amount selected to create a My Chase Plan. The My Chase Plan │ │
│ │ │ │ │ Fee will be determined at the time each My Chase Plan is created and will │ │
│ │ │ │ │ remain the same until the My Chase Plan is paid in full. │ │
│ │ │ │ │ d │ │
│ │ │ │ │ Transaction Fees │ │
│ │ │ │ │ Balance Transfers Intro fee of either $5 or 3% of the amount of each transfer, whichever is │ │
│ │ │ │ │ greater, │ │
│ │ │ │ │ on transfers made within 60 days of account opening. After that: Either $5 or 5% │ │
│ │ │ │ │ of the amount of each transfer, whichever is greater. │ │
│ │ │ │ │ Cash Advances Either $10 or 5% of the amount of each transaction, whichever is greater. │ │
│ │ │ │ │ 2/25/23, 7:59 PM about:blank │ │
│ │ │ │ │ about:blank 2/4 │ │
│ │ │ │ │ Foreign Transactions 3% of the amount of each transaction in U.S. dollars. │ │
│ │ │ │ │ Penalty Fees │ │
│ │ │ │ │ Late Payment Up to $40. │ │
│ │ │ │ │ Over-the-Credit-Limit None │ │
│ │ │ │ │ Return Payment Up to $40. │ │
│ │ │ │ │ Return Check None │ │
│ │ │ │ │ Note: This account may not be eligible for balance transfers. │ │
│ │ │ │ │ Loss of Intro APR: We will end your introductory APR if any required Minimum Payment is 60 │ │
│ │ │ │ │ days late, and │ │
│ │ │ │ │ apply the Penalty APR. │ │
│ │ │ │ │ How We Will Calculate Your Balance: We use the daily balance method (including new │ │
│ │ │ │ │ transactions). │ │
│ │ │ │ │ Prime Rate: Variable APRs are based on the 7.75% Prime Rate as of 2/7/2023. │ │
│ │ │ │ │ aWe add 11.74% to the Prime Rate to determine the Purchase/My Chase Loan/Balance Transfer │ │
│ │ │ │ │ APR. │ │
│ │ │ │ │ Maximum APR 29.99%. │ │
│ │ │ │ │ bWe add 21.74% to the Prime Rate to determine the Cash Advance APR. Maximum APR 29.99%. │ │
│ │ │ │ │ cWe add up to 26.99% to the Prime Rate to determine the Penalty APR. Maximum APR 29.99%. │ │
│ │ │ │ │ dMy Chase Plan Fee: The My Chase Plan Fee is calculated at the time each plan is created and │ │
│ │ │ │ │ is based on │ │
│ │ │ │ │ the amount of each purchase transaction or amount selected to create the plan, the number of │ │
│ │ │ │ │ billing periods │ │
│ │ │ │ │ you choose to pay the balance in full, and other factors. The monthly and aggregate dollar │ │
│ │ │ │ │ amount of your My │ │
│ │ │ │ │ Chase Plan Fee will be disclosed during the activation of each My Chase Plan. │ │
│ │ │ │ │ MILITARY LENDING ACT NOTICE: Federal law provides important protections to members of the │ │
│ │ │ │ │ Armed │ │
│ │ │ │ │ Forces and their dependents relating to extensions of consumer credit. In general, the cost │ │
│ │ │ │ │ of consumer credit │ │
│ │ │ │ │ to a member of the Armed Forces and his or her dependent may not exceed an annual percentage │ │
│ │ │ │ │ rate of 36 │ │
│ │ │ │ │ percent. This rate must include, as applicable to the credit transaction or account: the │ │
│ │ │ │ │ costs associated with │ │
│ │ │ │ │ credit insurance premiums; fees for ancillary products sold in connection with the credit │ │
│ │ │ │ │ transaction; any │ │
│ │ │ │ │ application fee charged (other than certain application fees for specified credit │ │
│ │ │ │ │ transactions or accounts); and │ │
│ │ │ │ │ any participation fee charged (other than certain participation fees for a credit card │ │
│ │ │ │ │ account). To receive this │ │
│ │ │ │ │ information and a description of your payment obligation verbally, please call │ │
│ │ │ │ │ 1-800-235-9978. │ │
│ │ │ │ │ TERMS & CONDITIONS │ │
│ │ │ │ │ Authorization: When you respond to this credit card offer from JPMorgan Chase Bank, N.A., │ │
│ │ │ │ │ Member FDIC, a │ │
│ │ │ │ │ subsidiary of JPMorgan Chase & Co. (\"Chase\", \"we\", or \"us\"), you agree to the following: │ │
│ │ │ │ │ 1. You authorize us to obtain credit bureau reports, employment, and income information │ │
│ │ │ │ │ about you that we │ │
│ │ │ │ │ will use when considering your application for credit. We may obtain and use information │ │
│ │ │ │ │ about your │ │
│ │ │ │ │ accounts with us and others such as Checking, Deposit, Investment, and Utility accounts from │ │
│ │ │ │ │ credit │ │
│ │ │ │ │ bureaus and other entities. You also authorize us to obtain credit bureau reports and any │ │
│ │ │ │ │ other │ │
│ │ │ │ │ information about you in connection with: 1) extensions of credit on your account; 2) the │ │
│ │ │ │ │ administration, │ │
│ │ │ │ │ review or collection of your account; and 3) offering you enhanced or additional products │ │
│ │ │ │ │ and services. If │ │
│ │ │ │ │ you ask, we will tell you the name and address of the credit bureau from which we obtained a │ │
│ │ │ │ │ report │ │
│ │ │ │ │ about you. │ │
│ │ │ │ │ 2. If an account is opened, you will receive a Cardmember Agreement with your card(s). You │ │
│ │ │ │ │ agree to the │ │
│ │ │ │ │ terms of this agreement by: using the account or any card, authorizing their use, or making │ │
│ │ │ │ │ any payment │ │
│ │ │ │ │ on the account. │ │
│ │ │ │ │ 3. By providing your mobile ph │ │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
│ │ │ │ │ Given below is XML that describes the information to extract from this document and the tags │ │
│ │ │ │ │ to extract it into. │ │
│ │ │ │ │ │ │
│ │ │ │ │ <output> │ │
│ │ │ │ │ <list description=\"What fees and charges are associated with my account?\" name=\"fees\" │ │
│ │ │ │ │ required=\"true\"> │ │
│ │ │ │ │ <object required=\"true\"> │ │
│ │ │ │ │ <string format=\"guardrails/lowercase; guardrails/two_words\" name=\"name\" │ │
│ │ │ │ │ required=\"true\"></string> │ │
│ │ │ │ │ <string format=\"guardrails/one_line\" name=\"explanation\" required=\"true\"></string> │ │
│ │ │ │ │ <float description=\"The fee amount in USD or as a percentage.\" name=\"value\" │ │
│ │ │ │ │ required=\"true\"></float> │ │
│ │ │ │ │ </object> │ │
│ │ │ │ │ </list> │ │
│ │ │ │ │ <list description=\"What are the interest rates offered by the bank on different kinds of │ │
│ │ │ │ │ accounts and products?\" name=\"interest_rates\" required=\"true\"> │ │
│ │ │ │ │ <object required=\"true\"> │ │
│ │ │ │ │ <string format=\"guardrails/lowercase\" name=\"account_type\" required=\"true\"></string> │ │
│ │ │ │ │ <float description=\"The annual percentage rate (APR) for the account type.\" │ │
│ │ │ │ │ name=\"rate\" required=\"true\"></float> │ │
│ │ │ │ │ </object> │ │
│ │ │ │ │ </list> │ │
│ │ │ │ │ </output> │ │
│ │ │ │ │ │ │
│ │ │ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in │ │
│ │ │ │ │ JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │
│ │ │ │ │ any types and format requests e.g. requests for lists, objects and specific types. Be │ │
│ │ │ │ │ correct and concise. │ │
│ │ │ │ │ │ │
│ │ │ │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior: │ │
│ │ │ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │ │
│ │ │ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', │ │
│ │ │ │ │ 'STRING TWO', etc.]}` │ │
│ │ │ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer │ │
│ │ │ │ │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': │ │
│ │ │ │ │ 1}}` │ │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
│ │ │ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │
│ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
│ │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ │ │ { │
│ │ │ \"fees\": [ │
│ │ │ { │
│ │ │ \"name\": \"annual membership fee\", │
│ │ │ \"explanation\": \"No annual membership fee is charged for this account.\", │
│ │ │ \"value\": 0.0 │
│ │ │ }, │
│ │ │ { │
│ │ │ \"name\": \"my chase plan fee\", │
│ │ │ \"explanation\": \"Monthly fee of 0% of the amount of each eligible purchase transaction during the │
│ │ │ 0% Intro Purchase APR period, then 1.72% after.\", │
│ │ │ \"value\": 1.72 │
│ │ │ }, │
│ │ │ { │
│ │ │ \"name\": \"balance transfer fee\", │
│ │ │ \"explanation\": \"Intro fee of either $5 or 3% of the amount of each transfer, whichever is │
│ │ │ greater, on transfers made within 60 days of account opening. After that: Either $5 or 5% of the amount │
│ │ │ of each transfer, whichever is greater.\", │
│ │ │ \"value\": 5.0 │
│ │ │ }, │
│ │ │ { │
│ │ │ \"name\": \"cash advance fee\", │
│ │ │ \"explanation\": \"Either $10 or 5% of the amount of each transaction, whichever is greater.\", │
│ │ │ \"value\": 10.0 │
│ │ │ }, │
│ │ │ { │
│ │ │ \"name\": \"foreign transaction fee\", │
│ │ │ \"explanation\": \"3% of the amount of each transaction in U.S. dollars.\", │
│ │ │ \"value\": 3.0 │
│ │ │ }, │
│ │ │ { │
│ │ │ \"name\": \"late payment fee\", │
│ │ │ \"explanation\": \"Up to $40 for late payments.\", │
│ │ │ \"value\": 40.0 │
│ │ │ }, │
│ │ │ { │
│ │ │ \"name\": \"return payment fee\", │
│ │ │ \"explanation\": \"Up to $40 for returned payments.\", │
│ │ │ \"value\": 40.0 │
│ │ │ } │
│ │ │ ], │
│ │ │ \"interest_rates\": [ │
│ │ │ { │
│ │ │ \"account_type\": \"purchase\", │
│ │ │ \"rate\": 0.0 │
│ │ │ }, │
│ │ │ { │
│ │ │ \"account_type\": \"balance transfer\", │
│ │ │ \"rate\": 0.0 │
│ │ │ }, │
│ │ │ { │
│ │ │ \"account_type\": \"cash advance\", │
│ │ │ \"rate\": 29.49 │
│ │ │ }, │
│ │ │ { │
│ │ │ \"account_type\": \"penalty\", │
│ │ │ \"rate\": 29.99 │
│ │ │ }, │
│ │ │ { │
│ │ │ \"account_type\": \"my chase loan\", │
│ │ │ \"rate\": 19.49 │
│ │ │ } │
│ │ │ ] │
│ │ │ } │
│ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
│ │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ │ │ { │
│ │ │ 'fees': [ │
│ │ │ { │
│ │ │ 'name': FieldReAsk( │
│ │ │ incorrect_value='annual membership fee', │
│ │ │ fail_results=[ │
│ │ │ FailResult( │
│ │ │ outcome='fail', │
│ │ │ error_message='Value must be exactly two words', │
│ │ │ fix_value='annual membership', │
│ │ │ error_spans=None, │
│ │ │ metadata=None, │
│ │ │ validated_chunk=None │
│ │ │ ) │
│ │ │ ], │
│ │ │ additional_properties={}, │
│ │ │ path=['fees', 0, 'name'] │
│ │ │ ), │
│ │ │ 'explanation': 'No annual membership fee is charged for this account.', │
│ │ │ 'value': 0.0 │
│ │ │ }, │
│ │ │ { │
│ │ │ 'name': FieldReAsk( │
│ │ │ incorrect_value='my chase plan fee', │
│ │ │ fail_results=[ │
│ │ │ FailResult( │
│ │ │ outcome='fail', │
│ │ │ error_message='Value must be exactly two words', │
│ │ │ fix_value='my chase', │
│ │ │ error_spans=None, │
│ │ │ metadata=None, │
│ │ │ validated_chunk=None │
│ │ │ ) │
│ │ │ ], │
│ │ │ additional_properties={}, │
│ │ │ path=['fees', 1, 'name'] │
│ │ │ ), │
│ │ │ 'explanation': 'Monthly fee of 0% of the amount of each eligible purchase transaction │
│ │ │ during the 0% Intro Purchase APR period, then 1.72% after.', │
│ │ │ 'value': 1.72 │
│ │ │ }, │
│ │ │ { │
│ │ │ 'name': FieldReAsk( │
│ │ │ incorrect_value='balance transfer fee', │
│ │ │ fail_results=[ │
│ │ │ FailResult( │
│ │ │ outcome='fail', │
│ │ │ error_message='Value must be exactly two words', │
│ │ │ fix_value='balance transfer', │
│ │ │ error_spans=None, │
│ │ │ metadata=None, │
│ │ │ validated_chunk=None │
│ │ │ ) │
│ │ │ ], │
│ │ │ additional_properties={}, │
│ │ │ path=['fees', 2, 'name'] │
│ │ │ ), │
│ │ │ 'explanation': 'Intro fee of either $5 or 3% of the amount of each transfer, whichever is │
│ │ │ greater, on transfers made within 60 days of account opening. After that: Either $5 or 5% of the amount │
│ │ │ of each transfer, whichever is greater.', │
│ │ │ 'value': 5.0 │
│ │ │ }, │
│ │ │ { │
│ │ │ 'name': FieldReAsk( │
│ │ │ incorrect_value='cash advance fee', │
│ │ │ fail_results=[ │
│ │ │ FailResult( │
│ │ │ outcome='fail', │
│ │ │ error_message='Value must be exactly two words', │
│ │ │ fix_value='cash advance', │
│ │ │ error_spans=None, │
│ │ │ metadata=None, │
│ │ │ validated_chunk=None │
│ │ │ ) │
│ │ │ ], │
│ │ │ additional_properties={}, │
│ │ │ path=['fees', 3, 'name'] │
│ │ │ ), │
│ │ │ 'explanation': 'Either $10 or 5% of the amount of each transaction, whichever is greater.', │
│ │ │ 'value': 10.0 │
│ │ │ }, │
│ │ │ { │
│ │ │ 'name': FieldReAsk( │
│ │ │ incorrect_value='foreign transaction fee', │
│ │ │ fail_results=[ │
│ │ │ FailResult( │
│ │ │ outcome='fail', │
│ │ │ error_message='Value must be exactly two words', │
│ │ │ fix_value='foreign transaction', │
│ │ │ error_spans=None, │
│ │ │ metadata=None, │
│ │ │ validated_chunk=None │
│ │ │ ) │
│ │ │ ], │
│ │ │ additional_properties={}, │
│ │ │ path=['fees', 4, 'name'] │
│ │ │ ), │
│ │ │ 'explanation': '3% of the amount of each transaction in U.S. dollars.', │
│ │ │ 'value': 3.0 │
│ │ │ }, │
│ │ │ { │
│ │ │ 'name': FieldReAsk( │
│ │ │ incorrect_value='late payment fee', │
│ │ │ fail_results=[ │
│ │ │ FailResult( │
│ │ │ outcome='fail', │
│ │ │ error_message='Value must be exactly two words', │
│ │ │ fix_value='late payment', │
│ │ │ error_spans=None, │
│ │ │ metadata=None, │
│ │ │ validated_chunk=None │
│ │ │ ) │
│ │ │ ], │
│ │ │ additional_properties={}, │
│ │ │ path=['fees', 5, 'name'] │
│ │ │ ), │
│ │ │ 'explanation': 'Up to $40 for late payments.', │
│ │ │ 'value': 40.0 │
│ │ │ }, │
│ │ │ { │
│ │ │ 'name': FieldReAsk( │
│ │ │ incorrect_value='return payment fee', │
│ │ │ fail_results=[ │
│ │ │ FailResult( │
│ │ │ outcome='fail', │
│ │ │ error_message='Value must be exactly two words', │
│ │ │ fix_value='return payment', │
│ │ │ error_spans=None, │
│ │ │ metadata=None, │
│ │ │ validated_chunk=None │
│ │ │ ) │
│ │ │ ], │
│ │ │ additional_properties={}, │
│ │ │ path=['fees', 6, 'name'] │
│ │ │ ), │
│ │ │ 'explanation': 'Up to $40 for returned payments.', │
│ │ │ 'value': 40.0 │
│ │ │ } │
│ │ │ ], │
│ │ │ 'interest_rates': [ │
│ │ │ {'account_type': 'purchase', 'rate': 0.0}, │
│ │ │ {'account_type': 'balance transfer', 'rate': 0.0}, │
│ │ │ {'account_type': 'cash advance', 'rate': 29.49}, │
│ │ │ {'account_type': 'penalty', 'rate': 29.99}, │
│ │ │ {'account_type': 'my chase loan', 'rate': 19.49} │
│ │ │ ] │
│ │ │ } │
│ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
│ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
└── ╭────────────────────────────────────────────────── Step 1 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ ┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ ┃ Role Content ┃ │
│ ┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ system │ │ │
│ │ │ You are a helpful assistant only capable of communicating with valid JSON, and no other │ │
│ │ │ text. │ │
│ │ │ │ │
│ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field │ │
│ │ │ in JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, │ │
│ │ │ including any types and format requests e.g. requests for lists, objects and specific │ │
│ │ │ types. Be correct and concise. If you are unsure anywhere, enter `null`. │ │
│ │ │ │ │
│ │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior: │ │
│ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │ │
│ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', │ │
│ │ │ 'STRING TWO', etc.]}` │ │
│ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer │ │
│ │ │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': │ │
│ │ │ 1}}` │ │
│ │ │ │ │
│ ├────────┼────────────────────────────────────────────────────────────────────────────────────────────┤ │
│ │ user │ │ │
│ │ │ I was given the following JSON response, which had problems due to incorrect values. │ │
│ │ │ │ │
│ │ │ { │ │
│ │ │ \"fees\": [ │ │
│ │ │ { │ │
│ │ │ \"name\": { │ │
│ │ │ \"incorrect_value\": \"annual membership fee\", │ │
│ │ │ \"error_messages\": [ │ │
│ │ │ \"Value must be exactly two words\" │ │
│ │ │ ] │ │
│ │ │ }, │ │
│ │ │ \"explanation\": \"No annual membership fee is charged for this account.\", │ │
│ │ │ \"value\": 0.0 │ │
│ │ │ }, │ │
│ │ │ { │ │
│ │ │ \"name\": { │ │
│ │ │ \"incorrect_value\": \"my chase plan fee\", │ │
│ │ │ \"error_messages\": [ │ │
│ │ │ \"Value must be exactly two words\" │ │
│ │ │ ] │ │
│ │ │ }, │ │
│ │ │ \"explanation\": \"Monthly fee of 0% of the amount of each eligible purchase │ │
│ │ │ transaction during the 0% Intro Purchase APR period, then 1.72% after.\", │ │
│ │ │ \"value\": 1.72 │ │
│ │ │ }, │ │
│ │ │ { │ │
│ │ │ \"name\": { │ │
│ │ │ \"incorrect_value\": \"balance transfer fee\", │ │
│ │ │ \"error_messages\": [ │ │
│ │ │ \"Value must be exactly two words\" │ │
│ │ │ ] │ │
│ │ │ }, │ │
│ │ │ \"explanation\": \"Intro fee of either $5 or 3% of the amount of each transfer, │ │
│ │ │ whichever is greater, on transfers made within 60 days of account opening. After that: │ │
│ │ │ Either $5 or 5% of the amount of each transfer, whichever is greater.\", │ │
│ │ │ \"value\": 5.0 │ │
│ │ │ }, │ │
│ │ │ { │ │
│ │ │ \"name\": { │ │
│ │ │ \"incorrect_value\": \"cash advance fee\", │ │
│ │ │ \"error_messages\": [ │ │
│ │ │ \"Value must be exactly two words\" │ │
│ │ │ ] │ │
│ │ │ }, │ │
│ │ │ \"explanation\": \"Either $10 or 5% of the amount of each transaction, whichever is │ │
│ │ │ greater.\", │ │
│ │ │ \"value\": 10.0 │ │
│ │ │ }, │ │
│ │ │ { │ │
│ │ │ \"name\": { │ │
│ │ │ \"incorrect_value\": \"foreign transaction fee\", │ │
│ │ │ \"error_messages\": [ │ │
│ │ │ \"Value must be exactly two words\" │ │
│ │ │ ] │ │
│ │ │ }, │ │
│ │ │ \"explanation\": \"3% of the amount of each transaction in U.S. dollars.\", │ │
│ │ │ \"value\": 3.0 │ │
│ │ │ }, │ │
│ │ │ { │ │
│ │ │ \"name\": { │ │
│ │ │ \"incorrect_value\": \"late payment fee\", │ │
│ │ │ \"error_messages\": [ │ │
│ │ │ \"Value must be exactly two words\" │ │
│ │ │ ] │ │
│ │ │ }, │ │
│ │ │ \"explanation\": \"Up to $40 for late payments.\", │ │
│ │ │ \"value\": 40.0 │ │
│ │ │ }, │ │
│ │ │ { │ │
│ │ │ \"name\": { │ │
│ │ │ \"incorrect_value\": \"return payment fee\", │ │
│ │ │ \"error_messages\": [ │ │
│ │ │ \"Value must be exactly two words\" │ │
│ │ │ ] │ │
│ │ │ }, │ │
│ │ │ \"explanation\": \"Up to $40 for returned payments.\", │ │
│ │ │ \"value\": 40.0 │ │
│ │ │ } │ │
│ │ │ ], │ │
│ │ │ \"interest_rates\": [ │ │
│ │ │ { │ │
│ │ │ \"account_type\": \"purchase\", │ │
│ │ │ \"rate\": 0.0 │ │
│ │ │ }, │ │
│ │ │ { │ │
│ │ │ \"account_type\": \"balance transfer\", │ │
│ │ │ \"rate\": 0.0 │ │
│ │ │ }, │ │
│ │ │ { │ │
│ │ │ \"account_type\": \"cash advance\", │ │
│ │ │ \"rate\": 29.49 │ │
│ │ │ }, │ │
│ │ │ { │ │
│ │ │ \"account_type\": \"penalty\", │ │
│ │ │ \"rate\": 29.99 │ │
│ │ │ }, │ │
│ │ │ { │ │
│ │ │ \"account_type\": \"my chase loan\", │ │
│ │ │ \"rate\": 19.49 │ │
│ │ │ } │ │
│ │ │ ] │ │
│ │ │ } │ │
│ │ │ │ │
│ │ │ Help me correct the incorrect values based on the given error messages. │ │
│ │ │ │ │
│ │ │ Given below is XML that describes the information to extract from this document and the │ │
│ │ │ tags to extract it into. │ │
│ │ │ │ │
│ │ │ <output> │ │
│ │ │ <list description=\"What fees and charges are associated with my account?\" name=\"fees\" │ │
│ │ │ required=\"true\"> │ │
│ │ │ <object required=\"true\"> │ │
│ │ │ <string format=\"guardrails/lowercase; guardrails/two_words\" name=\"name\" │ │
│ │ │ required=\"true\"></string> │ │
│ │ │ <string format=\"guardrails/one_line\" name=\"explanation\" required=\"true\"></string> │ │
│ │ │ <float description=\"The fee amount in USD or as a percentage.\" name=\"value\" │ │
│ │ │ required=\"true\"></float> │ │
│ │ │ </object> │ │
│ │ │ </list> │ │
│ │ │ <list description=\"What are the interest rates offered by the bank on different kinds of │ │
│ │ │ accounts and products?\" name=\"interest_rates\" required=\"true\"> │ │
│ │ │ <object required=\"true\"> │ │
│ │ │ <string format=\"guardrails/lowercase\" name=\"account_type\" required=\"true\"></string> │ │
│ │ │ <float description=\"The annual percentage rate (APR) for the account type.\" │ │
│ │ │ name=\"rate\" required=\"true\"></float> │ │
│ │ │ </object> │ │
│ │ │ </list> │ │
│ │ │ </output> │ │
│ │ │ │ │
│ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field │ │
│ │ │ in JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, │ │
│ │ │ including any types and format requests e.g. requests for lists, objects and specific │ │
│ │ │ types. Be correct and concise. If you are unsure anywhere, enter `null`. │ │
│ │ │ │ │
│ └────────┴────────────────────────────────────────────────────────────────────────────────────────────┘ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ { │
│ \"fees\": [ │
│ { │
│ \"name\": \"annual membership\", │
│ \"explanation\": \"No annual membership fee is charged for this account.\", │
│ \"value\": 0.0 │
│ }, │
│ { │
│ \"name\": \"my chase\", │
│ \"explanation\": \"Monthly fee of 0% of the amount of each eligible purchase transaction during the │
│ 0% Intro Purchase APR period, then 1.72% after.\", │
│ \"value\": 1.72 │
│ }, │
│ { │
│ \"name\": \"balance transfer\", │
│ \"explanation\": \"Intro fee of either $5 or 3% of the amount of each transfer, whichever is │
│ greater, on transfers made within 60 days of account opening. After that: Either $5 or 5% of the amount │
│ of each transfer, whichever is greater.\", │
│ \"value\": 5.0 │
│ }, │
│ { │
│ \"name\": \"cash advance\", │
│ \"explanation\": \"Either $10 or 5% of the amount of each transaction, whichever is greater.\", │
│ \"value\": 10.0 │
│ }, │
│ { │
│ \"name\": \"foreign transaction\", │
│ \"explanation\": \"3% of the amount of each transaction in U.S. dollars.\", │
│ \"value\": 3.0 │
│ }, │
│ { │
│ \"name\": \"late payment\", │
│ \"explanation\": \"Up to $40 for late payments.\", │
│ \"value\": 40.0 │
│ }, │
│ { │
│ \"name\": \"return payment\", │
│ \"explanation\": \"Up to $40 for returned payments.\", │
│ \"value\": 40.0 │
│ } │
│ ], │
│ \"interest_rates\": [ │
│ { │
│ \"account_type\": \"purchase\", │
│ \"rate\": 0.0 │
│ }, │
│ { │
│ \"account_type\": \"balance transfer\", │
│ \"rate\": 0.0 │
│ }, │
│ { │
│ \"account_type\": \"cash advance\", │
│ \"rate\": 29.49 │
│ }, │
│ { │
│ \"account_type\": \"penalty\", │
│ \"rate\": 29.99 │
│ }, │
│ { │
│ \"account_type\": \"my chase loan\", │
│ \"rate\": 19.49 │
│ } │
│ ] │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ { │
│ 'fees': [ │
│ { │
│ 'name': 'annual membership', │
│ 'explanation': 'No annual membership fee is charged for this account.', │
│ 'value': 0.0 │
│ }, │
│ { │
│ 'name': 'my chase', │
│ 'explanation': 'Monthly fee of 0% of the amount of each eligible purchase transaction │
│ during the 0% Intro Purchase APR period, then 1.72% after.', │
│ 'value': 1.72 │
│ }, │
│ { │
│ 'name': 'balance transfer', │
│ 'explanation': 'Intro fee of either $5 or 3% of the amount of each transfer, whichever is │
│ greater, on transfers made within 60 days of account opening. After that: Either $5 or 5% of the amount │
│ of each transfer, whichever is greater.', │
│ 'value': 5.0 │
│ }, │
│ { │
│ 'name': 'cash advance', │
│ 'explanation': 'Either $10 or 5% of the amount of each transaction, whichever is greater.', │
│ 'value': 10.0 │
│ }, │
│ { │
│ 'name': 'foreign transaction', │
│ 'explanation': '3% of the amount of each transaction in U.S. dollars.', │
│ 'value': 3.0 │
│ }, │
│ { │
│ 'name': 'late payment', │
│ 'explanation': 'Up to $40 for late payments.', │
│ 'value': 40.0 │
│ }, │
│ { │
│ 'name': 'return payment', │
│ 'explanation': 'Up to $40 for returned payments.', │
│ 'value': 40.0 │
│ } │
│ ], │
│ 'interest_rates': [ │
│ {'account_type': 'purchase', 'rate': 0.0}, │
│ {'account_type': 'balance transfer', 'rate': 0.0}, │
│ {'account_type': 'cash advance', 'rate': 29.49}, │
│ {'account_type': 'penalty', 'rate': 29.99}, │
│ {'account_type': 'my chase loan', 'rate': 19.49} │
│ ] │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> diff --git a/docs/examples/generate_structured_data.ipynb b/docs/dist/examples/generate_structured_data.ipynb similarity index 99% rename from docs/examples/generate_structured_data.ipynb rename to docs/dist/examples/generate_structured_data.ipynb index 1b5485107..16baabac6 100644 --- a/docs/examples/generate_structured_data.ipynb +++ b/docs/dist/examples/generate_structured_data.ipynb @@ -67,7 +67,6 @@ "source": [ "from pydantic import BaseModel, Field\n", "from guardrails.hub import ValidLength, TwoWords, ValidRange\n", - "from datetime import date\n", "from typing import List\n", "\n", "prompt = \"\"\"\n", @@ -76,21 +75,23 @@ "${gr.complete_xml_suffix}\n", "\"\"\"\n", "\n", + "\n", "class Order(BaseModel):\n", " user_id: str = Field(description=\"The user's id.\")\n", " user_name: str = Field(\n", " description=\"The user's first name and last name\",\n", - " validators=[TwoWords(on_fail=\"noop\")]\n", + " validators=[TwoWords(on_fail=\"noop\")],\n", " )\n", " num_orders: int = Field(\n", " description=\"The number of orders the user has placed\",\n", - " validators=[ValidRange(0, 50, on_fail=\"noop\")]\n", + " validators=[ValidRange(0, 50, on_fail=\"noop\")],\n", " )\n", "\n", + "\n", "class Orders(BaseModel):\n", " user_orders: List[Order] = Field(\n", " description=\"Generate a list of user, and how many orders they have placed in the past.\",\n", - " validators=[ValidLength(10, 10, on_fail=\"noop\")]\n", + " validators=[ValidLength(10, 10, on_fail=\"noop\")],\n", " )" ] }, @@ -155,10 +156,10 @@ "\n", "res = guard(\n", " model=\"gpt-4o\",\n", - " messages=[{\"role\":\"user\", \"content\": prompt}],\n", + " messages=[{\"role\": \"user\", \"content\": prompt}],\n", " max_tokens=2048,\n", - " temperature=0\n", - ")\n" + " temperature=0,\n", + ")" ] }, { diff --git a/docs/dist/examples/generate_structured_data.md b/docs/dist/examples/generate_structured_data.md new file mode 100644 index 000000000..0673cfda6 --- /dev/null +++ b/docs/dist/examples/generate_structured_data.md @@ -0,0 +1,156 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +```bash +guardrails hub install hub://guardrails/valid_length --quiet +guardrails hub install hub://guardrails/two_words --quiet +guardrails hub install hub://guardrails/valid_range --quiet +``` + + + +``` + Installing hub://guardrails/valid_length... + ✅Successfully installed guardrails/valid_length! + + + Installing hub://guardrails/two_words... + ✅Successfully installed guardrails/two_words! + + + Installing hub://guardrails/valid_range... + ✅Successfully installed guardrails/valid_range! + + +``` + + + + + +# Generating Structured Synthetic Data + +!!! note + To download this tutorial as a Jupyter notebook, click [here](https://github.com/ShreyaR/guardrails/blob/main/docs/examples/generate_structured_data.ipynb). + +In this example, we'll generate structured dummy data for a `pandas` dataframe. + +We make the assumption that: + +1. We don't need any external libraries that are not already installed in the environment. +2. We are able to execute the code in the environment. + +## Objective + +We want to generate structured synthetic data, where each column has a specific data type. All rows in the dataset must respect the column data types. Additionally, we have some more constraints we want the data to respect: + +1. There should be exactly 10 rows in the dataset. +2. Each user should have a first name and a last name. +3. The number of orders associated with each user should be between 0 and 50. +4. Each user should have a most recent order date. + +## Step 1: Generating Pydantic `RAIL` Spec + + +```python +from pydantic import BaseModel, Field +from guardrails.hub import ValidLength, TwoWords, ValidRange +from typing import List + +prompt = """ +Generate a dataset of fake user orders. Each row of the dataset should be valid. + +${gr.complete_xml_suffix} +""" + + +class Order(BaseModel): + user_id: str = Field(description="The user's id.") + user_name: str = Field( + description="The user's first name and last name", + validators=[TwoWords(on_fail="noop")], + ) + num_orders: int = Field( + description="The number of orders the user has placed", + validators=[ValidRange(0, 50, on_fail="noop")], + ) + + +class Orders(BaseModel): + user_orders: List[Order] = Field( + description="Generate a list of user, and how many orders they have placed in the past.", + validators=[ValidLength(10, 10, on_fail="noop")], + ) +``` + +## Step 2: Create a `Guard` object with the RAIL Spec + +We create a `gd.Guard` object that will check, validate and correct the generated code. This object: + +1. Enforces the quality criteria specified in the RAIL spec (i.e. bug free code). +2. Takes corrective action when the quality criteria are not met (i.e. reasking the LLM). +3. Compiles the schema and type info from the RAIL spec and adds it to the prompt. + + +```python +import guardrails as gd + +from rich import print +``` + + +```python +guard = gd.Guard.for_pydantic(output_class=Orders) +``` + +## Step 3: Wrap the LLM API call with `Guard` + + +```python +# Add your OPENAI_API_KEY as an environment variable if it's not already set +# import os +# os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY" + +res = guard( + model="gpt-4o", + messages=[{"role": "user", "content": prompt}], + max_tokens=2048, + temperature=0, +) +``` + + + +``` + /Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( +``` + + + +The `Guard` object compiles the output schema and adds it to the prompt. We can see the final prompt below: + + +```python +print(guard.history.last.iterations.last.inputs.messages[0]["content"]) +``` + +
Generate a dataset of fake user orders. Each row of the dataset should be valid.


Given below is XML that describes the information to extract from this document and the tags to extract it into.

<output>
<list description=\"Generate a list of user, and how many orders they have placed in the past.\"
format=\"guardrails/valid_length: 10 10\" name=\"user_orders\" required=\"true\">
<object format=\"guardrails/valid_length: 10 10\" required=\"true\">
<string description=\"The user's id.\" name=\"user_id\" required=\"true\"></string>
<string description=\"The user's first name and last name\" format=\"guardrails/two_words\" name=\"user_name\"
required=\"true\"></string>
<integer description=\"The number of orders the user has placed\" format=\"guardrails/valid_range: 0 50\"
name=\"num_orders\" required=\"true\"></integer>
</object>
</list>
</output>

ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the `name`
attribute of the corresponding XML, and the value is of the type specified by the corresponding XML's tag. The JSON
MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and
specific types. Be correct and concise. If you are unsure anywhere, enter `null`.

Here are examples of simple (XML, JSON) pairs that show the expected behavior:
- `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`
- `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', 'STRING TWO', etc.]}`
- `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" format=\"1-indexed\"
/></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`


"}} /> + + +```python +print(res.raw_llm_output) +res.validated_output +``` + +```json
{
\"user_orders\": [
{
\"user_id\": \"U001\",
\"user_name\": \"John Doe\",
\"num_orders\": 12
},
{
\"user_id\": \"U002\",
\"user_name\": \"Jane Smith\",
\"num_orders\": 8
},
{
\"user_id\": \"U003\",
\"user_name\": \"Alice Johnson\",
\"num_orders\": 25
},
{
\"user_id\": \"U004\",
\"user_name\": \"Bob Brown\",
\"num_orders\": 15
},
{
\"user_id\": \"U005\",
\"user_name\": \"Charlie Davis\",
\"num_orders\": 30
},
{
\"user_id\": \"U006\",
\"user_name\": \"Emily White\",
\"num_orders\": 5
},
{
\"user_id\": \"U007\",
\"user_name\": \"Frank Harris\",
\"num_orders\": 20
},
{
\"user_id\": \"U008\",
\"user_name\": \"Grace Lee\",
\"num_orders\": 18
},
{
\"user_id\": \"U009\",
\"user_name\": \"Henry Clark\",
\"num_orders\": 22
},
{
\"user_id\": \"U010\",
\"user_name\": \"Ivy Walker\",
\"num_orders\": 10
}
]
}
```

```





{'user_orders': [{'user_id': 'U001',
'user_name': 'John Doe',
'num_orders': 12},
{'user_id': 'U002', 'user_name': 'Jane Smith', 'num_orders': 8},
{'user_id': 'U003', 'user_name': 'Alice Johnson', 'num_orders': 25},
{'user_id': 'U004', 'user_name': 'Bob Brown', 'num_orders': 15},
{'user_id': 'U005', 'user_name': 'Charlie Davis', 'num_orders': 30},
{'user_id': 'U006', 'user_name': 'Emily White', 'num_orders': 5},
{'user_id': 'U007', 'user_name': 'Frank Harris', 'num_orders': 20},
{'user_id': 'U008', 'user_name': 'Grace Lee', 'num_orders': 18},
{'user_id': 'U009', 'user_name': 'Henry Clark', 'num_orders': 22},
{'user_id': 'U010', 'user_name': 'Ivy Walker', 'num_orders': 10}]}"}} /> + +Running the cell above returns: +1. The raw LLM text output as a single string. +2. A dictionary where the key `user_orders` key contains a list of dictionaries, where each dictionary represents a row in the dataframe. + + +```python +print(guard.history.last.tree) +``` + +Logs
└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ ┃ Role Content ┃ │
│ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ user │ │ │
│ │ │ Generate a dataset of fake user orders. Each row of the dataset should be valid. │ │
│ │ │ │ │
│ │ │ │ │
│ │ │ Given below is XML that describes the information to extract from this document and the tags │ │
│ │ │ to extract it into. │ │
│ │ │ │ │
│ │ │ <output> │ │
│ │ │ <list description=\"Generate a list of user, and how many orders they have placed in the │ │
│ │ │ past.\" format=\"guardrails/valid_length: 10 10\" name=\"user_orders\" required=\"true\"> │ │
│ │ │ <object format=\"guardrails/valid_length: 10 10\" required=\"true\"> │ │
│ │ │ <string description=\"The user's id.\" name=\"user_id\" required=\"true\"></string> │ │
│ │ │ <string description=\"The user's first name and last name\" │ │
│ │ │ format=\"guardrails/two_words\" name=\"user_name\" required=\"true\"></string> │ │
│ │ │ <integer description=\"The number of orders the user has placed\" │ │
│ │ │ format=\"guardrails/valid_range: 0 50\" name=\"num_orders\" required=\"true\"></integer> │ │
│ │ │ </object> │ │
│ │ │ </list> │ │
│ │ │ </output> │ │
│ │ │ │ │
│ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in │ │
│ │ │ JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │
│ │ │ any types and format requests e.g. requests for lists, objects and specific types. Be │ │
│ │ │ correct and concise. If you are unsure anywhere, enter `null`. │ │
│ │ │ │ │
│ │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior: │ │
│ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │ │
│ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', │ │
│ │ │ 'STRING TWO', etc.]}` │ │
│ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer │ │
│ │ │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': │ │
│ │ │ 1}}` │ │
│ │ │ │ │
│ │ │ │ │
│ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ ```json │
│ { │
│ \"user_orders\": [ │
│ { │
│ \"user_id\": \"U001\", │
│ \"user_name\": \"John Doe\", │
│ \"num_orders\": 12 │
│ }, │
│ { │
│ \"user_id\": \"U002\", │
│ \"user_name\": \"Jane Smith\", │
│ \"num_orders\": 8 │
│ }, │
│ { │
│ \"user_id\": \"U003\", │
│ \"user_name\": \"Alice Johnson\", │
│ \"num_orders\": 25 │
│ }, │
│ { │
│ \"user_id\": \"U004\", │
│ \"user_name\": \"Bob Brown\", │
│ \"num_orders\": 15 │
│ }, │
│ { │
│ \"user_id\": \"U005\", │
│ \"user_name\": \"Charlie Davis\", │
│ \"num_orders\": 30 │
│ }, │
│ { │
│ \"user_id\": \"U006\", │
│ \"user_name\": \"Emily White\", │
│ \"num_orders\": 5 │
│ }, │
│ { │
│ \"user_id\": \"U007\", │
│ \"user_name\": \"Frank Harris\", │
│ \"num_orders\": 20 │
│ }, │
│ { │
│ \"user_id\": \"U008\", │
│ \"user_name\": \"Grace Lee\", │
│ \"num_orders\": 18 │
│ }, │
│ { │
│ \"user_id\": \"U009\", │
│ \"user_name\": \"Henry Clark\", │
│ \"num_orders\": 22 │
│ }, │
│ { │
│ \"user_id\": \"U010\", │
│ \"user_name\": \"Ivy Walker\", │
│ \"num_orders\": 10 │
│ } │
│ ] │
│ } │
│ ``` │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ { │
│ 'user_orders': [ │
│ {'user_id': 'U001', 'user_name': 'John Doe', 'num_orders': 12}, │
│ {'user_id': 'U002', 'user_name': 'Jane Smith', 'num_orders': 8}, │
│ {'user_id': 'U003', 'user_name': 'Alice Johnson', 'num_orders': 25}, │
│ {'user_id': 'U004', 'user_name': 'Bob Brown', 'num_orders': 15}, │
│ {'user_id': 'U005', 'user_name': 'Charlie Davis', 'num_orders': 30}, │
│ {'user_id': 'U006', 'user_name': 'Emily White', 'num_orders': 5}, │
│ {'user_id': 'U007', 'user_name': 'Frank Harris', 'num_orders': 20}, │
│ {'user_id': 'U008', 'user_name': 'Grace Lee', 'num_orders': 18}, │
│ {'user_id': 'U009', 'user_name': 'Henry Clark', 'num_orders': 22}, │
│ {'user_id': 'U010', 'user_name': 'Ivy Walker', 'num_orders': 10} │
│ ] │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> diff --git a/docs/examples/generate_structured_data_cohere.ipynb b/docs/dist/examples/generate_structured_data_cohere.ipynb similarity index 99% rename from docs/examples/generate_structured_data_cohere.ipynb rename to docs/dist/examples/generate_structured_data_cohere.ipynb index 22007ad92..b5f72cb20 100644 --- a/docs/examples/generate_structured_data_cohere.ipynb +++ b/docs/dist/examples/generate_structured_data_cohere.ipynb @@ -146,7 +146,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "42766922-14d0-4b5e-853a-23f05b896a09", "metadata": {}, "outputs": [ @@ -171,7 +171,7 @@ "\n", "raw_llm_response, validated_response, *rest = guard(\n", " messages=[{\"role\": \"user\", \"content\": prompt}],\n", - " model=\"command-r-08-2024\",\n", + " model=\"command-r\",\n", " max_tokens=1024,\n", " temperature=0.3,\n", ")" diff --git a/docs/dist/examples/generate_structured_data_cohere.md b/docs/dist/examples/generate_structured_data_cohere.md new file mode 100644 index 000000000..5a6d2f7ef --- /dev/null +++ b/docs/dist/examples/generate_structured_data_cohere.md @@ -0,0 +1,134 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +Define our prompt + + + + +```python +prompt = """ +Generate a dataset of fake user orders. Each row of the dataset should be valid. The format should not be a list, it should be a JSON object. +${gr.complete_xml_suffix} + +an example of output may look like this: +{ + "user_orders": [{ │ │ + "user_id": 1, + "user_name": "John Mcdonald", + "num_orders": 6 + }] +} + +""" +``` + +Install validators + + +```bash +guardrails hub install hub://guardrails/valid_length --quiet +guardrails hub install hub://guardrails/two_words --quiet +guardrails hub install hub://guardrails/valid_range --quiet +pip install cohere --quiet +``` + + + +``` + Installing hub://guardrails/valid_length... + ✅Successfully installed guardrails/valid_length! + + + Installing hub://guardrails/two_words... + ✅Successfully installed guardrails/two_words! + + + Installing hub://guardrails/valid_range... + ✅Successfully installed guardrails/valid_range! + + +``` + + + +Defined what our data should look like in pydantic + +Note: 1-indexed is an example of passing non-validator instructions on a per field level via the `format` field. +It will throw a validator warning and is to be expected. + + +```python +from pydantic import BaseModel, Field +from guardrails.hub import ValidLength, TwoWords, ValidRange +from typing import List + + +class Order(BaseModel): + user_id: int = Field( + description="The user's id.", validators=[("1-indexed", "noop")] + ) + user_name: str = Field( + description="The user's first name and last name", + validators=[TwoWords(on_fail="noop")], + ) + + num_orders: int = Field( + description="The number of orders the user has placed", + validators=[ValidRange(0, 50, on_fail="noop")], + ) + + +class Orders(BaseModel): + user_orders: List[Order] = Field( + description="Generate a list of users and how many orders they have placed in the past.", + validators=[ValidLength(10, 10, on_fail="noop")], + ) +``` + +Set up the cohere client. In this notebook, we use an environment variable to pass the cohere API key through + + +```python +# Add your OPENAI_API_KEY as an environment variable if it's not already set +# import os +# os.environ["COHERE_API_KEY"] = "YOUR_COHERE_API_KEY" +``` + +Create the guard and prompt + + +```python +from rich import print +import guardrails as gd + +guard = gd.Guard.for_pydantic(output_class=Orders) + +raw_llm_response, validated_response, *rest = guard( + messages=[{"role": "user", "content": prompt}], + model="command-r", + max_tokens=1024, + temperature=0.3, +) +``` + + + +``` + /Users/dtam/dev/guardrails/guardrails/validator_base.py:590: UserWarning: Validator with id 1-indexed was not found in the registry! Ignoring... + warn(f"Validator with id {name} was not found in the registry! Ignoring...") + WARNING:guardrails-ai:Validator with id 1-indexed was not found in the registry! Ignoring... + WARNING:guardrails-ai:Invalid arguments! ('1-indexed', 'noop') + /Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( +``` + + + +By printing the guard's state, we can see the final, validated output, as well as the steps guardrails took to ensure structure. + + +```python +print(guard.history.last.tree) +``` + +Logs
└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ ┃ Role Content ┃ │
│ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ user │ │ │
│ │ │ Generate a dataset of fake user orders. Each row of the dataset should be valid. The format │ │
│ │ │ should not be a list, it should be a JSON object. │ │
│ │ │ │ │
│ │ │ Given below is XML that describes the information to extract from this document and the tags │ │
│ │ │ to extract it into. │ │
│ │ │ │ │
│ │ │ <output> │ │
│ │ │ <list description=\"Generate a list of users and how many orders they have placed in the │ │
│ │ │ past.\" format=\"guardrails/valid_length: 10 10\" name=\"user_orders\" required=\"true\"> │ │
│ │ │ <object format=\"guardrails/valid_length: 10 10\" required=\"true\"> │ │
│ │ │ <integer description=\"The user's id.\" name=\"user_id\" required=\"true\"></integer> │ │
│ │ │ <string description=\"The user's first name and last name\" │ │
│ │ │ format=\"guardrails/two_words\" name=\"user_name\" required=\"true\"></string> │ │
│ │ │ <integer description=\"The number of orders the user has placed\" │ │
│ │ │ format=\"guardrails/valid_range: 0 50\" name=\"num_orders\" required=\"true\"></integer> │ │
│ │ │ </object> │ │
│ │ │ </list> │ │
│ │ │ </output> │ │
│ │ │ │ │
│ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in │ │
│ │ │ JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │
│ │ │ any types and format requests e.g. requests for lists, objects and specific types. Be │ │
│ │ │ correct and concise. If you are unsure anywhere, enter `null`. │ │
│ │ │ │ │
│ │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior: │ │
│ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │ │
│ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', │ │
│ │ │ 'STRING TWO', etc.]}` │ │
│ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer │ │
│ │ │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': │ │
│ │ │ 1}}` │ │
│ │ │ │ │
│ │ │ │ │
│ │ │ an example of output may look like this: │ │
│ │ │ { │ │
│ │ │ \"user_orders\": [{ │ │
│ │ │ │ │ │ │
│ │ │ \"user_id\": 1, │ │
│ │ │ \"user_name\": \"John Mcdonald\", │ │
│ │ │ \"num_orders\": 6 │ │
│ │ │ }] │ │
│ │ │ } │ │
│ │ │ │ │
│ │ │ │ │
│ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ { │
│ \"user_orders\": [ │
│ { │
│ \"user_id\": 2, │
│ \"user_name\": \"Jane Smith\", │
│ \"num_orders\": 12 │
│ }, │
│ { │
│ \"user_id\": 5, │
│ \"user_name\": \"Michael Jones\", │
│ \"num_orders\": 18 │
│ }, │
│ { │
│ \"user_id\": 10, │
│ \"user_name\": \"Mary Sue\", │
│ \"num_orders\": 9 │
│ }, │
│ { │
│ \"user_id\": 3, │
│ \"user_name\": \"David Miller\", │
│ \"num_orders\": 7 │
│ }, │
│ { │
│ \"user_id\": 15, │
│ \"user_name\": \"Eva Gonzalez\", │
│ \"num_orders\": 15 │
│ }, │
│ { │
│ \"user_id\": 8, │
│ \"user_name\": \"William Martinez\", │
│ \"num_orders\": 1 │
│ }, │
│ { │
│ \"user_id\": 12, │
│ \"user_name\": \"Sophia Lee\", │
│ \"num_orders\": 10 │
│ }, │
│ { │
│ \"user_id\": 6, │
│ \"user_name\": \"Robert Wilson\", │
│ \"num_orders\": 22 │
│ }, │
│ { │
│ \"user_id\": 18, │
│ \"user_name\": \"Albert Taylor\", │
│ \"num_orders\": 3 │
│ }, │
│ { │
│ \"user_id\": 14, │
│ \"user_name\": \"Olivia Davis\", │
│ \"num_orders\": 17 │
│ }, │
│ { │
│ \"user_id\": 17, │
│ \"user_name\": \"Jonathan Smith\", │
│ \"num_orders\": 5 │
│ } │
│ ] │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ { │
│ 'user_orders': [ │
│ {'user_id': 2, 'user_name': 'Jane Smith', 'num_orders': 12}, │
│ {'user_id': 5, 'user_name': 'Michael Jones', 'num_orders': 18}, │
│ {'user_id': 10, 'user_name': 'Mary Sue', 'num_orders': 9}, │
│ {'user_id': 3, 'user_name': 'David Miller', 'num_orders': 7}, │
│ {'user_id': 15, 'user_name': 'Eva Gonzalez', 'num_orders': 15}, │
│ {'user_id': 8, 'user_name': 'William Martinez', 'num_orders': 1}, │
│ {'user_id': 12, 'user_name': 'Sophia Lee', 'num_orders': 10}, │
│ {'user_id': 6, 'user_name': 'Robert Wilson', 'num_orders': 22}, │
│ {'user_id': 18, 'user_name': 'Albert Taylor', 'num_orders': 3}, │
│ {'user_id': 14, 'user_name': 'Olivia Davis', 'num_orders': 17}, │
│ {'user_id': 17, 'user_name': 'Jonathan Smith', 'num_orders': 5} │
│ ] │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> diff --git a/docs/examples/guard_use.ipynb b/docs/dist/examples/guard_use.ipynb similarity index 85% rename from docs/examples/guard_use.ipynb rename to docs/dist/examples/guard_use.ipynb index db135990b..8e49fb0cc 100644 --- a/docs/examples/guard_use.ipynb +++ b/docs/dist/examples/guard_use.ipynb @@ -35,6 +35,7 @@ "from guardrails import Guard, OnFailAction\n", "from guardrails.hub import RegexMatch, ValidRange\n", "\n", + "\n", "class Person(BaseModel):\n", " name: str\n", " # Existing way of assigning validators\n", @@ -63,11 +64,7 @@ "guard = Guard.for_pydantic(Person)\n", "\n", "try:\n", - " guard.validate(json.dumps({\n", - " \"name\": \"john doe\",\n", - " \"age\": 101,\n", - " \"is_employed\": False\n", - " }))\n", + " guard.validate(json.dumps({\"name\": \"john doe\", \"age\": 101, \"is_employed\": False}))\n", "except ValidationError as e:\n", " print(e)" ] @@ -88,14 +85,12 @@ "source": [ "# Now let's add a new validator to the name field\n", "\n", - "guard.use(RegexMatch(\"^(?:[A-Z][^\\\\s]*\\\\s?)+$\", on_fail=OnFailAction.EXCEPTION), on=\"$.name\")\n", + "guard.use(\n", + " RegexMatch(\"^(?:[A-Z][^\\\\s]*\\\\s?)+$\", on_fail=OnFailAction.EXCEPTION), on=\"$.name\"\n", + ")\n", "\n", "try:\n", - " guard.validate(json.dumps({\n", - " \"name\": \"john doe\",\n", - " \"age\": 30,\n", - " \"is_employed\": True\n", - " }))\n", + " guard.validate(json.dumps({\"name\": \"john doe\", \"age\": 30, \"is_employed\": True}))\n", "except ValidationError as e:\n", " print(e)" ] diff --git a/docs/dist/examples/guard_use.md b/docs/dist/examples/guard_use.md new file mode 100644 index 000000000..477a45841 --- /dev/null +++ b/docs/dist/examples/guard_use.md @@ -0,0 +1,81 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +```bash +guardrails hub install hub://guardrails/regex_match --quiet + guardrails hub install hub://guardrails/valid_range --quiet +``` + + + +``` + Installing hub://guardrails/regex_match... + ✅Successfully installed guardrails/regex_match! + + + Installing hub://guardrails/valid_range... + ✅Successfully installed guardrails/valid_range! + + +``` + + + + + + +```python +from pydantic import BaseModel, Field +from guardrails import Guard, OnFailAction +from guardrails.hub import RegexMatch, ValidRange + + +class Person(BaseModel): + name: str + # Existing way of assigning validators + age: int = Field(validators=[ValidRange(0, 100, on_fail=OnFailAction.EXCEPTION)]) + is_employed: bool +``` + + +```python +import json +from guardrails.errors import ValidationError + + +guard = Guard.for_pydantic(Person) + +try: + guard.validate(json.dumps({"name": "john doe", "age": 101, "is_employed": False})) +except ValidationError as e: + print(e) +``` + + + +``` + Validation failed for field with errors: Value 101 is greater than 100. +``` + + + + +```python +# Now let's add a new validator to the name field + +guard.use( + RegexMatch("^(?:[A-Z][^\\s]*\\s?)+$", on_fail=OnFailAction.EXCEPTION), on="$.name" +) + +try: + guard.validate(json.dumps({"name": "john doe", "age": 30, "is_employed": True})) +except ValidationError as e: + print(e) +``` + + + +``` + Validation failed for field with errors: Result must match ^(?:[A-Z][^\s]*\s?)+$ +``` + + diff --git a/docs/examples/guardrails_server.ipynb b/docs/dist/examples/guardrails_server.ipynb similarity index 99% rename from docs/examples/guardrails_server.ipynb rename to docs/dist/examples/guardrails_server.ipynb index ce61fac4e..124e76a06 100644 --- a/docs/examples/guardrails_server.ipynb +++ b/docs/dist/examples/guardrails_server.ipynb @@ -130,11 +130,9 @@ "settings.use_server = True\n", "configure_logging(None, log_level=logging.DEBUG)\n", "\n", - "name_case = Guard(name='name-case')\n", + "name_case = Guard(name=\"name-case\")\n", "\n", - "response = name_case.parse(\n", - " llm_output=\"Guardrails AI\"\n", - ")\n", + "response = name_case.parse(llm_output=\"Guardrails AI\")\n", "\n", "print(response)" ] diff --git a/docs/dist/examples/guardrails_server.md b/docs/dist/examples/guardrails_server.md new file mode 100644 index 000000000..adcf369d2 --- /dev/null +++ b/docs/dist/examples/guardrails_server.md @@ -0,0 +1,94 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +```bash +pip install "guardrails-ai[api]==0.5.0a9" -q +``` + + + +``` + + [notice] A new release of pip is available: 24.0 -> 24.1 + [notice] To update, run: pip install --upgrade pip +``` + + + + + + +```bash +which guardrails +``` + + + +``` + /Users/calebcourier/Projects/gr-mono/guardrails/docs/.venv/bin/guardrails +``` + + + + +```bash +guardrails hub install hub://guardrails/regex_match --quiet +``` + + + +``` + Installing hub://guardrails/regex_match... + ERROR:guardrails-cli:No module named 'guardrails.hub.guardrails.regex_match' +``` + + + + +```python +# Run this in a terminal +# guardrails start --config=./data/config.py +``` + + +```python +import os + +os.environ["GUARDRAILS_BASE_URL"] = "http://localhost:8000" + + +print(os.environ.get("GUARDRAILS_BASE_URL")) +``` + + + +``` + http://localhost:8000 +``` + + + + +```python +import logging +from rich import print +from guardrails import configure_logging +from guardrails import Guard, settings + +settings.use_server = True +configure_logging(None, log_level=logging.DEBUG) + +name_case = Guard(name="name-case") + +response = name_case.parse(llm_output="Guardrails AI") + +print(response) +``` + +ValidationOutcome(
call_id='14555109792',
raw_llm_output='Guardrails AI',
validation_summaries=[],
validated_output='Guardrails AI',
reask=None,
validation_passed=True,
error=None
)
"}} /> + + +```python +print(name_case.history) +``` + +[
Call(
id='14416771056',
iterations=[
Iteration(
id='14545443632',
index=0,
call_id='14416771056',
inputs=Inputs(
llm_api=None,
llm_output='Guardrails AI',
instructions=None,
prompt=None,
messages=None,
msg_history=None,
prompt_params={},
num_reasks=0,
metadata={},
full_schema_reask=False,
stream=False
),
outputs=Outputs(
llm_response_info=LLMResponse(
prompt_token_count=None,
response_token_count=None,
output='Guardrails AI',
stream_output=None,
async_stream_output=None
),
raw_output=None,
parsed_output='Guardrails AI',
validation_response='Guardrails AI',
guarded_output='Guardrails AI',
reasks=[],
validator_logs=[
ValidatorLogs(
validator_name='RegexMatch',
registered_name='guardrails/regex_match',
instance_id=6127616944,
property_path='$',
value_before_validation='Guardrails AI',
value_after_validation='Guardrails AI',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 10, 14, 24, 31, 706666),
end_time=datetime.datetime(2024, 10, 10, 14, 24, 31, 790514)
)
],
error=None,
exception=None
)
)
],
inputs=CallInputs(
llm_api=None,
llm_output=None,
instructions=None,
prompt=None,
msg_history=None,
messages=None,
prompt_params={},
num_reasks=0,
metadata={},
full_schema_reask=False,
stream=False,
args=[],
kwargs={'api_key': '****************************************************EnZS'}
),
exception=None
),
Call(
id='14555105232',
iterations=[
Iteration(
id='14555107312',
index=0,
call_id='14555105232',
inputs=Inputs(
llm_api=None,
llm_output='Guardrails AI',
instructions=None,
prompt=None,
messages=None,
msg_history=None,
prompt_params={},
num_reasks=0,
metadata={},
full_schema_reask=False,
stream=False
),
outputs=Outputs(
llm_response_info=LLMResponse(
prompt_token_count=None,
response_token_count=None,
output='Guardrails AI',
stream_output=None,
async_stream_output=None
),
raw_output=None,
parsed_output='Guardrails AI',
validation_response='Guardrails AI',
guarded_output='Guardrails AI',
reasks=[],
validator_logs=[
ValidatorLogs(
validator_name='RegexMatch',
registered_name='guardrails/regex_match',
instance_id=6127616944,
property_path='$',
value_before_validation='Guardrails AI',
value_after_validation='Guardrails AI',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 10, 14, 24, 41, 134226),
end_time=datetime.datetime(2024, 10, 10, 14, 24, 41, 204882)
)
],
error=None,
exception=None
)
)
],
inputs=CallInputs(
llm_api=None,
llm_output=None,
instructions=None,
prompt=None,
msg_history=None,
messages=None,
prompt_params={},
num_reasks=0,
metadata={},
full_schema_reask=False,
stream=False,
args=[],
kwargs={'api_key': '****************************************************EnZS'}
),
exception=None
),
Call(
id='14555109792',
iterations=[
Iteration(
id='14555110912',
index=0,
call_id='14555109792',
inputs=Inputs(
llm_api=None,
llm_output='Guardrails AI',
instructions=None,
prompt=None,
messages=None,
msg_history=None,
prompt_params={},
num_reasks=0,
metadata={},
full_schema_reask=False,
stream=False
),
outputs=Outputs(
llm_response_info=LLMResponse(
prompt_token_count=None,
response_token_count=None,
output='Guardrails AI',
stream_output=None,
async_stream_output=None
),
raw_output=None,
parsed_output='Guardrails AI',
validation_response='Guardrails AI',
guarded_output='Guardrails AI',
reasks=[],
validator_logs=[
ValidatorLogs(
validator_name='RegexMatch',
registered_name='guardrails/regex_match',
instance_id=6127616944,
property_path='$',
value_before_validation='Guardrails AI',
value_after_validation='Guardrails AI',
validation_result=PassResult(
outcome='pass',
value_override=<class
'guardrails.classes.validation.validation_result.PassResult.ValueOverrideSentinel'>,
metadata=None,
validated_chunk=None
),
start_time=datetime.datetime(2024, 10, 10, 14, 25, 46, 566512),
end_time=datetime.datetime(2024, 10, 10, 14, 25, 46, 637393)
)
],
error=None,
exception=None
)
)
],
inputs=CallInputs(
llm_api=None,
llm_output=None,
instructions=None,
prompt=None,
msg_history=None,
messages=None,
prompt_params={},
num_reasks=0,
metadata={},
full_schema_reask=False,
stream=False,
args=[],
kwargs={'api_key': '****************************************************EnZS'}
),
exception=None
)
]
"}} /> diff --git a/docs/examples/guardrails_with_chat_models.ipynb b/docs/dist/examples/guardrails_with_chat_models.ipynb similarity index 99% rename from docs/examples/guardrails_with_chat_models.ipynb rename to docs/dist/examples/guardrails_with_chat_models.ipynb index d0819af27..f6a81906b 100644 --- a/docs/examples/guardrails_with_chat_models.ipynb +++ b/docs/dist/examples/guardrails_with_chat_models.ipynb @@ -340,18 +340,27 @@ "${gr.complete_xml_suffix_v2}\n", "\"\"\"\n", "\n", + "\n", "class Fee(BaseModel):\n", " name: str = Field(validators=[LowerCase(on_fail=\"fix\"), TwoWords(on_fail=\"reask\")])\n", " explanation: str = Field(validators=[OneLine(on_fail=\"noop\")])\n", " value: float = Field(description=\"The fee amount in USD or as a percentage.\")\n", "\n", + "\n", "class AccountFee(BaseModel):\n", " account_type: str = Field(validators=[LowerCase(on_fail=\"fix\")])\n", - " rate: float = Field(description=\"The annual percentage rate (APR) for the account type.\")\n", + " rate: float = Field(\n", + " description=\"The annual percentage rate (APR) for the account type.\"\n", + " )\n", + "\n", "\n", "class CreditCardAgreement(BaseModel):\n", - " fees: list[Fee] = Field(description=\"What fees and charges are associated with my account?\")\n", - " interest_rates: list[AccountFee] = Field(description=\"What are the interest rates offered by the bank on different kinds of accounts and products?\")" + " fees: list[Fee] = Field(\n", + " description=\"What fees and charges are associated with my account?\"\n", + " )\n", + " interest_rates: list[AccountFee] = Field(\n", + " description=\"What are the interest rates offered by the bank on different kinds of accounts and products?\"\n", + " )" ] }, { @@ -427,7 +436,7 @@ "\n", "raw_llm_response, validated_response, *rest = guard(\n", " model=\"gpt-4o\",\n", - " messages=[{\"role\":\"user\", \"content\": prompt}],\n", + " messages=[{\"role\": \"user\", \"content\": prompt}],\n", " prompt_params={\"document\": content[:6000]},\n", " max_tokens=2048,\n", " temperature=0,\n", diff --git a/docs/dist/examples/guardrails_with_chat_models.md b/docs/dist/examples/guardrails_with_chat_models.md new file mode 100644 index 000000000..f37f3f9f9 --- /dev/null +++ b/docs/dist/examples/guardrails_with_chat_models.md @@ -0,0 +1,381 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +import Tabs from '@theme/Tabs';import TabItem from '@theme/TabItem'; + +```bash +guardrails hub install hub://guardrails/lowercase --quiet +guardrails hub install hub://guardrails/two_words --quiet +guardrails hub install hub://guardrails/one_line --quiet + +%pip install pypdfium2 +``` + + + +``` + Installing hub://guardrails/lowercase... + ✅Successfully installed guardrails/lowercase! + + + Installing hub://guardrails/two_words... + ✅Successfully installed guardrails/two_words! + + + Installing hub://guardrails/one_line... + ✅Successfully installed guardrails/one_line! + + + Requirement already satisfied: pypdfium2 in /Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages (4.30.0) + Note: you may need to restart the kernel to use updated packages. +``` + + + + + +# Using Guardrails with Chat Models + +!!! note + To download this example as a Jupyter notebook, click [here](https://github.com/guardrails-ai/guardrails/blob/main/docs/examples/extracting_entities.ipynb). + +In this example, we will set up Guardrails with a chat model. + +## Objective + +We retry the [entity extraction example](./extracting_entities.ipynb) using a chat model. + +## Step 0: Download PDF and load it as string + +To get started, download the document from [here](https://github.com/guardrails-ai/guardrails/blob/main/docs/examples/data/chase_card_agreement.pdf) and save it in `data/chase_card_agreement.pdf`. + +Guardrails has some built-in functions to help with common tasks. Here, we will use the `read_pdf` function to load the PDF as a string. + + +```python +import guardrails as gd +from rich import print + +content = gd.docs_utils.read_pdf("data/chase_card_agreement.pdf") + +print(f"Chase Credit Card Document:\n\n{content[:275]}\n...") +``` + + warnings.warn(\"get_text_range() call with default params will be implicitly redirected to get_text_bounded()\")




Chase Credit Card Document:

2/25/23, 7:59 PM about:blank
about:blank 1/4
PRICING INFORMATION
INTEREST RATES AND INTEREST CHARGES
Purchase Annual
Percentage Rate (APR) 0% Intro APR for the first 18 months that your Account is open.
After that, 19.49%. This APR will vary with the market based on the Prim
...
"}} /> + +## Step 1: Create the RAIL Spec with `` tags + +In order to use Guardrails with a chat model, we need to add `` tags to the RAIL spec. Here's an example illustrating the differences using a system message and user messages. + + + + + + ```xml + + + You are a helpful assistant only capable of communicating with valid JSON, and no other text. + + ${gr.json_suffix_prompt_examples} + + + Given the following document, answer the following questions. If the answer doesn't exist in the document, enter + `null`. + + ${document} + + Extract information from this document and return a JSON that follows the correct schema. + + ${gr.xml_prefix_prompt} + + ${output_schema} + + + ``` + + + + + ```py + instructions = """You are a helpful assistant only capable of communicating with valid JSON, and no other text. + + ${gr.json_suffix_prompt_examples}""" + + prompt = """Given the following document, answer the following questions. If the answer doesn't exist in the document, enter `null`. + + ${document} + + Extract information from this document and return a JSON that follows the correct schema. + + ${gr.xml_prefix_prompt} + + ${output_schema}""" + + messages=[ + { + "role":"system", + "content":instructions + }, + { + "role":"user", + "content":prompt + } + ] + ``` + + + + + ```xml + + + Given the following document, answer the following questions. If the answer doesn't exist in the document, enter `null`. + + ${document} + + ${gr.xml_prefix_prompt} + + ${output_schema} + + ${gr.json_suffix_prompt_v2_wo_none} + + + ``` + + + + + ```py + prompt = """Given the following document, answer the following questions. If the answer doesn't exist in the document, enter `null`. + + ${document} + + ${gr.xml_prefix_prompt} + + ${output_schema} + + ${gr.json_suffix_prompt_v2_wo_none}""" + messages=[ + { + "role":"user", + "content":prompt + } + ] + ``` + + + +After materialization, the two variations of the RAIL specification will look like this when passed to the LLM (regarless if they were initialized from xml or a Pydantic model): + + + + + ```xml + + + You are a helpful assistant only capable of communicating with valid JSON, and no other text. + + ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the `name` attribute of the corresponding XML, and the value is of the type specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere, enter `null`. + + Here are examples of simple (XML, JSON) pairs that show the expected behavior: + - `` => `{'foo': 'example one'}` + - `` => `{"bar": ['STRING ONE', 'STRING TWO', etc.]}` + - `` => `{'baz': {'foo': 'Some String', 'index': 1}}` + + + + Given the following document, answer the following questions. If the answer doesn't exist in the document, enter + `null`. + + ${document} + + Extract information from this document and return a JSON that follows the correct schema. + + Given below is XML that describes the information to extract from this document and the tags to extract it into. + + ${output_schema} + + + ``` + + + + + ```xml + + + Given the following document, answer the following questions. If the answer doesn't exist in the document, enter `null`. + + ${document} + + Given below is XML that describes the information to extract from this document and the tags to extract it into. + + ${output_schema} + + ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the `name` attribute of the corresponding XML, and the value is of the type specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and specific types. Be correct and concise. If you are unsure anywhere, enter `null`. + + Here are examples of simple (XML, JSON) pairs that show the expected behavior: + - `` => `{'foo': 'example one'}` + - `` => `{"bar": ['STRING ONE', 'STRING TWO', etc.]}` + - `` => `{'baz': {'foo': 'Some String', 'index': 1}}` + + + ``` + + + +Here's the final RAIL spec as XML: + + +```python +rail_str = """ + + + + + + + + + + + + + + + + + +You are a helpful assistant only capable of communicating with valid JSON, and no other text. + +${gr.json_suffix_prompt_examples} + + +Given the following document, answer the following questions. If the answer doesn't exist in the document, enter +`null`. + +${document} + +Extract information from this document and return a JSON that follows the correct schema. + +${gr.xml_prefix_prompt} + +${output_schema} + + + + +""" +``` + +Or using a Pydantic model for the output schema: + + +```python +from guardrails.hub import LowerCase, TwoWords, OneLine +from pydantic import BaseModel, Field + +prompt = """ +Given the following document, answer the following questions. If the answer doesn't exist in the document, enter 'None'. + +${document} + +${gr.complete_xml_suffix_v2} +""" + + +class Fee(BaseModel): + name: str = Field(validators=[LowerCase(on_fail="fix"), TwoWords(on_fail="reask")]) + explanation: str = Field(validators=[OneLine(on_fail="noop")]) + value: float = Field(description="The fee amount in USD or as a percentage.") + + +class AccountFee(BaseModel): + account_type: str = Field(validators=[LowerCase(on_fail="fix")]) + rate: float = Field( + description="The annual percentage rate (APR) for the account type." + ) + + +class CreditCardAgreement(BaseModel): + fees: list[Fee] = Field( + description="What fees and charges are associated with my account?" + ) + interest_rates: list[AccountFee] = Field( + description="What are the interest rates offered by the bank on different kinds of accounts and products?" + ) +``` + +## Step 2: Create a `Guard` object with the RAIL Spec + +We create a `gd.Guard` object that will check, validate and correct the output of the LLM. This object: + +1. Enforces the quality criteria specified in the RAIL spec. +2. Takes corrective action when the quality criteria are not met. +3. Compiles the schema and type info from the RAIL spec and adds it to the prompt. + +Creating the guard from XML: + + +```python +guard = gd.Guard.for_rail_string(rail_str) +``` + +Or from the Pydantic model: + + +```python +guard = gd.Guard.for_pydantic(output_class=CreditCardAgreement) +``` + +As we can see, a few formatters weren't supported. These formatters won't be enforced in the output, but this information can still be used to generate a prompt. + + +```python +# Add your OPENAI_API_KEY as an environment variable if it's not already set +# import os +# os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY" + +raw_llm_response, validated_response, *rest = guard( + model="gpt-4o", + messages=[{"role": "user", "content": prompt}], + prompt_params={"document": content[:6000]}, + max_tokens=2048, + temperature=0, +) +``` + + + +``` + /Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( +``` + + + +We see in the prompt that was sent to the LLM, the `{document}` is substituted with the user provided value at runtime. + + +```python +print(guard.history.last.iterations.last.inputs.messages[0]["content"]) +``` + +
Given the following document, answer the following questions. If the answer doesn't exist in the document, enter
'None'.

2/25/23, 7:59 PM about:blank
about:blank 1/4
PRICING INFORMATION
INTEREST RATES AND INTEREST CHARGES
Purchase Annual
Percentage Rate (APR) 0% Intro APR for the first 18 months that your Account is open.
After that, 19.49%. This APR will vary with the market based on the Prime
Rate.
a
My Chase Loan
SM APR 19.49%. This APR will vary with the market based on the Prime Rate.
a
Promotional offers with fixed APRs and varying durations may be available from
time to time on some accounts.
Balance Transfer APR 0% Intro APR for the first 18 months that your Account is open.
After that, 19.49%. This APR will vary with the market based on the Prime
Rate.
a
Cash Advance APR 29.49%. This APR will vary with the market based on the Prime Rate.
b
Penalty APR and When
It Applies
Up to 29.99%. This APR will vary with the market based on the Prime Rate.
c
We may apply the Penalty APR to your account if you:
fail to make a Minimum Payment by the date and time that it is due; or
make a payment to us that is returned unpaid.
How Long Will the Penalty APR Apply?: If we apply the Penalty APR for
either of these reasons, the Penalty APR could potentially remain in effect
indefinitely.
How to Avoid Paying
Interest on Purchases
Your due date will be a minimum of 21 days after the close of each billing cycle.
We will not charge you interest on new purchases if you pay your entire balance
or Interest Saving Balance by the due date each month. We will begin charging
interest on balance transfers and cash advances on the transaction date.
Minimum Interest
Charge
None
Credit Card Tips from
the Consumer Financial
Protection Bureau
To learn more about factors to consider when applying for or using a credit card,
visit the website of the Consumer Financial Protection Bureau at
http://www.consumerfinance.gov/learnmore.
FEES
Annual Membership
Fee
None
My Chase Plan
SM Fee
(fixed finance charge)
Monthly fee of 0% of the amount of each eligible purchase transaction or
amount selected to create a My Chase Plan while in the 0% Intro Purchase
APR period.
After that, monthly fee of 1.72% of the amount of each eligible purchase
transaction or amount selected to create a My Chase Plan. The My Chase Plan
Fee will be determined at the time each My Chase Plan is created and will
remain the same until the My Chase Plan is paid in full.
d
Transaction Fees
Balance Transfers Intro fee of either $5 or 3% of the amount of each transfer, whichever is greater,
on transfers made within 60 days of account opening. After that: Either $5 or 5%
of the amount of each transfer, whichever is greater.
Cash Advances Either $10 or 5% of the amount of each transaction, whichever is greater.
2/25/23, 7:59 PM about:blank
about:blank 2/4
Foreign Transactions 3% of the amount of each transaction in U.S. dollars.
Penalty Fees
Late Payment Up to $40.
Over-the-Credit-Limit None
Return Payment Up to $40.
Return Check None
Note: This account may not be eligible for balance transfers.
Loss of Intro APR: We will end your introductory APR if any required Minimum Payment is 60 days late, and
apply the Penalty APR.
How We Will Calculate Your Balance: We use the daily balance method (including new transactions).
Prime Rate: Variable APRs are based on the 7.75% Prime Rate as of 2/7/2023.
aWe add 11.74% to the Prime Rate to determine the Purchase/My Chase Loan/Balance Transfer APR.
Maximum APR 29.99%.
bWe add 21.74% to the Prime Rate to determine the Cash Advance APR. Maximum APR 29.99%.
cWe add up to 26.99% to the Prime Rate to determine the Penalty APR. Maximum APR 29.99%.
dMy Chase Plan Fee: The My Chase Plan Fee is calculated at the time each plan is created and is based on
the amount of each purchase transaction or amount selected to create the plan, the number of billing periods
you choose to pay the balance in full, and other factors. The monthly and aggregate dollar amount of your My
Chase Plan Fee will be disclosed during the activation of each My Chase Plan.
MILITARY LENDING ACT NOTICE: Federal law provides important protections to members of the Armed
Forces and their dependents relating to extensions of consumer credit. In general, the cost of consumer credit
to a member of the Armed Forces and his or her dependent may not exceed an annual percentage rate of 36
percent. This rate must include, as applicable to the credit transaction or account: the costs associated with
credit insurance premiums; fees for ancillary products sold in connection with the credit transaction; any
application fee charged (other than certain application fees for specified credit transactions or accounts); and
any participation fee charged (other than certain participation fees for a credit card account). To receive this
information and a description of your payment obligation verbally, please call 1-800-235-9978.
TERMS & CONDITIONS
Authorization: When you respond to this credit card offer from JPMorgan Chase Bank, N.A., Member FDIC, a
subsidiary of JPMorgan Chase & Co. (\"Chase\", \"we\", or \"us\"), you agree to the following:
1. You authorize us to obtain credit bureau reports, employment, and income information about you that we
will use when considering your application for credit. We may obtain and use information about your
accounts with us and others such as Checking, Deposit, Investment, and Utility accounts from credit
bureaus and other entities. You also authorize us to obtain credit bureau reports and any other
information about you in connection with: 1) extensions of credit on your account; 2) the administration,
review or collection of your account; and 3) offering you enhanced or additional products and services. If
you ask, we will tell you the name and address of the credit bureau from which we obtained a report
about you.
2. If an account is opened, you will receive a Cardmember Agreement with your card(s). You agree to the
terms of this agreement by: using the account or any card, authorizing their use, or making any payment
on the account.
3. By providing your mobile ph


Given below is XML that describes the information to extract from this document and the tags to extract it into.

<output>
<list description=\"What fees and charges are associated with my account?\" name=\"fees\" required=\"true\">
<object required=\"true\">
<string format=\"guardrails/lowercase; guardrails/two_words\" name=\"name\" required=\"true\"></string>
<string format=\"guardrails/one_line\" name=\"explanation\" required=\"true\"></string>
<float description=\"The fee amount in USD or as a percentage.\" name=\"value\" required=\"true\"></float>
</object>
</list>
<list description=\"What are the interest rates offered by the bank on different kinds of accounts and products?\"
name=\"interest_rates\" required=\"true\">
<object required=\"true\">
<string format=\"guardrails/lowercase\" name=\"account_type\" required=\"true\"></string>
<float description=\"The annual percentage rate (APR) for the account type.\" name=\"rate\"
required=\"true\"></float>
</object>
</list>
</output>

ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the `name`
attribute of the corresponding XML, and the value is of the type specified by the corresponding XML's tag. The JSON
MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and
specific types. Be correct and concise.

Here are examples of simple (XML, JSON) pairs that show the expected behavior:
- `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`
- `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', 'STRING TWO', etc.]}`
- `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" format=\"1-indexed\"
/></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`


"}} /> + +The `guard` wrapper returns the raw_llm_respose (which is a simple string), and the validated and corrected output (which is a dictionary). + +We can see that the output is a dictionary with the correct schema and types. + + +```python +print(validated_response) +``` + +{
'fees': [
{'name': 'annual membership', 'explanation': 'None', 'value': 0.0},
{
'name': 'my chase',
'explanation': 'Monthly fee of 0% of the amount of each eligible purchase transaction or amount
selected to create a My Chase Plan while in the 0% Intro Purchase APR period. After that, monthly fee of 1.72% of
the amount of each eligible purchase transaction or amount selected to create a My Chase Plan.',
'value': 1.72
},
{
'name': 'balance transfers',
'explanation': 'Intro fee of either $5 or 3% of the amount of each transfer, whichever is greater, on
transfers made within 60 days of account opening. After that: Either $5 or 5% of the amount of each transfer,
whichever is greater.',
'value': 5.0
},
{
'name': 'cash advances',
'explanation': 'Either $10 or 5% of the amount of each transaction, whichever is greater.',
'value': 10.0
},
{
'name': 'foreign transactions',
'explanation': '3% of the amount of each transaction in U.S. dollars.',
'value': 3.0
},
{'name': 'late payment', 'explanation': 'Up to $40.', 'value': 40.0},
{'name': 'return payment', 'explanation': 'Up to $40.', 'value': 40.0}
],
'interest_rates': [
{'account_type': 'purchase', 'rate': 19.49},
{'account_type': 'my chase loan', 'rate': 19.49},
{'account_type': 'balance transfer', 'rate': 19.49},
{'account_type': 'cash advance', 'rate': 29.49},
{'account_type': 'penalty', 'rate': 29.99}
]
}
"}} /> + + +```python +guard.history.last.tree +``` + +Logs
└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ ┃ Role Content ┃ │
│ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ user │ │ │
│ │ │ Given the following document, answer the following questions. If the answer doesn't exist in │ │
│ │ │ the document, enter 'None'. │ │
│ │ │ │ │
│ │ │ 2/25/23, 7:59 PM about:blank │ │
│ │ │ about:blank 1/4 │ │
│ │ │ PRICING INFORMATION │ │
│ │ │ INTEREST RATES AND INTEREST CHARGES │ │
│ │ │ Purchase Annual │ │
│ │ │ Percentage Rate (APR) 0% Intro APR for the first 18 months that your Account is open. │ │
│ │ │ After that, 19.49%. This APR will vary with the market based on the Prime │ │
│ │ │ Rate. │ │
│ │ │ a │ │
│ │ │ My Chase Loan │ │
│ │ │ SM APR 19.49%. This APR will vary with the market based on the Prime Rate. │ │
│ │ │ a │ │
│ │ │ Promotional offers with fixed APRs and varying durations may be available from │ │
│ │ │ time to time on some accounts. │ │
│ │ │ Balance Transfer APR 0% Intro APR for the first 18 months that your Account is open. │ │
│ │ │ After that, 19.49%. This APR will vary with the market based on the Prime │ │
│ │ │ Rate. │ │
│ │ │ a │ │
│ │ │ Cash Advance APR 29.49%. This APR will vary with the market based on the Prime Rate. │ │
│ │ │ b │ │
│ │ │ Penalty APR and When │ │
│ │ │ It Applies │ │
│ │ │ Up to 29.99%. This APR will vary with the market based on the Prime Rate. │ │
│ │ │ c │ │
│ │ │ We may apply the Penalty APR to your account if you: │ │
│ │ │ fail to make a Minimum Payment by the date and time that it is due; or │ │
│ │ │ make a payment to us that is returned unpaid. │ │
│ │ │ How Long Will the Penalty APR Apply?: If we apply the Penalty APR for │ │
│ │ │ either of these reasons, the Penalty APR could potentially remain in effect │ │
│ │ │ indefinitely. │ │
│ │ │ How to Avoid Paying │ │
│ │ │ Interest on Purchases │ │
│ │ │ Your due date will be a minimum of 21 days after the close of each billing cycle. │ │
│ │ │ We will not charge you interest on new purchases if you pay your entire balance │ │
│ │ │ or Interest Saving Balance by the due date each month. We will begin charging │ │
│ │ │ interest on balance transfers and cash advances on the transaction date. │ │
│ │ │ Minimum Interest │ │
│ │ │ Charge │ │
│ │ │ None │ │
│ │ │ Credit Card Tips from │ │
│ │ │ the Consumer Financial │ │
│ │ │ Protection Bureau │ │
│ │ │ To learn more about factors to consider when applying for or using a credit card, │ │
│ │ │ visit the website of the Consumer Financial Protection Bureau at │ │
│ │ │ http://www.consumerfinance.gov/learnmore. │ │
│ │ │ FEES │ │
│ │ │ Annual Membership │ │
│ │ │ Fee │ │
│ │ │ None │ │
│ │ │ My Chase Plan │ │
│ │ │ SM Fee │ │
│ │ │ (fixed finance charge) │ │
│ │ │ Monthly fee of 0% of the amount of each eligible purchase transaction or │ │
│ │ │ amount selected to create a My Chase Plan while in the 0% Intro Purchase │ │
│ │ │ APR period. │ │
│ │ │ After that, monthly fee of 1.72% of the amount of each eligible purchase │ │
│ │ │ transaction or amount selected to create a My Chase Plan. The My Chase Plan │ │
│ │ │ Fee will be determined at the time each My Chase Plan is created and will │ │
│ │ │ remain the same until the My Chase Plan is paid in full. │ │
│ │ │ d │ │
│ │ │ Transaction Fees │ │
│ │ │ Balance Transfers Intro fee of either $5 or 3% of the amount of each transfer, whichever is │ │
│ │ │ greater, │ │
│ │ │ on transfers made within 60 days of account opening. After that: Either $5 or 5% │ │
│ │ │ of the amount of each transfer, whichever is greater. │ │
│ │ │ Cash Advances Either $10 or 5% of the amount of each transaction, whichever is greater. │ │
│ │ │ 2/25/23, 7:59 PM about:blank │ │
│ │ │ about:blank 2/4 │ │
│ │ │ Foreign Transactions 3% of the amount of each transaction in U.S. dollars. │ │
│ │ │ Penalty Fees │ │
│ │ │ Late Payment Up to $40. │ │
│ │ │ Over-the-Credit-Limit None │ │
│ │ │ Return Payment Up to $40. │ │
│ │ │ Return Check None │ │
│ │ │ Note: This account may not be eligible for balance transfers. │ │
│ │ │ Loss of Intro APR: We will end your introductory APR if any required Minimum Payment is 60 │ │
│ │ │ days late, and │ │
│ │ │ apply the Penalty APR. │ │
│ │ │ How We Will Calculate Your Balance: We use the daily balance method (including new │ │
│ │ │ transactions). │ │
│ │ │ Prime Rate: Variable APRs are based on the 7.75% Prime Rate as of 2/7/2023. │ │
│ │ │ aWe add 11.74% to the Prime Rate to determine the Purchase/My Chase Loan/Balance Transfer │ │
│ │ │ APR. │ │
│ │ │ Maximum APR 29.99%. │ │
│ │ │ bWe add 21.74% to the Prime Rate to determine the Cash Advance APR. Maximum APR 29.99%. │ │
│ │ │ cWe add up to 26.99% to the Prime Rate to determine the Penalty APR. Maximum APR 29.99%. │ │
│ │ │ dMy Chase Plan Fee: The My Chase Plan Fee is calculated at the time each plan is created and │ │
│ │ │ is based on │ │
│ │ │ the amount of each purchase transaction or amount selected to create the plan, the number of │ │
│ │ │ billing periods │ │
│ │ │ you choose to pay the balance in full, and other factors. The monthly and aggregate dollar │ │
│ │ │ amount of your My │ │
│ │ │ Chase Plan Fee will be disclosed during the activation of each My Chase Plan. │ │
│ │ │ MILITARY LENDING ACT NOTICE: Federal law provides important protections to members of the │ │
│ │ │ Armed │ │
│ │ │ Forces and their dependents relating to extensions of consumer credit. In general, the cost │ │
│ │ │ of consumer credit │ │
│ │ │ to a member of the Armed Forces and his or her dependent may not exceed an annual percentage │ │
│ │ │ rate of 36 │ │
│ │ │ percent. This rate must include, as applicable to the credit transaction or account: the │ │
│ │ │ costs associated with │ │
│ │ │ credit insurance premiums; fees for ancillary products sold in connection with the credit │ │
│ │ │ transaction; any │ │
│ │ │ application fee charged (other than certain application fees for specified credit │ │
│ │ │ transactions or accounts); and │ │
│ │ │ any participation fee charged (other than certain participation fees for a credit card │ │
│ │ │ account). To receive this │ │
│ │ │ information and a description of your payment obligation verbally, please call │ │
│ │ │ 1-800-235-9978. │ │
│ │ │ TERMS & CONDITIONS │ │
│ │ │ Authorization: When you respond to this credit card offer from JPMorgan Chase Bank, N.A., │ │
│ │ │ Member FDIC, a │ │
│ │ │ subsidiary of JPMorgan Chase & Co. (\"Chase\", \"we\", or \"us\"), you agree to the following: │ │
│ │ │ 1. You authorize us to obtain credit bureau reports, employment, and income information │ │
│ │ │ about you that we │ │
│ │ │ will use when considering your application for credit. We may obtain and use information │ │
│ │ │ about your │ │
│ │ │ accounts with us and others such as Checking, Deposit, Investment, and Utility accounts from │ │
│ │ │ credit │ │
│ │ │ bureaus and other entities. You also authorize us to obtain credit bureau reports and any │ │
│ │ │ other │ │
│ │ │ information about you in connection with: 1) extensions of credit on your account; 2) the │ │
│ │ │ administration, │ │
│ │ │ review or collection of your account; and 3) offering you enhanced or additional products │ │
│ │ │ and services. If │ │
│ │ │ you ask, we will tell you the name and address of the credit bureau from which we obtained a │ │
│ │ │ report │ │
│ │ │ about you. │ │
│ │ │ 2. If an account is opened, you will receive a Cardmember Agreement with your card(s). You │ │
│ │ │ agree to the │ │
│ │ │ terms of this agreement by: using the account or any card, authorizing their use, or making │ │
│ │ │ any payment │ │
│ │ │ on the account. │ │
│ │ │ 3. By providing your mobile ph │ │
│ │ │ │ │
│ │ │ │ │
│ │ │ Given below is XML that describes the information to extract from this document and the tags │ │
│ │ │ to extract it into. │ │
│ │ │ │ │
│ │ │ <output> │ │
│ │ │ <list description=\"What fees and charges are associated with my account?\" name=\"fees\" │ │
│ │ │ required=\"true\"> │ │
│ │ │ <object required=\"true\"> │ │
│ │ │ <string format=\"guardrails/lowercase; guardrails/two_words\" name=\"name\" │ │
│ │ │ required=\"true\"></string> │ │
│ │ │ <string format=\"guardrails/one_line\" name=\"explanation\" required=\"true\"></string> │ │
│ │ │ <float description=\"The fee amount in USD or as a percentage.\" name=\"value\" │ │
│ │ │ required=\"true\"></float> │ │
│ │ │ </object> │ │
│ │ │ </list> │ │
│ │ │ <list description=\"What are the interest rates offered by the bank on different kinds of │ │
│ │ │ accounts and products?\" name=\"interest_rates\" required=\"true\"> │ │
│ │ │ <object required=\"true\"> │ │
│ │ │ <string format=\"guardrails/lowercase\" name=\"account_type\" required=\"true\"></string> │ │
│ │ │ <float description=\"The annual percentage rate (APR) for the account type.\" │ │
│ │ │ name=\"rate\" required=\"true\"></float> │ │
│ │ │ </object> │ │
│ │ │ </list> │ │
│ │ │ </output> │ │
│ │ │ │ │
│ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in │ │
│ │ │ JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │
│ │ │ any types and format requests e.g. requests for lists, objects and specific types. Be │ │
│ │ │ correct and concise. │ │
│ │ │ │ │
│ │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior: │ │
│ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │ │
│ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', │ │
│ │ │ 'STRING TWO', etc.]}` │ │
│ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer │ │
│ │ │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': │ │
│ │ │ 1}}` │ │
│ │ │ │ │
│ │ │ │ │
│ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ ```json │
│ { │
│ \"fees\": [ │
│ { │
│ \"name\": \"annual membership\", │
│ \"explanation\": \"None\", │
│ \"value\": 0.0 │
│ }, │
│ { │
│ \"name\": \"my chase\", │
│ \"explanation\": \"Monthly fee of 0% of the amount of each eligible purchase transaction or amount │
│ selected to create a My Chase Plan while in the 0% Intro Purchase APR period. After that, monthly fee │
│ of 1.72% of the amount of each eligible purchase transaction or amount selected to create a My Chase │
│ Plan.\", │
│ \"value\": 1.72 │
│ }, │
│ { │
│ \"name\": \"balance transfers\", │
│ \"explanation\": \"Intro fee of either $5 or 3% of the amount of each transfer, whichever is │
│ greater, on transfers made within 60 days of account opening. After that: Either $5 or 5% of the amount │
│ of each transfer, whichever is greater.\", │
│ \"value\": 5.0 │
│ }, │
│ { │
│ \"name\": \"cash advances\", │
│ \"explanation\": \"Either $10 or 5% of the amount of each transaction, whichever is greater.\", │
│ \"value\": 10.0 │
│ }, │
│ { │
│ \"name\": \"foreign transactions\", │
│ \"explanation\": \"3% of the amount of each transaction in U.S. dollars.\", │
│ \"value\": 3.0 │
│ }, │
│ { │
│ \"name\": \"late payment\", │
│ \"explanation\": \"Up to $40.\", │
│ \"value\": 40.0 │
│ }, │
│ { │
│ \"name\": \"return payment\", │
│ \"explanation\": \"Up to $40.\", │
│ \"value\": 40.0 │
│ } │
│ ], │
│ \"interest_rates\": [ │
│ { │
│ \"account_type\": \"purchase\", │
│ \"rate\": 19.49 │
│ }, │
│ { │
│ \"account_type\": \"my chase loan\", │
│ \"rate\": 19.49 │
│ }, │
│ { │
│ \"account_type\": \"balance transfer\", │
│ \"rate\": 19.49 │
│ }, │
│ { │
│ \"account_type\": \"cash advance\", │
│ \"rate\": 29.49 │
│ }, │
│ { │
│ \"account_type\": \"penalty\", │
│ \"rate\": 29.99 │
│ } │
│ ] │
│ } │
│ ``` │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ { │
│ 'fees': [ │
│ {'name': 'annual membership', 'explanation': 'None', 'value': 0.0}, │
│ { │
│ 'name': 'my chase', │
│ 'explanation': 'Monthly fee of 0% of the amount of each eligible purchase transaction or │
│ amount selected to create a My Chase Plan while in the 0% Intro Purchase APR period. After that, │
│ monthly fee of 1.72% of the amount of each eligible purchase transaction or amount selected to create a │
│ My Chase Plan.', │
│ 'value': 1.72 │
│ }, │
│ { │
│ 'name': 'balance transfers', │
│ 'explanation': 'Intro fee of either $5 or 3% of the amount of each transfer, whichever is │
│ greater, on transfers made within 60 days of account opening. After that: Either $5 or 5% of the amount │
│ of each transfer, whichever is greater.', │
│ 'value': 5.0 │
│ }, │
│ { │
│ 'name': 'cash advances', │
│ 'explanation': 'Either $10 or 5% of the amount of each transaction, whichever is greater.', │
│ 'value': 10.0 │
│ }, │
│ { │
│ 'name': 'foreign transactions', │
│ 'explanation': '3% of the amount of each transaction in U.S. dollars.', │
│ 'value': 3.0 │
│ }, │
│ {'name': 'late payment', 'explanation': 'Up to $40.', 'value': 40.0}, │
│ {'name': 'return payment', 'explanation': 'Up to $40.', 'value': 40.0} │
│ ], │
│ 'interest_rates': [ │
│ {'account_type': 'purchase', 'rate': 19.49}, │
│ {'account_type': 'my chase loan', 'rate': 19.49}, │
│ {'account_type': 'balance transfer', 'rate': 19.49}, │
│ {'account_type': 'cash advance', 'rate': 29.49}, │
│ {'account_type': 'penalty', 'rate': 29.99} │
│ ] │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> diff --git a/docs/examples/images/chatbot.png b/docs/dist/examples/images/chatbot.png similarity index 100% rename from docs/examples/images/chatbot.png rename to docs/dist/examples/images/chatbot.png diff --git a/docs/examples/images/chatbot_validation_failed.png b/docs/dist/examples/images/chatbot_validation_failed.png similarity index 100% rename from docs/examples/images/chatbot_validation_failed.png rename to docs/dist/examples/images/chatbot_validation_failed.png diff --git a/docs/examples/input_validation.ipynb b/docs/dist/examples/input_validation.ipynb similarity index 96% rename from docs/examples/input_validation.ipynb rename to docs/dist/examples/input_validation.ipynb index 269f59b3a..9507fad8a 100644 --- a/docs/examples/input_validation.ipynb +++ b/docs/dist/examples/input_validation.ipynb @@ -100,9 +100,7 @@ "# os.environ[\"OPENAI_API_KEY\"] = \"YOUR_API_KEY\"\n", "\n", "try:\n", - " guard(\n", - " model=\"gpt-4o\"\n", - " )\n", + " guard(model=\"gpt-4o\")\n", "except ValidationError as e:\n", " print(e)" ] @@ -151,7 +149,7 @@ "try:\n", " guard(\n", " model=\"gpt-4o\",\n", - " messages=[{\"role\":\"user\",\"content\":\"This is not two words\"}],\n", + " messages=[{\"role\": \"user\", \"content\": \"This is not two words\"}],\n", " )\n", "except ValidationError as e:\n", " print(e)" diff --git a/docs/dist/examples/input_validation.md b/docs/dist/examples/input_validation.md new file mode 100644 index 000000000..1d51fc732 --- /dev/null +++ b/docs/dist/examples/input_validation.md @@ -0,0 +1,113 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +```bash +guardrails hub install hub://guardrails/two_words --quiet +``` + + + +``` + Installing hub://guardrails/two_words... + ✅Successfully installed guardrails/two_words! + + +``` + + + + + +## Input Validation + +Guardrails supports validating inputs (messages) with string validators. + +In XML, specify the validators on the `messages` tag, as such: + + +```python +from guardrails import Guard + +rail_spec = """ + + + +This is not two words + + + + + + +""" + +guard = Guard.for_rail_string(rail_spec) +``` + +When `fix` is specified as the on-fail handler, the prompt will automatically be amended before calling the LLM. + +In any other case (for example, `exception`), a `ValidationError` will be returned in the outcome. + + +```python +from guardrails.errors import ValidationError + +# Add your OPENAI_API_KEY as an environment variable if it's not already set +# import os +# os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY" + +try: + guard(model="gpt-4o") +except ValidationError as e: + print(e) +``` + + + +``` + /Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( + /Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( +``` + + + +When using pydantic to initialize a `Guard`, input validators can be specified by composition, as such: + + +```python +from guardrails.hub import TwoWords +from pydantic import BaseModel + + +class Pet(BaseModel): + name: str + age: int + + +guard = Guard.for_pydantic(Pet) +guard.use(TwoWords(on_fail="exception"), on="messages") + +try: + guard( + model="gpt-4o", + messages=[{"role": "user", "content": "This is not two words"}], + ) +except ValidationError as e: + print(e) +``` + + + +``` + Validation failed for field with errors: Value must be exactly two words + + + /Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( +``` + + diff --git a/docs/examples/json_function_calling_tools.ipynb b/docs/dist/examples/json_function_calling_tools.ipynb similarity index 99% rename from docs/examples/json_function_calling_tools.ipynb rename to docs/dist/examples/json_function_calling_tools.ipynb index f3fb7f73d..2978d4d12 100644 --- a/docs/examples/json_function_calling_tools.ipynb +++ b/docs/dist/examples/json_function_calling_tools.ipynb @@ -26,7 +26,7 @@ "metadata": {}, "outputs": [], "source": [ - "chat_history=\"\"\"\n", + "chat_history = \"\"\"\n", "nelson and murdock: i need a pickup 797 9th Avenue, manila envelope, June 3 10:00am with dropoff 10:30am Courthouse, 61 Center Street C/O frank james\n", "operator: quote - $23.00\n", "neslon and murdock: perfect, we accept the quote\n", @@ -204,17 +204,23 @@ "\n", "NAME_REGEX = \"^[A-Z][a-z]+\\\\s[A-Z][a-z]+$\"\n", "\n", + "\n", "class Delivery(BaseModel):\n", - " custome_name: str= Field(validators=[RegexMatch(regex=NAME_REGEX, on_fail=\"noop\")], description=\"customer name\")\n", - " pickup_time: str= Field(description=\"date and time of pickup\")\n", - " pickup_location: str= Field(description=\"address of pickup\")\n", - " dropoff_time: str= Field(description=\"date and time of dropoff\")\n", - " dropoff_location: str= Field(description=\"address of dropoff\")\n", + " custome_name: str = Field(\n", + " validators=[RegexMatch(regex=NAME_REGEX, on_fail=\"noop\")],\n", + " description=\"customer name\",\n", + " )\n", + " pickup_time: str = Field(description=\"date and time of pickup\")\n", + " pickup_location: str = Field(description=\"address of pickup\")\n", + " dropoff_time: str = Field(description=\"date and time of dropoff\")\n", + " dropoff_location: str = Field(description=\"address of dropoff\")\n", " price: str = Field(description=\"price of delivery with currency symbol included\")\n", "\n", + "\n", "class Schedule(BaseModel):\n", " deliveries: List[Delivery]\n", "\n", + "\n", "pydantic_guard = Guard.for_pydantic(Schedule)\n", "\n", "# Generate the function calling tool and add it to the list\n", @@ -509,7 +515,7 @@ "\n", "response = pydantic_guard(\n", " model=\"gpt-4o\",\n", - " messages=[{\"role\":\"user\", \"content\": prompt}],\n", + " messages=[{\"role\": \"user\", \"content\": prompt}],\n", " prompt_params={\"chat_history\": chat_history},\n", " tools=pydantic_guard_tools,\n", " tool_choice=\"required\",\n", diff --git a/docs/dist/examples/json_function_calling_tools.md b/docs/dist/examples/json_function_calling_tools.md new file mode 100644 index 000000000..53486057d --- /dev/null +++ b/docs/dist/examples/json_function_calling_tools.md @@ -0,0 +1,135 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +```bash +guardrails hub install hub://guardrails/regex_match --quiet +``` + + + +``` + Installing hub://guardrails/regex_match... + ✅Successfully installed guardrails/regex_match! + + +``` + + + + + + +```python +chat_history = """ +nelson and murdock: i need a pickup 797 9th Avenue, manila envelope, June 3 10:00am with dropoff 10:30am Courthouse, 61 Center Street C/O frank james +operator: quote - $23.00 +neslon and murdock: perfect, we accept the quote +operator: 797 9th ave, 10:00am pickup comfirmed +abc flowers: i need a pickup of a flowers from abc flowers at 21 3rd street at 11:00am on june 2 with a dropoff at 75th Ave at 5:30pm same day +operator: 21 3rd street flowers quote - $14.50 +abc flowers: accepted +polk and wardell: i need a pickup of a bagels from Bakers Co at 331 5th street at 11:00am on june 3 with a dropoff at 75th Ave at 5:30pm same day +operator: 331 5th street bagels quote - $34.50 +polk and wardell: accepted +""" + +prompt = """ +From the chat exchanges below extract a schedule of deliveries. +Chats: +${chat_history} +""" +``` + + +```python +from rich import print +from guardrails import Guard +from guardrails.hub import RegexMatch +from pydantic import BaseModel, Field +from typing import List + +NAME_REGEX = "^[A-Z][a-z]+\\s[A-Z][a-z]+$" + + +class Delivery(BaseModel): + custome_name: str = Field( + validators=[RegexMatch(regex=NAME_REGEX, on_fail="noop")], + description="customer name", + ) + pickup_time: str = Field(description="date and time of pickup") + pickup_location: str = Field(description="address of pickup") + dropoff_time: str = Field(description="date and time of dropoff") + dropoff_location: str = Field(description="address of dropoff") + price: str = Field(description="price of delivery with currency symbol included") + + +class Schedule(BaseModel): + deliveries: List[Delivery] + + +pydantic_guard = Guard.for_pydantic(Schedule) + +# Generate the function calling tool and add it to the list +pydantic_guard_tools = pydantic_guard.json_function_calling_tool([]) + +print(pydantic_guard_tools) +``` + +[
{
'type': 'function',
'function': {
'name': 'gd_response_tool',
'description': 'A tool for generating responses to guardrails. It must be called last in every
response.',
'parameters': {
'$defs': {
'Delivery': {
'properties': {
'custome_name': {
'description': 'customer name',
'title': 'Custome Name',
'type': 'string',
'validators': [{'rail_alias': 'guardrails/regex_match'}]
},
'pickup_time': {
'description': 'date and time of pickup',
'title': 'Pickup Time',
'type': 'string'
},
'pickup_location': {
'description': 'address of pickup',
'title': 'Pickup Location',
'type': 'string'
},
'dropoff_time': {
'description': 'date and time of dropoff',
'title': 'Dropoff Time',
'type': 'string'
},
'dropoff_location': {
'description': 'address of dropoff',
'title': 'Dropoff Location',
'type': 'string'
},
'price': {
'description': 'price of delivery with currency symbol included',
'title': 'Price',
'type': 'string'
}
},
'required': [
'custome_name',
'pickup_time',
'pickup_location',
'dropoff_time',
'dropoff_location',
'price'
],
'title': 'Delivery',
'type': 'object'
}
},
'properties': {
'deliveries': {'items': {'$ref': '#/$defs/Delivery'}, 'title': 'Deliveries', 'type': 'array'}
},
'required': ['deliveries'],
'type': 'object',
'title': 'Schedule'
},
'required': ['deliveries']
}
}
]
"}} /> + + +```python +rail = """ + + + + + + + + + + + + + + +""" + +rail_guard = Guard.for_rail_string(rail) + + +# Generate the function calling tool and add it to the list +rail_guard_tools = rail_guard.json_function_calling_tool([]) + +print(rail_guard_tools) +``` + +[
{
'type': 'function',
'function': {
'name': 'gd_response_tool',
'description': 'A tool for generating responses to guardrails. It must be called last in every
response.',
'parameters': {
'properties': {
'deliveries': {
'items': {
'properties': {
'customer_name': {'type': 'string', 'description': 'customer name'},
'pickup_time': {'type': 'string', 'description': 'date and time of pickup'},
'pickup_location': {'type': 'string', 'description': 'address of pickup'},
'dropoff_time': {'type': 'string', 'description': 'date and time of dropoff'},
'dropoff_location': {'type': 'string', 'description': 'address of dropoff'},
'price': {
'type': 'string',
'description': 'price of delivery with currency symbol included'
}
},
'required': [
'customer_name',
'pickup_time',
'pickup_location',
'dropoff_time',
'dropoff_location',
'price'
],
'type': 'object'
},
'type': 'array'
}
},
'required': ['deliveries'],
'type': 'object'
},
'required': ['deliveries']
}
}
]
"}} /> + + +```python +# Add your OPENAI_API_KEY as an environment variable if it's not already set +# import os +# os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY" + +response = pydantic_guard( + model="gpt-4o", + messages=[{"role": "user", "content": prompt}], + prompt_params={"chat_history": chat_history}, + tools=pydantic_guard_tools, + tool_choice="required", +) + +print(response) +``` + + warnings.warn(




ValidationOutcome(
call_id='13988399296',
raw_llm_output='{\"deliveries\":[{\"custome_name\":\"nelson and murdock\",\"pickup_time\":\"June 3
10:00am\",\"pickup_location\":\"797 9th Avenue\",\"dropoff_time\":\"June 3 10:30am\",\"dropoff_location\":\"Courthouse, 61
Center Street C/O frank james\",\"price\":\"$23.00\"},{\"custome_name\":\"abc flowers\",\"pickup_time\":\"June 2
11:00am\",\"pickup_location\":\"21 3rd street\",\"dropoff_time\":\"June 2 5:30pm\",\"dropoff_location\":\"75th
Ave\",\"price\":\"$14.50\"},{\"custome_name\":\"polk and wardell\",\"pickup_time\":\"June 3 11:00am\",\"pickup_location\":\"331 5th
street\",\"dropoff_time\":\"June 3 5:30pm\",\"dropoff_location\":\"75th Ave\",\"price\":\"$34.50\"}]}',
validation_summaries=[
ValidationSummary(
validator_name='RegexMatch',
validator_status='fail',
property_path='$.deliveries.0.custome_name',
failure_reason='Result must match ^[A-Z][a-z]+\\s[A-Z][a-z]+$',
error_spans=None
),
ValidationSummary(
validator_name='RegexMatch',
validator_status='fail',
property_path='$.deliveries.1.custome_name',
failure_reason='Result must match ^[A-Z][a-z]+\\s[A-Z][a-z]+$',
error_spans=None
),
ValidationSummary(
validator_name='RegexMatch',
validator_status='fail',
property_path='$.deliveries.2.custome_name',
failure_reason='Result must match ^[A-Z][a-z]+\\s[A-Z][a-z]+$',
error_spans=None
)
],
validated_output={
'deliveries': [
{
'custome_name': 'nelson and murdock',
'pickup_time': 'June 3 10:00am',
'pickup_location': '797 9th Avenue',
'dropoff_time': 'June 3 10:30am',
'dropoff_location': 'Courthouse, 61 Center Street C/O frank james',
'price': '$23.00'
},
{
'custome_name': 'abc flowers',
'pickup_time': 'June 2 11:00am',
'pickup_location': '21 3rd street',
'dropoff_time': 'June 2 5:30pm',
'dropoff_location': '75th Ave',
'price': '$14.50'
},
{
'custome_name': 'polk and wardell',
'pickup_time': 'June 3 11:00am',
'pickup_location': '331 5th street',
'dropoff_time': 'June 3 5:30pm',
'dropoff_location': '75th Ave',
'price': '$34.50'
}
]
},
reask=None,
validation_passed=False,
error=None
)
"}} /> + + +```python +pydantic_guard.history.last.tree +``` + +Logs
└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ ┃ Role Content ┃ │
│ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ user │ │ │
│ │ │ From the chat exchanges below extract a schedule of deliveries. │ │
│ │ │ Chats: │ │
│ │ │ │ │
│ │ │ nelson and murdock: i need a pickup 797 9th Avenue, manila envelope, June 3 10:00am with │ │
│ │ │ dropoff 10:30am Courthouse, 61 Center Street C/O frank james │ │
│ │ │ operator: quote - $23.00 │ │
│ │ │ neslon and murdock: perfect, we accept the quote │ │
│ │ │ operator: 797 9th ave, 10:00am pickup comfirmed │ │
│ │ │ abc flowers: i need a pickup of a flowers from abc flowers at 21 3rd street at 11:00am on │ │
│ │ │ june 2 with a dropoff at 75th Ave at 5:30pm same day │ │
│ │ │ operator: 21 3rd street flowers quote - $14.50 │ │
│ │ │ abc flowers: accepted │ │
│ │ │ polk and wardell: i need a pickup of a bagels from Bakers Co at 331 5th street at 11:00am on │ │
│ │ │ june 3 with a dropoff at 75th Ave at 5:30pm same day │ │
│ │ │ operator: 331 5th street bagels quote - $34.50 │ │
│ │ │ polk and wardell: accepted │ │
│ │ │ │ │
│ │ │ │ │
│ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ {\"deliveries\":[{\"custome_name\":\"nelson and murdock\",\"pickup_time\":\"June 3 │
│ 10:00am\",\"pickup_location\":\"797 9th Avenue\",\"dropoff_time\":\"June 3 │
│ 10:30am\",\"dropoff_location\":\"Courthouse, 61 Center Street C/O frank │
│ james\",\"price\":\"$23.00\"},{\"custome_name\":\"abc flowers\",\"pickup_time\":\"June 2 │
│ 11:00am\",\"pickup_location\":\"21 3rd street\",\"dropoff_time\":\"June 2 5:30pm\",\"dropoff_location\":\"75th │
│ Ave\",\"price\":\"$14.50\"},{\"custome_name\":\"polk and wardell\",\"pickup_time\":\"June 3 │
│ 11:00am\",\"pickup_location\":\"331 5th street\",\"dropoff_time\":\"June 3 5:30pm\",\"dropoff_location\":\"75th │
│ Ave\",\"price\":\"$34.50\"}]} │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ { │
│ 'deliveries': [ │
│ { │
│ 'custome_name': 'nelson and murdock', │
│ 'pickup_time': 'June 3 10:00am', │
│ 'pickup_location': '797 9th Avenue', │
│ 'dropoff_time': 'June 3 10:30am', │
│ 'dropoff_location': 'Courthouse, 61 Center Street C/O frank james', │
│ 'price': '$23.00' │
│ }, │
│ { │
│ 'custome_name': 'abc flowers', │
│ 'pickup_time': 'June 2 11:00am', │
│ 'pickup_location': '21 3rd street', │
│ 'dropoff_time': 'June 2 5:30pm', │
│ 'dropoff_location': '75th Ave', │
│ 'price': '$14.50' │
│ }, │
│ { │
│ 'custome_name': 'polk and wardell', │
│ 'pickup_time': 'June 3 11:00am', │
│ 'pickup_location': '331 5th street', │
│ 'dropoff_time': 'June 3 5:30pm', │
│ 'dropoff_location': '75th Ave', │
│ 'price': '$34.50' │
│ } │
│ ] │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> + + diff --git a/docs/examples/lite_llm_defaults.ipynb b/docs/dist/examples/lite_llm_defaults.ipynb similarity index 95% rename from docs/examples/lite_llm_defaults.ipynb rename to docs/dist/examples/lite_llm_defaults.ipynb index 8c8792218..c2fb0cc89 100644 --- a/docs/examples/lite_llm_defaults.ipynb +++ b/docs/dist/examples/lite_llm_defaults.ipynb @@ -84,13 +84,10 @@ "\n", "response = guard(\n", " model=\"gpt-4o\",\n", - " messages=[{\n", - " \"role\": \"system\",\n", - " \"content\": \"You are a helpful assistant.\"\n", - " },{\n", - " \"role\": \"user\",\n", - " \"content\": \"How many moons does jupiter have?\"\n", - " }]\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": \"You are a helpful assistant.\"},\n", + " {\"role\": \"user\", \"content\": \"How many moons does jupiter have?\"},\n", + " ],\n", ")\n", "\n", "print(response)" diff --git a/docs/dist/examples/lite_llm_defaults.md b/docs/dist/examples/lite_llm_defaults.md new file mode 100644 index 000000000..68ea4dec9 --- /dev/null +++ b/docs/dist/examples/lite_llm_defaults.md @@ -0,0 +1,43 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +```bash +guardrails hub install hub://guardrails/regex_match --quiet +``` + + + +``` + Installing hub://guardrails/regex_match... + ✅Successfully installed guardrails/regex_match! + + +``` + + + + + + +```python +from rich import print +from guardrails import Guard +from guardrails.hub import RegexMatch + +# Add your OPENAI_API_KEY as an environment variable if it's not already set +# import os +# os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY" + +guard = Guard().use(RegexMatch("95", match_type="search", on_fail="noop")) + +response = guard( + model="gpt-4o", + messages=[ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "How many moons does jupiter have?"}, + ], +) + +print(response) +``` + + warnings.warn(




ValidationOutcome(
call_id='14256398304',
raw_llm_output=\"As of the latest data available, Jupiter has 95 confirmed moons. This number can change as new
moons are discovered and confirmed by astronomers. Jupiter's largest moons, known as the Galilean moons, are Io,
Europa, Ganymede, and Callisto.\",
validation_summaries=[],
validated_output=\"As of the latest data available, Jupiter has 95 confirmed moons. This number can change as
new moons are discovered and confirmed by astronomers. Jupiter's largest moons, known as the Galilean moons, are
Io, Europa, Ganymede, and Callisto.\",
reask=None,
validation_passed=True,
error=None
)
"}} /> diff --git a/docs/examples/llamaindex-output-parsing.ipynb b/docs/dist/examples/llamaindex-output-parsing.ipynb similarity index 96% rename from docs/examples/llamaindex-output-parsing.ipynb rename to docs/dist/examples/llamaindex-output-parsing.ipynb index 53a976c4f..f11f8dc25 100644 --- a/docs/examples/llamaindex-output-parsing.ipynb +++ b/docs/dist/examples/llamaindex-output-parsing.ipynb @@ -85,12 +85,10 @@ "source": [ "import logging\n", "import sys\n", + "from llama_index import VectorStoreIndex, SimpleDirectoryReader\n", "\n", "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", - "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))\n", - "\n", - "from llama_index import VectorStoreIndex, SimpleDirectoryReader\n", - "from IPython.display import Markdown, display" + "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" ] }, { @@ -205,15 +203,9 @@ "class Point(BaseModel):\n", " # In all the fields below, you can define validators as well\n", " # Left out for brevity\n", - " explanation: str = Field(\n", - " description=\"The first thing the author worked on\"\n", - " )\n", - " explanation2: str = Field(\n", - " description=\"The second thing the author worked on\"\n", - " )\n", - " explanation3: str = Field(\n", - " description=\"The third thing the author worked on\"\n", - " )\n", + " explanation: str = Field(description=\"The first thing the author worked on\")\n", + " explanation2: str = Field(description=\"The second thing the author worked on\")\n", + " explanation3: str = Field(description=\"The third thing the author worked on\")\n", "\n", "\n", "class BulletPoints(BaseModel):\n", diff --git a/docs/dist/examples/llamaindex-output-parsing.md b/docs/dist/examples/llamaindex-output-parsing.md new file mode 100644 index 000000000..0353cd8d4 --- /dev/null +++ b/docs/dist/examples/llamaindex-output-parsing.md @@ -0,0 +1,240 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +Open In Colab + + + +# Guardrails Output Parsing (Deprecated) + +## DEPRECATION NOTE +This integration between LlamaIndex and Guardrails is only valid for llama-index ~0.9.x and guardrails-ai < 0.5.x. and thus has been deprecated. For an updated example of using Guardrails with LlamaIndex with their latest versions, see the [GuardrailsEngine](/docs/integrations/llama_index) + + +If you're opening this Notebook on colab, you will probably need to install LlamaIndex 🦙. + +#### Download Data + + +```bash +mkdir -p 'data/paul_graham/' +wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham/paul_graham_essay.txt' +``` + + + +``` + --2023-12-01 10:30:22-- https://raw.githubusercontent.com/run-llama/llama_index/main/docs/examples/data/paul_graham/paul_graham_essay.txt + Loaded CA certificate '/etc/ssl/certs/ca-certificates.crt' + Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.109.133, 185.199.108.133, 185.199.110.133, ... + Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.109.133|:443... connected. + HTTP request sent, awaiting response... 200 OK + Length: 75042 (73K) [text/plain] + Saving to: ‘data/paul_graham/paul_graham_essay.txt’ + + data/paul_graham/pa 100%[===================>] 73.28K --.-KB/s in 0.02s + + 2023-12-01 10:30:23 (3.82 MB/s) - ‘data/paul_graham/paul_graham_essay.txt’ saved [75042/75042] + +``` + + + +#### Load documents, build the VectorStoreIndex + + + +```python +import logging +import sys +from llama_index import VectorStoreIndex, SimpleDirectoryReader + +logging.basicConfig(stream=sys.stdout, level=logging.INFO) +logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout)) +``` + + +```python +# load documents +documents = SimpleDirectoryReader("./data/paul_graham/").load_data() +``` + + +```python +index = VectorStoreIndex.from_documents(documents, chunk_size=512) +``` + + + +``` + INFO:httpx:HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK" + HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK" + INFO:httpx:HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK" + HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK" + INFO:httpx:HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK" + HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK" +``` + + + +#### Define Query + Guardrails Spec + + + +```python +from llama_index.output_parsers import GuardrailsOutputParser +from llama_index.llm_predictor import StructuredLLMPredictor +``` + + +```python +llm_predictor = StructuredLLMPredictor() +``` + +**Define custom QA and Refine Prompts** + + + +```python +from llama_index.prompts import PromptTemplate +from llama_index.prompts.default_prompts import ( + DEFAULT_TEXT_QA_PROMPT_TMPL, + DEFAULT_REFINE_PROMPT_TMPL, +) +``` + +**Define Guardrails Spec** + + + +```python +# You can either define a RailSpec and initialise a Guard object for_rail_string() +# OR define Pydantic classes and initialise a Guard object for_pydantic() +# For more info: https://docs.guardrailsai.com/defining_guards/pydantic/ +# Guardrails recommends Pydantic + +from pydantic import BaseModel, Field +import guardrails as gd + + +class Point(BaseModel): + # In all the fields below, you can define validators as well + # Left out for brevity + explanation: str = Field(description="The first thing the author worked on") + explanation2: str = Field(description="The second thing the author worked on") + explanation3: str = Field(description="The third thing the author worked on") + + +class BulletPoints(BaseModel): + points: Point = Field( + description="Bullet points regarding events in the author's life." + ) + + +# Define the prompt +prompt = """ +Query string here. + +${output_schema} + +${gr.json_suffix_prompt_v2_wo_none} +""" +``` + + +```python +# Create a guard object +guard = gd.Guard.for_pydantic(output_class=BulletPoints, prompt=prompt) + +# Create output parse object +output_parser = GuardrailsOutputParser(guard, llm=llm_predictor.llm.complete) +``` + + +```python +# NOTE: we use the same output parser for both prompts, though you can choose to use different parsers +# NOTE: here we add formatting instructions to the prompts. + +fmt_qa_tmpl = output_parser.format(DEFAULT_TEXT_QA_PROMPT_TMPL) +fmt_refine_tmpl = output_parser.format(DEFAULT_REFINE_PROMPT_TMPL) + +qa_prompt = PromptTemplate(fmt_qa_tmpl, output_parser=output_parser) +refine_prompt = PromptTemplate(fmt_refine_tmpl, output_parser=output_parser) +``` + + +```python +# take a look at the new QA template! +print(fmt_qa_tmpl) +``` + + + +``` + Context information is below. + --------------------- + {context_str} + --------------------- + Given the context information and not prior knowledge, answer the query. + Query: {query_str} + Answer: + + ct name="points" description="Bullet points regarding events in the author's life."> + + + +
+
+ + + + ONLY return a valid JSON object (no other text is necessary). The JSON MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and specific types. Be correct and concise. + + +``` + +
+ +#### Query Index + + + +```python +query_engine = index.as_query_engine( + text_qa_template=qa_prompt, + refine_template=refine_prompt, + llm_predictor=llm_predictor, +) +response = query_engine.query( + "What are the three items the author did growing up?", +) +``` + + + +``` + INFO:httpx:HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK" + HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK" + INFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" + HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +``` + + + + +```python +print(response) +``` + + + +``` + { + "points": { + "explanation": "writing", + "explanation2": "programming", + "explanation3": "philosophy" + } + } +``` + + diff --git a/docs/examples/no_secrets_in_generated_text.ipynb b/docs/dist/examples/no_secrets_in_generated_text.ipynb similarity index 99% rename from docs/examples/no_secrets_in_generated_text.ipynb rename to docs/dist/examples/no_secrets_in_generated_text.ipynb index 77b595111..d002d130c 100644 --- a/docs/examples/no_secrets_in_generated_text.ipynb +++ b/docs/dist/examples/no_secrets_in_generated_text.ipynb @@ -47,7 +47,13 @@ "metadata": {}, "outputs": [], "source": [ - "from guardrails.validators import Validator, register_validator, PassResult, FailResult, ValidationResult\n", + "from guardrails.validators import (\n", + " Validator,\n", + " register_validator,\n", + " PassResult,\n", + " FailResult,\n", + " ValidationResult,\n", + ")\n", "\n", "import re\n", "from typing import Dict, Any\n", @@ -57,7 +63,6 @@ "\n", "@register_validator(name=\"no-code-secrets\", data_type=\"string\")\n", "class NoCodeSecrets(Validator):\n", - "\n", " def validate(self, value: Any, metadata: Dict) -> ValidationResult:\n", " global OPENAI_KEY_PATTERN\n", "\n", @@ -135,8 +140,12 @@ "${gr.complete_xml_suffix}\n", "\"\"\"\n", "\n", + "\n", "class ScrubbedCode(BaseModel):\n", - " api_help: str = Field(description=\"Show an example curl command for using openai Completion API\", validators=[NoCodeSecrets(on_fail=\"fix\")])" + " api_help: str = Field(\n", + " description=\"Show an example curl command for using openai Completion API\",\n", + " validators=[NoCodeSecrets(on_fail=\"fix\")],\n", + " )" ] }, { @@ -231,10 +240,10 @@ "# os.environ[\"OPENAI_API_KEY\"] = \"YOUR_API_KEY\"\n", "\n", "raw_llm_response, validated_response, *rest = guard(\n", - " model=\"gpt-4o-mini\",\n", - " max_tokens=3548,\n", - " temperature=0,\n", - " messages=[{\"role\":\"user\", \"content\": prompt}],\n", + " model=\"gpt-4o-mini\",\n", + " max_tokens=3548,\n", + " temperature=0,\n", + " messages=[{\"role\": \"user\", \"content\": prompt}],\n", ")" ] }, diff --git a/docs/dist/examples/no_secrets_in_generated_text.md b/docs/dist/examples/no_secrets_in_generated_text.md new file mode 100644 index 000000000..199f0cd88 --- /dev/null +++ b/docs/dist/examples/no_secrets_in_generated_text.md @@ -0,0 +1,190 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +# Generating strings that don't have any secrets + +!!! note + To download this example as a Jupyter notebook, click [here](https://github.com/guardrails-ai/guardrails/blob/main/docs/examples/no_secrets_in_generated_text.ipynb). + +In this example, we will use Guardrails to generate strings that don't have any secrets. + +This is also a good example to show how to use the custom Validators in the `RAIL` specification. + +## Objective + +We want to ask help with an API, but make sure that the generated text has no secrets. + + + +## Step 1: Create the RAIL Spec + +Ordinarily, we would create an RAIL spec in a separate file. For the purposes of this example, we will create the spec in this notebook as a string following the RAIL syntax. For more information on RAIL, see the [RAIL documentation](/docs/how_to_guides/rail). We will also show the same RAIL spec in a code-first format using a Pydantic model. + +In this RAIL spec, we: + +1. Create a custom Validator that checks if a string has any secrets. This is a simple example, but you can use this to create more complex Validators. For more information on creating custom Validators, see the [Validators documentation](/docs/hub/how_to_guides/custom_validator). +2. Create a `output` schema that returns an object with a `api_help` key. + +First the custom Validator: + + +```python +from guardrails.validators import ( + Validator, + register_validator, + PassResult, + FailResult, + ValidationResult, +) + +import re +from typing import Dict, Any + +OPENAI_KEY_PATTERN = re.compile(r"sk-[a-zA-Z0-9]{24}") + + +@register_validator(name="no-code-secrets", data_type="string") +class NoCodeSecrets(Validator): + def validate(self, value: Any, metadata: Dict) -> ValidationResult: + global OPENAI_KEY_PATTERN + + if re.search(OPENAI_KEY_PATTERN, value) is not None: + # Corrected value should replace the OpenAI API key with "sk-xxx" + correct_value = re.sub(OPENAI_KEY_PATTERN, "sk-xxx", value) + raise FailResult( + error_message=f"Value {value} is an OpenAI API key.", + fix_value=correct_value, + ) + + return PassResult() +``` + +Now we can use the validator in a Rail spec: + + +```python +rail_str = """ + + + + + + + + + + +How do I use OpenAI's Completion API? + +${gr.complete_xml_suffix} + + + + + +""" +``` + + + +Or in a Pydantic model: + + +```python +from pydantic import BaseModel, Field + + +prompt = """ + +How do I use OpenAI's Completion API? + +${gr.complete_xml_suffix} +""" + + +class ScrubbedCode(BaseModel): + api_help: str = Field( + description="Show an example curl command for using openai Completion API", + validators=[NoCodeSecrets(on_fail="fix")], + ) +``` + +## Step 2: Create a `Guard` object with the RAIL Spec + +We create a `gd.Guard` object that will check, validate and correct the output of the LLM. This object: + +1. Enforces the quality criteria specified in the RAIL spec. +2. Takes corrective action when the quality criteria are not met. +3. Compiles the schema and type info from the RAIL spec and adds it to the prompt. + + +```python +import guardrails as gd + +from rich import print +``` + +From the XML RAIL spec: + + +```python +guard = gd.Guard.for_rail_string(rail_str) +``` + +Or from the Pydantic model: + + +```python +guard = gd.Guard.for_pydantic(output_class=ScrubbedCode) +``` + +## Step 3: Wrap the LLM API call with `Guard` + +The `guard` wrapper returns the raw_llm_respose (which is a simple string), and the validated and corrected output (which is a dictionary). + +We can see that the output is a dictionary with the correct schema and types. + + +```python +# Set your OPENAI_API_KEY as an environment variable +# import os +# os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY" + +raw_llm_response, validated_response, *rest = guard( + model="gpt-4o-mini", + max_tokens=3548, + temperature=0, + messages=[{"role": "user", "content": prompt}], +) +``` + + + +``` + /Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( +``` + + + +We can see the prompt that was sent to the LLM. + + +```python +print(guard.history.last.iterations.first.inputs.messages[0]["content"]) +``` + +

How do I use OpenAI's Completion API?


Given below is XML that describes the information to extract from this document and the tags to extract it into.

<output>
<string description=\"Show an example curl command for using openai Completion API\" format=\"no-code-secrets\"
name=\"api_help\" required=\"true\"></string>
</output>

ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the `name`
attribute of the corresponding XML, and the value is of the type specified by the corresponding XML's tag. The JSON
MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and
specific types. Be correct and concise. If you are unsure anywhere, enter `null`.

Here are examples of simple (XML, JSON) pairs that show the expected behavior:
- `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`
- `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', 'STRING TWO', etc.]}`
- `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" format=\"1-indexed\"
/></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`


"}} /> + + +```python +print(validated_response) +``` + +{
'api_help': 'curl https://api.openai.com/v1/completions -H \'Content-Type: application/json\' -H
\'Authorization: Bearer YOUR_API_KEY\' -d \'{\"model\": \"text-davinci-003\", \"prompt\": \"Once upon a time\",
\"max_tokens\": 50}\''
}
"}} /> + + +```python +print(guard.history.last.tree) +``` + +Logs
└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ ┃ Role Content ┃ │
│ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ user │ │ │
│ │ │ │ │
│ │ │ How do I use OpenAI's Completion API? │ │
│ │ │ │ │
│ │ │ │ │
│ │ │ Given below is XML that describes the information to extract from this document and the tags │ │
│ │ │ to extract it into. │ │
│ │ │ │ │
│ │ │ <output> │ │
│ │ │ <string description=\"Show an example curl command for using openai Completion API\" │ │
│ │ │ format=\"no-code-secrets\" name=\"api_help\" required=\"true\"></string> │ │
│ │ │ </output> │ │
│ │ │ │ │
│ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in │ │
│ │ │ JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │
│ │ │ any types and format requests e.g. requests for lists, objects and specific types. Be │ │
│ │ │ correct and concise. If you are unsure anywhere, enter `null`. │ │
│ │ │ │ │
│ │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior: │ │
│ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │ │
│ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', │ │
│ │ │ 'STRING TWO', etc.]}` │ │
│ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer │ │
│ │ │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': │ │
│ │ │ 1}}` │ │
│ │ │ │ │
│ │ │ │ │
│ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ { │
│ \"api_help\": \"curl https://api.openai.com/v1/completions -H 'Content-Type: application/json' -H │
│ 'Authorization: Bearer YOUR_API_KEY' -d '{\"model\": \"text-davinci-003\", \"prompt\": \"Once upon a │
│ time\", \"max_tokens\": 50}'\" │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ { │
│ 'api_help': 'curl https://api.openai.com/v1/completions -H \'Content-Type: application/json\' -H │
│ \'Authorization: Bearer YOUR_API_KEY\' -d \'{\"model\": \"text-davinci-003\", \"prompt\": \"Once upon a time\", │
│ \"max_tokens\": 50}\'' │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> diff --git a/docs/examples/provenance.ipynb b/docs/dist/examples/provenance.ipynb similarity index 99% rename from docs/examples/provenance.ipynb rename to docs/dist/examples/provenance.ipynb index 529e090fc..df1e08116 100644 --- a/docs/examples/provenance.ipynb +++ b/docs/dist/examples/provenance.ipynb @@ -285,7 +285,6 @@ "outputs": [], "source": [ "# Create an embedding function that uses a cohere model to embed the text\n", - "from rich import print\n", "import cohere\n", "import numpy as np\n", "from guardrails import Guard\n", @@ -593,7 +592,9 @@ "guard_1.parse(\n", " llm_output=\"To retrain a cat to use the litter box, put its litter box in a low traffic area with at least 2 exits so the cat doesn’t feel cornered. Find the right litterbox for your cat, as well as the right litter. Place the litterbox in a good spot, away from heavily trafficked and noisy areas. Keep the litterbox very clean, and do not punish the cat or confine her to just one room. Once training is complete, it is important to clean the litter box regularly and to provide a safe and healthy environment for the cat.\",\n", " metadata={\"embed_function\": embed_function, \"sources\": sources},\n", - " api_key=os.environ[\"OPENAI_API_KEY\"], # OpenAI API key if using an OpenAI model for 'llm_callable', OR using one of the above options\n", + " api_key=os.environ[\n", + " \"OPENAI_API_KEY\"\n", + " ], # OpenAI API key if using an OpenAI model for 'llm_callable', OR using one of the above options\n", ")\n", "\n", "# See the guard logs\n", diff --git a/docs/dist/examples/provenance.md b/docs/dist/examples/provenance.md new file mode 100644 index 000000000..df93e9bf6 --- /dev/null +++ b/docs/dist/examples/provenance.md @@ -0,0 +1,386 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +```bash +guardrails hub install hub://guardrails/provenance_embeddings --quiet +guardrails hub install hub://guardrails/provenance_llm --quiet +``` + + + +``` + Installing hub://guardrails/provenance_embeddings... + ERROR:guardrails-cli:No module named 'guardrails.hub.guardrails.provenance_embeddings' + Installing hub://guardrails/provenance_llm... + ERROR:guardrails-cli:No module named 'guardrails.hub.guardrails.provenance_llm' +``` + + + + + +# Adding Provenance guardrails to the workflow + + +As we've seen, LLMs are great at generating structured data. Adding guardrails to that workflow gives us tighter responses and more control. While structured data is super useful as an interface between different systems, it's not always the best way to communicate with humans. For that, we need to generate unstructured text. + +A problem with generating unstructured text is hallucination. Hallucination occurs when an LLM generates text that is not supported by the input. + +Guardrails has provenance validators that detect and limit hallucinations. In this example, we show how to set them up. + +**Both provenance validators support validating LLM-generated text on both sentence-level and entire text level. In this demo, we'll demo how sentence-level validation works. In sentence-level validaton, each sentence in the LLM-generated text will be checked for provenance.** + + +## ProvenanceEmbeddings + +When you need to confirm that an LLM response is supported by a source text, you can use the ```ProvenanceEmbeddings``` Guardrails validator function. This function takes a list source articles, an LLM response (or prompt), and a threshold. It validates whether the response is "close" enough to the source articles. The threshold is a number between 0 and 1, where 1 means the response is not close to the source articles, and 0 means the response is very close to the source articles. + +The provenance validator function can also wrap an LLM response (similar to what we saw in the first example). It can also wrap a query function to interact with your vector database as a source. These two uses are out-of-scope for this document. + +For the sake of this post, let's use the following configuration for our validator: + +1. `sources`: List of strings, each representing a source. +2. `embed function`: A function that takes a list of strings of length k and returns a 2D numpy array of shape (k, embedding_dim). + +## Set up our source data + + + +```python +sources = [ + """1 Move the litter box to the right location. Cats may stop using the litter box after a scary experience in the +area, such as a loud noise or harassment by another pet. [2] They may also dislike the spot you chose after moving +the litter box, or moving to a new home. Keep the litter box in a quiet, low-traffic spot where the cat can see +people coming. Choose a room with at least two exits so the cat doesn't feel cornered. [3] Keep litter boxes away +from food and water bowls. Cats do not like to combine these two areas. Signs that your cat may have had an +unpleasant experience in the litter box including running quickly in and out of the litter box, or using an area +near the litter box. [4] Try moving the box to a new room if you notice this. Keep at least one litter box on every +floor of a multistory home. [5] Keep litter boxes away from food and water bowls. Cats do not like to combine these +two areas. Signs that your cat may have had an unpleasant experience in the litter box including running quickly in +and out of the litter box, or using an area near the litter box. [4] Try moving the box to a new room if you notice +this. Keep at least one litter box on every floor of a multistory home. [5] 2 Play with toys near the litter box. +Play with your cat in the same general area as the litter box. Leave toys (but not food) in the room so the cat +spends time there and develops positive associations. [6] You can bring the cat to the litter box to investigate on +its own, but do not drop it inside or reward it with treats for using it. These tactics can backfire by making the +cat uncomfortable or afraid. [7] Unlike dogs, cats should choose the litter box on their own, especially if they +used one in the past. You can bring the cat to the litter box to investigate on its own, but do not drop it inside +or reward it with treats for using it. These tactics can backfire by making the cat uncomfortable or afraid. [7] +Unlike dogs, cats should choose the litter box on their own, especially if they used one in the past. 3 Keep the +litter box clean. [8] If your cat perches on the edge of the box or eliminates right next to it, the box might be +too dirty for it. Remove clumps and top up with fresh litter at least once a day, preferably twice. Rinse the +litter box once a week with baking soda or unscented soap. [9] If you use non-clumping litter, change the whole box +every couple days to prevent odor build up, which can drive away the cat. [10] Do not clean the litter box with +scented products. Do not use a disinfectant unless it is specifically made for litter boxes, as many of them +contain chemicals toxic to cats. [11] If you use non-clumping litter, change the whole box every couple days to +prevent odor build up, which can drive away the cat. [10] Do not clean the litter box with scented products. Do not +use a disinfectant unless it is specifically made for litter boxes, as many of them contain chemicals toxic to +cats. [11] 4 Switch to new litter gradually. If you bought a different kind of litter, introduce it slowly. Mix a +little of it in with the old type, and gradually increase the proportion each time you change the litter box. [12] +Cats usually find it easier to adjust to unscented litter with a similar texture to their old litter. [13] If the +old type of litter is no longer available, buy two or three new types. Put them in separate litter boxes side by +side and let the cat choose its favorite. Try adjusting the depth of the litter, especially if it has a different +texture than the cat is used to. Many cats prefer a shallow layer of litter, less than two inches (5 cm.) deep. +Long-haired cats often like an extra-shallow layer so they can dig to the floor of the box. [14] If the old type of +litter is no longer available, buy two or three new types. Put them in separate litter boxes side by side and let +the cat choose its favorite. Try adjusting the depth of the litter, especially if it has a different texture than +the cat is used to. Many cats prefer a shallow layer of litter, less than two inches (5 cm.) deep. Long-haired cats +often like an extra-shallow layer so they can dig to the floor of the box. [14] 5 Troubleshoot new litter boxes. If +your cat hasn't responded well to a recent litter box replacement, try these adjustments to make it more appealing: +[15] Some cats prefer covered boxes, and other prefer open trays. Try adding or removing the hood. Remove plastic +liners from the litter box. These can snag a cat's claws. [16] Most cats adjust well to self-cleaning litter boxes +but not all. There is a risk of an anxious cat being frightened by the motor, and refusing to use the box as a +result. If in doubt it’s best to stick with a regular litter box. If the box is smaller than the old one, you +probably need to replace it with something larger. A large box with low sides works best; some people use a plastic +sweater box. [17] Some cats prefer covered boxes, and other prefer open trays. Try adding or removing the hood. +Remove plastic liners from the litter box. These can snag a cat's claws. [16] Most cats adjust well to +self-cleaning litter boxes but not all. There is a risk of an anxious cat being frightened by the motor, and +refusing to use the box as a result. If in doubt it’s best to stick with a regular litter box. If the box is +smaller than the old one, you probably need to replace it with something larger. A large box with low sides works +best; some people use a plastic sweater box. [17] 6 Clean up urine and feces with an enzymatic cleaner. When the +cat fails to use its litter box, clean the area with an enzymatic cleaner designed for cat urine (or a 10% solution +of enzymatic washing powder in water). Rinse with cold water. This removes the smell of urine that can attract a +cat to return to the same location. [18] For best results, lightly spray the area with rubbing alcohol after the +water has dried. Scrub gently and let it air dry. For best results, lightly spray the area with rubbing alcohol +after the water has dried. Scrub gently and let it air dry. 7 Make soiled areas less appealing. If your cat has +developed a habit of going in certain locations, block its access to those areas, or find temporary ways to +discourage it until it has relearned good habits: If the cat uses a dark hiding spot, install a bright light, +preferably motion-activated. [19] Make rugs or other areas unpleasant to stand on with tin foil or double-sided +tape.""", + """[20] If the cat urinated on curtains, pin them up out of reach until the cat is back to using its litter. +[21] Cover targeted furniture with plastic sheets or shower curtains. [22] Fill bathtubs and sinks with a shallow +layer of water when not in use. [23] If the cat uses a dark hiding spot, install a bright light, preferably +motion-activated. [19] Make rugs or other areas unpleasant to stand on with tin foil or double-sided tape. [20] If +the cat urinated on curtains, pin them up out of reach until the cat is back to using its litter. [21] Cover +targeted furniture with plastic sheets or shower curtains. [22] Fill bathtubs and sinks with a shallow layer of +water when not in use. [23] 8 Place litter boxes in the problem areas. One solution is to give in to your cat's +preferences and add new boxes in the areas it's using as a bathroom. Clearly this isn't ideal if your cat is using +the center of the living room rug, but it's worth considering if the cat is soiling an out-of-the-way corner of +your house. Another option is to move the cat's food bowl to this location. Most cats will not eliminate and eat in +the same place. Another option is to move the cat's food bowl to this location. Most cats will not eliminate and +eat in the same place. 9 Use your cat's preference to your advantage. If none of these adjustments work, you may +have to resort to a slower transition. For example, if your cat prefers to urinate on carpet, place a piece of +similar carpet in the litter box. If the cat is willing to use that option, add a small amount of litter on top of +the carpet the next day. Continue adding more litter and replacing the carpet when it gets too dirty, until the cat +is transitioned to litter completely. You may have to confine the cat to a non-carpeted area of the house for a +while to get this option to work, or to roll up your carpets temporarily. Confinement can backfire if the cat is +stressed or bored. Similarly, if your cat is indoor/outdoor, or if your cat used to eliminate mostly outside, add +garden soil or sand (without any fertilizer) to the box. Again, transition slowly from sand/soil to litter by +adding small amounts of the new substrate to the preferred substrate a little at a time. You may have to confine +the cat to a non-carpeted area of the house for a while to get this option to work, or to roll up your carpets +temporarily. Confinement can backfire if the cat is stressed or bored. Similarly, if your cat is indoor/outdoor, or +if your cat used to eliminate mostly outside, add garden soil or sand (without any fertilizer) to the box. Again, +transition slowly from sand/soil to litter by adding small amounts of the new substrate to the preferred substrate +a little at a time. Method 2 1 Spay or neuter your cat. This is not a requirement for litter training, but it does +make urination outside the litter box much less likely. Unneutered males are especially likely to spray urine when +they're stressed, not getting along with another male, or demonstrating their availability to a female cat. [24] +The sooner this happens, the more likely the behavior will stop. If it goes on too long, the habit can persist even +after surgery. [25] The sooner this happens, the more likely the behavior will stop. If it goes on too long, the +habit can persist even after surgery. [25] 2 Reduce stress in your cat . [26] Just like humans, cats may experience +stress from changes in their environment or schedule. Your cat may stop using the litterbox after a person or other +animal leaves the household, or when a new one moves in. Some cats even respond badly to redecoration. Here are a +few ways to help: Provide private places where the cat can be on its own, including hiding spots and high perches. +If your cat is allowed outside, let it come and go whenever it likes. [27] Let your cat initiate contact, and be +calm and consistent in your response. Some cats are stressed because they aren't getting enough playtime, while +others dislike being pet or picked up whenever the owner feels like it. If the cat's behavior continues, consult a +veterinarian or animal behaviorist. Provide private places where the cat can be on its own, including hiding spots +and high perches. If your cat is allowed outside, let it come and go whenever it likes. [27] Let your cat initiate +contact, and be calm and consistent in your response. Some cats are stressed because they aren't getting enough +playtime, while others dislike being pet or picked up whenever the owner feels like it. If the cat's behavior +continues, consult a veterinarian or animal behaviorist. 3 Respond to vertical spraying. If your cat backs up +against a vertical surface, wiggles its tail, and releases a spray of urine, your cat is spraying. If you don't see +it in action, look for roundish areas of strong-smelling urine a little higher up than the height of your cat's +rear end, with streak marks running down to the baseboard or floor. Any cat can perform this territorial behavior, +but it is most common in unneutered, male cats. Here's how to respond if your cat is spraying: Spraying is often a +response to stress or the presence of other cats. [28] Follow the advice above to address this. Spraying can be a +response to a new neighborhood cat, especially if the spray is focused on a door, window, or air vent. Try to keep +the cat out of your yard , or close the blinds so your cat can't see it. About 30% of cats that vets examine for +spraying have a medical condition. [29] It's a good idea to have your cat examined, especially if you cannot find a +solution. Spraying is often a response to stress or the presence of other cats. [28] Follow the advice above to +address this. Spraying can be a response to a new neighborhood cat, especially if the spray is focused on a door, +window, or air vent. Try to keep the cat out of your yard , or close the blinds so your cat can't see it. About 30% +of cats that vets examine for spraying have a medical condition. [29] It's a good idea to have your cat examined, +especially if you cannot find a solution. 4 Replace small boxes as a kitten grows. If you adopted your cat as a +kitten, it may need a larger litter box once it grows up. The cat should be able to turn around comfortably, and +still be able to find a clean spot if you miss a cleanup. [30] Cats dislike change, and may take a while to adapt +to the new box. Follow the instructions above if problems continue. Cats dislike change, and may take a while to +adapt to the new box. Follow the instructions above if problems continue. 5 Clip away matted fur in long-haired +cats . Some long-haired cats dirty the fur around their rear when they eliminate. This can cause painful or +unpleasant experiences that the cat learns to associate with the litter box. If you notice this happening, +carefully clip away matted fur from the area. [31] 6 Minimize damage when the owner is away. Some cats react poorly +when their owner is away. They may try to urinate somewhere with a strong scent of the owner, usually the bed. +Instruct the pet sitter to keep the bedroom door shut, and provide extra litter boxes so the cat can always reach +one without walking by the pet sitter. [32] If possible, hire a pet sitter the cat already knows, or at least +introduce them before you leave. If possible, hire a pet sitter the cat already knows, or at least introduce them +before you leave. 7 Improve behavior in multi-pet households. Urine marking is a common reaction to conflict with +another cat or dog, which can happen even if the animals got along in the past. For best results, make sure each +animal can access resources without approaching the other: [33] Keep one litter box for each animal, plus one +extra. Put each one in a separate location with at least two exit routes if possible. Give each animal its own bed +and food bowl. Keep these resources away from litter boxes and from each other. Provide plenty of perches and +hiding spaces for each cat. Keep one litter box for each animal, plus one extra. Put each one in a separate +location with at least two exit routes if possible. Give each animal its own bed and food bowl. Keep these +resources away from litter boxes and from each other. Provide plenty of perches and hiding spaces for each cat. 8 +Separate animals if bad behavior continues. If your cat still won't use the litter box, or still acts aggressive to +the other animal, try a stricter method of separation. This is often necessary when bringing a new cat into the +household: [34] Separate the cats into rooms with a closed door in between, so they do not see each other. Gather +each cat's facial pheromones (forehead, cheeks, chin) on a small sock or gauze pad and put each sock in the others' +space. Then, brush each cat to collect their facial pheromones and place one cat's pheromones on the other, +creating a group scent. Swap spaces so they can smell each other's scent in the environment. Introduce them +carefully, providing a high place and hidey holes for escape if one is aggressive to the other. Consult a cat +behaviorist if the cats simply can't get along. Separate the cats into rooms with a closed door in between, so they +do not see each other. Gather each cat's facial pheromones (forehead, cheeks, chin) on a small sock or gauze pad +and put each sock in the others' space. Then, brush each cat to collect their facial pheromones and place one cat's +pheromones on the other, creating a group scent. Swap spaces so they can smell each other's scent in the +environment. Introduce them carefully, providing a high place and hidey holes for escape if one is aggressive to +the other. Consult a cat behaviorist if the cats simply can't get along. Method 3 1 Assess whether your cat is +having a hard time urinating. If you see your cat straining while trying to urinate, or spending a long time trying +with no result, take your cat to the vet immediately. Male cats in particular can develop urinary conditions where +the urethra (the tube from the bladder to the penis) narrows or gets blocked. Typically small amounts of urine can +pass until the cat is completely blocked and cannot urinate at all. This is a life threatening situation and needs +immediate medical care. Blockages can also occur in the intestinal tract. Some cats with a urinary infection or +blockage spend a lot of time trying to urinate, licking their genitals, or crying at their owner. [35] Some cats +with a urinary infection or blockage spend a lot of time trying to urinate, licking their genitals, or crying at +their owner.""", + """[35] 2 Evaluate whether your cat is having fecal issues. Fecal constipation does occur in cats and can +lead to chronic issues requiring special diets and laxatives. Diarrhea is not uncommon either, including chronic +diarrhea related to inflammatory bowel disease. Any of these conditions are uncomfortable for the cat and may cause +the cat to be afraid of the litter box or unable to get to the litter box in time to avoid an accident. Many cats +with inflammatory bowel disease only have occasional symptoms for no obvious reason. Appetite changes, lethargy, +vomiting, or increased hairball production can be signs of intestinal discomfort. Many cats with inflammatory bowel +disease only have occasional symptoms for no obvious reason. Appetite changes, lethargy, vomiting, or increased +hairball production can be signs of intestinal discomfort. 3 Improve physical access to the box. If your cat is +older or has an injury, it may not be able to get into the litter box as comfortably as it once could. Does your +cat limp, need help jumping up to a chair or bed, have episodes of shaking legs, or seem painful around its spine +or tail? If so, take the cat to the vet immediately! You may be able to make the cat more comfortable by getting a +litter box with lower sides, or with a "doorway" cut into the side. You may need to consider a larger box so that +the cat can turn around easily once inside. An overweight cat may not fit comfortably in the box any longer. Get a +larger box and place the cat on a diet. Consult with your veterinarian about safe weight loss strategies for your +cat. An overweight cat may not fit comfortably in the box any longer. Get a larger box and place the cat on a diet. +Consult with your veterinarian about safe weight loss strategies for your cat. 4 Talk to your veterinarian to rule +out other medical problems. [36] Urinating outside of the litter box often results from a feline medical issue, +including urinary tract infections, diabetes mellitus, chronic renal disease, hyperthyroidism, bladder inflammation +with or without urinary crystals, and intestinal issues (IBD). When in doubt, have a veterinarian conduct a medical +checkup. Observe your cat so you are prepared to answer your veterinarian's questions. Possible questions include: +Does the cat urinate right by the litter box or further away? How large is the spot of urine? Does the cat ever try +to urinate in the litter box? Does the cat vocalize when urinating? Is there an increase in water consumption? Can +you tell if the urine is almost clear, normal color, or dark? How frequently is the cat urinating? Even if there is +no medical cause, your vet could prescribe anti-anxiety drugs to prevent spraying. This is not a guaranteed or +risk-free solution, so talk to your vet about the pros and cons. Observe your cat so you are prepared to answer +your veterinarian's questions. Possible questions include: Does the cat urinate right by the litter box or further +away? How large is the spot of urine? Does the cat ever try to urinate in the litter box? Does the cat vocalize +when urinating? Is there an increase in water consumption? Can you tell if the urine is almost clear, normal color, +or dark? How frequently is the cat urinating? Even if there is no medical cause, your vet could prescribe +anti-anxiety drugs to prevent spraying. This is not a guaranteed or risk-free solution, so talk to your vet about +the pros and cons. There are several possible reasons for this behavior. Your cat may have a medical condition that +needs treatment from a vet. However, it's also possible that your cat is afraid of the box because something scary +happened near it, like a loud sound or a fight with another household cat. It could also be as simple as the box is +dirty. I would first try to figure out what's causing your cat's issue. Most cats stop using their litter box +because they don't like the box, its location, the litter, or it's not clean enough for them. I would experiment +until you find what works best for your cat. If your cat still isn't using the litter box, talk to your vet to rule +out a medical issue. Cats are clean creatures that dislike soiling their living quarters. You can litter train a +stray but it does take patience. Keep the cat in a small room with a tray in one corner, food and water in another, +and a bed in a different corner. Given a choice between soiling their bed or food, the cat will most likely chose +the tray.""", +] +``` + +**Create embed function** + +This embed funtion is a wrapper around the Cohere embed API. The function takes in a parameter called "text" and embeds that text. The embed function is used both for the source text as well as the output text. For the source text, the embed function is called only after Guardrails automatically chunks the text into smaller pieces. All the chunks are arranged in a list which is passed to Cohere. For the output text, the embed function is called, and then vector similarity is calculated between the source and output embeddings. + + + +```python +# Create an embedding function that uses a cohere model to embed the text +import cohere +import numpy as np +from guardrails import Guard +from guardrails.hub import ProvenanceEmbeddings +from typing import List, Union +import os + +api_key = os.environ["COHERE_API_KEY"] + +# Create a cohere client +cohere_client = cohere.Client(api_key=api_key) + + +def embed_function(text: Union[str, List[str]]) -> np.ndarray: + """Embed the text using cohere's small model.""" + if isinstance(text, str): # If text is a string, wrap it in a list + text = [text] + + response = cohere_client.embed( + model="embed-english-light-v2.0", + texts=text, + ) + embeddings_list = response.embeddings + return np.array(embeddings_list) +``` + +Set up the rail with the ```ProvenanceEmbeddings``` validator on a single string output. The threshold set for this example is 0.3, which is more sensitive than usual. In this example, since some of the passed-in text is strongly supported by the source text, distance for those chunks is small and the result remains unchanged by Guardrails. However, some other information is not directly supporteds by the source. Guardrails took the Raw LLM output and removed the areas it deemed hallucinated. + + + +```python +# Initialize the guard object +guard = Guard().use( + ProvenanceEmbeddings(threshold=0.3, validation_method="sentence", on_fail="fix") +) +``` + +Here, we show Guardrails fixes mocked out responses that hallucinated extra information that was not relevant or supported by the source text. Guardrails took the raw LLM outputs and removed the areas it deemed hallucinated. + + + +```python +# Use .parse directly when we already have the LLM output +guard.parse( + llm_output="To retrain a cat to use the litter box, put its litter box in a low traffic area with at least 2 exits so the cat doesn’t feel cornered. Find the right litterbox for your cat, as well as the right litter. Place the litterbox in a good spot, away from heavily trafficked and noisy areas. Keep the litterbox very clean, and do not punish the cat or confine her to just one room. Once training is complete, it is important to clean the litter box regularly and to provide a safe and healthy environment for the cat.", + metadata={"embed_function": embed_function, "sources": sources}, +) + +# See the guard logs +guard.history.last.tree +``` + + warnings.warn(






Logs
└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ No messages. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ To retrain a cat to use the litter box, put its litter box in a low traffic area with at least 2 exits │
│ so the cat doesn’t feel cornered. Find the right litterbox for your cat, as well as the right litter. │
│ Place the litterbox in a good spot, away from heavily trafficked and noisy areas. Keep the litterbox │
│ very clean, and do not punish the cat or confine her to just one room. Once training is complete, it is │
│ important to clean the litter box regularly and to provide a safe and healthy environment for the cat. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ 'To retrain a cat to use the litter box, put its litter box in a low traffic area with at least 2 exits │
│ so the cat doesn’t feel cornered.\nFind the right litterbox for your cat, as well as the right │
│ litter.\nKeep the litterbox very clean, and do not punish the cat or confine her to just one │
│ room.\nOnce training is complete, it is important to clean the litter box regularly and to provide a │
│ safe and healthy environment for the cat.' │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> + +As you can see here, one of the sentences was removed from the output, as it wasn't deemed relevant. + + + +```python +# FAIL SCENARIO +guardrail_output = guard.parse( + llm_output="Cats love lollipops and other sweet and sour foods. Cats can be retrained to use a litter box. Reward them when they do with lots of candy.", + metadata={"embed_function": embed_function, "sources": sources}, +) + +guard.history.last.tree +``` + + warnings.warn(






Logs
└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ No messages. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ Cats love lollipops and other sweet and sour foods. Cats can be retrained to use a litter box. Reward │
│ them when they do with lots of candy. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ 'Cats can be retrained to use a litter box.' │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> + +Similarly, done here. Clearly, the other sentences were not relevant to the `sources` + + +## ProvenanceLLM + +Guardrails also provides a ```ProvenanceLLM``` validator that uses evaluates provenance for LLM-generated text using an LLM. Currently, to perform this self-evaluation-based provenance check, you can pass in a name of any OpenAI ChatCompletion model like `gpt-3.5-turbo` or `gpt-4`, or pass in a callable that handles LLM calls. This callable can use any LLM, that you define. For simplicity purposes, we show here a demo of using OpenAI's `gpt-3.5-turbo` model. + +To use the OpenAI API, you have 3 options: + +- Set the OPENAI_API_KEY environment variable: os.environ["OPENAI_API_KEY"] = "[OpenAI_API_KEY]" +- Set the OPENAI_API_KEY using openai.api_key="[OpenAI_API_KEY]" +- Pass the api_key as a parameter to the parse function as done below, in this example + + +```python +# Initialize the guard object +from guardrails.hub import ProvenanceLLM + +guard_1 = Guard.for_string( + validators=[ + ProvenanceLLM( + validation_method="sentence", # can be "sentence" or "full" + llm_callable="gpt-3.5-turbo", # as explained above + top_k=3, # number of chunks to retrieve + on_fail="fix", + ) + ], + description="testmeout", +) +``` + + +```python +# Use .parse directly when we already have the LLM output +guard_1.parse( + llm_output="To retrain a cat to use the litter box, put its litter box in a low traffic area with at least 2 exits so the cat doesn’t feel cornered. Find the right litterbox for your cat, as well as the right litter. Place the litterbox in a good spot, away from heavily trafficked and noisy areas. Keep the litterbox very clean, and do not punish the cat or confine her to just one room. Once training is complete, it is important to clean the litter box regularly and to provide a safe and healthy environment for the cat.", + metadata={"embed_function": embed_function, "sources": sources}, + api_key=os.environ[ + "OPENAI_API_KEY" + ], # OpenAI API key if using an OpenAI model for 'llm_callable', OR using one of the above options +) + +# See the guard logs +guard_1.history.last.tree +``` + + warnings.warn(
/Users/dtam/dev/guardrails/guardrails/hub/guardrails/provenance_llm/validator/main.py:227: UserWarning: The LLM returned an invalid response. Considering the sentence as unsupported...
warn(






Logs
└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ No messages. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ To retrain a cat to use the litter box, put its litter box in a low traffic area with at least 2 exits │
│ so the cat doesn’t feel cornered. Find the right litterbox for your cat, as well as the right litter. │
│ Place the litterbox in a good spot, away from heavily trafficked and noisy areas. Keep the litterbox │
│ very clean, and do not punish the cat or confine her to just one room. Once training is complete, it is │
│ important to clean the litter box regularly and to provide a safe and healthy environment for the cat. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ '' │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> + + +```python +# FAIL SCENARIO +guardrail_output = guard_1.parse( + llm_output="Cats love lollipops and other sweet and sour foods. Cats can be retrained to use a litter box. Reward them when they do with lots of candy.", + metadata={"embed_function": embed_function, "sources": sources}, + api_key=os.environ["OPENAI_API_KEY"], +) + +guard_1.history.last.tree +``` + + warnings.warn(
/Users/dtam/dev/guardrails/guardrails/hub/guardrails/provenance_llm/validator/main.py:227: UserWarning: The LLM returned an invalid response. Considering the sentence as unsupported...
warn(






Logs
└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ No messages. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ Cats love lollipops and other sweet and sour foods. Cats can be retrained to use a litter box. Reward │
│ them when they do with lots of candy. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ '' │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> + +Similar outputs were observed with both validators. But, as with all LLMs, the validated outputs will change due to their stochastic nature. This demo also highlights how one can use an embedding model from Cohere along with an OpenAI LLM to get provenance. + diff --git a/docs/examples/recipe_generation.ipynb b/docs/dist/examples/recipe_generation.ipynb similarity index 99% rename from docs/examples/recipe_generation.ipynb rename to docs/dist/examples/recipe_generation.ipynb index 2f66e47ed..14181dfb6 100644 --- a/docs/examples/recipe_generation.ipynb +++ b/docs/dist/examples/recipe_generation.ipynb @@ -59,7 +59,13 @@ "metadata": {}, "outputs": [], "source": [ - "from guardrails.validators import Validator, register_validator, ValidationResult, PassResult, FailResult\n", + "from guardrails.validators import (\n", + " Validator,\n", + " register_validator,\n", + " ValidationResult,\n", + " PassResult,\n", + " FailResult,\n", + ")\n", "from typing import Dict, Any\n", "\n", "NON_VEGAN_INGREDIENTS = [\"butter\", \"milk\", \"eggs\", \"cheese\", \"cream\", \"yogurt\"]\n", @@ -72,9 +78,9 @@ " \"yogurt\": \"soy yogurt\",\n", "}\n", "\n", + "\n", "@register_validator(name=\"is-vegan\", data_type=\"string\")\n", "class IsVegan(Validator):\n", - "\n", " def validate(self, value: Any, metadata: Dict) -> ValidationResult:\n", " global NON_VEGAN_INGREDIENTS, SUBSTITUTIONS\n", "\n", @@ -158,21 +164,31 @@ "${gr.complete_xml_suffix}\n", "\"\"\"\n", "\n", + "\n", "class Ingredient(BaseModel):\n", " index: int = Field(validators=[(\"1-indexed\", \"noop\")])\n", " name: str = Field(validators=[IsVegan(on_fail=\"fix\")])\n", " brand: str = Field(description=\"Suggested brand for the ingredient (if any)\")\n", " optional: bool = Field(description=\"Is the ingredient necessary?\")\n", - " quantity: float = Field(description=\"how much of this ingredient to use\", validators=[(\"units-imperial\", \"noop\")])\n", + " quantity: float = Field(\n", + " description=\"how much of this ingredient to use\",\n", + " validators=[(\"units-imperial\", \"noop\")],\n", + " )\n", " units: str = Field(validators=[(\"units-imperial\", \"noop\")])\n", "\n", + "\n", "class Instruction(BaseModel):\n", " index: int = Field(validators=[(\"1-indexed\", \"noop\")])\n", " step: str\n", "\n", + "\n", "class Recipe(BaseModel):\n", - " ingredients: List[Ingredient] = Field(description=\"What are the ingredients for the recipe?\")\n", - " instructions: List[Instruction] = Field(description=\"What are the instructions for the recipe?\")" + " ingredients: List[Ingredient] = Field(\n", + " description=\"What are the ingredients for the recipe?\"\n", + " )\n", + " instructions: List[Instruction] = Field(\n", + " description=\"What are the instructions for the recipe?\"\n", + " )" ] }, { @@ -277,10 +293,10 @@ "# os.environ[\"OPENAI_API_KEY\"] = \"YOUR_API_KEY\"\n", "\n", "raw_llm_response, validated_response, *rest = guard(\n", - " messages=[{\"role\":\"user\", \"content\": prompt}],\n", + " messages=[{\"role\": \"user\", \"content\": prompt}],\n", " max_tokens=2048,\n", " temperature=0,\n", - " model=\"gpt-4\"\n", + " model=\"gpt-4\",\n", ")" ] }, @@ -381,7 +397,7 @@ } ], "source": [ - "print(guard.history.first.iterations.first.inputs.messages[0]['content'])" + "print(guard.history.first.iterations.first.inputs.messages[0][\"content\"])" ] }, { diff --git a/docs/dist/examples/recipe_generation.md b/docs/dist/examples/recipe_generation.md new file mode 100644 index 000000000..41038350a --- /dev/null +++ b/docs/dist/examples/recipe_generation.md @@ -0,0 +1,244 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +# Generating Vegan Recipes + +!!! note + To download this example as a Jupyter notebook, click [here](https://github.com/ShreyaR/guardrails/blob/main/docs/examples/recipe_generation.ipynb). + +In this example, we will use Guardrails to generate vegan mac and cheese recipe. + +## Objective + +We want to generate a vegan Mac-n-Cheese recipe as a list of ingredients and instructions. We will use Guardrails to make sure the recipe is vegan. + + + + +```python +import guardrails as gd +from rich import print +``` + + + +``` + /Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console) + from tqdm.autonotebook import tqdm, trange +``` + + + +## Step 1: Create the RAIL Spec + +Ordinarily, we would create an RAIL spec in a separate file. For the purposes of this example, we will create the spec in this notebook as a string following the RAIL syntax. For more information on RAIL, see the [RAIL documentation](/docs/how_to_guides/rail). We will also show the same RAIL spec in a code-first format using a Pydantic model. + +First we define a custom Validator: + + +```python +from guardrails.validators import ( + Validator, + register_validator, + ValidationResult, + PassResult, + FailResult, +) +from typing import Dict, Any + +NON_VEGAN_INGREDIENTS = ["butter", "milk", "eggs", "cheese", "cream", "yogurt"] +SUBSTITUTIONS = { + "butter": "margarine", + "milk": "soy milk", + "eggs": "flax eggs", + "cheese": "vegan cheese", + "cream": "soy cream", + "yogurt": "soy yogurt", +} + + +@register_validator(name="is-vegan", data_type="string") +class IsVegan(Validator): + def validate(self, value: Any, metadata: Dict) -> ValidationResult: + global NON_VEGAN_INGREDIENTS, SUBSTITUTIONS + + # Make sure the ingredient is not in the list of non-vegan ingredients. + if value.lower() in NON_VEGAN_INGREDIENTS: + return FailResult( + error_message=f"Value ${value} is not vegan.", + # Programmatically fix the value by replacing it with a vegan + # substitute. + fix_value=SUBSTITUTIONS[value.lower()], + ) + + return PassResult() +``` + +Next we can define our RAIL spec either as a XML string: + + +```python +rail_str = """ + + + + + + + + + + + + + + + + + + + + + + + +Generate a recipe for vegan mac and cheese. +${gr.complete_xml_suffix} + + + + +""" +``` + +or a Pydantic model: + + +```python +from pydantic import BaseModel, Field +from typing import List + + +prompt = """ +Generate a recipe for vegan mac and cheese. +${gr.complete_xml_suffix} +""" + + +class Ingredient(BaseModel): + index: int = Field(validators=[("1-indexed", "noop")]) + name: str = Field(validators=[IsVegan(on_fail="fix")]) + brand: str = Field(description="Suggested brand for the ingredient (if any)") + optional: bool = Field(description="Is the ingredient necessary?") + quantity: float = Field( + description="how much of this ingredient to use", + validators=[("units-imperial", "noop")], + ) + units: str = Field(validators=[("units-imperial", "noop")]) + + +class Instruction(BaseModel): + index: int = Field(validators=[("1-indexed", "noop")]) + step: str + + +class Recipe(BaseModel): + ingredients: List[Ingredient] = Field( + description="What are the ingredients for the recipe?" + ) + instructions: List[Instruction] = Field( + description="What are the instructions for the recipe?" + ) +``` + +!!! note + Here, we create a custom `IsVegan` validator that checks if the ingredient is vegan. + We also set `on-fail-is-vegan` to `fix`, which in this case means that programatically we will replace the ingredient with a vegan substitute. + +## Step 2: Create a `Guard` object with the RAIL Spec + +We create a `gd.Guard` object that will check, validate and correct the output of the LLM. This object: + +1. Enforces the quality criteria specified in the RAIL spec. +2. Takes corrective action when the quality criteria are not met. +3. Compiles the schema and type info from the RAIL spec and adds it to the prompt. + +From the XML string RAIL spec: + + +```python +guard = gd.Guard.for_rail_string(rail_str) +``` + +From the Pydantic model: + + +```python +guard = gd.Guard.for_pydantic(output_class=Recipe) +``` + + + +``` + /Users/dtam/.pyenv/versions/3.12.1/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:11: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console) + from tqdm.autonotebook import tqdm, trange + /Users/dtam/.pyenv/versions/3.12.1/lib/python3.12/site-packages/guardrails/validator_base.py:152: UserWarning: Validator with id 1-indexed was not found in the registry! Ignoring... + warn(f"Validator with id {name} was not found in the registry! Ignoring...") + /Users/dtam/.pyenv/versions/3.12.1/lib/python3.12/site-packages/guardrails/validator_base.py:152: UserWarning: Validator with id units-imperial was not found in the registry! Ignoring... + warn(f"Validator with id {name} was not found in the registry! Ignoring...") +``` + + + +As we can see, a few formatters weren't supported. These formatters won't be enforced in the output, but this information can still be used to generate a prompt. + +## Step 3: Wrap the LLM API call with `Guard` + + +```python +# Add your OPENAI_API_KEY as an environment variable if it's not already set +# import os +# os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY" + +raw_llm_response, validated_response, *rest = guard( + messages=[{"role": "user", "content": prompt}], + max_tokens=2048, + temperature=0, + model="gpt-4", +) +``` + + + +``` + /Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( +``` + + + +We can see the prompt that was sent to the LLM. The `{document}` param was substituted with the user provided value at runtime. + + +```python +print(guard.history.first.iterations.first.inputs.messages[0]["content"]) +``` + +
Generate a recipe for vegan mac and cheese.

Given below is XML that describes the information to extract from this document and the tags to extract it into.

<output>
<list description=\"What are the ingredients for the recipe?\" name=\"ingredients\" required=\"true\">
<object required=\"true\">
<integer format=\"1-indexed\" name=\"index\" required=\"true\"></integer>
<string format=\"is-vegan\" name=\"name\" required=\"true\"></string>
<string description=\"Suggested brand for the ingredient (if any)\" name=\"brand\" required=\"true\"></string>
<bool description=\"Is the ingredient necessary?\" name=\"optional\" required=\"true\"></bool>
<float format=\"units-imperial\" name=\"quantity\" required=\"true\"></float>
<string format=\"units-imperial\" name=\"units\" required=\"true\"></string>
</object>
</list>
<list description=\"What are the instructions for the recipe?\" name=\"instructions\" required=\"true\">
<object required=\"true\">
<integer format=\"1-indexed\" name=\"index\" required=\"true\"></integer>
<string name=\"step\" required=\"true\"></string>
</object>
</list>
</output>

ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the `name`
attribute of the corresponding XML, and the value is of the type specified by the corresponding XML's tag. The JSON
MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and
specific types. Be correct and concise. If you are unsure anywhere, enter `null`.

Here are examples of simple (XML, JSON) pairs that show the expected behavior:
- `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`
- `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', 'STRING TWO', etc.]}`
- `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" format=\"1-indexed\"
/></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`


"}} /> + +The `guard` wrapper returns the raw_llm_respose (which is a simple string), and the validated and corrected output (which is a dictionary). + +We can see that the output is a dictionary with the correct schema and types. + + +```python +print(validated_response) +``` + +{
'ingredients': [
{
'index': 1,
'name': 'macaroni',
'brand': 'Barilla',
'optional': False,
'quantity': 8.0,
'units': 'ounces'
},
{
'index': 2,
'name': 'raw cashews',
'brand': \"Trader Joe's\",
'optional': False,
'quantity': 1.0,
'units': 'cup'
},
{
'index': 3,
'name': 'nutritional yeast',
'brand': \"Bob's Red Mill\",
'optional': False,
'quantity': 0.25,
'units': 'cup'
},
{
'index': 4,
'name': 'garlic powder',
'brand': 'McCormick',
'optional': False,
'quantity': 1.0,
'units': 'teaspoon'
},
{
'index': 5,
'name': 'onion powder',
'brand': 'McCormick',
'optional': False,
'quantity': 1.0,
'units': 'teaspoon'
},
{
'index': 6,
'name': 'turmeric',
'brand': 'Simply Organic',
'optional': True,
'quantity': 0.5,
'units': 'teaspoon'
},
{'index': 7, 'name': 'salt', 'brand': 'Morton', 'optional': False, 'quantity': 1.0, 'units': 'teaspoon'},
{'index': 8, 'name': 'water', 'brand': 'Generic', 'optional': False, 'quantity': 1.5, 'units': 'cups'}
],
'instructions': [
{'index': 1, 'step': 'Soak the cashews in water for at least 2 hours, then drain.'},
{'index': 2, 'step': 'Cook the macaroni according to the package instructions, then drain.'},
{
'index': 3,
'step': 'In a blender, combine the soaked cashews, nutritional yeast, garlic powder, onion powder,
turmeric, salt, and water. Blend until smooth.'
},
{'index': 4, 'step': 'Pour the sauce over the cooked macaroni and stir until well coated.'},
{'index': 5, 'step': 'Serve the vegan mac and cheese hot.'}
]
}
"}} /> + + +```python +print(guard.history.last.tree) +``` + +Logs
├── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
│ │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ │ │ ┃ Role Content ┃ │
│ │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ │ │ user │ │ │
│ │ │ │ │ Generate a recipe for vegan mac and cheese. │ │
│ │ │ │ │ │ │
│ │ │ │ │ Given below is XML that describes the information to extract from this document and the tags │ │
│ │ │ │ │ to extract it into. │ │
│ │ │ │ │ │ │
│ │ │ │ │ <output> │ │
│ │ │ │ │ <list description=\"What are the ingredients for the recipe?\" name=\"ingredients\" │ │
│ │ │ │ │ required=\"true\"> │ │
│ │ │ │ │ <object required=\"true\"> │ │
│ │ │ │ │ <integer format=\"1-indexed\" name=\"index\" required=\"true\"></integer> │ │
│ │ │ │ │ <string format=\"is-vegan\" name=\"name\" required=\"true\"></string> │ │
│ │ │ │ │ <string description=\"Suggested brand for the ingredient (if any)\" name=\"brand\" │ │
│ │ │ │ │ required=\"true\"></string> │ │
│ │ │ │ │ <bool description=\"Is the ingredient necessary?\" name=\"optional\" │ │
│ │ │ │ │ required=\"true\"></bool> │ │
│ │ │ │ │ <float format=\"units-imperial\" name=\"quantity\" required=\"true\"></float> │ │
│ │ │ │ │ <string format=\"units-imperial\" name=\"units\" required=\"true\"></string> │ │
│ │ │ │ │ </object> │ │
│ │ │ │ │ </list> │ │
│ │ │ │ │ <list description=\"What are the instructions for the recipe?\" name=\"instructions\" │ │
│ │ │ │ │ required=\"true\"> │ │
│ │ │ │ │ <object required=\"true\"> │ │
│ │ │ │ │ <integer format=\"1-indexed\" name=\"index\" required=\"true\"></integer> │ │
│ │ │ │ │ <string name=\"step\" required=\"true\"></string> │ │
│ │ │ │ │ </object> │ │
│ │ │ │ │ </list> │ │
│ │ │ │ │ </output> │ │
│ │ │ │ │ │ │
│ │ │ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in │ │
│ │ │ │ │ JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │
│ │ │ │ │ any types and format requests e.g. requests for lists, objects and specific types. Be │ │
│ │ │ │ │ correct and concise. If you are unsure anywhere, enter `null`. │ │
│ │ │ │ │ │ │
│ │ │ │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior: │ │
│ │ │ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │ │
│ │ │ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', │ │
│ │ │ │ │ 'STRING TWO', etc.]}` │ │
│ │ │ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer │ │
│ │ │ │ │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': │ │
│ │ │ │ │ 1}}` │ │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
│ │ │ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │
│ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
│ │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ │ │ { │
│ │ │ \"ingredients\": [ │
│ │ │ { │
│ │ │ \"index\": 1, │
│ │ │ \"name\": \"macaroni\", │
│ │ │ \"brand\": \"Barilla\", │
│ │ │ \"optional\": false, │
│ │ │ \"quantity\": 8.0, │
│ │ │ \"units\": \"ounces\" │
│ │ │ }, │
│ │ │ { │
│ │ │ \"index\": 2, │
│ │ │ \"name\": \"raw cashews\", │
│ │ │ \"brand\": \"Trader Joe's\", │
│ │ │ \"optional\": false, │
│ │ │ \"quantity\": 1.0, │
│ │ │ \"units\": \"cup\" │
│ │ │ }, │
│ │ │ { │
│ │ │ \"index\": 3, │
│ │ │ \"name\": \"nutritional yeast\", │
│ │ │ \"brand\": \"Bob's Red Mill\", │
│ │ │ \"optional\": false, │
│ │ │ \"quantity\": 0.25, │
│ │ │ \"units\": \"cup\" │
│ │ │ }, │
│ │ │ { │
│ │ │ \"index\": 4, │
│ │ │ \"name\": \"garlic powder\", │
│ │ │ \"brand\": \"McCormick\", │
│ │ │ \"optional\": false, │
│ │ │ \"quantity\": 1.0, │
│ │ │ \"units\": \"teaspoon\" │
│ │ │ }, │
│ │ │ { │
│ │ │ \"index\": 5, │
│ │ │ \"name\": \"onion powder\", │
│ │ │ \"brand\": \"McCormick\", │
│ │ │ \"optional\": false, │
│ │ │ \"quantity\": 1.0, │
│ │ │ \"units\": \"teaspoon\" │
│ │ │ }, │
│ │ │ { │
│ │ │ \"index\": 6, │
│ │ │ \"name\": \"turmeric\", │
│ │ │ \"brand\": \"Simply Organic\", │
│ │ │ \"optional\": true, │
│ │ │ \"quantity\": 0.5, │
│ │ │ \"units\": \"teaspoon\" │
│ │ │ }, │
│ │ │ { │
│ │ │ \"index\": 7, │
│ │ │ \"name\": \"salt\", │
│ │ │ \"brand\": \"Morton\", │
│ │ │ \"optional\": false, │
│ │ │ \"quantity\": 1.0, │
│ │ │ \"units\": \"teaspoon\" │
│ │ │ }, │
│ │ │ { │
│ │ │ \"index\": 8, │
│ │ │ \"name\": \"water\", │
│ │ │ \"brand\": null, │
│ │ │ \"optional\": false, │
│ │ │ \"quantity\": 1.5, │
│ │ │ \"units\": \"cups\" │
│ │ │ } │
│ │ │ ], │
│ │ │ \"instructions\": [ │
│ │ │ { │
│ │ │ \"index\": 1, │
│ │ │ \"step\": \"Soak the cashews in water for at least 2 hours, then drain.\" │
│ │ │ }, │
│ │ │ { │
│ │ │ \"index\": 2, │
│ │ │ \"step\": \"Cook the macaroni according to the package instructions, then drain.\" │
│ │ │ }, │
│ │ │ { │
│ │ │ \"index\": 3, │
│ │ │ \"step\": \"In a blender, combine the soaked cashews, nutritional yeast, garlic powder, onion │
│ │ │ powder, turmeric, salt, and water. Blend until smooth.\" │
│ │ │ }, │
│ │ │ { │
│ │ │ \"index\": 4, │
│ │ │ \"step\": \"Pour the sauce over the cooked macaroni and stir until well coated.\" │
│ │ │ }, │
│ │ │ { │
│ │ │ \"index\": 5, │
│ │ │ \"step\": \"Serve the vegan mac and cheese hot.\" │
│ │ │ } │
│ │ │ ] │
│ │ │ } │
│ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
│ │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ │ │ SkeletonReAsk( │
│ │ │ incorrect_value={ │
│ │ │ 'ingredients': [ │
│ │ │ { │
│ │ │ 'index': 1, │
│ │ │ 'name': 'macaroni', │
│ │ │ 'brand': 'Barilla', │
│ │ │ 'optional': False, │
│ │ │ 'quantity': 8.0, │
│ │ │ 'units': 'ounces' │
│ │ │ }, │
│ │ │ { │
│ │ │ 'index': 2, │
│ │ │ 'name': 'raw cashews', │
│ │ │ 'brand': \"Trader Joe's\", │
│ │ │ 'optional': False, │
│ │ │ 'quantity': 1.0, │
│ │ │ 'units': 'cup' │
│ │ │ }, │
│ │ │ { │
│ │ │ 'index': 3, │
│ │ │ 'name': 'nutritional yeast', │
│ │ │ 'brand': \"Bob's Red Mill\", │
│ │ │ 'optional': False, │
│ │ │ 'quantity': 0.25, │
│ │ │ 'units': 'cup' │
│ │ │ }, │
│ │ │ { │
│ │ │ 'index': 4, │
│ │ │ 'name': 'garlic powder', │
│ │ │ 'brand': 'McCormick', │
│ │ │ 'optional': False, │
│ │ │ 'quantity': 1.0, │
│ │ │ 'units': 'teaspoon' │
│ │ │ }, │
│ │ │ { │
│ │ │ 'index': 5, │
│ │ │ 'name': 'onion powder', │
│ │ │ 'brand': 'McCormick', │
│ │ │ 'optional': False, │
│ │ │ 'quantity': 1.0, │
│ │ │ 'units': 'teaspoon' │
│ │ │ }, │
│ │ │ { │
│ │ │ 'index': 6, │
│ │ │ 'name': 'turmeric', │
│ │ │ 'brand': 'Simply Organic', │
│ │ │ 'optional': True, │
│ │ │ 'quantity': 0.5, │
│ │ │ 'units': 'teaspoon' │
│ │ │ }, │
│ │ │ { │
│ │ │ 'index': 7, │
│ │ │ 'name': 'salt', │
│ │ │ 'brand': 'Morton', │
│ │ │ 'optional': False, │
│ │ │ 'quantity': 1.0, │
│ │ │ 'units': 'teaspoon' │
│ │ │ }, │
│ │ │ { │
│ │ │ 'index': 8, │
│ │ │ 'name': 'water', │
│ │ │ 'brand': None, │
│ │ │ 'optional': False, │
│ │ │ 'quantity': 1.5, │
│ │ │ 'units': 'cups' │
│ │ │ } │
│ │ │ ], │
│ │ │ 'instructions': [ │
│ │ │ { │
│ │ │ 'index': 1, │
│ │ │ 'step': 'Soak the cashews in water for at least 2 hours, then drain.' │
│ │ │ }, │
│ │ │ { │
│ │ │ 'index': 2, │
│ │ │ 'step': 'Cook the macaroni according to the package instructions, then drain.' │
│ │ │ }, │
│ │ │ { │
│ │ │ 'index': 3, │
│ │ │ 'step': 'In a blender, combine the soaked cashews, nutritional yeast, garlic powder, │
│ │ │ onion powder, turmeric, salt, and water. Blend until smooth.' │
│ │ │ }, │
│ │ │ { │
│ │ │ 'index': 4, │
│ │ │ 'step': 'Pour the sauce over the cooked macaroni and stir until well coated.' │
│ │ │ }, │
│ │ │ {'index': 5, 'step': 'Serve the vegan mac and cheese hot.'} │
│ │ │ ] │
│ │ │ }, │
│ │ │ fail_results=[ │
│ │ │ FailResult( │
│ │ │ outcome='fail', │
│ │ │ error_message='JSON does not match schema:\n{\n \"$.ingredients[7].brand\": [\n \"None is │
│ │ │ not of type <SimpleTypes.STRING: \'string\'>\"\n ]\n}', │
│ │ │ fix_value=None, │
│ │ │ error_spans=None, │
│ │ │ metadata=None, │
│ │ │ validated_chunk=None │
│ │ │ ) │
│ │ │ ], │
│ │ │ additional_properties={} │
│ │ │ ) │
│ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
│ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
└── ╭────────────────────────────────────────────────── Step 1 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ ┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ ┃ Role Content ┃ │
│ ┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ system │ │ │
│ │ │ You are a helpful assistant only capable of communicating with valid JSON, and no other │ │
│ │ │ text. │ │
│ │ │ │ │
│ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field │ │
│ │ │ in JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, │ │
│ │ │ including any types and format requests e.g. requests for lists, objects and specific │ │
│ │ │ types. Be correct and concise. If you are unsure anywhere, enter `null`. │ │
│ │ │ │ │
│ │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior: │ │
│ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │ │
│ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', │ │
│ │ │ 'STRING TWO', etc.]}` │ │
│ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer │ │
│ │ │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': │ │
│ │ │ 1}}` │ │
│ │ │ │ │
│ ├────────┼────────────────────────────────────────────────────────────────────────────────────────────┤ │
│ │ user │ │ │
│ │ │ I was given the following JSON response, which had problems due to incorrect values. │ │
│ │ │ │ │
│ │ │ { │ │
│ │ │ \"incorrect_value\": { │ │
│ │ │ \"ingredients\": [ │ │
│ │ │ { │ │
│ │ │ \"index\": 1, │ │
│ │ │ \"name\": \"macaroni\", │ │
│ │ │ \"brand\": \"Barilla\", │ │
│ │ │ \"optional\": false, │ │
│ │ │ \"quantity\": 8.0, │ │
│ │ │ \"units\": \"ounces\" │ │
│ │ │ }, │ │
│ │ │ { │ │
│ │ │ \"index\": 2, │ │
│ │ │ \"name\": \"raw cashews\", │ │
│ │ │ \"brand\": \"Trader Joe's\", │ │
│ │ │ \"optional\": false, │ │
│ │ │ \"quantity\": 1.0, │ │
│ │ │ \"units\": \"cup\" │ │
│ │ │ }, │ │
│ │ │ { │ │
│ │ │ \"index\": 3, │ │
│ │ │ \"name\": \"nutritional yeast\", │ │
│ │ │ \"brand\": \"Bob's Red Mill\", │ │
│ │ │ \"optional\": false, │ │
│ │ │ \"quantity\": 0.25, │ │
│ │ │ \"units\": \"cup\" │ │
│ │ │ }, │ │
│ │ │ { │ │
│ │ │ \"index\": 4, │ │
│ │ │ \"name\": \"garlic powder\", │ │
│ │ │ \"brand\": \"McCormick\", │ │
│ │ │ \"optional\": false, │ │
│ │ │ \"quantity\": 1.0, │ │
│ │ │ \"units\": \"teaspoon\" │ │
│ │ │ }, │ │
│ │ │ { │ │
│ │ │ \"index\": 5, │ │
│ │ │ \"name\": \"onion powder\", │ │
│ │ │ \"brand\": \"McCormick\", │ │
│ │ │ \"optional\": false, │ │
│ │ │ \"quantity\": 1.0, │ │
│ │ │ \"units\": \"teaspoon\" │ │
│ │ │ }, │ │
│ │ │ { │ │
│ │ │ \"index\": 6, │ │
│ │ │ \"name\": \"turmeric\", │ │
│ │ │ \"brand\": \"Simply Organic\", │ │
│ │ │ \"optional\": true, │ │
│ │ │ \"quantity\": 0.5, │ │
│ │ │ \"units\": \"teaspoon\" │ │
│ │ │ }, │ │
│ │ │ { │ │
│ │ │ \"index\": 7, │ │
│ │ │ \"name\": \"salt\", │ │
│ │ │ \"brand\": \"Morton\", │ │
│ │ │ \"optional\": false, │ │
│ │ │ \"quantity\": 1.0, │ │
│ │ │ \"units\": \"teaspoon\" │ │
│ │ │ }, │ │
│ │ │ { │ │
│ │ │ \"index\": 8, │ │
│ │ │ \"name\": \"water\", │ │
│ │ │ \"brand\": null, │ │
│ │ │ \"optional\": false, │ │
│ │ │ \"quantity\": 1.5, │ │
│ │ │ \"units\": \"cups\" │ │
│ │ │ } │ │
│ │ │ ], │ │
│ │ │ \"instructions\": [ │ │
│ │ │ { │ │
│ │ │ \"index\": 1, │ │
│ │ │ \"step\": \"Soak the cashews in water for at least 2 hours, then drain.\" │ │
│ │ │ }, │ │
│ │ │ { │ │
│ │ │ \"index\": 2, │ │
│ │ │ \"step\": \"Cook the macaroni according to the package instructions, then drain.\" │ │
│ │ │ }, │ │
│ │ │ { │ │
│ │ │ \"index\": 3, │ │
│ │ │ \"step\": \"In a blender, combine the soaked cashews, nutritional yeast, garlic │ │
│ │ │ powder, onion powder, turmeric, salt, and water. Blend until smooth.\" │ │
│ │ │ }, │ │
│ │ │ { │ │
│ │ │ \"index\": 4, │ │
│ │ │ \"step\": \"Pour the sauce over the cooked macaroni and stir until well coated.\" │ │
│ │ │ }, │ │
│ │ │ { │ │
│ │ │ \"index\": 5, │ │
│ │ │ \"step\": \"Serve the vegan mac and cheese hot.\" │ │
│ │ │ } │ │
│ │ │ ] │ │
│ │ │ }, │ │
│ │ │ \"error_messages\": [ │ │
│ │ │ \"JSON does not match schema:\n{\n \"$.ingredients[7].brand\": [\n \"None is not of │ │
│ │ │ type <SimpleTypes.STRING: 'string'>\"\n ]\n}\" │ │
│ │ │ ] │ │
│ │ │ } │ │
│ │ │ │ │
│ │ │ Help me correct the incorrect values based on the given error messages. │ │
│ │ │ │ │
│ │ │ │ │
│ │ │ Given below is XML that describes the information to extract from this document and the │ │
│ │ │ tags to extract it into. │ │
│ │ │ │ │
│ │ │ <output> │ │
│ │ │ <list description=\"What are the ingredients for the recipe?\" name=\"ingredients\" │ │
│ │ │ required=\"true\"> │ │
│ │ │ <object required=\"true\"> │ │
│ │ │ <integer format=\"1-indexed\" name=\"index\" required=\"true\"></integer> │ │
│ │ │ <string format=\"is-vegan\" name=\"name\" required=\"true\"></string> │ │
│ │ │ <string description=\"Suggested brand for the ingredient (if any)\" name=\"brand\" │ │
│ │ │ required=\"true\"></string> │ │
│ │ │ <bool description=\"Is the ingredient necessary?\" name=\"optional\" │ │
│ │ │ required=\"true\"></bool> │ │
│ │ │ <float format=\"units-imperial\" name=\"quantity\" required=\"true\"></float> │ │
│ │ │ <string format=\"units-imperial\" name=\"units\" required=\"true\"></string> │ │
│ │ │ </object> │ │
│ │ │ </list> │ │
│ │ │ <list description=\"What are the instructions for the recipe?\" name=\"instructions\" │ │
│ │ │ required=\"true\"> │ │
│ │ │ <object required=\"true\"> │ │
│ │ │ <integer format=\"1-indexed\" name=\"index\" required=\"true\"></integer> │ │
│ │ │ <string name=\"step\" required=\"true\"></string> │ │
│ │ │ </object> │ │
│ │ │ </list> │ │
│ │ │ </output> │ │
│ │ │ │ │
│ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field │ │
│ │ │ in JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, │ │
│ │ │ including any types and format requests e.g. requests for lists, objects and specific │ │
│ │ │ types. Be correct and concise. If you are unsure anywhere, enter `null`. │ │
│ │ │ │ │
│ │ │ Here's an example of the structure: │ │
│ │ │ { │ │
│ │ │ \"ingredients\": [ │ │
│ │ │ { │ │
│ │ │ \"index\": 19, │ │
│ │ │ \"name\": \"Crystal Day\", │ │
│ │ │ \"brand\": \"cut\", │ │
│ │ │ \"optional\": false, │ │
│ │ │ \"quantity\": 37.0, │ │
│ │ │ \"units\": \"simple\" │ │
│ │ │ }, │ │
│ │ │ { │ │
│ │ │ \"index\": 58, │ │
│ │ │ \"name\": \"Derek Harris\", │ │
│ │ │ \"brand\": \"suggest\", │ │
│ │ │ \"optional\": false, │ │
│ │ │ \"quantity\": 29.0, │ │
│ │ │ \"units\": \"three\" │ │
│ │ │ } │ │
│ │ │ ], │ │
│ │ │ \"instructions\": [ │ │
│ │ │ { │ │
│ │ │ \"index\": 80, │ │
│ │ │ \"step\": \"road\" │ │
│ │ │ }, │ │
│ │ │ { │ │
│ │ │ \"index\": 24, │ │
│ │ │ \"step\": \"law\" │ │
│ │ │ } │ │
│ │ │ ] │ │
│ │ │ } │ │
│ │ │ │ │
│ └────────┴────────────────────────────────────────────────────────────────────────────────────────────┘ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ { │
│ \"ingredients\": [ │
│ { │
│ \"index\": 1, │
│ \"name\": \"macaroni\", │
│ \"brand\": \"Barilla\", │
│ \"optional\": false, │
│ \"quantity\": 8.0, │
│ \"units\": \"ounces\" │
│ }, │
│ { │
│ \"index\": 2, │
│ \"name\": \"raw cashews\", │
│ \"brand\": \"Trader Joe's\", │
│ \"optional\": false, │
│ \"quantity\": 1.0, │
│ \"units\": \"cup\" │
│ }, │
│ { │
│ \"index\": 3, │
│ \"name\": \"nutritional yeast\", │
│ \"brand\": \"Bob's Red Mill\", │
│ \"optional\": false, │
│ \"quantity\": 0.25, │
│ \"units\": \"cup\" │
│ }, │
│ { │
│ \"index\": 4, │
│ \"name\": \"garlic powder\", │
│ \"brand\": \"McCormick\", │
│ \"optional\": false, │
│ \"quantity\": 1.0, │
│ \"units\": \"teaspoon\" │
│ }, │
│ { │
│ \"index\": 5, │
│ \"name\": \"onion powder\", │
│ \"brand\": \"McCormick\", │
│ \"optional\": false, │
│ \"quantity\": 1.0, │
│ \"units\": \"teaspoon\" │
│ }, │
│ { │
│ \"index\": 6, │
│ \"name\": \"turmeric\", │
│ \"brand\": \"Simply Organic\", │
│ \"optional\": true, │
│ \"quantity\": 0.5, │
│ \"units\": \"teaspoon\" │
│ }, │
│ { │
│ \"index\": 7, │
│ \"name\": \"salt\", │
│ \"brand\": \"Morton\", │
│ \"optional\": false, │
│ \"quantity\": 1.0, │
│ \"units\": \"teaspoon\" │
│ }, │
│ { │
│ \"index\": 8, │
│ \"name\": \"water\", │
│ \"brand\": \"Generic\", │
│ \"optional\": false, │
│ \"quantity\": 1.5, │
│ \"units\": \"cups\" │
│ } │
│ ], │
│ \"instructions\": [ │
│ { │
│ \"index\": 1, │
│ \"step\": \"Soak the cashews in water for at least 2 hours, then drain.\" │
│ }, │
│ { │
│ \"index\": 2, │
│ \"step\": \"Cook the macaroni according to the package instructions, then drain.\" │
│ }, │
│ { │
│ \"index\": 3, │
│ \"step\": \"In a blender, combine the soaked cashews, nutritional yeast, garlic powder, onion │
│ powder, turmeric, salt, and water. Blend until smooth.\" │
│ }, │
│ { │
│ \"index\": 4, │
│ \"step\": \"Pour the sauce over the cooked macaroni and stir until well coated.\" │
│ }, │
│ { │
│ \"index\": 5, │
│ \"step\": \"Serve the vegan mac and cheese hot.\" │
│ } │
│ ] │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ { │
│ 'ingredients': [ │
│ { │
│ 'index': 1, │
│ 'name': 'macaroni', │
│ 'brand': 'Barilla', │
│ 'optional': False, │
│ 'quantity': 8.0, │
│ 'units': 'ounces' │
│ }, │
│ { │
│ 'index': 2, │
│ 'name': 'raw cashews', │
│ 'brand': \"Trader Joe's\", │
│ 'optional': False, │
│ 'quantity': 1.0, │
│ 'units': 'cup' │
│ }, │
│ { │
│ 'index': 3, │
│ 'name': 'nutritional yeast', │
│ 'brand': \"Bob's Red Mill\", │
│ 'optional': False, │
│ 'quantity': 0.25, │
│ 'units': 'cup' │
│ }, │
│ { │
│ 'index': 4, │
│ 'name': 'garlic powder', │
│ 'brand': 'McCormick', │
│ 'optional': False, │
│ 'quantity': 1.0, │
│ 'units': 'teaspoon' │
│ }, │
│ { │
│ 'index': 5, │
│ 'name': 'onion powder', │
│ 'brand': 'McCormick', │
│ 'optional': False, │
│ 'quantity': 1.0, │
│ 'units': 'teaspoon' │
│ }, │
│ { │
│ 'index': 6, │
│ 'name': 'turmeric', │
│ 'brand': 'Simply Organic', │
│ 'optional': True, │
│ 'quantity': 0.5, │
│ 'units': 'teaspoon' │
│ }, │
│ { │
│ 'index': 7, │
│ 'name': 'salt', │
│ 'brand': 'Morton', │
│ 'optional': False, │
│ 'quantity': 1.0, │
│ 'units': 'teaspoon' │
│ }, │
│ { │
│ 'index': 8, │
│ 'name': 'water', │
│ 'brand': 'Generic', │
│ 'optional': False, │
│ 'quantity': 1.5, │
│ 'units': 'cups' │
│ } │
│ ], │
│ 'instructions': [ │
│ { │
│ 'index': 1, │
│ 'step': 'Soak the cashews in water for at least 2 hours, then drain.' │
│ }, │
│ { │
│ 'index': 2, │
│ 'step': 'Cook the macaroni according to the package instructions, then drain.' │
│ }, │
│ { │
│ 'index': 3, │
│ 'step': 'In a blender, combine the soaked cashews, nutritional yeast, garlic powder, onion │
│ powder, turmeric, salt, and water. Blend until smooth.' │
│ }, │
│ { │
│ 'index': 4, │
│ 'step': 'Pour the sauce over the cooked macaroni and stir until well coated.' │
│ }, │
│ {'index': 5, 'step': 'Serve the vegan mac and cheese hot.'} │
│ ] │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> diff --git a/docs/examples/regex_validation.ipynb b/docs/dist/examples/regex_validation.ipynb similarity index 99% rename from docs/examples/regex_validation.ipynb rename to docs/dist/examples/regex_validation.ipynb index ba9e86726..8926823a6 100644 --- a/docs/examples/regex_validation.ipynb +++ b/docs/dist/examples/regex_validation.ipynb @@ -44,7 +44,7 @@ "metadata": {}, "outputs": [], "source": [ - "regex = '\\\\d{3}-\\\\d{3}-\\\\d{4}'" + "regex = \"\\\\d{3}-\\\\d{3}-\\\\d{4}\"" ] }, { @@ -244,14 +244,16 @@ ], "source": [ "guard = Guard.for_string(\n", - " validators=[RegexMatch(regex=regex, match_type='search', on_fail='reask')]\n", + " validators=[RegexMatch(regex=regex, match_type=\"search\", on_fail=\"reask\")]\n", ")\n", "\n", "guard(\n", - " messages=[{\n", - " \"role\": \"user\",\n", - " \"content\": \"I am writing a movie and need a fake phone number. Generate a fake phone number. Do not write anything other than the phone number.\"\n", - " }],\n", + " messages=[\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": \"I am writing a movie and need a fake phone number. Generate a fake phone number. Do not write anything other than the phone number.\",\n", + " }\n", + " ],\n", " model=\"gpt-4-turbo\",\n", ")\n", "\n", diff --git a/docs/dist/examples/regex_validation.md b/docs/dist/examples/regex_validation.md new file mode 100644 index 000000000..29afb294c --- /dev/null +++ b/docs/dist/examples/regex_validation.md @@ -0,0 +1,79 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +```bash +guardrails hub install hub://guardrails/regex_match --quiet +``` + + + +``` + Installing hub://guardrails/regex_match... + ✅Successfully installed guardrails/regex_match! + + +``` + + + + + +# Validating Responses using Regex + +This notebook demonstrates how to synthesize regex-validated responses from an LLM. + +In this example, we'll ask GPT-3.5 to give us a phone number, and make sure it's just separated by dashes - so something of the format 123-456-7890. + + +### Define the RegEx + + +```python +regex = "\\d{3}-\\d{3}-\\d{4}" +``` + +### Import Guardrails and openai + + +```python +from guardrails import Guard +from guardrails.hub import RegexMatch +from rich import print + +# Set your OPENAI_API_KEY as an environment variable +# import os +# os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY" +``` + + + +``` + /Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console) + from tqdm.autonotebook import tqdm, trange +``` + + + +### Create the guard and prompt + +We use a simple string guard with the RegexMatch validator. We can see that the initial response is malformatted, but the reask gets the LLM to respond correctly. + + +```python +guard = Guard.for_string( + validators=[RegexMatch(regex=regex, match_type="search", on_fail="reask")] +) + +guard( + messages=[ + { + "role": "user", + "content": "I am writing a movie and need a fake phone number. Generate a fake phone number. Do not write anything other than the phone number.", + } + ], + model="gpt-4-turbo", +) + +print(guard.history.last.tree) +``` + + warnings.warn(
/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.
warnings.warn(




Logs
├── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
│ │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ │ │ ┃ Role Content ┃ │
│ │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ │ │ user │ I am writing a movie and need a fake phone number. Generate a fake phone number. Do not │ │
│ │ │ │ │ write anything other than the phone number. │ │
│ │ │ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │
│ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
│ │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ │ │ (555) 012-3456 │
│ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
│ │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ │ │ FieldReAsk( │
│ │ │ incorrect_value='(555) 012-3456', │
│ │ │ fail_results=[ │
│ │ │ FailResult( │
│ │ │ outcome='fail', │
│ │ │ error_message='Result must match \\d{3}-\\d{3}-\\d{4}', │
│ │ │ fix_value='idfgxprs581-360-9865idfgxprs', │
│ │ │ error_spans=None, │
│ │ │ metadata=None, │
│ │ │ validated_chunk=None │
│ │ │ ) │
│ │ │ ], │
│ │ │ additional_properties={}, │
│ │ │ path=None │
│ │ │ ) │
│ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
│ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
└── ╭────────────────────────────────────────────────── Step 1 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ ┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ ┃ Role Content ┃ │
│ ┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ system │ You are a helpful assistant. │ │
│ ├────────┼────────────────────────────────────────────────────────────────────────────────────────────┤ │
│ │ user │ This was a previous response you generated: │ │
│ │ │ │ │
│ │ │ ====== │ │
│ │ │ (555) 012-3456 │ │
│ │ │ ====== │ │
│ │ │ │ │
│ │ │ Generate a new response that corrects your old response such that the following issues are │ │
│ │ │ fixed │ │
│ │ │ - Result must match \d{3}-\d{3}-\d{4} │ │
│ │ │ │ │
│ │ │ │ │
│ │ │ │ │
│ │ │ Your generated response should satisfy the following properties: │ │
│ │ │ - guardrails/regex_match: regex=\d{3}-\d{3}-\d{4} match_type=search │ │
│ │ │ │ │
│ │ │ Don't talk; just go. │ │
│ │ │ │ │
│ └────────┴────────────────────────────────────────────────────────────────────────────────────────────┘ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ 555-012-3456 │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ '555-012-3456' │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> diff --git a/docs/examples/response_is_on_topic.ipynb b/docs/dist/examples/response_is_on_topic.ipynb similarity index 99% rename from docs/examples/response_is_on_topic.ipynb rename to docs/dist/examples/response_is_on_topic.ipynb index b55497cce..962c37471 100644 --- a/docs/examples/response_is_on_topic.ipynb +++ b/docs/dist/examples/response_is_on_topic.ipynb @@ -17,7 +17,6 @@ } ], "source": [ - "\n", "!guardrails hub install hub://tryolabs/restricttotopic --quiet" ] }, @@ -183,7 +182,7 @@ " llm_output=text,\n", " )\n", "except ValidationError as e:\n", - " print(e)\n" + " print(e)" ] }, { diff --git a/docs/dist/examples/response_is_on_topic.md b/docs/dist/examples/response_is_on_topic.md new file mode 100644 index 000000000..74a55f2bc --- /dev/null +++ b/docs/dist/examples/response_is_on_topic.md @@ -0,0 +1,200 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +```bash +guardrails hub install hub://tryolabs/restricttotopic --quiet +``` + + + +``` + Installing hub://tryolabs/restricttotopic... + ✅Successfully installed tryolabs/restricttotopic! + + +``` + + + + + +# On Topic Validation + +This validator checks if a text is related with a topic. Using a list of valid topics (which can include one or many) and optionally a list of invalid topics, it validates that the text's main topic is one of the valid ones. If none of the valid topics are relevant, the topic 'Other' will be considered as the most relevant one and the validator will fail. + +The validator supports 3 different variants: + +1. Using an ensemble of Zero-Shot classifier + LLM fallback: if the original classification score is less than 0.5, an LLM is used to classify the main topic. This is the default behavior, setting `disable_classifier = False` and `disable_llm = False`. +2. Using just a Zero-Shot classifier to get the main topic (`disable_classifier = False` and `disable_llm = True`). +3. Using just an LLM to classify the main topic (`disable_classifier = True` and `disable_llm = False`). + +To use the LLM, you can pass in a name of any OpenAI ChatCompletion model like `gpt-3.5-turbo` or `gpt-4` as the `llm_callable`, or pass in a callable that handles LLM calls. This callable can use any LLM, that you define. For simplicity purposes, we show here a demo of using OpenAI's gpt-3.5-turbo model. + +To use the OpenAI API, you have 3 options: + +1. Set the OPENAI_API_KEY environment variable: os.environ["OPENAI_API_KEY"] = "[OpenAI_API_KEY]" +2. Set the OPENAI_API_KEY using openai.api_key="[OpenAI_API_KEY]" +3. Pass the api_key as a parameter to the parse function + +## Set up a list of valid and invalid topics + + +```python +valid_topics = ["bike"] +invalid_topics = ["phone", "tablet", "computer"] +``` + +## Set up the target topic + + +```python +text = """Introducing the Galaxy Tab S7, a sleek and sophisticated device that seamlessly combines \ +cutting-edge technology with unparalleled design. With a stunning 5.1-inch Quad HD Super AMOLED display, \ +every detail comes to life in vibrant clarity. The Samsung Galaxy S7 boasts a powerful processor, \ +ensuring swift and responsive performance for all your tasks. \ +Capture your most cherished moments with the advanced camera system, which delivers stunning photos in any lighting conditions.""" +``` + +## Set up the device + +The argument `device` is an ordinal to indicate CPU/GPU support for the Zero-shot classifier. Setting this to -1 (default) will leverage CPU, a positive will run the model on the associated CUDA device id. + + +```python +device = -1 +``` + +## Set up the model + +The argument `model` indicates the model that will be used to classify the topic. See a list of all models [here](https://huggingface.co/models?pipeline_tag=zero-shot-classification&sort=trending). + +## Test the validator + +### Version 1: Ensemble + +Here, we use the text we defined above as an example llm output (llm_output). This sample text is about the topic 'tablet', which is explicitly mentioned in our 'invalid_topics' list. We expect the validator to fail. + + +```python +import guardrails as gd +from guardrails.hub import RestrictToTopic +from guardrails.errors import ValidationError + +# Create the Guard with the OnTopic Validator +guard = gd.Guard.for_string( + validators=[ + RestrictToTopic( + valid_topics=valid_topics, + invalid_topics=invalid_topics, + device=device, + llm_callable="gpt-3.5-turbo", + disable_classifier=False, + disable_llm=False, + on_fail="exception", + ) + ], +) + +# Test with a given text +try: + guard.parse( + llm_output=text, + ) +except ValidationError as e: + print(e) +``` + + + +``` + /Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console) + from tqdm.autonotebook import tqdm, trange + /Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( + + + Validation failed for field with errors: Invalid topics found: ['phone', 'computer', 'tablet'] +``` + + + +### Version 2: Zero-Shot + +Here, we have disabled the LLM from running at all. We rely totally on what the Zero-Shot classifier outputs. We expect the validator again to fail. + + +```python +# Create the Guard with the OnTopic Validator +guard = gd.Guard.from_string( + validators=[ + RestrictToTopic( + valid_topics=valid_topics, + invalid_topics=invalid_topics, + device=device, + disable_classifier=False, + disable_llm=True, + on_fail="exception", + ) + ] +) + +# Test with a given text +try: + guard.parse( + llm_output=text, + ) +except ValidationError as e: + print(e) +``` + + + +``` + /Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( + + + Validation failed for field with errors: Invalid topics found: ['tablet', 'computer', 'phone'] +``` + + + +### Version 3: LLM + +We finally run the validator using the LLM alone, not as a backup to the zero-shot classifier. This cell expects an OPENAI_API_KEY to be present in as an env var. We again expect this cell to fail. + + +```python +# Create the Guard with the OnTopic Validator +guard = gd.Guard.for_string( + validators=[ + RestrictToTopic( + valid_topics=valid_topics, + invalid_topics=invalid_topics, + llm_callable="gpt-3.5-turbo", + disable_classifier=True, + disable_llm=False, + on_fail="exception", + ) + ], +) + +# Test with a given text +try: + guard.parse( + llm_output=text, + ) +except ValidationError as e: + print(e) +``` + + + +``` + /Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( + + + Validation failed for field with errors: Invalid topics found: ['tablet', 'phone'] +``` + + diff --git a/docs/examples/secrets_detection.ipynb b/docs/dist/examples/secrets_detection.ipynb similarity index 100% rename from docs/examples/secrets_detection.ipynb rename to docs/dist/examples/secrets_detection.ipynb diff --git a/docs/dist/examples/secrets_detection.md b/docs/dist/examples/secrets_detection.md new file mode 100644 index 000000000..f28d7ef5b --- /dev/null +++ b/docs/dist/examples/secrets_detection.md @@ -0,0 +1,123 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +```bash +guardrails hub install hub://guardrails/secrets_present --quiet +``` + + + +``` + Installing hub://guardrails/secrets_present... + ✅Successfully installed guardrails/secrets_present! + + +``` + + + + + +## Check whether an LLM-generated code response contains secrets + +### Using the `SecretsPresent` validator + +This is a simple walkthrough of how to use the `DetectSecrets` validator to check whether an LLM-generated code response contains secrets. It utilizes the `detect-secrets` library, which is a Python library that scans code files for secrets. The library is available on GitHub at [this link](https://github.com/Yelp/detect-secrets). + + + +```bash +# Install the necessary packages + pip install detect-secrets -q +``` + + +```python +# Import the guardrails package +# and import the SecretsPresent validator +# from Guardrails Hub +import guardrails as gd +from guardrails.hub import SecretsPresent +from rich import print +``` + + + +``` + /Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console) + from tqdm.autonotebook import tqdm, trange +``` + + + + +```python +# Create a Guard object with this validator +# Here, we'll specify that we want to fix +# if the validator detects secrets + +guard = gd.Guard.for_string( + validators=[SecretsPresent(on_fail="fix")], + description="testmeout", +) +``` + + +```python +# Let's run the validator on a dummy code snippet +# that contains few secrets +code_snippet = """ +import os +import openai + +SECRET_TOKEN = "DUMMY_SECRET_TOKEN_abcdefgh" + +ADMIN_CREDENTIALS = {"username": "admin", "password": "dummy_admin_password"} + + +openai.api_key = "sk-blT3BlbkFJo8bdtYwDLuZT" +COHERE_API_KEY = "qdCUhtsCtnixTRfdrG" +""" + +# Parse the code snippet +output = guard.parse( + llm_output=code_snippet, +) + +# Print the output +print(output.validated_output) +``` + + warnings.warn(





import os
import openai

SECRET_TOKEN = \"********\"

ADMIN_CREDENTIALS = {\"username\": \"admin\", \"password\": \"********\"}


openai.api_key = \"********\"
COHERE_API_KEY = \"********\"

"}} /> + +As you can see here, our validator detected the secrets within the provided code snippet. The detected secrets were then masked with asterisks. + + + +```python +# Let's run the validator on a dummy code snippet +# that does not contain any secrets +code_snippet = """ +import os +import openai + +companies = ["google", "facebook", "amazon", "microsoft", "apple"] +for company in companies: + print(company) +""" + +# Parse the code snippet +output = guard.parse( + llm_output=code_snippet, +) + +# Print the output +print(output.validated_output) +``` + + warnings.warn(






import os
import openai

companies = [\"google\", \"facebook\", \"amazon\", \"microsoft\", \"apple\"]
for company in companies:
print(company)

"}} /> + +As you can see here, the provided code snippet does not contain any secrets and the validator here also did not have any false positives! + + +#### In this way, you can use the `SecretsPresent` validator to check whether an LLM-generated code response contains secrets. With Guardrails as wrapper, you can be assured that the secrets in the code will be detected and masked and not be exposed. + diff --git a/docs/examples/select_choice_based_on_action.ipynb b/docs/dist/examples/select_choice_based_on_action.ipynb similarity index 99% rename from docs/examples/select_choice_based_on_action.ipynb rename to docs/dist/examples/select_choice_based_on_action.ipynb index 43fef1829..2922dd7ca 100644 --- a/docs/examples/select_choice_based_on_action.ipynb +++ b/docs/dist/examples/select_choice_based_on_action.ipynb @@ -114,18 +114,26 @@ "\n", "${gr.complete_xml_suffix_v2}\"\"\"\n", "\n", + "\n", "class Fight(BaseModel):\n", - " chosen_action: Literal['fight']\n", - " weapon: str = Field(validators=[ValidChoices(['crossbow', 'machine gun'], on_fail=\"reask\")])\n", + " chosen_action: Literal[\"fight\"]\n", + " weapon: str = Field(\n", + " validators=[ValidChoices([\"crossbow\", \"machine gun\"], on_fail=\"reask\")]\n", + " )\n", + "\n", "\n", "class Flight(BaseModel):\n", - " chosen_action: Literal['flight']\n", - " flight_direction: str = Field(validators=[ValidChoices(['north','south','east','west'], on_fail=\"exception\")])\n", - " distance: int = Field(validators=[ValidChoices([1,2,3,4], on_fail=\"exception\")])\n", + " chosen_action: Literal[\"flight\"]\n", + " flight_direction: str = Field(\n", + " validators=[\n", + " ValidChoices([\"north\", \"south\", \"east\", \"west\"], on_fail=\"exception\")\n", + " ]\n", + " )\n", + " distance: int = Field(validators=[ValidChoices([1, 2, 3, 4], on_fail=\"exception\")])\n", + "\n", "\n", "class FightOrFlight(BaseModel):\n", - " action: Union[Fight, Flight] = Field(discriminator='chosen_action')\n", - " " + " action: Union[Fight, Flight] = Field(discriminator=\"chosen_action\")" ] }, { @@ -181,7 +189,6 @@ "source": [ "import guardrails as gd\n", "\n", - "from rich import print\n", "\n", "guard = gd.Guard.for_pydantic(output_class=FightOrFlight)" ] @@ -234,8 +241,8 @@ "# os.environ[\"OPENAI_API_KEY\"] = \"YOUR_API_KEY\"\n", "\n", "raw_llm_response, validated_response, *rest = guard(\n", - " messages=[{\"role\":\"user\", \"content\": prompt}],\n", - " prompt_params={'opp_type': 'giant'},\n", + " messages=[{\"role\": \"user\", \"content\": prompt}],\n", + " prompt_params={\"opp_type\": \"giant\"},\n", " model=\"gpt-4o-mini\",\n", " max_tokens=256,\n", " temperature=0.0,\n", @@ -766,8 +773,8 @@ ], "source": [ "raw_llm_response, validated_response, *rest = guard(\n", - " messages=[{\"role\":\"user\", \"content\": prompt}],\n", - " prompt_params={'opp_type': 'goblin'},\n", + " messages=[{\"role\": \"user\", \"content\": prompt}],\n", + " prompt_params={\"opp_type\": \"goblin\"},\n", " model=\"gpt-4o-mini\",\n", " max_tokens=256,\n", " temperature=0.0,\n", diff --git a/docs/dist/examples/select_choice_based_on_action.md b/docs/dist/examples/select_choice_based_on_action.md new file mode 100644 index 000000000..4e099f99d --- /dev/null +++ b/docs/dist/examples/select_choice_based_on_action.md @@ -0,0 +1,238 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +```bash +guardrails hub install hub://guardrails/valid_choices --quiet +``` + + + +``` + Installing hub://guardrails/valid_choices... + ✅Successfully installed guardrails/valid_choices! + + +``` + + + + + +# Enforcing Guardrails on Choice Selection + +!!! note + To download this tutorial as a Jupyter notebook, click [here](https://github.com/guardrails-ai/guardrails/blob/main/docs/examples/select_choice_based_on_action.ipynb). + +In this example, we want the LLM to pick an action (e.g. `fight` or `flight`), and based on that action we want to return different JSON objects. For example, if the action is `fight`, we want to return a JSON object that contains the `weapon` field. If the action is `flight`, we want to return a JSON object that contains the `direction` and `distance` fields. + +We make the assumption that: + +1. We don't need any external libraries that are not already installed in the environment. +2. We are able to execute the code in the environment. + +## Objective + +We want the LLM to play an RP game where it can choose to either `fight` or `flight`. If it chooses to `fight`, the LLM should choose a `weapon` and an `enemy`. If the player chooses `flight`, the LLM should choose a `direction` and a `distance`. + +## Step 1: Generating `RAIL` Spec + +Ordinarily, we could create a separate `RAIL` spec in a file. However, for the sake of this example, we will generate the `RAIL` spec in the notebook as a string or a Pydantic Model. + +XML option: + + +```python +rail_str = """ + + + + + + + + + + + + + + + +You are a human in an enchanted forest. You come across opponents of different types, and you should fight smaller opponents and run away from bigger ones. + +You run into a ${opp_type}. What do you do? + +${gr.complete_xml_suffix_v2} + + + +""" +``` + +Pydantic model option: + + +```python +from guardrails.hub import ValidChoices +from pydantic import BaseModel, Field +from typing import Literal, Union + +prompt = """ +You are a human in an enchanted forest. You come across opponents of different types, and you should fight smaller opponents and run away from bigger ones. + +You run into a ${opp_type}. What do you do? + +${gr.complete_xml_suffix_v2}""" + + +class Fight(BaseModel): + chosen_action: Literal["fight"] + weapon: str = Field( + validators=[ValidChoices(["crossbow", "machine gun"], on_fail="reask")] + ) + + +class Flight(BaseModel): + chosen_action: Literal["flight"] + flight_direction: str = Field( + validators=[ + ValidChoices(["north", "south", "east", "west"], on_fail="exception") + ] + ) + distance: int = Field(validators=[ValidChoices([1, 2, 3, 4], on_fail="exception")]) + + +class FightOrFlight(BaseModel): + action: Union[Fight, Flight] = Field(discriminator="chosen_action") +``` + +## Step 2: Create a `Guard` object with the RAIL Spec + +We create a `gd.Guard` object that will check, validate and correct the generated code. This object: + +1. Enforces the quality criteria specified in the RAIL spec (i.e. bug free code). +2. Takes corrective action when the quality criteria are not met (i.e. reasking the LLM). +3. Compiles the schema and type info from the RAIL spec and adds it to the prompt. + +From XML: + + +```python +import guardrails as gd + +from rich import print + +guard = gd.Guard.for_rail_string(rail_str) +``` + +Or from Pydantic: + + +```python +import guardrails as gd + + +guard = gd.Guard.for_pydantic(output_class=FightOrFlight) +``` + +The `Guard` object compiles the output schema and adds it to the prompt. + +## Step 3: Wrap the LLM API call with `Guard` + +We can now wrap the LLM API call with the `Guard` object. This will ensure that the LLM generates an output that is compliant with the RAIL spec. + +To start, we test with a 'giant' as an opponent, and look at the output. + + +```python +# Set your OPENAI_API_KEY as an environment variable +# import os +# os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY" + +raw_llm_response, validated_response, *rest = guard( + messages=[{"role": "user", "content": prompt}], + prompt_params={"opp_type": "giant"}, + model="gpt-4o-mini", + max_tokens=256, + temperature=0.0, +) +``` + + + +``` + /Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( +``` + + + +Running the cell above returns: +1. The raw LLM text output as a single string. +2. A dictionary where the key is `python_code` and the value is the generated code. + +We can see that if the LLM chooses `flight`, the output is a dictionary with `flight_direction` and `distance` fields. + + +```python +print(validated_response) +``` + +{'action': {'chosen_action': 'flight', 'flight_direction': 'north', 'distance': 1}}
"}} /> + +We can also see the final prompt below: + + +```python +print(guard.history.last.iterations.first.inputs.messages[0]["content"]) +``` + +
You are a human in an enchanted forest. You come across opponents of different types, and you should fight smaller
opponents and run away from bigger ones.

You run into a giant. What do you do?


Given below is XML that describes the information to extract from this document and the tags to extract it into.

<output>
<choice discriminator=\"chosen_action\" name=\"action\" required=\"true\">
<case name=\"fight\">
<string format=\"guardrails/valid_choices: ['crossbow', 'machine gun']\" name=\"weapon\"
required=\"true\"></string>
</case>
<case name=\"flight\">
<string format=\"guardrails/valid_choices: ['north', 'south', 'east', 'west']\" name=\"flight_direction\"
required=\"true\"></string>
<integer format=\"guardrails/valid_choices: [1, 2, 3, 4]\" name=\"distance\" required=\"true\"></integer>
</case>
</choice>
</output>

ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the `name`
attribute of the corresponding XML, and the value is of the type specified by the corresponding XML's tag. The JSON
MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and
specific types. Be correct and concise.

Here are examples of simple (XML, JSON) pairs that show the expected behavior:
- `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`
- `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', 'STRING TWO', etc.]}`
- `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" format=\"1-indexed\"
/></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`

"}} /> + +We can inspect the logs of the guard object to see the quality criteria that were checked and the corrective actions that were taken. + + +```python +print(guard.history.last.tree) +``` + +Logs
├── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
│ │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ │ │ ┃ Role Content ┃ │
│ │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ │ │ user │ │ │
│ │ │ │ │ You are a human in an enchanted forest. You come across opponents of different types, and │ │
│ │ │ │ │ you should fight smaller opponents and run away from bigger ones. │ │
│ │ │ │ │ │ │
│ │ │ │ │ You run into a giant. What do you do? │ │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
│ │ │ │ │ Given below is XML that describes the information to extract from this document and the tags │ │
│ │ │ │ │ to extract it into. │ │
│ │ │ │ │ │ │
│ │ │ │ │ <output> │ │
│ │ │ │ │ <choice discriminator=\"chosen_action\" name=\"action\" required=\"true\"> │ │
│ │ │ │ │ <case name=\"fight\"> │ │
│ │ │ │ │ <string format=\"guardrails/valid_choices: ['crossbow', 'machine gun']\" name=\"weapon\" │ │
│ │ │ │ │ required=\"true\"></string> │ │
│ │ │ │ │ </case> │ │
│ │ │ │ │ <case name=\"flight\"> │ │
│ │ │ │ │ <string format=\"guardrails/valid_choices: ['north', 'south', 'east', 'west']\" │ │
│ │ │ │ │ name=\"flight_direction\" required=\"true\"></string> │ │
│ │ │ │ │ <integer format=\"guardrails/valid_choices: [1, 2, 3, 4]\" name=\"distance\" │ │
│ │ │ │ │ required=\"true\"></integer> │ │
│ │ │ │ │ </case> │ │
│ │ │ │ │ </choice> │ │
│ │ │ │ │ </output> │ │
│ │ │ │ │ │ │
│ │ │ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in │ │
│ │ │ │ │ JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │
│ │ │ │ │ any types and format requests e.g. requests for lists, objects and specific types. Be │ │
│ │ │ │ │ correct and concise. │ │
│ │ │ │ │ │ │
│ │ │ │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior: │ │
│ │ │ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │ │
│ │ │ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', │ │
│ │ │ │ │ 'STRING TWO', etc.]}` │ │
│ │ │ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer │ │
│ │ │ │ │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': │ │
│ │ │ │ │ 1}}` │ │
│ │ │ │ │ │ │
│ │ │ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │
│ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
│ │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ │ │ ```json │
│ │ │ { │
│ │ │ \"action\": \"flight\", │
│ │ │ \"flight_direction\": \"north\", │
│ │ │ \"distance\": 3 │
│ │ │ } │
│ │ │ ``` │
│ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
│ │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ │ │ SkeletonReAsk( │
│ │ │ incorrect_value={'action': 'flight'}, │
│ │ │ fail_results=[ │
│ │ │ FailResult( │
│ │ │ outcome='fail', │
│ │ │ error_message='JSON does not match schema:\n{\n \"$.action\": [\n \"\'flight\' is not │
│ │ │ valid under any of the given schemas\"\n ]\n}', │
│ │ │ fix_value=None, │
│ │ │ error_spans=None, │
│ │ │ metadata=None, │
│ │ │ validated_chunk=None │
│ │ │ ) │
│ │ │ ], │
│ │ │ additional_properties={} │
│ │ │ ) │
│ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
│ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
└── ╭────────────────────────────────────────────────── Step 1 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ ┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ ┃ Role Content ┃ │
│ ┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ system │ │ │
│ │ │ You are a helpful assistant only capable of communicating with valid JSON, and no other │ │
│ │ │ text. │ │
│ │ │ │ │
│ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field │ │
│ │ │ in JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, │ │
│ │ │ including any types and format requests e.g. requests for lists, objects and specific │ │
│ │ │ types. Be correct and concise. If you are unsure anywhere, enter `null`. │ │
│ │ │ │ │
│ │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior: │ │
│ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │ │
│ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', │ │
│ │ │ 'STRING TWO', etc.]}` │ │
│ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer │ │
│ │ │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': │ │
│ │ │ 1}}` │ │
│ │ │ │ │
│ ├────────┼────────────────────────────────────────────────────────────────────────────────────────────┤ │
│ │ user │ │ │
│ │ │ I was given the following JSON response, which had problems due to incorrect values. │ │
│ │ │ │ │
│ │ │ { │ │
│ │ │ \"incorrect_value\": { │ │
│ │ │ \"action\": \"flight\" │ │
│ │ │ }, │ │
│ │ │ \"error_messages\": [ │ │
│ │ │ \"JSON does not match schema:\n{\n \"$.action\": [\n \"'flight' is not valid under │ │
│ │ │ any of the given schemas\"\n ]\n}\" │ │
│ │ │ ] │ │
│ │ │ } │ │
│ │ │ │ │
│ │ │ Help me correct the incorrect values based on the given error messages. │ │
│ │ │ │ │
│ │ │ │ │
│ │ │ Given below is XML that describes the information to extract from this document and the │ │
│ │ │ tags to extract it into. │ │
│ │ │ │ │
│ │ │ <output> │ │
│ │ │ <choice discriminator=\"chosen_action\" name=\"action\" required=\"true\"> │ │
│ │ │ <case name=\"fight\"> │ │
│ │ │ <string format=\"guardrails/valid_choices: ['crossbow', 'machine gun']\" name=\"weapon\" │ │
│ │ │ required=\"true\"></string> │ │
│ │ │ </case> │ │
│ │ │ <case name=\"flight\"> │ │
│ │ │ <string format=\"guardrails/valid_choices: ['north', 'south', 'east', 'west']\" │ │
│ │ │ name=\"flight_direction\" required=\"true\"></string> │ │
│ │ │ <integer format=\"guardrails/valid_choices: [1, 2, 3, 4]\" name=\"distance\" │ │
│ │ │ required=\"true\"></integer> │ │
│ │ │ </case> │ │
│ │ │ </choice> │ │
│ │ │ </output> │ │
│ │ │ │ │
│ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field │ │
│ │ │ in JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, │ │
│ │ │ including any types and format requests e.g. requests for lists, objects and specific │ │
│ │ │ types. Be correct and concise. If you are unsure anywhere, enter `null`. │ │
│ │ │ │ │
│ │ │ Here's an example of the structure: │ │
│ │ │ { │ │
│ │ │ \"action\": { │ │
│ │ │ \"chosen_action\": \"flight\", │ │
│ │ │ \"flight_direction\": \"hit\", │ │
│ │ │ \"distance\": 17 │ │
│ │ │ } │ │
│ │ │ } │ │
│ │ │ │ │
│ └────────┴────────────────────────────────────────────────────────────────────────────────────────────┘ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ { │
│ \"action\": { │
│ \"chosen_action\": \"flight\", │
│ \"flight_direction\": \"north\", │
│ \"distance\": 1 │
│ } │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ { │
│ 'action': { │
│ 'chosen_action': 'flight', │
│ 'flight_direction': 'north', │
│ 'distance': 1 │
│ } │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> + +Now, let's test with a `goblin` as an opponent. + +We can see that the LLM chose to `fight` and the output is a choice of `weapon`. + + +```python +raw_llm_response, validated_response, *rest = guard( + messages=[{"role": "user", "content": prompt}], + prompt_params={"opp_type": "goblin"}, + model="gpt-4o-mini", + max_tokens=256, + temperature=0.0, +) +``` + + + +``` + /Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( +``` + + + + +```python +print(validated_response) +``` + +{'action': {'chosen_action': 'flight', 'flight_direction': 'north', 'distance': 1}}
"}} /> + +We can inspect the history of the guard after each call to see what happened. + + +```python +print(guard.history.last.tree) +``` + +Logs
├── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
│ │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ │ │ ┃ Role Content ┃ │
│ │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ │ │ user │ │ │
│ │ │ │ │ You are a human in an enchanted forest. You come across opponents of different types, and │ │
│ │ │ │ │ you should fight smaller opponents and run away from bigger ones. │ │
│ │ │ │ │ │ │
│ │ │ │ │ You run into a goblin. What do you do? │ │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
│ │ │ │ │ Given below is XML that describes the information to extract from this document and the tags │ │
│ │ │ │ │ to extract it into. │ │
│ │ │ │ │ │ │
│ │ │ │ │ <output> │ │
│ │ │ │ │ <choice discriminator=\"chosen_action\" name=\"action\" required=\"true\"> │ │
│ │ │ │ │ <case name=\"fight\"> │ │
│ │ │ │ │ <string format=\"guardrails/valid_choices: ['crossbow', 'machine gun']\" name=\"weapon\" │ │
│ │ │ │ │ required=\"true\"></string> │ │
│ │ │ │ │ </case> │ │
│ │ │ │ │ <case name=\"flight\"> │ │
│ │ │ │ │ <string format=\"guardrails/valid_choices: ['north', 'south', 'east', 'west']\" │ │
│ │ │ │ │ name=\"flight_direction\" required=\"true\"></string> │ │
│ │ │ │ │ <integer format=\"guardrails/valid_choices: [1, 2, 3, 4]\" name=\"distance\" │ │
│ │ │ │ │ required=\"true\"></integer> │ │
│ │ │ │ │ </case> │ │
│ │ │ │ │ </choice> │ │
│ │ │ │ │ </output> │ │
│ │ │ │ │ │ │
│ │ │ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in │ │
│ │ │ │ │ JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │
│ │ │ │ │ any types and format requests e.g. requests for lists, objects and specific types. Be │ │
│ │ │ │ │ correct and concise. │ │
│ │ │ │ │ │ │
│ │ │ │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior: │ │
│ │ │ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │ │
│ │ │ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', │ │
│ │ │ │ │ 'STRING TWO', etc.]}` │ │
│ │ │ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer │ │
│ │ │ │ │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': │ │
│ │ │ │ │ 1}}` │ │
│ │ │ │ │ │ │
│ │ │ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │
│ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
│ │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ │ │ ```json │
│ │ │ { │
│ │ │ \"action\": \"fight\", │
│ │ │ \"weapon\": \"crossbow\" │
│ │ │ } │
│ │ │ ``` │
│ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
│ │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ │ │ SkeletonReAsk( │
│ │ │ incorrect_value={'action': 'fight'}, │
│ │ │ fail_results=[ │
│ │ │ FailResult( │
│ │ │ outcome='fail', │
│ │ │ error_message='JSON does not match schema:\n{\n \"$.action\": [\n \"\'fight\' is not valid │
│ │ │ under any of the given schemas\"\n ]\n}', │
│ │ │ fix_value=None, │
│ │ │ error_spans=None, │
│ │ │ metadata=None, │
│ │ │ validated_chunk=None │
│ │ │ ) │
│ │ │ ], │
│ │ │ additional_properties={} │
│ │ │ ) │
│ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
│ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
└── ╭────────────────────────────────────────────────── Step 1 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ ┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ ┃ Role Content ┃ │
│ ┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ system │ │ │
│ │ │ You are a helpful assistant only capable of communicating with valid JSON, and no other │ │
│ │ │ text. │ │
│ │ │ │ │
│ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field │ │
│ │ │ in JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, │ │
│ │ │ including any types and format requests e.g. requests for lists, objects and specific │ │
│ │ │ types. Be correct and concise. If you are unsure anywhere, enter `null`. │ │
│ │ │ │ │
│ │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior: │ │
│ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │ │
│ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', │ │
│ │ │ 'STRING TWO', etc.]}` │ │
│ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer │ │
│ │ │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': │ │
│ │ │ 1}}` │ │
│ │ │ │ │
│ ├────────┼────────────────────────────────────────────────────────────────────────────────────────────┤ │
│ │ user │ │ │
│ │ │ I was given the following JSON response, which had problems due to incorrect values. │ │
│ │ │ │ │
│ │ │ { │ │
│ │ │ \"incorrect_value\": { │ │
│ │ │ \"action\": \"fight\" │ │
│ │ │ }, │ │
│ │ │ \"error_messages\": [ │ │
│ │ │ \"JSON does not match schema:\n{\n \"$.action\": [\n \"'fight' is not valid under │ │
│ │ │ any of the given schemas\"\n ]\n}\" │ │
│ │ │ ] │ │
│ │ │ } │ │
│ │ │ │ │
│ │ │ Help me correct the incorrect values based on the given error messages. │ │
│ │ │ │ │
│ │ │ │ │
│ │ │ Given below is XML that describes the information to extract from this document and the │ │
│ │ │ tags to extract it into. │ │
│ │ │ │ │
│ │ │ <output> │ │
│ │ │ <choice discriminator=\"chosen_action\" name=\"action\" required=\"true\"> │ │
│ │ │ <case name=\"fight\"> │ │
│ │ │ <string format=\"guardrails/valid_choices: ['crossbow', 'machine gun']\" name=\"weapon\" │ │
│ │ │ required=\"true\"></string> │ │
│ │ │ </case> │ │
│ │ │ <case name=\"flight\"> │ │
│ │ │ <string format=\"guardrails/valid_choices: ['north', 'south', 'east', 'west']\" │ │
│ │ │ name=\"flight_direction\" required=\"true\"></string> │ │
│ │ │ <integer format=\"guardrails/valid_choices: [1, 2, 3, 4]\" name=\"distance\" │ │
│ │ │ required=\"true\"></integer> │ │
│ │ │ </case> │ │
│ │ │ </choice> │ │
│ │ │ </output> │ │
│ │ │ │ │
│ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field │ │
│ │ │ in JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, │ │
│ │ │ including any types and format requests e.g. requests for lists, objects and specific │ │
│ │ │ types. Be correct and concise. If you are unsure anywhere, enter `null`. │ │
│ │ │ │ │
│ │ │ Here's an example of the structure: │ │
│ │ │ { │ │
│ │ │ \"action\": { │ │
│ │ │ \"chosen_action\": \"flight\", │ │
│ │ │ \"flight_direction\": \"form\", │ │
│ │ │ \"distance\": 63 │ │
│ │ │ } │ │
│ │ │ } │ │
│ │ │ │ │
│ └────────┴────────────────────────────────────────────────────────────────────────────────────────────┘ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ { │
│ \"action\": { │
│ \"chosen_action\": \"flight\", │
│ \"flight_direction\": \"north\", │
│ \"distance\": 1 │
│ } │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ { │
│ 'action': { │
│ 'chosen_action': 'flight', │
│ 'flight_direction': 'north', │
│ 'distance': 1 │
│ } │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> diff --git a/docs/examples/summarizer.ipynb b/docs/dist/examples/summarizer.ipynb similarity index 99% rename from docs/examples/summarizer.ipynb rename to docs/dist/examples/summarizer.ipynb index bd4bbba97..cafab3a5e 100644 --- a/docs/examples/summarizer.ipynb +++ b/docs/dist/examples/summarizer.ipynb @@ -113,13 +113,16 @@ "\n", "THREE_MINUTES = 180 / 60\n", "\n", + "\n", "class TextSummary(BaseModel):\n", " summary: str = Field(\n", " description=\"Faithful summary of the text\",\n", " validators=[\n", " ReadingTime(reading_time=THREE_MINUTES, on_fail=\"exception\"),\n", " ValidLength(min=100, max=1000, on_fail=\"exception\"),\n", - " SimilarToDocument(document=f\"'{content}'\", threshold=0.60, on_fail=\"filter\")\n", + " SimilarToDocument(\n", + " document=f\"'{content}'\", threshold=0.60, on_fail=\"filter\"\n", + " ),\n", " ],\n", " )" ] @@ -143,7 +146,6 @@ "outputs": [], "source": [ "import guardrails as gd\n", - "from guardrails.errors import ValidationError\n", "\n", "guard = gd.Guard().for_pydantic(TextSummary)" ] @@ -180,12 +182,11 @@ } ], "source": [ - "import os\n", "# TODO: Replace OPENAI_API_KEY with your OpenAI API key, uncomment\n", "# os.environ[\"OPENAI_API_KEY\"] = \"OPENAI_API_KEY\"\n", "\n", "response = guard(\n", - " messages=[{\"role\":\"user\", \"content\": prompt}],\n", + " messages=[{\"role\": \"user\", \"content\": prompt}],\n", " prompt_params={\"document\": document},\n", " model=\"gpt-4o\",\n", " tools=guard.json_function_calling_tool(),\n", @@ -578,7 +579,7 @@ ], "source": [ "response = guard(\n", - " messages=[{\"role\":\"user\", \"content\": prompt}],\n", + " messages=[{\"role\": \"user\", \"content\": prompt}],\n", " prompt_params={\"document\": document},\n", " model=\"babbage-002\",\n", " max_tokens=512,\n", diff --git a/docs/dist/examples/summarizer.md b/docs/dist/examples/summarizer.md new file mode 100644 index 000000000..e41d5ec20 --- /dev/null +++ b/docs/dist/examples/summarizer.md @@ -0,0 +1,191 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +# Summarizer + +In this example we will use Guardrails to summarize text in terms of length, quality and output read time. + +!!! note + To download this example as a Jupyter notebook, click [here](https://github.com/ShreyaR/guardrails/blob/main/docs/examples/summarization.ipynb). + +In this example, we will use Guardrails in the summarization of a text document. We will check whether the summarized document has a high semantic similarity with the original document. We will ensure the ouptput meets a certain range of length and read time. + +## Setup +In order to check semantic similarity we will need the `numpy` package via the command below. We will also install the validators we indtend to use. + + + + +```bash +guardrails hub install hub://guardrails/reading_time --quiet --install-local-models + guardrails hub install hub://guardrails/similar_to_document --quiet --install-local-models + guardrails hub install hub://guardrails/valid_length --quiet --install-local-models +``` + + + +``` + Note: you may need to restart the kernel to use updated packages. + Installing hub://guardrails/reading_time... + ✅Successfully installed guardrails/reading_time! + + + Installing hub://guardrails/similar_to_document... + ✅Successfully installed guardrails/similar_to_document! + + + Installing hub://guardrails/valid_length... + ✅Successfully installed guardrails/valid_length! + + +``` + + + +## Step 1: Load data and create Pydantic Model + +Load our text with the code below + + +```python +with open("data/twain.txt", "r") as file: + document = file.read() + file.seek(0) + content = "".join(line.strip() for line in file.readlines()) +``` + +Next we can define our return output with a pydantic model + + +```python +from pydantic import BaseModel, Field + +from guardrails.hub import SimilarToDocument, ValidLength, ReadingTime + +prompt = """ +Summarize the following text faithfully: + +${document} + +${gr.complete_xml_suffix} +""" + +THREE_MINUTES = 180 / 60 + + +class TextSummary(BaseModel): + summary: str = Field( + description="Faithful summary of the text", + validators=[ + ReadingTime(reading_time=THREE_MINUTES, on_fail="exception"), + ValidLength(min=100, max=1000, on_fail="exception"), + SimilarToDocument( + document=f"'{content}'", threshold=0.60, on_fail="filter" + ), + ], + ) +``` + + + +``` + /Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console) + from tqdm.autonotebook import tqdm, trange + + + Loading the model all-MiniLM-L6-v2. This may take a while... +``` + + + +## Step 2 Create Guard from pydantic + +The guard we create will: +1. Enforce reading time +2. Enforce length +3. Enforce similarity + + +```python +import guardrails as gd + +guard = gd.Guard().for_pydantic(TextSummary) +``` + +## Step 3: Call LLM via `guard(` + +We use the tools api to ensure our data is returned in a structured form. + + + +```python +# TODO: Replace OPENAI_API_KEY with your OpenAI API key, uncomment +# os.environ["OPENAI_API_KEY"] = "OPENAI_API_KEY" + +response = guard( + messages=[{"role": "user", "content": prompt}], + prompt_params={"document": document}, + model="gpt-4o", + tools=guard.json_function_calling_tool(), + tool_choice="required", +) + +print(f"Validated Output: {response.validated_output}") +``` + + + +``` + /Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( + + + Similarity: 0.818, Type: + Validated Output: {'summary': "Mark Twain discusses the art of storytelling, focusing on the humorous story, which he considers an American development. He contrasts it with the comic story, which is English, and the witty story, which is French. The humorous story relies on the manner of telling, allowing for length and meandering, while comic and witty stories depend on content and must be brief with a clear point. Twain emphasizes that telling a humorous story is a high art, requiring skill, unlike the comic and witty stories that anyone can tell. The humorous story is delivered gravely, with the teller pretending not to know it's funny, whereas the comic story is told with enthusiasm and obviousness. Twain notes that the humorous story often ends with a subtle point, requiring the audience's attention, a technique used by storytellers like Artemus Ward and others. In contrast, the comic story's punchline is emphasized and often exaggerated in print, which Twain finds disheartening."} +``` + + + +We can see the step-wise history of the `Guard` object below: + + +```python +guard.history.last.tree +``` + +Logs
└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ ┃ Role Content ┃ │
│ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ user │ │ │
│ │ │ Summarize the following text faithfully: │ │
│ │ │ │ │
│ │ │ The Humorous Story an American Development.— Its │ │
│ │ │ Difference from Comic and Witty Stories. │ │
│ │ │ │ │
│ │ │ DO not claim that I can tell a story as it ought to │ │
│ │ │ be told. I only claim to know how a story │ │
│ │ │ ought to be told, for I have been almost daily in the │ │
│ │ │ company of the most expert story-tellers for many │ │
│ │ │ years. │ │
│ │ │ │ │
│ │ │ There are several kinds of stories, but only one │ │
│ │ │ difficult kind —the humorous. I will talk mainly │ │
│ │ │ about that one. The humorous story is American, │ │
│ │ │ the comic story is English, the witty story is French. │ │
│ │ │ The humorous story depends for its effect upon the │ │
│ │ │ manner of the telling; the comic story and the witty │ │
│ │ │ story upon the matter. │ │
│ │ │ │ │
│ │ │ The humorous story may be spun out to great │ │
│ │ │ length, and may wander around as much as it │ │
│ │ │ pleases, and arrive nowhere in particular; but the │ │
│ │ │ comic and witty stories must be brief and end with │ │
│ │ │ a point. The humorous story bubbles gently along, │ │
│ │ │ the others burst. │ │
│ │ │ │ │
│ │ │ The humorous story is strictly a work of art — │ │
│ │ │ high and delicate art — and only an artist can tell it; │ │
│ │ │ but no art is necessary in telling the comic and the │ │
│ │ │ witty story; anybody can do it. The art of telling │ │
│ │ │ a humorous story — understand, I mean by word of │ │
│ │ │ mouth, not print — was created in America, and │ │
│ │ │ has remained at home. │ │
│ │ │ │ │
│ │ │ The humorous story is told gravely; the teller │ │
│ │ │ does his best to conceal the fact that he even dimly │ │
│ │ │ suspects that there is anything funny about it; but │ │
│ │ │ the teller of the comic story tells you beforehand │ │
│ │ │ that it is one of the funniest things he has ever │ │
│ │ │ heard, then tells it with eager delight, and is the │ │
│ │ │ first person to laugh when he gets through. And │ │
│ │ │ sometimes, if he has had good success, he is so glad │ │
│ │ │ and happy that he will repeat the ‘‘ nub’’ of it and │ │
│ │ │ slance around from face to face, collecting applause, │ │
│ │ │ and then repeat it again. It is a pathetic thing to │ │
│ │ │ see. │ │
│ │ │ │ │
│ │ │ Very often, of course, the rambling and disjointed │ │
│ │ │ humorous story finishes with a nub, point, snapper, │ │
│ │ │ or whatever you like to call it. Then the listener │ │
│ │ │ must be alert, for in many cases the teller will divert │ │
│ │ │ attention from that nub by dropping it in a carefully. │ │
│ │ │ casual and indifferent way, with the pretence that he │ │
│ │ │ does not know it is a nub. │ │
│ │ │ │ │
│ │ │ Artemus Ward used that trick a good deal; then │ │
│ │ │ when the belated audience presently caught the joke │ │
│ │ │ he would look up with innocent surprise, as if │ │
│ │ │ wondering what they had found to laugh at. Dan │ │
│ │ │ Setchell used it before him, Nye and Riley and │ │
│ │ │ others use it to-day. │ │
│ │ │ │ │
│ │ │ But the teller of the comic story does not slur │ │
│ │ │ the nub; he shouts it at you—every time. And │ │
│ │ │ when he prints it, in England, France, Germany, │ │
│ │ │ and Italy, he italicizes it, puts some whooping │ │
│ │ │ exclamation-points after it, and sometimes explains │ │
│ │ │ it in a parenthesis. All of which is very depressing, │ │
│ │ │ and makes one want to renounce joking and lead a │ │
│ │ │ better life. │ │
│ │ │ │ │
│ │ │ - Mark Twain │ │
│ │ │ │ │
│ │ │ │ │
│ │ │ Given below is XML that describes the information to extract from this document and the tags │ │
│ │ │ to extract it into. │ │
│ │ │ │ │
│ │ │ <output> │ │
│ │ │ <string description=\"Faithful summary of the text\" format=\"guardrails/reading_time: 3.0; │ │
│ │ │ guardrails/valid_length: 100 1000; guardrails/similar_to_document: 'The Humorous Story an │ │
│ │ │ American Development.— ItsDifference from Comic and Witty Stories.DO not claim that I can │ │
│ │ │ tell a story as it ought tobe told. I only claim to know how a storyought to be told, for I │ │
│ │ │ have been almost daily in thecompany of the most expert story-tellers for manyyears.There │ │
│ │ │ are several kinds of stories, but only onedifficult kind —the humorous. I will talk │ │
│ │ │ mainlyabout that one. The humorous story is American,the comic story is English, the witty │ │
│ │ │ story is French.The humorous story depends for its effect upon themanner of the telling; the │ │
│ │ │ comic story and the wittystory upon the matter.The humorous story may be spun out to │ │
│ │ │ greatlength, and may wander around as much as itpleases, and arrive nowhere in particular; │ │
│ │ │ but thecomic and witty stories must be brief and end witha point. The humorous story bubbles │ │
│ │ │ gently along,the others burst.The humorous story is strictly a work of art —high and │ │
│ │ │ delicate art — and only an artist can tell it;but no art is necessary in telling the comic │ │
│ │ │ and thewitty story; anybody can do it. The art of tellinga humorous story — understand, I │ │
│ │ │ mean by word ofmouth, not print — was created in America, andhas remained at home.The │ │
│ │ │ humorous story is told gravely; the tellerdoes his best to conceal the fact that he even │ │
│ │ │ dimlysuspects that there is anything funny about it; butthe teller of the comic story tells │ │
│ │ │ you beforehandthat it is one of the funniest things he has everheard, then tells it with │ │
│ │ │ eager delight, and is thefirst person to laugh when he gets through. Andsometimes, if he has │ │
│ │ │ had good success, he is so gladand happy that he will repeat the ‘‘ nub’’ of it andslance │ │
│ │ │ around from face to face, collecting applause,and then repeat it again. It is a pathetic │ │
│ │ │ thing tosee.Very often, of course, the rambling and disjointedhumorous story finishes with a │ │
│ │ │ nub, point, snapper,or whatever you like to call it. Then the listenermust be alert, for in │ │
│ │ │ many cases the teller will divertattention from that nub by dropping it in a │ │
│ │ │ carefully.casual and indifferent way, with the pretence that hedoes not know it is a │ │
│ │ │ nub.Artemus Ward used that trick a good deal; thenwhen the belated audience presently caught │ │
│ │ │ the jokehe would look up with innocent surprise, as ifwondering what they had found to laugh │ │
│ │ │ at. DanSetchell used it before him, Nye and Riley andothers use it to-day.But the teller of │ │
│ │ │ the comic story does not slurthe nub; he shouts it at you—every time. Andwhen he prints it, │ │
│ │ │ in England, France, Germany,and Italy, he italicizes it, puts some │ │
│ │ │ whoopingexclamation-points after it, and sometimes explainsit in a parenthesis. All of which │ │
│ │ │ is very depressing,and makes one want to renounce joking and lead abetter life.- Mark Twain' │ │
│ │ │ 0.6 all-MiniLM-L6-v2\" name=\"summary\" required=\"true\"></string> │ │
│ │ │ </output> │ │
│ │ │ │ │
│ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in │ │
│ │ │ JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │
│ │ │ any types and format requests e.g. requests for lists, objects and specific types. Be │ │
│ │ │ correct and concise. If you are unsure anywhere, enter `null`. │ │
│ │ │ │ │
│ │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior: │ │
│ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │ │
│ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', │ │
│ │ │ 'STRING TWO', etc.]}` │ │
│ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer │ │
│ │ │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': │ │
│ │ │ 1}}` │ │
│ │ │ │ │
│ │ │ │ │
│ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ {\"summary\":\"Mark Twain discusses the art of storytelling, focusing on the humorous story, which he │
│ considers an American development. He contrasts it with the comic story, which is English, and the │
│ witty story, which is French. The humorous story relies on the manner of telling, allowing for length │
│ and meandering, while comic and witty stories depend on content and must be brief with a clear point. │
│ Twain emphasizes that telling a humorous story is a high art, requiring skill, unlike the comic and │
│ witty stories that anyone can tell. The humorous story is delivered gravely, with the teller pretending │
│ not to know it's funny, whereas the comic story is told with enthusiasm and obviousness. Twain notes │
│ that the humorous story often ends with a subtle point, requiring the audience's attention, a technique │
│ used by storytellers like Artemus Ward and others. In contrast, the comic story's punchline is │
│ emphasized and often exaggerated in print, which Twain finds disheartening.\"} │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ { │
│ 'summary': \"Mark Twain discusses the art of storytelling, focusing on the humorous story, which he │
│ considers an American development. He contrasts it with the comic story, which is English, and the │
│ witty story, which is French. The humorous story relies on the manner of telling, allowing for length │
│ and meandering, while comic and witty stories depend on content and must be brief with a clear point. │
│ Twain emphasizes that telling a humorous story is a high art, requiring skill, unlike the comic and │
│ witty stories that anyone can tell. The humorous story is delivered gravely, with the teller pretending │
│ not to know it's funny, whereas the comic story is told with enthusiasm and obviousness. Twain notes │
│ that the humorous story often ends with a subtle point, requiring the audience's attention, a technique │
│ used by storytellers like Artemus Ward and others. In contrast, the comic story's punchline is │
│ emphasized and often exaggerated in print, which Twain finds disheartening.\" │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> + +The `guard` wrapper returns the raw_llm_respose (which is a simple string), and the validated and corrected output (which is a dictionary). We can see that the output is a dictionary with the correct schema and types. + +Now lets try a model thats not as proficent at summarization and we can see the ouptput is filtered and validation has failed. + +The final validated output is `None` due to the failed validation. + + +```python +response = guard( + messages=[{"role": "user", "content": prompt}], + prompt_params={"document": document}, + model="babbage-002", + max_tokens=512, + temperature=0, +) + +print(f"Validated Output: {response.validated_output}") +``` + + + +``` + Validated Output: None +``` + + + +We can see the step wise history of the guard execution below: + + +```python +guard.history.last.tree +``` + +Logs
├── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
│ │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ │ │ ┃ Role Content ┃ │
│ │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ │ │ user │ │ │
│ │ │ │ │ Summarize the following text faithfully: │ │
│ │ │ │ │ │ │
│ │ │ │ │ The Humorous Story an American Development.— Its │ │
│ │ │ │ │ Difference from Comic and Witty Stories. │ │
│ │ │ │ │ │ │
│ │ │ │ │ DO not claim that I can tell a story as it ought to │ │
│ │ │ │ │ be told. I only claim to know how a story │ │
│ │ │ │ │ ought to be told, for I have been almost daily in the │ │
│ │ │ │ │ company of the most expert story-tellers for many │ │
│ │ │ │ │ years. │ │
│ │ │ │ │ │ │
│ │ │ │ │ There are several kinds of stories, but only one │ │
│ │ │ │ │ difficult kind —the humorous. I will talk mainly │ │
│ │ │ │ │ about that one. The humorous story is American, │ │
│ │ │ │ │ the comic story is English, the witty story is French. │ │
│ │ │ │ │ The humorous story depends for its effect upon the │ │
│ │ │ │ │ manner of the telling; the comic story and the witty │ │
│ │ │ │ │ story upon the matter. │ │
│ │ │ │ │ │ │
│ │ │ │ │ The humorous story may be spun out to great │ │
│ │ │ │ │ length, and may wander around as much as it │ │
│ │ │ │ │ pleases, and arrive nowhere in particular; but the │ │
│ │ │ │ │ comic and witty stories must be brief and end with │ │
│ │ │ │ │ a point. The humorous story bubbles gently along, │ │
│ │ │ │ │ the others burst. │ │
│ │ │ │ │ │ │
│ │ │ │ │ The humorous story is strictly a work of art — │ │
│ │ │ │ │ high and delicate art — and only an artist can tell it; │ │
│ │ │ │ │ but no art is necessary in telling the comic and the │ │
│ │ │ │ │ witty story; anybody can do it. The art of telling │ │
│ │ │ │ │ a humorous story — understand, I mean by word of │ │
│ │ │ │ │ mouth, not print — was created in America, and │ │
│ │ │ │ │ has remained at home. │ │
│ │ │ │ │ │ │
│ │ │ │ │ The humorous story is told gravely; the teller │ │
│ │ │ │ │ does his best to conceal the fact that he even dimly │ │
│ │ │ │ │ suspects that there is anything funny about it; but │ │
│ │ │ │ │ the teller of the comic story tells you beforehand │ │
│ │ │ │ │ that it is one of the funniest things he has ever │ │
│ │ │ │ │ heard, then tells it with eager delight, and is the │ │
│ │ │ │ │ first person to laugh when he gets through. And │ │
│ │ │ │ │ sometimes, if he has had good success, he is so glad │ │
│ │ │ │ │ and happy that he will repeat the ‘‘ nub’’ of it and │ │
│ │ │ │ │ slance around from face to face, collecting applause, │ │
│ │ │ │ │ and then repeat it again. It is a pathetic thing to │ │
│ │ │ │ │ see. │ │
│ │ │ │ │ │ │
│ │ │ │ │ Very often, of course, the rambling and disjointed │ │
│ │ │ │ │ humorous story finishes with a nub, point, snapper, │ │
│ │ │ │ │ or whatever you like to call it. Then the listener │ │
│ │ │ │ │ must be alert, for in many cases the teller will divert │ │
│ │ │ │ │ attention from that nub by dropping it in a carefully. │ │
│ │ │ │ │ casual and indifferent way, with the pretence that he │ │
│ │ │ │ │ does not know it is a nub. │ │
│ │ │ │ │ │ │
│ │ │ │ │ Artemus Ward used that trick a good deal; then │ │
│ │ │ │ │ when the belated audience presently caught the joke │ │
│ │ │ │ │ he would look up with innocent surprise, as if │ │
│ │ │ │ │ wondering what they had found to laugh at. Dan │ │
│ │ │ │ │ Setchell used it before him, Nye and Riley and │ │
│ │ │ │ │ others use it to-day. │ │
│ │ │ │ │ │ │
│ │ │ │ │ But the teller of the comic story does not slur │ │
│ │ │ │ │ the nub; he shouts it at you—every time. And │ │
│ │ │ │ │ when he prints it, in England, France, Germany, │ │
│ │ │ │ │ and Italy, he italicizes it, puts some whooping │ │
│ │ │ │ │ exclamation-points after it, and sometimes explains │ │
│ │ │ │ │ it in a parenthesis. All of which is very depressing, │ │
│ │ │ │ │ and makes one want to renounce joking and lead a │ │
│ │ │ │ │ better life. │ │
│ │ │ │ │ │ │
│ │ │ │ │ - Mark Twain │ │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
│ │ │ │ │ Given below is XML that describes the information to extract from this document and the tags │ │
│ │ │ │ │ to extract it into. │ │
│ │ │ │ │ │ │
│ │ │ │ │ <output> │ │
│ │ │ │ │ <string description=\"Faithful summary of the text\" format=\"guardrails/reading_time: 3.0; │ │
│ │ │ │ │ guardrails/valid_length: 100 1000; guardrails/similar_to_document: 'The Humorous Story an │ │
│ │ │ │ │ American Development.— ItsDifference from Comic and Witty Stories.DO not claim that I can │ │
│ │ │ │ │ tell a story as it ought tobe told. I only claim to know how a storyought to be told, for I │ │
│ │ │ │ │ have been almost daily in thecompany of the most expert story-tellers for manyyears.There │ │
│ │ │ │ │ are several kinds of stories, but only onedifficult kind —the humorous. I will talk │ │
│ │ │ │ │ mainlyabout that one. The humorous story is American,the comic story is English, the witty │ │
│ │ │ │ │ story is French.The humorous story depends for its effect upon themanner of the telling; the │ │
│ │ │ │ │ comic story and the wittystory upon the matter.The humorous story may be spun out to │ │
│ │ │ │ │ greatlength, and may wander around as much as itpleases, and arrive nowhere in particular; │ │
│ │ │ │ │ but thecomic and witty stories must be brief and end witha point. The humorous story bubbles │ │
│ │ │ │ │ gently along,the others burst.The humorous story is strictly a work of art —high and │ │
│ │ │ │ │ delicate art — and only an artist can tell it;but no art is necessary in telling the comic │ │
│ │ │ │ │ and thewitty story; anybody can do it. The art of tellinga humorous story — understand, I │ │
│ │ │ │ │ mean by word ofmouth, not print — was created in America, andhas remained at home.The │ │
│ │ │ │ │ humorous story is told gravely; the tellerdoes his best to conceal the fact that he even │ │
│ │ │ │ │ dimlysuspects that there is anything funny about it; butthe teller of the comic story tells │ │
│ │ │ │ │ you beforehandthat it is one of the funniest things he has everheard, then tells it with │ │
│ │ │ │ │ eager delight, and is thefirst person to laugh when he gets through. Andsometimes, if he has │ │
│ │ │ │ │ had good success, he is so gladand happy that he will repeat the ‘‘ nub’’ of it andslance │ │
│ │ │ │ │ around from face to face, collecting applause,and then repeat it again. It is a pathetic │ │
│ │ │ │ │ thing tosee.Very often, of course, the rambling and disjointedhumorous story finishes with a │ │
│ │ │ │ │ nub, point, snapper,or whatever you like to call it. Then the listenermust be alert, for in │ │
│ │ │ │ │ many cases the teller will divertattention from that nub by dropping it in a │ │
│ │ │ │ │ carefully.casual and indifferent way, with the pretence that hedoes not know it is a │ │
│ │ │ │ │ nub.Artemus Ward used that trick a good deal; thenwhen the belated audience presently caught │ │
│ │ │ │ │ the jokehe would look up with innocent surprise, as ifwondering what they had found to laugh │ │
│ │ │ │ │ at. DanSetchell used it before him, Nye and Riley andothers use it to-day.But the teller of │ │
│ │ │ │ │ the comic story does not slurthe nub; he shouts it at you—every time. Andwhen he prints it, │ │
│ │ │ │ │ in England, France, Germany,and Italy, he italicizes it, puts some │ │
│ │ │ │ │ whoopingexclamation-points after it, and sometimes explainsit in a parenthesis. All of which │ │
│ │ │ │ │ is very depressing,and makes one want to renounce joking and lead abetter life.- Mark Twain' │ │
│ │ │ │ │ 0.6 all-MiniLM-L6-v2\" name=\"summary\" required=\"true\"></string> │ │
│ │ │ │ │ </output> │ │
│ │ │ │ │ │ │
│ │ │ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in │ │
│ │ │ │ │ JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │
│ │ │ │ │ any types and format requests e.g. requests for lists, objects and specific types. Be │ │
│ │ │ │ │ correct and concise. If you are unsure anywhere, enter `null`. │ │
│ │ │ │ │ │ │
│ │ │ │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior: │ │
│ │ │ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │ │
│ │ │ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', │ │
│ │ │ │ │ 'STRING TWO', etc.]}` │ │
│ │ │ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer │ │
│ │ │ │ │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': │ │
│ │ │ │ │ 1}}` │ │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
│ │ │ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │
│ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
│ │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ │ │ The following XML is invalid: │
│ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │
│ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', 'STRING TWO', │
│ │ │ etc.]}` │
│ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │
│ │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}` │
│ │ │ │
│ │ │ The following JSON is invalid: │
│ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │
│ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', 'STRING TWO', │
│ │ │ etc.]}` │
│ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │
│ │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}` │
│ │ │ │
│ │ │ The following XML is valid: │
│ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │
│ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', 'STRING TWO', │
│ │ │ etc.]}` │
│ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │
│ │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}` │
│ │ │ │
│ │ │ The following JSON is valid: │
│ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │
│ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', 'STRING TWO', │
│ │ │ etc.]}` │
│ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │
│ │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}` │
│ │ │ │
│ │ │ The following XML is valid: │
│ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │
│ │ │ - `<list │
│ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
│ │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ │ │ None │
│ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
│ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
└── ╭────────────────────────────────────────────────── Step 1 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ ┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ ┃ Role Content ┃ │
│ ┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ system │ │ │
│ │ │ You are a helpful assistant only capable of communicating with valid JSON, and no other │ │
│ │ │ text. │ │
│ │ │ │ │
│ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field │ │
│ │ │ in JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, │ │
│ │ │ including any types and format requests e.g. requests for lists, objects and specific │ │
│ │ │ types. Be correct and concise. If you are unsure anywhere, enter `null`. │ │
│ │ │ │ │
│ │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior: │ │
│ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │ │
│ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', │ │
│ │ │ 'STRING TWO', etc.]}` │ │
│ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer │ │
│ │ │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': │ │
│ │ │ 1}}` │ │
│ │ │ │ │
│ ├────────┼────────────────────────────────────────────────────────────────────────────────────────────┤ │
│ │ user │ │ │
│ │ │ I was given the following response, which was not parseable as JSON. │ │
│ │ │ │ │
│ │ │ \"The following XML is invalid:\n- `<string name='foo' format='two-words lower-case' />` => │ │
│ │ │ `{'foo': 'example one'}`\n- `<list name='bar'><string format='upper-case' /></list>` => │ │
│ │ │ `{\"bar\": ['STRING ONE', 'STRING TWO', etc.]}`\n- `<object name='baz'><string │ │
│ │ │ name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │ │
│ │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`\n\nThe │ │
│ │ │ following JSON is invalid:\n- `<string name='foo' format='two-words lower-case' />` => │ │
│ │ │ `{'foo': 'example one'}`\n- `<list name='bar'><string format='upper-case' /></list>` => │ │
│ │ │ `{\"bar\": ['STRING ONE', 'STRING TWO', etc.]}`\n- `<object name='baz'><string │ │
│ │ │ name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │ │
│ │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`\n\nThe │ │
│ │ │ following XML is valid:\n- `<string name='foo' format='two-words lower-case' />` => │ │
│ │ │ `{'foo': 'example one'}`\n- `<list name='bar'><string format='upper-case' /></list>` => │ │
│ │ │ `{\"bar\": ['STRING ONE', 'STRING TWO', etc.]}`\n- `<object name='baz'><string │ │
│ │ │ name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │ │
│ │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`\n\nThe │ │
│ │ │ following JSON is valid:\n- `<string name='foo' format='two-words lower-case' />` => │ │
│ │ │ `{'foo': 'example one'}`\n- `<list name='bar'><string format='upper-case' /></list>` => │ │
│ │ │ `{\"bar\": ['STRING ONE', 'STRING TWO', etc.]}`\n- `<object name='baz'><string │ │
│ │ │ name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │ │
│ │ │ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`\n\nThe │ │
│ │ │ following XML is valid:\n- `<string name='foo' format='two-words lower-case' />` => │ │
│ │ │ `{'foo': 'example one'}`\n- `<list\" │ │
│ │ │ │ │
│ │ │ Help me correct this by making it valid JSON. │ │
│ │ │ │ │
│ │ │ Given below is XML that describes the information to extract from this document and the │ │
│ │ │ tags to extract it into. │ │
│ │ │ │ │
│ │ │ <output> │ │
│ │ │ <string description=\"Faithful summary of the text\" format=\"guardrails/reading_time: 3.0; │ │
│ │ │ guardrails/valid_length: 100 1000; guardrails/similar_to_document: 'The Humorous Story an │ │
│ │ │ American Development.— ItsDifference from Comic and Witty Stories.DO not claim that I can │ │
│ │ │ tell a story as it ought tobe told. I only claim to know how a storyought to be told, for │ │
│ │ │ I have been almost daily in thecompany of the most expert story-tellers for │ │
│ │ │ manyyears.There are several kinds of stories, but only onedifficult kind —the humorous. I │ │
│ │ │ will talk mainlyabout that one. The humorous story is American,the comic story is English, │ │
│ │ │ the witty story is French.The humorous story depends for its effect upon themanner of the │ │
│ │ │ telling; the comic story and the wittystory upon the matter.The humorous story may be spun │ │
│ │ │ out to greatlength, and may wander around as much as itpleases, and arrive nowhere in │ │
│ │ │ particular; but thecomic and witty stories must be brief and end witha point. The humorous │ │
│ │ │ story bubbles gently along,the others burst.The humorous story is strictly a work of art │ │
│ │ │ —high and delicate art — and only an artist can tell it;but no art is necessary in telling │ │
│ │ │ the comic and thewitty story; anybody can do it. The art of tellinga humorous story — │ │
│ │ │ understand, I mean by word ofmouth, not print — was created in America, andhas remained at │ │
│ │ │ home.The humorous story is told gravely; the tellerdoes his best to conceal the fact that │ │
│ │ │ he even dimlysuspects that there is anything funny about it; butthe teller of the comic │ │
│ │ │ story tells you beforehandthat it is one of the funniest things he has everheard, then │ │
│ │ │ tells it with eager delight, and is thefirst person to laugh when he gets through. │ │
│ │ │ Andsometimes, if he has had good success, he is so gladand happy that he will repeat the │ │
│ │ │ ‘‘ nub’’ of it andslance around from face to face, collecting applause,and then repeat it │ │
│ │ │ again. It is a pathetic thing tosee.Very often, of course, the rambling and │ │
│ │ │ disjointedhumorous story finishes with a nub, point, snapper,or whatever you like to call │ │
│ │ │ it. Then the listenermust be alert, for in many cases the teller will divertattention from │ │
│ │ │ that nub by dropping it in a carefully.casual and indifferent way, with the pretence that │ │
│ │ │ hedoes not know it is a nub.Artemus Ward used that trick a good deal; thenwhen the belated │ │
│ │ │ audience presently caught the jokehe would look up with innocent surprise, as ifwondering │ │
│ │ │ what they had found to laugh at. DanSetchell used it before him, Nye and Riley andothers │ │
│ │ │ use it to-day.But the teller of the comic story does not slurthe nub; he shouts it at │ │
│ │ │ you—every time. Andwhen he prints it, in England, France, Germany,and Italy, he italicizes │ │
│ │ │ it, puts some whoopingexclamation-points after it, and sometimes explainsit in a │ │
│ │ │ parenthesis. All of which is very depressing,and makes one want to renounce joking and │ │
│ │ │ lead abetter life.- Mark Twain' 0.6 all-MiniLM-L6-v2\" name=\"summary\" │ │
│ │ │ required=\"true\"></string> │ │
│ │ │ </output> │ │
│ │ │ │ │
│ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field │ │
│ │ │ in JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, │ │
│ │ │ including any types and format requests e.g. requests for lists, objects and specific │ │
│ │ │ types. Be correct and concise. If you are unsure anywhere, enter `null`. │ │
│ │ │ │ │
│ └────────┴────────────────────────────────────────────────────────────────────────────────────────────┘ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │
│ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}` │
│ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │
│ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}` │
│ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │
│ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}` │
│ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │
│ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}` │
│ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │
│ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}` │
│ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │
│ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}` │
│ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │
│ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}` │
│ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │
│ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}` │
│ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │
│ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}` │
│ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │
│ format=\"1-indexed\" /></object>` => │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ None │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> diff --git a/docs/examples/syntax_error_free_sql.ipynb b/docs/dist/examples/syntax_error_free_sql.ipynb similarity index 99% rename from docs/examples/syntax_error_free_sql.ipynb rename to docs/dist/examples/syntax_error_free_sql.ipynb index 716ae7bbb..ade11df8e 100644 --- a/docs/examples/syntax_error_free_sql.ipynb +++ b/docs/dist/examples/syntax_error_free_sql.ipynb @@ -139,8 +139,12 @@ "${gr.complete_xml_suffix}\n", "\"\"\"\n", "\n", + "\n", "class ValidSql(BaseModel):\n", - " generated_sql: str = Field(description=\"Generate SQL for the given natural language instruction.\", validators=[ValidSQL(on_fail=\"reask\")])" + " generated_sql: str = Field(\n", + " description=\"Generate SQL for the given natural language instruction.\",\n", + " validators=[ValidSQL(on_fail=\"reask\")],\n", + " )" ] }, { @@ -245,7 +249,7 @@ "\n", "raw_llm_response, validated_response, *rest = guard(\n", " model=\"gpt-4o-mini\",\n", - " messages=[{\"role\":\"user\", \"content\": prompt}],\n", + " messages=[{\"role\": \"user\", \"content\": prompt}],\n", " prompt_params={\n", " \"nl_instruction\": \"Select the name of the employee who has the highest salary.\"\n", " },\n", diff --git a/docs/dist/examples/syntax_error_free_sql.md b/docs/dist/examples/syntax_error_free_sql.md new file mode 100644 index 000000000..30299b099 --- /dev/null +++ b/docs/dist/examples/syntax_error_free_sql.md @@ -0,0 +1,201 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +```bash +guardrails hub install hub://guardrails/valid_sql --quiet +``` + + + +``` + Installing hub://guardrails/valid_sql... + ✅Successfully installed guardrails/valid_sql! + + +``` + + + + + +# Natural Language to Bug Free SQL + +!!! note + To download this example as a Jupyter notebook, click [here](https://github.com/guardrails-ai/guardrails/blob/main/docs/examples/syntax_error_free_sql.ipynb). + +In this example, we will use Guardrails to generate SQL queries from natural language. We will check that the SQL is free of any syntax errors. + +## Objective + +We want to generate SQL queries from natural language, and check that the SQL is free of any syntax errors. + +## Step 0: Setup + +In order to run this example, you will need to install the `sqlvalidator` package. You can do so by running the following command: + + +```bash +pip install sqlvalidator -q +``` + +## Step 1: Create the RAIL Spec + +Ordinarily, we would create an RAIL spec in a separate file. For the purposes of this example, we will create the spec in this notebook as a string following the RAIL syntax. For more information on RAIL, see the [RAIL documentation](/docs/how_to_guides/rail). We will also show the same RAIL spec in a code-first format using a Pydantic model. + +In this RAIL spec, we: + +1. Create an `output` schema that returns a single key-value pair. The key should be 'generated_sql' and the value should be the SQL query generated from the natural language, which is syntactically correct. + +XML option: + + +```python +rail_str = """ + + + + + + + + + +Generate a valid SQL query for the following natural language instruction: + +${nl_instruction} + +${gr.complete_xml_suffix} + + + + + +""" +``` + +Pydantic model option: + + +```python +from guardrails.hub import ValidSQL +from pydantic import BaseModel, Field + +prompt = """ + +Generate a valid SQL query for the following natural language instruction: + +${nl_instruction} + +${gr.complete_xml_suffix} +""" + + +class ValidSql(BaseModel): + generated_sql: str = Field( + description="Generate SQL for the given natural language instruction.", + validators=[ValidSQL(on_fail="reask")], + ) +``` + + + +``` + /Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console) + from tqdm.autonotebook import tqdm, trange +``` + + + +!!! note + + In order to ensure that the SQL is syntactically correct, we use `bug-free-sql` as the formatter. This is a light-weight formatter that uses the `sqlvalidator` package to check that the SQL is free of any syntax errors. For your use case, you can create a custom SQL validator that connects to your database and checks that the SQL is valid. + +## Step 2: Create a `Guard` object with the RAIL Spec + +We create a `gd.Guard` object that will check, validate and correct the output of the LLM. This object: + +1. Enforces the quality criteria specified in the RAIL spec. +2. Takes corrective action when the quality criteria are not met. +3. Compiles the schema and type info from the RAIL spec and adds it to the prompt. + + +```python +import guardrails as gd + +from rich import print +``` + +Create the guard from the XML RAIL spec string: + + +```python +guard = gd.Guard.for_rail_string(rail_str) +``` + +Or from the Pydantic model: + + +```python +guard = gd.Guard.for_pydantic(output_class=ValidSql) +``` + +Here, `nl_language` is the natural language instruction and will be provided by the user at runtime. + +## Step 3: Wrap the LLM API call with `Guard` + + +```python +# Set your OPENAI_API_KEY as an environment variable +# import os +# os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY" + +raw_llm_response, validated_response, *rest = guard( + model="gpt-4o-mini", + messages=[{"role": "user", "content": prompt}], + prompt_params={ + "nl_instruction": "Select the name of the employee who has the highest salary." + }, + max_tokens=2048, + temperature=0, +) +``` + + + +``` + /Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( +``` + + + +We can see the prompt that was sent to the LLM: + + +```python +print(guard.history.last.iterations.last.inputs.messages[0]["content"]) +``` + +

Generate a valid SQL query for the following natural language instruction:

Select the name of the employee who has the highest salary.


Given below is XML that describes the information to extract from this document and the tags to extract it into.

<output>
<string description=\"Generate SQL for the given natural language instruction.\" format=\"guardrails/valid_sql: None
None\" name=\"generated_sql\" required=\"true\"></string>
</output>

ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the `name`
attribute of the corresponding XML, and the value is of the type specified by the corresponding XML's tag. The JSON
MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and
specific types. Be correct and concise. If you are unsure anywhere, enter `null`.

Here are examples of simple (XML, JSON) pairs that show the expected behavior:
- `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`
- `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', 'STRING TWO', etc.]}`
- `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" format=\"1-indexed\"
/></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`


"}} /> + +The `guard` wrapper returns the raw_llm_respose (which is a simple string), and the validated and corrected output (which is a dictionary). + +We can see that the output is a dictionary with the correct schema and types. + + +```python +print(validated_response) +``` + +{'generated_sql': 'SELECT name FROM employees ORDER BY salary DESC LIMIT 1;'}
"}} /> + + +```python +print(guard.history.last.tree) +``` + +Logs
└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ ┃ Role Content ┃ │
│ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ user │ │ │
│ │ │ │ │
│ │ │ Generate a valid SQL query for the following natural language instruction: │ │
│ │ │ │ │
│ │ │ Select the name of the employee who has the highest salary. │ │
│ │ │ │ │
│ │ │ │ │
│ │ │ Given below is XML that describes the information to extract from this document and the tags │ │
│ │ │ to extract it into. │ │
│ │ │ │ │
│ │ │ <output> │ │
│ │ │ <string description=\"Generate SQL for the given natural language instruction.\" │ │
│ │ │ format=\"guardrails/valid_sql: None None\" name=\"generated_sql\" required=\"true\"></string> │ │
│ │ │ </output> │ │
│ │ │ │ │
│ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in │ │
│ │ │ JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │
│ │ │ any types and format requests e.g. requests for lists, objects and specific types. Be │ │
│ │ │ correct and concise. If you are unsure anywhere, enter `null`. │ │
│ │ │ │ │
│ │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior: │ │
│ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │ │
│ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', │ │
│ │ │ 'STRING TWO', etc.]}` │ │
│ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer │ │
│ │ │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': │ │
│ │ │ 1}}` │ │
│ │ │ │ │
│ │ │ │ │
│ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ ```json │
│ {\"generated_sql\":\"SELECT name FROM employees ORDER BY salary DESC LIMIT 1;\"} │
│ ``` │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ {'generated_sql': 'SELECT name FROM employees ORDER BY salary DESC LIMIT 1;'} │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> diff --git a/docs/examples/text_summarization_quality.ipynb b/docs/dist/examples/text_summarization_quality.ipynb similarity index 90% rename from docs/examples/text_summarization_quality.ipynb rename to docs/dist/examples/text_summarization_quality.ipynb index 7480d350b..42032d7d4 100644 --- a/docs/examples/text_summarization_quality.ipynb +++ b/docs/dist/examples/text_summarization_quality.ipynb @@ -10,7 +10,7 @@ "output_type": "stream", "text": [ "Installing hub:\u001b[35m/\u001b[0m\u001b[35m/guardrails/\u001b[0m\u001b[95msimilar_to_document...\u001b[0m\n", - "✅Successfully installed guardrails/similar_to_document!\n", + "✅Successfully installed guardrails/similar_to_document version \u001b[1;36m0.0\u001b[0m.\u001b[1;36m0\u001b[0m!\n", "\n", "\n" ] @@ -93,7 +93,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -134,17 +134,9 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n", - " from tqdm.autonotebook import tqdm, trange\n" - ] - }, { "name": "stdout", "output_type": "stream", @@ -203,7 +195,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -221,7 +213,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -237,7 +229,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -267,66 +259,41 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Similarity: 0.987, Type: \n" - ] - }, { "name": "stderr", "output_type": "stream", "text": [ - "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", + "/Users/calebcourier/Projects/guardrails/docs/.venv/lib/python3.12/site-packages/guardrails/validator_service/__init__.py:84: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", " warnings.warn(\n" ] }, { "data": { "text/html": [ - "
Validated Output: {'summary': 'Section 1: All legislative Powers herein granted shall be vested in a Congress of \n",
-       "the United States, which shall consist of a Senate and House of Representatives. Section 2: The House of \n",
-       "Representatives shall be composed of Members chosen every second Year by the People of the several States, and the \n",
-       "Electors in each State shall have the Qualifications requisite for Electors of the most numerous Branch of the \n",
-       "State Legislature. No Person shall be a Representative who shall not have attained to the Age of twenty five Years,\n",
-       "and been seven Years a Citizen of the United States, and who shall not, when elected, be an Inhabitant of that \n",
-       "State in which he shall be chosen. Representatives and direct Taxes shall be apportioned among the several States \n",
-       "which may be included within this Union, according to their respective Numbers, which shall be determined by adding\n",
-       "to the whole Number of free Persons, including those bound to Service for a Term of Years, and excluding Indians \n",
-       "not taxed, three fifths of all other Persons. The actual Enumeration shall be made within three Years after the \n",
-       "first Meeting of the Congress of the United States, and within every subsequent Term of ten Years, in such Manner \n",
-       "as they shall by Law direct. The Number of Representatives shall not exceed one for every thirty Thousand, but each\n",
-       "State shall have at Least one Representative; and until such enumeration shall be made, the State of New Hampshire \n",
-       "shall be entitled to chuse three, Massachusetts eight, Rhode-Island and Providence Plantations one, Connecticut \n",
-       "five, New-York six, New Jersey four, Pennsylvania eight, Delaware one, Maryland six, Virginia ten, North Carolina \n",
-       "five, South Carolina five, and Georgia three. When vacancies happen in the Representation from any State, the \n",
-       "Executive Authority thereof shall issue Writs of Election to fill such Vacancies. The House of Representatives \n",
-       "shall chuse their Speaker and other Officers; and shall have the sole Power of Impeachment.'}\n",
+       "
Validated Output: {'summary': 'The document vests all legislative power in Congress, consisting of a Senate and \n",
+       "House. The House is elected every two years by the people of the states, with members required to be at least 25 \n",
+       "years old, seven years a citizen, and a resident of the state of election. Representation and direct taxation are \n",
+       "apportioned by population, counting free persons and including three fifths of enslaved persons; a census is to be \n",
+       "taken within three years after the first meeting and every ten years thereafter. The number of Representatives \n",
+       "shall not exceed one per thirty thousand, but each state must have at least one. An initial allocation to certain \n",
+       "states is provided until enumeration is done. Vacancies are filled by writs of election. The House chooses its \n",
+       "Speaker and officers and has the sole power of impeachment; the Electors in each state must meet qualifications for\n",
+       "electors of the most numerous branch of the state legislature.'}\n",
        "
\n" ], "text/plain": [ - "Validated Output: \u001b[1m{\u001b[0m\u001b[32m'summary'\u001b[0m: \u001b[32m'Section 1: All legislative Powers herein granted shall be vested in a Congress of \u001b[0m\n", - "\u001b[32mthe United States, which shall consist of a Senate and House of Representatives. Section 2: The House of \u001b[0m\n", - "\u001b[32mRepresentatives shall be composed of Members chosen every second Year by the People of the several States, and the \u001b[0m\n", - "\u001b[32mElectors in each State shall have the Qualifications requisite for Electors of the most numerous Branch of the \u001b[0m\n", - "\u001b[32mState Legislature. No Person shall be a Representative who shall not have attained to the Age of twenty five Years,\u001b[0m\n", - "\u001b[32mand been seven Years a Citizen of the United States, and who shall not, when elected, be an Inhabitant of that \u001b[0m\n", - "\u001b[32mState in which he shall be chosen. Representatives and direct Taxes shall be apportioned among the several States \u001b[0m\n", - "\u001b[32mwhich may be included within this Union, according to their respective Numbers, which shall be determined by adding\u001b[0m\n", - "\u001b[32mto the whole Number of free Persons, including those bound to Service for a Term of Years, and excluding Indians \u001b[0m\n", - "\u001b[32mnot taxed, three fifths of all other Persons. The actual Enumeration shall be made within three Years after the \u001b[0m\n", - "\u001b[32mfirst Meeting of the Congress of the United States, and within every subsequent Term of ten Years, in such Manner \u001b[0m\n", - "\u001b[32mas they shall by Law direct. The Number of Representatives shall not exceed one for every thirty Thousand, but each\u001b[0m\n", - "\u001b[32mState shall have at Least one Representative; and until such enumeration shall be made, the State of New Hampshire \u001b[0m\n", - "\u001b[32mshall be entitled to chuse three, Massachusetts eight, Rhode-Island and Providence Plantations one, Connecticut \u001b[0m\n", - "\u001b[32mfive, New-York six, New Jersey four, Pennsylvania eight, Delaware one, Maryland six, Virginia ten, North Carolina \u001b[0m\n", - "\u001b[32mfive, South Carolina five, and Georgia three. When vacancies happen in the Representation from any State, the \u001b[0m\n", - "\u001b[32mExecutive Authority thereof shall issue Writs of Election to fill such Vacancies. The House of Representatives \u001b[0m\n", - "\u001b[32mshall chuse their Speaker and other Officers; and shall have the sole Power of Impeachment.'\u001b[0m\u001b[1m}\u001b[0m\n" + "Validated Output: \u001b[1m{\u001b[0m\u001b[32m'summary'\u001b[0m: \u001b[32m'The document vests all legislative power in Congress, consisting of a Senate and \u001b[0m\n", + "\u001b[32mHouse. The House is elected every two years by the people of the states, with members required to be at least 25 \u001b[0m\n", + "\u001b[32myears old, seven years a citizen, and a resident of the state of election. Representation and direct taxation are \u001b[0m\n", + "\u001b[32mapportioned by population, counting free persons and including three fifths of enslaved persons; a census is to be \u001b[0m\n", + "\u001b[32mtaken within three years after the first meeting and every ten years thereafter. The number of Representatives \u001b[0m\n", + "\u001b[32mshall not exceed one per thirty thousand, but each state must have at least one. An initial allocation to certain \u001b[0m\n", + "\u001b[32mstates is provided until enumeration is done. Vacancies are filled by writs of election. The House chooses its \u001b[0m\n", + "\u001b[32mSpeaker and officers and has the sole power of impeachment; the Electors in each state must meet qualifications for\u001b[0m\n", + "\u001b[32melectors of the most numerous branch of the state legislature.'\u001b[0m\u001b[1m}\u001b[0m\n" ] }, "metadata": {}, @@ -339,11 +306,11 @@ "# os.environ[\"OPENAI_API_KEY\"] = \"YOUR_API_KEY\"\n", "\n", "raw_llm_response, validated_response, *rest = guard(\n", - " messages=[{\"role\":\"user\", \"content\": prompt}],\n", + " messages=[{\"role\": \"user\", \"content\": prompt}],\n", " prompt_params={\"document\": document},\n", - " model=\"gpt-3.5-turbo\",\n", + " model=\"gpt-5-nano\",\n", " max_tokens=2048,\n", - " temperature=0,\n", + " temperature=1,\n", ")\n", "\n", "print(f\"Validated Output: {validated_response}\")" @@ -358,7 +325,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -529,7 +496,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -626,51 +593,29 @@ " │ │ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │ │\n", " │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n", " │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n", - " │ │ { │ │\n", - " │ │ \"summary\": \"Section 1: All legislative Powers herein granted shall be vested in a Congress of the │ │\n", - " │ │ United States, which shall consist of a Senate and House of Representatives. Section 2: The House of │ │\n", - " │ │ Representatives shall be composed of Members chosen every second Year by the People of the several │ │\n", - " │ │ States, and the Electors in each State shall have the Qualifications requisite for Electors of the most │ │\n", - " │ │ numerous Branch of the State Legislature. No Person shall be a Representative who shall not have │ │\n", - " │ │ attained to the Age of twenty five Years, and been seven Years a Citizen of the United States, and who │ │\n", - " │ │ shall not, when elected, be an Inhabitant of that State in which he shall be chosen. Representatives │ │\n", - " │ │ and direct Taxes shall be apportioned among the several States which may be included within this Union, │ │\n", - " │ │ according to their respective Numbers, which shall be determined by adding to the whole Number of free │ │\n", - " │ │ Persons, including those bound to Service for a Term of Years, and excluding Indians not taxed, three │ │\n", - " │ │ fifths of all other Persons. The actual Enumeration shall be made within three Years after the first │ │\n", - " │ │ Meeting of the Congress of the United States, and within every subsequent Term of ten Years, in such │ │\n", - " │ │ Manner as they shall by Law direct. The Number of Representatives shall not exceed one for every thirty │ │\n", - " │ │ Thousand, but each State shall have at Least one Representative; and until such enumeration shall be │ │\n", - " │ │ made, the State of New Hampshire shall be entitled to chuse three, Massachusetts eight, Rhode-Island │ │\n", - " │ │ and Providence Plantations one, Connecticut five, New-York six, New Jersey four, Pennsylvania eight, │ │\n", - " │ │ Delaware one, Maryland six, Virginia ten, North Carolina five, South Carolina five, and Georgia three. │ │\n", - " │ │ When vacancies happen in the Representation from any State, the Executive Authority thereof shall issue │ │\n", - " │ │ Writs of Election to fill such Vacancies. The House of Representatives shall chuse their Speaker and │ │\n", - " │ │ other Officers; and shall have the sole Power of Impeachment.\" │ │\n", - " │ │ } │ │\n", + " │ │ {\"summary\": \"The document vests all legislative power in Congress, consisting of a Senate and House. │ │\n", + " │ │ The House is elected every two years by the people of the states, with members required to be at least │ │\n", + " │ │ 25 years old, seven years a citizen, and a resident of the state of election. Representation and direct │ │\n", + " │ │ taxation are apportioned by population, counting free persons and including three fifths of enslaved │ │\n", + " │ │ persons; a census is to be taken within three years after the first meeting and every ten years │ │\n", + " │ │ thereafter. The number of Representatives shall not exceed one per thirty thousand, but each state must │ │\n", + " │ │ have at least one. An initial allocation to certain states is provided until enumeration is done. │ │\n", + " │ │ Vacancies are filled by writs of election. The House chooses its Speaker and officers and has the sole │ │\n", + " │ │ power of impeachment; the Electors in each state must meet qualifications for electors of the most │ │\n", + " │ │ numerous branch of the state legislature.\"} │ │\n", " │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n", " │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n", " │ │ { │ │\n", - " │ │ 'summary': 'Section 1: All legislative Powers herein granted shall be vested in a Congress of the │ │\n", - " │ │ United States, which shall consist of a Senate and House of Representatives. Section 2: The House of │ │\n", - " │ │ Representatives shall be composed of Members chosen every second Year by the People of the several │ │\n", - " │ │ States, and the Electors in each State shall have the Qualifications requisite for Electors of the most │ │\n", - " │ │ numerous Branch of the State Legislature. No Person shall be a Representative who shall not have │ │\n", - " │ │ attained to the Age of twenty five Years, and been seven Years a Citizen of the United States, and who │ │\n", - " │ │ shall not, when elected, be an Inhabitant of that State in which he shall be chosen. Representatives │ │\n", - " │ │ and direct Taxes shall be apportioned among the several States which may be included within this Union, │ │\n", - " │ │ according to their respective Numbers, which shall be determined by adding to the whole Number of free │ │\n", - " │ │ Persons, including those bound to Service for a Term of Years, and excluding Indians not taxed, three │ │\n", - " │ │ fifths of all other Persons. The actual Enumeration shall be made within three Years after the first │ │\n", - " │ │ Meeting of the Congress of the United States, and within every subsequent Term of ten Years, in such │ │\n", - " │ │ Manner as they shall by Law direct. The Number of Representatives shall not exceed one for every thirty │ │\n", - " │ │ Thousand, but each State shall have at Least one Representative; and until such enumeration shall be │ │\n", - " │ │ made, the State of New Hampshire shall be entitled to chuse three, Massachusetts eight, Rhode-Island │ │\n", - " │ │ and Providence Plantations one, Connecticut five, New-York six, New Jersey four, Pennsylvania eight, │ │\n", - " │ │ Delaware one, Maryland six, Virginia ten, North Carolina five, South Carolina five, and Georgia three. │ │\n", - " │ │ When vacancies happen in the Representation from any State, the Executive Authority thereof shall issue │ │\n", - " │ │ Writs of Election to fill such Vacancies. The House of Representatives shall chuse their Speaker and │ │\n", - " │ │ other Officers; and shall have the sole Power of Impeachment.' │ │\n", + " │ │ 'summary': 'The document vests all legislative power in Congress, consisting of a Senate and House. │ │\n", + " │ │ The House is elected every two years by the people of the states, with members required to be at least │ │\n", + " │ │ 25 years old, seven years a citizen, and a resident of the state of election. Representation and direct │ │\n", + " │ │ taxation are apportioned by population, counting free persons and including three fifths of enslaved │ │\n", + " │ │ persons; a census is to be taken within three years after the first meeting and every ten years │ │\n", + " │ │ thereafter. The number of Representatives shall not exceed one per thirty thousand, but each state must │ │\n", + " │ │ have at least one. An initial allocation to certain states is provided until enumeration is done. │ │\n", + " │ │ Vacancies are filled by writs of election. The House chooses its Speaker and officers and has the sole │ │\n", + " │ │ power of impeachment; the Electors in each state must meet qualifications for electors of the most │ │\n", + " │ │ numerous branch of the state legislature.' │ │\n", " │ │ } │ │\n", " │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n", " ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n", @@ -768,51 +713,29 @@ " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", " │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", " │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m{\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \"summary\": \"Section 1: All legislative Powers herein granted shall be vested in a Congress of the \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mUnited States, which shall consist of a Senate and House of Representatives. Section 2: The House of \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mRepresentatives shall be composed of Members chosen every second Year by the People of the several \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mStates, and the Electors in each State shall have the Qualifications requisite for Electors of the most\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mnumerous Branch of the State Legislature. No Person shall be a Representative who shall not have \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mattained to the Age of twenty five Years, and been seven Years a Citizen of the United States, and who \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mshall not, when elected, be an Inhabitant of that State in which he shall be chosen. Representatives \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mand direct Taxes shall be apportioned among the several States which may be included within this Union,\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220maccording to their respective Numbers, which shall be determined by adding to the whole Number of free \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mPersons, including those bound to Service for a Term of Years, and excluding Indians not taxed, three \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mfifths of all other Persons. The actual Enumeration shall be made within three Years after the first \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mMeeting of the Congress of the United States, and within every subsequent Term of ten Years, in such \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mManner as they shall by Law direct. The Number of Representatives shall not exceed one for every thirty\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mThousand, but each State shall have at Least one Representative; and until such enumeration shall be \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mmade, the State of New Hampshire shall be entitled to chuse three, Massachusetts eight, Rhode-Island \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mand Providence Plantations one, Connecticut five, New-York six, New Jersey four, Pennsylvania eight, \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mDelaware one, Maryland six, Virginia ten, North Carolina five, South Carolina five, and Georgia three. \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mWhen vacancies happen in the Representation from any State, the Executive Authority thereof shall issue\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mWrits of Election to fill such Vacancies. The House of Representatives shall chuse their Speaker and \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mother Officers; and shall have the sole Power of Impeachment.\"\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m}\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m{\"summary\": \"The document vests all legislative power in Congress, consisting of a Senate and House. \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mThe House is elected every two years by the people of the states, with members required to be at least \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m25 years old, seven years a citizen, and a resident of the state of election. Representation and direct\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mtaxation are apportioned by population, counting free persons and including three fifths of enslaved \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mpersons; a census is to be taken within three years after the first meeting and every ten years \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mthereafter. The number of Representatives shall not exceed one per thirty thousand, but each state must\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mhave at least one. An initial allocation to certain states is provided until enumeration is done. \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mVacancies are filled by writs of election. The House chooses its Speaker and officers and has the sole \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mpower of impeachment; the Electors in each state must meet qualifications for electors of the most \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mnumerous branch of the state legislature.\"}\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", " │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", " │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n", " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m{\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m 'summary': 'Section 1: All legislative Powers herein granted shall be vested in a Congress of the \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mUnited States, which shall consist of a Senate and House of Representatives. Section 2: The House of \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mRepresentatives shall be composed of Members chosen every second Year by the People of the several \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mStates, and the Electors in each State shall have the Qualifications requisite for Electors of the most\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mnumerous Branch of the State Legislature. No Person shall be a Representative who shall not have \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mattained to the Age of twenty five Years, and been seven Years a Citizen of the United States, and who \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mshall not, when elected, be an Inhabitant of that State in which he shall be chosen. Representatives \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mand direct Taxes shall be apportioned among the several States which may be included within this Union,\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240maccording to their respective Numbers, which shall be determined by adding to the whole Number of free \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mPersons, including those bound to Service for a Term of Years, and excluding Indians not taxed, three \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mfifths of all other Persons. The actual Enumeration shall be made within three Years after the first \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mMeeting of the Congress of the United States, and within every subsequent Term of ten Years, in such \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mManner as they shall by Law direct. The Number of Representatives shall not exceed one for every thirty\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mThousand, but each State shall have at Least one Representative; and until such enumeration shall be \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mmade, the State of New Hampshire shall be entitled to chuse three, Massachusetts eight, Rhode-Island \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mand Providence Plantations one, Connecticut five, New-York six, New Jersey four, Pennsylvania eight, \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mDelaware one, Maryland six, Virginia ten, North Carolina five, South Carolina five, and Georgia three. \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mWhen vacancies happen in the Representation from any State, the Executive Authority thereof shall issue\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mWrits of Election to fill such Vacancies. The House of Representatives shall chuse their Speaker and \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mother Officers; and shall have the sole Power of Impeachment.'\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m 'summary': 'The document vests all legislative power in Congress, consisting of a Senate and House.\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mThe House is elected every two years by the people of the states, with members required to be at least \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m25 years old, seven years a citizen, and a resident of the state of election. Representation and direct\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mtaxation are apportioned by population, counting free persons and including three fifths of enslaved \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mpersons; a census is to be taken within three years after the first meeting and every ten years \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mthereafter. The number of Representatives shall not exceed one per thirty thousand, but each state must\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mhave at least one. An initial allocation to certain states is provided until enumeration is done. \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mVacancies are filled by writs of election. The House chooses its Speaker and officers and has the sole \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mpower of impeachment; the Electors in each state must meet qualifications for electors of the most \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mnumerous branch of the state legislature.'\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m}\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", " │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", " ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n" @@ -838,7 +761,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -857,7 +780,7 @@ ], "source": [ "raw_llm_response, validated_response, *rest = guard(\n", - " messages=[{\"role\":\"user\", \"content\": prompt}],\n", + " messages=[{\"role\": \"user\", \"content\": prompt}],\n", " prompt_params={\"document\": open(\"data/article1.txt\", \"r\").read()},\n", " model=\"babbage-002\",\n", " max_tokens=512,\n", @@ -877,7 +800,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -1285,7 +1208,7 @@ ], "metadata": { "kernelspec": { - "display_name": "litellm", + "display_name": ".venv", "language": "python", "name": "python3" }, @@ -1299,7 +1222,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.3" + "version": "3.12.11" }, "orig_nbformat": 4 }, diff --git a/docs/dist/examples/text_summarization_quality.md b/docs/dist/examples/text_summarization_quality.md new file mode 100644 index 000000000..1a502027b --- /dev/null +++ b/docs/dist/examples/text_summarization_quality.md @@ -0,0 +1,229 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +```bash +guardrails hub install hub://guardrails/similar_to_document --quiet +``` + + + +``` + Installing hub://guardrails/similar_to_document... + ✅Successfully installed guardrails/similar_to_document version 0.0.0! + + +``` + + + + + +# Summarize text accurately + +:::note + To download this example as a Jupyter notebook, click [here](https://github.com/ShreyaR/guardrails/blob/main/docs/examples/text_summarization_quality.ipynb). +::: + +In this example, we will use Guardrails in the summarization of a text document. We will check whether the summarized document has a high semantic similarity with the original document. + +## Objective + +Summarize a text document and check whether the summarized document has a high semantic similarity with the original document. + +## Step 0: Setup + +In order to run this example, you will need to install the `numpy` package. You can do so by running the following commands: + + +```bash +pip install numpy -q +``` + +## Step 1: Create the RAIL Spec + +Ordinarily, we would create an RAIL spec in a separate file. For the purposes of this example, we will create the spec in this notebook as a string following the RAIL syntax. For more information on RAIL, see the [RAIL documentation](/docs/how_to_guides/rail). We will also show the same RAIL spec in a code-first format using a Pydantic model. + +In this RAIL spec, we: + +1. Create an `output` schema that returns a single key-value pair. The key should be 'summary', and the value should be the summary of the given document. + +First let's open our document: + + +```python +with open("data/article1.txt", "r") as file: + document = file.read() + file.seek(0) + content = "".join(line.strip() for line in file.readlines()) +``` + +Next we can define our RAIL spec either as a XML string: + + +```python +from string import Template + +rail_str = Template( + """ + + + + + + + +Summarize the following document: + +${document} + +${gr.complete_xml_suffix} + + + +""" +).safe_substitute(document=document) +``` + +Or as a Pydantic model: + + +```python +from pydantic import BaseModel, Field + +from guardrails.hub import SimilarToDocument + +prompt = """ +Summarize the following document: + +${document} + +${gr.complete_xml_suffix} +""" + + +class DocumentSummary(BaseModel): + summary: str = Field( + description="Summarize the given document faithfully.", + validators=[ + SimilarToDocument(document=f"'{content}'", threshold=0.60, on_fail="filter") + ], + ) +``` + + + +``` + Loading the model all-MiniLM-L6-v2. This may take a while... +``` + + + +:::note + + In order to ensure the summary is similar to the document, we use `similar-to-document` as the validator. This validator embeds the document and the summary and checks whether the cosine similarity between the two embeddings is above a threshold. + +::: + +## Step 2: Create a `Guard` object with the RAIL Spec + +We create a `gd.Guard` object that will check, validate and correct the output of the LLM. This object: + +1. Enforces the quality criteria specified in the RAIL spec. +2. Takes corrective action when the quality criteria are not met. +3. Compiles the schema and type info from the RAIL spec and adds it to the prompt. + + +```python +from rich import print + +import guardrails as gd +``` + +From our RAIL string: + + +```python +guard = gd.Guard.for_rail_string(rail_str) +``` + +Or from our Pydantic model: + + +```python +guard = gd.Guard.for_pydantic(output_class=DocumentSummary) +``` + +Here, `statement_to_be_translated` is the the statement and will be provided by the user at runtime. + +## Step 3: Wrap the LLM API call with `Guard` + +First, let's try translating a statement that doesn't have any profanity in it. + + +```python +# Set your OPENAI_API_KEY as an environment variable +# import os +# os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY" + +raw_llm_response, validated_response, *rest = guard( + messages=[{"role": "user", "content": prompt}], + prompt_params={"document": document}, + model="gpt-5-nano", + max_tokens=2048, + temperature=1, +) + +print(f"Validated Output: {validated_response}") +``` + + warnings.warn(




Validated Output: {'summary': 'The document vests all legislative power in Congress, consisting of a Senate and 
House. The House is elected every two years by the people of the states, with members required to be at least 25
years old, seven years a citizen, and a resident of the state of election. Representation and direct taxation are
apportioned by population, counting free persons and including three fifths of enslaved persons; a census is to be
taken within three years after the first meeting and every ten years thereafter. The number of Representatives
shall not exceed one per thirty thousand, but each state must have at least one. An initial allocation to certain
states is provided until enumeration is done. Vacancies are filled by writs of election. The House chooses its
Speaker and officers and has the sole power of impeachment; the Electors in each state must meet qualifications for
electors of the most numerous branch of the state legislature.'}
"}} /> + +We can see the prompt that was sent to the LLM: + + +```python +print(guard.history.last.iterations.last.inputs.messages[0]["content"]) +``` + +
Summarize the following document:

Section. 1.
All legislative Powers herein granted shall be vested in a Congress of the United States, which shall consist of a
Senate and House of Representatives.

Section. 2.
The House of Representatives shall be composed of Members chosen every second Year by the People of the several
States, and the Electors in each State shall have the Qualifications requisite for Electors of the most numerous
Branch of the State Legislature.

No Person shall be a Representative who shall not have attained to the Age of twenty five Years, and been seven
Years a Citizen of the United States, and who shall not, when elected, be an Inhabitant of that State in which he
shall be chosen.

Representatives and direct Taxes shall be apportioned among the several States which may be included within this
Union, according to their respective Numbers, which shall be determined by adding to the whole Number of free
Persons, including those bound to Service for a Term of Years, and excluding Indians not taxed, three fifths of all
other Persons. The actual Enumeration shall be made within three Years after the first Meeting of the Congress of
the United States, and within every subsequent Term of ten Years, in such Manner as they shall by Law direct. The
Number of Representatives shall not exceed one for every thirty Thousand, but each State shall have at Least one
Representative; and until such enumeration shall be made, the State of New Hampshire shall be entitled to chuse
three, Massachusetts eight, Rhode-Island and Providence Plantations one, Connecticut five, New-York six, New Jersey
four, Pennsylvania eight, Delaware one, Maryland six, Virginia ten, North Carolina five, South Carolina five, and
Georgia three.

When vacancies happen in the Representation from any State, the Executive Authority thereof shall issue Writs of
Election to fill such Vacancies.

The House of Representatives shall chuse their Speaker and other Officers; and shall have the sole Power of
Impeachment.


Given below is XML that describes the information to extract from this document and the tags to extract it into.

<output>
<string description=\"Summarize the given document faithfully.\" format=\"guardrails/similar_to_document: 'Section.
1.All legislative Powers herein granted shall be vested in a Congress of the United States, which shall consist of
a Senate and House of Representatives.Section. 2.The House of Representatives shall be composed of Members chosen
every second Year by the People of the several States, and the Electors in each State shall have the Qualifications
requisite for Electors of the most numerous Branch of the State Legislature.No Person shall be a Representative who
shall not have attained to the Age of twenty five Years, and been seven Years a Citizen of the United States, and
who shall not, when elected, be an Inhabitant of that State in which he shall be chosen.Representatives and direct
Taxes shall be apportioned among the several States which may be included within this Union, according to their
respective Numbers, which shall be determined by adding to the whole Number of free Persons, including those bound
to Service for a Term of Years, and excluding Indians not taxed, three fifths of all other Persons. The actual
Enumeration shall be made within three Years after the first Meeting of the Congress of the United States, and
within every subsequent Term of ten Years, in such Manner as they shall by Law direct. The Number of
Representatives shall not exceed one for every thirty Thousand, but each State shall have at Least one
Representative; and until such enumeration shall be made, the State of New Hampshire shall be entitled to chuse
three, Massachusetts eight, Rhode-Island and Providence Plantations one, Connecticut five, New-York six, New Jersey
four, Pennsylvania eight, Delaware one, Maryland six, Virginia ten, North Carolina five, South Carolina five, and
Georgia three.When vacancies happen in the Representation from any State, the Executive Authority thereof shall
issue Writs of Election to fill such Vacancies.The House of Representatives shall chuse their Speaker and other
Officers; and shall have the sole Power of Impeachment.' 0.6 all-MiniLM-L6-v2\" name=\"summary\"
required=\"true\"></string>
</output>

ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the `name`
attribute of the corresponding XML, and the value is of the type specified by the corresponding XML's tag. The JSON
MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and
specific types. Be correct and concise. If you are unsure anywhere, enter `null`.

Here are examples of simple (XML, JSON) pairs that show the expected behavior:
- `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`
- `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', 'STRING TWO', etc.]}`
- `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" format=\"1-indexed\"
/></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`


"}} /> + +In order to see a detailed look into the logs of the `Guard` object, we can print the `Guard` state history: + + +```python +print(guard.history.last.tree) +``` + +Logs
└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ ┃ Role Content ┃ │
│ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ user │ │ │
│ │ │ Summarize the following document: │ │
│ │ │ │ │
│ │ │ Section. 1. │ │
│ │ │ All legislative Powers herein granted shall be vested in a Congress of the United States, │ │
│ │ │ which shall consist of a Senate and House of Representatives. │ │
│ │ │ │ │
│ │ │ Section. 2. │ │
│ │ │ The House of Representatives shall be composed of Members chosen every second Year by the │ │
│ │ │ People of the several States, and the Electors in each State shall have the Qualifications │ │
│ │ │ requisite for Electors of the most numerous Branch of the State Legislature. │ │
│ │ │ │ │
│ │ │ No Person shall be a Representative who shall not have attained to the Age of twenty five │ │
│ │ │ Years, and been seven Years a Citizen of the United States, and who shall not, when elected, │ │
│ │ │ be an Inhabitant of that State in which he shall be chosen. │ │
│ │ │ │ │
│ │ │ Representatives and direct Taxes shall be apportioned among the several States which may be │ │
│ │ │ included within this Union, according to their respective Numbers, which shall be determined │ │
│ │ │ by adding to the whole Number of free Persons, including those bound to Service for a Term │ │
│ │ │ of Years, and excluding Indians not taxed, three fifths of all other Persons. The actual │ │
│ │ │ Enumeration shall be made within three Years after the first Meeting of the Congress of the │ │
│ │ │ United States, and within every subsequent Term of ten Years, in such Manner as they shall │ │
│ │ │ by Law direct. The Number of Representatives shall not exceed one for every thirty Thousand, │ │
│ │ │ but each State shall have at Least one Representative; and until such enumeration shall be │ │
│ │ │ made, the State of New Hampshire shall be entitled to chuse three, Massachusetts eight, │ │
│ │ │ Rhode-Island and Providence Plantations one, Connecticut five, New-York six, New Jersey │ │
│ │ │ four, Pennsylvania eight, Delaware one, Maryland six, Virginia ten, North Carolina five, │ │
│ │ │ South Carolina five, and Georgia three. │ │
│ │ │ │ │
│ │ │ When vacancies happen in the Representation from any State, the Executive Authority thereof │ │
│ │ │ shall issue Writs of Election to fill such Vacancies. │ │
│ │ │ │ │
│ │ │ The House of Representatives shall chuse their Speaker and other Officers; and shall have │ │
│ │ │ the sole Power of Impeachment. │ │
│ │ │ │ │
│ │ │ │ │
│ │ │ Given below is XML that describes the information to extract from this document and the tags │ │
│ │ │ to extract it into. │ │
│ │ │ │ │
│ │ │ <output> │ │
│ │ │ <string description=\"Summarize the given document faithfully.\" │ │
│ │ │ format=\"guardrails/similar_to_document: 'Section. 1.All legislative Powers herein granted │ │
│ │ │ shall be vested in a Congress of the United States, which shall consist of a Senate and │ │
│ │ │ House of Representatives.Section. 2.The House of Representatives shall be composed of │ │
│ │ │ Members chosen every second Year by the People of the several States, and the Electors in │ │
│ │ │ each State shall have the Qualifications requisite for Electors of the most numerous Branch │ │
│ │ │ of the State Legislature.No Person shall be a Representative who shall not have attained to │ │
│ │ │ the Age of twenty five Years, and been seven Years a Citizen of the United States, and who │ │
│ │ │ shall not, when elected, be an Inhabitant of that State in which he shall be │ │
│ │ │ chosen.Representatives and direct Taxes shall be apportioned among the several States which │ │
│ │ │ may be included within this Union, according to their respective Numbers, which shall be │ │
│ │ │ determined by adding to the whole Number of free Persons, including those bound to Service │ │
│ │ │ for a Term of Years, and excluding Indians not taxed, three fifths of all other Persons. The │ │
│ │ │ actual Enumeration shall be made within three Years after the first Meeting of the Congress │ │
│ │ │ of the United States, and within every subsequent Term of ten Years, in such Manner as they │ │
│ │ │ shall by Law direct. The Number of Representatives shall not exceed one for every thirty │ │
│ │ │ Thousand, but each State shall have at Least one Representative; and until such enumeration │ │
│ │ │ shall be made, the State of New Hampshire shall be entitled to chuse three, Massachusetts │ │
│ │ │ eight, Rhode-Island and Providence Plantations one, Connecticut five, New-York six, New │ │
│ │ │ Jersey four, Pennsylvania eight, Delaware one, Maryland six, Virginia ten, North Carolina │ │
│ │ │ five, South Carolina five, and Georgia three.When vacancies happen in the Representation │ │
│ │ │ from any State, the Executive Authority thereof shall issue Writs of Election to fill such │ │
│ │ │ Vacancies.The House of Representatives shall chuse their Speaker and other Officers; and │ │
│ │ │ shall have the sole Power of Impeachment.' 0.6 all-MiniLM-L6-v2\" name=\"summary\" │ │
│ │ │ required=\"true\"></string> │ │
│ │ │ </output> │ │
│ │ │ │ │
│ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in │ │
│ │ │ JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │
│ │ │ any types and format requests e.g. requests for lists, objects and specific types. Be │ │
│ │ │ correct and concise. If you are unsure anywhere, enter `null`. │ │
│ │ │ │ │
│ │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior: │ │
│ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │ │
│ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', │ │
│ │ │ 'STRING TWO', etc.]}` │ │
│ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer │ │
│ │ │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': │ │
│ │ │ 1}}` │ │
│ │ │ │ │
│ │ │ │ │
│ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ {\"summary\": \"The document vests all legislative power in Congress, consisting of a Senate and House. │
│ The House is elected every two years by the people of the states, with members required to be at least │
│ 25 years old, seven years a citizen, and a resident of the state of election. Representation and direct │
│ taxation are apportioned by population, counting free persons and including three fifths of enslaved │
│ persons; a census is to be taken within three years after the first meeting and every ten years │
│ thereafter. The number of Representatives shall not exceed one per thirty thousand, but each state must │
│ have at least one. An initial allocation to certain states is provided until enumeration is done. │
│ Vacancies are filled by writs of election. The House chooses its Speaker and officers and has the sole │
│ power of impeachment; the Electors in each state must meet qualifications for electors of the most │
│ numerous branch of the state legislature.\"} │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ { │
│ 'summary': 'The document vests all legislative power in Congress, consisting of a Senate and House. │
│ The House is elected every two years by the people of the states, with members required to be at least │
│ 25 years old, seven years a citizen, and a resident of the state of election. Representation and direct │
│ taxation are apportioned by population, counting free persons and including three fifths of enslaved │
│ persons; a census is to be taken within three years after the first meeting and every ten years │
│ thereafter. The number of Representatives shall not exceed one per thirty thousand, but each state must │
│ have at least one. An initial allocation to certain states is provided until enumeration is done. │
│ Vacancies are filled by writs of election. The House chooses its Speaker and officers and has the sole │
│ power of impeachment; the Electors in each state must meet qualifications for electors of the most │
│ numerous branch of the state legislature.' │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> + +The `guard` wrapper returns the raw_llm_respose (which is a simple string), and the validated and corrected output (which is a dictionary). We can see that the output is a dictionary with the correct schema and types. + +Next, let's try using a smaller model, which is not going to be good at summarization. We can see that the output is filtered out. + + +```python +raw_llm_response, validated_response, *rest = guard( + messages=[{"role": "user", "content": prompt}], + prompt_params={"document": open("data/article1.txt", "r").read()}, + model="babbage-002", + max_tokens=512, + temperature=0, +) + +print(f"Validated Output: {validated_response}") +``` + +Validated Output: None
"}} /> + +We can see the step-wise history of the `Guard` object below: + + +```python +print(guard.history.last.tree) +``` + +Logs
├── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
│ │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ │ │ ┃ Role Content ┃ │
│ │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ │ │ user │ │ │
│ │ │ │ │ Summarize the following document: │ │
│ │ │ │ │ │ │
│ │ │ │ │ Section. 1. │ │
│ │ │ │ │ All legislative Powers herein granted shall be vested in a Congress of the United States, │ │
│ │ │ │ │ which shall consist of a Senate and House of Representatives. │ │
│ │ │ │ │ │ │
│ │ │ │ │ Section. 2. │ │
│ │ │ │ │ The House of Representatives shall be composed of Members chosen every second Year by the │ │
│ │ │ │ │ People of the several States, and the Electors in each State shall have the Qualifications │ │
│ │ │ │ │ requisite for Electors of the most numerous Branch of the State Legislature. │ │
│ │ │ │ │ │ │
│ │ │ │ │ No Person shall be a Representative who shall not have attained to the Age of twenty five │ │
│ │ │ │ │ Years, and been seven Years a Citizen of the United States, and who shall not, when elected, │ │
│ │ │ │ │ be an Inhabitant of that State in which he shall be chosen. │ │
│ │ │ │ │ │ │
│ │ │ │ │ Representatives and direct Taxes shall be apportioned among the several States which may be │ │
│ │ │ │ │ included within this Union, according to their respective Numbers, which shall be determined │ │
│ │ │ │ │ by adding to the whole Number of free Persons, including those bound to Service for a Term │ │
│ │ │ │ │ of Years, and excluding Indians not taxed, three fifths of all other Persons. The actual │ │
│ │ │ │ │ Enumeration shall be made within three Years after the first Meeting of the Congress of the │ │
│ │ │ │ │ United States, and within every subsequent Term of ten Years, in such Manner as they shall │ │
│ │ │ │ │ by Law direct. The Number of Representatives shall not exceed one for every thirty Thousand, │ │
│ │ │ │ │ but each State shall have at Least one Representative; and until such enumeration shall be │ │
│ │ │ │ │ made, the State of New Hampshire shall be entitled to chuse three, Massachusetts eight, │ │
│ │ │ │ │ Rhode-Island and Providence Plantations one, Connecticut five, New-York six, New Jersey │ │
│ │ │ │ │ four, Pennsylvania eight, Delaware one, Maryland six, Virginia ten, North Carolina five, │ │
│ │ │ │ │ South Carolina five, and Georgia three. │ │
│ │ │ │ │ │ │
│ │ │ │ │ When vacancies happen in the Representation from any State, the Executive Authority thereof │ │
│ │ │ │ │ shall issue Writs of Election to fill such Vacancies. │ │
│ │ │ │ │ │ │
│ │ │ │ │ The House of Representatives shall chuse their Speaker and other Officers; and shall have │ │
│ │ │ │ │ the sole Power of Impeachment. │ │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
│ │ │ │ │ Given below is XML that describes the information to extract from this document and the tags │ │
│ │ │ │ │ to extract it into. │ │
│ │ │ │ │ │ │
│ │ │ │ │ <output> │ │
│ │ │ │ │ <string description=\"Summarize the given document faithfully.\" │ │
│ │ │ │ │ format=\"guardrails/similar_to_document: 'Section. 1.All legislative Powers herein granted │ │
│ │ │ │ │ shall be vested in a Congress of the United States, which shall consist of a Senate and │ │
│ │ │ │ │ House of Representatives.Section. 2.The House of Representatives shall be composed of │ │
│ │ │ │ │ Members chosen every second Year by the People of the several States, and the Electors in │ │
│ │ │ │ │ each State shall have the Qualifications requisite for Electors of the most numerous Branch │ │
│ │ │ │ │ of the State Legislature.No Person shall be a Representative who shall not have attained to │ │
│ │ │ │ │ the Age of twenty five Years, and been seven Years a Citizen of the United States, and who │ │
│ │ │ │ │ shall not, when elected, be an Inhabitant of that State in which he shall be │ │
│ │ │ │ │ chosen.Representatives and direct Taxes shall be apportioned among the several States which │ │
│ │ │ │ │ may be included within this Union, according to their respective Numbers, which shall be │ │
│ │ │ │ │ determined by adding to the whole Number of free Persons, including those bound to Service │ │
│ │ │ │ │ for a Term of Years, and excluding Indians not taxed, three fifths of all other Persons. The │ │
│ │ │ │ │ actual Enumeration shall be made within three Years after the first Meeting of the Congress │ │
│ │ │ │ │ of the United States, and within every subsequent Term of ten Years, in such Manner as they │ │
│ │ │ │ │ shall by Law direct. The Number of Representatives shall not exceed one for every thirty │ │
│ │ │ │ │ Thousand, but each State shall have at Least one Representative; and until such enumeration │ │
│ │ │ │ │ shall be made, the State of New Hampshire shall be entitled to chuse three, Massachusetts │ │
│ │ │ │ │ eight, Rhode-Island and Providence Plantations one, Connecticut five, New-York six, New │ │
│ │ │ │ │ Jersey four, Pennsylvania eight, Delaware one, Maryland six, Virginia ten, North Carolina │ │
│ │ │ │ │ five, South Carolina five, and Georgia three.When vacancies happen in the Representation │ │
│ │ │ │ │ from any State, the Executive Authority thereof shall issue Writs of Election to fill such │ │
│ │ │ │ │ Vacancies.The House of Representatives shall chuse their Speaker and other Officers; and │ │
│ │ │ │ │ shall have the sole Power of Impeachment.' 0.6 all-MiniLM-L6-v2\" name=\"summary\" │ │
│ │ │ │ │ required=\"true\"></string> │ │
│ │ │ │ │ </output> │ │
│ │ │ │ │ │ │
│ │ │ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in │ │
│ │ │ │ │ JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │
│ │ │ │ │ any types and format requests e.g. requests for lists, objects and specific types. Be │ │
│ │ │ │ │ correct and concise. If you are unsure anywhere, enter `null`. │ │
│ │ │ │ │ │ │
│ │ │ │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior: │ │
│ │ │ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │ │
│ │ │ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', │ │
│ │ │ │ │ 'STRING TWO', etc.]}` │ │
│ │ │ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer │ │
│ │ │ │ │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': │ │
│ │ │ │ │ 1}}` │ │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
│ │ │ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │
│ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
│ │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ │ │ If you are unsure about anything, please ask. │
│ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
│ │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ │ │ None │
│ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
│ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
└── ╭────────────────────────────────────────────────── Step 1 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ ┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ ┃ Role Content ┃ │
│ ┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ system │ │ │
│ │ │ You are a helpful assistant only capable of communicating with valid JSON, and no other │ │
│ │ │ text. │ │
│ │ │ │ │
│ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field │ │
│ │ │ in JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, │ │
│ │ │ including any types and format requests e.g. requests for lists, objects and specific │ │
│ │ │ types. Be correct and concise. If you are unsure anywhere, enter `null`. │ │
│ │ │ │ │
│ │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior: │ │
│ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │ │
│ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', │ │
│ │ │ 'STRING TWO', etc.]}` │ │
│ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer │ │
│ │ │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': │ │
│ │ │ 1}}` │ │
│ │ │ │ │
│ ├────────┼────────────────────────────────────────────────────────────────────────────────────────────┤ │
│ │ user │ │ │
│ │ │ I was given the following response, which was not parseable as JSON. │ │
│ │ │ │ │
│ │ │ \"If you are unsure about anything, please ask.\" │ │
│ │ │ │ │
│ │ │ Help me correct this by making it valid JSON. │ │
│ │ │ │ │
│ │ │ Given below is XML that describes the information to extract from this document and the │ │
│ │ │ tags to extract it into. │ │
│ │ │ │ │
│ │ │ <output> │ │
│ │ │ <string description=\"Summarize the given document faithfully.\" │ │
│ │ │ format=\"guardrails/similar_to_document: 'Section. 1.All legislative Powers herein granted │ │
│ │ │ shall be vested in a Congress of the United States, which shall consist of a Senate and │ │
│ │ │ House of Representatives.Section. 2.The House of Representatives shall be composed of │ │
│ │ │ Members chosen every second Year by the People of the several States, and the Electors in │ │
│ │ │ each State shall have the Qualifications requisite for Electors of the most numerous │ │
│ │ │ Branch of the State Legislature.No Person shall be a Representative who shall not have │ │
│ │ │ attained to the Age of twenty five Years, and been seven Years a Citizen of the United │ │
│ │ │ States, and who shall not, when elected, be an Inhabitant of that State in which he shall │ │
│ │ │ be chosen.Representatives and direct Taxes shall be apportioned among the several States │ │
│ │ │ which may be included within this Union, according to their respective Numbers, which │ │
│ │ │ shall be determined by adding to the whole Number of free Persons, including those bound │ │
│ │ │ to Service for a Term of Years, and excluding Indians not taxed, three fifths of all other │ │
│ │ │ Persons. The actual Enumeration shall be made within three Years after the first Meeting │ │
│ │ │ of the Congress of the United States, and within every subsequent Term of ten Years, in │ │
│ │ │ such Manner as they shall by Law direct. The Number of Representatives shall not exceed │ │
│ │ │ one for every thirty Thousand, but each State shall have at Least one Representative; and │ │
│ │ │ until such enumeration shall be made, the State of New Hampshire shall be entitled to │ │
│ │ │ chuse three, Massachusetts eight, Rhode-Island and Providence Plantations one, Connecticut │ │
│ │ │ five, New-York six, New Jersey four, Pennsylvania eight, Delaware one, Maryland six, │ │
│ │ │ Virginia ten, North Carolina five, South Carolina five, and Georgia three.When vacancies │ │
│ │ │ happen in the Representation from any State, the Executive Authority thereof shall issue │ │
│ │ │ Writs of Election to fill such Vacancies.The House of Representatives shall chuse their │ │
│ │ │ Speaker and other Officers; and shall have the sole Power of Impeachment.' 0.6 │ │
│ │ │ all-MiniLM-L6-v2\" name=\"summary\" required=\"true\"></string> │ │
│ │ │ </output> │ │
│ │ │ │ │
│ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field │ │
│ │ │ in JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, │ │
│ │ │ including any types and format requests e.g. requests for lists, objects and specific │ │
│ │ │ types. Be correct and concise. If you are unsure anywhere, enter `null`. │ │
│ │ │ │ │
│ └────────┴────────────────────────────────────────────────────────────────────────────────────────────┘ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │
│ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}` │
│ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │
│ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}` │
│ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │
│ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}` │
│ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │
│ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}` │
│ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │
│ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}` │
│ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │
│ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}` │
│ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │
│ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}` │
│ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │
│ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}` │
│ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │
│ format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}` │
│ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" │
│ format=\"1-indexed\" /></object>` => │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ None │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> diff --git a/docs/examples/toxic_language.ipynb b/docs/dist/examples/toxic_language.ipynb similarity index 97% rename from docs/examples/toxic_language.ipynb rename to docs/dist/examples/toxic_language.ipynb index e3261cd94..1cb58e442 100644 --- a/docs/examples/toxic_language.ipynb +++ b/docs/dist/examples/toxic_language.ipynb @@ -64,9 +64,7 @@ "# Here, we'll use the default validation method of \"sentence\"\n", "# and the default threshold of 0.25\n", "\n", - "guard = gd.Guard().use(\n", - " ToxicLanguage(on_fail=\"fix\")\n", - ")" + "guard = gd.Guard().use(ToxicLanguage(on_fail=\"fix\"))" ] }, { @@ -183,9 +181,7 @@ "outputs": [], "source": [ "# Test with validation method 'full'\n", - "full_guard = gd.Guard().use(\n", - " ToxicLanguage(validation_method=\"full\", on_fail=\"fix\")\n", - ")" + "full_guard = gd.Guard().use(ToxicLanguage(validation_method=\"full\", on_fail=\"fix\"))" ] }, { diff --git a/docs/dist/examples/toxic_language.md b/docs/dist/examples/toxic_language.md new file mode 100644 index 000000000..c992d7a16 --- /dev/null +++ b/docs/dist/examples/toxic_language.md @@ -0,0 +1,116 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +```bash +guardrails hub install hub://guardrails/toxic_language --quiet +``` + + + +``` + Installing hub://guardrails/toxic_language... + ✅Successfully installed guardrails/toxic_language! + + +``` + + + + + +## Check whether an LLM-generated response contains toxic language + +### Using the `ToxicLanguage` validator + +This is a simple walkthrough of the `ToxicLanguage` validator. This validator checks whether an LLM-generated response contains toxic language. It uses the pre-trained multi-label model from HuggingFace -`unitary/unbiased-toxic-roberta` to check whether the generated text is toxic. It supports both full-text-level and sentence-level validation. + + +```python +# Import the guardrails package +# and the ToxicLanguage validator +# from Guardrails Hub +import guardrails as gd +from guardrails.hub import ToxicLanguage +from rich import print +``` + + + +``` + /Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console) + from tqdm.autonotebook import tqdm, trange +``` + + + + +```python +# Create a Guard object with this validator +# Here, we'll use the default validation method of "sentence" +# and the default threshold of 0.25 + +guard = gd.Guard().use(ToxicLanguage(on_fail="fix")) +``` + + +```python +# Parse the raw response +raw_response = """ +What a lovely day it has been to roam around the city. I love it here! +I hate how pathetic and needy you can be sometimes. +""" +raw_llm_output, validated_output, *rest = guard.parse( + llm_output=raw_response, +) + +# Print the output +print(validated_output) +``` + + warnings.warn(





What a lovely day it has been to roam around the city.
I love it here!
"}} /> + +As you can see here, the sentence `I hate how pathetic and needy you can be sometimes.` has been detected as toxic, and hence removed from the validated output. + + + +```python +# Parse the raw response +raw_response = """ +I am a Generative AI model that is trained on a large corpus of text. +I am shocked by how disgusting and vile you are. +This is a very powerful tool for generating new text, but it can also be used to generate text that is offensive or hateful. +""" +raw_llm_output, validated_output, *rest = guard.parse( + llm_output=raw_response, +) + +# Print the output +print(validated_output) +``` + + warnings.warn(





I am a Generative AI model that is trained on a large corpus of text.
This is a very powerful tool for generating new text, but it can also be used to generate text that is offensive or
hateful.
"}} /> + +Similarly, here the sentence `I am shocked by how disgusting and vile you are.` has been detected as toxic, and hence removed from the validated output. + + + +```python +# Test with validation method 'full' +full_guard = gd.Guard().use(ToxicLanguage(validation_method="full", on_fail="fix")) +``` + + +```python +# Parse the raw response +raw_response = "Stop being such a dumb piece of shit. Why can't you comprehend this?" +raw_llm_output, validated_output, *rest = full_guard.parse( + llm_output=raw_response, +) + +# Print the output +print(validated_output) +``` + + warnings.warn(




Why can't you comprehend this?
"}} /> + +Here, we're doing validation on the entire text, and toxic language was detected here - hence, the nothing is returned here. + diff --git a/docs/examples/translation_to_specific_language.ipynb b/docs/dist/examples/translation_to_specific_language.ipynb similarity index 99% rename from docs/examples/translation_to_specific_language.ipynb rename to docs/dist/examples/translation_to_specific_language.ipynb index 63d3c467d..0bb7033e4 100644 --- a/docs/examples/translation_to_specific_language.ipynb +++ b/docs/dist/examples/translation_to_specific_language.ipynb @@ -73,7 +73,6 @@ "from guardrails.validators import (\n", " Validator,\n", " register_validator,\n", - " ValidationResult,\n", " PassResult,\n", " FailResult,\n", ")\n", @@ -287,7 +286,7 @@ "# os.environ[\"OPENAI_API_KEY\"] = \"YOUR_API_KEY\"\n", "\n", "raw_llm_response, validated_response, *rest = guard(\n", - " messages=[{\"role\":\"user\", \"content\": prompt}],\n", + " messages=[{\"role\": \"user\", \"content\": prompt}],\n", " prompt_params={\"statement_to_be_translated\": \"quesadilla de pollo\"},\n", " model=\"gpt-4o\",\n", " max_tokens=2048,\n", @@ -542,7 +541,7 @@ "# os.environ[\"MISTRAL_API_KEY\"] = \"YOUR_API_KEY\"\n", "\n", "raw_llm_response, validated_response, *rest = guard(\n", - " messages=[{\"role\":\"user\", \"content\": prompt}],\n", + " messages=[{\"role\": \"user\", \"content\": prompt}],\n", " prompt_params={\"statement_to_be_translated\": \"убей себя\"},\n", " model=\"mistral/mistral-small-latest\",\n", " max_tokens=2048,\n", diff --git a/docs/dist/examples/translation_to_specific_language.md b/docs/dist/examples/translation_to_specific_language.md new file mode 100644 index 000000000..0eea1cec5 --- /dev/null +++ b/docs/dist/examples/translation_to_specific_language.md @@ -0,0 +1,227 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +# Translate text without profanities + +!!! note + To download this example as a Jupyter notebook, click [here](https://github.com/ShreyaR/guardrails/blob/main/docs/examples/translation_to_specific_language.ipynb). + +In this example, we will use Guardrails during the translation of a statement from another language to english. We will check whether the translated statement passes the profanity check or not. + +## Objective + +We want to translate a statement from another languages to English and ensure the translated statement is profanity free. + +## Step 0: Setup + +In order to run this example, you will need to install `alt-profanity-check` package. You can do so by running the following commands: + + + + +```bash +pip install alt-profanity-check --quiet +``` + +## Step 1: Create the RAIL Spec + +Ordinarily, we would create an RAIL spec in a separate file. For the purposes of this example, we will create the spec in this notebook as a string following the RAIL syntax. For more information on RAIL, see the [RAIL documentation](/docs/how_to_guides/rail). We will also show the same RAIL spec in a code-first format using a Pydantic model. + +In this RAIL spec, we: + +1. Create an `output` schema that returns a single key-value pair. The key should be 'translated_statement', and the value should be the English translation of the given statement. The translated statement should not have any profanity. + +First we create our custom Validator: + + +```python +from profanity_check import predict +from guardrails.validators import ( + Validator, + register_validator, + PassResult, + FailResult, +) + + +from typing import Dict, Any + + +@register_validator(name="is-profanity-free", data_type="string") +class IsProfanityFree(Validator): + def validate(self, value: Any, metadata: Dict) -> Dict: + prediction = predict([value]) + if prediction[0] == 1: + return FailResult( + error_message=f"Value {value} contains profanity language", + fix_value="", + ) + return PassResult() +``` + + + +``` + /Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console) + from tqdm.autonotebook import tqdm, trange +``` + + + +Next we define our RAIL spec either as XML: + + +```python +rail_str = """ + + + + + + + + +Translate the given statement into english language: + +${statement_to_be_translated} + +${gr.complete_xml_suffix} + + + +""" +``` + +Or as a Pydantic model: + + +```python +from pydantic import BaseModel, Field + +prompt = """ +Translate the given statement into english language: + +${statement_to_be_translated} + +${gr.complete_xml_suffix} +""" + + +class Translation(BaseModel): + translated_statement: str = Field( + description="Translate the given statement into english language", + validators=[IsProfanityFree(on_fail="fix")], + ) +``` + +!!! note + + In order to ensure the translated statement is profanity free, we use `is-profanity-free` as the validator. This validator uses `profanity_check` package. + +## Step 2: Create a `Guard` object with the RAIL Spec + +We create a `gd.Guard` object that will check, validate and correct the output of the LLM. This object: + +1. Enforces the quality criteria specified in the RAIL spec. +2. Takes corrective action when the quality criteria are not met. +3. Compiles the schema and type info from the RAIL spec and adds it to the prompt. + + +```python +import guardrails as gd + +from rich import print +``` + +From XML: + + +```python +guard = gd.Guard.for_rail_string(rail_str) +``` + +Or from our Pydantic model: + + +```python +guard = gd.Guard.for_pydantic(output_class=Translation) +``` + +Here, `statement_to_be_translated` is the the statement and will be provided by the user at runtime. + +## Step 3: Wrap the LLM API call with `Guard` + +First, let's try translating a statement that doesn't have any profanity in it. + + +```python +# Set your OPENAI_API_KEY as an environment variable +# import os +# os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY" + +raw_llm_response, validated_response, *rest = guard( + messages=[{"role": "user", "content": prompt}], + prompt_params={"statement_to_be_translated": "quesadilla de pollo"}, + model="gpt-4o", + max_tokens=2048, + temperature=0, +) + +print(f"Validated Output: {validated_response}") +``` + + warnings.warn(




Validated Output: {'translated_statement': 'chicken quesadilla'}
"}} /> + +We can see the prompt that was sent to the LLM: + + +```python +print(guard.history.last.iterations.last.inputs.messages[0]["content"]) +``` + +
Translate the given statement into english language:

quesadilla de pollo


Given below is XML that describes the information to extract from this document and the tags to extract it into.

<output>
<string description=\"Translate the given statement into english language\" format=\"is-profanity-free\"
name=\"translated_statement\" required=\"true\"></string>
</output>

ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the `name`
attribute of the corresponding XML, and the value is of the type specified by the corresponding XML's tag. The JSON
MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and
specific types. Be correct and concise. If you are unsure anywhere, enter `null`.

Here are examples of simple (XML, JSON) pairs that show the expected behavior:
- `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`
- `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', 'STRING TWO', etc.]}`
- `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" format=\"1-indexed\"
/></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`


"}} /> + +We can also take a look at the output of the LLM and the validated output using the Guard's internal logs: + + +```python +print(guard.history.last.tree) +``` + +Logs
└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ ┃ Role Content ┃ │
│ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ user │ │ │
│ │ │ Translate the given statement into english language: │ │
│ │ │ │ │
│ │ │ quesadilla de pollo │ │
│ │ │ │ │
│ │ │ │ │
│ │ │ Given below is XML that describes the information to extract from this document and the tags │ │
│ │ │ to extract it into. │ │
│ │ │ │ │
│ │ │ <output> │ │
│ │ │ <string description=\"Translate the given statement into english language\" │ │
│ │ │ format=\"is-profanity-free\" name=\"translated_statement\" required=\"true\"></string> │ │
│ │ │ </output> │ │
│ │ │ │ │
│ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in │ │
│ │ │ JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │
│ │ │ any types and format requests e.g. requests for lists, objects and specific types. Be │ │
│ │ │ correct and concise. If you are unsure anywhere, enter `null`. │ │
│ │ │ │ │
│ │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior: │ │
│ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │ │
│ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', │ │
│ │ │ 'STRING TWO', etc.]}` │ │
│ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer │ │
│ │ │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': │ │
│ │ │ 1}}` │ │
│ │ │ │ │
│ │ │ │ │
│ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ ```json │
│ {\"translated_statement\": \"chicken quesadilla\"} │
│ ``` │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ {'translated_statement': 'chicken quesadilla'} │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> + +The `guard` wrapper returns the raw_llm_respose (which is a simple string), and the validated and corrected output (which is a dictionary). We can see that the output is a dictionary with the correct schema and types. + +Next, let's try translating a statement that has profanity in it. We see that the translated statement has been corrected to return an empty string instead of the translated statement. + + +```python +# Set your MISTRAL_API_KEY as an environment variable +# import os +# os.environ["MISTRAL_API_KEY"] = "YOUR_API_KEY" + +raw_llm_response, validated_response, *rest = guard( + messages=[{"role": "user", "content": prompt}], + prompt_params={"statement_to_be_translated": "убей себя"}, + model="mistral/mistral-small-latest", + max_tokens=2048, + temperature=0, +) + +print(f"Validated Output: {validated_response}") +``` + + warnings.warn(




Validated Output: {'translated_statement': ''}
"}} /> + +This time around, when we look at the logs, we can see that the output of the LLM was filtered out because it did not pass the profanity check. + + +```python +print(guard.history.last.tree) +``` + +Logs
└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ ┃ Role Content ┃ │
│ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ user │ │ │
│ │ │ Translate the given statement into english language: │ │
│ │ │ │ │
│ │ │ убей себя │ │
│ │ │ │ │
│ │ │ │ │
│ │ │ Given below is XML that describes the information to extract from this document and the tags │ │
│ │ │ to extract it into. │ │
│ │ │ │ │
│ │ │ <output> │ │
│ │ │ <string description=\"Translate the given statement into english language\" │ │
│ │ │ format=\"is-profanity-free\" name=\"translated_statement\" required=\"true\"></string> │ │
│ │ │ </output> │ │
│ │ │ │ │
│ │ │ ONLY return a valid JSON object (no other text is necessary), where the key of the field in │ │
│ │ │ JSON is the `name` attribute of the corresponding XML, and the value is of the type │ │
│ │ │ specified by the corresponding XML's tag. The JSON MUST conform to the XML format, including │ │
│ │ │ any types and format requests e.g. requests for lists, objects and specific types. Be │ │
│ │ │ correct and concise. If you are unsure anywhere, enter `null`. │ │
│ │ │ │ │
│ │ │ Here are examples of simple (XML, JSON) pairs that show the expected behavior: │ │
│ │ │ - `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}` │ │
│ │ │ - `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', │ │
│ │ │ 'STRING TWO', etc.]}` │ │
│ │ │ - `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer │ │
│ │ │ name=\"index\" format=\"1-indexed\" /></object>` => `{'baz': {'foo': 'Some String', 'index': │ │
│ │ │ 1}}` │ │
│ │ │ │ │
│ │ │ │ │
│ └──────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ ```json │
│ { │
│ \"translated_statement\": \"kill yourself\" │
│ } │
│ ``` │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ {'translated_statement': ''} │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> diff --git a/docs/examples/translation_with_quality_check.ipynb b/docs/dist/examples/translation_with_quality_check.ipynb similarity index 76% rename from docs/examples/translation_with_quality_check.ipynb rename to docs/dist/examples/translation_with_quality_check.ipynb index 45bc0f74a..9d386ed72 100644 --- a/docs/examples/translation_with_quality_check.ipynb +++ b/docs/dist/examples/translation_with_quality_check.ipynb @@ -9,32 +9,30 @@ "name": "stdout", "output_type": "stream", "text": [ + "/Users/calebcourier/Projects/guardrails/docs/.venv/lib/python3.12/site-packages/torchmetrics/utilities/imports.py:23: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.\n", + " from pkg_resources import DistributionNotFound, get_distribution\n", "Installing hub:\u001b[35m/\u001b[0m\u001b[35m/brainlogic/\u001b[0m\u001b[95mhigh_quality_translation...\u001b[0m\n", - "\u001b[2K\u001b[32m[ ===]\u001b[0m Fetching manifestst\n", - "\u001b[2K\u001b[32m[= ]\u001b[0m Downloading dependenciespendencies Running command git clone --filter=blob:none --quiet https://github.com/BrainLogicHub/high_quality_translation_validator.git /private/var/folders/yt/ltz0vbpx14j34mj55jyj39x40000gn/T/pip-req-build-hja54mr_\n", - "\u001b[2K\u001b[32m[ =]\u001b[0m Downloading dependencies\u001b[33mWARNING: typer 0.12.5 does not provide the extra 'all'\u001b[0m\u001b[33m\n", - "\u001b[2K\u001b[32m[=== ]\u001b[0m Downloading dependencies\n", - "Fetching 5 files: 100%|████████████████████████| 5/5 [00:00<00:00, 45590.26it/s]\n", - "\u001b[2K\u001b[32m[ ===]\u001b[0m Running post-install setupLightning automatically upgraded your loaded checkpoint from v1.8.2 to v2.4.0. To apply the upgrade to your files permanently, run `python -m pytorch_lightning.utilities.upgrade_checkpoint ../../../../.cache/huggingface/hub/models--Unbabel--wmt22-cometkiwi-da/snapshots/b3a8aea5a5fc22db68a554b92b3d96eb6ea75cc9/checkpoints/model.ckpt`\n", - "\u001b[2K\u001b[32m[= ]\u001b[0m Running post-install setup/Users/dtam/.pyenv/versions/3.11.3/envs/311lite/lib/python3.11/site-packages/transformers/tokenization_utils_base.py:1617: FutureWarning: `clean_up_tokenization_spaces` was not set. It will be set to `True` by default. This behavior will be deprecated in transformers v4.45, and will be then set to `False` by default. For more details check this issue: https://github.com/huggingface/transformers/issues/31884\n", - " warnings.warn(\n", - "\u001b[2K\u001b[32m[=== ]\u001b[0m Running post-install setupEncoder model frozen.\n", - "\u001b[2K\u001b[32m[ ===]\u001b[0m Running post-install setup/Users/dtam/.pyenv/versions/3.11.3/envs/311lite/lib/python3.11/site-packages/pytorch_lightning/core/saving.py:195: Found keys that are not in the model state dict but in the checkpoint: ['encoder.model.embeddings.position_ids']\n", - "\u001b[2K\u001b[32m[=== ]\u001b[0m Running post-install setup\n", - "\u001b[1A\u001b[2K✅Successfully installed brainlogic/high_quality_translation!\n", - "\n", - "\n", - "\u001b[1mImport validator:\u001b[0m\n", - "from guardrails.hub import HighQualityTranslation\n", + "/Users/calebcourier/Projects/guardrails/docs/.venv/lib/python3.12/site-packages/torchmetrics/utilities/imports.py:23: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.\n", + " from pkg_resources import DistributionNotFound, get_distribution\n", + "/Users/calebcourier/Projects/guardrails/docs/.venv/lib/python3.12/site-packages/transformers/utils/generic.py:441: FutureWarning: `torch.utils._pytree._register_pytree_node` is deprecated. Please use `torch.utils._pytree.register_pytree_node` instead.\n", + " _torch_pytree._register_pytree_node(\n", + "/Users/calebcourier/Projects/guardrails/docs/.venv/lib/python3.12/site-packages/transformers/utils/generic.py:309: FutureWarning: `torch.utils._pytree._register_pytree_node` is deprecated. Please use `torch.utils._pytree.register_pytree_node` instead.\n", + " _torch_pytree._register_pytree_node(\n", + "/Users/calebcourier/Projects/guardrails/docs/.venv/lib/python3.12/site-packages/transformers/utils/generic.py:309: FutureWarning: `torch.utils._pytree._register_pytree_node` is deprecated. Please use `torch.utils._pytree.register_pytree_node` instead.\n", + " _torch_pytree._register_pytree_node(\n", + "Fetching 5 files: 100%|████████████████████████| 5/5 [00:00<00:00, 42711.85it/s]\n", + "Lightning automatically upgraded your loaded checkpoint from v1.8.2 to v2.5.5. To apply the upgrade to your files permanently, run `python -m pytorch_lightning.utilities.upgrade_checkpoint ../../../../../.cache/huggingface/hub/models--Unbabel--wmt22-cometkiwi-da/snapshots/1ad785194e391eebc6c53e2d0776cada8f83179a/checkpoints/model.ckpt`\n", + "Encoder model frozen.\n", + "/Users/calebcourier/Projects/guardrails/docs/.venv/lib/python3.12/site-packages/pytorch_lightning/core/saving.py:195: Found keys that are not in the model state dict but in the checkpoint: ['encoder.model.embeddings.position_ids']\n", + "Installation complete\n", + "✅Successfully installed brainlogic/high_quality_translation version \u001b[1;36m0.0\u001b[0m.\u001b[1;36m0\u001b[0m!\n", "\n", - "\u001b[1mGet more info:\u001b[0m\n", - "\u001b[4;94mhttps://hub.guardrailsai.com/validator/brainlogic/high_quality_translation\u001b[0m\n", "\n" ] } ], "source": [ - "!guardrails hub install hub://brainlogic/high_quality_translation" + "!guardrails hub install hub://brainlogic/high_quality_translation -q" ] }, { @@ -65,11 +63,19 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "! pip install git+https://github.com/Unbabel/COMET -q" + ] + }, + { + "cell_type": "code", + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ - "from pydantic import BaseModel, Field\n", "from guardrails import Guard\n", "from rich import print\n", "from guardrails.hub import HighQualityTranslation" @@ -89,7 +95,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": { "tags": [] }, @@ -104,7 +110,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "8fa13706e228473b972844df05c1cdf4", + "model_id": "59f51fc27c0847298112f07de8ffae52", "version_major": 2, "version_minor": 0 }, @@ -119,11 +125,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "Lightning automatically upgraded your loaded checkpoint from v1.8.2 to v2.4.0. To apply the upgrade to your files permanently, run `python -m pytorch_lightning.utilities.upgrade_checkpoint ../../../../.cache/huggingface/hub/models--Unbabel--wmt22-cometkiwi-da/snapshots/b3a8aea5a5fc22db68a554b92b3d96eb6ea75cc9/checkpoints/model.ckpt`\n", - "/Users/dtam/.pyenv/versions/3.11.3/envs/311lite/lib/python3.11/site-packages/transformers/tokenization_utils_base.py:1617: FutureWarning: `clean_up_tokenization_spaces` was not set. It will be set to `True` by default. This behavior will be deprecated in transformers v4.45, and will be then set to `False` by default. For more details check this issue: https://github.com/huggingface/transformers/issues/31884\n", + "Lightning automatically upgraded your loaded checkpoint from v1.8.2 to v2.5.5. To apply the upgrade to your files permanently, run `python -m pytorch_lightning.utilities.upgrade_checkpoint ../../../../../.cache/huggingface/hub/models--Unbabel--wmt22-cometkiwi-da/snapshots/1ad785194e391eebc6c53e2d0776cada8f83179a/checkpoints/model.ckpt`\n", + "/Users/calebcourier/Projects/guardrails/docs/.venv/lib/python3.12/site-packages/huggingface_hub/file_download.py:942: FutureWarning: `resume_download` is deprecated and will be removed in version 1.0.0. Downloads always resume when possible. If you want to force a new download, use `force_download=True`.\n", " warnings.warn(\n", "Encoder model frozen.\n", - "/Users/dtam/.pyenv/versions/3.11.3/envs/311lite/lib/python3.11/site-packages/pytorch_lightning/core/saving.py:195: Found keys that are not in the model state dict but in the checkpoint: ['encoder.model.embeddings.position_ids']\n" + "/Users/calebcourier/Projects/guardrails/docs/.venv/lib/python3.12/site-packages/pytorch_lightning/core/saving.py:195: Found keys that are not in the model state dict but in the checkpoint: ['encoder.model.embeddings.position_ids']\n" ] } ], @@ -134,7 +140,7 @@ "${statement_to_be_translated}\n", "\"\"\"\n", "\n", - "guard = Guard().use(HighQualityTranslation(on_fail=\"fix\"))\n" + "guard = Guard().use(HighQualityTranslation(on_fail=\"fix\"))" ] }, { @@ -154,42 +160,41 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "HTTP Request: GET https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json \"HTTP/1.1 200 OK\"\n", - "\u001b[92m10:09:59 - LiteLLM:INFO\u001b[0m: utils.py:2963 - \n", - "LiteLLM completion() model= gpt-3.5-turbo; provider = openai\n", + "\u001b[92m15:57:09 - LiteLLM:INFO\u001b[0m: utils.py:3389 - \n", + "LiteLLM completion() model= gpt-5-nano; provider = openai\n", "\n", - "LiteLLM completion() model= gpt-3.5-turbo; provider = openai\n", - "HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "\u001b[92m10:09:59 - LiteLLM:INFO\u001b[0m: utils.py:989 - Wrapper: Completed Call, calling success_handler\n", + "LiteLLM completion() model= gpt-5-nano; provider = openai\n", + "\u001b[92m15:57:15 - LiteLLM:INFO\u001b[0m: utils.py:1282 - Wrapper: Completed Call, calling success_handler\n", "Wrapper: Completed Call, calling success_handler\n", - "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", + "/Users/calebcourier/Projects/guardrails/docs/.venv/lib/python3.12/site-packages/guardrails/validator_service/__init__.py:84: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", " warnings.warn(\n", - "/Users/dtam/.pyenv/versions/3.11.3/envs/311lite/lib/python3.11/site-packages/pydantic/main.py:390: UserWarning: Pydantic serializer warnings:\n", - " Expected `PromptTokensDetails` but got `dict` with value `{'audio_tokens': None, 'cached_tokens': 0}` - serialized value may not be as expected\n", - " return self.__pydantic_serializer__.to_python(\n", + "💡 Tip: For seamless cloud uploads and versioning, try installing [litmodels](https://pypi.org/project/litmodels/) to enable LitModelCheckpoint, which syncs automatically with the Lightning model registry.\n", "GPU available: True (mps), used: False\n", "TPU available: False, using: 0 TPU cores\n", "HPU available: False, using: 0 HPUs\n", - "/Users/dtam/.pyenv/versions/3.11.3/envs/311lite/lib/python3.11/site-packages/pytorch_lightning/trainer/setup.py:177: GPU available but not used. You can set it by doing `Trainer(accelerator='gpu')`.\n", - "/Users/dtam/.pyenv/versions/3.11.3/envs/311lite/lib/python3.11/site-packages/pytorch_lightning/trainer/connectors/data_connector.py:419: Consider setting `persistent_workers=True` in 'predict_dataloader' to speed up the dataloader worker initialization.\n", - "Predicting DataLoader 0: 100%|██████████| 1/1 [00:00<00:00, 12.15it/s]\n" + "/Users/calebcourier/Projects/guardrails/docs/.venv/lib/python3.12/site-packages/pytorch_lightning/trainer/setup.py:177: GPU available but not used. You can set it by doing `Trainer(accelerator='gpu')`.\n", + "Predicting: 0it [00:00, ?it/s]huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", + "To disable this warning, you can either:\n", + "\t- Avoid using `tokenizers` before the fork if possible\n", + "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n", + "Predicting DataLoader 0: 100%|██████████| 1/1 [00:00<00:00, 15.67it/s]\n" ] }, { "data": { "text/html": [ - "
Raw LLM Output: I have no idea what I should write here.\n",
+       "
Raw LLM Output: I have no idea what I’m supposed to write here.\n",
        "
\n" ], "text/plain": [ - "Raw LLM Output: I have no idea what I should write here.\n" + "Raw LLM Output: I have no idea what I’m supposed to write here.\n" ] }, "metadata": {}, @@ -198,11 +203,11 @@ { "data": { "text/html": [ - "
Validated Output: I have no idea what I should write here.\n",
+       "
Validated Output: I have no idea what I’m supposed to write here.\n",
        "
\n" ], "text/plain": [ - "Validated Output: I have no idea what I should write here.\n" + "Validated Output: I have no idea what I’m supposed to write here.\n" ] }, "metadata": {}, @@ -217,12 +222,12 @@ "statement = \"Ich habe keine Ahnung, was ich hier schreiben soll.\"\n", "\n", "res = guard(\n", - " messages=[{\"role\":\"user\", \"content\": prompt}],\n", + " messages=[{\"role\": \"user\", \"content\": prompt}],\n", " prompt_params={\"statement_to_be_translated\": statement},\n", " metadata={\"translation_source\": statement},\n", - " model=\"gpt-3.5-turbo\",\n", + " model=\"gpt-5-nano\",\n", " max_tokens=1024,\n", - " temperature=0,\n", + " temperature=1,\n", ")\n", "\n", "print(f\"Raw LLM Output: {res.raw_llm_output}\")\n", @@ -239,7 +244,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -247,7 +252,7 @@ "text/html": [ "
Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
        "    │ │ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓                                          │ │\n",
        "    │ │ ┃ Role  Content                                             ┃                                          │ │\n",
        "    │ │ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩                                          │ │\n",
@@ -258,11 +263,11 @@
        "    │ │ │      │                                                     │                                          │ │\n",
        "    │ │ └──────┴─────────────────────────────────────────────────────┘                                          │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
-       "    │ │ I have no idea what I should write here.                                                                │ │\n",
+       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
+       "    │ │ I have no idea what I’m supposed to write here.                                                         │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
-       "    │ │ I have no idea what I should write here.                                                                │ │\n",
+       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
+       "    │ │ I have no idea what I’m supposed to write here.                                                         │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
        "
\n" @@ -270,7 +275,7 @@ "text/plain": [ "Logs\n", "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n", - " │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m Messages \u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n", + " │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n", " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mRole\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[1;48;2;231;223;235mContent \u001b[0m\u001b[1;48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┃\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", @@ -281,11 +286,11 @@ " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", " │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m└──────┴─────────────────────────────────────────────────────┘\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n", " │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m Raw LLM Output \u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n", - " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mI have no idea what I should write here.\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n", + " │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mI have no idea what I’m supposed to write here.\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n", " │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m Validated Output \u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n", - " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mI have no idea what I should write here.\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n", + " │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240mI have no idea what I’m supposed to write here.\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n", " │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n", " ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n" ] @@ -310,21 +315,21 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", + "/Users/calebcourier/Projects/guardrails/docs/.venv/lib/python3.12/site-packages/guardrails/validator_service/__init__.py:84: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.\n", " warnings.warn(\n", + "💡 Tip: For seamless cloud uploads and versioning, try installing [litmodels](https://pypi.org/project/litmodels/) to enable LitModelCheckpoint, which syncs automatically with the Lightning model registry.\n", "GPU available: True (mps), used: False\n", "TPU available: False, using: 0 TPU cores\n", "HPU available: False, using: 0 HPUs\n", - "/Users/dtam/.pyenv/versions/3.11.3/envs/311lite/lib/python3.11/site-packages/pytorch_lightning/trainer/setup.py:177: GPU available but not used. You can set it by doing `Trainer(accelerator='gpu')`.\n", - "/Users/dtam/.pyenv/versions/3.11.3/envs/311lite/lib/python3.11/site-packages/pytorch_lightning/trainer/connectors/data_connector.py:419: Consider setting `persistent_workers=True` in 'predict_dataloader' to speed up the dataloader worker initialization.\n", - "Predicting DataLoader 0: 100%|██████████| 1/1 [00:00<00:00, 15.53it/s]\n" + "/Users/calebcourier/Projects/guardrails/docs/.venv/lib/python3.12/site-packages/pytorch_lightning/trainer/setup.py:177: GPU available but not used. You can set it by doing `Trainer(accelerator='gpu')`.\n", + "Predicting DataLoader 0: 100%|██████████| 1/1 [00:00<00:00, 12.05it/s]\n" ] }, { @@ -373,7 +378,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -381,13 +386,13 @@ "text/html": [ "
Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
+       "    │ ╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮ │\n",
        "    │ │ No messages.                                                                                            │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
+       "    │ ╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮ │\n",
        "    │ │ It's such a beautiful day, I'm going to the beach.                                                      │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
-       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
+       "    │ ╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮ │\n",
        "    │ │ ''                                                                                                      │ │\n",
        "    │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n",
        "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
@@ -396,13 +401,13 @@
       "text/plain": [
        "Logs\n",
        "└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮\n",
-       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m Messages \u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;231;223;235m╭─\u001b[0m\u001b[48;2;231;223;235m──────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m Messages \u001b[0m\u001b[48;2;231;223;235m───────────────────────────────────────────────\u001b[0m\u001b[48;2;231;223;235m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m│\u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235mNo messages.\u001b[0m\u001b[48;2;231;223;235m                                                                                           \u001b[0m\u001b[48;2;231;223;235m \u001b[0m\u001b[48;2;231;223;235m│\u001b[0m │\n",
        "    │ \u001b[48;2;231;223;235m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m Raw LLM Output \u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;245;245;220m╭─\u001b[0m\u001b[48;2;245;245;220m───────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m Raw LLM Output \u001b[0m\u001b[48;2;245;245;220m────────────────────────────────────────────\u001b[0m\u001b[48;2;245;245;220m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m│\u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220mIt's such a beautiful day, I'm going to the beach.\u001b[0m\u001b[48;2;245;245;220m                                                     \u001b[0m\u001b[48;2;245;245;220m \u001b[0m\u001b[48;2;245;245;220m│\u001b[0m │\n",
        "    │ \u001b[48;2;245;245;220m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
-       "    │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m Validated Output \u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
+       "    │ \u001b[48;2;240;255;240m╭─\u001b[0m\u001b[48;2;240;255;240m──────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m Validated Output \u001b[0m\u001b[48;2;240;255;240m───────────────────────────────────────────\u001b[0m\u001b[48;2;240;255;240m─╮\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m│\u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m''\u001b[0m\u001b[48;2;240;255;240m                                                                                                     \u001b[0m\u001b[48;2;240;255;240m \u001b[0m\u001b[48;2;240;255;240m│\u001b[0m │\n",
        "    │ \u001b[48;2;240;255;240m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m │\n",
        "    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n"
@@ -428,7 +433,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "311lite",
+   "display_name": ".venv",
    "language": "python",
    "name": "python3"
   },
@@ -442,7 +447,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.11.3"
+   "version": "3.12.11"
   }
  },
  "nbformat": 4,
diff --git a/docs/dist/examples/translation_with_quality_check.md b/docs/dist/examples/translation_with_quality_check.md
new file mode 100644
index 000000000..396fb1502
--- /dev/null
+++ b/docs/dist/examples/translation_with_quality_check.md
@@ -0,0 +1,211 @@
+import CodeOutputBlock from '../../code-output-block.jsx';
+
+```bash
+guardrails hub install hub://brainlogic/high_quality_translation -q
+```
+
+
+
+```
+    /Users/calebcourier/Projects/guardrails/docs/.venv/lib/python3.12/site-packages/torchmetrics/utilities/imports.py:23: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.
+      from pkg_resources import DistributionNotFound, get_distribution
+    Installing hub://brainlogic/high_quality_translation...
+    /Users/calebcourier/Projects/guardrails/docs/.venv/lib/python3.12/site-packages/torchmetrics/utilities/imports.py:23: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.
+      from pkg_resources import DistributionNotFound, get_distribution
+    /Users/calebcourier/Projects/guardrails/docs/.venv/lib/python3.12/site-packages/transformers/utils/generic.py:441: FutureWarning: `torch.utils._pytree._register_pytree_node` is deprecated. Please use `torch.utils._pytree.register_pytree_node` instead.
+      _torch_pytree._register_pytree_node(
+    /Users/calebcourier/Projects/guardrails/docs/.venv/lib/python3.12/site-packages/transformers/utils/generic.py:309: FutureWarning: `torch.utils._pytree._register_pytree_node` is deprecated. Please use `torch.utils._pytree.register_pytree_node` instead.
+      _torch_pytree._register_pytree_node(
+    /Users/calebcourier/Projects/guardrails/docs/.venv/lib/python3.12/site-packages/transformers/utils/generic.py:309: FutureWarning: `torch.utils._pytree._register_pytree_node` is deprecated. Please use `torch.utils._pytree.register_pytree_node` instead.
+      _torch_pytree._register_pytree_node(
+    Fetching 5 files: 100%|████████████████████████| 5/5 [00:00<00:00, 42711.85it/s]
+    Lightning automatically upgraded your loaded checkpoint from v1.8.2 to v2.5.5. To apply the upgrade to your files permanently, run `python -m pytorch_lightning.utilities.upgrade_checkpoint ../../../../../.cache/huggingface/hub/models--Unbabel--wmt22-cometkiwi-da/snapshots/1ad785194e391eebc6c53e2d0776cada8f83179a/checkpoints/model.ckpt`
+    Encoder model frozen.
+    /Users/calebcourier/Projects/guardrails/docs/.venv/lib/python3.12/site-packages/pytorch_lightning/core/saving.py:195: Found keys that are not in the model state dict but in the checkpoint: ['encoder.model.embeddings.position_ids']
+    Installation complete
+    ✅Successfully installed brainlogic/high_quality_translation version 0.0.0!
+    
+    
+```
+
+
+
+
+
+# Translate text with quality checks
+
+**Note:**
+To download this example as a Jupyter notebook, click [here](https://github.com/guardrails-ai/guardrails/blob/main/docs/examples/translation_with_quality_check.ipynb).
+
+In this example, we will use Guardrails during the translation of a statement from another language to English. We will check whether the translated statement is likely of high quality.
+
+## Objective
+
+We want to translate a statement from different languages to English and ensure that the translated statement accurately reflects the original content.
+
+### Setup
+
+- Install the `unbabel-comet` from source:
+  `pip install git+https://github.com/Unbabel/COMET`
+- Please accept the model license from:
+  https://huggingface.co/Unbabel/wmt22-cometkiwi-da
+- Login into Huggingface Hub using:
+  huggingface-cli login --token $HUGGINGFACE_TOKEN
+
+
+
+```bash
+pip install git+https://github.com/Unbabel/COMET -q
+```
+
+
+```python
+from guardrails import Guard
+from rich import print
+from guardrails.hub import HighQualityTranslation
+```
+
+## Step 1: Define a Guard that uses the validator
+
+This guard will use the HighQualityTranslation validator to validate some string outputs.
+
+
+We define the prompt and the guard.
+
+
+```python
+prompt = """
+Translate the given statement into English:
+
+${statement_to_be_translated}
+"""
+
+guard = Guard().use(HighQualityTranslation(on_fail="fix"))
+```
+
+
+
+```
+    Loading the model Unbabel/wmt22-cometkiwi-da...
+
+
+
+    Fetching 5 files:   0%|          | 0/5 [00:00
+
+## Step 2: Wrap the LLM API call with `Guard`
+
+
+First, let's try translating a statement that is relatively easy to translate.
+
+
+
+```python
+# Set your OPENAI_API_KEY as an environment variable
+# import os
+# os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY"
+
+statement = "Ich habe keine Ahnung, was ich hier schreiben soll."
+
+res = guard(
+    messages=[{"role": "user", "content": prompt}],
+    prompt_params={"statement_to_be_translated": statement},
+    metadata={"translation_source": statement},
+    model="gpt-5-nano",
+    max_tokens=1024,
+    temperature=1,
+)
+
+print(f"Raw LLM Output: {res.raw_llm_output}")
+print(f"Validated Output: {res.validated_output}")
+```
+    
+```
+15:57:09 - LiteLLM:INFO: utils.py:3389 - 
+LiteLLM completion() model= gpt-5-nano; provider = openai
+
+LiteLLM completion() model= gpt-5-nano; provider = openai
+15:57:15 - LiteLLM:INFO: utils.py:1282 - Wrapper: Completed Call, calling success_handler
+Wrapper: Completed Call, calling success_handler
+/Users/calebcourier/Projects/guardrails/docs/.venv/lib/python3.12/site-packages/guardrails/validator_service/__init__.py:84: UserWarning: Could not obtain an event loop. Falling back to synchronous validation.
+  warnings.warn(
+💡 Tip: For seamless cloud uploads and versioning, try installing [litmodels](https://pypi.org/project/litmodels/) to enable LitModelCheckpoint, which syncs automatically with the Lightning model registry.
+GPU available: True (mps), used: False
+TPU available: False, using: 0 TPU cores
+HPU available: False, using: 0 HPUs
+/Users/calebcourier/Projects/guardrails/docs/.venv/lib/python3.12/site-packages/pytorch_lightning/trainer/setup.py:177: GPU available but not used. You can set it by doing `Trainer(accelerator='gpu')`.
+Predicting: 0it [00:00, ?it/s]huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
+To disable this warning, you can either:
+	- Avoid using `tokenizers` before the fork if possible
+	- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
+Predicting DataLoader 0: 100%|██████████| 1/1 [00:00<00:00, 15.67it/s]
+Raw LLM Output: I have no idea what I’m supposed to write here.
+Validated Output: I have no idea what I’m supposed to write here.
+```
+
+We can look at the logs to see the quality check results:
+
+
+
+```python
+print(guard.history.last.tree)
+```
+    
+Logs
└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ ┃ Role Content ┃ │
│ ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ user │ │ │
│ │ │ Translate the given statement into English: │ │
│ │ │ │ │
│ │ │ Ich habe keine Ahnung, was ich hier schreiben soll. │ │
│ │ │ │ │
│ └──────┴─────────────────────────────────────────────────────┘ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ I have no idea what I’m supposed to write here. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ I have no idea what I’m supposed to write here. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> + +The `guard` wrapper returns the raw LLM response, which is the translated statement and also the validated output. In this case, the translated statement was of a good quality (above the threshold of 0.5), so the validated output is the same as the raw LLM response. + +#### Now, let's test with a really low quality translation, and see how Guardrails handles it. + + + +```python +# Parse the code snippet +statement = "अरे भाऊ, आज रात्री जोरदार पार्टी मारूया, जमून टाकूया आणि धमाल करूया!" + +## Ideal translation from Marathi -> English: +# "Hey bro, let's have a great party tonight and have fun!" + +output = guard.parse( + llm_output="It's such a beautiful day, I'm going to the beach.", ## here, providing a really bad translation + metadata={"translation_source": statement}, +) + +# Print the output +print(f"Raw LLM Output: {output.raw_llm_output}") +print(f"Validated Output: {output.validated_output}") +``` + +``` +/Users/calebcourier/Projects/guardrails/docs/.venv/lib/python3.12/site-packages/guardrails/validator_service/__init__.py:84: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( +💡 Tip: For seamless cloud uploads and versioning, try installing [litmodels](https://pypi.org/project/litmodels/) to enable LitModelCheckpoint, which syncs automatically with the Lightning model registry. +GPU available: True (mps), used: False +TPU available: False, using: 0 TPU cores +HPU available: False, using: 0 HPUs +/Users/calebcourier/Projects/guardrails/docs/.venv/lib/python3.12/site-packages/pytorch_lightning/trainer/setup.py:177: GPU available but not used. You can set it by doing `Trainer(accelerator='gpu')`. +Predicting DataLoader 0: 100%|██████████| 1/1 [00:00<00:00, 12.05it/s] +Raw LLM Output: It's such a beautiful day, I'm going to the beach. +Validated Output: +``` + + +```python +print(guard.history.last.tree) +``` + +Logs
└── ╭────────────────────────────────────────────────── Step 0 ───────────────────────────────────────────────────╮
╭─────────────────────────────────────────────── Messages ────────────────────────────────────────────────╮
│ No messages. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────── Raw LLM Output ─────────────────────────────────────────────╮
│ It's such a beautiful day, I'm going to the beach. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────── Validated Output ────────────────────────────────────────────╮
│ '' │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
"}} /> + +As you can see, the translation quality is really bad, and the `HighQualityTranslation` check failed as the translation quality was below the threshold. The validated response is an empty string. + +## In this way, you can use Guardrails to ensure that the output of your LLM is of high quality. + diff --git a/docs/examples/valid_chess_moves.ipynb b/docs/dist/examples/valid_chess_moves.ipynb similarity index 99% rename from docs/examples/valid_chess_moves.ipynb rename to docs/dist/examples/valid_chess_moves.ipynb index 3f163a160..b8fad6b89 100644 --- a/docs/examples/valid_chess_moves.ipynb +++ b/docs/dist/examples/valid_chess_moves.ipynb @@ -71,7 +71,13 @@ "metadata": {}, "outputs": [], "source": [ - "from guardrails.validators import Validator, register_validator, ValidationResult, PassResult, FailResult\n", + "from guardrails.validators import (\n", + " Validator,\n", + " register_validator,\n", + " ValidationResult,\n", + " PassResult,\n", + " FailResult,\n", + ")\n", "\n", "from typing import Dict, Any\n", "\n", @@ -79,9 +85,9 @@ "\n", "BOARD = chess.Board()\n", "\n", + "\n", "@register_validator(name=\"is-valid-chess-move\", data_type=\"string\")\n", "class IsValidChessMove(Validator):\n", - "\n", " board = BOARD\n", "\n", " def validate(self, value: Any, metadata: Dict) -> ValidationResult:\n", @@ -93,7 +99,7 @@ " # If the move is invalid, raise an error.\n", " return FailResult(\n", " error_message=f\"Value {value} is not a valid chess move. {e}\"\n", - " ) \n", + " )\n", "\n", " return PassResult()" ] @@ -152,11 +158,12 @@ "${gr.complete_xml_suffix}\n", "\"\"\"\n", "\n", + "\n", "class ChessMove(BaseModel):\n", " move: str = Field(\n", " description=\"A move in standard algebraic notation.\",\n", - " validators=[IsValidChessMove(on_fail=\"reask\")]\n", - " )" + " validators=[IsValidChessMove(on_fail=\"reask\")],\n", + " )" ] }, { @@ -270,7 +277,7 @@ "# os.environ[\"OPENAI_API_KEY\"] = \"YOUR_API_KEY\"\n", "\n", "raw_llm_response, validated_response, *rest = guard(\n", - " messages=[{\"role\":\"user\", \"content\": prompt}],\n", + " messages=[{\"role\": \"user\", \"content\": prompt}],\n", " prompt_params={\n", " \"board_state\": str(board.move_stack)\n", " if board.move_stack\n", @@ -484,10 +491,8 @@ ], "source": [ "raw_llm_response, validated_response, *rest = guard(\n", - " messages=[{\"role\":\"user\", \"content\": prompt}],\n", - " prompt_params={\n", - " \"board_state\": str(board.move_stack)\n", - " },\n", + " messages=[{\"role\": \"user\", \"content\": prompt}],\n", + " prompt_params={\"board_state\": str(board.move_stack)},\n", " model=\"gpt-4o-mini\",\n", " max_tokens=2048,\n", " temperature=0.0,\n", diff --git a/docs/dist/examples/valid_chess_moves.md b/docs/dist/examples/valid_chess_moves.md new file mode 100644 index 000000000..1d2e17ac2 --- /dev/null +++ b/docs/dist/examples/valid_chess_moves.md @@ -0,0 +1,298 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +# Playing Valid Chess Moves + +!!! note + To download this example as a Jupyter notebook, click [here](https://github.com/guardrails-ai/guardrails/blob/main/docs/examples/valid_chess_moves.ipynb). + +!!! warning + This example is currently under development (it cannot be used to play a full chess game yet). + +In this example, we will use Guardrails to play chess with an LLM and ensure that it makes valid moves. + +## Objective + +We want to generate a valid chess moves for a given board state. + + + + +```python +import guardrails as gd +from rich import print +``` + + + +``` + /Users/dtam/.pyenv/versions/3.12.3/envs/litellm/lib/python3.12/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:13: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console) + from tqdm.autonotebook import tqdm, trange +``` + + + + +```bash +pip install chess --quiet +``` + +## Step 1: Create the RAIL Spec + +Ordinarily, we would create an RAIL spec in a separate file. For the purposes of this example, we will create the spec in this notebook as a string following the RAIL syntax. For more information on RAIL, see the [RAIL documentation](/docs/how_to_guides/rail). We will also show the same RAIL spec in a code-first format using a Pydantic model. + +First we define a custom Validator: + + +```python +from guardrails.validators import ( + Validator, + register_validator, + ValidationResult, + PassResult, + FailResult, +) + +from typing import Dict, Any + +import chess + +BOARD = chess.Board() + + +@register_validator(name="is-valid-chess-move", data_type="string") +class IsValidChessMove(Validator): + board = BOARD + + def validate(self, value: Any, metadata: Dict) -> ValidationResult: + global BOARD + try: + # Push the move onto the board. + BOARD.push_san(value) + except Exception as e: + # If the move is invalid, raise an error. + return FailResult( + error_message=f"Value {value} is not a valid chess move. {e}" + ) + + return PassResult() +``` + +Then we can define our RAIL spec either as XML: + + +```python +rail_str = """ + + + + + + + + + +Generate a move for the chess board. Do not repeat any moves in the following state. The board is currently in the following state: +${board_state} +${gr.complete_xml_suffix} + + + + +""" +``` + +Or as a Pydantic model: + + +```python +from pydantic import BaseModel, Field + +prompt = """ +Generate a move for the chess board. Do not repeat any moves in the following state. The board is currently in the following state: +${board_state} +${gr.complete_xml_suffix} +""" + + +class ChessMove(BaseModel): + move: str = Field( + description="A move in standard algebraic notation.", + validators=[IsValidChessMove(on_fail="reask")], + ) +``` + +## Step 2: Create a `Guard` object with the RAIL Spec + +We create a `gd.Guard` object that will check, validate and correct the output of the LLM. This object: + +1. Enforces the quality criteria specified in the RAIL spec. +2. Takes corrective action when the quality criteria are not met. +3. Compiles the schema and type info from the RAIL spec and adds it to the prompt. + +From XML: + + +```python +guard = gd.Guard.for_rail_string(rail_str) +``` + +From a Pydantic model: + + +```python +guard = gd.Guard.for_pydantic(output_class=ChessMove) +``` + +Let's get the reference to the board. + + +```python +board = guard._validator_map.get("$.move")[0].board +board +``` + + + +``` + +![svg](_valid_chess_moves_files/output_16_0.svg) + +``` + + + +## Step 3: Wrap the LLM API call with `Guard` + + +```python +# Set your OPENAI_API_KEY as an environment variable +# import os +# os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY" + +raw_llm_response, validated_response, *rest = guard( + messages=[{"role": "user", "content": prompt}], + prompt_params={ + "board_state": str(board.move_stack) + if board.move_stack + else "Starting position." + }, + model="gpt-4o-mini", + max_tokens=2048, + temperature=0.3, +) +``` + + + +``` + /Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( +``` + + + +We can see in the prompt that was sent to the LLM, the `{board_state}` parameter is substituted with the current state of the board. + + +```python +print(guard.history.last.iterations.last.inputs.messages[0]["content"]) +``` + +
Generate a move for the chess board. Do not repeat any moves in the following state. The board is currently in the
following state:
Starting position.

Given below is XML that describes the information to extract from this document and the tags to extract it into.

<output>
<string description=\"A move in standard algebraic notation.\" format=\"is-valid-chess-move\" name=\"move\"
required=\"true\"></string>
</output>

ONLY return a valid JSON object (no other text is necessary), where the key of the field in JSON is the `name`
attribute of the corresponding XML, and the value is of the type specified by the corresponding XML's tag. The JSON
MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and
specific types. Be correct and concise. If you are unsure anywhere, enter `null`.

Here are examples of simple (XML, JSON) pairs that show the expected behavior:
- `<string name='foo' format='two-words lower-case' />` => `{'foo': 'example one'}`
- `<list name='bar'><string format='upper-case' /></list>` => `{\"bar\": ['STRING ONE', 'STRING TWO', etc.]}`
- `<object name='baz'><string name=\"foo\" format=\"capitalize two-words\" /><integer name=\"index\" format=\"1-indexed\"
/></object>` => `{'baz': {'foo': 'Some String', 'index': 1}}`


"}} /> + +The `guard` wrapper returns the raw_llm_respose (which is a simple string), and the validated and corrected output (which is a dictionary). + +We can see that the output is a dictionary with the correct schema and types. + + +```python +print(validated_response) +``` + +{'move': 'e4'}
"}} /> + + +```python +board +``` + + + +``` + +![svg](_valid_chess_moves_files/output_23_0.svg) + +``` + + + +Let's make a move. + + +```python +board.push_san("e5") +board +``` + + + +``` + +![svg](_valid_chess_moves_files/output_25_0.svg) + +``` + + + +Ask for another move from the model. + + +```python +raw_llm_response, validated_response, *rest = guard( + messages=[{"role": "user", "content": prompt}], + prompt_params={"board_state": str(board.move_stack)}, + model="gpt-4o-mini", + max_tokens=2048, + temperature=0.0, +) +``` + + + +``` + /Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( +``` + + + + +```python +board +``` + + + +``` + +![svg](_valid_chess_moves_files/output_28_0.svg) + +``` + + + + +```python +board.push_san("Nc6") +board +``` + + + +``` + +![svg](_valid_chess_moves_files/output_29_0.svg) + +``` + + diff --git a/docs/examples/value_within_distribution.ipynb b/docs/dist/examples/value_within_distribution.ipynb similarity index 95% rename from docs/examples/value_within_distribution.ipynb rename to docs/dist/examples/value_within_distribution.ipynb index dd2824853..2a6cd138e 100644 --- a/docs/examples/value_within_distribution.ipynb +++ b/docs/dist/examples/value_within_distribution.ipynb @@ -44,14 +44,18 @@ "outputs": [], "source": [ "# Create the Guard with the SimilarToList validator\n", - "from typing import Union\n", "from pydantic import BaseModel, Field\n", "from guardrails import Guard\n", "from guardrails.hub import SimilarToPreviousValues\n", "\n", "\n", "class MyModel(BaseModel):\n", - " value: int = Field(validators=[SimilarToPreviousValues(standard_deviations=2, threshold=0.8, on_fail=\"fix\")])\n", + " value: int = Field(\n", + " validators=[\n", + " SimilarToPreviousValues(standard_deviations=2, threshold=0.8, on_fail=\"fix\")\n", + " ]\n", + " )\n", + "\n", "\n", "guard = Guard.for_pydantic(MyModel)" ] @@ -157,6 +161,7 @@ "import numpy as np\n", "import openai\n", "\n", + "\n", "# Define the embed function\n", "def embed_function(text: str) -> np.ndarray:\n", " \"\"\"Embed the text using openAI Ada.\"\"\"\n", @@ -168,7 +173,10 @@ " # response[\"data\"][0][\"embedding\"]\n", " return np.array(embeddings)\n", "\n", - "guard = Guard().use(SimilarToPreviousValues(standard_deviations=2, threshold=0.8, on_fail=\"fix\"))" + "\n", + "guard = Guard().use(\n", + " SimilarToPreviousValues(standard_deviations=2, threshold=0.8, on_fail=\"fix\")\n", + ")" ] }, { diff --git a/docs/dist/examples/value_within_distribution.md b/docs/dist/examples/value_within_distribution.md new file mode 100644 index 000000000..608845164 --- /dev/null +++ b/docs/dist/examples/value_within_distribution.md @@ -0,0 +1,195 @@ +import CodeOutputBlock from '../../code-output-block.jsx'; + +```bash +guardrails hub install hub://guardrails/similar_to_previous_values --quiet +``` + + + +``` + Installing hub://guardrails/similar_to_previous_values... + /Users/calebcourier/Projects/gr-mono/guardrails/docs/examples/.venv/lib/python3.12/site-packages/huggingface_hub/file_download.py:1132: FutureWarning: `resume_download` is deprecated and will be removed in version 1.0.0. Downloads always resume when possible. If you want to force a new download, use `force_download=True`. + warnings.warn( + ✅Successfully installed guardrails/similar_to_previous_values! + + +``` + + + + + +# Check whether a value is similar to a set of other values + +**Using the SimilarToPreviousValues validator** + +This validator validates whether a new value is similar to a set of previously known values. It is useful for checking whether a new value is within a distribution of known values. It supports both integer and string values. + +For integer values, this validator checks whether the value lies within the specified standard deviations of the mean of the previous values. (Assumes that the previous values are normally distributed.) + +For string values, this validator checks whether the average semantic similarity between the generated value and the previous values is less than a threshold. + + + +```python +# Create the Guard with the SimilarToList validator +from pydantic import BaseModel, Field +from guardrails import Guard +from guardrails.hub import SimilarToPreviousValues + + +class MyModel(BaseModel): + value: int = Field( + validators=[ + SimilarToPreviousValues(standard_deviations=2, threshold=0.8, on_fail="fix") + ] + ) + + +guard = Guard.for_pydantic(MyModel) +``` + +## Test with integer values + + + +```python +# Test with a value that is within the distribution +output = guard.parse( + llm_output='{ "value": 3 }', + metadata={"prev_values": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}, +) + +print(output.validated_output) +``` + + + +``` + {'value': 3} + + + /Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( +``` + + + +As 3 is within the distribution of the given prev_values, the validator returns 3 as it is. + + + +```python +# Test with a value that is outside the distribution +output = guard.parse( + llm_output='{ "value": 300 }', + metadata={"prev_values": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}, +) + +print(output.validated_output) +``` + + + +``` + None + + + /Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( +``` + + + +As 300 is not within the distribution of the given prev_values, the validator returns None. + + +## Test with string values + + + +```python +# Define embed function +# Create an embedding function that uses openAI Ada to embed the text. +import numpy as np +import openai + + +# Define the embed function +def embed_function(text: str) -> np.ndarray: + """Embed the text using openAI Ada.""" + response = openai.embeddings.create( + model="text-embedding-ada-002", + input=text, + ) + embeddings = response.data[0].embedding + # response["data"][0]["embedding"] + return np.array(embeddings) + + +guard = Guard().use( + SimilarToPreviousValues(standard_deviations=2, threshold=0.8, on_fail="fix") +) +``` + + +```python +# Test with a value that is similar to prev values +# As it is, it will return that value +output = guard.parse( + llm_output="cisco", + metadata={ + "prev_values": ["broadcom", "paypal"], + "embed_function": embed_function, + }, +) + +print(output.validated_output) +``` + + + +``` + /Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( + HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK" + HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK" + HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK" + HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK" + + + cisco +``` + + + + +```python +# Test with a value that is not similar to prev values +# As it is not, it will return None +output = guard.parse( + llm_output="taj mahal", + metadata={ + "prev_values": ["broadcom", "paypal"], + "embed_function": embed_function, + }, +) + +print(output.validated_output) +``` + + + +``` + /Users/dtam/dev/guardrails/guardrails/validator_service/__init__.py:85: UserWarning: Could not obtain an event loop. Falling back to synchronous validation. + warnings.warn( + HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK" + HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK" + HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK" + HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK" + + + None +``` + + diff --git a/docs/faq.md b/docs/dist/faq.md similarity index 100% rename from docs/faq.md rename to docs/dist/faq.md diff --git a/docs/getting_started/ai_validation.md b/docs/dist/getting_started/ai_validation.md similarity index 100% rename from docs/getting_started/ai_validation.md rename to docs/dist/getting_started/ai_validation.md diff --git a/docs/getting_started/contributing.md b/docs/dist/getting_started/contributing.md similarity index 100% rename from docs/getting_started/contributing.md rename to docs/dist/getting_started/contributing.md diff --git a/docs/getting_started/guardrails_server.md b/docs/dist/getting_started/guardrails_server.md similarity index 96% rename from docs/getting_started/guardrails_server.md rename to docs/dist/getting_started/guardrails_server.md index 5571fa2a5..2f742d76f 100644 --- a/docs/getting_started/guardrails_server.md +++ b/docs/dist/getting_started/guardrails_server.md @@ -150,8 +150,8 @@ validation_outcome = name_guard.validate("floofy doopy boopy") ## Learn More -- [Guardrails Server Concepts](../concepts/deploying) -- [Guardrails CLI Reference](../cli) -- [Remote Validation Inference](../concepts/remote_validation_inference) +- [Guardrails Server Concepts](/docs/concepts/deploying) +- [Guardrails CLI Reference](/docs/cli) +- [Remote Validation Inference](/docs/concepts/remote_validation_inference) - [Guardrails Hub](https://hub.guardrailsai.com) diff --git a/docs/getting_started/help.md b/docs/dist/getting_started/help.md similarity index 100% rename from docs/getting_started/help.md rename to docs/dist/getting_started/help.md diff --git a/docs/getting_started/ml_based.md b/docs/dist/getting_started/ml_based.md similarity index 100% rename from docs/getting_started/ml_based.md rename to docs/dist/getting_started/ml_based.md diff --git a/docs/getting_started/quickstart.md b/docs/dist/getting_started/quickstart.md similarity index 100% rename from docs/getting_started/quickstart.md rename to docs/dist/getting_started/quickstart.md diff --git a/docs/getting_started/structured_data.md b/docs/dist/getting_started/structured_data.md similarity index 100% rename from docs/getting_started/structured_data.md rename to docs/dist/getting_started/structured_data.md diff --git a/docs/getting_started/why_use_guardrails.md b/docs/dist/getting_started/why_use_guardrails.md similarity index 100% rename from docs/getting_started/why_use_guardrails.md rename to docs/dist/getting_started/why_use_guardrails.md diff --git a/docs/guardrails_ai/configuration.md b/docs/dist/guardrails_ai/configuration.md similarity index 100% rename from docs/guardrails_ai/configuration.md rename to docs/dist/guardrails_ai/configuration.md diff --git a/docs/guardrails_ai/faq.md b/docs/dist/guardrails_ai/faq.md similarity index 100% rename from docs/guardrails_ai/faq.md rename to docs/dist/guardrails_ai/faq.md diff --git a/docs/guardrails_ai/getting_started.md b/docs/dist/guardrails_ai/getting_started.md similarity index 100% rename from docs/guardrails_ai/getting_started.md rename to docs/dist/guardrails_ai/getting_started.md diff --git a/docs/guardrails_ai/installation.md b/docs/dist/guardrails_ai/installation.md similarity index 100% rename from docs/guardrails_ai/installation.md rename to docs/dist/guardrails_ai/installation.md diff --git a/docs/guardrails_server_api.md b/docs/dist/guardrails_server_api.md similarity index 86% rename from docs/guardrails_server_api.md rename to docs/dist/guardrails_server_api.md index 0439cfba5..6adb73c8d 100644 --- a/docs/guardrails_server_api.md +++ b/docs/dist/guardrails_server_api.md @@ -54,8 +54,8 @@ Guardrails CRUD API. The server hosts the documenation on this page in an intera |Status|Meaning|Description|Schema| |---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Returns the status of the server|[HealthCheck](#schemahealthcheck)| -|default|Default|Unexpected error|[HttpError](#schemahttperror)| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Returns the status of the server|[HealthCheck](#healthcheck)| +|default|Default|Unexpected error|[HttpError](#httperror)|