diff --git a/.gitignore b/.gitignore index b73165db55d..ed9cd7d4706 100644 --- a/.gitignore +++ b/.gitignore @@ -172,6 +172,8 @@ docs/api_reference/*/ !docs/api_reference/_static/ !docs/api_reference/templates/ !docs/api_reference/themes/ +!docs/api_reference/_extensions/ +!docs/api_reference/scripts/ docs/docs/build docs/docs/node_modules docs/docs/yarn.lock diff --git a/Makefile b/Makefile index c5ef8e9fbd7..5519b6d7c23 100644 --- a/Makefile +++ b/Makefile @@ -31,6 +31,7 @@ docs_linkcheck: api_docs_build: poetry run python docs/api_reference/create_api_rst.py cd docs/api_reference && poetry run make html + poetry run python docs/api_reference/scripts/custom_formatter.py docs/api_reference/_build/html/ API_PKG ?= text-splitters @@ -38,12 +39,14 @@ api_docs_quick_preview: poetry run pip install "pydantic<2" poetry run python docs/api_reference/create_api_rst.py $(API_PKG) cd docs/api_reference && poetry run make html - open docs/api_reference/_build/html/$(shell echo $(API_PKG) | sed 's/-/_/g')_api_reference.html + poetry run python docs/api_reference/scripts/custom_formatter.py docs/api_reference/_build/html/ + open docs/api_reference/_build/html/reference.html ## api_docs_clean: Clean the API Reference documentation build artifacts. api_docs_clean: find ./docs/api_reference -name '*_api_reference.rst' -delete git clean -fdX ./docs/api_reference + rm docs/api_reference/index.md ## api_docs_linkcheck: Run linkchecker on the API Reference documentation. diff --git a/docs/Makefile b/docs/Makefile index 2b90623fe86..f230ce12035 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -82,6 +82,10 @@ vercel-build: install-vercel-deps build generate-references rm -rf docs mv $(OUTPUT_NEW_DOCS_DIR) docs rm -rf build + mkdir static/api_reference + git clone --depth=1 https://github.com/baskaryan/langchain-api-docs-build.git + mv langchain-api-docs-build/api_reference_build/html/* static/api_reference/ + rm -rf langchain-api-docs-build NODE_OPTIONS="--max-old-space-size=5000" yarn run docusaurus build mv build v0.2 mkdir build diff --git a/docs/api_reference/_extensions/gallery_directive.py b/docs/api_reference/_extensions/gallery_directive.py new file mode 100644 index 00000000000..80642c5455b --- /dev/null +++ b/docs/api_reference/_extensions/gallery_directive.py @@ -0,0 +1,144 @@ +"""A directive to generate a gallery of images from structured data. + +Generating a gallery of images that are all the same size is a common +pattern in documentation, and this can be cumbersome if the gallery is +generated programmatically. This directive wraps this particular use-case +in a helper-directive to generate it with a single YAML configuration file. + +It currently exists for maintainers of the pydata-sphinx-theme, +but might be abstracted into a standalone package if it proves useful. +""" + +from pathlib import Path +from typing import Any, ClassVar, Dict, List + +from docutils import nodes +from docutils.parsers.rst import directives +from sphinx.application import Sphinx +from sphinx.util import logging +from sphinx.util.docutils import SphinxDirective +from yaml import safe_load + +logger = logging.getLogger(__name__) + + +TEMPLATE_GRID = """ +`````{{grid}} {columns} +{options} + +{content} + +````` +""" + +GRID_CARD = """ +````{{grid-item-card}} {title} +{options} + +{content} +```` +""" + + +class GalleryGridDirective(SphinxDirective): + """A directive to show a gallery of images and links in a Bootstrap grid. + + The grid can be generated from a YAML file that contains a list of items, or + from the content of the directive (also formatted in YAML). Use the parameter + "class-card" to add an additional CSS class to all cards. When specifying the grid + items, you can use all parameters from "grid-item-card" directive to customize + individual cards + ["image", "header", "content", "title"]. + + Danger: + This directive can only be used in the context of a Myst documentation page as + the templates use Markdown flavored formatting. + """ + + name = "gallery-grid" + has_content = True + required_arguments = 0 + optional_arguments = 1 + final_argument_whitespace = True + option_spec: ClassVar[dict[str, Any]] = { + # A class to be added to the resulting container + "grid-columns": directives.unchanged, + "class-container": directives.unchanged, + "class-card": directives.unchanged, + } + + def run(self) -> List[nodes.Node]: + """Create the gallery grid.""" + if self.arguments: + # If an argument is given, assume it's a path to a YAML file + # Parse it and load it into the directive content + path_data_rel = Path(self.arguments[0]) + path_doc, _ = self.get_source_info() + path_doc = Path(path_doc).parent + path_data = (path_doc / path_data_rel).resolve() + if not path_data.exists(): + logger.info(f"Could not find grid data at {path_data}.") + nodes.text("No grid data found at {path_data}.") + return + yaml_string = path_data.read_text() + else: + yaml_string = "\n".join(self.content) + + # Use all the element with an img-bottom key as sites to show + # and generate a card item for each of them + grid_items = [] + for item in safe_load(yaml_string): + # remove parameters that are not needed for the card options + title = item.pop("title", "") + + # build the content of the card using some extra parameters + header = f"{item.pop('header')} \n^^^ \n" if "header" in item else "" + image = f"}) \n" if "image" in item else "" + content = f"{item.pop('content')} \n" if "content" in item else "" + + # optional parameter that influence all cards + if "class-card" in self.options: + item["class-card"] = self.options["class-card"] + + loc_options_str = "\n".join(f":{k}: {v}" for k, v in item.items()) + " \n" + + card = GRID_CARD.format( + options=loc_options_str, content=header + image + content, title=title + ) + grid_items.append(card) + + # Parse the template with Sphinx Design to create an output container + # Prep the options for the template grid + class_ = "gallery-directive" + f' {self.options.get("class-container", "")}' + options = {"gutter": 2, "class-container": class_} + options_str = "\n".join(f":{k}: {v}" for k, v in options.items()) + + # Create the directive string for the grid + grid_directive = TEMPLATE_GRID.format( + columns=self.options.get("grid-columns", "1 2 3 4"), + options=options_str, + content="\n".join(grid_items), + ) + + # Parse content as a directive so Sphinx Design processes it + container = nodes.container() + self.state.nested_parse([grid_directive], 0, container) + + # Sphinx Design outputs a container too, so just use that + return [container.children[0]] + + +def setup(app: Sphinx) -> Dict[str, Any]: + """Add custom configuration to sphinx app. + + Args: + app: the Sphinx application + + Returns: + the 2 parallel parameters set to ``True``. + """ + app.add_directive("gallery-grid", GalleryGridDirective) + + return { + "parallel_read_safe": True, + "parallel_write_safe": True, + } diff --git a/docs/api_reference/_static/css/custom.css b/docs/api_reference/_static/css/custom.css index 4bd681367cf..87195de8f72 100644 --- a/docs/api_reference/_static/css/custom.css +++ b/docs/api_reference/_static/css/custom.css @@ -1,26 +1,411 @@ -pre { - white-space: break-spaces; +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap'); + +/******************************************************************************* +* master color map. Only the colors that actually differ between light and dark +* themes are specified separately. +* +* To see the full list of colors see https://www.figma.com/file/rUrrHGhUBBIAAjQ82x6pz9/PyData-Design-system---proposal-for-implementation-(2)?node-id=1234%3A765&t=ifcFT1JtnrSshGfi-1 +*/ +/** +* Function to get items from nested maps +*/ +/* Assign base colors for the PyData theme */ +:root { + --pst-teal-50: #f4fbfc; + --pst-teal-100: #e9f6f8; + --pst-teal-200: #d0ecf1; + --pst-teal-300: #abdde6; + --pst-teal-400: #3fb1c5; + --pst-teal-500: #0a7d91; + --pst-teal-600: #085d6c; + --pst-teal-700: #064752; + --pst-teal-800: #042c33; + --pst-teal-900: #021b1f; + --pst-violet-50: #f4eefb; + --pst-violet-100: #e0c7ff; + --pst-violet-200: #d5b4fd; + --pst-violet-300: #b780ff; + --pst-violet-400: #9c5ffd; + --pst-violet-500: #8045e5; + --pst-violet-600: #6432bd; + --pst-violet-700: #4b258f; + --pst-violet-800: #341a61; + --pst-violet-900: #1e0e39; + --pst-gray-50: #f9f9fa; + --pst-gray-100: #f3f4f5; + --pst-gray-200: #e5e7ea; + --pst-gray-300: #d1d5da; + --pst-gray-400: #9ca4af; + --pst-gray-500: #677384; + --pst-gray-600: #48566b; + --pst-gray-700: #29313d; + --pst-gray-800: #222832; + --pst-gray-900: #14181e; + --pst-pink-50: #fcf8fd; + --pst-pink-100: #fcf0fa; + --pst-pink-200: #f8dff5; + --pst-pink-300: #f3c7ee; + --pst-pink-400: #e47fd7; + --pst-pink-500: #c132af; + --pst-pink-600: #912583; + --pst-pink-700: #6e1c64; + --pst-pink-800: #46123f; + --pst-pink-900: #2b0b27; + --pst-foundation-white: #ffffff; + --pst-foundation-black: #14181e; + --pst-green-10: #f1fdfd; + --pst-green-50: #E0F7F6; + --pst-green-100: #B3E8E6; + --pst-green-200: #80D6D3; + --pst-green-300: #4DC4C0; + --pst-green-400: #4FB2AD; + --pst-green-500: #287977; + --pst-green-600: #246161; + --pst-green-700: #204F4F; + --pst-green-800: #1C3C3C; + --pst-green-900: #0D2427; + --pst-lilac-50: #f4eefb; + --pst-lilac-100: #DAD6FE; + --pst-lilac-200: #BCB2FD; + --pst-lilac-300: #9F8BFA; + --pst-lilac-400: #7F5CF6; + --pst-lilac-500: #6F3AED; + --pst-lilac-600: #6028D9; + --pst-lilac-700: #5021B6; + --pst-lilac-800: #431D95; + --pst-lilac-900: #1e0e39; + --pst-header-height: 2.5rem; } -@media (min-width: 1200px) { - .container, - .container-lg, - .container-md, - .container-sm, - .container-xl { - max-width: 2560px !important; - } +html { + --pst-font-family-base: 'Inter'; + --pst-font-family-heading: 'Inter Tight', sans-serif; } -#my-component-root *, -#headlessui-portal-root * { - z-index: 10000; +/******************************************************************************* +* write the color rules for each theme (light/dark) +*/ +/* NOTE: + * Mixins enable us to reuse the same definitions for the different modes + * https://sass-lang.com/documentation/at-rules/mixin + * something inserts a variable into a CSS selector or property name + * https://sass-lang.com/documentation/interpolation + */ +/* Defaults to light mode if data-theme is not set */ +html:not([data-theme]) { + --pst-color-primary: #287977; + --pst-color-primary-bg: #80D6D3; + --pst-color-secondary: #6F3AED; + --pst-color-secondary-bg: #DAD6FE; + --pst-color-accent: #c132af; + --pst-color-accent-bg: #f8dff5; + --pst-color-info: #276be9; + --pst-color-info-bg: #dce7fc; + --pst-color-warning: #f66a0a; + --pst-color-warning-bg: #f8e3d0; + --pst-color-success: #00843f; + --pst-color-success-bg: #d6ece1; + --pst-color-attention: var(--pst-color-warning); + --pst-color-attention-bg: var(--pst-color-warning-bg); + --pst-color-danger: #d72d47; + --pst-color-danger-bg: #f9e1e4; + --pst-color-text-base: #222832; + --pst-color-text-muted: #48566b; + --pst-color-heading-color: #ffffff; + --pst-color-shadow: rgba(0, 0, 0, 0.1); + --pst-color-border: #d1d5da; + --pst-color-border-muted: rgba(23, 23, 26, 0.2); + --pst-color-inline-code: #912583; + --pst-color-inline-code-links: #246161; + --pst-color-target: #f3cf95; + --pst-color-background: #ffffff; + --pst-color-on-background: #F4F9F8; + --pst-color-surface: #F4F9F8; + --pst-color-on-surface: #222832; +} +html:not([data-theme]) { + --pst-color-link: var(--pst-color-primary); + --pst-color-link-hover: var(--pst-color-secondary); +} +html:not([data-theme]) .only-dark, +html:not([data-theme]) .only-dark ~ figcaption { + display: none !important; } -table.longtable code { - white-space: normal; +/* NOTE: @each {...} is like a for-loop + * https://sass-lang.com/documentation/at-rules/control/each + */ +html[data-theme=light] { + --pst-color-primary: #287977; + --pst-color-primary-bg: #80D6D3; + --pst-color-secondary: #6F3AED; + --pst-color-secondary-bg: #DAD6FE; + --pst-color-accent: #c132af; + --pst-color-accent-bg: #f8dff5; + --pst-color-info: #276be9; + --pst-color-info-bg: #dce7fc; + --pst-color-warning: #f66a0a; + --pst-color-warning-bg: #f8e3d0; + --pst-color-success: #00843f; + --pst-color-success-bg: #d6ece1; + --pst-color-attention: var(--pst-color-warning); + --pst-color-attention-bg: var(--pst-color-warning-bg); + --pst-color-danger: #d72d47; + --pst-color-danger-bg: #f9e1e4; + --pst-color-text-base: #222832; + --pst-color-text-muted: #48566b; + --pst-color-heading-color: #ffffff; + --pst-color-shadow: rgba(0, 0, 0, 0.1); + --pst-color-border: #d1d5da; + --pst-color-border-muted: rgba(23, 23, 26, 0.2); + --pst-color-inline-code: #912583; + --pst-color-inline-code-links: #246161; + --pst-color-target: #f3cf95; + --pst-color-background: #ffffff; + --pst-color-on-background: #F4F9F8; + --pst-color-surface: #F4F9F8; + --pst-color-on-surface: #222832; + color-scheme: light; +} +html[data-theme=light] { + --pst-color-link: var(--pst-color-primary); + --pst-color-link-hover: var(--pst-color-secondary); +} +html[data-theme=light] .only-dark, +html[data-theme=light] .only-dark ~ figcaption { + display: none !important; } -table.longtable td { - max-width: 600px; +html[data-theme=dark] { + --pst-color-primary: #4FB2AD; + --pst-color-primary-bg: #1C3C3C; + --pst-color-secondary: #7F5CF6; + --pst-color-secondary-bg: #431D95; + --pst-color-accent: #e47fd7; + --pst-color-accent-bg: #46123f; + --pst-color-info: #79a3f2; + --pst-color-info-bg: #06245d; + --pst-color-warning: #ff9245; + --pst-color-warning-bg: #652a02; + --pst-color-success: #5fb488; + --pst-color-success-bg: #002f17; + --pst-color-attention: var(--pst-color-warning); + --pst-color-attention-bg: var(--pst-color-warning-bg); + --pst-color-danger: #e78894; + --pst-color-danger-bg: #4e111b; + --pst-color-text-base: #ced6dd; + --pst-color-text-muted: #9ca4af; + --pst-color-heading-color: #14181e; + --pst-color-shadow: rgba(0, 0, 0, 0.2); + --pst-color-border: #48566b; + --pst-color-border-muted: #29313d; + --pst-color-inline-code: #f3c7ee; + --pst-color-inline-code-links: #4FB2AD; + --pst-color-target: #675c04; + --pst-color-background: #14181e; + --pst-color-on-background: #222832; + --pst-color-surface: #29313d; + --pst-color-on-surface: #f3f4f5; + /* Adjust images in dark mode (unless they have class .only-dark or + * .dark-light, in which case assume they're already optimized for dark + * mode). + */ + /* Give images a light background in dark mode in case they have + * transparency and black text (unless they have class .only-dark or .dark-light, in + * which case assume they're already optimized for dark mode). + */ + color-scheme: dark; } +html[data-theme=dark] { + --pst-color-link: var(--pst-color-primary); + --pst-color-link-hover: var(--pst-color-secondary); +} +html[data-theme=dark] .only-light, +html[data-theme=dark] .only-light ~ figcaption { + display: none !important; +} +html[data-theme=dark] img:not(.only-dark):not(.dark-light) { + filter: brightness(0.8) contrast(1.2); +} +html[data-theme=dark] .bd-content img:not(.only-dark):not(.dark-light) { + background: rgb(255, 255, 255); + border-radius: 0.25rem; +} +html[data-theme=dark] .MathJax_SVG * { + fill: var(--pst-color-text-base); +} + +.pst-color-primary { + color: var(--pst-color-primary); +} + +.pst-color-secondary { + color: var(--pst-color-secondary); +} + +.pst-color-accent { + color: var(--pst-color-accent); +} + +.pst-color-info { + color: var(--pst-color-info); +} + +.pst-color-warning { + color: var(--pst-color-warning); +} + +.pst-color-success { + color: var(--pst-color-success); +} + +.pst-color-attention { + color: var(--pst-color-attention); +} + +.pst-color-danger { + color: var(--pst-color-danger); +} + +.pst-color-text-base { + color: var(--pst-color-text-base); +} + +.pst-color-text-muted { + color: var(--pst-color-text-muted); +} + +.pst-color-heading-color { + color: var(--pst-color-heading-color); +} + +.pst-color-shadow { + color: var(--pst-color-shadow); +} + +.pst-color-border { + color: var(--pst-color-border); +} + +.pst-color-border-muted { + color: var(--pst-color-border-muted); +} + +.pst-color-inline-code { + color: var(--pst-color-inline-code); +} + +.pst-color-inline-code-links { + color: var(--pst-color-inline-code-links); +} + +.pst-color-target { + color: var(--pst-color-target); +} + +.pst-color-background { + color: var(--pst-color-background); +} + +.pst-color-on-background { + color: var(--pst-color-on-background); +} + +.pst-color-surface { + color: var(--pst-color-surface); +} + +.pst-color-on-surface { + color: var(--pst-color-on-surface); +} + + + +/* Adjust the height of the navbar */ +.bd-header .bd-header__inner{ + height: 52px; /* Adjust this value as needed */ +} + +.navbar-nav > li > a { + line-height: 52px; /* Vertically center the navbar links */ +} + +/* Make sure the navbar items align properly */ +.navbar-nav { + display: flex; +} + + +.bd-header .navbar-header-items__start{ + margin-left: 0rem +} + +.bd-header button.primary-toggle { + margin-right: 0rem; +} + +.bd-header ul.navbar-nav .dropdown .dropdown-menu { + overflow-y: auto; /* Enable vertical scrolling */ + max-height: 80vh +} + +.bd-sidebar-primary { + width: 22%; /* Adjust this value to your preference */ + line-height: 1.4; +} + +.bd-sidebar-secondary { + line-height: 1.4; +} + +.toc-entry a.nav-link, .toc-entry a>code { + background-color: transparent; + border-color: transparent; +} + +.bd-sidebar-primary code{ + background-color: transparent; + border-color: transparent; +} + + +.toctree-wrapper li[class^=toctree-l1]>a { + font-size: 1.3em +} + +.toctree-wrapper li[class^=toctree-l1] { + margin-bottom: 2em; +} + +.toctree-wrapper li[class^=toctree-l]>ul { + margin-top: 0.5em; + font-size: 0.9em; +} + +*, :after, :before { + font-style: normal; +} + +div.deprecated { + margin-top: 0.5em; + margin-bottom: 2em; +} + +.admonition-beta.admonition, div.admonition-beta.admonition { + border-color: var(--pst-color-warning); + margin-top:0.5em; + margin-bottom: 2em; +} + +.admonition-beta>.admonition-title, div.admonition-beta>.admonition-title { + background-color: var(--pst-color-warning-bg); +} + +dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd { + margin-left: 1rem; +} + +p { + font-size: 0.9rem; + margin-bottom: 0.5rem; +} \ No newline at end of file diff --git a/docs/api_reference/_static/img/brand/favicon.png b/docs/api_reference/_static/img/brand/favicon.png new file mode 100644 index 00000000000..e0335bcb610 Binary files /dev/null and b/docs/api_reference/_static/img/brand/favicon.png differ diff --git a/docs/api_reference/_static/wordmark-api-dark.svg b/docs/api_reference/_static/wordmark-api-dark.svg new file mode 100644 index 00000000000..c33ec9253ca --- /dev/null +++ b/docs/api_reference/_static/wordmark-api-dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/api_reference/_static/wordmark-api.svg b/docs/api_reference/_static/wordmark-api.svg new file mode 100644 index 00000000000..a9f8f59dbcf --- /dev/null +++ b/docs/api_reference/_static/wordmark-api.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/api_reference/conf.py b/docs/api_reference/conf.py index da4bec30828..0ddf1ce8cf9 100644 --- a/docs/api_reference/conf.py +++ b/docs/api_reference/conf.py @@ -62,7 +62,7 @@ class ExampleLinksDirective(SphinxDirective): item_node.append(para_node) list_node.append(item_node) if list_node.children: - title_node = nodes.title() + title_node = nodes.rubric() title_node.append(nodes.Text(f"Examples using {class_or_func_name}")) return [title_node, list_node] return [list_node] @@ -75,7 +75,10 @@ class Beta(BaseAdmonition): def run(self): self.content = self.content or StringList( [ - "This feature is in beta. It is actively being worked on, so the API may change." + ( + "This feature is in beta. It is actively being worked on, so the " + "API may change." + ) ] ) self.arguments = self.arguments or ["Beta"] @@ -90,13 +93,10 @@ def setup(app): # -- Project information ----------------------------------------------------- project = "π¦π LangChain" -copyright = "2023, LangChain, Inc." -author = "LangChain, Inc." +copyright = "2023, LangChain Inc" +author = "LangChain, Inc" -version = data["tool"]["poetry"]["version"] -release = version - -html_title = project + " " + version +html_favicon = "_static/img/brand/favicon.png" html_last_updated_fmt = "%b %d, %Y" @@ -112,11 +112,13 @@ extensions = [ "sphinx.ext.napoleon", "sphinx.ext.viewcode", "sphinxcontrib.autodoc_pydantic", - "sphinx_copybutton", - "sphinx_panels", "IPython.sphinxext.ipython_console_highlighting", + "myst_parser", + "_extensions.gallery_directive", + "sphinx_design", + "sphinx_copybutton", ] -source_suffix = [".rst"] +source_suffix = [".rst", ".md"] # some autodoc pydantic options are repeated in the actual template. # potentially user error, but there may be bugs in the sphinx extension @@ -148,23 +150,84 @@ exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = "scikit-learn-modern" -html_theme_path = ["themes"] +# The theme to use for HTML and HTML Help pages. +html_theme = "pydata_sphinx_theme" -# redirects dictionary maps from old links to new links -html_additional_pages = {} -redirects = { - "index": "langchain_api_reference", +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +html_theme_options = { + # # -- General configuration ------------------------------------------------ + "sidebar_includehidden": True, + "use_edit_page_button": False, + # # "analytics": { + # # "plausible_analytics_domain": "scikit-learn.org", + # # "plausible_analytics_url": "https://views.scientific-python.org/js/script.js", + # # }, + # # If "prev-next" is included in article_footer_items, then setting show_prev_next + # # to True would repeat prev and next links. See + # # https://github.com/pydata/pydata-sphinx-theme/blob/b731dc230bc26a3d1d1bb039c56c977a9b3d25d8/src/pydata_sphinx_theme/theme/pydata_sphinx_theme/layout.html#L118-L129 + "show_prev_next": False, + "search_bar_text": "Search", + "navigation_with_keys": True, + "collapse_navigation": True, + "navigation_depth": 3, + "show_nav_level": 1, + "show_toc_level": 3, + "navbar_align": "left", + "header_links_before_dropdown": 5, + "header_dropdown_text": "Integrations", + "logo": { + "image_light": "_static/wordmark-api.svg", + "image_dark": "_static/wordmark-api-dark.svg", + }, + "surface_warnings": True, + # # -- Template placement in theme layouts ---------------------------------- + "navbar_start": ["navbar-logo"], + # # Note that the alignment of navbar_center is controlled by navbar_align + "navbar_center": ["navbar-nav"], + "navbar_end": ["langchain_docs", "theme-switcher", "navbar-icon-links"], + # # navbar_persistent is persistent right (even when on mobiles) + "navbar_persistent": ["search-field"], + "article_header_start": ["breadcrumbs"], + "article_header_end": [], + "article_footer_items": [], + "content_footer_items": [], + # # Use html_sidebars that map page patterns to list of sidebar templates + # "primary_sidebar_end": [], + "footer_start": ["copyright"], + "footer_center": [], + "footer_end": [], + # # When specified as a dictionary, the keys should follow glob-style patterns, as in + # # https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-exclude_patterns + # # In particular, "**" specifies the default for all pages + # # Use :html_theme.sidebar_secondary.remove: for file-wide removal + # "secondary_sidebar_items": {"**": ["page-toc", "sourcelink"]}, + # "show_version_warning_banner": True, + # "announcement": None, + "icon_links": [ + { + # Label for this link + "name": "GitHub", + # URL where the link will redirect + "url": "https://github.com/langchain-ai/langchain", # required + # Icon class (if "type": "fontawesome"), or path to local image (if "type": "local") + "icon": "fa-brands fa-square-github", + # The type of image to be used (see below for details) + "type": "fontawesome", + }, + { + "name": "X / Twitter", + "url": "https://twitter.com/langchainai", + "icon": "fab fa-twitter-square", + }, + ], + "icon_links_label": "Quick Links", + "external_links": [ + {"name": "Legacy reference", "url": "https://api.python.langchain.com/"}, + ], } -for old_link in redirects: - html_additional_pages[old_link] = "redirects.html" -partners_dir = Path(__file__).parent.parent.parent / "libs/partners" -partners = [ - (p.name, p.name.replace("-", "_") + "_api_reference") - for p in partners_dir.iterdir() -] -partners = sorted(partners) html_context = { "display_github": True, # Integrate GitHub @@ -172,8 +235,6 @@ html_context = { "github_repo": "langchain", # Repo name "github_version": "master", # Version "conf_py_path": "/docs/api_reference", # Path in the checkout to the docs root - "redirects": redirects, - "partners": partners, } # Add any paths that contain custom static files (such as style sheets) here, @@ -183,9 +244,7 @@ html_static_path = ["_static"] # These paths are either relative to html_static_path # or fully qualified paths (e.g. https://...) -html_css_files = [ - "css/custom.css", -] +html_css_files = ["css/custom.css"] html_use_index = False myst_enable_extensions = ["colon_fence"] @@ -202,3 +261,5 @@ html_baseurl = os.environ.get("READTHEDOCS_CANONICAL_URL", "") # Tell Jinja2 templates the build is running on Read the Docs if os.environ.get("READTHEDOCS", "") == "True": html_context["READTHEDOCS"] = True + +master_doc = "index" diff --git a/docs/api_reference/create_api_rst.py b/docs/api_reference/create_api_rst.py index 9e0f9bc2776..67ff02ea8cc 100644 --- a/docs/api_reference/create_api_rst.py +++ b/docs/api_reference/create_api_rst.py @@ -239,7 +239,7 @@ def _construct_doc( package_namespace: str, members_by_namespace: Dict[str, ModuleMembers], package_version: str, -) -> str: +) -> List[typing.Tuple[str, str]]: """Construct the contents of the reference.rst file for the given package. Args: @@ -251,15 +251,38 @@ def _construct_doc( Returns: The contents of the reference.rst file. """ - full_doc = f"""\ -======================= -``{package_namespace}`` {package_version} -======================= + docs = [] + index_doc = f"""\ +:html_theme.sidebar_secondary.remove: +.. currentmodule:: {package_namespace} + +.. _{package_namespace}: + +====================================== +{package_namespace.replace('_', '-')}: {package_version} +====================================== + +.. automodule:: {package_namespace} + :no-members: + :no-inherited-members: + +.. toctree:: + :hidden: + :maxdepth: 2 + +""" + index_autosummary = """ """ namespaces = sorted(members_by_namespace) for module in namespaces: + index_doc += f" {module}\n" + module_doc = f"""\ +.. currentmodule:: {package_namespace} + +.. _{module}: +""" _members = members_by_namespace[module] classes = [ el @@ -281,9 +304,9 @@ def _construct_doc( ] if not (classes or functions): continue - section = f":mod:`{package_namespace}.{module}`" + section = f":mod:`{module}`" underline = "=" * (len(section) + 1) - full_doc += f"""\ + module_doc += f""" {section} {underline} @@ -291,12 +314,19 @@ def _construct_doc( :no-members: :no-inherited-members: +""" + + index_autosummary += f""" +:ref:`{module}` +{'^' * (len(module) + 5)} + +.. autosummary:: """ if classes: - full_doc += f"""\ -Classes --------------- + module_doc += f"""\ +**Classes** + .. currentmodule:: {package_namespace} .. autosummary:: @@ -317,19 +347,22 @@ Classes else: template = "class.rst" - full_doc += f"""\ + module_doc += f"""\ :template: {template} {class_["qualified_name"]} +""" + index_autosummary += f""" + {class_['qualified_name']} """ if functions: _functions = [f["qualified_name"] for f in functions] fstring = "\n ".join(sorted(_functions)) - full_doc += f"""\ -Functions --------------- + module_doc += f"""\ +**Functions** + .. currentmodule:: {package_namespace} .. autosummary:: @@ -340,9 +373,8 @@ Functions """ if deprecated_classes: - full_doc += f"""\ -Deprecated classes --------------- + module_doc += f"""\ +**Deprecated classes** .. currentmodule:: {package_namespace} @@ -364,7 +396,7 @@ Deprecated classes else: template = "class.rst" - full_doc += f"""\ + module_doc += f"""\ :template: {template} {class_["qualified_name"]} @@ -374,9 +406,8 @@ Deprecated classes if deprecated_functions: _functions = [f["qualified_name"] for f in deprecated_functions] fstring = "\n ".join(sorted(_functions)) - full_doc += f"""\ -Deprecated functions --------------- + module_doc += f"""\ +**Deprecated functions** .. currentmodule:: {package_namespace} @@ -387,7 +418,10 @@ Deprecated functions {fstring} """ - return full_doc + docs.append((f"{module}.rst", module_doc)) + docs.append(("index.rst", index_doc + index_autosummary)) + + return docs def _build_rst_file(package_name: str = "langchain") -> None: @@ -399,13 +433,14 @@ def _build_rst_file(package_name: str = "langchain") -> None: package_dir = _package_dir(package_name) package_members = _load_package_modules(package_dir) package_version = _get_package_version(package_dir) - with open(_out_file_path(package_name), "w") as f: - f.write( - _doc_first_line(package_name) - + _construct_doc( - _package_namespace(package_name), package_members, package_version - ) - ) + output_dir = _out_file_path(package_name) + os.mkdir(output_dir) + rsts = _construct_doc( + _package_namespace(package_name), package_members, package_version + ) + for name, rst in rsts: + with open(output_dir / name, "w") as f: + f.write(rst) def _package_namespace(package_name: str) -> str: @@ -455,12 +490,117 @@ def _get_package_version(package_dir: Path) -> str: def _out_file_path(package_name: str) -> Path: """Return the path to the file containing the documentation.""" - return HERE / f"{package_name.replace('-', '_')}_api_reference.rst" + return HERE / f"{package_name.replace('-', '_')}" -def _doc_first_line(package_name: str) -> str: - """Return the path to the file containing the documentation.""" - return f".. {package_name.replace('-', '_')}_api_reference:\n\n" +def _build_index(dirs: List[str]) -> None: + custom_names = { + "airbyte": "Airbyte", + "aws": "AWS", + "ai21": "AI21", + } + ordered = ["core", "langchain", "text-splitters", "community", "experimental"] + main_ = [dir_ for dir_ in ordered if dir_ in dirs] + integrations = sorted(dir_ for dir_ in dirs if dir_ not in main_) + main_headers = [ + " ".join(custom_names.get(x, x.title()) for x in dir_.split("-")) + for dir_ in main_ + ] + integration_headers = [ + " ".join( + custom_names.get(x, x.title().replace("ai", "AI").replace("db", "DB")) + for x in dir_.split("-") + ) + for dir_ in integrations + ] + main_tree = "\n".join( + f"{header_name}<{dir_.replace('-', '_')}/index>" + for header_name, dir_ in zip(main_headers, main_) + ) + main_grid = "\n".join( + f'- header: "**{header_name}**"\n content: "{_package_namespace(dir_).replace("_", "-")}: {_get_package_version(_package_dir(dir_))}"\n link: {dir_.replace("-", "_")}/index.html' + for header_name, dir_ in zip(main_headers, main_) + ) + integration_tree = "\n".join( + f"{header_name}<{dir_.replace('-', '_')}/index>" + for header_name, dir_ in zip(integration_headers, integrations) + ) + + integration_grid = "" + integrations_to_show = [ + "openai", + "anthropic", + "google-vertexai", + "aws", + "huggingface", + "mistralai", + ] + for header_name, dir_ in sorted( + zip(integration_headers, integrations), + key=lambda h_d: integrations_to_show.index(h_d[1]) + if h_d[1] in integrations_to_show + else len(integrations_to_show), + )[: len(integrations_to_show)]: + integration_grid += f'\n- header: "**{header_name}**"\n content: {_package_namespace(dir_).replace("_", "-")} {_get_package_version(_package_dir(dir_))}\n link: {dir_.replace("-", "_")}/index.html' + doc = f"""# LangChain Python API Reference + +Welcome to the LangChain Python API reference. This is a reference for all +`langchain-x` packages. + +For user guides see [https://python.langchain.com](https://python.langchain.com). + +For the legacy API reference hosted on ReadTheDocs see [https://api.python.langchain.com/](https://api.python.langchain.com/). + +## Base packages + +```{{gallery-grid}} +:grid-columns: "1 2 2 3" + +{main_grid} +``` + +```{{toctree}} +:maxdepth: 2 +:hidden: +:caption: Base packages + +{main_tree} +``` + +## Integrations + +```{{gallery-grid}} +:grid-columns: "1 2 2 3" + +{integration_grid} +``` + +See the full list of integrations in the Section Navigation. + +```{{toctree}} +:maxdepth: 2 +:hidden: +:caption: Integrations + +{integration_tree} +``` + +""" + with open(HERE / "reference.md", "w") as f: + f.write(doc) + + dummy_index = """\ +# API reference + +```{toctree} +:maxdepth: 3 +:hidden: + +Reference +``` +""" + with open(HERE / "index.md", "w") as f: + f.write(dummy_index) def main(dirs: Optional[list] = None) -> None: @@ -488,6 +628,8 @@ def main(dirs: Optional[list] = None) -> None: else: print("Building package:", dir_) _build_rst_file(package_name=dir_) + + _build_index(dirs) print("API reference files built.") diff --git a/docs/api_reference/index.rst b/docs/api_reference/index.rst deleted file mode 100644 index 5efdf7ee10a..00000000000 --- a/docs/api_reference/index.rst +++ /dev/null @@ -1,8 +0,0 @@ -============= -LangChain API -============= - -.. toctree:: - :maxdepth: 2 - - api_reference.rst diff --git a/docs/api_reference/requirements.txt b/docs/api_reference/requirements.txt index 9132e119aef..1d7a22e15ea 100644 --- a/docs/api_reference/requirements.txt +++ b/docs/api_reference/requirements.txt @@ -1,17 +1,11 @@ --e libs/experimental --e libs/langchain --e libs/core --e libs/community -pydantic<2 -autodoc_pydantic==1.8.0 -myst_parser -nbsphinx==0.8.9 -sphinx>=5 -sphinx-autobuild==2021.3.14 -sphinx_rtd_theme==1.0.0 -sphinx-typlog-theme==0.8.0 -sphinx-panels -toml -myst_nb -sphinx_copybutton -pydata-sphinx-theme==0.13.1 \ No newline at end of file +autodoc_pydantic>=1,<2 +sphinx<=7 +myst-parser>=3 +sphinx-autobuild>=2024 +pydata-sphinx-theme>=0.15 +toml>=0.10.2 +myst-nb>=1.1.1 +pyyaml +sphinx-design +sphinx-copybutton +beautifulsoup4 \ No newline at end of file diff --git a/docs/api_reference/scripts/custom_formatter.py b/docs/api_reference/scripts/custom_formatter.py new file mode 100644 index 00000000000..d8efb5e558d --- /dev/null +++ b/docs/api_reference/scripts/custom_formatter.py @@ -0,0 +1,41 @@ +import sys +from glob import glob +from pathlib import Path + +from bs4 import BeautifulSoup + +CUR_DIR = Path(__file__).parents[1] + + +def process_toc_h3_elements(html_content: str) -> str: + """Update Class.method() TOC headers to just method().""" + # Create a BeautifulSoup object + soup = BeautifulSoup(html_content, "html.parser") + + # Find all elements with class "toc-h3" + toc_h3_elements = soup.find_all("li", class_="toc-h3") + + # Process each element + for element in toc_h3_elements: + element = element.a.code.span + # Get the text content of the element + content = element.get_text() + + # Apply the regex substitution + modified_content = content.split(".")[-1] + + # Update the element's content + element.string = modified_content + + # Return the modified HTML + return str(soup) + + +if __name__ == "__main__": + dir = sys.argv[1] + for fn in glob(str(f"{dir.rstrip('/')}/**/*.html"), recursive=True): + with open(fn, "r") as f: + html = f.read() + processed_html = process_toc_h3_elements(html) + with open(fn, "w") as f: + f.write(processed_html) diff --git a/docs/api_reference/templates/class.rst b/docs/api_reference/templates/class.rst index 15046e27028..b023d7733b0 100644 --- a/docs/api_reference/templates/class.rst +++ b/docs/api_reference/templates/class.rst @@ -1,4 +1,4 @@ -:mod:`{{module}}`.{{objname}} +{{ objname }} {{ underline }}============== .. currentmodule:: {{ module }} @@ -11,7 +11,7 @@ .. autosummary:: {% for item in attributes %} - ~{{ name }}.{{ item }} + ~{{ item }} {%- endfor %} {% endif %} {% endblock %} @@ -22,11 +22,11 @@ .. autosummary:: {% for item in methods %} - ~{{ name }}.{{ item }} + ~{{ item }} {%- endfor %} {% for item in methods %} - .. automethod:: {{ name }}.{{ item }} + .. automethod:: {{ item }} {%- endfor %} {% endif %} diff --git a/docs/api_reference/templates/enum.rst b/docs/api_reference/templates/enum.rst index 8e73173d3b5..e53feddacfb 100644 --- a/docs/api_reference/templates/enum.rst +++ b/docs/api_reference/templates/enum.rst @@ -1,4 +1,4 @@ -:mod:`{{module}}`.{{objname}} +{{ objname }} {{ underline }}============== .. currentmodule:: {{ module }} diff --git a/docs/api_reference/templates/function.rst b/docs/api_reference/templates/function.rst index 804cbc4b1fd..52e0bb6b3bb 100644 --- a/docs/api_reference/templates/function.rst +++ b/docs/api_reference/templates/function.rst @@ -1,4 +1,4 @@ -:mod:`{{module}}`.{{objname}} +{{ objname }} {{ underline }}============== .. currentmodule:: {{ module }} diff --git a/docs/api_reference/templates/langchain_docs.html b/docs/api_reference/templates/langchain_docs.html new file mode 100644 index 00000000000..774761c97d1 --- /dev/null +++ b/docs/api_reference/templates/langchain_docs.html @@ -0,0 +1,12 @@ + + + + + +Docs + diff --git a/docs/api_reference/templates/pydantic.rst b/docs/api_reference/templates/pydantic.rst index 2c447ea110b..fdb7a940e3a 100644 --- a/docs/api_reference/templates/pydantic.rst +++ b/docs/api_reference/templates/pydantic.rst @@ -1,4 +1,4 @@ -:mod:`{{module}}`.{{objname}} +{{ objname }} {{ underline }}============== .. currentmodule:: {{ module }} diff --git a/docs/api_reference/templates/runnable_non_pydantic.rst b/docs/api_reference/templates/runnable_non_pydantic.rst index e234e4cb391..2165e1d6ad3 100644 --- a/docs/api_reference/templates/runnable_non_pydantic.rst +++ b/docs/api_reference/templates/runnable_non_pydantic.rst @@ -1,21 +1,21 @@ -:mod:`{{module}}`.{{objname}} +{{ objname }} {{ underline }}============== -.. NOTE:: {{objname}} implements the standard :py:class:`Runnable Interface `. π - - The :py:class:`Runnable Interface ` has additional methods that are available on runnables, such as :py:meth:`with_types `, :py:meth:`with_retry `, :py:meth:`assign `, :py:meth:`bind `, :py:meth:`get_graph `, and more. - .. currentmodule:: {{ module }} .. autoclass:: {{ objname }} +.. NOTE:: {{objname}} implements the standard :py:class:`Runnable Interface `. π + + The :py:class:`Runnable Interface ` has additional methods that are available on runnables, such as :py:meth:`with_types `, :py:meth:`with_retry `, :py:meth:`assign `, :py:meth:`bind `, :py:meth:`get_graph `, and more. + {% block attributes %} {% if attributes %} .. rubric:: {{ _('Attributes') }} .. autosummary:: {% for item in attributes %} - ~{{ name }}.{{ item }} + ~{{ item }} {%- endfor %} {% endif %} {% endblock %} @@ -26,11 +26,11 @@ .. autosummary:: {% for item in methods %} - ~{{ name }}.{{ item }} + ~{{ item }} {%- endfor %} {% for item in methods %} - .. automethod:: {{ name }}.{{ item }} + .. automethod:: {{ item }} {%- endfor %} {% endif %} diff --git a/docs/api_reference/templates/runnable_pydantic.rst b/docs/api_reference/templates/runnable_pydantic.rst index a6718913f39..19a83461614 100644 --- a/docs/api_reference/templates/runnable_pydantic.rst +++ b/docs/api_reference/templates/runnable_pydantic.rst @@ -1,10 +1,6 @@ -:mod:`{{module}}`.{{objname}} +{{ objname }} {{ underline }}============== -.. NOTE:: {{objname}} implements the standard :py:class:`Runnable Interface `. π - - The :py:class:`Runnable Interface ` has additional methods that are available on runnables, such as :py:meth:`with_types `, :py:meth:`with_retry `, :py:meth:`assign `, :py:meth:`bind `, :py:meth:`get_graph `, and more. - .. currentmodule:: {{ module }} .. autopydantic_model:: {{ objname }} @@ -19,6 +15,10 @@ :member-order: groupwise :show-inheritance: True :special-members: __call__ - :exclude-members: construct, copy, dict, from_orm, parse_file, parse_obj, parse_raw, schema, schema_json, update_forward_refs, validate, json, is_lc_serializable, to_json_not_implemented, lc_secrets, lc_attributes, lc_id, get_lc_namespace, astream_log, transform, atransform, get_output_schema, get_prompts, config_schema, map, pick, pipe, with_listeners, with_alisteners, with_config, with_fallbacks, with_types, with_retry, InputType, OutputType, config_specs, output_schema, get_input_schema, get_graph, get_name, input_schema, name, bind, assign + :exclude-members: construct, copy, dict, from_orm, parse_file, parse_obj, parse_raw, schema, schema_json, update_forward_refs, validate, json, is_lc_serializable, to_json_not_implemented, lc_secrets, lc_attributes, lc_id, get_lc_namespace, astream_log, transform, atransform, get_output_schema, get_prompts, config_schema, map, pick, pipe, with_listeners, with_alisteners, with_config, with_fallbacks, with_types, with_retry, InputType, OutputType, config_specs, output_schema, get_input_schema, get_graph, get_name, input_schema, name, bind, assign, as_tool + + .. NOTE:: {{objname}} implements the standard :py:class:`Runnable Interface `. π + + The :py:class:`Runnable Interface ` has additional methods that are available on runnables, such as :py:meth:`with_types `, :py:meth:`with_retry `, :py:meth:`assign `, :py:meth:`bind `, :py:meth:`get_graph `, and more. .. example_links:: {{ objname }} diff --git a/docs/api_reference/templates/typeddict.rst b/docs/api_reference/templates/typeddict.rst index ab075b6cb41..4cf3ce01e60 100644 --- a/docs/api_reference/templates/typeddict.rst +++ b/docs/api_reference/templates/typeddict.rst @@ -1,4 +1,4 @@ -:mod:`{{module}}`.{{objname}} +{{ objname }} {{ underline }}============== .. currentmodule:: {{ module }} diff --git a/docs/api_reference/themes/COPYRIGHT.txt b/docs/api_reference/themes/COPYRIGHT.txt deleted file mode 100644 index d4cc36d6b27..00000000000 --- a/docs/api_reference/themes/COPYRIGHT.txt +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2007-2023 The scikit-learn developers. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/docs/api_reference/themes/scikit-learn-modern/javascript.html b/docs/api_reference/themes/scikit-learn-modern/javascript.html deleted file mode 100644 index 15f2ff64956..00000000000 --- a/docs/api_reference/themes/scikit-learn-modern/javascript.html +++ /dev/null @@ -1,67 +0,0 @@ - -{%- if pagename != 'index' and pagename != 'documentation' %} - {% if theme_mathjax_path %} - - {% endif %} -{%- endif %} diff --git a/docs/api_reference/themes/scikit-learn-modern/layout.html b/docs/api_reference/themes/scikit-learn-modern/layout.html deleted file mode 100644 index e0214642d35..00000000000 --- a/docs/api_reference/themes/scikit-learn-modern/layout.html +++ /dev/null @@ -1,132 +0,0 @@ -{# TEMPLATE VAR SETTINGS #} -{%- set url_root = pathto('', 1) %} -{%- if url_root == '#' %}{% set url_root = '' %}{% endif %} -{%- if not embedded and docstitle %} - {%- set titlesuffix = " — "|safe + docstitle|e %} -{%- else %} - {%- set titlesuffix = "" %} -{%- endif %} -{%- set lang_attr = 'en' %} - - - - - - - - {{ metatags }} - - - {% block htmltitle %} - {{ title|striptags|e }}{{ titlesuffix }} - {% endblock %} - - - {% if favicon_url %} - - {% endif %} - - - {%- for css in css_files %} - {%- if css|attr("rel") %} - - {%- else %} - - {%- endif %} - {%- endfor %} - - - - {%- block extrahead %} {% endblock %} - - -{% include "nav.html" %} -{%- block content %} - - - Toggle Menu - - - {%- if meta and meta['parenttoc']|tobool %} - - {% set nav = get_nav_object(maxdepth=3, collapse=True, numbered=True) %} - - {% for main_nav_item in nav %} - {% if main_nav_item.active %} - - {{ main_nav_item.title }} - - - {% for nav_item in main_nav_item.children %} - - {{ nav_item.title }} - {% if nav_item.children %} - - {% for inner_child in nav_item.children %} - - {{ inner_child.title }} - - {% endfor %} - - {% endif %} - - {% endfor %} - - {% endif %} - {% endfor %} - - - {%- elif meta and meta['globalsidebartoc']|tobool %} - - {{ toctree(maxdepth=2, titles_only=True) }} - - {%- else %} - - {{ toc }} - - {%- endif %} - - - - - {% block body %}{% endblock %} - - - - - - -{%- endblock %} - -{% include "javascript.html" %} - - diff --git a/docs/api_reference/themes/scikit-learn-modern/nav.html b/docs/api_reference/themes/scikit-learn-modern/nav.html deleted file mode 100644 index 87c7b1dd76d..00000000000 --- a/docs/api_reference/themes/scikit-learn-modern/nav.html +++ /dev/null @@ -1,78 +0,0 @@ -{%- if pagename != 'index' and pagename != 'documentation' %} - {%- set nav_bar_class = "sk-docs-navbar" %} - {%- set top_container_cls = "sk-docs-container" %} -{%- else %} - {%- set nav_bar_class = "sk-landing-navbar" %} - {%- set top_container_cls = "sk-landing-container" %} -{%- endif %} - - - - {%- if logo_url %} - - - - {%- endif %} - - - - - - - - LangChain - - - Core - - - Community - - - Experimental - - - Text splitters - - {%- for title, pathname in partners %} - - {{ title }} - - {%- endfor %} - - Partner libs - - {%- for title, pathname in partners %} - {{ title }} - {%- endfor %} - - - - Docs - - - {%- if pagename != "search"%} - - - - - - - - - {%- endif %} - - - diff --git a/docs/api_reference/themes/scikit-learn-modern/search.html b/docs/api_reference/themes/scikit-learn-modern/search.html deleted file mode 100644 index 2c9f40f15a6..00000000000 --- a/docs/api_reference/themes/scikit-learn-modern/search.html +++ /dev/null @@ -1,16 +0,0 @@ -{%- extends "basic/search.html" %} -{% block extrahead %} - - - - - - - -{% endblock %} diff --git a/docs/api_reference/themes/scikit-learn-modern/static/css/theme.css b/docs/api_reference/themes/scikit-learn-modern/static/css/theme.css deleted file mode 100644 index 2fbbee2cb84..00000000000 --- a/docs/api_reference/themes/scikit-learn-modern/static/css/theme.css +++ /dev/null @@ -1,1431 +0,0 @@ -/* Elements */ -a { - color: #2878A2; - word-wrap: break-word; -} - -a:focus { - outline: none; -} - -/* Anchor links */ - -a.headerlink { - color: #c60f0f; - font-size: 0.8em; - padding: 0 4px 0 4px; - text-decoration: none; - visibility: hidden; -} - -a.headerlink:hover { - background-color: #c60f0f; - color: white; -} - -p { - word-break: break-word; - hyphens: auto; -} - -input:focus { - outline: none; -} - -code { - color: #222; - background-color: #ecf0f3; - border-radius: 0.2rem; - padding: 0.15rem; - word-break: normal; -} - -nav { - z-index: 3; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -h4 .section-number, h5 .section-number, h6 .section-number { - display: none; -} - -h1:hover a.headerlink, -h2:hover a.headerlink, -h3:hover a.headerlink, -h4:hover a.headerlink, -h5:hover a.headerlink, -h6:hover a.headerlink, -dt:hover a.headerlink { - visibility: visible; -} - -strong { - font-weight: bold; -} - -a code { - color: inherit; -} - -a code { - background-color: transparent; - font-weight: bold; - color: #2878A2; - border-radius: 0; - padding: 0; - white-space: nowrap; -} - -img { - max-width: 100%; -} - -span.highlighted { - background-color: #fbe54e; -} - -div.highlight { - border: 1px solid #ddd; - margin-bottom: 1rem; -} - -div.highlight pre { - padding: 0.2rem 0.5rem; - margin-bottom: 0; - line-height: 1.2rem; -} - -div.highlight a { - text-decoration: underline; -} - -.versionmodified { - font-style: italic; -} - -a.sk-landing-btn { - background-color: #ff9c34; - color: black; - cursor: pointer; - font-size: 1.1rem; - font-weight: 500; -} - -a.sk-landing-btn:hover { - background-color: #45bf7b; -} - -.sk-donate-btn { - cursor: pointer; -} - -.sk-page-content div.logo { - float: left; - width: 200px; -} - -@media screen and (min-width: 992px) { - .sk-page-content { - padding-left: 2rem!important; - padding-right: 2rem!important; - } -} - -@media screen and (min-width: 1200px) { - .sk-px-xl-4 { - padding-left: 1.3rem!important; - padding-right: 1.3rem!important; - } -} - -/* clearfix */ - -div.clearer { - clear: both; -} - -/* details / summary */ - -div.sk-page-content details { - margin: 4ex 0pt; -} - -div.sk-page-content summary.btn { - display: list-item; - padding: 6px 20px; - border: 1pt solid #999; -} - -div.sk-page-content details div.card { - padding: 0pt .5ex; - margin: 1ex 0pt; - border: 1px solid #e9ecef; - border-left-width: .25rem; - border-radius: .25rem; - background: rgb(250, 252, 253) -} - -div.sk-page-content summary { - position: relative; /* Needed for the tooltips */ -} - -div.sk-page-content summary .tooltiptext { - visibility: hidden; - width: 120px; - background-color: black; - color: #fff; - text-align: center; - border-radius: 6px; - padding: 5px 0; - position: absolute; - z-index: 1; - bottom: 150%; - left: 50%; - margin-left: -60px; -} - -div.sk-page-content summary .tooltiptext::after { - content: ""; - position: absolute; - top: 100%; - left: 50%; - margin-left: -5px; - border-width: 5px; - border-style: solid; - border-color: black transparent transparent transparent; -} - -div.sk-page-content summary:hover .tooltiptext { - visibility: visible; -} - -/* Button */ - -.sk-btn-primary { - background-color: #30799C; - border-color: #30799C; - color: white; -} - -.sk-btn-primary:hover, -.sk-btn-primary:active { - background-color: #3499cd; - border-color: #3499cd; -} - -/* Quote */ - -.quote { - text-align: right; - line-height: 1.5em; - font-style: italic; - margin: 2em 3em 1em 3em; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -/* Search */ - -#search-results { - margin-top: 1rem; -} - -#searchbox { - padding-top: 0.1rem; -} - -.sk-search-text-input { - width: 12rem; -} - -.sk-search-text-btn { - padding-left: 0.2rem; - padding-right: 0.2rem; -} - -ul.search li div.context { - color: #888; - margin: 0.1rem 0 0 0; - text-align: left; -} - -@media screen and (min-width: 768px) { - ul.search li div.context { - margin-left: 1rem; - } - - .sk-search-text-input { - width: 5rem; - } -} - -@media screen and (min-width: 806px) { - .sk-search-text-input { - width: 7rem; - } -} - -@media screen and (min-width: 820px) { - .sk-search-text-input { - width: 8rem; - } -} - -@media screen and (min-width: 886px) { - .sk-search-text-input { - width: 12rem; - } -} - -ul.search li a { - font-weight: bold; -} -/* navbar */ - -img.sk-brand-img { - height: 48px; -} - -.navbar-light .navbar-nav a.nav-link, a.sk-dropdown-item { - color: rgba(77, 77, 77, 1); - font-weight: 500; -} - -.navbar-light .navbar-nav a.nav-link:hover, a.sk-dropdown-item:hover { - color: rgba(246, 126, 0, 1); -} - -a.sk-nav-dropdown-item:active { - color: white; - background-color: rgba(246, 126, 0, 1); -} - -.nav-more-item-mobile-items { - display: inherit; -} - -.nav-more-item-dropdown { - display: none; -} - -@media screen and (min-width: 768px) { - .nav-more-item-dropdown { - display: inherit; - } - - .nav-more-item-mobile-items { - display: none; - } -} -/* LANDING PAGE STYLE */ - -div.sk-landing-container { - max-width: 1400px; -} - -div.sk-landing-container .text-white { - text-shadow: 0px 0px 8px rgb(42, 98, 128); -} - -ul.sk-landing-header-body { - margin-top: auto; - margin-bottom: auto; - font-size: 1.2rem; - font-weight: 500; -} - -div.sk-landing-bg-more-info dd { - padding-left: 0; -} - -div.sk-landing-bg { - background-image: linear-gradient(160deg, rgba(42,98,128,1) 0%, rgba(52,153,205,1) 17%, rgba(255,243,211,1) 59%, rgba(255,178,96,1) 100%); -} - -div.sk-landing-bg-more-info { - background-color: #f8f8f8; - font-size: 0.96rem; -} - -.sk-card-title { - font-weight: 700; -} - -.sk-landing-header { - font-size: 3.2rem; -} - -.sk-landing-subheader { - letter-spacing: 0.17rem; -} - -.sk-landing-call-header { - color: #E07200; - font-weight: 700; -} - -img.sk-index-img { - max-height: 240px; - margin: auto; - margin-bottom: 1em; - width: auto; -} - -@media screen and (min-width: 768px) { - img.sk-index-img { - width: 100% - } -} - -img.sk-who-uses-carousel-img { - max-height: 100px; - max-width: 50%; -} - -div#carouselExampleSlidesOnly { - min-height: 200px; -} - -ul.sk-landing-call-list li { - margin-bottom: 0.25rem; -} - -img.sk-footer-funding-logo { - max-height: 36px; - max-width: 80px; - margin: 0 8px; - margin-bottom: 8px; -} - -a.sk-footer-funding-link:hover { - text-decoration: none; -} -/* DOCS STYLE */ - -.navbar > .sk-docs-container { - max-width: 1400px; - margin: 0 auto; -} - -#sk-sidebar-wrapper { - height: 100%; - overflow-y: hidden; - overflow-x: hidden; - position: fixed; - margin-left: -240px; - width: 240px; - -webkit-transition: margin 0.25s ease-out, opacity 0.25s ease-out; - -moz-transition: margin 0.25s ease-out, opacity 0.25s ease-out; - -o-transition: margin 0.25s ease-out, opacity 0.25s ease-out; - transition: margin 0.25s ease-out, opacity 0.25s ease-out; - background-color: white; - opacity: 0; - top: 0; - padding: 0 0.5rem 0.5rem 0.5rem; - z-index: 2; -} - -#sk-toggle-checkbox { - display: none; -} - -#sk-toggle-checkbox:checked ~ #sk-sidebar-wrapper { - margin-left: 0; - opacity: 1; -} - -#sk-doc-wrapper { - max-width: 1400px; - margin: 0 auto; -} - -#sk-page-content-wrapper { - width: 100%; -} - -/* Enables section links to be visible when anchor-linked */ -section[id]::before { - display: block; - height: 52px; - margin-top: -52px; - visibility: hidden; - content: ""; -} - -div.sk-page-content { - background-color: white; - position: relative; - margin-top: 0.5rem; -} - -div.sk-page-content { - table-layout: fixed; - max-width: 100%; -} - -div.section h2, -div.section h3, -div.section h4, -div.section h5, -div.section h6 { - margin-top: 1rem; -} - -.sk-btn-toggle-toc { - position: fixed; - bottom: 0; - margin: 0; - border-radius: 0; - border-top-right-radius: 0.5rem; - z-index: 3; - cursor: pointer; -} - -div.sk-page-content { - margin-top: 52px; -} - -@media screen and (min-width: 1400px) { - .sk-btn-toggle-toc { - border-top-left-radius: 0.5rem; - } -} - -.sk-btn-toggle-toc:hover { - color: white; - background-color: #297ca7; -} - -footer.sk-content-footer { - padding: 1rem 0; - color: #999; - text-align: right; -} - -nav.sk-docs-navbar { - width: 100%; - z-index: 3; - -webkit-transition: top .2s ease-in-out; - -moz-transition: top .2s ease-in-out .05s; - -o-transition: top .2s ease-in-out .05s; - transition: top .2s ease-in-out .05s; - position: fixed; - max-height: 100vh; - overflow-y: auto; - align-items: initial; -} - -div.sk-navbar-collapse { - padding-bottom: 4rem; -} - -@media screen and (min-width: 768px) { - - nav.sk-docs-navbar { - overflow-y: visible; - max-height: none; - } - - div.sk-navbar-collapse { - padding-bottom: 0; - } - - #sk-page-content-wrapper { - padding-left: 240px; - max-width: 1240px; - margin-left: auto; - margin-right: auto; - } - - #sk-sidebar-wrapper { - margin-left: 0; - opacity: 1; - } - - #sk-toggle-checkbox:checked ~ #sk-sidebar-wrapper { - margin-left: -240px; - opacity: 0; - } - - #sk-toggle-checkbox:checked ~ #sk-page-content-wrapper { - padding-left: 0; - margin-left: auto; - margin-right: auto; - } -} - -.centered { - text-align: center; -} - -dl.citation > dd > ol > li { - display: inline; -} - -dl.citation > dd > ol { - margin-bottom: 0; -} - -/* docs index */ - -div.sk-documentation-index-card { - border-left: 0.15rem solid #ff9c34; -} -div.sk-documentation-index-card:hover { - box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); -} - -a.sk-documentation-index-anchor:hover { - text-decoration: none; - color: #2878A2; -} - -.sk-documentation-index-header { - background-color: #cde8ef; - padding: 0.5rem; - border-radius: 0 1rem; - text-align: center; - font-size: 2rem; - font-weight: 500; -} - -/* toc */ - -.sk-toc-active { - font-weight: bold; -} - -div.sk-sidebar-toc-wrapper { - font-size: 0.9rem; - width: 252px; - overflow-x: hidden; - overflow-y: scroll; - height: 100vh; - padding-right: 1.75rem; - padding-top: 52px; - - /* Hide scrollbar for IE and Edge */ - -ms-overflow-style: none; - - /* Hide scrollbar for Firefox */ - scrollbar-width: none; -} - -div.sk-sidebar-toc-wrapper::-webkit-scrollbar { - display: none; -} - -div.sk-sidebar-toc-wrapper::after { - display: block; - content: ""; - height: 3rem; - visibility: hidden; -} - -div.sk-sidebar-toc > ul > li > a{ - font-weight: bold; -} - -div.sk-sidebar-toc > ul, -div.sk-sidebar-toc ul ul { - list-style: none; - margin-left: 0; - padding-left: 0; -} - -div.sk-sidebar-toc ul ul ul { - margin-left: 1rem; -} - - -div.sk-sidebar-toc ul li ul li ul{ - display: none; -} - -div.sk-sidebar-toc span { - white-space: pre; -} - -div.sk-sidebar-global-toc ul ul { - padding-left: 0.75rem; -} -/* content styling element style */ - -div.sk-page-content h1 { - background-color: #cde8ef; - padding: 0.5rem; - margin-top: calc(max(2.5rem, 1vh)); - border-radius: 0 1rem; - text-align: center; - font-size: 2rem; - word-wrap: break-word; -} - -div.sk-page-content h2 { - padding: 0.5rem; - background-color: #BED4EB; - border-radius: 0.3rem; - font-size: 1.5rem; - margin-top: calc(max(2rem, .7vh)); - margin-bottom: 1rem; - word-wrap: break-word; -} - -div.sk-page-content h3 { - padding: 0.3rem; - background-color: #eee; - border-radius: 0.3rem; - font-size: 1.2rem; - word-wrap: break-word; - margin-top: 1.5rem; -} - -div.sk-page-content h4 { - padding: 0.2rem; - background-color: #F4F4F4; - border-radius: 0.3rem; - font-size: 1.2rem; - word-wrap: break-word; -} - -div.sk-page-content h1 code, -div.sk-page-content h2 code, -div.sk-page-content h3 code, -div.sk-page-content h4 code { - white-space: normal; -} - -/* longtables */ - -table.longtable p { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; - line-height: 1.1em; - margin-bottom: 0; -} - -table.longtable td, table.longtable th { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - padding-right: 0.5rem; - white-space:nowrap; -} - -table.longtable tr.row-odd { - background-color: #F0F7FA; -} - -/* api docs */ - -.class > dt, .function > dt, .method > dt { - padding: 0.5rem; - background-color: #f8f8f8; - font-weight: normal; - border: 1px solid rgba(0, 0, 0, 0.125); - border-left: 2px solid #ff9c34; - overflow: auto; - margin-bottom: 1rem; -} - -.class > dt::after, .function > dt::after, .method > dt::after { - overflow: auto; -} - -span.descname { - font-weight: bold; - background-color: transparent; - padding: 0; - font-family: monospace; - font-size: 1.2rem; -} - -em.property { - font-weight: normal; -} - -span.descclassname { - background-color: transparent; - font-family: monospace; -} - -.viewcode-link { - float: right; -} - -dl.field-list { - display: flex; - flex-wrap: wrap; - overflow-x: scroll; -} - -dl.field-list > dt { - flex-basis: 100%; - font-weight: bold; - word-break: break-word; -} - -dl.field-list > dd { - flex-basis: 100%; - margin-bottom: 0; -} - -@media screen and (min-width: 768px) { - dl.field-list > dt { - flex-basis: 110px; - } - dl.field-list > dd { - flex: 1 0 calc(100% - 110px); - max-width: calc(100% - 110px); - } - -} - -dt.field-odd, dt.field-even { - background-color: #F0F7FA; - padding-left: 0.25rem; -} - -.field-odd, .field-even { - margin-top: 0; - border-bottom: 1px solid #ddd; - border-top: 1px solid #ddd; - box-sizing: border-box; -} - -.classifier { - font-style: italic; -} - -.classifier::before { - font-style: normal; - margin: 0 0.3em; - content: ":"; - display: inline-block; -} - -dd { - padding-left: 1rem; -} - -dl.class > dd { - padding-left: 0; -} - -@media screen and (min-width: 768px) { - dl.class > dd { - padding-left: 1rem; - } -} - -.rubric { - font-weight: bold; - margin-top: 1rem; -} - -ul.simple li p, ol.simple li p { - margin-bottom: 0; -} - -ul.simple, ol.simple { - padding-left: 1.5rem; -} - -/* info boxes */ - -div.topic { - padding: 0.5rem; - background-color: #eee; - margin-bottom: 1rem; - border-radius: 0.25rem; - border: 1px solid #CCC; -} - -div.topic p { - margin-bottom: 0.25rem; -} - -div.topic dd { - margin-bottom: 0.25rem; -} - -p.topic-title { - font-weight: bold; - margin-bottom: 0.5rem; -} - -div.topic > ul.simple { - margin-bottom: 0.25rem; -} - -p.admonition-title { - margin-right: 0.5rem; - font-weight: bold; - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -div.admonition p.admonition-title + p, div.deprecated p { - display: inline; -} - -div.admonition, div.deprecated, -div.versionchanged { - margin-top: 0.5rem; - padding: 0.5rem; - border-radius: 0.5rem; - margin-bottom: 0.5rem; - border: 1px solid #ddd; -} - -div.versionadded { - margin: 1rem 0; -} - -div.admonition { - background-color: #eee; -} - -div.admonition-beta { - color: #d35400; /* A darker rich orange color */ - background-color: #FDF2E9; /* A light orange-tinted background color */ - border-color: #E59866; /* A darker soft orange border color */ -} - - -div.admonition p:last-child, -div.admonition dl:last-child, -div.admonition dd:last-child, -div.deprecated p:last-child, -div.versionchanged p:last-child, -div.versionadded p:last-child{ - margin-bottom: 0 -} - -div.deprecated { - color: #b94a48; - background-color: #F3E5E5; - border-color: #eed3d7; -} - - -div.warning { - color: #b94a48; - background-color: #F3E5E5; - border-color: #eed3d7; -} - -div.seealso { - background-color: #FFFBE8; - border-color: #fbeed5; - color: #AF8A4B; -} - -div.versionchanged { - background-color: #FFFBE8; - border-color: #fbeed5; -} - -dt.label { - float: left; - padding-right: 0.5rem; -} - -/* copy button */ -div.highlight:hover span.copybutton { - background-color: #3F556B; - color: white; -} - -div.highlight:hover span.copybutton:hover { - background-color: #20252B; -} - -div.body img { - max-width: 100%; - height: unset!important; /* Needed because sphinx sets the height */ -} - -div.body dd > p { - hyphens: none; -} - -img.align-center, figure.align-center, -.figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; - margin-bottom: 1rem; - text-align: center; -} - -img.align-right, figure.align-right, -.figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -/* copybutton */ - -.copybutton { - cursor: pointer; - position: absolute; - top: 0px; - right: 0px; - border: 1px solid rgb(221, 221, 221); - color: rgb(221, 221, 221); - font-family: monospace; - padding-left: 0.2rem; - padding-right: 0.2rem; -} - -div.highlight:hover span.copybutton::after { - background: #3F556B; - border-radius: 0.25rem; - color: white; - content: attr(title); - padding: 0.25rem; - position: absolute; - z-index: 98; - width: 100px; - font-size: 0.7rem; - top: 0; - right: 0; -} - -/* world */ - -img.avatar { - width: 100%; -} - -/* table */ -table.align-default { - margin-left: auto; - margin-right: auto; -} - -table.docutils tr:nth-child(odd) { - background-color: #F0F7FA; -} - -table.docutils tr { - border-style: solid none solid none; - border-width: 1px 0; - border-color: #ddd; -} - -table.docutils td, table.docutils th { - padding: 0.125rem 0.5rem 0.125rem 0.25rem; -} - -table.docutils { - margin-bottom: 1rem; - line-height: 1rem; - max-width: 100%; - display: block; - overflow-x: scroll; -} - -table.docutils p { - margin-bottom: 0; -} - -table.docutils p { - white-space: pre-wrap; - word-wrap: break-word; - word-break: initial; -} - -/* gallery */ - -div.sphx-glr-thumbcontainer { - min-height: 250px; - font-size: 0.9rem; -} - -.sphx-glr-example-title > :target::before { - display: block; - content: ""; - margin-top: -150px; - height: 150px; - visibility: hidden; -} - -.sphx-glr-script-out .highlight pre { - padding: 1ex; -} - -.sphx-glr-script-out div.highlight { - padding: 0; -} - - -@media screen and (min-width: 1540px) { - .sphx-glr-download-link-note { - position: absolute; - position: absolute; - left: 98%; - width: 20ex; - } -} - -/* Pandas dataframe css */ -/* Taken from: https://github.com/spatialaudio/nbsphinx/blob/fb3ba670fc1ba5f54d4c487573dbc1b4ecf7e9ff/src/nbsphinx.py#L587-L619 */ -/* FIXME: to be removed when sphinx-gallery >= 5.0 will be released */ - -table.dataframe { - border: none !important; - border-collapse: collapse; - border-spacing: 0; - border-color: transparent; - color: black; - font-size: 12px; - table-layout: fixed; -} -table.dataframe thead { - border-bottom: 1px solid black; - vertical-align: bottom; -} -table.dataframe tr, -table.dataframe th, -table.dataframe td { - text-align: right; - vertical-align: middle; - padding: 0.5em 0.5em; - line-height: normal; - white-space: normal; - max-width: none; - border: none; -} -table.dataframe th { - font-weight: bold; -} -table.dataframe tbody tr:nth-child(odd) { - background: #f5f5f5; -} -table.dataframe tbody tr:hover { - background: rgba(66, 165, 245, 0.2); -} - -/* rellinks */ - -.sk-btn-rellink { - background-color: #3cad6e; - border-color: #3cad6e; - color: white; - cursor: pointer; - font-size: 0.8rem; - font-weight: bold; -} - -.sk-btn-rellink:hover { - color: black; - border: 1px solid black; -} - -[sk-rellink-tooltip] { - position: relative; - cursor: pointer; -} - -[sk-rellink-tooltip]::before { - visibility: hidden; - position: absolute; - padding: 0.5rem; - overflow: hidden; - background-color: #3cad6e; - border: 1px solid #3cad6e; - white-space: pre; - content: attr(sk-rellink-tooltip); - text-align: left; - width: 222px; - top: 100%; - left: -78px; - border: 1px solid black; -} - -[sk-rellink-tooltip]:first-child::before { - left: 0; -} - -[sk-rellink-tooltip]:last-child::before { - left: -144px; -} - -[sk-rellink-tooltip]:hover::before { - visibility: visible; - white-space: pre-wrap; - word-wrap: break-word; -} - -/* authors */ -.sk-authors-container { - display: flex; - flex-wrap: wrap; - justify-content: center; -} - -.sk-authors-container > div { - width: 100px; - margin: 5px; - font-size: 0.9rem; -} - - -/* testimonial */ - -div.testimonial h2 { - background-color: transparent; - color: #008EB2; - padding: 0; - height: 26px; - line-height: 1.1em; - font-size: 22px; - font-weight: bold; - text-align: left; -} - -div.testimonial p { - color: #1c1c1c; -} - -div.testimonial span.testimonial-author p { - font-size: 0.8em; - font-style: italic; - color: #808080; -} - -div.testimonial p { - color: #1c1c1c; -} - -/* Installation quickstart */ -/* This quickstart installation is a hack of the awesome - https://spacy.io/usage/#quickstart page. - See the original javascript implementation - https://github.com/ines/quickstart */ - -/* style input radio and checkbox */ - -div.install > input { - -moz-appearance: none; - -webkit-appearance: none; - appearance: none; - opacity: 0; -} - -/* Style the button */ -div.install > label { - display: inline-block; - margin-top: 12px; - padding: 5px 11px; - background-color: #fff3cd; - border: none; - border-radius: 3px; - color: black; -} - -div.install > label:hover { - cursor: pointer; -} - -/* Style the button when the checkbox is checked */ -div.install > input:checked + label { - background-color: #ff9c34; - color: white; -} - -/* Hide expandable content by default */ -.sk-expandable { - display: none; -} - -div.highlight span.sk-expandable:before { - content: "$ "; -} - -/* Show hidden content when the checkbox is checked */ -/* for conda */ -#quickstart-conda:checked ~* [data-packager="conda"] { - display: block; -} - -#quickstart-conda:checked ~ #quickstart-venv ~ label[for="quickstart-venv"] { - display: none; -} - -/* for pip */ -#quickstart-pip:checked ~* [data-packager="pip"] { - display: block; -} - -#quickstart-pip:checked ~ label[for="quickstart-venv"]:before { - content: "Use pip virtualenv"; -} - -#quickstart-win:not(:checked) ~* [data-os="windows"] { - display: none; -} -#quickstart-lin:not(:checked) ~* [data-os="linux"] { - display: none; -} -#quickstart-mac:not(:checked) ~* [data-os="mac"] { - display: none; -} - -#quickstart-venv:not(:checked) ~* [data-venv=""] { - display: none; -} - -#quickstart-venv:checked ~* [data-venv="no"] { - display: none; -} - -/* Algorithm cheet-sheet */ - -div.sk-page-content img.map { - position: absolute; - max-width: none; - transform-origin: left top; - -webkit-transform: scale(0.5); - -ms-transform: scale(0.5); - transform: scale(0.5); -} - -/* sponsors and testimonials */ - -div.sk-sponsor-div, div.sk-testimonial-div { - display: flex; - flex-wrap: wrap; - -webkit-flex-align: center; - -ms-flex-align: center; - -webkit-align-items: center; - align-items: center; -} - -div.sk-sponsor-div-box, div.sk-testimonial-div-box { - width: 100%; -} - -@media screen and (min-width: 500px) { - div.sk-sponsor-div-box, div.sk-testimonial-div-box { - width: 50%; - } -} - -table.sk-sponsor-table tr, table.sk-sponsor-table tr:nth-child(odd) { - border-style: none; - background-color: white; - vertical-align: middle; - text-align: center; -} - -table.sk-sponsor-table td { - padding: 0.30rem; -} - -.caption { - text-align: center -} - -/* pygments - highlighting */ - -.highlight .hll { background-color: #ffffcc } -.highlight { background: #f8f8f8; } -.highlight .c { color: #408090; font-style: italic } /* Comment */ -.highlight .err { border: 1px solid #FF0000 } /* Error */ -.highlight .k { color: #007020; font-weight: bold } /* Keyword */ -.highlight .o { color: #666666 } /* Operator */ -.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */ -.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ -.highlight .cp { color: #007020 } /* Comment.Preproc */ -.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */ -.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ -.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ -.highlight .gd { color: #A00000 } /* Generic.Deleted */ -.highlight .ge { font-style: italic } /* Generic.Emph */ -.highlight .gr { color: #FF0000 } /* Generic.Error */ -.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ -.highlight .gi { color: #00A000 } /* Generic.Inserted */ -.highlight .go { color: #333333 } /* Generic.Output */ -.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ -.highlight .gs { font-weight: bold } /* Generic.Strong */ -.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ -.highlight .gt { color: #0044DD } /* Generic.Traceback */ -.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ -.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ -.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ -.highlight .kp { color: #007020 } /* Keyword.Pseudo */ -.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ -.highlight .kt { color: #902000 } /* Keyword.Type */ -.highlight .m { color: #208050 } /* Literal.Number */ -.highlight .s { color: #4070a0 } /* Literal.String */ -.highlight .na { color: #4070a0 } /* Name.Attribute */ -.highlight .nb { color: #007020 } /* Name.Builtin */ -.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ -.highlight .no { color: #60add5 } /* Name.Constant */ -.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ -.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ -.highlight .ne { color: #007020 } /* Name.Exception */ -.highlight .nf { color: #06287e } /* Name.Function */ -.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ -.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ -.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ -.highlight .nv { color: #bb60d5 } /* Name.Variable */ -.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ -.highlight .w { color: #bbbbbb } /* Text.Whitespace */ -.highlight .mb { color: #208050 } /* Literal.Number.Bin */ -.highlight .mf { color: #208050 } /* Literal.Number.Float */ -.highlight .mh { color: #208050 } /* Literal.Number.Hex */ -.highlight .mi { color: #208050 } /* Literal.Number.Integer */ -.highlight .mo { color: #208050 } /* Literal.Number.Oct */ -.highlight .sa { color: #4070a0 } /* Literal.String.Affix */ -.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ -.highlight .sc { color: #4070a0 } /* Literal.String.Char */ -.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ -.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ -.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ -.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ -.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ -.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ -.highlight .sx { color: #c65d09 } /* Literal.String.Other */ -.highlight .sr { color: #235388 } /* Literal.String.Regex */ -.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ -.highlight .ss { color: #517918 } /* Literal.String.Symbol */ -.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ -.highlight .fm { color: #06287e } /* Name.Function.Magic */ -.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ -.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ -.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ -.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ -.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ - -/** Custom styles overriding certain values */ - -div.sk-sidebar-toc-wrapper { - width: unset; - overflow-x: auto; -} - -div.sk-sidebar-toc-wrapper > [aria-label="rellinks"] { - position: sticky; - left: 0; -} - -.navbar-nav .dropdown-menu { - max-height: 80vh; - overflow-y: auto; -} diff --git a/docs/api_reference/themes/scikit-learn-modern/static/css/vendor/bootstrap.min.css b/docs/api_reference/themes/scikit-learn-modern/static/css/vendor/bootstrap.min.css deleted file mode 100644 index 326cf7fb8ae..00000000000 --- a/docs/api_reference/themes/scikit-learn-modern/static/css/vendor/bootstrap.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Bootstrap v4.3.1 (https://getbootstrap.com/) - * Copyright 2011-2019 The Bootstrap Authors - * Copyright 2011-2019 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:calc(1rem + .4rem);padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion>.card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion>.card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion>.card .card-header{margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-sm .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-md .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-lg .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-xl .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #dee2e6;border-bottom-right-radius:.3rem;border-bottom-left-radius:.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:0s .6s opacity}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} \ No newline at end of file diff --git a/docs/api_reference/themes/scikit-learn-modern/static/js/vendor/bootstrap.min.js b/docs/api_reference/themes/scikit-learn-modern/static/js/vendor/bootstrap.min.js deleted file mode 100644 index 4955aeec114..00000000000 --- a/docs/api_reference/themes/scikit-learn-modern/static/js/vendor/bootstrap.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Bootstrap v4.3.1 (https://getbootstrap.com/) - * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t=t||self).bootstrap={},t.jQuery,t.Popper)}(this,function(t,g,u){"use strict";function i(t,e){for(var n=0;nthis._items.length-1||t<0))if(this._isSliding)g(this._element).one(Q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=ndocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Ee},je="show",He="out",Re={HIDE:"hide"+De,HIDDEN:"hidden"+De,SHOW:"show"+De,SHOWN:"shown"+De,INSERTED:"inserted"+De,CLICK:"click"+De,FOCUSIN:"focusin"+De,FOCUSOUT:"focusout"+De,MOUSEENTER:"mouseenter"+De,MOUSELEAVE:"mouseleave"+De},xe="fade",Fe="show",Ue=".tooltip-inner",We=".arrow",qe="hover",Me="focus",Ke="click",Qe="manual",Be=function(){function i(t,e){if("undefined"==typeof u)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=g(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(g(this.getTipElement()).hasClass(Fe))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),g.removeData(this.element,this.constructor.DATA_KEY),g(this.element).off(this.constructor.EVENT_KEY),g(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&g(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===g(this.element).css("display"))throw new Error("Please use show on visible elements");var t=g.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){g(this.element).trigger(t);var n=_.findShadowRoot(this.element),i=g.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=_.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&g(o).addClass(xe);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();g(o).data(this.constructor.DATA_KEY,this),g.contains(this.element.ownerDocument.documentElement,this.tip)||g(o).appendTo(l),g(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new u(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:We},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),g(o).addClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().on("mouseover",null,g.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,g(e.element).trigger(e.constructor.Event.SHOWN),t===He&&e._leave(null,e)};if(g(this.tip).hasClass(xe)){var h=_.getTransitionDurationFromElement(this.tip);g(this.tip).one(_.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=g.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==je&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),g(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(g(this.element).trigger(i),!i.isDefaultPrevented()){if(g(n).removeClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),this._activeTrigger[Ke]=!1,this._activeTrigger[Me]=!1,this._activeTrigger[qe]=!1,g(this.tip).hasClass(xe)){var r=_.getTransitionDurationFromElement(n);g(n).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){g(this.getTipElement()).addClass(Ae+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(g(t.querySelectorAll(Ue)),this.getTitle()),g(t).removeClass(xe+" "+Fe)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=Se(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?g(e).parent().is(t)||t.empty().append(e):t.text(g(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:_.isElement(this.config.container)?g(this.config.container):g(document).find(this.config.container)},t._getAttachment=function(t){return Pe[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)g(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==Qe){var e=t===qe?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===qe?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;g(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),g(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Me:qe]=!0),g(e.getTipElement()).hasClass(Fe)||e._hoverState===je?e._hoverState=je:(clearTimeout(e._timeout),e._hoverState=je,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===je&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Me:qe]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=He,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===He&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=g(this.element).data();return Object.keys(e).forEach(function(t){-1!==Oe.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),_.typeCheckConfig(be,t,this.constructor.DefaultType),t.sanitize&&(t.template=Se(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ne);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(g(t).removeClass(xe),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ie),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ie,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Le}},{key:"NAME",get:function(){return be}},{key:"DATA_KEY",get:function(){return Ie}},{key:"Event",get:function(){return Re}},{key:"EVENT_KEY",get:function(){return De}},{key:"DefaultType",get:function(){return ke}}]),i}();g.fn[be]=Be._jQueryInterface,g.fn[be].Constructor=Be,g.fn[be].noConflict=function(){return g.fn[be]=we,Be._jQueryInterface};var Ve="popover",Ye="bs.popover",ze="."+Ye,Xe=g.fn[Ve],$e="bs-popover",Ge=new RegExp("(^|\\s)"+$e+"\\S+","g"),Je=l({},Be.Default,{placement:"right",trigger:"click",content:"",template:''}),Ze=l({},Be.DefaultType,{content:"(string|element|function)"}),tn="fade",en="show",nn=".popover-header",on=".popover-body",rn={HIDE:"hide"+ze,HIDDEN:"hidden"+ze,SHOW:"show"+ze,SHOWN:"shown"+ze,INSERTED:"inserted"+ze,CLICK:"click"+ze,FOCUSIN:"focusin"+ze,FOCUSOUT:"focusout"+ze,MOUSEENTER:"mouseenter"+ze,MOUSELEAVE:"mouseleave"+ze},sn=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){g(this.getTipElement()).addClass($e+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},o.setContent=function(){var t=g(this.getTipElement());this.setElementContent(t.find(nn),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(on),e),t.removeClass(tn+" "+en)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ge);null!==e&&0=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t li > .active",Wn='[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',qn=".dropdown-toggle",Mn="> .dropdown-menu .active",Kn=function(){function i(t){this._element=t}var t=i.prototype;return t.show=function(){var n=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&g(this._element).hasClass(Pn)||g(this._element).hasClass(Ln))){var t,i,e=g(this._element).closest(xn)[0],o=_.getSelectorFromElement(this._element);if(e){var r="UL"===e.nodeName||"OL"===e.nodeName?Un:Fn;i=(i=g.makeArray(g(e).find(r)))[i.length-1]}var s=g.Event(On.HIDE,{relatedTarget:this._element}),a=g.Event(On.SHOW,{relatedTarget:i});if(i&&g(i).trigger(s),g(this._element).trigger(a),!a.isDefaultPrevented()&&!s.isDefaultPrevented()){o&&(t=document.querySelector(o)),this._activate(this._element,e);var l=function(){var t=g.Event(On.HIDDEN,{relatedTarget:n._element}),e=g.Event(On.SHOWN,{relatedTarget:i});g(i).trigger(t),g(n._element).trigger(e)};t?this._activate(t,t.parentNode,l):l()}}},t.dispose=function(){g.removeData(this._element,wn),this._element=null},t._activate=function(t,e,n){var i=this,o=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?g(e).children(Fn):g(e).find(Un))[0],r=n&&o&&g(o).hasClass(jn),s=function(){return i._transitionComplete(t,o,n)};if(o&&r){var a=_.getTransitionDurationFromElement(o);g(o).removeClass(Hn).one(_.TRANSITION_END,s).emulateTransitionEnd(a)}else s()},t._transitionComplete=function(t,e,n){if(e){g(e).removeClass(Pn);var i=g(e.parentNode).find(Mn)[0];i&&g(i).removeClass(Pn),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}if(g(t).addClass(Pn),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),_.reflow(t),t.classList.contains(jn)&&t.classList.add(Hn),t.parentNode&&g(t.parentNode).hasClass(kn)){var o=g(t).closest(Rn)[0];if(o){var r=[].slice.call(o.querySelectorAll(qn));g(r).addClass(Pn)}t.setAttribute("aria-expanded",!0)}n&&n()},i._jQueryInterface=function(n){return this.each(function(){var t=g(this),e=t.data(wn);if(e||(e=new i(this),t.data(wn,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),i}();g(document).on(On.CLICK_DATA_API,Wn,function(t){t.preventDefault(),Kn._jQueryInterface.call(g(this),"show")}),g.fn.tab=Kn._jQueryInterface,g.fn.tab.Constructor=Kn,g.fn.tab.noConflict=function(){return g.fn.tab=Nn,Kn._jQueryInterface};var Qn="toast",Bn="bs.toast",Vn="."+Bn,Yn=g.fn[Qn],zn={CLICK_DISMISS:"click.dismiss"+Vn,HIDE:"hide"+Vn,HIDDEN:"hidden"+Vn,SHOW:"show"+Vn,SHOWN:"shown"+Vn},Xn="fade",$n="hide",Gn="show",Jn="showing",Zn={animation:"boolean",autohide:"boolean",delay:"number"},ti={animation:!0,autohide:!0,delay:500},ei='[data-dismiss="toast"]',ni=function(){function i(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var t=i.prototype;return t.show=function(){var t=this;g(this._element).trigger(zn.SHOW),this._config.animation&&this._element.classList.add(Xn);var e=function(){t._element.classList.remove(Jn),t._element.classList.add(Gn),g(t._element).trigger(zn.SHOWN),t._config.autohide&&t.hide()};if(this._element.classList.remove($n),this._element.classList.add(Jn),this._config.animation){var n=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},t.hide=function(t){var e=this;this._element.classList.contains(Gn)&&(g(this._element).trigger(zn.HIDE),t?this._close():this._timeout=setTimeout(function(){e._close()},this._config.delay))},t.dispose=function(){clearTimeout(this._timeout),this._timeout=null,this._element.classList.contains(Gn)&&this._element.classList.remove(Gn),g(this._element).off(zn.CLICK_DISMISS),g.removeData(this._element,Bn),this._element=null,this._config=null},t._getConfig=function(t){return t=l({},ti,g(this._element).data(),"object"==typeof t&&t?t:{}),_.typeCheckConfig(Qn,t,this.constructor.DefaultType),t},t._setListeners=function(){var t=this;g(this._element).on(zn.CLICK_DISMISS,ei,function(){return t.hide(!0)})},t._close=function(){var t=this,e=function(){t._element.classList.add($n),g(t._element).trigger(zn.HIDDEN)};if(this._element.classList.remove(Gn),this._config.animation){var n=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},i._jQueryInterface=function(n){return this.each(function(){var t=g(this),e=t.data(Bn);if(e||(e=new i(this,"object"==typeof n&&n),t.data(Bn,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n](this)}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"DefaultType",get:function(){return Zn}},{key:"Default",get:function(){return ti}}]),i}();g.fn[Qn]=ni._jQueryInterface,g.fn[Qn].Constructor=ni,g.fn[Qn].noConflict=function(){return g.fn[Qn]=Yn,ni._jQueryInterface},function(){if("undefined"==typeof g)throw new TypeError("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var t=g.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1===t[0]&&9===t[1]&&t[2]<1||4<=t[0])throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(),t.Util=_,t.Alert=p,t.Button=P,t.Carousel=lt,t.Collapse=bt,t.Dropdown=Jt,t.Modal=ve,t.Popover=sn,t.Scrollspy=Dn,t.Tab=Kn,t.Toast=ni,t.Tooltip=Be,Object.defineProperty(t,"__esModule",{value:!0})}); \ No newline at end of file diff --git a/docs/api_reference/themes/scikit-learn-modern/static/js/vendor/jquery-3.6.3.slim.min.js b/docs/api_reference/themes/scikit-learn-modern/static/js/vendor/jquery-3.6.3.slim.min.js deleted file mode 100644 index dba338653a5..00000000000 --- a/docs/api_reference/themes/scikit-learn-modern/static/js/vendor/jquery-3.6.3.slim.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.6.3 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/Tween,-effects/animatedSelector | (c) OpenJS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(g,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,v=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,y=n.hasOwnProperty,a=y.toString,l=a.call(Object),m={},b=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},w=g.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function C(e,t,n){var r,i,o=(n=n||w).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function T(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.3 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/Tween,-effects/animatedSelector",E=function(e,t){return new E.fn.init(e,t)};function d(e){var t=!!e&&"length"in e&&e.length,n=T(e);return!b(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+R+")"+R+"*"),U=new RegExp(R+"|>"),V=new RegExp(W),X=new RegExp("^"+B+"$"),Q={ID:new RegExp("^#("+B+")"),CLASS:new RegExp("^\\.("+B+")"),TAG:new RegExp("^("+B+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+R+"*(even|odd|(([+-]|)(\\d*)n|)"+R+"*(?:([+-]|)"+R+"*(\\d+)|))"+R+"*\\)|)","i"),bool:new RegExp("^(?:"+I+")$","i"),needsContext:new RegExp("^"+R+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+R+"*((?:-\\d)?\\d*)"+R+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,G=/^(?:input|select|textarea|button)$/i,K=/^h\d$/i,J=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+R+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){C()},ae=xe(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{O.apply(t=P.call(d.childNodes),d.childNodes),t[d.childNodes.length].nodeType}catch(e){O={apply:t.length?function(e,t){q.apply(e,P.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,d=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==d&&9!==d&&11!==d)return n;if(!r&&(C(e),e=e||T,E)){if(11!==d&&(u=Z.exec(t)))if(i=u[1]){if(9===d){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return O.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&p.getElementsByClassName&&e.getElementsByClassName)return O.apply(n,e.getElementsByClassName(i)),n}if(p.qsa&&!k[t+" "]&&(!v||!v.test(t))&&(1!==d||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===d&&(U.test(t)||_.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&p.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+be(l[o]);c=l.join(",")}try{if(p.cssSupportsSelector&&!CSS.supports("selector(:is("+c+"))"))throw new Error;return O.apply(n,f.querySelectorAll(c)),n}catch(e){k(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>x.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)x.attrHandle[n[r]]=t}function de(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function pe(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in p=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},C=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:d;return r!=T&&9===r.nodeType&&r.documentElement&&(a=(T=r).documentElement,E=!i(T),d!=T&&(n=T.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),p.scope=ce(function(e){return a.appendChild(e).appendChild(T.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),p.cssSupportsSelector=ce(function(){return CSS.supports("selector(*)")&&T.querySelectorAll(":is(:jqfake)")&&!CSS.supports("selector(:is(*,:jqfake))")}),p.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),p.getElementsByTagName=ce(function(e){return e.appendChild(T.createComment("")),!e.getElementsByTagName("*").length}),p.getElementsByClassName=J.test(T.getElementsByClassName),p.getById=ce(function(e){return a.appendChild(e).id=S,!T.getElementsByName||!T.getElementsByName(S).length}),p.getById?(x.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},x.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(x.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},x.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),x.find.TAG=p.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):p.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},x.find.CLASS=p.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(p.qsa=J.test(T.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+R+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+R+"*(?:value|"+I+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+R+"*name"+R+"*="+R+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=T.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+R+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(p.matchesSelector=J.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){p.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",W)}),p.cssSupportsSelector||v.push(":has"),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=J.test(a.compareDocumentPosition),y=t||J.test(a.contains)?function(e,t){var n=9===e.nodeType&&e.documentElement||e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!p.sortDetached&&t.compareDocumentPosition(e)===n?e==T||e.ownerDocument==d&&y(d,e)?-1:t==T||t.ownerDocument==d&&y(d,t)?1:u?H(u,e)-H(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==T?-1:t==T?1:i?-1:o?1:u?H(u,e)-H(u,t):0;if(i===o)return de(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?de(a[r],s[r]):a[r]==d?-1:s[r]==d?1:0}),T},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(C(e),p.matchesSelector&&E&&!k[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||p.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){k(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&V.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+R+")"+e+"("+R+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return b(n)?E.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?E.grep(e,function(e){return e===n!==r}):"string"!=typeof n?E.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(E.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||L,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:j.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof E?t[0]:t,E.merge(this,E.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:w,!0)),k.test(r[1])&&E.isPlainObject(t))for(r in t)b(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=w.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):b(e)?void 0!==n.ready?n.ready(e):e(E):E.makeArray(e,this)}).prototype=E.fn,L=E(w);var q=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}E.fn.extend({has:function(e){var t=E(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,pe=/^$|^module$|\/(?:java|ecma)script/i;le=w.createDocumentFragment().appendChild(w.createElement("div")),(ce=w.createElement("input")).setAttribute("type","radio"),ce.setAttribute("checked","checked"),ce.setAttribute("name","t"),le.appendChild(ce),m.checkClone=le.cloneNode(!0).cloneNode(!0).lastChild.checked,le.innerHTML="x",m.noCloneChecked=!!le.cloneNode(!0).lastChild.defaultValue,le.innerHTML="",m.option=!!le.lastChild;var he={thead:[1,"",""],col:[2,"",""],tr:[2,"",""],td:[3,"",""],_default:[0,"",""]};function ge(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?E.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n",""]);var ye=/<|?\w+;/;function me(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),d=[],p=0,h=e.length;p\s*$/g;function ke(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")&&E(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Le(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function je(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n",2===ft.childNodes.length),E.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(m.createHTMLDocument?((r=(t=w.implementation.createHTMLDocument("")).createElement("base")).href=w.location.href,t.head.appendChild(r)):t=w),o=!n&&[],(i=k.exec(e))?[t.createElement(i[1])]:(i=me([e],t,o),o&&o.length&&E(o).remove(),E.merge([],i.childNodes)));var r,i,o},E.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=E.css(e,"position"),c=E(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=E.css(e,"top"),u=E.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),b(t)&&(t=t.call(e,n,E.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},E.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){E.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===E.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===E.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=E(e).offset()).top+=E.css(e,"borderTopWidth",!0),i.left+=E.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-E.css(r,"marginTop",!0),left:t.left-i.left-E.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===E.css(e,"position"))e=e.offsetParent;return e||re})}}),E.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;E.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),E.each(["top","left"],function(e,n){E.cssHooks[n]=$e(m.pixelPosition,function(e,t){if(t)return t=Fe(e,n),Pe.test(t)?E(e).position()[n]+"px":t})}),E.each({Height:"height",Width:"width"},function(a,s){E.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){E.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?E.css(e,t,i):E.style(e,t,n,i)},s,n?e:void 0,n)}})}),E.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),E.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){E.fn[n]=function(e,t){return 0\n", - "from langchain.globals import set_llm_cache" + "from langchain_core.globals import set_llm_cache" ] }, { @@ -103,7 +103,7 @@ ], "source": [ "%%time\n", - "from langchain.cache import InMemoryCache\n", + "from langchain_core.caches import InMemoryCache\n", "\n", "set_llm_cache(InMemoryCache())\n", "\n", diff --git a/docs/docs/how_to/graph_mapping.ipynb b/docs/docs/how_to/graph_mapping.ipynb index df3d08b8b86..688621fa73a 100644 --- a/docs/docs/how_to/graph_mapping.ipynb +++ b/docs/docs/how_to/graph_mapping.ipynb @@ -364,7 +364,10 @@ "metadata": {}, "outputs": [], "source": [ - "from langchain.chains.graph_qa.cypher_utils import CypherQueryCorrector, Schema\n", + "from langchain_community.chains.graph_qa.cypher_utils import (\n", + " CypherQueryCorrector,\n", + " Schema,\n", + ")\n", "\n", "# Cypher validation tool for relationship directions\n", "corrector_schema = [\n", diff --git a/docs/docs/how_to/llm_caching.ipynb b/docs/docs/how_to/llm_caching.ipynb index d171cd74b05..a05b9111568 100644 --- a/docs/docs/how_to/llm_caching.ipynb +++ b/docs/docs/how_to/llm_caching.ipynb @@ -36,7 +36,7 @@ "metadata": {}, "outputs": [], "source": [ - "from langchain.globals import set_llm_cache\n", + "from langchain_core.globals import set_llm_cache\n", "from langchain_openai import OpenAI\n", "\n", "# To make the caching really obvious, lets use a slower and older model.\n", @@ -71,7 +71,7 @@ ], "source": [ "%%time\n", - "from langchain.cache import InMemoryCache\n", + "from langchain_core.caches import InMemoryCache\n", "\n", "set_llm_cache(InMemoryCache())\n", "\n", diff --git a/docs/docs/how_to/query_constructing_filters.ipynb b/docs/docs/how_to/query_constructing_filters.ipynb index a55f229678e..118f7a0c8a3 100644 --- a/docs/docs/how_to/query_constructing_filters.ipynb +++ b/docs/docs/how_to/query_constructing_filters.ipynb @@ -38,8 +38,8 @@ " Operator,\n", " StructuredQuery,\n", ")\n", - "from langchain.retrievers.self_query.chroma import ChromaTranslator\n", - "from langchain.retrievers.self_query.elasticsearch import ElasticsearchTranslator\n", + "from langchain_community.query_constructors.chroma import ChromaTranslator\n", + "from langchain_community.query_constructors.elasticsearch import ElasticsearchTranslator\n", "from langchain_core.pydantic_v1 import BaseModel" ] }, diff --git a/docs/docs/how_to/self_query.ipynb b/docs/docs/how_to/self_query.ipynb index af2e095a24f..b07e6a89b15 100644 --- a/docs/docs/how_to/self_query.ipynb +++ b/docs/docs/how_to/self_query.ipynb @@ -512,7 +512,7 @@ "metadata": {}, "outputs": [], "source": [ - "from langchain.retrievers.self_query.chroma import ChromaTranslator\n", + "from langchain_community.query_constructors.chroma import ChromaTranslator\n", "\n", "retriever = SelfQueryRetriever(\n", " query_constructor=query_constructor,\n", diff --git a/docs/docs/how_to/semantic-chunker.ipynb b/docs/docs/how_to/semantic-chunker.ipynb index ff952b2d817..c7a41bb9632 100644 --- a/docs/docs/how_to/semantic-chunker.ipynb +++ b/docs/docs/how_to/semantic-chunker.ipynb @@ -299,16 +299,16 @@ }, { "cell_type": "markdown", + "id": "423c6e099e94ca69", + "metadata": { + "collapsed": false + }, "source": [ "### Gradient\n", "\n", "In this method, the gradient of distance is used to split chunks along with the percentile method.\n", "This method is useful when chunks are highly correlated with each other or specific to a domain e.g. legal or medical. The idea is to apply anomaly detection on gradient array so that the distribution become wider and easy to identify boundaries in highly semantic data." - ], - "metadata": { - "collapsed": false - }, - "id": "423c6e099e94ca69" + ] }, { "cell_type": "code", @@ -325,6 +325,8 @@ { "cell_type": "code", "execution_count": 6, + "id": "e9f393d316ce1f6c", + "metadata": {}, "outputs": [ { "name": "stdout", @@ -337,13 +339,13 @@ "source": [ "docs = text_splitter.create_documents([state_of_the_union])\n", "print(docs[0].page_content)" - ], - "metadata": {}, - "id": "e9f393d316ce1f6c" + ] }, { "cell_type": "code", "execution_count": 8, + "id": "a407cd57f02a0db4", + "metadata": {}, "outputs": [ { "name": "stdout", @@ -355,9 +357,7 @@ ], "source": [ "print(len(docs))" - ], - "metadata": {}, - "id": "a407cd57f02a0db4" + ] } ], "metadata": { diff --git a/docs/docs/integrations/chat/llamacpp.ipynb b/docs/docs/integrations/chat/llamacpp.ipynb index 85aedff9cb0..bf2c7383474 100644 --- a/docs/docs/integrations/chat/llamacpp.ipynb +++ b/docs/docs/integrations/chat/llamacpp.ipynb @@ -226,8 +226,8 @@ "metadata": {}, "outputs": [], "source": [ - "from langchain.tools import tool\n", "from langchain_core.pydantic_v1 import BaseModel, Field\n", + "from langchain_core.tools import tool\n", "\n", "\n", "class WeatherInput(BaseModel):\n", diff --git a/docs/docs/integrations/document_loaders/github.ipynb b/docs/docs/integrations/document_loaders/github.ipynb index d0caad93241..6a1ac50382a 100644 --- a/docs/docs/integrations/document_loaders/github.ipynb +++ b/docs/docs/integrations/document_loaders/github.ipynb @@ -164,7 +164,7 @@ }, "outputs": [], "source": [ - "from langchain.document_loaders import GithubFileLoader" + "from langchain_community.document_loaders import GithubFileLoader" ] }, { diff --git a/docs/docs/integrations/document_loaders/scrapingant.ipynb b/docs/docs/integrations/document_loaders/scrapingant.ipynb index 46de054f4c3..4aa34e0810d 100644 --- a/docs/docs/integrations/document_loaders/scrapingant.ipynb +++ b/docs/docs/integrations/document_loaders/scrapingant.ipynb @@ -41,25 +41,19 @@ { "cell_type": "markdown", "metadata": {}, - "source": "## Instantiation" + "source": [ + "## Instantiation" + ] }, { "cell_type": "code", + "execution_count": 6, "metadata": { "ExecuteTime": { "end_time": "2024-07-22T18:18:50.903258Z", "start_time": "2024-07-22T18:18:35.265390Z" } }, - "source": [ - "from langchain_community.document_loaders import ScrapingAntLoader\n", - "\n", - "scrapingant_loader = ScrapingAntLoader(\n", - " [\"https://scrapingant.com/\", \"https://example.com/\"], # List of URLs to scrape\n", - " api_key=\"\", # Get your API key from https://scrapingant.com/\n", - " continue_on_failure=True, # Ignore unprocessable web pages and log their exceptions\n", - ")" - ], "outputs": [ { "name": "stdout", @@ -69,21 +63,41 @@ ] } ], - "execution_count": 6 + "source": [ + "from langchain_community.document_loaders import ScrapingAntLoader\n", + "\n", + "scrapingant_loader = ScrapingAntLoader(\n", + " [\"https://scrapingant.com/\", \"https://example.com/\"], # List of URLs to scrape\n", + " api_key=\"\", # Get your API key from https://scrapingant.com/\n", + " continue_on_failure=True, # Ignore unprocessable web pages and log their exceptions\n", + ")" + ] }, { "cell_type": "markdown", "metadata": {}, - "source": "The ScrapingAntLoader also allows providing a dict - scraping config for customizing the scrape request. As it is based on the [ScrapingAnt Python SDK](https://github.com/ScrapingAnt/scrapingant-client-python) you can pass any of the [common arguments](https://github.com/ScrapingAnt/scrapingant-client-python) to the `scrape_config` parameter." + "source": [ + "The ScrapingAntLoader also allows providing a dict - scraping config for customizing the scrape request. As it is based on the [ScrapingAnt Python SDK](https://github.com/ScrapingAnt/scrapingant-client-python) you can pass any of the [common arguments](https://github.com/ScrapingAnt/scrapingant-client-python) to the `scrape_config` parameter." + ] }, { "cell_type": "code", + "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2024-07-21T22:02:30.701905Z", "start_time": "2024-07-21T22:02:29.036115Z" } }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[Document(metadata={'url': 'https://scrapingant.com/'}, page_content=\"\\n\\n[](/) Features Pricing\\n\\nServices\\n\\n[Web Scraping API](/) [LLM-ready data extraction](/llm-ready-data-extraction)\\n[AI data scraping](/ai-data-scraper) [Residential Proxy](/residential-proxies)\\n\\n[Blog](https://scrapingant.com/blog/)\\n\\nDocumentatation\\n\\n[Web Scraping API](https://docs.scrapingant.com) [Residential\\nProxies](https://proxydocs.scrapingant.com)\\n\\nContact Us\\n\\n[Sign In](https://app.scrapingant.com/login)\\n\\n\\n\\n\\n\\n# Enterprise-Grade Scraping API. \\nAnt Sized Pricing.\\n\\n## Get the mission-critical speed, reliability, and features you need at a\\nfraction of the cost! \\n\\nGot Questions? \\n(get expert advice)\\n\\n[ Try Our Free Plan (10,000 API Credits) ](https://app.scrapingant.com/signup)\\n\\n\\n\\n### Proudly scaling with us\\n\\n\\n\\n### Industry Leading Pricing\\n\\nFrom our generous 10,000 API credit free plan to our industry leading paid\\nplans, we strive to provide unbeatable bang for your buck. That's just what\\nants do! \\n\\u200d\\n\\n\\n\\nCost per 1,000 API Credits - Level 1 Plan\\n\\n### Unparalleled Value\\n\\nLow cost per API credit is great, but whatβs even more important is how much\\ndata you can actually collect for each credit spent. Like any good Ant we\\nnever waste a crumb!\\n\\n\\n\\nGoogle SERP API - Cost per 1,000 Requests β Level 1 Plan\\n\\n\\n\\n## Ultimate Black Box Scraping Solution\\n\\n### Unlimited Concurrency \\n\\u200d\\n\\nWith unlimited parallel requests easily gather LARGE volumes of data from\\nmultiple locations in record time. Available on ALL plan levels. \\n\\u200d\\n\\n### Lightning Fast Scraping WITHOUT Getting Blocked\\n\\nOur proprietary algo seamlessly switches to the exact right proxy for almost\\nany situation, saving you and your dev team countless hours of frustration. \\n\\u200d\\n\\n#### What's inside?\\n\\n * Chrome Page Rendering\\n\\n * Low Latency Rotating Proxies \\n\\n * Javascript Execution\\n\\n * Custom Cookies\\n\\n * Fastest AWS & Hetzner Servers\\n\\n * Unlimited Parallel Requests\\n\\n * Headless Browsers \\n\\n * Residential Proxies\\n\\n * Supports All Programming Languages & Proxy\\n\\n * CAPTCHA Avoidance\\n\\n[ Try Our Free Plan (10,000 API Credits) ](https://app.scrapingant.com/signup)\\n\\n\\n\\n###### Metrics\\n\\n## The most reliable web scraping API\\n\\nOur clients have saved up to 40% of data collection budgets by integrating\\nScrapingAnt API instead of self-made solutions development.\\n\\n99.99%\\n\\nUptime over the last year.\\n\\n85.5%\\n\\nAnti-scraping avoidance rate with our custom cloud browser solution\\n\\n\\n\\n### Unlimited parallel requests\\n\\n\\n\\n### 3+ million proxy servers across the world\\n\\n\\n\\n### Open your web page as in a real browser\\n\\n\\n\\nSimple API integration\\n\\n1\\n\\n### Choose your plan\\n\\nWe offer subscription plans, or you can always request custom pricing. \\n **Free for personal use!**\\n\\n2\\n\\n### Test the API\\n\\nScrape your target website with our **UI request executor** or generate\\nscraping code for your preferred language.\\n\\n3\\n\\n### Scrape the Web\\n\\nBuild your data extraction pipeline using our **API** and forget about **rate\\nlimits** and **blocks**.\\n\\n\\n\\n###### Pricing\\n\\n## Industry leading pricing that scales with your business.\\n\\n### Enthusiast\\n\\n#### 100.000 API credits\\n\\n$19\\n\\n/mo\\n\\nIdeal for freelancers or students.\\n\\n[ Get Started ](https://app.scrapingant.com/signup)\\n\\n\\n\\nEmail support\\n\\n\\n\\nDocumentation-only integration\\n\\n### Startup\\n\\n#### 500.000 API credits\\n\\n$49\\n\\n/mo\\n\\nFor small to medium sized teams looking to grow. \\n \\nPopular choice!\\n\\n[ Get Started ](https://app.scrapingant.com/signup)\\n\\n\\n\\nPriority email support\\n\\n\\n\\nExpert assistance\\n\\n\\n\\nIntegration with custom code snippets\\n\\n### Business\\n\\n#### 3.000.000 API credits\\n\\n$249\\n\\n/mo\\n\\nFor larger teams and companies.\\n\\n[ Get Started ](https://app.scrapingant.com/signup)\\n\\n\\n\\nPriority email support\\n\\n\\n\\nLive integration calls\\n\\n\\n\\nExpert guidance and integration planning\\n\\n\\n\\nCustom proxy pools\\n\\n\\n\\nCustom avoidances\\n\\n\\n\\nDedicated manager\\n\\n### Business Pro\\n\\n#### 8.000.000 API credits\\n\\n$599\\n\\n/mo\\n\\nExtended volume Business plan.\\n\\n[ Get Started ](https://app.scrapingant.com/signup)\\n\\n\\n\\nPriority email support\\n\\n\\n\\nLive integration calls\\n\\n\\n\\nExpert guidance and integration planning\\n\\n\\n\\nCustom proxy pools\\n\\n\\n\\nCustom avoidances\\n\\n\\n\\nDedicated manager\\n\\n### Custom Plan\\n\\n#### 10M+ API credits\\n\\n$699+\\n\\n/mo\\n\\nExplore custom deals and services we could provide for Enterprise level\\ncustomers.\\n\\n[ Contact us ](https://app.scrapingant.com/signup)\\n\\n\\n\\nFully customisable solution\\n\\n\\n\\nResidential Proxy special prices\\n\\n\\n\\nSLA\\n\\n[](https://www.capterra.com/p/214735/ScrapingAnt/reviews/)\\n\\nβ β β β β \\n\\n\\n\\n#### βOnboarding and API integration was smooth and clear. Everything works\\ngreat. The support was excellent. **Overall a great scraper**.β\\n\\nIllia K., Android Software Developer\\n\\nβ β β β β \\n\\n\\n\\n#### βGreat communication with co-founders helped me to get the job done.\\nGreat proxy diversity and good price.β\\n\\nAndrii M., Senior Software Engineer\\n\\nβ β β β β \\n\\n\\n\\n#### βThis product helps me to scale and extend my business. The API is easy\\nto integrate and support is really good.β\\n\\nDmytro T., Senior Software Engineer\\n\\n\\n\\n#### Frequently asked questions.\\n\\nIf you have any further questions, [Get in\\ntouch](https://scrapingant.com/#contact) with our friendly team\\n\\n##### What is ScrapingAnt?\\n\\n\\n\\nScrapingAnt is a service that helps you to solve scraping tasks of any\\ncomplexity. With using of millions proxies around the World and a whole\\nheadless browser cluster we can provide you the best web harvesting and\\nscraping experience. \\n \\nScrapingAnt also provides a custom software development service. Data\\nharvesting, data storage or data querying - we can provide you the best and\\naffordable custom solution that fits all your needs.\\n\\n##### **What is an API Credit?**\\n\\n\\n\\nEach subscription plan contains a particular amount of API credits per month.\\nDepending on the parameters you configures your API calls it will cost you\\nfrom one to several credits. By default, each request costs 10 API credits\\nbecause JavaScript rendering and Standard proxies are enabled. [Learn more\\nabout requests costs](https://docs.scrapingant.com/api-credits-usage).\\n\\n##### I'm not a developer, can you create custom scraping solutions for me?\\n\\n\\n\\nYes of course! We regularly create custom scraping scripts and projects for\\nour clients. We are also partnering with several custom software development\\ncompanies, so we won't never be out of resources to help with a scraping\\nproject of any size. Just [Contact Us](https://scrapingant.com/#contact) and\\ndescribe your needs.\\n\\n##### Do I need a credit cart to start the free trial?\\n\\n\\n\\nScrapingAnt provides a completely free subscription plan which contains 10.000\\nAPI credits that can be consumed during month. Until you will need more - it\\nis completely free and doesn't require a credit card.\\n\\n### βOur clients are pleasantly surprised by the response speed of our team.β\\n\\n\\n\\nOleg Kulyk, \\nScrapingAnt Founder\\n\\n* Our team will contact you ASAP.\\n\\nThank you! Your submission has been received!\\n\\nOops! Something went wrong while submitting the form.\\n\\n\\n\\n## Grow your business with us\\n\\n[ Try Our Free Plan! ](https://app.scrapingant.com/signup)\\n\\n[\\n\\n## Features\\n\\n](https://scrapingant.com/#features) [\\n\\n## Pricing\\n\\n](https://scrapingant.com/#pricing) [\\n\\n## Blog\\n\\n](https://scrapingant.com/blog/) [\\n\\n## Documentation\\n\\n](https://docs.scrapingant.com/) [\\n\\n## Web Scraping API\\n\\n](https://scrapingant.com) [\\n\\n## LLM-ready web data\\n\\n](llm-ready-data-extraction.html) [\\n\\n## Residential Proxy\\n\\n](residential-proxies.html) [\\n\\n## Custom Scraper Development\\n\\n](https://scrapingant.com/custom-scraping-solution) [\\n\\n## Affiliate program\\n\\n](https://scrapingant.com/legal/affiliate/) [\\n\\n## Free proxies\\n\\n](https://scrapingant.com/free-proxies/)\\n\\n###### Web Scraping 101 \\n\\n[What is Web Scraping?](https://docs.scrapingant.com/web-scraping-101/what-is-\\nweb-scraping) [**Is Web Scraping Legal?**](https://scrapingant.com/blog/is-\\nweb-scraping-legal) [**10 Main Proxy\\nTypes**](https://scrapingant.com/blog/main-proxy-types) [Datacenter vs\\nResidential Proxies](https://scrapingant.com/blog/residential-vs-datacenter-\\nproxy-webscraping) [Best Proxy Scraping\\nTools](https://scrapingant.com/blog/top-open-source-proxy-scrapers)\\n[**Overcoming scraping challenges with Web Scraping\\nAPI**](https://scrapingant.com/blog/data-scraping-challenges) [IP rate-\\nlimiting avoidance](https://scrapingant.com/blog/avoid-ip-rate-limiting)\\n[Rotating proxies with Puppeteer](https://scrapingant.com/blog/how-to-use-\\nrotating-proxies-with-puppeteer) [Scraping Dynamic Website with\\nPython](https://scrapingant.com/blog/scrape-dynamic-website-with-python) [Web\\nScraping with Python](https://scrapingant.com/blog/top-5-popular-python-\\nlibraries-for-web-scraping-in-2020) [Web Scraping with\\nJava](https://scrapingant.com/blog/web-scraping-java) [Web Scraping with\\nNodeJS](https://scrapingant.com/blog/web-scraping-javascript) [Web Scraping\\nwith Deno](https://scrapingant.com/blog/deno-web-scraping) [**Web Scraping\\nwith R**](https://scrapingant.com/blog/r-web-scraping) [**Web Scraping with\\nPHP**](https://scrapingant.com/blog/web-scraping-php) [**Web Scraping with\\nGo**](https://scrapingant.com/blog/web-scraping-go)\\n\\n###### Use Cases \\n\\n[**Real estate decisions with Booking.com\\nscraping**](https://scrapingant.com/blog/booking-data-scraping) [**Sneaker\\nPrice Data Collection with Web Scraping\\nAPI**](https://scrapingant.com/blog/sneakers-scraping-api) [**Best Web\\nScraping APIs For Freelancers**](https://scrapingant.com/blog/best-web-\\nscraping-api-freelance) [**Smart NFT Decisions with Data\\nCollection**](https://scrapingant.com/blog/nft-data-collection) [**How Data\\nCollection Can Improve HR Processes**](https://scrapingant.com/blog/data-\\ncollection-for-hr-processes) [**Rule eCommerce with Data\\nCollection**](https://scrapingant.com/blog/data-collection-for-ecommerce)\\n[**How companies use Web Scraping to gain a Competitive\\nEdge**](https://scrapingant.com/blog/how-companies-use-web-scraping)\\n[**Benefits of Web Scraping for\\nHospitality**](https://scrapingant.com/blog/web-scraping-for-hospitality)\\n[**Uses of Web Scraping for Price\\nMonitoring**](https://scrapingant.com/blog/web-scraping-for-price-monitoring)\\n[**Benefits of Web Scraping for Real\\nEstate**](https://scrapingant.com/blog/web-scraping-for-real-estate) [**Web\\nScraping for Data Scientists**](https://scrapingant.com/blog/web-scraping-for-\\ndata-scientists) [**How to Collect Data from\\nTikTok**](https://scrapingant.com/blog/web-scraping-for-price-monitoring)\\n\\n###### Legal \\n\\n[Terms of Use](https://scrapingant.com/legal/terms-of-use) [Privacy\\nPolicy](https://scrapingant.com/legal/privacy-policy) [Cookies\\nPolicy](https://scrapingant.com/legal/cookies-policy)\\n\\n###### External Links \\n\\n[Github](https://github.com/ScrapingAnt)\\n[Linkedin](https://linkedin.com/company/scrapingant)\\n[Facebook](https://www.facebook.com/scrapingant)\\n[Twitter](https://twitter.com/ScrapingAnt)\\n\\n[](https://scrapingant.com)\\n\\nΒ© Copyright ScrapingAnt \\nPowered by [DATAANT](https://scrapingant.com)\\n\\n\\n\\nBy browsing this site, you agree to our [Cookies\\nPolicy](https://scrapingant.com/legal/cookies-policy)\\n\\n\\n\\n\")]\n" + ] + } + ], "source": [ "from langchain_community.document_loaders import ScrapingAntLoader\n", "\n", @@ -99,21 +113,11 @@ " continue_on_failure=True, # Ignore unprocessable web pages and log their exceptions\n", " scrape_config=scrapingant_config, # Pass the scrape_config object\n", ")" - ], - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[Document(metadata={'url': 'https://scrapingant.com/'}, page_content=\"\\n\\n[](/) Features Pricing\\n\\nServices\\n\\n[Web Scraping API](/) [LLM-ready data extraction](/llm-ready-data-extraction)\\n[AI data scraping](/ai-data-scraper) [Residential Proxy](/residential-proxies)\\n\\n[Blog](https://scrapingant.com/blog/)\\n\\nDocumentatation\\n\\n[Web Scraping API](https://docs.scrapingant.com) [Residential\\nProxies](https://proxydocs.scrapingant.com)\\n\\nContact Us\\n\\n[Sign In](https://app.scrapingant.com/login)\\n\\n\\n\\n\\n\\n# Enterprise-Grade Scraping API. \\nAnt Sized Pricing.\\n\\n## Get the mission-critical speed, reliability, and features you need at a\\nfraction of the cost! \\n\\nGot Questions? \\n(get expert advice)\\n\\n[ Try Our Free Plan (10,000 API Credits) ](https://app.scrapingant.com/signup)\\n\\n\\n\\n### Proudly scaling with us\\n\\n\\n\\n### Industry Leading Pricing\\n\\nFrom our generous 10,000 API credit free plan to our industry leading paid\\nplans, we strive to provide unbeatable bang for your buck. That's just what\\nants do! \\n\\u200d\\n\\n\\n\\nCost per 1,000 API Credits - Level 1 Plan\\n\\n### Unparalleled Value\\n\\nLow cost per API credit is great, but whatβs even more important is how much\\ndata you can actually collect for each credit spent. Like any good Ant we\\nnever waste a crumb!\\n\\n\\n\\nGoogle SERP API - Cost per 1,000 Requests β Level 1 Plan\\n\\n\\n\\n## Ultimate Black Box Scraping Solution\\n\\n### Unlimited Concurrency \\n\\u200d\\n\\nWith unlimited parallel requests easily gather LARGE volumes of data from\\nmultiple locations in record time. Available on ALL plan levels. \\n\\u200d\\n\\n### Lightning Fast Scraping WITHOUT Getting Blocked\\n\\nOur proprietary algo seamlessly switches to the exact right proxy for almost\\nany situation, saving you and your dev team countless hours of frustration. \\n\\u200d\\n\\n#### What's inside?\\n\\n * Chrome Page Rendering\\n\\n * Low Latency Rotating Proxies \\n\\n * Javascript Execution\\n\\n * Custom Cookies\\n\\n * Fastest AWS & Hetzner Servers\\n\\n * Unlimited Parallel Requests\\n\\n * Headless Browsers \\n\\n * Residential Proxies\\n\\n * Supports All Programming Languages & Proxy\\n\\n * CAPTCHA Avoidance\\n\\n[ Try Our Free Plan (10,000 API Credits) ](https://app.scrapingant.com/signup)\\n\\n\\n\\n###### Metrics\\n\\n## The most reliable web scraping API\\n\\nOur clients have saved up to 40% of data collection budgets by integrating\\nScrapingAnt API instead of self-made solutions development.\\n\\n99.99%\\n\\nUptime over the last year.\\n\\n85.5%\\n\\nAnti-scraping avoidance rate with our custom cloud browser solution\\n\\n\\n\\n### Unlimited parallel requests\\n\\n\\n\\n### 3+ million proxy servers across the world\\n\\n\\n\\n### Open your web page as in a real browser\\n\\n\\n\\nSimple API integration\\n\\n1\\n\\n### Choose your plan\\n\\nWe offer subscription plans, or you can always request custom pricing. \\n **Free for personal use!**\\n\\n2\\n\\n### Test the API\\n\\nScrape your target website with our **UI request executor** or generate\\nscraping code for your preferred language.\\n\\n3\\n\\n### Scrape the Web\\n\\nBuild your data extraction pipeline using our **API** and forget about **rate\\nlimits** and **blocks**.\\n\\n\\n\\n###### Pricing\\n\\n## Industry leading pricing that scales with your business.\\n\\n### Enthusiast\\n\\n#### 100.000 API credits\\n\\n$19\\n\\n/mo\\n\\nIdeal for freelancers or students.\\n\\n[ Get Started ](https://app.scrapingant.com/signup)\\n\\n\\n\\nEmail support\\n\\n\\n\\nDocumentation-only integration\\n\\n### Startup\\n\\n#### 500.000 API credits\\n\\n$49\\n\\n/mo\\n\\nFor small to medium sized teams looking to grow. \\n \\nPopular choice!\\n\\n[ Get Started ](https://app.scrapingant.com/signup)\\n\\n\\n\\nPriority email support\\n\\n\\n\\nExpert assistance\\n\\n\\n\\nIntegration with custom code snippets\\n\\n### Business\\n\\n#### 3.000.000 API credits\\n\\n$249\\n\\n/mo\\n\\nFor larger teams and companies.\\n\\n[ Get Started ](https://app.scrapingant.com/signup)\\n\\n\\n\\nPriority email support\\n\\n\\n\\nLive integration calls\\n\\n\\n\\nExpert guidance and integration planning\\n\\n\\n\\nCustom proxy pools\\n\\n\\n\\nCustom avoidances\\n\\n\\n\\nDedicated manager\\n\\n### Business Pro\\n\\n#### 8.000.000 API credits\\n\\n$599\\n\\n/mo\\n\\nExtended volume Business plan.\\n\\n[ Get Started ](https://app.scrapingant.com/signup)\\n\\n\\n\\nPriority email support\\n\\n\\n\\nLive integration calls\\n\\n\\n\\nExpert guidance and integration planning\\n\\n\\n\\nCustom proxy pools\\n\\n\\n\\nCustom avoidances\\n\\n\\n\\nDedicated manager\\n\\n### Custom Plan\\n\\n#### 10M+ API credits\\n\\n$699+\\n\\n/mo\\n\\nExplore custom deals and services we could provide for Enterprise level\\ncustomers.\\n\\n[ Contact us ](https://app.scrapingant.com/signup)\\n\\n\\n\\nFully customisable solution\\n\\n\\n\\nResidential Proxy special prices\\n\\n\\n\\nSLA\\n\\n[](https://www.capterra.com/p/214735/ScrapingAnt/reviews/)\\n\\nβ β β β β \\n\\n\\n\\n#### βOnboarding and API integration was smooth and clear. Everything works\\ngreat. The support was excellent. **Overall a great scraper**.β\\n\\nIllia K., Android Software Developer\\n\\nβ β β β β \\n\\n\\n\\n#### βGreat communication with co-founders helped me to get the job done.\\nGreat proxy diversity and good price.β\\n\\nAndrii M., Senior Software Engineer\\n\\nβ β β β β \\n\\n\\n\\n#### βThis product helps me to scale and extend my business. The API is easy\\nto integrate and support is really good.β\\n\\nDmytro T., Senior Software Engineer\\n\\n\\n\\n#### Frequently asked questions.\\n\\nIf you have any further questions, [Get in\\ntouch](https://scrapingant.com/#contact) with our friendly team\\n\\n##### What is ScrapingAnt?\\n\\n\\n\\nScrapingAnt is a service that helps you to solve scraping tasks of any\\ncomplexity. With using of millions proxies around the World and a whole\\nheadless browser cluster we can provide you the best web harvesting and\\nscraping experience. \\n \\nScrapingAnt also provides a custom software development service. Data\\nharvesting, data storage or data querying - we can provide you the best and\\naffordable custom solution that fits all your needs.\\n\\n##### **What is an API Credit?**\\n\\n\\n\\nEach subscription plan contains a particular amount of API credits per month.\\nDepending on the parameters you configures your API calls it will cost you\\nfrom one to several credits. By default, each request costs 10 API credits\\nbecause JavaScript rendering and Standard proxies are enabled. [Learn more\\nabout requests costs](https://docs.scrapingant.com/api-credits-usage).\\n\\n##### I'm not a developer, can you create custom scraping solutions for me?\\n\\n\\n\\nYes of course! We regularly create custom scraping scripts and projects for\\nour clients. We are also partnering with several custom software development\\ncompanies, so we won't never be out of resources to help with a scraping\\nproject of any size. Just [Contact Us](https://scrapingant.com/#contact) and\\ndescribe your needs.\\n\\n##### Do I need a credit cart to start the free trial?\\n\\n\\n\\nScrapingAnt provides a completely free subscription plan which contains 10.000\\nAPI credits that can be consumed during month. Until you will need more - it\\nis completely free and doesn't require a credit card.\\n\\n### βOur clients are pleasantly surprised by the response speed of our team.β\\n\\n\\n\\nOleg Kulyk, \\nScrapingAnt Founder\\n\\n* Our team will contact you ASAP.\\n\\nThank you! Your submission has been received!\\n\\nOops! Something went wrong while submitting the form.\\n\\n\\n\\n## Grow your business with us\\n\\n[ Try Our Free Plan! ](https://app.scrapingant.com/signup)\\n\\n[\\n\\n## Features\\n\\n](https://scrapingant.com/#features) [\\n\\n## Pricing\\n\\n](https://scrapingant.com/#pricing) [\\n\\n## Blog\\n\\n](https://scrapingant.com/blog/) [\\n\\n## Documentation\\n\\n](https://docs.scrapingant.com/) [\\n\\n## Web Scraping API\\n\\n](https://scrapingant.com) [\\n\\n## LLM-ready web data\\n\\n](llm-ready-data-extraction.html) [\\n\\n## Residential Proxy\\n\\n](residential-proxies.html) [\\n\\n## Custom Scraper Development\\n\\n](https://scrapingant.com/custom-scraping-solution) [\\n\\n## Affiliate program\\n\\n](https://scrapingant.com/legal/affiliate/) [\\n\\n## Free proxies\\n\\n](https://scrapingant.com/free-proxies/)\\n\\n###### Web Scraping 101 \\n\\n[What is Web Scraping?](https://docs.scrapingant.com/web-scraping-101/what-is-\\nweb-scraping) [**Is Web Scraping Legal?**](https://scrapingant.com/blog/is-\\nweb-scraping-legal) [**10 Main Proxy\\nTypes**](https://scrapingant.com/blog/main-proxy-types) [Datacenter vs\\nResidential Proxies](https://scrapingant.com/blog/residential-vs-datacenter-\\nproxy-webscraping) [Best Proxy Scraping\\nTools](https://scrapingant.com/blog/top-open-source-proxy-scrapers)\\n[**Overcoming scraping challenges with Web Scraping\\nAPI**](https://scrapingant.com/blog/data-scraping-challenges) [IP rate-\\nlimiting avoidance](https://scrapingant.com/blog/avoid-ip-rate-limiting)\\n[Rotating proxies with Puppeteer](https://scrapingant.com/blog/how-to-use-\\nrotating-proxies-with-puppeteer) [Scraping Dynamic Website with\\nPython](https://scrapingant.com/blog/scrape-dynamic-website-with-python) [Web\\nScraping with Python](https://scrapingant.com/blog/top-5-popular-python-\\nlibraries-for-web-scraping-in-2020) [Web Scraping with\\nJava](https://scrapingant.com/blog/web-scraping-java) [Web Scraping with\\nNodeJS](https://scrapingant.com/blog/web-scraping-javascript) [Web Scraping\\nwith Deno](https://scrapingant.com/blog/deno-web-scraping) [**Web Scraping\\nwith R**](https://scrapingant.com/blog/r-web-scraping) [**Web Scraping with\\nPHP**](https://scrapingant.com/blog/web-scraping-php) [**Web Scraping with\\nGo**](https://scrapingant.com/blog/web-scraping-go)\\n\\n###### Use Cases \\n\\n[**Real estate decisions with Booking.com\\nscraping**](https://scrapingant.com/blog/booking-data-scraping) [**Sneaker\\nPrice Data Collection with Web Scraping\\nAPI**](https://scrapingant.com/blog/sneakers-scraping-api) [**Best Web\\nScraping APIs For Freelancers**](https://scrapingant.com/blog/best-web-\\nscraping-api-freelance) [**Smart NFT Decisions with Data\\nCollection**](https://scrapingant.com/blog/nft-data-collection) [**How Data\\nCollection Can Improve HR Processes**](https://scrapingant.com/blog/data-\\ncollection-for-hr-processes) [**Rule eCommerce with Data\\nCollection**](https://scrapingant.com/blog/data-collection-for-ecommerce)\\n[**How companies use Web Scraping to gain a Competitive\\nEdge**](https://scrapingant.com/blog/how-companies-use-web-scraping)\\n[**Benefits of Web Scraping for\\nHospitality**](https://scrapingant.com/blog/web-scraping-for-hospitality)\\n[**Uses of Web Scraping for Price\\nMonitoring**](https://scrapingant.com/blog/web-scraping-for-price-monitoring)\\n[**Benefits of Web Scraping for Real\\nEstate**](https://scrapingant.com/blog/web-scraping-for-real-estate) [**Web\\nScraping for Data Scientists**](https://scrapingant.com/blog/web-scraping-for-\\ndata-scientists) [**How to Collect Data from\\nTikTok**](https://scrapingant.com/blog/web-scraping-for-price-monitoring)\\n\\n###### Legal \\n\\n[Terms of Use](https://scrapingant.com/legal/terms-of-use) [Privacy\\nPolicy](https://scrapingant.com/legal/privacy-policy) [Cookies\\nPolicy](https://scrapingant.com/legal/cookies-policy)\\n\\n###### External Links \\n\\n[Github](https://github.com/ScrapingAnt)\\n[Linkedin](https://linkedin.com/company/scrapingant)\\n[Facebook](https://www.facebook.com/scrapingant)\\n[Twitter](https://twitter.com/ScrapingAnt)\\n\\n[](https://scrapingant.com)\\n\\nΒ© Copyright ScrapingAnt \\nPowered by [DATAANT](https://scrapingant.com)\\n\\n\\n\\nBy browsing this site, you agree to our [Cookies\\nPolicy](https://scrapingant.com/legal/cookies-policy)\\n\\n\\n\\n\")]\n" - ] - } - ], - "execution_count": 5 + ] }, { - "metadata": {}, "cell_type": "markdown", + "metadata": {}, "source": [ "## Load\n", "\n", @@ -121,10 +125,10 @@ ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Load documents from URLs as markdown\n", "documents = scrapingant_loader.load()\n", @@ -133,8 +137,8 @@ ] }, { - "metadata": {}, "cell_type": "markdown", + "metadata": {}, "source": [ "## Lazy Load\n", "\n", @@ -142,10 +146,10 @@ ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Lazy load documents from URLs as markdown\n", "lazy_documents = scrapingant_loader.lazy_load()\n", @@ -155,8 +159,8 @@ ] }, { - "metadata": {}, "cell_type": "markdown", + "metadata": {}, "source": [ "## API reference\n", "\n", diff --git a/docs/docs/integrations/document_loaders/youtube_transcript.ipynb b/docs/docs/integrations/document_loaders/youtube_transcript.ipynb index 77ed5a40163..8c24d07bdf8 100644 --- a/docs/docs/integrations/document_loaders/youtube_transcript.ipynb +++ b/docs/docs/integrations/document_loaders/youtube_transcript.ipynb @@ -15,45 +15,47 @@ }, { "cell_type": "code", + "execution_count": null, "id": "427d5745", "metadata": {}, - "source": "from langchain_community.document_loaders import YoutubeLoader", "outputs": [], - "execution_count": null + "source": [ + "from langchain_community.document_loaders import YoutubeLoader" + ] }, { "cell_type": "code", + "execution_count": null, "id": "34a25b57", "metadata": { "scrolled": true }, + "outputs": [], "source": [ "%pip install --upgrade --quiet youtube-transcript-api" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "code", + "execution_count": null, "id": "bc8b308a", "metadata": {}, + "outputs": [], "source": [ "loader = YoutubeLoader.from_youtube_url(\n", " \"https://www.youtube.com/watch?v=QsYGlZkevEg\", add_video_info=False\n", ")" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "code", + "execution_count": null, "id": "d073dd36", "metadata": {}, + "outputs": [], "source": [ "loader.load()" - ], - "outputs": [], - "execution_count": null + ] }, { "attachments": {}, @@ -66,26 +68,26 @@ }, { "cell_type": "code", + "execution_count": null, "id": "ba28af69", "metadata": {}, + "outputs": [], "source": [ "%pip install --upgrade --quiet pytube" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "code", + "execution_count": null, "id": "9b8ea390", "metadata": {}, + "outputs": [], "source": [ "loader = YoutubeLoader.from_youtube_url(\n", " \"https://www.youtube.com/watch?v=QsYGlZkevEg\", add_video_info=True\n", ")\n", "loader.load()" - ], - "outputs": [], - "execution_count": null + ] }, { "attachments": {}, @@ -102,8 +104,10 @@ }, { "cell_type": "code", + "execution_count": null, "id": "08510625", "metadata": {}, + "outputs": [], "source": [ "loader = YoutubeLoader.from_youtube_url(\n", " \"https://www.youtube.com/watch?v=QsYGlZkevEg\",\n", @@ -112,13 +116,12 @@ " translation=\"en\",\n", ")\n", "loader.load()" - ], - "outputs": [], - "execution_count": null + ] }, { - "metadata": {}, "cell_type": "markdown", + "id": "69f4e399a9764d73", + "metadata": {}, "source": [ "### Get transcripts as timestamped chunks\n", "\n", @@ -127,12 +130,14 @@ "`transcript_format` param: One of the `langchain_community.document_loaders.youtube.TranscriptFormat` values. In this case, `TranscriptFormat.CHUNKS`.\n", "\n", "`chunk_size_seconds` param: An integer number of video seconds to be represented by each chunk of transcript data. Default is 120 seconds." - ], - "id": "69f4e399a9764d73" + ] }, { - "metadata": {}, "cell_type": "code", + "execution_count": null, + "id": "540bbf19182f38bc", + "metadata": {}, + "outputs": [], "source": [ "from langchain_community.document_loaders.youtube import TranscriptFormat\n", "\n", @@ -143,10 +148,7 @@ " chunk_size_seconds=30,\n", ")\n", "print(\"\\n\\n\".join(map(repr, loader.load())))" - ], - "id": "540bbf19182f38bc", - "outputs": [], - "execution_count": null + ] }, { "attachments": {}, @@ -172,8 +174,10 @@ }, { "cell_type": "code", + "execution_count": null, "id": "c345bc43", "metadata": {}, + "outputs": [], "source": [ "# Init the GoogleApiClient\n", "from pathlib import Path\n", @@ -198,9 +202,7 @@ "\n", "# returns a list of Documents\n", "youtube_loader_channel.load()" - ], - "outputs": [], - "execution_count": null + ] } ], "metadata": { diff --git a/docs/docs/integrations/document_transformers/openvino_rerank.ipynb b/docs/docs/integrations/document_transformers/openvino_rerank.ipynb index 14da3d1222c..546d8df779a 100644 --- a/docs/docs/integrations/document_transformers/openvino_rerank.ipynb +++ b/docs/docs/integrations/document_transformers/openvino_rerank.ipynb @@ -331,8 +331,8 @@ } ], "source": [ - "from langchain.embeddings import OpenVINOEmbeddings\n", "from langchain_community.document_loaders import TextLoader\n", + "from langchain_community.embeddings import OpenVINOEmbeddings\n", "from langchain_community.vectorstores import FAISS\n", "from langchain_text_splitters import RecursiveCharacterTextSplitter\n", "\n", diff --git a/docs/docs/integrations/graphs/amazon_neptune_sparql.ipynb b/docs/docs/integrations/graphs/amazon_neptune_sparql.ipynb index 9aa1e1a3513..1e1ddf199ae 100644 --- a/docs/docs/integrations/graphs/amazon_neptune_sparql.ipynb +++ b/docs/docs/integrations/graphs/amazon_neptune_sparql.ipynb @@ -245,8 +245,8 @@ "outputs": [], "source": [ "import boto3\n", - "from langchain.chains.graph_qa.neptune_sparql import NeptuneSparqlQAChain\n", "from langchain_aws import ChatBedrock\n", + "from langchain_community.chains.graph_qa.neptune_sparql import NeptuneSparqlQAChain\n", "from langchain_community.graphs import NeptuneRdfGraph\n", "\n", "host = \"\"\n", diff --git a/docs/docs/integrations/graphs/azure_cosmosdb_gremlin.ipynb b/docs/docs/integrations/graphs/azure_cosmosdb_gremlin.ipynb index c6ac9dbf63d..b71937014bc 100644 --- a/docs/docs/integrations/graphs/azure_cosmosdb_gremlin.ipynb +++ b/docs/docs/integrations/graphs/azure_cosmosdb_gremlin.ipynb @@ -65,7 +65,7 @@ "outputs": [], "source": [ "import nest_asyncio\n", - "from langchain.chains.graph_qa.gremlin import GremlinQAChain\n", + "from langchain_community.chains.graph_qa.gremlin import GremlinQAChain\n", "from langchain_community.graphs import GremlinGraph\n", "from langchain_community.graphs.graph_document import GraphDocument, Node, Relationship\n", "from langchain_core.documents import Document\n", diff --git a/docs/docs/integrations/graphs/networkx.ipynb b/docs/docs/integrations/graphs/networkx.ipynb index 675db35dfbe..518d105afea 100644 --- a/docs/docs/integrations/graphs/networkx.ipynb +++ b/docs/docs/integrations/graphs/networkx.ipynb @@ -49,7 +49,7 @@ "metadata": {}, "outputs": [], "source": [ - "from langchain.indexes import GraphIndexCreator\n", + "from langchain_community.graphs.index_creator import GraphIndexCreator\n", "from langchain_openai import OpenAI" ] }, @@ -252,7 +252,7 @@ "metadata": {}, "outputs": [], "source": [ - "from langchain.indexes.graph import NetworkxEntityGraph" + "from langchain_community.graphs import NetworkxEntityGraph" ] }, { diff --git a/docs/docs/integrations/llms/konko.ipynb b/docs/docs/integrations/llms/konko.ipynb index 67bccb81fe6..4a92f0b1c2a 100644 --- a/docs/docs/integrations/llms/konko.ipynb +++ b/docs/docs/integrations/llms/konko.ipynb @@ -74,7 +74,7 @@ } ], "source": [ - "from langchain.llms import Konko\n", + "from langchain_community.llms import Konko\n", "\n", "llm = Konko(model=\"mistralai/mistral-7b-v0.1\", temperature=0.1, max_tokens=128)\n", "\n", diff --git a/docs/docs/integrations/memory/motorhead_memory.ipynb b/docs/docs/integrations/memory/motorhead_memory.ipynb index 60d36996e2a..69f321a07cc 100644 --- a/docs/docs/integrations/memory/motorhead_memory.ipynb +++ b/docs/docs/integrations/memory/motorhead_memory.ipynb @@ -19,7 +19,7 @@ "metadata": {}, "outputs": [], "source": [ - "from langchain.memory.motorhead_memory import MotorheadMemory" + "from langchain_community.memory.motorhead_memory import MotorheadMemory" ] }, { diff --git a/docs/docs/integrations/memory/zep_memory.ipynb b/docs/docs/integrations/memory/zep_memory.ipynb index 7226b2176a0..cf722cab422 100644 --- a/docs/docs/integrations/memory/zep_memory.ipynb +++ b/docs/docs/integrations/memory/zep_memory.ipynb @@ -48,7 +48,7 @@ "from uuid import uuid4\n", "\n", "from langchain.agents import AgentType, initialize_agent\n", - "from langchain.memory import ZepMemory\n", + "from langchain_community.memory.zep_memory import ZepMemory\n", "from langchain_community.retrievers import ZepRetriever\n", "from langchain_community.utilities import WikipediaAPIWrapper\n", "from langchain_core.messages import AIMessage, HumanMessage\n", diff --git a/docs/docs/integrations/memory/zep_memory_cloud.ipynb b/docs/docs/integrations/memory/zep_memory_cloud.ipynb index 64f8e3c0d55..0dca18045fc 100644 --- a/docs/docs/integrations/memory/zep_memory_cloud.ipynb +++ b/docs/docs/integrations/memory/zep_memory_cloud.ipynb @@ -69,11 +69,12 @@ "source": [ "from uuid import uuid4\n", "\n", - "from langchain.agents import AgentType, Tool, initialize_agent\n", + "from langchain.agents import AgentType, initialize_agent\n", "from langchain_community.memory.zep_cloud_memory import ZepCloudMemory\n", "from langchain_community.retrievers import ZepCloudRetriever\n", "from langchain_community.utilities import WikipediaAPIWrapper\n", "from langchain_core.messages import AIMessage, HumanMessage\n", + "from langchain_core.tools import Tool\n", "from langchain_openai import OpenAI\n", "\n", "session_id = str(uuid4()) # This is a unique identifier for the session" diff --git a/docs/docs/integrations/platforms/aws.mdx b/docs/docs/integrations/platforms/aws.mdx index 3352b82e12a..601ef5c75d1 100755 --- a/docs/docs/integrations/platforms/aws.mdx +++ b/docs/docs/integrations/platforms/aws.mdx @@ -308,7 +308,7 @@ See a [usage example](/docs/integrations/graphs/amazon_neptune_open_cypher). ```python from langchain_community.graphs import NeptuneGraph from langchain_community.graphs import NeptuneAnalyticsGraph -from langchain.chains import NeptuneOpenCypherQAChain +from langchain_community.chains.graph_qa.neptune_cypher import NeptuneOpenCypherQAChain ``` ### Amazon Neptune with SPARQL @@ -317,7 +317,7 @@ See a [usage example](/docs/integrations/graphs/amazon_neptune_sparql). ```python from langchain_community.graphs import NeptuneRdfGraph -from langchain.chains.graph_qa.neptune_sparql import NeptuneSparqlQAChain +from langchain_community.chains.graph_qa.neptune_sparql import NeptuneSparqlQAChain ``` diff --git a/docs/docs/integrations/platforms/huggingface.mdx b/docs/docs/integrations/platforms/huggingface.mdx index 7dce735044d..0ddfaa6d58e 100644 --- a/docs/docs/integrations/platforms/huggingface.mdx +++ b/docs/docs/integrations/platforms/huggingface.mdx @@ -122,5 +122,5 @@ pip install transformers huggingface_hub See a [usage example](/docs/integrations/tools/huggingface_tools). ```python -from langchain.agents import load_huggingface_tool +from langchain_community.agent_toolkits.load_tools import load_huggingface_tool ``` diff --git a/docs/docs/integrations/providers/github.mdx b/docs/docs/integrations/providers/github.mdx index 2030e985948..2296174632c 100644 --- a/docs/docs/integrations/providers/github.mdx +++ b/docs/docs/integrations/providers/github.mdx @@ -18,6 +18,5 @@ There are two document loaders available for GitHub. See a [usage example](/docs/integrations/document_loaders/github). ```python -from langchain_community.document_loaders import GitHubIssuesLoader -from langchain.document_loaders import GithubFileLoader +from langchain_community.document_loaders import GitHubIssuesLoader, GithubFileLoader ``` diff --git a/docs/docs/integrations/providers/konko.mdx b/docs/docs/integrations/providers/konko.mdx index 88b612dbc09..c7146778c96 100644 --- a/docs/docs/integrations/providers/konko.mdx +++ b/docs/docs/integrations/providers/konko.mdx @@ -41,7 +41,7 @@ See a usage [example](/docs/integrations/llms/konko). - **Completion with mistralai/Mistral-7B-v0.1:** ```python - from langchain.llms import Konko + from langchain_community.llms import Konko llm = Konko(max_tokens=800, model='mistralai/Mistral-7B-v0.1') prompt = "Generate a Product Description for Apple Iphone 15" response = llm.invoke(prompt) diff --git a/docs/docs/integrations/providers/mlflow_tracking.ipynb b/docs/docs/integrations/providers/mlflow_tracking.ipynb index 8161302b125..aadc3f9611c 100644 --- a/docs/docs/integrations/providers/mlflow_tracking.ipynb +++ b/docs/docs/integrations/providers/mlflow_tracking.ipynb @@ -167,7 +167,7 @@ "metadata": {}, "outputs": [], "source": [ - "from langchain.schema.output_parser import StrOutputParser\n", + "from langchain_core.output_parsers import StrOutputParser\n", "from langchain_core.prompts import ChatPromptTemplate\n", "from langchain_openai import ChatOpenAI\n", "\n", diff --git a/docs/docs/integrations/providers/motorhead.mdx b/docs/docs/integrations/providers/motorhead.mdx index 14d2c834218..0d88c47f0d4 100644 --- a/docs/docs/integrations/providers/motorhead.mdx +++ b/docs/docs/integrations/providers/motorhead.mdx @@ -12,5 +12,5 @@ See instructions at [MotΓΆrhead](https://github.com/getmetal/motorhead) for runn See a [usage example](/docs/integrations/memory/motorhead_memory). ```python -from langchain.memory import MotorheadMemory +from langchain_community.memory import MotorheadMemory ``` diff --git a/docs/docs/integrations/providers/vectara/vectara_chat.ipynb b/docs/docs/integrations/providers/vectara/vectara_chat.ipynb index 585643af35e..f31f7599a28 100644 --- a/docs/docs/integrations/providers/vectara/vectara_chat.ipynb +++ b/docs/docs/integrations/providers/vectara/vectara_chat.ipynb @@ -108,7 +108,7 @@ }, "outputs": [], "source": [ - "from langchain.document_loaders import TextLoader\n", + "from langchain_community.document_loaders import TextLoader\n", "\n", "loader = TextLoader(\"state_of_the_union.txt\")\n", "documents = loader.load()\n", diff --git a/docs/docs/integrations/providers/zep.mdx b/docs/docs/integrations/providers/zep.mdx index c7e8c038bd6..343bfd83a95 100644 --- a/docs/docs/integrations/providers/zep.mdx +++ b/docs/docs/integrations/providers/zep.mdx @@ -86,7 +86,7 @@ See a [Perpetual Memory Example here](/docs/integrations/memory/zep_cloud_chat_m You can use `ZepCloudMemory` together with agents that support Memory. ```python -from langchain.memory import ZepCloudMemory +from langchain_community.memory import ZepCloudMemory ``` See a [Memory RAG Example here](/docs/integrations/memory/zep_memory_cloud). @@ -117,4 +117,4 @@ MMR search is useful for ensuring that the retrieved documents are diverse and n from langchain_community.vectorstores import ZepCloudVectorStore ``` -See a [usage example](/docs/integrations/vectorstores/zep_cloud). \ No newline at end of file +See a [usage example](/docs/integrations/vectorstores/zep_cloud). diff --git a/docs/docs/integrations/retrievers/dria_index.ipynb b/docs/docs/integrations/retrievers/dria_index.ipynb index eb3b858c0e9..501f38f4ba4 100644 --- a/docs/docs/integrations/retrievers/dria_index.ipynb +++ b/docs/docs/integrations/retrievers/dria_index.ipynb @@ -76,7 +76,7 @@ }, "outputs": [], "source": [ - "from langchain.retrievers import DriaRetriever\n", + "from langchain_community.retrievers import DriaRetriever\n", "\n", "api_key = os.getenv(\"DRIA_API_KEY\")\n", "retriever = DriaRetriever(api_key=api_key)" diff --git a/docs/docs/integrations/retrievers/self_query/milvus_self_query.ipynb b/docs/docs/integrations/retrievers/self_query/milvus_self_query.ipynb index 477b9b5f019..c43ab4cf2c4 100644 --- a/docs/docs/integrations/retrievers/self_query/milvus_self_query.ipynb +++ b/docs/docs/integrations/retrievers/self_query/milvus_self_query.ipynb @@ -379,4 +379,4 @@ }, "nbformat": 4, "nbformat_minor": 4 -} \ No newline at end of file +} diff --git a/docs/docs/integrations/retrievers/self_query/vectara_self_query.ipynb b/docs/docs/integrations/retrievers/self_query/vectara_self_query.ipynb index 885b9ac995e..72e242b16d7 100644 --- a/docs/docs/integrations/retrievers/self_query/vectara_self_query.ipynb +++ b/docs/docs/integrations/retrievers/self_query/vectara_self_query.ipynb @@ -85,13 +85,14 @@ "source": [ "import os\n", "\n", + "from langchain_core.documents import Document\n", + "\n", "os.environ[\"VECTARA_API_KEY\"] = \"\"\n", "os.environ[\"VECTARA_CORPUS_ID\"] = \"\"\n", "os.environ[\"VECTARA_CUSTOMER_ID\"] = \"\"\n", "\n", "from langchain.chains.query_constructor.base import AttributeInfo\n", "from langchain.retrievers.self_query.base import SelfQueryRetriever\n", - "from langchain.schema import Document\n", "from langchain_community.vectorstores import Vectara\n", "from langchain_openai.chat_models import ChatOpenAI" ] diff --git a/docs/docs/integrations/retrievers/thirdai_neuraldb.ipynb b/docs/docs/integrations/retrievers/thirdai_neuraldb.ipynb index c1dc3376232..41ce474f625 100644 --- a/docs/docs/integrations/retrievers/thirdai_neuraldb.ipynb +++ b/docs/docs/integrations/retrievers/thirdai_neuraldb.ipynb @@ -23,7 +23,7 @@ "metadata": {}, "outputs": [], "source": [ - "from langchain.retrievers import NeuralDBRetriever\n", + "from langchain_community.retrievers import NeuralDBRetriever\n", "\n", "# From scratch\n", "retriever = NeuralDBRetriever.from_scratch(thirdai_key=\"your-thirdai-key\")\n", diff --git a/docs/docs/integrations/retrievers/zep_memorystore.ipynb b/docs/docs/integrations/retrievers/zep_memorystore.ipynb index b572d4d62bb..3824dc41620 100644 --- a/docs/docs/integrations/retrievers/zep_memorystore.ipynb +++ b/docs/docs/integrations/retrievers/zep_memorystore.ipynb @@ -60,7 +60,7 @@ "import time\n", "from uuid import uuid4\n", "\n", - "from langchain.memory import ZepMemory\n", + "from langchain_community.memory.zep_memory import ZepMemory\n", "from langchain_core.messages import AIMessage, HumanMessage\n", "\n", "# Set this to your Zep server URL\n", diff --git a/docs/docs/integrations/retrievers/zilliz_cloud_pipeline.ipynb b/docs/docs/integrations/retrievers/zilliz_cloud_pipeline.ipynb index bfbf6ff9234..13fdb7e15b3 100644 --- a/docs/docs/integrations/retrievers/zilliz_cloud_pipeline.ipynb +++ b/docs/docs/integrations/retrievers/zilliz_cloud_pipeline.ipynb @@ -219,4 +219,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +} diff --git a/docs/docs/integrations/text_embedding/bge_huggingface.ipynb b/docs/docs/integrations/text_embedding/bge_huggingface.ipynb index 14fd5d9b876..dfc6de33443 100644 --- a/docs/docs/integrations/text_embedding/bge_huggingface.ipynb +++ b/docs/docs/integrations/text_embedding/bge_huggingface.ipynb @@ -43,10 +43,12 @@ ] }, { - "metadata": {}, "cell_type": "markdown", - "source": "Note that you need to pass `query_instruction=\"\"` for `model_name=\"BAAI/bge-m3\"` see [FAQ BGE M3](https://huggingface.co/BAAI/bge-m3#faq). ", - "id": "f35d54e529c4cb77" + "id": "f35d54e529c4cb77", + "metadata": {}, + "source": [ + "Note that you need to pass `query_instruction=\"\"` for `model_name=\"BAAI/bge-m3\"` see [FAQ BGE M3](https://huggingface.co/BAAI/bge-m3#faq). " + ] }, { "cell_type": "code", diff --git a/docs/docs/integrations/text_embedding/pinecone.ipynb b/docs/docs/integrations/text_embedding/pinecone.ipynb index f9b50d732c3..cfde2be6969 100644 --- a/docs/docs/integrations/text_embedding/pinecone.ipynb +++ b/docs/docs/integrations/text_embedding/pinecone.ipynb @@ -2,40 +2,45 @@ "cells": [ { "cell_type": "markdown", + "id": "f4b5d823fee826c2", + "metadata": { + "collapsed": false + }, "source": [ "# Pinecone Embeddings\n", "\n", "Pinecone's inference API can be accessed via `PineconeEmbeddings`. Providing text embeddings via the Pinecone service. We start by installing prerequisite libraries:" - ], - "metadata": { - "collapsed": false - }, - "id": "f4b5d823fee826c2" + ] }, { "cell_type": "code", + "execution_count": null, + "id": "3bc5d3a5ed7f5ce3", + "metadata": { + "collapsed": false + }, "outputs": [], "source": [ "!pip install -qU \"langchain-pinecone>=0.2.0\" " - ], - "metadata": { - "collapsed": false - }, - "id": "3bc5d3a5ed7f5ce3", - "execution_count": null + ] }, { "cell_type": "markdown", - "source": [ - "Next, we [sign up / log in to Pinecone](https://app.pinecone.io) to get our API key:" - ], + "id": "62a77d25c3fd8bd5", "metadata": { "collapsed": false }, - "id": "62a77d25c3fd8bd5" + "source": [ + "Next, we [sign up / log in to Pinecone](https://app.pinecone.io) to get our API key:" + ] }, { "cell_type": "code", + "execution_count": null, + "id": "8162dbcbcf7d3d55", + "metadata": { + "collapsed": false + }, "outputs": [], "source": [ "import os\n", @@ -44,49 +49,49 @@ "os.environ[\"PINECONE_API_KEY\"] = os.getenv(\"PINECONE_API_KEY\") or getpass(\n", " \"Enter your Pinecone API key: \"\n", ")" - ], - "metadata": { - "collapsed": false - }, - "id": "8162dbcbcf7d3d55", - "execution_count": null + ] }, { "cell_type": "markdown", - "source": [ - "Check the document for available [models](https://docs.pinecone.io/models/overview). Now we initialize our embedding model like so:" - ], + "id": "98d860a0a2d8b907", "metadata": { "collapsed": false }, - "id": "98d860a0a2d8b907" + "source": [ + "Check the document for available [models](https://docs.pinecone.io/models/overview). Now we initialize our embedding model like so:" + ] }, { "cell_type": "code", + "execution_count": null, + "id": "2b3adb72786a5275", + "metadata": { + "collapsed": false + }, "outputs": [], "source": [ "from langchain_pinecone import PineconeEmbeddings\n", "\n", "embeddings = PineconeEmbeddings(model=\"multilingual-e5-large\")" - ], - "metadata": { - "collapsed": false - }, - "id": "2b3adb72786a5275", - "execution_count": null + ] }, { "cell_type": "markdown", - "source": [ - "From here we can create embeddings either sync or async, let's start with sync! We embed a single text as a query embedding (ie what we search with in RAG) using `embed_query`:" - ], + "id": "11e24da855517230", "metadata": { "collapsed": false }, - "id": "11e24da855517230" + "source": [ + "From here we can create embeddings either sync or async, let's start with sync! We embed a single text as a query embedding (ie what we search with in RAG) using `embed_query`:" + ] }, { "cell_type": "code", + "execution_count": null, + "id": "2da515e2a61ef7e9", + "metadata": { + "collapsed": false + }, "outputs": [], "source": [ "docs = [\n", @@ -96,39 +101,34 @@ " \"Apple Inc. has revolutionized the tech industry with its sleek designs and user-friendly interfaces.\",\n", " \"An apple a day keeps the doctor away, as the saying goes.\",\n", "]" - ], - "metadata": { - "collapsed": false - }, - "id": "2da515e2a61ef7e9", - "execution_count": null + ] }, { "cell_type": "code", + "execution_count": null, + "id": "2897e0d570c90b2f", + "metadata": { + "collapsed": false + }, "outputs": [], "source": [ "doc_embeds = embeddings.embed_documents(docs)\n", "doc_embeds" - ], - "metadata": { - "collapsed": false - }, - "id": "2897e0d570c90b2f", - "execution_count": null + ] }, { "cell_type": "code", + "execution_count": null, + "id": "510784963c0e17a", + "metadata": { + "collapsed": false + }, "outputs": [], "source": [ "query = \"Tell me about the tech company known as Apple\"\n", "query_embed = embeddings.embed_query(query)\n", "query_embed" - ], - "metadata": { - "collapsed": false - }, - "id": "510784963c0e17a", - "execution_count": null + ] } ], "metadata": { diff --git a/docs/docs/integrations/tools/financial_datasets.ipynb b/docs/docs/integrations/tools/financial_datasets.ipynb index 807d720d0a0..35f2b5d1904 100644 --- a/docs/docs/integrations/tools/financial_datasets.ipynb +++ b/docs/docs/integrations/tools/financial_datasets.ipynb @@ -2,6 +2,7 @@ "cells": [ { "cell_type": "markdown", + "id": "9f9afdec", "metadata": { "collapsed": false }, @@ -21,6 +22,7 @@ { "cell_type": "code", "execution_count": null, + "id": "0c9e4bc1", "metadata": { "collapsed": false }, @@ -35,6 +37,7 @@ { "cell_type": "code", "execution_count": null, + "id": "0938e69e", "metadata": { "collapsed": false }, @@ -45,6 +48,7 @@ }, { "cell_type": "markdown", + "id": "a362df50", "metadata": { "collapsed": false }, @@ -114,6 +118,7 @@ }, { "cell_type": "markdown", + "id": "6cd0b36e", "metadata": { "collapsed": false }, @@ -126,6 +131,7 @@ { "cell_type": "code", "execution_count": null, + "id": "b68b7aae", "metadata": { "collapsed": false }, @@ -167,6 +173,7 @@ }, { "cell_type": "markdown", + "id": "687e6067", "metadata": { "collapsed": false }, @@ -189,6 +196,7 @@ }, { "cell_type": "markdown", + "id": "4572f574", "metadata": { "collapsed": false }, @@ -208,6 +216,7 @@ }, { "cell_type": "markdown", + "id": "1df02a16", "metadata": { "collapsed": false }, @@ -218,6 +227,7 @@ { "cell_type": "code", "execution_count": null, + "id": "bb1b72ca", "metadata": { "collapsed": false }, @@ -242,6 +252,7 @@ }, { "cell_type": "markdown", + "id": "d74ba1d3", "metadata": { "collapsed": false }, @@ -252,6 +263,7 @@ { "cell_type": "code", "execution_count": null, + "id": "d7f4d8db", "metadata": { "collapsed": false }, @@ -262,6 +274,7 @@ }, { "cell_type": "markdown", + "id": "d72ed402", "metadata": { "collapsed": false }, @@ -273,6 +286,7 @@ }, { "cell_type": "markdown", + "id": "056204cc", "metadata": { "collapsed": false }, diff --git a/docs/docs/integrations/tools/huggingface_tools.ipynb b/docs/docs/integrations/tools/huggingface_tools.ipynb index 8408d373891..d720ad02dd0 100644 --- a/docs/docs/integrations/tools/huggingface_tools.ipynb +++ b/docs/docs/integrations/tools/huggingface_tools.ipynb @@ -49,7 +49,7 @@ } ], "source": [ - "from langchain.agents import load_huggingface_tool\n", + "from langchain_community.agent_toolkits.load_tools import load_huggingface_tool\n", "\n", "tool = load_huggingface_tool(\"lysandre/hf-model-downloads\")\n", "\n", diff --git a/docs/docs/integrations/tools/openapi.ipynb b/docs/docs/integrations/tools/openapi.ipynb index c01cd1f3236..16239c83fdc 100644 --- a/docs/docs/integrations/tools/openapi.ipynb +++ b/docs/docs/integrations/tools/openapi.ipynb @@ -169,7 +169,7 @@ "outputs": [], "source": [ "import spotipy.util as util\n", - "from langchain.requests import RequestsWrapper\n", + "from langchain_community.utilities.requests import RequestsWrapper\n", "\n", "\n", "def construct_spotify_auth_headers(raw_spec: dict):\n", diff --git a/docs/docs/integrations/vectorstores/aperturedb.ipynb b/docs/docs/integrations/vectorstores/aperturedb.ipynb index ebd9bfa8e45..c72fcc83b1f 100644 --- a/docs/docs/integrations/vectorstores/aperturedb.ipynb +++ b/docs/docs/integrations/vectorstores/aperturedb.ipynb @@ -138,7 +138,7 @@ "metadata": {}, "outputs": [], "source": [ - "from langchain.text_splitter import RecursiveCharacterTextSplitter\n", + "from langchain_text_splitters import RecursiveCharacterTextSplitter\n", "\n", "text_splitter = RecursiveCharacterTextSplitter()\n", "documents = text_splitter.split_documents(docs)" diff --git a/docs/docs/integrations/vectorstores/azure_cosmos_db.ipynb b/docs/docs/integrations/vectorstores/azure_cosmos_db.ipynb index 0a0b011e419..f4d93afa013 100644 --- a/docs/docs/integrations/vectorstores/azure_cosmos_db.ipynb +++ b/docs/docs/integrations/vectorstores/azure_cosmos_db.ipynb @@ -355,7 +355,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b63c73c7e905001c", + "id": "50bb4346", "metadata": {}, "outputs": [], "source": [] diff --git a/docs/docs/integrations/vectorstores/infinispanvs.ipynb b/docs/docs/integrations/vectorstores/infinispanvs.ipynb index ca3a28a1bb3..f8251676df4 100644 --- a/docs/docs/integrations/vectorstores/infinispanvs.ipynb +++ b/docs/docs/integrations/vectorstores/infinispanvs.ipynb @@ -119,8 +119,8 @@ "metadata": {}, "outputs": [], "source": [ - "from langchain.embeddings import HuggingFaceEmbeddings\n", "from langchain_core.embeddings import Embeddings\n", + "from langchain_huggingface import HuggingFaceEmbeddings\n", "\n", "model_name = \"sentence-transformers/all-MiniLM-L12-v2\"\n", "hf = HuggingFaceEmbeddings(model_name=model_name)" diff --git a/docs/docs/integrations/vectorstores/manticore_search.ipynb b/docs/docs/integrations/vectorstores/manticore_search.ipynb index f606d84eb11..15cf4daf0d5 100644 --- a/docs/docs/integrations/vectorstores/manticore_search.ipynb +++ b/docs/docs/integrations/vectorstores/manticore_search.ipynb @@ -174,9 +174,9 @@ }, "outputs": [], "source": [ - "from langchain.text_splitter import CharacterTextSplitter\n", "from langchain_community.embeddings import GPT4AllEmbeddings\n", - "from langchain_community.vectorstores import ManticoreSearch, ManticoreSearchSettings" + "from langchain_community.vectorstores import ManticoreSearch, ManticoreSearchSettings\n", + "from langchain_text_splitters import CharacterTextSplitter" ] }, { diff --git a/docs/docs/tutorials/local_rag.ipynb b/docs/docs/tutorials/local_rag.ipynb index e4c3f536b7c..5d122de3c4b 100644 --- a/docs/docs/tutorials/local_rag.ipynb +++ b/docs/docs/tutorials/local_rag.ipynb @@ -87,8 +87,8 @@ "metadata": {}, "outputs": [], "source": [ - "from langchain.text_splitter import RecursiveCharacterTextSplitter\n", "from langchain_community.document_loaders import WebBaseLoader\n", + "from langchain_text_splitters import RecursiveCharacterTextSplitter\n", "\n", "loader = WebBaseLoader(\"https://lilianweng.github.io/posts/2023-06-23-agent/\")\n", "data = loader.load()\n", diff --git a/docs/docs/versions/migrating_chains/conversation_retrieval_chain.ipynb b/docs/docs/versions/migrating_chains/conversation_retrieval_chain.ipynb index 70de0606e78..ae25068f6c3 100644 --- a/docs/docs/versions/migrating_chains/conversation_retrieval_chain.ipynb +++ b/docs/docs/versions/migrating_chains/conversation_retrieval_chain.ipynb @@ -58,11 +58,11 @@ "outputs": [], "source": [ "# Load docs\n", - "from langchain.text_splitter import RecursiveCharacterTextSplitter\n", "from langchain_community.document_loaders import WebBaseLoader\n", "from langchain_community.vectorstores import FAISS\n", "from langchain_openai.chat_models import ChatOpenAI\n", "from langchain_openai.embeddings import OpenAIEmbeddings\n", + "from langchain_text_splitters import RecursiveCharacterTextSplitter\n", "\n", "loader = WebBaseLoader(\"https://lilianweng.github.io/posts/2023-06-23-agent/\")\n", "data = loader.load()\n", diff --git a/docs/docs/versions/migrating_chains/retrieval_qa.ipynb b/docs/docs/versions/migrating_chains/retrieval_qa.ipynb index 7cab33d02b4..4dc777a603a 100644 --- a/docs/docs/versions/migrating_chains/retrieval_qa.ipynb +++ b/docs/docs/versions/migrating_chains/retrieval_qa.ipynb @@ -57,11 +57,11 @@ "outputs": [], "source": [ "# Load docs\n", - "from langchain.text_splitter import RecursiveCharacterTextSplitter\n", "from langchain_community.document_loaders import WebBaseLoader\n", "from langchain_community.vectorstores import FAISS\n", "from langchain_openai.chat_models import ChatOpenAI\n", "from langchain_openai.embeddings import OpenAIEmbeddings\n", + "from langchain_text_splitters import RecursiveCharacterTextSplitter\n", "\n", "loader = WebBaseLoader(\"https://lilianweng.github.io/posts/2023-06-23-agent/\")\n", "data = loader.load()\n", diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index acf8b6cfdb7..47fb61f5200 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -165,9 +165,19 @@ const config = { label: "Integrations", }, { - href: "https://api.python.langchain.com", - label: "API Reference", + type: "dropdown", + label: "API reference", position: "left", + items: [ + { + label: "Latest", + to: "https://python.langchain.com/v0.2/api_reference/reference.html", + }, + { + label: "Legacy", + href: "https://api.python.langchain.com/" + } + ] }, { type: "dropdown", diff --git a/docs/vercel_build.sh b/docs/vercel_build.sh index c848d83479c..80aaa5eaab9 100755 --- a/docs/vercel_build.sh +++ b/docs/vercel_build.sh @@ -8,3 +8,10 @@ make build rm -rf docs mv build/output-new/docs ./ + +mkdir static/api_reference + +git clone --depth=1 https://github.com/baskaryan/langchain-api-docs-build.git + +mv -r langchain-api-docs-build/api_reference_build/html/* static/api_reference/ + diff --git a/libs/community/langchain_community/agent_toolkits/ainetwork/toolkit.py b/libs/community/langchain_community/agent_toolkits/ainetwork/toolkit.py index faabae096ed..64d021bbc0c 100644 --- a/libs/community/langchain_community/agent_toolkits/ainetwork/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/ainetwork/toolkit.py @@ -3,9 +3,9 @@ from __future__ import annotations from typing import TYPE_CHECKING, List, Literal, Optional from langchain_core.pydantic_v1 import root_validator -from langchain_core.tools import BaseToolkit +from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit -from langchain_community.tools import BaseTool from langchain_community.tools.ainetwork.app import AINAppOps from langchain_community.tools.ainetwork.owner import AINOwnerOps from langchain_community.tools.ainetwork.rule import AINRuleOps diff --git a/libs/community/langchain_community/agent_toolkits/amadeus/toolkit.py b/libs/community/langchain_community/agent_toolkits/amadeus/toolkit.py index 5a38888fe97..9e6c159c75d 100644 --- a/libs/community/langchain_community/agent_toolkits/amadeus/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/amadeus/toolkit.py @@ -4,9 +4,9 @@ from typing import TYPE_CHECKING, List, Optional from langchain_core.language_models import BaseLanguageModel from langchain_core.pydantic_v1 import Field -from langchain_core.tools import BaseToolkit +from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit -from langchain_community.tools import BaseTool from langchain_community.tools.amadeus.closest_airport import AmadeusClosestAirport from langchain_community.tools.amadeus.flight_search import AmadeusFlightSearch from langchain_community.tools.amadeus.utils import authenticate diff --git a/libs/community/langchain_community/agent_toolkits/azure_ai_services.py b/libs/community/langchain_community/agent_toolkits/azure_ai_services.py index 282a3aa9bc1..4b3b529c370 100644 --- a/libs/community/langchain_community/agent_toolkits/azure_ai_services.py +++ b/libs/community/langchain_community/agent_toolkits/azure_ai_services.py @@ -3,8 +3,8 @@ from __future__ import annotations from typing import List from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit -from langchain_community.agent_toolkits.base import BaseToolkit from langchain_community.tools.azure_ai_services import ( AzureAiServicesDocumentIntelligenceTool, AzureAiServicesImageAnalysisTool, diff --git a/libs/community/langchain_community/agent_toolkits/azure_cognitive_services.py b/libs/community/langchain_community/agent_toolkits/azure_cognitive_services.py index d365486d390..1f9b27bf481 100644 --- a/libs/community/langchain_community/agent_toolkits/azure_cognitive_services.py +++ b/libs/community/langchain_community/agent_toolkits/azure_cognitive_services.py @@ -3,7 +3,8 @@ from __future__ import annotations import sys from typing import List -from langchain_core.tools import BaseTool, BaseToolkit +from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit from langchain_community.tools.azure_cognitive_services import ( AzureCogsFormRecognizerTool, diff --git a/libs/community/langchain_community/agent_toolkits/base.py b/libs/community/langchain_community/agent_toolkits/base.py index 885eec3363d..6a2ad9cdb97 100644 --- a/libs/community/langchain_community/agent_toolkits/base.py +++ b/libs/community/langchain_community/agent_toolkits/base.py @@ -1,5 +1,5 @@ """Toolkits for agents.""" -from langchain_core.tools import BaseToolkit +from langchain_core.tools.base import BaseToolkit __all__ = ["BaseToolkit"] diff --git a/libs/community/langchain_community/agent_toolkits/cassandra_database/toolkit.py b/libs/community/langchain_community/agent_toolkits/cassandra_database/toolkit.py index 68e043f63c4..11930f1c374 100644 --- a/libs/community/langchain_community/agent_toolkits/cassandra_database/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/cassandra_database/toolkit.py @@ -3,9 +3,9 @@ from typing import List from langchain_core.pydantic_v1 import Field +from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit -from langchain_community.agent_toolkits.base import BaseToolkit -from langchain_community.tools import BaseTool from langchain_community.tools.cassandra_database.tool import ( GetSchemaCassandraDatabaseTool, GetTableDataCassandraDatabaseTool, diff --git a/libs/community/langchain_community/agent_toolkits/clickup/toolkit.py b/libs/community/langchain_community/agent_toolkits/clickup/toolkit.py index 25e0961ed70..6411c67dae5 100644 --- a/libs/community/langchain_community/agent_toolkits/clickup/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/clickup/toolkit.py @@ -1,8 +1,8 @@ from typing import Dict, List -from langchain_core.tools import BaseToolkit +from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit -from langchain_community.tools import BaseTool from langchain_community.tools.clickup.prompt import ( CLICKUP_FOLDER_CREATE_PROMPT, CLICKUP_GET_ALL_TEAMS_PROMPT, diff --git a/libs/community/langchain_community/agent_toolkits/cogniswitch/toolkit.py b/libs/community/langchain_community/agent_toolkits/cogniswitch/toolkit.py index 19d020c9ba1..b5ed20f5d5c 100644 --- a/libs/community/langchain_community/agent_toolkits/cogniswitch/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/cogniswitch/toolkit.py @@ -1,8 +1,8 @@ from typing import List -from langchain_core.tools import BaseToolkit +from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit -from langchain_community.tools import BaseTool from langchain_community.tools.cogniswitch.tool import ( CogniswitchKnowledgeRequest, CogniswitchKnowledgeSourceFile, diff --git a/libs/community/langchain_community/agent_toolkits/connery/toolkit.py b/libs/community/langchain_community/agent_toolkits/connery/toolkit.py index 6b7493a5971..cf86f00f8fd 100644 --- a/libs/community/langchain_community/agent_toolkits/connery/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/connery/toolkit.py @@ -1,7 +1,8 @@ from typing import List from langchain_core.pydantic_v1 import root_validator -from langchain_core.tools import BaseTool, BaseToolkit +from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit from langchain_community.tools.connery import ConneryService diff --git a/libs/community/langchain_community/agent_toolkits/file_management/toolkit.py b/libs/community/langchain_community/agent_toolkits/file_management/toolkit.py index 298f6646129..435817d638f 100644 --- a/libs/community/langchain_community/agent_toolkits/file_management/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/file_management/toolkit.py @@ -3,10 +3,9 @@ from __future__ import annotations from typing import Dict, List, Optional, Type from langchain_core.pydantic_v1 import root_validator -from langchain_core.tools import BaseToolkit +from langchain_core.tools import BaseTool, BaseToolkit from langchain_core.utils.pydantic import get_fields -from langchain_community.tools import BaseTool from langchain_community.tools.file_management.copy import CopyFileTool from langchain_community.tools.file_management.delete import DeleteFileTool from langchain_community.tools.file_management.file_search import FileSearchTool diff --git a/libs/community/langchain_community/agent_toolkits/financial_datasets/toolkit.py b/libs/community/langchain_community/agent_toolkits/financial_datasets/toolkit.py index 69eaa9bf8fe..89708212e25 100644 --- a/libs/community/langchain_community/agent_toolkits/financial_datasets/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/financial_datasets/toolkit.py @@ -3,9 +3,9 @@ from __future__ import annotations from typing import List from langchain_core.pydantic_v1 import Field -from langchain_core.tools import BaseToolkit +from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit -from langchain_community.tools import BaseTool from langchain_community.tools.financial_datasets.balance_sheets import BalanceSheets from langchain_community.tools.financial_datasets.cash_flow_statements import ( CashFlowStatements, diff --git a/libs/community/langchain_community/agent_toolkits/github/toolkit.py b/libs/community/langchain_community/agent_toolkits/github/toolkit.py index 1712f862869..adeb0bd7251 100644 --- a/libs/community/langchain_community/agent_toolkits/github/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/github/toolkit.py @@ -3,9 +3,9 @@ from typing import Dict, List from langchain_core.pydantic_v1 import BaseModel, Field -from langchain_core.tools import BaseToolkit +from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit -from langchain_community.tools import BaseTool from langchain_community.tools.github.prompt import ( COMMENT_ON_ISSUE_PROMPT, CREATE_BRANCH_PROMPT, diff --git a/libs/community/langchain_community/agent_toolkits/gitlab/toolkit.py b/libs/community/langchain_community/agent_toolkits/gitlab/toolkit.py index 9cba9afc41a..030b8191a85 100644 --- a/libs/community/langchain_community/agent_toolkits/gitlab/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/gitlab/toolkit.py @@ -2,9 +2,9 @@ from typing import Dict, List -from langchain_core.tools import BaseToolkit +from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit -from langchain_community.tools import BaseTool from langchain_community.tools.gitlab.prompt import ( COMMENT_ON_ISSUE_PROMPT, CREATE_FILE_PROMPT, diff --git a/libs/community/langchain_community/agent_toolkits/gmail/toolkit.py b/libs/community/langchain_community/agent_toolkits/gmail/toolkit.py index a225d1d7d55..66b3c2d252a 100644 --- a/libs/community/langchain_community/agent_toolkits/gmail/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/gmail/toolkit.py @@ -3,9 +3,9 @@ from __future__ import annotations from typing import TYPE_CHECKING, List from langchain_core.pydantic_v1 import Field -from langchain_core.tools import BaseToolkit +from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit -from langchain_community.tools import BaseTool from langchain_community.tools.gmail.create_draft import GmailCreateDraft from langchain_community.tools.gmail.get_message import GmailGetMessage from langchain_community.tools.gmail.get_thread import GmailGetThread diff --git a/libs/community/langchain_community/agent_toolkits/jira/toolkit.py b/libs/community/langchain_community/agent_toolkits/jira/toolkit.py index 840d1aa3e72..ad585b2e491 100644 --- a/libs/community/langchain_community/agent_toolkits/jira/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/jira/toolkit.py @@ -1,8 +1,8 @@ from typing import Dict, List -from langchain_core.tools import BaseToolkit +from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit -from langchain_community.tools import BaseTool from langchain_community.tools.jira.prompt import ( JIRA_CATCH_ALL_PROMPT, JIRA_CONFLUENCE_PAGE_CREATE_PROMPT, diff --git a/libs/community/langchain_community/agent_toolkits/json/toolkit.py b/libs/community/langchain_community/agent_toolkits/json/toolkit.py index 19759c0758b..a6a98498312 100644 --- a/libs/community/langchain_community/agent_toolkits/json/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/json/toolkit.py @@ -2,9 +2,9 @@ from __future__ import annotations from typing import List -from langchain_core.tools import BaseToolkit +from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit -from langchain_community.tools import BaseTool from langchain_community.tools.json.tool import ( JsonGetValueTool, JsonListKeysTool, diff --git a/libs/community/langchain_community/agent_toolkits/load_tools.py b/libs/community/langchain_community/agent_toolkits/load_tools.py index 7f6273d0b64..fa2aeddd52a 100644 --- a/libs/community/langchain_community/agent_toolkits/load_tools.py +++ b/libs/community/langchain_community/agent_toolkits/load_tools.py @@ -101,8 +101,7 @@ from langchain_community.utilities.wolfram_alpha import WolframAlphaAPIWrapper from langchain_core.callbacks import BaseCallbackManager from langchain_core.callbacks import Callbacks from langchain_core.language_models import BaseLanguageModel -from langchain_core.tools import BaseTool -from langchain_core.tools import Tool +from langchain_core.tools import BaseTool, Tool def _get_tools_requests_get() -> BaseTool: diff --git a/libs/community/langchain_community/agent_toolkits/multion/toolkit.py b/libs/community/langchain_community/agent_toolkits/multion/toolkit.py index a95d406abd3..133232e4561 100644 --- a/libs/community/langchain_community/agent_toolkits/multion/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/multion/toolkit.py @@ -4,9 +4,9 @@ from __future__ import annotations from typing import List -from langchain_core.tools import BaseToolkit +from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit -from langchain_community.tools import BaseTool from langchain_community.tools.multion.close_session import MultionCloseSession from langchain_community.tools.multion.create_session import MultionCreateSession from langchain_community.tools.multion.update_session import MultionUpdateSession diff --git a/libs/community/langchain_community/agent_toolkits/nasa/toolkit.py b/libs/community/langchain_community/agent_toolkits/nasa/toolkit.py index 91ca9ec7882..aabb3b55b62 100644 --- a/libs/community/langchain_community/agent_toolkits/nasa/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/nasa/toolkit.py @@ -1,8 +1,8 @@ from typing import Dict, List -from langchain_core.tools import BaseToolkit +from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit -from langchain_community.tools import BaseTool from langchain_community.tools.nasa.prompt import ( NASA_CAPTIONS_PROMPT, NASA_MANIFEST_PROMPT, diff --git a/libs/community/langchain_community/agent_toolkits/nla/toolkit.py b/libs/community/langchain_community/agent_toolkits/nla/toolkit.py index 6622dee5f57..b7216956fba 100644 --- a/libs/community/langchain_community/agent_toolkits/nla/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/nla/toolkit.py @@ -4,7 +4,8 @@ from typing import Any, List, Optional, Sequence from langchain_core.language_models import BaseLanguageModel from langchain_core.pydantic_v1 import Field -from langchain_core.tools import BaseTool, BaseToolkit +from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit from langchain_community.agent_toolkits.nla.tool import NLATool from langchain_community.tools.openapi.utils.openapi_utils import OpenAPISpec diff --git a/libs/community/langchain_community/agent_toolkits/office365/toolkit.py b/libs/community/langchain_community/agent_toolkits/office365/toolkit.py index a953c12ad5b..3ee1e9f135a 100644 --- a/libs/community/langchain_community/agent_toolkits/office365/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/office365/toolkit.py @@ -3,9 +3,9 @@ from __future__ import annotations from typing import TYPE_CHECKING, List from langchain_core.pydantic_v1 import Field -from langchain_core.tools import BaseToolkit +from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit -from langchain_community.tools import BaseTool from langchain_community.tools.office365.create_draft_message import ( O365CreateDraftMessage, ) diff --git a/libs/community/langchain_community/agent_toolkits/openapi/toolkit.py b/libs/community/langchain_community/agent_toolkits/openapi/toolkit.py index a756da90df9..2c888700462 100644 --- a/libs/community/langchain_community/agent_toolkits/openapi/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/openapi/toolkit.py @@ -5,12 +5,12 @@ from __future__ import annotations from typing import Any, List from langchain_core.language_models import BaseLanguageModel -from langchain_core.tools import BaseToolkit, Tool +from langchain_core.tools import BaseTool, Tool +from langchain_core.tools.base import BaseToolkit from langchain_community.agent_toolkits.json.base import create_json_agent from langchain_community.agent_toolkits.json.toolkit import JsonToolkit from langchain_community.agent_toolkits.openapi.prompt import DESCRIPTION -from langchain_community.tools import BaseTool from langchain_community.tools.json.tool import JsonSpec from langchain_community.tools.requests.tool import ( RequestsDeleteTool, diff --git a/libs/community/langchain_community/agent_toolkits/polygon/toolkit.py b/libs/community/langchain_community/agent_toolkits/polygon/toolkit.py index 4b23a0c8e92..f2a4ebb9110 100644 --- a/libs/community/langchain_community/agent_toolkits/polygon/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/polygon/toolkit.py @@ -1,8 +1,8 @@ from typing import List -from langchain_core.tools import BaseToolkit +from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit -from langchain_community.tools import BaseTool from langchain_community.tools.polygon import ( PolygonAggregates, PolygonFinancials, diff --git a/libs/community/langchain_community/agent_toolkits/powerbi/toolkit.py b/libs/community/langchain_community/agent_toolkits/powerbi/toolkit.py index 48d4524323d..2fe081bd4c0 100644 --- a/libs/community/langchain_community/agent_toolkits/powerbi/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/powerbi/toolkit.py @@ -14,9 +14,9 @@ from langchain_core.prompts.chat import ( SystemMessagePromptTemplate, ) from langchain_core.pydantic_v1 import Field -from langchain_core.tools import BaseToolkit +from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit -from langchain_community.tools import BaseTool from langchain_community.tools.powerbi.prompt import ( QUESTION_TO_QUERY_BASE, SINGLE_QUESTION_TO_QUERY, diff --git a/libs/community/langchain_community/agent_toolkits/slack/toolkit.py b/libs/community/langchain_community/agent_toolkits/slack/toolkit.py index 874ef080ff9..abec2a8e676 100644 --- a/libs/community/langchain_community/agent_toolkits/slack/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/slack/toolkit.py @@ -3,9 +3,9 @@ from __future__ import annotations from typing import TYPE_CHECKING, List from langchain_core.pydantic_v1 import Field -from langchain_core.tools import BaseToolkit +from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit -from langchain_community.tools import BaseTool from langchain_community.tools.slack.get_channel import SlackGetChannel from langchain_community.tools.slack.get_message import SlackGetMessage from langchain_community.tools.slack.schedule_message import SlackScheduleMessage diff --git a/libs/community/langchain_community/agent_toolkits/spark_sql/toolkit.py b/libs/community/langchain_community/agent_toolkits/spark_sql/toolkit.py index c8eb933e7fb..85c08f20678 100644 --- a/libs/community/langchain_community/agent_toolkits/spark_sql/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/spark_sql/toolkit.py @@ -4,9 +4,9 @@ from typing import List from langchain_core.language_models import BaseLanguageModel from langchain_core.pydantic_v1 import Field -from langchain_core.tools import BaseToolkit +from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit -from langchain_community.tools import BaseTool from langchain_community.tools.spark_sql.tool import ( InfoSparkSQLTool, ListSparkSQLTool, diff --git a/libs/community/langchain_community/agent_toolkits/sql/toolkit.py b/libs/community/langchain_community/agent_toolkits/sql/toolkit.py index 811f27358b5..b0ea6428f74 100644 --- a/libs/community/langchain_community/agent_toolkits/sql/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/sql/toolkit.py @@ -4,9 +4,9 @@ from typing import List from langchain_core.language_models import BaseLanguageModel from langchain_core.pydantic_v1 import Field -from langchain_core.tools import BaseToolkit +from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit -from langchain_community.tools import BaseTool from langchain_community.tools.sql_database.tool import ( InfoSQLDatabaseTool, ListSQLDatabaseTool, diff --git a/libs/community/langchain_community/agent_toolkits/steam/toolkit.py b/libs/community/langchain_community/agent_toolkits/steam/toolkit.py index 50e7ec4589b..54c3ff46124 100644 --- a/libs/community/langchain_community/agent_toolkits/steam/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/steam/toolkit.py @@ -2,9 +2,9 @@ from typing import List -from langchain_core.tools import BaseToolkit +from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit -from langchain_community.tools import BaseTool from langchain_community.tools.steam.prompt import ( STEAM_GET_GAMES_DETAILS, STEAM_GET_RECOMMENDED_GAMES, diff --git a/libs/community/langchain_community/agent_toolkits/zapier/toolkit.py b/libs/community/langchain_community/agent_toolkits/zapier/toolkit.py index 966793ba471..7569c9a2686 100644 --- a/libs/community/langchain_community/agent_toolkits/zapier/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/zapier/toolkit.py @@ -3,9 +3,9 @@ from typing import List from langchain_core._api import warn_deprecated -from langchain_core.tools import BaseToolkit +from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit -from langchain_community.tools import BaseTool from langchain_community.tools.zapier.tool import ZapierNLARunAction from langchain_community.utilities.zapier import ZapierNLAWrapper diff --git a/libs/community/langchain_community/tools/__init__.py b/libs/community/langchain_community/tools/__init__.py index 7cc65da7d7b..0b86de5cb31 100644 --- a/libs/community/langchain_community/tools/__init__.py +++ b/libs/community/langchain_community/tools/__init__.py @@ -22,11 +22,15 @@ from typing import TYPE_CHECKING, Any if TYPE_CHECKING: from langchain_core.tools import ( - BaseTool, - StructuredTool, - Tool, - tool, + BaseTool as BaseTool, ) + from langchain_core.tools import ( + StructuredTool as StructuredTool, + ) + from langchain_core.tools import ( + Tool as Tool, + ) + from langchain_core.tools.convert import tool as tool from langchain_community.tools.ainetwork.app import ( AINAppOps, @@ -338,6 +342,10 @@ if TYPE_CHECKING: ) __all__ = [ + "BaseTool", + "Tool", + "tool", + "StructuredTool", "AINAppOps", "AINOwnerOps", "AINRuleOps", @@ -362,7 +370,6 @@ __all__ = [ "BaseRequestsTool", "BaseSQLDatabaseTool", "BaseSparkSQLTool", - "BaseTool", "BearlyInterpreterTool", "BingSearchResults", "BingSearchRun", @@ -465,10 +472,8 @@ __all__ = [ "StdInInquireTool", "SteamWebAPIQueryRun", "SteamshipImageGenerationTool", - "StructuredTool", "TavilyAnswer", "TavilySearchResults", - "Tool", "VectorStoreQATool", "VectorStoreQAWithSourcesTool", "WikipediaQueryRun", @@ -484,7 +489,6 @@ __all__ = [ "ZenGuardTool", "authenticate", "format_tool_to_openai_function", - "tool", ] # Used for internal purposes diff --git a/libs/community/langchain_community/tools/bearly/tool.py b/libs/community/langchain_community/tools/bearly/tool.py index 6a91f39ed43..64a26257160 100644 --- a/libs/community/langchain_community/tools/bearly/tool.py +++ b/libs/community/langchain_community/tools/bearly/tool.py @@ -7,8 +7,7 @@ from typing import Dict, List, Type import requests from langchain_core.pydantic_v1 import BaseModel, Field - -from langchain_community.tools import Tool +from langchain_core.tools import Tool def strip_markdown_code(md_string: str) -> str: diff --git a/libs/community/langchain_community/tools/databricks/tool.py b/libs/community/langchain_community/tools/databricks/tool.py index 33f1d9313ee..7bf30e2d20b 100644 --- a/libs/community/langchain_community/tools/databricks/tool.py +++ b/libs/community/langchain_community/tools/databricks/tool.py @@ -5,7 +5,8 @@ from hashlib import md5 from typing import TYPE_CHECKING, Any, Dict, List, Optional, Type, Union from langchain_core.pydantic_v1 import BaseModel, Field, create_model -from langchain_core.tools import BaseTool, BaseToolkit, StructuredTool +from langchain_core.tools import BaseTool, StructuredTool +from langchain_core.tools.base import BaseToolkit from typing_extensions import Self if TYPE_CHECKING: diff --git a/libs/community/langchain_community/tools/e2b_data_analysis/tool.py b/libs/community/langchain_community/tools/e2b_data_analysis/tool.py index f0498aeb258..fee95b4af5b 100644 --- a/libs/community/langchain_community/tools/e2b_data_analysis/tool.py +++ b/libs/community/langchain_community/tools/e2b_data_analysis/tool.py @@ -13,8 +13,8 @@ from langchain_core.callbacks import ( CallbackManagerForToolRun, ) from langchain_core.pydantic_v1 import BaseModel, Field, PrivateAttr +from langchain_core.tools import BaseTool, Tool -from langchain_community.tools import BaseTool, Tool from langchain_community.tools.e2b_data_analysis.unparse import Unparser if TYPE_CHECKING: diff --git a/libs/community/langchain_community/tools/steamship_image_generation/tool.py b/libs/community/langchain_community/tools/steamship_image_generation/tool.py index 7035355e5e9..20d3956209f 100644 --- a/libs/community/langchain_community/tools/steamship_image_generation/tool.py +++ b/libs/community/langchain_community/tools/steamship_image_generation/tool.py @@ -19,9 +19,9 @@ from typing import TYPE_CHECKING, Dict, Optional from langchain_core.callbacks import CallbackManagerForToolRun from langchain_core.pydantic_v1 import root_validator +from langchain_core.tools import BaseTool from langchain_core.utils import get_from_dict_or_env -from langchain_community.tools import BaseTool from langchain_community.tools.steamship_image_generation.utils import make_image_public if TYPE_CHECKING: diff --git a/libs/community/langchain_community/tools/youtube/search.py b/libs/community/langchain_community/tools/youtube/search.py index c42ee748d50..497fa542adf 100644 --- a/libs/community/langchain_community/tools/youtube/search.py +++ b/libs/community/langchain_community/tools/youtube/search.py @@ -13,8 +13,7 @@ import json from typing import Optional from langchain_core.callbacks import CallbackManagerForToolRun - -from langchain_community.tools import BaseTool +from langchain_core.tools import BaseTool class YouTubeSearchTool(BaseTool): diff --git a/libs/community/langchain_community/vectorstores/kdbai.py b/libs/community/langchain_community/vectorstores/kdbai.py index 9b1310293b0..ff0a314d226 100644 --- a/libs/community/langchain_community/vectorstores/kdbai.py +++ b/libs/community/langchain_community/vectorstores/kdbai.py @@ -16,7 +16,7 @@ logger = logging.getLogger(__name__) class KDBAI(VectorStore): """`KDB.AI` vector store. - See [https://kdb.ai](https://kdb.ai) + See https://kdb.ai. To use, you should have the `kdbai_client` python package installed. diff --git a/libs/core/langchain_core/__init__.py b/libs/core/langchain_core/__init__.py index c2d90a7b689..0326da7c0de 100644 --- a/libs/core/langchain_core/__init__.py +++ b/libs/core/langchain_core/__init__.py @@ -1,3 +1,13 @@ +"""``langchain-core`` defines the base abstractions for the LangChain ecosystem. + +The interfaces for core components like chat models, LLMs, vector stores, retrievers, +and more are defined here. The universal invocation protocol (Runnables) along with +a syntax for combining components (LangChain Expression Language) are also defined here. + +No third-party integrations are defined here. The dependencies are kept purposefully +very lightweight. +""" + from importlib import metadata from langchain_core._api import ( diff --git a/libs/core/langchain_core/tools/__init__.py b/libs/core/langchain_core/tools/__init__.py new file mode 100644 index 00000000000..9c3b61f4b01 --- /dev/null +++ b/libs/core/langchain_core/tools/__init__.py @@ -0,0 +1,58 @@ +"""**Tools** are classes that an Agent uses to interact with the world. + +Each tool has a **description**. Agent uses the description to choose the right +tool for the job. + +**Class hierarchy:** + +.. code-block:: + + RunnableSerializable --> BaseTool --> Tool # Examples: AIPluginTool, BaseGraphQLTool + # Examples: BraveSearch, HumanInputRun + +**Main helpers:** + +.. code-block:: + + CallbackManagerForToolRun, AsyncCallbackManagerForToolRun +""" # noqa: E501 + +from __future__ import annotations + +from langchain_core.tools.base import ( + FILTERED_ARGS as FILTERED_ARGS, +) +from langchain_core.tools.base import ( + BaseTool as BaseTool, +) +from langchain_core.tools.base import ( + BaseToolkit as BaseToolkit, +) +from langchain_core.tools.base import ( + InjectedToolArg as InjectedToolArg, +) +from langchain_core.tools.base import SchemaAnnotationError as SchemaAnnotationError +from langchain_core.tools.base import ( + ToolException as ToolException, +) +from langchain_core.tools.base import ( + _get_runnable_config_param as _get_runnable_config_param, +) +from langchain_core.tools.base import ( + create_schema_from_function as create_schema_from_function, +) +from langchain_core.tools.convert import ( + convert_runnable_to_tool as convert_runnable_to_tool, +) +from langchain_core.tools.convert import tool as tool +from langchain_core.tools.render import ( + render_text_description as render_text_description, +) +from langchain_core.tools.render import ( + render_text_description_and_args as render_text_description_and_args, +) +from langchain_core.tools.retriever import ( + create_retriever_tool as create_retriever_tool, +) +from langchain_core.tools.simple import Tool as Tool +from langchain_core.tools.structured import StructuredTool as StructuredTool diff --git a/libs/core/langchain_core/tools.py b/libs/core/langchain_core/tools/base.py similarity index 54% rename from libs/core/langchain_core/tools.py rename to libs/core/langchain_core/tools/base.py index 34d76f86791..122d7877fdf 100644 --- a/libs/core/langchain_core/tools.py +++ b/libs/core/langchain_core/tools/base.py @@ -1,38 +1,16 @@ -"""**Tools** are classes that an Agent uses to interact with the world. - -Each tool has a **description**. Agent uses the description to choose the right -tool for the job. - -**Class hierarchy:** - -.. code-block:: - - RunnableSerializable --> BaseTool --> Tool # Examples: AIPluginTool, BaseGraphQLTool - # Examples: BraveSearch, HumanInputRun - -**Main helpers:** - -.. code-block:: - - CallbackManagerForToolRun, AsyncCallbackManagerForToolRun -""" # noqa: E501 - from __future__ import annotations import asyncio import functools import inspect import json -import textwrap import uuid import warnings from abc import ABC, abstractmethod from contextvars import copy_context -from functools import partial from inspect import signature from typing import ( Any, - Awaitable, Callable, Dict, List, @@ -42,51 +20,37 @@ from typing import ( Tuple, Type, Union, + cast, get_type_hints, ) -from typing_extensions import Annotated, TypeVar, cast, get_args, get_origin +from typing_extensions import Annotated, TypeVar, get_args, get_origin from langchain_core._api import deprecated from langchain_core.callbacks import ( AsyncCallbackManager, - AsyncCallbackManagerForToolRun, BaseCallbackManager, CallbackManager, - CallbackManagerForToolRun, -) -from langchain_core.callbacks.manager import ( Callbacks, ) -from langchain_core.load.serializable import Serializable -from langchain_core.messages.tool import ToolCall, ToolMessage -from langchain_core.prompts import ( - BasePromptTemplate, - PromptTemplate, - aformat_document, - format_document, -) +from langchain_core.load import Serializable +from langchain_core.messages import ToolCall, ToolMessage from langchain_core.pydantic_v1 import ( BaseModel, Extra, Field, ValidationError, - create_model, root_validator, validate_arguments, ) -from langchain_core.retrievers import BaseRetriever from langchain_core.runnables import ( - Runnable, RunnableConfig, RunnableSerializable, ensure_config, -) -from langchain_core.runnables.config import ( - _set_config_context, patch_config, run_in_executor, ) +from langchain_core.runnables.config import _set_config_context from langchain_core.runnables.utils import asyncio_accepts_context from langchain_core.utils.function_calling import ( _parse_google_docstring, @@ -746,682 +710,6 @@ class ChildTool(BaseTool): return self.run(tool_input, callbacks=callbacks) -class Tool(BaseTool): - """Tool that takes in function or coroutine directly.""" - - description: str = "" - func: Optional[Callable[..., str]] - """The function to run when the tool is called.""" - coroutine: Optional[Callable[..., Awaitable[str]]] = None - """The asynchronous version of the function.""" - - # --- Runnable --- - - async def ainvoke( - self, - input: Union[str, Dict, ToolCall], - config: Optional[RunnableConfig] = None, - **kwargs: Any, - ) -> Any: - if not self.coroutine: - # If the tool does not implement async, fall back to default implementation - return await run_in_executor(config, self.invoke, input, config, **kwargs) - - return await super().ainvoke(input, config, **kwargs) - - # --- Tool --- - - @property - def args(self) -> dict: - """The tool's input arguments. - - Returns: - The input arguments for the tool. - """ - if self.args_schema is not None: - return self.args_schema.schema()["properties"] - # For backwards compatibility, if the function signature is ambiguous, - # assume it takes a single string input. - return {"tool_input": {"type": "string"}} - - def _to_args_and_kwargs(self, tool_input: Union[str, Dict]) -> Tuple[Tuple, Dict]: - """Convert tool input to pydantic model.""" - args, kwargs = super()._to_args_and_kwargs(tool_input) - # For backwards compatibility. The tool must be run with a single input - all_args = list(args) + list(kwargs.values()) - if len(all_args) != 1: - raise ToolException( - f"""Too many arguments to single-input tool {self.name}. - Consider using StructuredTool instead.""" - f" Args: {all_args}" - ) - return tuple(all_args), {} - - def _run( - self, - *args: Any, - config: RunnableConfig, - run_manager: Optional[CallbackManagerForToolRun] = None, - **kwargs: Any, - ) -> Any: - """Use the tool.""" - if self.func: - if run_manager and signature(self.func).parameters.get("callbacks"): - kwargs["callbacks"] = run_manager.get_child() - if config_param := _get_runnable_config_param(self.func): - kwargs[config_param] = config - return self.func(*args, **kwargs) - raise NotImplementedError("Tool does not support sync invocation.") - - async def _arun( - self, - *args: Any, - config: RunnableConfig, - run_manager: Optional[AsyncCallbackManagerForToolRun] = None, - **kwargs: Any, - ) -> Any: - """Use the tool asynchronously.""" - if self.coroutine: - if run_manager and signature(self.coroutine).parameters.get("callbacks"): - kwargs["callbacks"] = run_manager.get_child() - if config_param := _get_runnable_config_param(self.coroutine): - kwargs[config_param] = config - return await self.coroutine(*args, **kwargs) - - # NOTE: this code is unreachable since _arun is only called if coroutine is not - # None. - return await super()._arun( - *args, config=config, run_manager=run_manager, **kwargs - ) - - # TODO: this is for backwards compatibility, remove in future - def __init__( - self, name: str, func: Optional[Callable], description: str, **kwargs: Any - ) -> None: - """Initialize tool.""" - super(Tool, self).__init__( # type: ignore[call-arg] - name=name, func=func, description=description, **kwargs - ) - - @classmethod - def from_function( - cls, - func: Optional[Callable], - name: str, # We keep these required to support backwards compatibility - description: str, - return_direct: bool = False, - args_schema: Optional[Type[BaseModel]] = None, - coroutine: Optional[ - Callable[..., Awaitable[Any]] - ] = None, # This is last for compatibility, but should be after func - **kwargs: Any, - ) -> Tool: - """Initialize tool from a function. - - Args: - func: The function to create the tool from. - name: The name of the tool. - description: The description of the tool. - return_direct: Whether to return the output directly. Defaults to False. - args_schema: The schema of the tool's input arguments. Defaults to None. - coroutine: The asynchronous version of the function. Defaults to None. - kwargs: Additional arguments to pass to the tool. - - Returns: - The tool. - - Raises: - ValueError: If the function is not provided. - """ - if func is None and coroutine is None: - raise ValueError("Function and/or coroutine must be provided") - return cls( - name=name, - func=func, - coroutine=coroutine, - description=description, - return_direct=return_direct, - args_schema=args_schema, - **kwargs, - ) - - -class StructuredTool(BaseTool): - """Tool that can operate on any number of inputs.""" - - description: str = "" - args_schema: TypeBaseModel = Field(..., description="The tool schema.") - """The input arguments' schema.""" - func: Optional[Callable[..., Any]] - """The function to run when the tool is called.""" - coroutine: Optional[Callable[..., Awaitable[Any]]] = None - """The asynchronous version of the function.""" - - # --- Runnable --- - - # TODO: Is this needed? - async def ainvoke( - self, - input: Union[str, Dict, ToolCall], - config: Optional[RunnableConfig] = None, - **kwargs: Any, - ) -> Any: - if not self.coroutine: - # If the tool does not implement async, fall back to default implementation - return await run_in_executor(config, self.invoke, input, config, **kwargs) - - return await super().ainvoke(input, config, **kwargs) - - # --- Tool --- - - @property - def args(self) -> dict: - """The tool's input arguments.""" - return self.args_schema.schema()["properties"] - - def _run( - self, - *args: Any, - config: RunnableConfig, - run_manager: Optional[CallbackManagerForToolRun] = None, - **kwargs: Any, - ) -> Any: - """Use the tool.""" - if self.func: - if run_manager and signature(self.func).parameters.get("callbacks"): - kwargs["callbacks"] = run_manager.get_child() - if config_param := _get_runnable_config_param(self.func): - kwargs[config_param] = config - return self.func(*args, **kwargs) - raise NotImplementedError("StructuredTool does not support sync invocation.") - - async def _arun( - self, - *args: Any, - config: RunnableConfig, - run_manager: Optional[AsyncCallbackManagerForToolRun] = None, - **kwargs: Any, - ) -> Any: - """Use the tool asynchronously.""" - if self.coroutine: - if run_manager and signature(self.coroutine).parameters.get("callbacks"): - kwargs["callbacks"] = run_manager.get_child() - if config_param := _get_runnable_config_param(self.coroutine): - kwargs[config_param] = config - return await self.coroutine(*args, **kwargs) - - # NOTE: this code is unreachable since _arun is only called if coroutine is not - # None. - return await super()._arun( - *args, config=config, run_manager=run_manager, **kwargs - ) - - @classmethod - def from_function( - cls, - func: Optional[Callable] = None, - coroutine: Optional[Callable[..., Awaitable[Any]]] = None, - name: Optional[str] = None, - description: Optional[str] = None, - return_direct: bool = False, - args_schema: Optional[Type[BaseModel]] = None, - infer_schema: bool = True, - *, - response_format: Literal["content", "content_and_artifact"] = "content", - parse_docstring: bool = False, - error_on_invalid_docstring: bool = False, - **kwargs: Any, - ) -> StructuredTool: - """Create tool from a given function. - - A classmethod that helps to create a tool from a function. - - Args: - func: The function from which to create a tool. - coroutine: The async function from which to create a tool. - name: The name of the tool. Defaults to the function name. - description: The description of the tool. - Defaults to the function docstring. - return_direct: Whether to return the result directly or as a callback. - Defaults to False. - args_schema: The schema of the tool's input arguments. Defaults to None. - infer_schema: Whether to infer the schema from the function's signature. - Defaults to True. - response_format: The tool response format. If "content" then the output of - the tool is interpreted as the contents of a ToolMessage. If - "content_and_artifact" then the output is expected to be a two-tuple - corresponding to the (content, artifact) of a ToolMessage. - Defaults to "content". - parse_docstring: if ``infer_schema`` and ``parse_docstring``, will attempt - to parse parameter descriptions from Google Style function docstrings. - Defaults to False. - error_on_invalid_docstring: if ``parse_docstring`` is provided, configure - whether to raise ValueError on invalid Google Style docstrings. - Defaults to False. - kwargs: Additional arguments to pass to the tool - - Returns: - The tool. - - Raises: - ValueError: If the function is not provided. - - Examples: - - .. code-block:: python - - def add(a: int, b: int) -> int: - \"\"\"Add two numbers\"\"\" - return a + b - tool = StructuredTool.from_function(add) - tool.run(1, 2) # 3 - """ - - if func is not None: - source_function = func - elif coroutine is not None: - source_function = coroutine - else: - raise ValueError("Function and/or coroutine must be provided") - name = name or source_function.__name__ - if args_schema is None and infer_schema: - # schema name is appended within function - args_schema = create_schema_from_function( - name, - source_function, - parse_docstring=parse_docstring, - error_on_invalid_docstring=error_on_invalid_docstring, - filter_args=_filter_schema_args(source_function), - ) - description_ = description - if description is None and not parse_docstring: - description_ = source_function.__doc__ or None - if description_ is None and args_schema: - description_ = args_schema.__doc__ or None - if description_ is None: - raise ValueError( - "Function must have a docstring if description not provided." - ) - if description is None: - # Only apply if using the function's docstring - description_ = textwrap.dedent(description_).strip() - - # Description example: - # search_api(query: str) - Searches the API for the query. - description_ = f"{description_.strip()}" - return cls( - name=name, - func=func, - coroutine=coroutine, - args_schema=args_schema, # type: ignore[arg-type] - description=description_, - return_direct=return_direct, - response_format=response_format, - **kwargs, - ) - - -# TODO: Type args_schema as TypeBaseModel if we can get mypy to correctly recognize -# pydantic v2 BaseModel classes. -def tool( - *args: Union[str, Callable, Runnable], - return_direct: bool = False, - args_schema: Optional[Type] = None, - infer_schema: bool = True, - response_format: Literal["content", "content_and_artifact"] = "content", - parse_docstring: bool = False, - error_on_invalid_docstring: bool = True, -) -> Callable: - """Make tools out of functions, can be used with or without arguments. - - Args: - *args: The arguments to the tool. - return_direct: Whether to return directly from the tool rather - than continuing the agent loop. Defaults to False. - args_schema: optional argument schema for user to specify. - Defaults to None. - infer_schema: Whether to infer the schema of the arguments from - the function's signature. This also makes the resultant tool - accept a dictionary input to its `run()` function. - Defaults to True. - response_format: The tool response format. If "content" then the output of - the tool is interpreted as the contents of a ToolMessage. If - "content_and_artifact" then the output is expected to be a two-tuple - corresponding to the (content, artifact) of a ToolMessage. - Defaults to "content". - parse_docstring: if ``infer_schema`` and ``parse_docstring``, will attempt to - parse parameter descriptions from Google Style function docstrings. - Defaults to False. - error_on_invalid_docstring: if ``parse_docstring`` is provided, configure - whether to raise ValueError on invalid Google Style docstrings. - Defaults to True. - - Returns: - The tool. - - Requires: - - Function must be of type (str) -> str - - Function must have a docstring - - Examples: - .. code-block:: python - - @tool - def search_api(query: str) -> str: - # Searches the API for the query. - return - - @tool("search", return_direct=True) - def search_api(query: str) -> str: - # Searches the API for the query. - return - - @tool(response_format="content_and_artifact") - def search_api(query: str) -> Tuple[str, dict]: - return "partial json of results", {"full": "object of results"} - - .. versionadded:: 0.2.14 - Parse Google-style docstrings: - - .. code-block:: python - - @tool(parse_docstring=True) - def foo(bar: str, baz: int) -> str: - \"\"\"The foo. - - Args: - bar: The bar. - baz: The baz. - \"\"\" - return bar - - foo.args_schema.schema() - - .. code-block:: python - - { - "title": "fooSchema", - "description": "The foo.", - "type": "object", - "properties": { - "bar": { - "title": "Bar", - "description": "The bar.", - "type": "string" - }, - "baz": { - "title": "Baz", - "description": "The baz.", - "type": "integer" - } - }, - "required": [ - "bar", - "baz" - ] - } - - Note that parsing by default will raise ``ValueError`` if the docstring - is considered invalid. A docstring is considered invalid if it contains - arguments not in the function signature, or is unable to be parsed into - a summary and "Args:" blocks. Examples below: - - .. code-block:: python - - # No args section - def invalid_docstring_1(bar: str, baz: int) -> str: - \"\"\"The foo.\"\"\" - return bar - - # Improper whitespace between summary and args section - def invalid_docstring_2(bar: str, baz: int) -> str: - \"\"\"The foo. - Args: - bar: The bar. - baz: The baz. - \"\"\" - return bar - - # Documented args absent from function signature - def invalid_docstring_3(bar: str, baz: int) -> str: - \"\"\"The foo. - - Args: - banana: The bar. - monkey: The baz. - \"\"\" - return bar - """ - - def _make_with_name(tool_name: str) -> Callable: - def _make_tool(dec_func: Union[Callable, Runnable]) -> BaseTool: - if isinstance(dec_func, Runnable): - runnable = dec_func - - if runnable.input_schema.schema().get("type") != "object": - raise ValueError("Runnable must have an object schema.") - - async def ainvoke_wrapper( - callbacks: Optional[Callbacks] = None, **kwargs: Any - ) -> Any: - return await runnable.ainvoke(kwargs, {"callbacks": callbacks}) - - def invoke_wrapper( - callbacks: Optional[Callbacks] = None, **kwargs: Any - ) -> Any: - return runnable.invoke(kwargs, {"callbacks": callbacks}) - - coroutine = ainvoke_wrapper - func = invoke_wrapper - schema: Optional[Type[BaseModel]] = runnable.input_schema - description = repr(runnable) - elif inspect.iscoroutinefunction(dec_func): - coroutine = dec_func - func = None - schema = args_schema - description = None - else: - coroutine = None - func = dec_func - schema = args_schema - description = None - - if infer_schema or args_schema is not None: - return StructuredTool.from_function( - func, - coroutine, - name=tool_name, - description=description, - return_direct=return_direct, - args_schema=schema, - infer_schema=infer_schema, - response_format=response_format, - parse_docstring=parse_docstring, - error_on_invalid_docstring=error_on_invalid_docstring, - ) - # If someone doesn't want a schema applied, we must treat it as - # a simple string->string function - if dec_func.__doc__ is None: - raise ValueError( - "Function must have a docstring if " - "description not provided and infer_schema is False." - ) - return Tool( - name=tool_name, - func=func, - description=f"{tool_name} tool", - return_direct=return_direct, - coroutine=coroutine, - response_format=response_format, - ) - - return _make_tool - - if len(args) == 2 and isinstance(args[0], str) and isinstance(args[1], Runnable): - return _make_with_name(args[0])(args[1]) - elif len(args) == 1 and isinstance(args[0], str): - # if the argument is a string, then we use the string as the tool name - # Example usage: @tool("search", return_direct=True) - return _make_with_name(args[0]) - elif len(args) == 1 and callable(args[0]): - # if the argument is a function, then we use the function name as the tool name - # Example usage: @tool - return _make_with_name(args[0].__name__)(args[0]) - elif len(args) == 0: - # if there are no arguments, then we use the function name as the tool name - # Example usage: @tool(return_direct=True) - def _partial(func: Callable[[str], str]) -> BaseTool: - return _make_with_name(func.__name__)(func) - - return _partial - else: - raise ValueError("Too many arguments for tool decorator") - - -class RetrieverInput(BaseModel): - """Input to the retriever.""" - - query: str = Field(description="query to look up in retriever") - - -def _get_relevant_documents( - query: str, - retriever: BaseRetriever, - document_prompt: BasePromptTemplate, - document_separator: str, - callbacks: Callbacks = None, -) -> str: - docs = retriever.invoke(query, config={"callbacks": callbacks}) - return document_separator.join( - format_document(doc, document_prompt) for doc in docs - ) - - -async def _aget_relevant_documents( - query: str, - retriever: BaseRetriever, - document_prompt: BasePromptTemplate, - document_separator: str, - callbacks: Callbacks = None, -) -> str: - docs = await retriever.ainvoke(query, config={"callbacks": callbacks}) - return document_separator.join( - [await aformat_document(doc, document_prompt) for doc in docs] - ) - - -def create_retriever_tool( - retriever: BaseRetriever, - name: str, - description: str, - *, - document_prompt: Optional[BasePromptTemplate] = None, - document_separator: str = "\n\n", -) -> Tool: - """Create a tool to do retrieval of documents. - - Args: - retriever: The retriever to use for the retrieval - name: The name for the tool. This will be passed to the language model, - so should be unique and somewhat descriptive. - description: The description for the tool. This will be passed to the language - model, so should be descriptive. - document_prompt: The prompt to use for the document. Defaults to None. - document_separator: The separator to use between documents. Defaults to "\n\n". - - Returns: - Tool class to pass to an agent. - """ - document_prompt = document_prompt or PromptTemplate.from_template("{page_content}") - func = partial( - _get_relevant_documents, - retriever=retriever, - document_prompt=document_prompt, - document_separator=document_separator, - ) - afunc = partial( - _aget_relevant_documents, - retriever=retriever, - document_prompt=document_prompt, - document_separator=document_separator, - ) - return Tool( - name=name, - description=description, - func=func, - coroutine=afunc, - args_schema=RetrieverInput, - ) - - -ToolsRenderer = Callable[[List[BaseTool]], str] - - -def render_text_description(tools: List[BaseTool]) -> str: - """Render the tool name and description in plain text. - - Args: - tools: The tools to render. - - Returns: - The rendered text. - - Output will be in the format of: - - .. code-block:: markdown - - search: This tool is used for search - calculator: This tool is used for math - """ - descriptions = [] - for tool in tools: - if hasattr(tool, "func") and tool.func: - sig = signature(tool.func) - description = f"{tool.name}{sig} - {tool.description}" - else: - description = f"{tool.name} - {tool.description}" - - descriptions.append(description) - return "\n".join(descriptions) - - -def render_text_description_and_args(tools: List[BaseTool]) -> str: - """Render the tool name, description, and args in plain text. - - Args: - tools: The tools to render. - - Returns: - The rendered text. - - Output will be in the format of: - - .. code-block:: markdown - - search: This tool is used for search, args: {"query": {"type": "string"}} - calculator: This tool is used for math, \ -args: {"expression": {"type": "string"}} - """ - tool_strings = [] - for tool in tools: - args_schema = str(tool.args) - if hasattr(tool, "func") and tool.func: - sig = signature(tool.func) - description = f"{tool.name}{sig} - {tool.description}" - else: - description = f"{tool.name} - {tool.description}" - tool_strings.append(f"{description}, args: {args_schema}") - return "\n".join(tool_strings) - - -class BaseToolkit(BaseModel, ABC): - """Base Toolkit representing a collection of related tools.""" - - @abstractmethod - def get_tools(self) -> List[BaseTool]: - """Get the tools in the toolkit.""" - - def _is_tool_call(x: Any) -> bool: return isinstance(x, dict) and x.get("type") == "tool_call" @@ -1538,94 +826,6 @@ def _stringify(content: Any) -> str: return str(content) -def _get_description_from_runnable(runnable: Runnable) -> str: - """Generate a placeholder description of a runnable.""" - input_schema = runnable.input_schema.schema() - return f"Takes {input_schema}." - - -def _get_schema_from_runnable_and_arg_types( - runnable: Runnable, - name: str, - arg_types: Optional[Dict[str, Type]] = None, -) -> Type[BaseModel]: - """Infer args_schema for tool.""" - if arg_types is None: - try: - arg_types = get_type_hints(runnable.InputType) - except TypeError as e: - raise TypeError( - "Tool input must be str or dict. If dict, dict arguments must be " - "typed. Either annotate types (e.g., with TypedDict) or pass " - f"arg_types into `.as_tool` to specify. {str(e)}" - ) - fields = {key: (key_type, Field(...)) for key, key_type in arg_types.items()} - return create_model(name, **fields) # type: ignore - - -def convert_runnable_to_tool( - runnable: Runnable, - args_schema: Optional[Type[BaseModel]] = None, - *, - name: Optional[str] = None, - description: Optional[str] = None, - arg_types: Optional[Dict[str, Type]] = None, -) -> BaseTool: - """Convert a Runnable into a BaseTool. - - Args: - runnable: The runnable to convert. - args_schema: The schema for the tool's input arguments. Defaults to None. - name: The name of the tool. Defaults to None. - description: The description of the tool. Defaults to None. - arg_types: The types of the arguments. Defaults to None. - - Returns: - The tool. - """ - if args_schema: - runnable = runnable.with_types(input_type=args_schema) - description = description or _get_description_from_runnable(runnable) - name = name or runnable.get_name() - - schema = runnable.input_schema.schema() - if schema.get("type") == "string": - return Tool( - name=name, - func=runnable.invoke, - coroutine=runnable.ainvoke, - description=description, - ) - else: - - async def ainvoke_wrapper( - callbacks: Optional[Callbacks] = None, **kwargs: Any - ) -> Any: - return await runnable.ainvoke(kwargs, config={"callbacks": callbacks}) - - def invoke_wrapper(callbacks: Optional[Callbacks] = None, **kwargs: Any) -> Any: - return runnable.invoke(kwargs, config={"callbacks": callbacks}) - - if ( - arg_types is None - and schema.get("type") == "object" - and schema.get("properties") - ): - args_schema = runnable.input_schema - else: - args_schema = _get_schema_from_runnable_and_arg_types( - runnable, name, arg_types=arg_types - ) - - return StructuredTool.from_function( - name=name, - func=invoke_wrapper, - coroutine=ainvoke_wrapper, - description=description, - args_schema=args_schema, - ) - - def _get_type_hints(func: Callable) -> Optional[Dict[str, Type]]: if isinstance(func, functools.partial): func = func.func @@ -1657,14 +857,6 @@ def _is_injected_arg_type(type_: Type) -> bool: ) -def _filter_schema_args(func: Callable) -> List[str]: - filter_args = list(FILTERED_ARGS) - if config_param := _get_runnable_config_param(func): - filter_args.append(config_param) - # filter_args.extend(_get_non_model_params(type_hints)) - return filter_args - - def _get_all_basemodel_annotations( cls: Union[TypeBaseModel, Any], *, default_to_bound: bool = True ) -> Dict[str, Type]: @@ -1747,3 +939,11 @@ def _replace_type_vars( return _py_38_safe_origin(origin)[new_args] else: return type_ + + +class BaseToolkit(BaseModel, ABC): + """Base Toolkit representing a collection of related tools.""" + + @abstractmethod + def get_tools(self) -> List[BaseTool]: + """Get the tools in the toolkit.""" diff --git a/libs/core/langchain_core/tools/convert.py b/libs/core/langchain_core/tools/convert.py new file mode 100644 index 00000000000..3b9dad17547 --- /dev/null +++ b/libs/core/langchain_core/tools/convert.py @@ -0,0 +1,312 @@ +import inspect +from typing import Any, Callable, Dict, Literal, Optional, Type, Union, get_type_hints + +from langchain_core.callbacks import Callbacks +from langchain_core.pydantic_v1 import BaseModel, Field, create_model +from langchain_core.runnables import Runnable +from langchain_core.tools.base import BaseTool +from langchain_core.tools.simple import Tool +from langchain_core.tools.structured import StructuredTool + + +def tool( + *args: Union[str, Callable, Runnable], + return_direct: bool = False, + args_schema: Optional[Type] = None, + infer_schema: bool = True, + response_format: Literal["content", "content_and_artifact"] = "content", + parse_docstring: bool = False, + error_on_invalid_docstring: bool = True, +) -> Callable: + """Make tools out of functions, can be used with or without arguments. + + Args: + *args: The arguments to the tool. + return_direct: Whether to return directly from the tool rather + than continuing the agent loop. Defaults to False. + args_schema: optional argument schema for user to specify. + Defaults to None. + infer_schema: Whether to infer the schema of the arguments from + the function's signature. This also makes the resultant tool + accept a dictionary input to its `run()` function. + Defaults to True. + response_format: The tool response format. If "content" then the output of + the tool is interpreted as the contents of a ToolMessage. If + "content_and_artifact" then the output is expected to be a two-tuple + corresponding to the (content, artifact) of a ToolMessage. + Defaults to "content". + parse_docstring: if ``infer_schema`` and ``parse_docstring``, will attempt to + parse parameter descriptions from Google Style function docstrings. + Defaults to False. + error_on_invalid_docstring: if ``parse_docstring`` is provided, configure + whether to raise ValueError on invalid Google Style docstrings. + Defaults to True. + + Returns: + The tool. + + Requires: + - Function must be of type (str) -> str + - Function must have a docstring + + Examples: + .. code-block:: python + + @tool + def search_api(query: str) -> str: + # Searches the API for the query. + return + + @tool("search", return_direct=True) + def search_api(query: str) -> str: + # Searches the API for the query. + return + + @tool(response_format="content_and_artifact") + def search_api(query: str) -> Tuple[str, dict]: + return "partial json of results", {"full": "object of results"} + + .. versionadded:: 0.2.14 + Parse Google-style docstrings: + + .. code-block:: python + + @tool(parse_docstring=True) + def foo(bar: str, baz: int) -> str: + \"\"\"The foo. + + Args: + bar: The bar. + baz: The baz. + \"\"\" + return bar + + foo.args_schema.schema() + + .. code-block:: python + + { + "title": "fooSchema", + "description": "The foo.", + "type": "object", + "properties": { + "bar": { + "title": "Bar", + "description": "The bar.", + "type": "string" + }, + "baz": { + "title": "Baz", + "description": "The baz.", + "type": "integer" + } + }, + "required": [ + "bar", + "baz" + ] + } + + Note that parsing by default will raise ``ValueError`` if the docstring + is considered invalid. A docstring is considered invalid if it contains + arguments not in the function signature, or is unable to be parsed into + a summary and "Args:" blocks. Examples below: + + .. code-block:: python + + # No args section + def invalid_docstring_1(bar: str, baz: int) -> str: + \"\"\"The foo.\"\"\" + return bar + + # Improper whitespace between summary and args section + def invalid_docstring_2(bar: str, baz: int) -> str: + \"\"\"The foo. + Args: + bar: The bar. + baz: The baz. + \"\"\" + return bar + + # Documented args absent from function signature + def invalid_docstring_3(bar: str, baz: int) -> str: + \"\"\"The foo. + + Args: + banana: The bar. + monkey: The baz. + \"\"\" + return bar + """ + + def _make_with_name(tool_name: str) -> Callable: + def _make_tool(dec_func: Union[Callable, Runnable]) -> BaseTool: + if isinstance(dec_func, Runnable): + runnable = dec_func + + if runnable.input_schema.schema().get("type") != "object": + raise ValueError("Runnable must have an object schema.") + + async def ainvoke_wrapper( + callbacks: Optional[Callbacks] = None, **kwargs: Any + ) -> Any: + return await runnable.ainvoke(kwargs, {"callbacks": callbacks}) + + def invoke_wrapper( + callbacks: Optional[Callbacks] = None, **kwargs: Any + ) -> Any: + return runnable.invoke(kwargs, {"callbacks": callbacks}) + + coroutine = ainvoke_wrapper + func = invoke_wrapper + schema: Optional[Type[BaseModel]] = runnable.input_schema + description = repr(runnable) + elif inspect.iscoroutinefunction(dec_func): + coroutine = dec_func + func = None + schema = args_schema + description = None + else: + coroutine = None + func = dec_func + schema = args_schema + description = None + + if infer_schema or args_schema is not None: + return StructuredTool.from_function( + func, + coroutine, + name=tool_name, + description=description, + return_direct=return_direct, + args_schema=schema, + infer_schema=infer_schema, + response_format=response_format, + parse_docstring=parse_docstring, + error_on_invalid_docstring=error_on_invalid_docstring, + ) + # If someone doesn't want a schema applied, we must treat it as + # a simple string->string function + if dec_func.__doc__ is None: + raise ValueError( + "Function must have a docstring if " + "description not provided and infer_schema is False." + ) + return Tool( + name=tool_name, + func=func, + description=f"{tool_name} tool", + return_direct=return_direct, + coroutine=coroutine, + response_format=response_format, + ) + + return _make_tool + + if len(args) == 2 and isinstance(args[0], str) and isinstance(args[1], Runnable): + return _make_with_name(args[0])(args[1]) + elif len(args) == 1 and isinstance(args[0], str): + # if the argument is a string, then we use the string as the tool name + # Example usage: @tool("search", return_direct=True) + return _make_with_name(args[0]) + elif len(args) == 1 and callable(args[0]): + # if the argument is a function, then we use the function name as the tool name + # Example usage: @tool + return _make_with_name(args[0].__name__)(args[0]) + elif len(args) == 0: + # if there are no arguments, then we use the function name as the tool name + # Example usage: @tool(return_direct=True) + def _partial(func: Callable[[str], str]) -> BaseTool: + return _make_with_name(func.__name__)(func) + + return _partial + else: + raise ValueError("Too many arguments for tool decorator") + + +def _get_description_from_runnable(runnable: Runnable) -> str: + """Generate a placeholder description of a runnable.""" + input_schema = runnable.input_schema.schema() + return f"Takes {input_schema}." + + +def _get_schema_from_runnable_and_arg_types( + runnable: Runnable, + name: str, + arg_types: Optional[Dict[str, Type]] = None, +) -> Type[BaseModel]: + """Infer args_schema for tool.""" + if arg_types is None: + try: + arg_types = get_type_hints(runnable.InputType) + except TypeError as e: + raise TypeError( + "Tool input must be str or dict. If dict, dict arguments must be " + "typed. Either annotate types (e.g., with TypedDict) or pass " + f"arg_types into `.as_tool` to specify. {str(e)}" + ) + fields = {key: (key_type, Field(...)) for key, key_type in arg_types.items()} + return create_model(name, **fields) # type: ignore + + +def convert_runnable_to_tool( + runnable: Runnable, + args_schema: Optional[Type[BaseModel]] = None, + *, + name: Optional[str] = None, + description: Optional[str] = None, + arg_types: Optional[Dict[str, Type]] = None, +) -> BaseTool: + """Convert a Runnable into a BaseTool. + + Args: + runnable: The runnable to convert. + args_schema: The schema for the tool's input arguments. Defaults to None. + name: The name of the tool. Defaults to None. + description: The description of the tool. Defaults to None. + arg_types: The types of the arguments. Defaults to None. + + Returns: + The tool. + """ + if args_schema: + runnable = runnable.with_types(input_type=args_schema) + description = description or _get_description_from_runnable(runnable) + name = name or runnable.get_name() + + schema = runnable.input_schema.schema() + if schema.get("type") == "string": + return Tool( + name=name, + func=runnable.invoke, + coroutine=runnable.ainvoke, + description=description, + ) + else: + + async def ainvoke_wrapper( + callbacks: Optional[Callbacks] = None, **kwargs: Any + ) -> Any: + return await runnable.ainvoke(kwargs, config={"callbacks": callbacks}) + + def invoke_wrapper(callbacks: Optional[Callbacks] = None, **kwargs: Any) -> Any: + return runnable.invoke(kwargs, config={"callbacks": callbacks}) + + if ( + arg_types is None + and schema.get("type") == "object" + and schema.get("properties") + ): + args_schema = runnable.input_schema + else: + args_schema = _get_schema_from_runnable_and_arg_types( + runnable, name, arg_types=arg_types + ) + + return StructuredTool.from_function( + name=name, + func=invoke_wrapper, + coroutine=ainvoke_wrapper, + description=description, + args_schema=args_schema, + ) diff --git a/libs/core/langchain_core/tools/render.py b/libs/core/langchain_core/tools/render.py new file mode 100644 index 00000000000..6d93c3fc2cb --- /dev/null +++ b/libs/core/langchain_core/tools/render.py @@ -0,0 +1,65 @@ +from __future__ import annotations + +from inspect import signature +from typing import Callable, List + +from langchain_core.tools.base import BaseTool + +ToolsRenderer = Callable[[List[BaseTool]], str] + + +def render_text_description(tools: List[BaseTool]) -> str: + """Render the tool name and description in plain text. + + Args: + tools: The tools to render. + + Returns: + The rendered text. + + Output will be in the format of: + + .. code-block:: markdown + + search: This tool is used for search + calculator: This tool is used for math + """ + descriptions = [] + for tool in tools: + if hasattr(tool, "func") and tool.func: + sig = signature(tool.func) + description = f"{tool.name}{sig} - {tool.description}" + else: + description = f"{tool.name} - {tool.description}" + + descriptions.append(description) + return "\n".join(descriptions) + + +def render_text_description_and_args(tools: List[BaseTool]) -> str: + """Render the tool name, description, and args in plain text. + + Args: + tools: The tools to render. + + Returns: + The rendered text. + + Output will be in the format of: + + .. code-block:: markdown + + search: This tool is used for search, args: {"query": {"type": "string"}} + calculator: This tool is used for math, \ +args: {"expression": {"type": "string"}} + """ + tool_strings = [] + for tool in tools: + args_schema = str(tool.args) + if hasattr(tool, "func") and tool.func: + sig = signature(tool.func) + description = f"{tool.name}{sig} - {tool.description}" + else: + description = f"{tool.name} - {tool.description}" + tool_strings.append(f"{description}, args: {args_schema}") + return "\n".join(tool_strings) diff --git a/libs/core/langchain_core/tools/retriever.py b/libs/core/langchain_core/tools/retriever.py new file mode 100644 index 00000000000..3dba4442b7a --- /dev/null +++ b/libs/core/langchain_core/tools/retriever.py @@ -0,0 +1,91 @@ +from __future__ import annotations + +from functools import partial +from typing import Optional + +from langchain_core.callbacks import Callbacks +from langchain_core.prompts import ( + BasePromptTemplate, + PromptTemplate, + aformat_document, + format_document, +) +from langchain_core.pydantic_v1 import BaseModel, Field +from langchain_core.retrievers import BaseRetriever +from langchain_core.tools.simple import Tool + + +class RetrieverInput(BaseModel): + """Input to the retriever.""" + + query: str = Field(description="query to look up in retriever") + + +def _get_relevant_documents( + query: str, + retriever: BaseRetriever, + document_prompt: BasePromptTemplate, + document_separator: str, + callbacks: Callbacks = None, +) -> str: + docs = retriever.invoke(query, config={"callbacks": callbacks}) + return document_separator.join( + format_document(doc, document_prompt) for doc in docs + ) + + +async def _aget_relevant_documents( + query: str, + retriever: BaseRetriever, + document_prompt: BasePromptTemplate, + document_separator: str, + callbacks: Callbacks = None, +) -> str: + docs = await retriever.ainvoke(query, config={"callbacks": callbacks}) + return document_separator.join( + [await aformat_document(doc, document_prompt) for doc in docs] + ) + + +def create_retriever_tool( + retriever: BaseRetriever, + name: str, + description: str, + *, + document_prompt: Optional[BasePromptTemplate] = None, + document_separator: str = "\n\n", +) -> Tool: + """Create a tool to do retrieval of documents. + + Args: + retriever: The retriever to use for the retrieval + name: The name for the tool. This will be passed to the language model, + so should be unique and somewhat descriptive. + description: The description for the tool. This will be passed to the language + model, so should be descriptive. + document_prompt: The prompt to use for the document. Defaults to None. + document_separator: The separator to use between documents. Defaults to "\n\n". + + Returns: + Tool class to pass to an agent. + """ + document_prompt = document_prompt or PromptTemplate.from_template("{page_content}") + func = partial( + _get_relevant_documents, + retriever=retriever, + document_prompt=document_prompt, + document_separator=document_separator, + ) + afunc = partial( + _aget_relevant_documents, + retriever=retriever, + document_prompt=document_prompt, + document_separator=document_separator, + ) + return Tool( + name=name, + description=description, + func=func, + coroutine=afunc, + args_schema=RetrieverInput, + ) diff --git a/libs/core/langchain_core/tools/simple.py b/libs/core/langchain_core/tools/simple.py new file mode 100644 index 00000000000..aaf12df563e --- /dev/null +++ b/libs/core/langchain_core/tools/simple.py @@ -0,0 +1,157 @@ +from __future__ import annotations + +from inspect import signature +from typing import Any, Awaitable, Callable, Dict, Optional, Tuple, Type, Union + +from langchain_core.callbacks import ( + AsyncCallbackManagerForToolRun, + CallbackManagerForToolRun, +) +from langchain_core.messages import ToolCall +from langchain_core.pydantic_v1 import BaseModel +from langchain_core.runnables import RunnableConfig, run_in_executor +from langchain_core.tools.base import ( + BaseTool, + ToolException, + _get_runnable_config_param, +) + + +class Tool(BaseTool): + """Tool that takes in function or coroutine directly.""" + + description: str = "" + func: Optional[Callable[..., str]] + """The function to run when the tool is called.""" + coroutine: Optional[Callable[..., Awaitable[str]]] = None + """The asynchronous version of the function.""" + + # --- Runnable --- + + async def ainvoke( + self, + input: Union[str, Dict, ToolCall], + config: Optional[RunnableConfig] = None, + **kwargs: Any, + ) -> Any: + if not self.coroutine: + # If the tool does not implement async, fall back to default implementation + return await run_in_executor(config, self.invoke, input, config, **kwargs) + + return await super().ainvoke(input, config, **kwargs) + + # --- Tool --- + + @property + def args(self) -> dict: + """The tool's input arguments. + + Returns: + The input arguments for the tool. + """ + if self.args_schema is not None: + return self.args_schema.schema()["properties"] + # For backwards compatibility, if the function signature is ambiguous, + # assume it takes a single string input. + return {"tool_input": {"type": "string"}} + + def _to_args_and_kwargs(self, tool_input: Union[str, Dict]) -> Tuple[Tuple, Dict]: + """Convert tool input to pydantic model.""" + args, kwargs = super()._to_args_and_kwargs(tool_input) + # For backwards compatibility. The tool must be run with a single input + all_args = list(args) + list(kwargs.values()) + if len(all_args) != 1: + raise ToolException( + f"""Too many arguments to single-input tool {self.name}. + Consider using StructuredTool instead.""" + f" Args: {all_args}" + ) + return tuple(all_args), {} + + def _run( + self, + *args: Any, + config: RunnableConfig, + run_manager: Optional[CallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> Any: + """Use the tool.""" + if self.func: + if run_manager and signature(self.func).parameters.get("callbacks"): + kwargs["callbacks"] = run_manager.get_child() + if config_param := _get_runnable_config_param(self.func): + kwargs[config_param] = config + return self.func(*args, **kwargs) + raise NotImplementedError("Tool does not support sync invocation.") + + async def _arun( + self, + *args: Any, + config: RunnableConfig, + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> Any: + """Use the tool asynchronously.""" + if self.coroutine: + if run_manager and signature(self.coroutine).parameters.get("callbacks"): + kwargs["callbacks"] = run_manager.get_child() + if config_param := _get_runnable_config_param(self.coroutine): + kwargs[config_param] = config + return await self.coroutine(*args, **kwargs) + + # NOTE: this code is unreachable since _arun is only called if coroutine is not + # None. + return await super()._arun( + *args, config=config, run_manager=run_manager, **kwargs + ) + + # TODO: this is for backwards compatibility, remove in future + def __init__( + self, name: str, func: Optional[Callable], description: str, **kwargs: Any + ) -> None: + """Initialize tool.""" + super(Tool, self).__init__( # type: ignore[call-arg] + name=name, func=func, description=description, **kwargs + ) + + @classmethod + def from_function( + cls, + func: Optional[Callable], + name: str, # We keep these required to support backwards compatibility + description: str, + return_direct: bool = False, + args_schema: Optional[Type[BaseModel]] = None, + coroutine: Optional[ + Callable[..., Awaitable[Any]] + ] = None, # This is last for compatibility, but should be after func + **kwargs: Any, + ) -> Tool: + """Initialize tool from a function. + + Args: + func: The function to create the tool from. + name: The name of the tool. + description: The description of the tool. + return_direct: Whether to return the output directly. Defaults to False. + args_schema: The schema of the tool's input arguments. Defaults to None. + coroutine: The asynchronous version of the function. Defaults to None. + kwargs: Additional arguments to pass to the tool. + + Returns: + The tool. + + Raises: + ValueError: If the function is not provided. + """ + if func is None and coroutine is None: + raise ValueError("Function and/or coroutine must be provided") + return cls( + name=name, + func=func, + coroutine=coroutine, + description=description, + return_direct=return_direct, + args_schema=args_schema, + **kwargs, + ) diff --git a/libs/core/langchain_core/tools/structured.py b/libs/core/langchain_core/tools/structured.py new file mode 100644 index 00000000000..8da6d654559 --- /dev/null +++ b/libs/core/langchain_core/tools/structured.py @@ -0,0 +1,203 @@ +from __future__ import annotations + +import textwrap +from inspect import signature +from typing import Any, Awaitable, Callable, Dict, List, Literal, Optional, Type, Union + +from langchain_core.callbacks import ( + AsyncCallbackManagerForToolRun, + CallbackManagerForToolRun, +) +from langchain_core.messages import ToolCall +from langchain_core.pydantic_v1 import BaseModel, Field +from langchain_core.runnables import RunnableConfig, run_in_executor +from langchain_core.tools.base import ( + FILTERED_ARGS, + BaseTool, + _get_runnable_config_param, + create_schema_from_function, +) +from langchain_core.utils.pydantic import TypeBaseModel + + +class StructuredTool(BaseTool): + """Tool that can operate on any number of inputs.""" + + description: str = "" + args_schema: TypeBaseModel = Field(..., description="The tool schema.") + """The input arguments' schema.""" + func: Optional[Callable[..., Any]] + """The function to run when the tool is called.""" + coroutine: Optional[Callable[..., Awaitable[Any]]] = None + """The asynchronous version of the function.""" + + # --- Runnable --- + + # TODO: Is this needed? + async def ainvoke( + self, + input: Union[str, Dict, ToolCall], + config: Optional[RunnableConfig] = None, + **kwargs: Any, + ) -> Any: + if not self.coroutine: + # If the tool does not implement async, fall back to default implementation + return await run_in_executor(config, self.invoke, input, config, **kwargs) + + return await super().ainvoke(input, config, **kwargs) + + # --- Tool --- + + @property + def args(self) -> dict: + """The tool's input arguments.""" + return self.args_schema.schema()["properties"] + + def _run( + self, + *args: Any, + config: RunnableConfig, + run_manager: Optional[CallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> Any: + """Use the tool.""" + if self.func: + if run_manager and signature(self.func).parameters.get("callbacks"): + kwargs["callbacks"] = run_manager.get_child() + if config_param := _get_runnable_config_param(self.func): + kwargs[config_param] = config + return self.func(*args, **kwargs) + raise NotImplementedError("StructuredTool does not support sync invocation.") + + async def _arun( + self, + *args: Any, + config: RunnableConfig, + run_manager: Optional[AsyncCallbackManagerForToolRun] = None, + **kwargs: Any, + ) -> Any: + """Use the tool asynchronously.""" + if self.coroutine: + if run_manager and signature(self.coroutine).parameters.get("callbacks"): + kwargs["callbacks"] = run_manager.get_child() + if config_param := _get_runnable_config_param(self.coroutine): + kwargs[config_param] = config + return await self.coroutine(*args, **kwargs) + + # NOTE: this code is unreachable since _arun is only called if coroutine is not + # None. + return await super()._arun( + *args, config=config, run_manager=run_manager, **kwargs + ) + + @classmethod + def from_function( + cls, + func: Optional[Callable] = None, + coroutine: Optional[Callable[..., Awaitable[Any]]] = None, + name: Optional[str] = None, + description: Optional[str] = None, + return_direct: bool = False, + args_schema: Optional[Type[BaseModel]] = None, + infer_schema: bool = True, + *, + response_format: Literal["content", "content_and_artifact"] = "content", + parse_docstring: bool = False, + error_on_invalid_docstring: bool = False, + **kwargs: Any, + ) -> StructuredTool: + """Create tool from a given function. + + A classmethod that helps to create a tool from a function. + + Args: + func: The function from which to create a tool. + coroutine: The async function from which to create a tool. + name: The name of the tool. Defaults to the function name. + description: The description of the tool. + Defaults to the function docstring. + return_direct: Whether to return the result directly or as a callback. + Defaults to False. + args_schema: The schema of the tool's input arguments. Defaults to None. + infer_schema: Whether to infer the schema from the function's signature. + Defaults to True. + response_format: The tool response format. If "content" then the output of + the tool is interpreted as the contents of a ToolMessage. If + "content_and_artifact" then the output is expected to be a two-tuple + corresponding to the (content, artifact) of a ToolMessage. + Defaults to "content". + parse_docstring: if ``infer_schema`` and ``parse_docstring``, will attempt + to parse parameter descriptions from Google Style function docstrings. + Defaults to False. + error_on_invalid_docstring: if ``parse_docstring`` is provided, configure + whether to raise ValueError on invalid Google Style docstrings. + Defaults to False. + kwargs: Additional arguments to pass to the tool + + Returns: + The tool. + + Raises: + ValueError: If the function is not provided. + + Examples: + + .. code-block:: python + + def add(a: int, b: int) -> int: + \"\"\"Add two numbers\"\"\" + return a + b + tool = StructuredTool.from_function(add) + tool.run(1, 2) # 3 + """ + + if func is not None: + source_function = func + elif coroutine is not None: + source_function = coroutine + else: + raise ValueError("Function and/or coroutine must be provided") + name = name or source_function.__name__ + if args_schema is None and infer_schema: + # schema name is appended within function + args_schema = create_schema_from_function( + name, + source_function, + parse_docstring=parse_docstring, + error_on_invalid_docstring=error_on_invalid_docstring, + filter_args=_filter_schema_args(source_function), + ) + description_ = description + if description is None and not parse_docstring: + description_ = source_function.__doc__ or None + if description_ is None and args_schema: + description_ = args_schema.__doc__ or None + if description_ is None: + raise ValueError( + "Function must have a docstring if description not provided." + ) + if description is None: + # Only apply if using the function's docstring + description_ = textwrap.dedent(description_).strip() + + # Description example: + # search_api(query: str) - Searches the API for the query. + description_ = f"{description_.strip()}" + return cls( + name=name, + func=func, + coroutine=coroutine, + args_schema=args_schema, # type: ignore[arg-type] + description=description_, + return_direct=return_direct, + response_format=response_format, + **kwargs, + ) + + +def _filter_schema_args(func: Callable) -> List[str]: + filter_args = list(FILTERED_ARGS) + if config_param := _get_runnable_config_param(func): + filter_args.append(config_param) + # filter_args.extend(_get_non_model_params(type_hints)) + return filter_args diff --git a/libs/core/langchain_core/utils/function_calling.py b/libs/core/langchain_core/utils/function_calling.py index 9fa07a5eff0..28a1ab73513 100644 --- a/libs/core/langchain_core/utils/function_calling.py +++ b/libs/core/langchain_core/utils/function_calling.py @@ -172,10 +172,10 @@ def convert_python_function_to_openai_function( Returns: The OpenAI function description. """ - from langchain_core import tools + from langchain_core.tools.base import create_schema_from_function func_name = _get_python_function_name(function) - model = tools.create_schema_from_function( + model = create_schema_from_function( func_name, function, filter_args=(), diff --git a/libs/core/tests/unit_tests/test_tools.py b/libs/core/tests/unit_tests/test_tools.py index 47d13863a10..ef7e20d803b 100644 --- a/libs/core/tests/unit_tests/test_tools.py +++ b/libs/core/tests/unit_tests/test_tools.py @@ -39,15 +39,17 @@ from langchain_core.runnables import ( ) from langchain_core.tools import ( BaseTool, - InjectedToolArg, - SchemaAnnotationError, StructuredTool, Tool, ToolException, + tool, +) +from langchain_core.tools.base import ( + InjectedToolArg, + SchemaAnnotationError, _get_all_basemodel_annotations, _is_message_content_block, _is_message_content_type, - tool, ) from langchain_core.utils.function_calling import convert_to_openai_function from langchain_core.utils.pydantic import PYDANTIC_MAJOR_VERSION, _create_subset_model diff --git a/libs/experimental/langchain_experimental/autonomous_agents/autogpt/agent.py b/libs/experimental/langchain_experimental/autonomous_agents/autogpt/agent.py index 64ff71cb21c..215b732f3c9 100644 --- a/libs/experimental/langchain_experimental/autonomous_agents/autogpt/agent.py +++ b/libs/experimental/langchain_experimental/autonomous_agents/autogpt/agent.py @@ -8,10 +8,10 @@ from langchain.schema import ( BaseChatMessageHistory, Document, ) -from langchain.tools.base import BaseTool from langchain_community.tools.human.tool import HumanInputRun from langchain_core.language_models import BaseChatModel from langchain_core.messages import AIMessage, HumanMessage, SystemMessage +from langchain_core.tools import BaseTool from langchain_core.vectorstores import VectorStoreRetriever from langchain_experimental.autonomous_agents.autogpt.output_parser import ( diff --git a/libs/experimental/langchain_experimental/autonomous_agents/autogpt/prompt.py b/libs/experimental/langchain_experimental/autonomous_agents/autogpt/prompt.py index 88a61e11792..39ea5d60210 100644 --- a/libs/experimental/langchain_experimental/autonomous_agents/autogpt/prompt.py +++ b/libs/experimental/langchain_experimental/autonomous_agents/autogpt/prompt.py @@ -1,11 +1,11 @@ import time from typing import Any, Callable, List, cast -from langchain.tools.base import BaseTool from langchain_core.messages import BaseMessage, HumanMessage, SystemMessage from langchain_core.prompts.chat import ( BaseChatPromptTemplate, ) +from langchain_core.tools import BaseTool from langchain_core.vectorstores import VectorStoreRetriever from langchain_experimental.autonomous_agents.autogpt.prompt_generator import get_prompt diff --git a/libs/experimental/langchain_experimental/autonomous_agents/autogpt/prompt_generator.py b/libs/experimental/langchain_experimental/autonomous_agents/autogpt/prompt_generator.py index 09431670d6d..b4a72ce6177 100644 --- a/libs/experimental/langchain_experimental/autonomous_agents/autogpt/prompt_generator.py +++ b/libs/experimental/langchain_experimental/autonomous_agents/autogpt/prompt_generator.py @@ -1,7 +1,7 @@ import json from typing import List -from langchain.tools.base import BaseTool +from langchain_core.tools import BaseTool FINISH_NAME = "finish" diff --git a/libs/experimental/langchain_experimental/autonomous_agents/hugginggpt/hugginggpt.py b/libs/experimental/langchain_experimental/autonomous_agents/hugginggpt/hugginggpt.py index 35f1f1a3a8c..7a92cdd1adf 100644 --- a/libs/experimental/langchain_experimental/autonomous_agents/hugginggpt/hugginggpt.py +++ b/libs/experimental/langchain_experimental/autonomous_agents/hugginggpt/hugginggpt.py @@ -1,7 +1,7 @@ from typing import List from langchain.base_language import BaseLanguageModel -from langchain.tools.base import BaseTool +from langchain_core.tools import BaseTool from langchain_experimental.autonomous_agents.hugginggpt.repsonse_generator import ( load_response_generator, diff --git a/libs/experimental/langchain_experimental/autonomous_agents/hugginggpt/task_executor.py b/libs/experimental/langchain_experimental/autonomous_agents/hugginggpt/task_executor.py index c149a11cbd7..904ff7f7fb3 100644 --- a/libs/experimental/langchain_experimental/autonomous_agents/hugginggpt/task_executor.py +++ b/libs/experimental/langchain_experimental/autonomous_agents/hugginggpt/task_executor.py @@ -3,7 +3,7 @@ import uuid from typing import Dict, List import numpy as np -from langchain.tools.base import BaseTool +from langchain_core.tools import BaseTool from langchain_experimental.autonomous_agents.hugginggpt.task_planner import Plan diff --git a/libs/experimental/langchain_experimental/autonomous_agents/hugginggpt/task_planner.py b/libs/experimental/langchain_experimental/autonomous_agents/hugginggpt/task_planner.py index a78754f56f4..9d2f09ff8cf 100644 --- a/libs/experimental/langchain_experimental/autonomous_agents/hugginggpt/task_planner.py +++ b/libs/experimental/langchain_experimental/autonomous_agents/hugginggpt/task_planner.py @@ -5,7 +5,6 @@ from typing import Any, Dict, List, Optional, Union from langchain.base_language import BaseLanguageModel from langchain.chains import LLMChain -from langchain.tools.base import BaseTool from langchain_core.callbacks.manager import Callbacks from langchain_core.prompts.chat import ( AIMessagePromptTemplate, @@ -13,6 +12,7 @@ from langchain_core.prompts.chat import ( HumanMessagePromptTemplate, SystemMessagePromptTemplate, ) +from langchain_core.tools import BaseTool from langchain_experimental.pydantic_v1 import BaseModel diff --git a/libs/experimental/langchain_experimental/plan_and_execute/executors/agent_executor.py b/libs/experimental/langchain_experimental/plan_and_execute/executors/agent_executor.py index 0f971deeb6f..e0c24263cf9 100644 --- a/libs/experimental/langchain_experimental/plan_and_execute/executors/agent_executor.py +++ b/libs/experimental/langchain_experimental/plan_and_execute/executors/agent_executor.py @@ -2,8 +2,8 @@ from typing import List from langchain.agents.agent import AgentExecutor from langchain.agents.structured_chat.base import StructuredChatAgent -from langchain.tools import BaseTool from langchain_core.language_models import BaseLanguageModel +from langchain_core.tools import BaseTool from langchain_experimental.plan_and_execute.executors.base import ChainExecutor diff --git a/libs/experimental/langchain_experimental/prompt_injection_identifier/hugging_face_identifier.py b/libs/experimental/langchain_experimental/prompt_injection_identifier/hugging_face_identifier.py index 1bd3990de22..36ba27cc4de 100644 --- a/libs/experimental/langchain_experimental/prompt_injection_identifier/hugging_face_identifier.py +++ b/libs/experimental/langchain_experimental/prompt_injection_identifier/hugging_face_identifier.py @@ -5,7 +5,7 @@ from __future__ import annotations from typing import TYPE_CHECKING, Union from langchain.pydantic_v1 import Field, root_validator -from langchain.tools.base import BaseTool +from langchain_core.tools import BaseTool if TYPE_CHECKING: from transformers import Pipeline diff --git a/libs/experimental/langchain_experimental/tools/python/tool.py b/libs/experimental/langchain_experimental/tools/python/tool.py index 7ebcd7c9146..7c5b367169e 100644 --- a/libs/experimental/langchain_experimental/tools/python/tool.py +++ b/libs/experimental/langchain_experimental/tools/python/tool.py @@ -8,12 +8,12 @@ from io import StringIO from typing import Any, Dict, Optional, Type from langchain.pydantic_v1 import BaseModel, Field, root_validator -from langchain.tools.base import BaseTool from langchain_core.callbacks.manager import ( AsyncCallbackManagerForToolRun, CallbackManagerForToolRun, ) from langchain_core.runnables.config import run_in_executor +from langchain_core.tools import BaseTool from langchain_experimental.utilities.python import PythonREPL diff --git a/libs/langchain/langchain/agents/__init__.py b/libs/langchain/langchain/agents/__init__.py index e48797d24a2..e0250585feb 100644 --- a/libs/langchain/langchain/agents/__init__.py +++ b/libs/langchain/langchain/agents/__init__.py @@ -33,7 +33,8 @@ from pathlib import Path from typing import TYPE_CHECKING, Any from langchain_core._api.path import as_import_path -from langchain_core.tools import Tool, tool +from langchain_core.tools import Tool +from langchain_core.tools.convert import tool from langchain._api import create_importer from langchain.agents.agent import ( @@ -152,7 +153,6 @@ __all__ = [ "ReActTextWorldAgent", "SelfAskWithSearchChain", "StructuredChatAgent", - "Tool", "ZeroShotAgent", "create_json_agent", "create_openapi_agent", @@ -167,7 +167,6 @@ __all__ = [ "load_agent", "load_huggingface_tool", "load_tools", - "tool", "XMLAgent", "create_openai_functions_agent", "create_xml_agent", @@ -177,4 +176,6 @@ __all__ = [ "create_json_chat_agent", "create_structured_chat_agent", "create_tool_calling_agent", + "Tool", + "tool", ] diff --git a/libs/langchain/langchain/agents/agent_toolkits/__init__.py b/libs/langchain/langchain/agents/agent_toolkits/__init__.py index 8f733e04b83..6e5c299380d 100644 --- a/libs/langchain/langchain/agents/agent_toolkits/__init__.py +++ b/libs/langchain/langchain/agents/agent_toolkits/__init__.py @@ -18,6 +18,7 @@ from pathlib import Path from typing import TYPE_CHECKING, Any from langchain_core._api.path import as_import_path +from langchain_core.tools.retriever import create_retriever_tool from langchain._api import create_importer from langchain.agents.agent_toolkits.conversational_retrieval.openai_functions import ( @@ -32,7 +33,6 @@ from langchain.agents.agent_toolkits.vectorstore.toolkit import ( VectorStoreRouterToolkit, VectorStoreToolkit, ) -from langchain.tools.retriever import create_retriever_tool if TYPE_CHECKING: from langchain_community.agent_toolkits.ainetwork.toolkit import AINetworkToolkit diff --git a/libs/langchain/langchain/agents/agent_toolkits/vectorstore/toolkit.py b/libs/langchain/langchain/agents/agent_toolkits/vectorstore/toolkit.py index c256ced143b..c40b3f3b7f2 100644 --- a/libs/langchain/langchain/agents/agent_toolkits/vectorstore/toolkit.py +++ b/libs/langchain/langchain/agents/agent_toolkits/vectorstore/toolkit.py @@ -4,7 +4,8 @@ from typing import List from langchain_core.language_models import BaseLanguageModel from langchain_core.pydantic_v1 import BaseModel, Field -from langchain_core.tools import BaseTool, BaseToolkit +from langchain_core.tools import BaseTool +from langchain_core.tools.base import BaseToolkit from langchain_core.vectorstores import VectorStore diff --git a/libs/langchain/langchain/agents/json_chat/base.py b/libs/langchain/langchain/agents/json_chat/base.py index 65677e44064..2b2401711e1 100644 --- a/libs/langchain/langchain/agents/json_chat/base.py +++ b/libs/langchain/langchain/agents/json_chat/base.py @@ -4,11 +4,11 @@ from langchain_core.language_models import BaseLanguageModel from langchain_core.prompts.chat import ChatPromptTemplate from langchain_core.runnables import Runnable, RunnablePassthrough from langchain_core.tools import BaseTool +from langchain_core.tools.render import ToolsRenderer, render_text_description from langchain.agents.format_scratchpad import format_log_to_messages from langchain.agents.json_chat.prompt import TEMPLATE_TOOL_RESPONSE from langchain.agents.output_parsers import JSONAgentOutputParser -from langchain.tools.render import ToolsRenderer, render_text_description def create_json_chat_agent( diff --git a/libs/langchain/langchain/agents/mrkl/base.py b/libs/langchain/langchain/agents/mrkl/base.py index 8e45027616f..1b16d4d862f 100644 --- a/libs/langchain/langchain/agents/mrkl/base.py +++ b/libs/langchain/langchain/agents/mrkl/base.py @@ -10,6 +10,7 @@ from langchain_core.language_models import BaseLanguageModel from langchain_core.prompts import PromptTemplate from langchain_core.pydantic_v1 import Field from langchain_core.tools import BaseTool, Tool +from langchain_core.tools.render import render_text_description from langchain.agents.agent import Agent, AgentExecutor, AgentOutputParser from langchain.agents.agent_types import AgentType @@ -17,7 +18,6 @@ from langchain.agents.mrkl.output_parser import MRKLOutputParser from langchain.agents.mrkl.prompt import FORMAT_INSTRUCTIONS, PREFIX, SUFFIX from langchain.agents.utils import validate_tools_single_input from langchain.chains import LLMChain -from langchain.tools.render import render_text_description class ChainConfig(NamedTuple): diff --git a/libs/langchain/langchain/agents/react/agent.py b/libs/langchain/langchain/agents/react/agent.py index f988a923e75..faf86789ce1 100644 --- a/libs/langchain/langchain/agents/react/agent.py +++ b/libs/langchain/langchain/agents/react/agent.py @@ -6,11 +6,11 @@ from langchain_core.language_models import BaseLanguageModel from langchain_core.prompts import BasePromptTemplate from langchain_core.runnables import Runnable, RunnablePassthrough from langchain_core.tools import BaseTool +from langchain_core.tools.render import ToolsRenderer, render_text_description from langchain.agents import AgentOutputParser from langchain.agents.format_scratchpad import format_log_to_str from langchain.agents.output_parsers import ReActSingleInputOutputParser -from langchain.tools.render import ToolsRenderer, render_text_description def create_react_agent( diff --git a/libs/langchain/langchain/agents/structured_chat/base.py b/libs/langchain/langchain/agents/structured_chat/base.py index 894f3c79a6a..e1403e26f26 100644 --- a/libs/langchain/langchain/agents/structured_chat/base.py +++ b/libs/langchain/langchain/agents/structured_chat/base.py @@ -14,6 +14,7 @@ from langchain_core.prompts.chat import ( from langchain_core.pydantic_v1 import Field from langchain_core.runnables import Runnable, RunnablePassthrough from langchain_core.tools import BaseTool +from langchain_core.tools.render import ToolsRenderer from langchain.agents.agent import Agent, AgentOutputParser from langchain.agents.format_scratchpad import format_log_to_str @@ -23,7 +24,7 @@ from langchain.agents.structured_chat.output_parser import ( ) from langchain.agents.structured_chat.prompt import FORMAT_INSTRUCTIONS, PREFIX, SUFFIX from langchain.chains.llm import LLMChain -from langchain.tools.render import ToolsRenderer, render_text_description_and_args +from langchain.tools.render import render_text_description_and_args HUMAN_MESSAGE_TEMPLATE = "{input}\n\n{agent_scratchpad}" diff --git a/libs/langchain/langchain/agents/tools.py b/libs/langchain/langchain/agents/tools.py index 672ada80661..4a36fb1ee45 100644 --- a/libs/langchain/langchain/agents/tools.py +++ b/libs/langchain/langchain/agents/tools.py @@ -6,7 +6,7 @@ from langchain_core.callbacks import ( AsyncCallbackManagerForToolRun, CallbackManagerForToolRun, ) -from langchain_core.tools import BaseTool, Tool, tool +from langchain_core.tools import BaseTool, tool class InvalidTool(BaseTool): @@ -44,4 +44,4 @@ class InvalidTool(BaseTool): ) -__all__ = ["InvalidTool", "BaseTool", "tool", "Tool"] +__all__ = ["InvalidTool", "tool"] diff --git a/libs/langchain/langchain/agents/xml/base.py b/libs/langchain/langchain/agents/xml/base.py index 2e514b4480f..db8c843d579 100644 --- a/libs/langchain/langchain/agents/xml/base.py +++ b/libs/langchain/langchain/agents/xml/base.py @@ -8,13 +8,13 @@ from langchain_core.prompts.base import BasePromptTemplate from langchain_core.prompts.chat import AIMessagePromptTemplate, ChatPromptTemplate from langchain_core.runnables import Runnable, RunnablePassthrough from langchain_core.tools import BaseTool +from langchain_core.tools.render import ToolsRenderer, render_text_description from langchain.agents.agent import BaseSingleActionAgent from langchain.agents.format_scratchpad import format_xml from langchain.agents.output_parsers import XMLAgentOutputParser from langchain.agents.xml.prompt import agent_instructions from langchain.chains.llm import LLMChain -from langchain.tools.render import ToolsRenderer, render_text_description @deprecated("0.1.0", alternative="create_xml_agent", removal="1.0") diff --git a/libs/langchain/langchain/tools/__init__.py b/libs/langchain/langchain/tools/__init__.py index 570258e9acf..b6b2b0ae297 100644 --- a/libs/langchain/langchain/tools/__init__.py +++ b/libs/langchain/langchain/tools/__init__.py @@ -21,7 +21,16 @@ import warnings from typing import Any from langchain_core._api import LangChainDeprecationWarning -from langchain_core.tools import BaseTool, StructuredTool, Tool, tool +from langchain_core.tools import ( + BaseTool as BaseTool, +) +from langchain_core.tools import ( + StructuredTool as StructuredTool, +) +from langchain_core.tools import ( + Tool as Tool, +) +from langchain_core.tools.convert import tool as tool from langchain._api.interactive_env import is_interactive_env @@ -75,6 +84,10 @@ def __getattr__(name: str) -> Any: __all__ = [ + "StructuredTool", + "BaseTool", + "tool", + "Tool", "AINAppOps", "AINOwnerOps", "AINRuleOps", @@ -92,7 +105,6 @@ __all__ = [ "BaseRequestsTool", "BaseSQLDatabaseTool", "BaseSparkSQLTool", - "BaseTool", "BearlyInterpreterTool", "BingSearchResults", "BingSearchRun", @@ -181,8 +193,6 @@ __all__ = [ "StdInInquireTool", "StackExchangeTool", "SteamshipImageGenerationTool", - "StructuredTool", - "Tool", "VectorStoreQATool", "VectorStoreQAWithSourcesTool", "WikipediaQueryRun", @@ -193,5 +203,4 @@ __all__ = [ "ZapierNLAListActions", "ZapierNLARunAction", "format_tool_to_openai_function", - "tool", ] diff --git a/libs/langchain/langchain/tools/render.py b/libs/langchain/langchain/tools/render.py index f8494bde14e..c97546016c3 100644 --- a/libs/langchain/langchain/tools/render.py +++ b/libs/langchain/langchain/tools/render.py @@ -7,7 +7,6 @@ This module contains various ways to render tools. # For backwards compatibility from langchain_core.tools import ( - ToolsRenderer, render_text_description, render_text_description_and_args, ) @@ -17,7 +16,6 @@ from langchain_core.utils.function_calling import ( ) __all__ = [ - "ToolsRenderer", "render_text_description", "render_text_description_and_args", "format_tool_to_openai_tool", diff --git a/libs/langchain/langchain/tools/retriever.py b/libs/langchain/langchain/tools/retriever.py index 6d76c02b525..39d2a52ecb0 100644 --- a/libs/langchain/langchain/tools/retriever.py +++ b/libs/langchain/langchain/tools/retriever.py @@ -1,14 +1,10 @@ from langchain_core.tools import ( - RetrieverInput, - ToolsRenderer, create_retriever_tool, render_text_description, render_text_description_and_args, ) __all__ = [ - "RetrieverInput", - "ToolsRenderer", "create_retriever_tool", "render_text_description", "render_text_description_and_args", diff --git a/libs/partners/openai/langchain_openai/chat_models/base.py b/libs/partners/openai/langchain_openai/chat_models/base.py index cd341a80c57..0b1db11a9df 100644 --- a/libs/partners/openai/langchain_openai/chat_models/base.py +++ b/libs/partners/openai/langchain_openai/chat_models/base.py @@ -1458,7 +1458,9 @@ class BaseChatOpenAI(BaseChatModel): class ChatOpenAI(BaseChatOpenAI): """OpenAI chat model integration. - Setup: + .. dropdown:: Setup + :open: + Install ``langchain-openai`` and set environment variable ``OPENAI_API_KEY``. .. code-block:: bash @@ -1466,7 +1468,8 @@ class ChatOpenAI(BaseChatOpenAI): pip install -U langchain-openai export OPENAI_API_KEY="your-api-key" - Key init args β completion params: + .. dropdown:: Key init args β completion params + model: str Name of OpenAI model to use. temperature: float @@ -1479,7 +1482,10 @@ class ChatOpenAI(BaseChatOpenAI): Configure streaming outputs, like whether to return token usage when streaming (``{"include_usage": True}``). - Key init args β client params: + See full list of supported init args and their descriptions in the params section. + + .. dropdown:: Key init args β client params + timeout: Union[float, Tuple[float, float], Any, None] Timeout for requests. max_retries: int @@ -1493,9 +1499,10 @@ class ChatOpenAI(BaseChatOpenAI): OpenAI organization ID. If not passed in will be read from env var OPENAI_ORG_ID. - See full list of supported init args and their descriptions in the params section. + See full list of supported init args and their descriptions in the params section. + + .. dropdown:: Instantiate - Instantiate: .. code-block:: python from langchain_openai import ChatOpenAI @@ -1512,9 +1519,10 @@ class ChatOpenAI(BaseChatOpenAI): # other params... ) - **NOTE**: Any param which is not explicitly supported will be passed directly to the - ``openai.OpenAI.chat.completions.create(...)`` API every time to the model is - invoked. For example: + **NOTE**: Any param which is not explicitly supported will be passed directly to the + ``openai.OpenAI.chat.completions.create(...)`` API every time to the model is + invoked. For example: + .. code-block:: python from langchain_openai import ChatOpenAI @@ -1530,7 +1538,8 @@ class ChatOpenAI(BaseChatOpenAI): ChatOpenAI(...).invoke(..., frequency_penalty=0.2) - Invoke: + .. dropdown:: Invoke + .. code-block:: python messages = [ @@ -1542,7 +1551,7 @@ class ChatOpenAI(BaseChatOpenAI): ] llm.invoke(messages) - .. code-block:: python + .. code-block:: pycon AIMessage( content="J'adore la programmation.", @@ -1561,7 +1570,8 @@ class ChatOpenAI(BaseChatOpenAI): usage_metadata={"input_tokens": 31, "output_tokens": 5, "total_tokens": 36}, ) - Stream: + .. dropdown:: Stream + .. code-block:: python for chunk in llm.stream(messages): @@ -1599,7 +1609,8 @@ class ChatOpenAI(BaseChatOpenAI): id="run-bf917526-7f58-4683-84f7-36a6b671d140", ) - Async: + .. dropdown:: Async + .. code-block:: python await llm.ainvoke(messages) @@ -1629,7 +1640,8 @@ class ChatOpenAI(BaseChatOpenAI): usage_metadata={"input_tokens": 31, "output_tokens": 5, "total_tokens": 36}, ) - Tool calling: + .. dropdown:: Tool calling + .. code-block:: python from langchain_core.pydantic_v1 import BaseModel, Field @@ -1712,7 +1724,8 @@ class ChatOpenAI(BaseChatOpenAI): See ``ChatOpenAI.bind_tools()`` method for more. - Structured output: + .. dropdown:: Structured output + .. code-block:: python from typing import Optional @@ -1741,7 +1754,8 @@ class ChatOpenAI(BaseChatOpenAI): See ``ChatOpenAI.with_structured_output()`` for more. - JSON mode: + .. dropdown:: JSON mode + .. code-block:: python json_llm = llm.bind(response_format={"type": "json_object"}) @@ -1754,7 +1768,8 @@ class ChatOpenAI(BaseChatOpenAI): '\\n{\\n "random_ints": [23, 87, 45, 12, 78, 34, 56, 90, 11, 67]\\n}' - Image input: + .. dropdown:: Image input + .. code-block:: python import base64 @@ -1779,7 +1794,8 @@ class ChatOpenAI(BaseChatOpenAI): "The weather in the image appears to be clear and pleasant. The sky is mostly blue with scattered, light clouds, suggesting a sunny day with minimal cloud cover. There is no indication of rain or strong winds, and the overall scene looks bright and calm. The lush green grass and clear visibility further indicate good weather conditions." - Token usage: + .. dropdown:: Token usage + .. code-block:: python ai_msg = llm.invoke(messages) @@ -1813,7 +1829,8 @@ class ChatOpenAI(BaseChatOpenAI): llm = ChatOpenAI(model="gpt-4o", stream_usage=True) structured_llm = llm.with_structured_output(...) - Logprobs: + .. dropdown:: Logprobs + .. code-block:: python logprobs_llm = llm.bind(logprobs=True) @@ -1872,7 +1889,8 @@ class ChatOpenAI(BaseChatOpenAI): ] } - Response metadata + .. dropdown:: Response metadata + .. code-block:: python ai_msg = llm.invoke(messages) diff --git a/libs/standard-tests/langchain_standard_tests/integration_tests/chat_models.py b/libs/standard-tests/langchain_standard_tests/integration_tests/chat_models.py index bcb47a4c151..713c4fd3543 100644 --- a/libs/standard-tests/langchain_standard_tests/integration_tests/chat_models.py +++ b/libs/standard-tests/langchain_standard_tests/integration_tests/chat_models.py @@ -17,7 +17,7 @@ from langchain_core.messages import ( from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate from langchain_core.pydantic_v1 import BaseModel, Field -from langchain_core.tools import tool +from langchain_core.tools.convert import tool from pydantic import BaseModel as RawBaseModel from pydantic import Field as RawField diff --git a/libs/standard-tests/langchain_standard_tests/unit_tests/chat_models.py b/libs/standard-tests/langchain_standard_tests/unit_tests/chat_models.py index ed73771dbda..1a7d85e4930 100644 --- a/libs/standard-tests/langchain_standard_tests/unit_tests/chat_models.py +++ b/libs/standard-tests/langchain_standard_tests/unit_tests/chat_models.py @@ -7,7 +7,7 @@ import pytest from langchain_core.language_models import BaseChatModel from langchain_core.pydantic_v1 import BaseModel, Field from langchain_core.runnables import RunnableBinding -from langchain_core.tools import tool +from langchain_core.tools.convert import tool from langchain_standard_tests.base import BaseStandardTests from langchain_standard_tests.utils.pydantic import PYDANTIC_MAJOR_VERSION diff --git a/poetry.lock b/poetry.lock index 0ab68a5f11e..96f2936c56f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,14 +1,28 @@ # This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +[[package]] +name = "accessible-pygments" +version = "0.0.4" +description = "A collection of accessible pygments styles" +optional = false +python-versions = "*" +files = [ + {file = "accessible-pygments-0.0.4.tar.gz", hash = "sha256:e7b57a9b15958e9601c7e9eb07a440c813283545a20973f2574a5f453d0e953e"}, + {file = "accessible_pygments-0.0.4-py2.py3-none-any.whl", hash = "sha256:416c6d8c1ea1c5ad8701903a20fcedf953c6e720d64f33dc47bfb2d3f2fa4e8d"}, +] + +[package.dependencies] +pygments = ">=1.5" + [[package]] name = "aiohappyeyeballs" -version = "2.3.4" +version = "2.3.5" description = "Happy Eyeballs for asyncio" optional = false -python-versions = "<4.0,>=3.8" +python-versions = ">=3.8" files = [ - {file = "aiohappyeyeballs-2.3.4-py3-none-any.whl", hash = "sha256:40a16ceffcf1fc9e142fd488123b2e218abc4188cf12ac20c67200e1579baa42"}, - {file = "aiohappyeyeballs-2.3.4.tar.gz", hash = "sha256:7e1ae8399c320a8adec76f6c919ed5ceae6edd4c3672f4d9eae2b27e37c80ff6"}, + {file = "aiohappyeyeballs-2.3.5-py3-none-any.whl", hash = "sha256:4d6dea59215537dbc746e93e779caea8178c866856a721c9c660d7a5a7b8be03"}, + {file = "aiohappyeyeballs-2.3.5.tar.gz", hash = "sha256:6fa48b9f1317254f122a07a131a86b71ca6946ca989ce6326fff54a99a920105"}, ] [[package]] @@ -144,6 +158,9 @@ files = [ {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.9\""} + [[package]] name = "anyio" version = "4.4.0" @@ -177,82 +194,6 @@ files = [ {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, ] -[[package]] -name = "argon2-cffi" -version = "23.1.0" -description = "Argon2 for Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, - {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, -] - -[package.dependencies] -argon2-cffi-bindings = "*" - -[package.extras] -dev = ["argon2-cffi[tests,typing]", "tox (>4)"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-notfound-page"] -tests = ["hypothesis", "pytest"] -typing = ["mypy"] - -[[package]] -name = "argon2-cffi-bindings" -version = "21.2.0" -description = "Low-level CFFI bindings for Argon2" -optional = false -python-versions = ">=3.6" -files = [ - {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, - {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, -] - -[package.dependencies] -cffi = ">=1.0.1" - -[package.extras] -dev = ["cogapp", "pre-commit", "pytest", "wheel"] -tests = ["pytest"] - -[[package]] -name = "arrow" -version = "1.3.0" -description = "Better dates & times for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, - {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, -] - -[package.dependencies] -python-dateutil = ">=2.7.0" -types-python-dateutil = ">=2.8.10" - -[package.extras] -doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] -test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"] - [[package]] name = "asttokens" version = "2.4.1" @@ -271,20 +212,6 @@ six = ">=1.12.0" astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] -[[package]] -name = "async-lru" -version = "2.0.4" -description = "Simple LRU cache for asyncio" -optional = false -python-versions = ">=3.8" -files = [ - {file = "async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627"}, - {file = "async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224"}, -] - -[package.dependencies] -typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} - [[package]] name = "async-timeout" version = "4.0.3" @@ -335,27 +262,6 @@ dev = ["coverage (>=5,<6)", "flake8 (>=3,<4)", "pytest (>=6,<7)", "sphinx-copybu docs = ["sphinx-copybutton (>=0.4,<0.5)", "sphinx-rtd-theme (>=1.0,<2.0)", "sphinx-tabs (>=3,<4)", "sphinxcontrib-mermaid (>=0.7,<0.8)"] test = ["coverage (>=5,<6)", "pytest (>=6,<7)"] -[[package]] -name = "autodoc-pydantic" -version = "1.9.1" -description = "Seamlessly integrate pydantic models in your Sphinx documentation." -optional = false -python-versions = "<4.0.0,>=3.7.1" -files = [ - {file = "autodoc_pydantic-1.9.1-py3-none-any.whl", hash = "sha256:7b7c68ce3720f099ec85b7b8b9bd91414b8873704aa60f75489c2bcfe2d57bb5"}, - {file = "autodoc_pydantic-1.9.1.tar.gz", hash = "sha256:0443987f1cc2516c8186e85d05a1816a314a19e1433b69a0a4b154f4acca3f9b"}, -] - -[package.dependencies] -pydantic = ">=1.5,<2.0.0" -Sphinx = ">=3.4" - -[package.extras] -dev = ["coverage (>=7,<8)", "flake8 (>=3,<4)", "pytest (>=7,<8)", "sphinx-copybutton (>=0.4,<0.5)", "sphinx-rtd-theme (>=1.0,<2.0)", "sphinx-tabs (>=3,<4)", "sphinxcontrib-mermaid (>=0.7,<0.8)", "tox (>=3,<4)"] -docs = ["sphinx-copybutton (>=0.4,<0.5)", "sphinx-rtd-theme (>=1.0,<2.0)", "sphinx-tabs (>=3,<4)", "sphinxcontrib-mermaid (>=0.7,<0.8)"] -erdantic = ["erdantic (>=0.5,<0.6)"] -test = ["coverage (>=7,<8)", "pytest (>=7,<8)"] - [[package]] name = "babel" version = "2.15.0" @@ -405,72 +311,6 @@ charset-normalizer = ["charset-normalizer"] html5lib = ["html5lib"] lxml = ["lxml"] -[[package]] -name = "black" -version = "24.8.0" -description = "The uncompromising code formatter." -optional = false -python-versions = ">=3.8" -files = [ - {file = "black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6"}, - {file = "black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb"}, - {file = "black-24.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42"}, - {file = "black-24.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a"}, - {file = "black-24.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1"}, - {file = "black-24.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af"}, - {file = "black-24.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4"}, - {file = "black-24.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af"}, - {file = "black-24.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368"}, - {file = "black-24.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed"}, - {file = "black-24.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018"}, - {file = "black-24.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2"}, - {file = "black-24.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd"}, - {file = "black-24.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2"}, - {file = "black-24.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e"}, - {file = "black-24.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920"}, - {file = "black-24.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c"}, - {file = "black-24.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e"}, - {file = "black-24.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47"}, - {file = "black-24.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb"}, - {file = "black-24.8.0-py3-none-any.whl", hash = "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed"}, - {file = "black-24.8.0.tar.gz", hash = "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f"}, -] - -[package.dependencies] -click = ">=8.0.0" -ipython = {version = ">=7.8.0", optional = true, markers = "extra == \"jupyter\""} -mypy-extensions = ">=0.4.3" -packaging = ">=22.0" -pathspec = ">=0.9.0" -platformdirs = ">=2" -tokenize-rt = {version = ">=3.2.0", optional = true, markers = "extra == \"jupyter\""} -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - -[[package]] -name = "bleach" -version = "6.1.0" -description = "An easy safelist-based HTML-sanitizing tool." -optional = false -python-versions = ">=3.8" -files = [ - {file = "bleach-6.1.0-py3-none-any.whl", hash = "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6"}, - {file = "bleach-6.1.0.tar.gz", hash = "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe"}, -] - -[package.dependencies] -six = ">=1.9.0" -webencodings = "*" - -[package.extras] -css = ["tinycss2 (>=1.1.0,<1.3)"] - [[package]] name = "certifi" version = "2024.7.4" @@ -660,20 +500,6 @@ files = [ {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] -[[package]] -name = "click" -version = "8.1.7" -description = "Composable command line interface toolkit" -optional = false -python-versions = ">=3.7" -files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - [[package]] name = "codespell" version = "2.3.0" @@ -776,17 +602,6 @@ files = [ {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, ] -[[package]] -name = "defusedxml" -version = "0.7.1" -description = "XML bomb protection for Python stdlib modules" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, - {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, -] - [[package]] name = "distro" version = "1.9.0" @@ -798,47 +613,13 @@ files = [ {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, ] -[[package]] -name = "dnspython" -version = "2.6.1" -description = "DNS toolkit" -optional = false -python-versions = ">=3.8" -files = [ - {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, - {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, -] - -[package.extras] -dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "sphinx (>=7.2.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] -dnssec = ["cryptography (>=41)"] -doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"] -doq = ["aioquic (>=0.9.25)"] -idna = ["idna (>=3.6)"] -trio = ["trio (>=0.23)"] -wmi = ["wmi (>=1.5.1)"] - [[package]] name = "docutils" -version = "0.17.1" +version = "0.20.1" description = "Docutils -- Python Documentation Utilities" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, - {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, -] - -[[package]] -name = "entrypoints" -version = "0.4" -description = "Discover and load entry points from installed packages." -optional = false -python-versions = ">=3.6" -files = [ - {file = "entrypoints-0.4-py3-none-any.whl", hash = "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f"}, - {file = "entrypoints-0.4.tar.gz", hash = "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4"}, -] +python-versions = "*" +files = [] [[package]] name = "exceptiongroup" @@ -868,67 +649,6 @@ files = [ [package.extras] tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] -[[package]] -name = "fastcore" -version = "1.4.2" -description = "Python supercharged for fastai development" -optional = false -python-versions = ">=3.7" -files = [ - {file = "fastcore-1.4.2-py3-none-any.whl", hash = "sha256:86c31395a87ea429c35f9291e826098f525684a3a6555238448a371274224ddb"}, - {file = "fastcore-1.4.2.tar.gz", hash = "sha256:43bb895507788168317f28cf82031c5ce1796d95a229fc515c10bd90f2355a37"}, -] - -[package.dependencies] -packaging = "*" -pip = "*" - -[package.extras] -dev = ["matplotlib", "nbdev (>=0.2.39)", "numpy", "pandas", "pillow", "torch"] - -[[package]] -name = "fastjsonschema" -version = "2.20.0" -description = "Fastest Python implementation of JSON schema" -optional = false -python-versions = "*" -files = [ - {file = "fastjsonschema-2.20.0-py3-none-any.whl", hash = "sha256:5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a"}, - {file = "fastjsonschema-2.20.0.tar.gz", hash = "sha256:3d48fc5300ee96f5d116f10fe6f28d938e6008f59a6a025c2649475b87f76a23"}, -] - -[package.extras] -devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] - -[[package]] -name = "fastrelease" -version = "0.1.17" -description = "Simplified releases using GitHub Issues" -optional = false -python-versions = ">=3.6" -files = [ - {file = "fastrelease-0.1.17-py3-none-any.whl", hash = "sha256:8b5bbaa9a566fee9c08bbc7cc8fb052a04499a76b464a8b0669707843cb15e2f"}, - {file = "fastrelease-0.1.17.tar.gz", hash = "sha256:c4c6717dcb8c5b37496511dd2a3f97f810b70e1350380b6ae023bb15757b6a63"}, -] - -[package.dependencies] -fastcore = ">=1.3.13" -ghapi = "*" -packaging = "*" -pip = "*" -pyyaml = "*" - -[[package]] -name = "fqdn" -version = "1.5.1" -description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" -optional = false -python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" -files = [ - {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, - {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, -] - [[package]] name = "frozenlist" version = "1.4.1" @@ -1015,25 +735,6 @@ files = [ {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, ] -[[package]] -name = "ghapi" -version = "0.1.22" -description = "A python client for the GitHub API" -optional = false -python-versions = ">=3.6" -files = [ - {file = "ghapi-0.1.22-py3-none-any.whl", hash = "sha256:fba8d57dfc2992d97fe93eaa12e80b9becbed7f13ac6cdcd1c85283c68b04505"}, - {file = "ghapi-0.1.22.tar.gz", hash = "sha256:fbe31684c141767a62899020fff8c6922a8ecaadd6d4614f0673242939cbb655"}, -] - -[package.dependencies] -fastcore = "*" -packaging = "*" -pip = "*" - -[package.extras] -dev = ["jsonref"] - [[package]] name = "greenlet" version = "3.0.3" @@ -1202,24 +903,6 @@ doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linke perf = ["ipython"] test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] -[[package]] -name = "importlib-resources" -version = "6.4.0" -description = "Read resources from Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "importlib_resources-6.4.0-py3-none-any.whl", hash = "sha256:50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c"}, - {file = "importlib_resources-6.4.0.tar.gz", hash = "sha256:cdb2b453b8046ca4e3798eb1d84f3cce1446a0e8e7b5ef4efb600f19fc398145"}, -] - -[package.dependencies] -zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["jaraco.test (>=5.4)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"] - [[package]] name = "ipykernel" version = "6.29.5" @@ -1292,41 +975,6 @@ qtconsole = ["qtconsole"] test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] -[[package]] -name = "ipywidgets" -version = "8.1.3" -description = "Jupyter interactive widgets" -optional = false -python-versions = ">=3.7" -files = [ - {file = "ipywidgets-8.1.3-py3-none-any.whl", hash = "sha256:efafd18f7a142248f7cb0ba890a68b96abd4d6e88ddbda483c9130d12667eaf2"}, - {file = "ipywidgets-8.1.3.tar.gz", hash = "sha256:f5f9eeaae082b1823ce9eac2575272952f40d748893972956dc09700a6392d9c"}, -] - -[package.dependencies] -comm = ">=0.1.3" -ipython = ">=6.1.0" -jupyterlab-widgets = ">=3.0.11,<3.1.0" -traitlets = ">=4.3.1" -widgetsnbextension = ">=4.0.11,<4.1.0" - -[package.extras] -test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] - -[[package]] -name = "isoduration" -version = "20.11.0" -description = "Operations with ISO 8601 durations" -optional = false -python-versions = ">=3.7" -files = [ - {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, - {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, -] - -[package.dependencies] -arrow = ">=0.15.0" - [[package]] name = "jedi" version = "0.19.1" @@ -1433,17 +1081,6 @@ files = [ {file = "jiter-0.5.0.tar.gz", hash = "sha256:1d916ba875bcab5c5f7d927df998c4cb694d27dceddf3392e58beaf10563368a"}, ] -[[package]] -name = "json5" -version = "0.9.25" -description = "A Python implementation of the JSON5 data format." -optional = false -python-versions = ">=3.8" -files = [ - {file = "json5-0.9.25-py3-none-any.whl", hash = "sha256:34ed7d834b1341a86987ed52f3f76cd8ee184394906b6e22a1e0deb9ab294e8f"}, - {file = "json5-0.9.25.tar.gz", hash = "sha256:548e41b9be043f9426776f05df8635a00fe06104ea51ed24b67f908856e151ae"}, -] - [[package]] name = "jsonpatch" version = "1.33" @@ -1469,146 +1106,28 @@ files = [ {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, ] -[[package]] -name = "jsonschema" -version = "4.23.0" -description = "An implementation of JSON Schema validation for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, - {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, -] - -[package.dependencies] -attrs = ">=22.2.0" -fqdn = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -idna = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} -isoduration = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -jsonpointer = {version = ">1.13", optional = true, markers = "extra == \"format-nongpl\""} -jsonschema-specifications = ">=2023.03.6" -pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} -referencing = ">=0.28.4" -rfc3339-validator = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""} -rpds-py = ">=0.7.1" -uri-template = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -webcolors = {version = ">=24.6.0", optional = true, markers = "extra == \"format-nongpl\""} - -[package.extras] -format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=24.6.0)"] - -[[package]] -name = "jsonschema-specifications" -version = "2023.12.1" -description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, - {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, -] - -[package.dependencies] -importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} -referencing = ">=0.31.0" - -[[package]] -name = "jupyter" -version = "1.0.0" -description = "Jupyter metapackage. Install all the Jupyter components in one go." -optional = false -python-versions = "*" -files = [ - {file = "jupyter-1.0.0-py2.py3-none-any.whl", hash = "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78"}, - {file = "jupyter-1.0.0.tar.gz", hash = "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f"}, - {file = "jupyter-1.0.0.zip", hash = "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7"}, -] - -[package.dependencies] -ipykernel = "*" -ipywidgets = "*" -jupyter-console = "*" -nbconvert = "*" -notebook = "*" -qtconsole = "*" - -[[package]] -name = "jupyter-cache" -version = "0.6.1" -description = "A defined interface for working with a cache of jupyter notebooks." -optional = false -python-versions = "~=3.8" -files = [ - {file = "jupyter-cache-0.6.1.tar.gz", hash = "sha256:26f83901143edf4af2f3ff5a91e2d2ad298e46e2cee03c8071d37a23a63ccbfc"}, - {file = "jupyter_cache-0.6.1-py3-none-any.whl", hash = "sha256:2fce7d4975805c77f75bdfc1bc2e82bc538b8e5b1af27f2f5e06d55b9f996a82"}, -] - -[package.dependencies] -attrs = "*" -click = "*" -importlib-metadata = "*" -nbclient = ">=0.2,<0.8" -nbformat = "*" -pyyaml = "*" -sqlalchemy = ">=1.3.12,<3" -tabulate = "*" - -[package.extras] -cli = ["click-log"] -code-style = ["pre-commit (>=2.12,<4.0)"] -rtd = ["ipykernel", "jupytext", "myst-nb", "nbdime", "sphinx-book-theme", "sphinx-copybutton"] -testing = ["coverage", "ipykernel", "jupytext", "matplotlib", "nbdime", "nbformat (>=5.1)", "numpy", "pandas", "pytest (>=6,<8)", "pytest-cov", "pytest-regressions", "sympy"] - [[package]] name = "jupyter-client" -version = "7.4.9" +version = "8.6.2" description = "Jupyter protocol implementation and client libraries" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "jupyter_client-7.4.9-py3-none-any.whl", hash = "sha256:214668aaea208195f4c13d28eb272ba79f945fc0cf3f11c7092c20b2ca1980e7"}, - {file = "jupyter_client-7.4.9.tar.gz", hash = "sha256:52be28e04171f07aed8f20e1616a5a552ab9fee9cbbe6c1896ae170c3880d392"}, + {file = "jupyter_client-8.6.2-py3-none-any.whl", hash = "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f"}, + {file = "jupyter_client-8.6.2.tar.gz", hash = "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df"}, ] [package.dependencies] -entrypoints = "*" -jupyter-core = ">=4.9.2" -nest-asyncio = ">=1.5.4" +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" python-dateutil = ">=2.8.2" pyzmq = ">=23.0" tornado = ">=6.2" -traitlets = "*" +traitlets = ">=5.3" [package.extras] -doc = ["ipykernel", "myst-parser", "sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] -test = ["codecov", "coverage", "ipykernel (>=6.12)", "ipython", "mypy", "pre-commit", "pytest", "pytest-asyncio (>=0.18)", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "jupyter-console" -version = "6.6.3" -description = "Jupyter terminal console" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485"}, - {file = "jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539"}, -] - -[package.dependencies] -ipykernel = ">=6.14" -ipython = "*" -jupyter-client = ">=7.0.0" -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -prompt-toolkit = ">=3.0.30" -pygments = "*" -pyzmq = ">=17" -traitlets = ">=5.4" - -[package.extras] -test = ["flaky", "pexpect", "pytest"] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-core" @@ -1630,185 +1149,6 @@ traitlets = ">=5.3" docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] -[[package]] -name = "jupyter-events" -version = "0.10.0" -description = "Jupyter Event System library" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter_events-0.10.0-py3-none-any.whl", hash = "sha256:4b72130875e59d57716d327ea70d3ebc3af1944d3717e5a498b8a06c6c159960"}, - {file = "jupyter_events-0.10.0.tar.gz", hash = "sha256:670b8229d3cc882ec782144ed22e0d29e1c2d639263f92ca8383e66682845e22"}, -] - -[package.dependencies] -jsonschema = {version = ">=4.18.0", extras = ["format-nongpl"]} -python-json-logger = ">=2.0.4" -pyyaml = ">=5.3" -referencing = "*" -rfc3339-validator = "*" -rfc3986-validator = ">=0.1.1" -traitlets = ">=5.3" - -[package.extras] -cli = ["click", "rich"] -docs = ["jupyterlite-sphinx", "myst-parser", "pydata-sphinx-theme", "sphinxcontrib-spelling"] -test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "rich"] - -[[package]] -name = "jupyter-lsp" -version = "2.2.5" -description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter-lsp-2.2.5.tar.gz", hash = "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001"}, - {file = "jupyter_lsp-2.2.5-py3-none-any.whl", hash = "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da"}, -] - -[package.dependencies] -importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} -jupyter-server = ">=1.1.2" - -[[package]] -name = "jupyter-server" -version = "2.14.2" -description = "The backendβi.e. core services, APIs, and REST endpointsβto Jupyter web applications." -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter_server-2.14.2-py3-none-any.whl", hash = "sha256:47ff506127c2f7851a17bf4713434208fc490955d0e8632e95014a9a9afbeefd"}, - {file = "jupyter_server-2.14.2.tar.gz", hash = "sha256:66095021aa9638ced276c248b1d81862e4c50f292d575920bbe960de1c56b12b"}, -] - -[package.dependencies] -anyio = ">=3.1.0" -argon2-cffi = ">=21.1" -jinja2 = ">=3.0.3" -jupyter-client = ">=7.4.4" -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -jupyter-events = ">=0.9.0" -jupyter-server-terminals = ">=0.4.4" -nbconvert = ">=6.4.4" -nbformat = ">=5.3.0" -overrides = ">=5.0" -packaging = ">=22.0" -prometheus-client = ">=0.9" -pywinpty = {version = ">=2.0.1", markers = "os_name == \"nt\""} -pyzmq = ">=24" -send2trash = ">=1.8.2" -terminado = ">=0.8.3" -tornado = ">=6.2.0" -traitlets = ">=5.6.0" -websocket-client = ">=1.7" - -[package.extras] -docs = ["ipykernel", "jinja2", "jupyter-client", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"] -test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0,<9)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.7)", "pytest-timeout", "requests"] - -[[package]] -name = "jupyter-server-terminals" -version = "0.5.3" -description = "A Jupyter Server Extension Providing Terminals." -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa"}, - {file = "jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269"}, -] - -[package.dependencies] -pywinpty = {version = ">=2.0.3", markers = "os_name == \"nt\""} -terminado = ">=0.8.3" - -[package.extras] -docs = ["jinja2", "jupyter-server", "mistune (<4.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] -test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] - -[[package]] -name = "jupyterlab" -version = "4.2.4" -description = "JupyterLab computational environment" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyterlab-4.2.4-py3-none-any.whl", hash = "sha256:807a7ec73637744f879e112060d4b9d9ebe028033b7a429b2d1f4fc523d00245"}, - {file = "jupyterlab-4.2.4.tar.gz", hash = "sha256:343a979fb9582fd08c8511823e320703281cd072a0049bcdafdc7afeda7f2537"}, -] - -[package.dependencies] -async-lru = ">=1.0.0" -httpx = ">=0.25.0" -importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} -importlib-resources = {version = ">=1.4", markers = "python_version < \"3.9\""} -ipykernel = ">=6.5.0" -jinja2 = ">=3.0.3" -jupyter-core = "*" -jupyter-lsp = ">=2.0.0" -jupyter-server = ">=2.4.0,<3" -jupyterlab-server = ">=2.27.1,<3" -notebook-shim = ">=0.2" -packaging = "*" -setuptools = ">=40.1.0" -tomli = {version = ">=1.2.2", markers = "python_version < \"3.11\""} -tornado = ">=6.2.0" -traitlets = "*" - -[package.extras] -dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.3.5)"] -docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<7.3.0)", "sphinx-copybutton"] -docs-screenshots = ["altair (==5.3.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.2)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.1.post2)", "matplotlib (==3.8.3)", "nbconvert (>=7.0.0)", "pandas (==2.2.1)", "scipy (==1.12.0)", "vega-datasets (==0.9.0)"] -test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] -upgrade-extension = ["copier (>=9,<10)", "jinja2-time (<0.3)", "pydantic (<3.0)", "pyyaml-include (<3.0)", "tomli-w (<2.0)"] - -[[package]] -name = "jupyterlab-pygments" -version = "0.3.0" -description = "Pygments theme using JupyterLab CSS variables" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, - {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, -] - -[[package]] -name = "jupyterlab-server" -version = "2.27.3" -description = "A set of server components for JupyterLab and JupyterLab like applications." -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyterlab_server-2.27.3-py3-none-any.whl", hash = "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4"}, - {file = "jupyterlab_server-2.27.3.tar.gz", hash = "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4"}, -] - -[package.dependencies] -babel = ">=2.10" -importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} -jinja2 = ">=3.0.3" -json5 = ">=0.9.0" -jsonschema = ">=4.18.0" -jupyter-server = ">=1.21,<3" -packaging = ">=21.3" -requests = ">=2.31" - -[package.extras] -docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"] -openapi = ["openapi-core (>=0.18.0,<0.19.0)", "ruamel-yaml"] -test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-validator (>=0.6.0,<0.8.0)", "pytest (>=7.0,<8)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "ruamel-yaml", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] - -[[package]] -name = "jupyterlab-widgets" -version = "3.0.11" -description = "Jupyter interactive widgets for JupyterLab" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jupyterlab_widgets-3.0.11-py3-none-any.whl", hash = "sha256:78287fd86d20744ace330a61625024cf5521e1c012a352ddc0a3cdc2348becd0"}, - {file = "jupyterlab_widgets-3.0.11.tar.gz", hash = "sha256:dd5ac679593c969af29c9bed054c24f26842baa51352114736756bc035deee27"}, -] - [[package]] name = "langchain" version = "0.2.12" @@ -1868,7 +1208,7 @@ url = "libs/community" [[package]] name = "langchain-core" -version = "0.2.28" +version = "0.2.29" description = "Building applications with LLMs through composability" optional = false python-versions = ">=3.8.1,<4.0" @@ -1910,7 +1250,7 @@ url = "libs/experimental" [[package]] name = "langchain-openai" -version = "0.1.20" +version = "0.1.21rc2" description = "An integration package connecting OpenAI and LangChain" optional = false python-versions = ">=3.8.1,<4.0" @@ -1918,7 +1258,7 @@ files = [] develop = true [package.dependencies] -langchain-core = "^0.2.26" +langchain-core = "^0.2.29" openai = "^1.40.0" tiktoken = ">=0.7,<1" @@ -1961,22 +1301,6 @@ pydantic = [ ] requests = ">=2,<3" -[[package]] -name = "linkchecker" -version = "10.3.0" -description = "check links in web documents or full websites" -optional = false -python-versions = ">=3.8" -files = [ - {file = "LinkChecker-10.3.0-py3-none-any.whl", hash = "sha256:624f63be599b1d91c3be60d6c5e38412ddbc0f4417c49f0d1936b33c1ce62b09"}, - {file = "LinkChecker-10.3.0.tar.gz", hash = "sha256:1741b9506d3f2b5d1243cc2918f5e5813134fcb77a93dbd38b23e0d088940046"}, -] - -[package.dependencies] -beautifulsoup4 = ">=4.8.1" -dnspython = ">=2.0" -requests = ">=2.20" - [[package]] name = "livereload" version = "2.7.0" @@ -1993,13 +1317,13 @@ tornado = "*" [[package]] name = "markdown-it-py" -version = "2.2.0" +version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"}, - {file = "markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"}, + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, ] [package.dependencies] @@ -2012,7 +1336,7 @@ compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0 linkify = ["linkify-it-py (>=1,<3)"] plugins = ["mdit-py-plugins"] profiling = ["gprof2dot"] -rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] @@ -2119,21 +1443,21 @@ traitlets = "*" [[package]] name = "mdit-py-plugins" -version = "0.3.5" +version = "0.4.1" description = "Collection of plugins for markdown-it-py" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "mdit-py-plugins-0.3.5.tar.gz", hash = "sha256:eee0adc7195e5827e17e02d2a258a2ba159944a0748f59c5099a4a27f78fcf6a"}, - {file = "mdit_py_plugins-0.3.5-py3-none-any.whl", hash = "sha256:ca9a0714ea59a24b2b044a1831f48d817dd0c817e84339f20e7889f392d77c4e"}, + {file = "mdit_py_plugins-0.4.1-py3-none-any.whl", hash = "sha256:1020dfe4e6bfc2c79fb49ae4e3f5b297f5ccd20f010187acc52af2921e27dc6a"}, + {file = "mdit_py_plugins-0.4.1.tar.gz", hash = "sha256:834b8ac23d1cd60cec703646ffd22ae97b7955a6d596eb1d304be1e251ae499c"}, ] [package.dependencies] -markdown-it-py = ">=1.0.0,<3.0.0" +markdown-it-py = ">=1.0.0,<4.0.0" [package.extras] code-style = ["pre-commit"] -rtd = ["attrs", "myst-parser (>=0.16.1,<0.17.0)", "sphinx-book-theme (>=0.1.0,<0.2.0)"] +rtd = ["myst-parser", "sphinx-book-theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] @@ -2147,17 +1471,6 @@ files = [ {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] -[[package]] -name = "mistune" -version = "3.0.2" -description = "A sane and fast Markdown parser with useful plugins and renderers" -optional = false -python-versions = ">=3.7" -files = [ - {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, - {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, -] - [[package]] name = "multidict" version = "6.0.5" @@ -2268,203 +1581,31 @@ files = [ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] -[[package]] -name = "myst-nb" -version = "0.17.2" -description = "A Jupyter Notebook Sphinx reader built on top of the MyST markdown parser." -optional = false -python-versions = ">=3.7" -files = [ - {file = "myst-nb-0.17.2.tar.gz", hash = "sha256:0f61386515fab07c73646adca97fff2f69f41e90d313a260217c5bbe419d858b"}, - {file = "myst_nb-0.17.2-py3-none-any.whl", hash = "sha256:132ca4d0f5c308fdd4b6fdaba077712e28e119ccdafd04d6e41b51aac5483494"}, -] - -[package.dependencies] -importlib_metadata = "*" -ipykernel = "*" -ipython = "*" -jupyter-cache = ">=0.5,<0.7" -myst-parser = ">=0.18.0,<0.19.0" -nbclient = "*" -nbformat = ">=5.0,<6.0" -pyyaml = "*" -sphinx = ">=4,<6" -typing-extensions = "*" - -[package.extras] -code-style = ["pre-commit"] -rtd = ["alabaster", "altair", "bokeh", "coconut (>=1.4.3,<2.3.0)", "ipykernel (>=5.5,<6.0)", "ipywidgets", "jupytext (>=1.11.2,<1.12.0)", "matplotlib", "numpy", "pandas", "plotly", "sphinx-book-theme (>=0.3.0,<0.4.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0,<0.5.0)", "sphinxcontrib-bibtex", "sympy"] -testing = ["beautifulsoup4", "coverage (>=6.4,<8.0)", "ipykernel (>=5.5,<6.0)", "ipython (!=8.1.0,<8.5)", "ipywidgets (>=8)", "jupytext (>=1.11.2,<1.12.0)", "matplotlib (>=3.5.3,<3.6)", "nbdime", "numpy", "pandas", "pytest (>=7.1,<8.0)", "pytest-cov (>=3,<5)", "pytest-param-files (>=0.3.3,<0.4.0)", "pytest-regressions", "sympy (>=1.10.1)"] - [[package]] name = "myst-parser" -version = "0.18.1" -description = "An extended commonmark compliant parser, with bridges to docutils & sphinx." +version = "3.0.1" +description = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser," optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "myst-parser-0.18.1.tar.gz", hash = "sha256:79317f4bb2c13053dd6e64f9da1ba1da6cd9c40c8a430c447a7b146a594c246d"}, - {file = "myst_parser-0.18.1-py3-none-any.whl", hash = "sha256:61b275b85d9f58aa327f370913ae1bec26ebad372cc99f3ab85c8ec3ee8d9fb8"}, + {file = "myst_parser-3.0.1-py3-none-any.whl", hash = "sha256:6457aaa33a5d474aca678b8ead9b3dc298e89c68e67012e73146ea6fd54babf1"}, + {file = "myst_parser-3.0.1.tar.gz", hash = "sha256:88f0cb406cb363b077d176b51c476f62d60604d68a8dcdf4832e080441301a87"}, ] [package.dependencies] -docutils = ">=0.15,<0.20" +docutils = ">=0.18,<0.22" jinja2 = "*" -markdown-it-py = ">=1.0.0,<3.0.0" -mdit-py-plugins = ">=0.3.1,<0.4.0" +markdown-it-py = ">=3.0,<4.0" +mdit-py-plugins = ">=0.4,<1.0" pyyaml = "*" -sphinx = ">=4,<6" -typing-extensions = "*" +sphinx = ">=6,<8" [package.extras] -code-style = ["pre-commit (>=2.12,<3.0)"] -linkify = ["linkify-it-py (>=1.0,<2.0)"] -rtd = ["ipython", "sphinx-book-theme", "sphinx-design", "sphinxcontrib.mermaid (>=0.7.1,<0.8.0)", "sphinxext-opengraph (>=0.6.3,<0.7.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"] -testing = ["beautifulsoup4", "coverage[toml]", "pytest (>=6,<7)", "pytest-cov", "pytest-param-files (>=0.3.4,<0.4.0)", "pytest-regressions", "sphinx (<5.2)", "sphinx-pytest"] - -[[package]] -name = "nbclient" -version = "0.7.4" -description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "nbclient-0.7.4-py3-none-any.whl", hash = "sha256:c817c0768c5ff0d60e468e017613e6eae27b6fa31e43f905addd2d24df60c125"}, - {file = "nbclient-0.7.4.tar.gz", hash = "sha256:d447f0e5a4cfe79d462459aec1b3dc5c2e9152597262be8ee27f7d4c02566a0d"}, -] - -[package.dependencies] -jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -nbformat = ">=5.1" -traitlets = ">=5.3" - -[package.extras] -dev = ["pre-commit"] -docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"] -test = ["flaky", "ipykernel", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] - -[[package]] -name = "nbconvert" -version = "7.16.4" -description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." -optional = false -python-versions = ">=3.8" -files = [ - {file = "nbconvert-7.16.4-py3-none-any.whl", hash = "sha256:05873c620fe520b6322bf8a5ad562692343fe3452abda5765c7a34b7d1aa3eb3"}, - {file = "nbconvert-7.16.4.tar.gz", hash = "sha256:86ca91ba266b0a448dc96fa6c5b9d98affabde2867b363258703536807f9f7f4"}, -] - -[package.dependencies] -beautifulsoup4 = "*" -bleach = "!=5.0.0" -defusedxml = "*" -importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} -jinja2 = ">=3.0" -jupyter-core = ">=4.7" -jupyterlab-pygments = "*" -markupsafe = ">=2.0" -mistune = ">=2.0.3,<4" -nbclient = ">=0.5.0" -nbformat = ">=5.7" -packaging = "*" -pandocfilters = ">=1.4.1" -pygments = ">=2.4.1" -tinycss2 = "*" -traitlets = ">=5.1" - -[package.extras] -all = ["flaky", "ipykernel", "ipython", "ipywidgets (>=7.5)", "myst-parser", "nbsphinx (>=0.2.12)", "playwright", "pydata-sphinx-theme", "pyqtwebengine (>=5.15)", "pytest (>=7)", "sphinx (==5.0.2)", "sphinxcontrib-spelling", "tornado (>=6.1)"] -docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (==5.0.2)", "sphinxcontrib-spelling"] -qtpdf = ["pyqtwebengine (>=5.15)"] -qtpng = ["pyqtwebengine (>=5.15)"] -serve = ["tornado (>=6.1)"] -test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest (>=7)"] -webpdf = ["playwright"] - -[[package]] -name = "nbdev" -version = "1.2.0" -description = "Writing a library entirely in notebooks" -optional = false -python-versions = ">=3.6" -files = [ - {file = "nbdev-1.2.0-py3-none-any.whl", hash = "sha256:236bacb23d241e1addfa683d6c3466d3ff960f0bad2639f0142afdfe06daa4f8"}, - {file = "nbdev-1.2.0.tar.gz", hash = "sha256:474b708beef23e89665b695d304f62cd0458703e889cbe2696ae027cf299714e"}, -] - -[package.dependencies] -fastcore = ">=1.3.21" -fastrelease = "*" -ghapi = "*" -ipykernel = "*" -jupyter = "*" -jupyter-client = "<8" -nbconvert = ">=6.4.1" -nbformat = ">=4.4.0" -packaging = "*" -pip = "*" -pyyaml = "*" - -[[package]] -name = "nbdoc" -version = "0.0.82" -description = "Generate beautiful, testable documentation with Jupyter Notebooks" -optional = false -python-versions = ">=3.8" -files = [ - {file = "nbdoc-0.0.82-py3-none-any.whl", hash = "sha256:84f57e0c20b389eb748eb2055d55d5698b2f44fdef455943d396112d26103fb9"}, - {file = "nbdoc-0.0.82.tar.gz", hash = "sha256:234b785e710025357d66c90be0bf7d620a7a507786380030d749b1c4c5146600"}, -] - -[package.dependencies] -black = {version = ">=22.1.0", extras = ["jupyter"]} -fastcore = "1.4.2" -nbconvert = ">=6.4.1" -nbdev = "1.2.0" -numpydoc = "1.2" -packaging = "*" -pip = "*" - -[[package]] -name = "nbformat" -version = "5.10.4" -description = "The Jupyter Notebook format" -optional = false -python-versions = ">=3.8" -files = [ - {file = "nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b"}, - {file = "nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a"}, -] - -[package.dependencies] -fastjsonschema = ">=2.15" -jsonschema = ">=2.6" -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -traitlets = ">=5.1" - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["pep440", "pre-commit", "pytest", "testpath"] - -[[package]] -name = "nbsphinx" -version = "0.8.12" -description = "Jupyter Notebook Tools for Sphinx" -optional = false -python-versions = ">=3.6" -files = [ - {file = "nbsphinx-0.8.12-py3-none-any.whl", hash = "sha256:c15b681c7fce287000856f91fe1edac50d29f7b0c15bbc746fbe55c8eb84750b"}, - {file = "nbsphinx-0.8.12.tar.gz", hash = "sha256:76570416cdecbeb21dbf5c3d6aa204ced6c1dd7ebef4077b5c21b8c6ece9533f"}, -] - -[package.dependencies] -docutils = "*" -jinja2 = "*" -nbconvert = "!=5.4" -nbformat = "*" -sphinx = ">=1.8" -traitlets = ">=5" +code-style = ["pre-commit (>=3.0,<4.0)"] +linkify = ["linkify-it-py (>=2.0,<3.0)"] +rtd = ["ipython", "sphinx (>=7)", "sphinx-autodoc2 (>=0.5.0,<0.6.0)", "sphinx-book-theme (>=1.1,<2.0)", "sphinx-copybutton", "sphinx-design", "sphinx-pyscript", "sphinx-tippy (>=0.4.3)", "sphinx-togglebutton", "sphinxext-opengraph (>=0.9.0,<0.10.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"] +testing = ["beautifulsoup4", "coverage[toml]", "defusedxml", "pytest (>=8,<9)", "pytest-cov", "pytest-param-files (>=0.6.0,<0.7.0)", "pytest-regressions", "sphinx-pytest"] +testing-docutils = ["pygments", "pytest (>=8,<9)", "pytest-param-files (>=0.6.0,<0.7.0)"] [[package]] name = "nest-asyncio" @@ -2477,46 +1618,6 @@ files = [ {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, ] -[[package]] -name = "notebook" -version = "7.2.1" -description = "Jupyter Notebook - A web-based notebook environment for interactive computing" -optional = false -python-versions = ">=3.8" -files = [ - {file = "notebook-7.2.1-py3-none-any.whl", hash = "sha256:f45489a3995746f2195a137e0773e2130960b51c9ac3ce257dbc2705aab3a6ca"}, - {file = "notebook-7.2.1.tar.gz", hash = "sha256:4287b6da59740b32173d01d641f763d292f49c30e7a51b89c46ba8473126341e"}, -] - -[package.dependencies] -jupyter-server = ">=2.4.0,<3" -jupyterlab = ">=4.2.0,<4.3" -jupyterlab-server = ">=2.27.1,<3" -notebook-shim = ">=0.2,<0.3" -tornado = ">=6.2.0" - -[package.extras] -dev = ["hatch", "pre-commit"] -docs = ["myst-parser", "nbsphinx", "pydata-sphinx-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.27.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] - -[[package]] -name = "notebook-shim" -version = "0.2.4" -description = "A shim layer for notebook traits and config" -optional = false -python-versions = ">=3.7" -files = [ - {file = "notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef"}, - {file = "notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb"}, -] - -[package.dependencies] -jupyter-server = ">=1.8,<3" - -[package.extras] -test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync"] - [[package]] name = "numpy" version = "1.24.4" @@ -2599,33 +1700,15 @@ files = [ {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] -[[package]] -name = "numpydoc" -version = "1.2" -description = "Sphinx extension to support docstrings in Numpy format" -optional = false -python-versions = ">=3.7" -files = [ - {file = "numpydoc-1.2-py3-none-any.whl", hash = "sha256:3ecbb9feae080031714b63128912988ebdfd4c582a085d25b8d9f7ac23c2d9ef"}, - {file = "numpydoc-1.2.tar.gz", hash = "sha256:0cec233740c6b125913005d16e8a9996e060528afcb8b7cad3f2706629dfd6f7"}, -] - -[package.dependencies] -Jinja2 = ">=2.10" -sphinx = ">=1.8" - -[package.extras] -testing = ["matplotlib", "pytest", "pytest-cov"] - [[package]] name = "openai" -version = "1.40.0" +version = "1.40.1" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.40.0-py3-none-any.whl", hash = "sha256:eb6909abaacd62ef28c275a5c175af29f607b40645b0a49d2856bbed62edb2e7"}, - {file = "openai-1.40.0.tar.gz", hash = "sha256:1b7b316e27b2333b063ee62b6539b74267c7282498d9a02fc4ccb38a9c14336c"}, + {file = "openai-1.40.1-py3-none-any.whl", hash = "sha256:cf5929076c6ca31c26f1ed207e9fd19eb05404cc9104f64c9d29bb0ac0c5bcd4"}, + {file = "openai-1.40.1.tar.gz", hash = "sha256:cb1294ac1f8c6a1acbb07e090698eb5ad74a7a88484e77126612a4f22579673d"}, ] [package.dependencies] @@ -2701,17 +1784,6 @@ files = [ {file = "orjson-3.10.6.tar.gz", hash = "sha256:e54b63d0a7c6c54a5f5f726bc93a2078111ef060fec4ecbf34c5db800ca3b3a7"}, ] -[[package]] -name = "overrides" -version = "7.7.0" -description = "A decorator to automatically detect mismatch when overriding a method." -optional = false -python-versions = ">=3.6" -files = [ - {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, - {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, -] - [[package]] name = "packaging" version = "24.1" @@ -2723,17 +1795,6 @@ files = [ {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] -[[package]] -name = "pandocfilters" -version = "1.5.1" -description = "Utilities for writing pandoc filters in python" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, - {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, -] - [[package]] name = "parso" version = "0.8.4" @@ -2749,17 +1810,6 @@ files = [ qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] testing = ["docopt", "pytest"] -[[package]] -name = "pathspec" -version = "0.12.1" -description = "Utility library for gitignore style pattern matching of file paths." -optional = false -python-versions = ">=3.8" -files = [ - {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, - {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, -] - [[package]] name = "pexpect" version = "4.9.0" @@ -2785,28 +1835,6 @@ files = [ {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, ] -[[package]] -name = "pip" -version = "24.2" -description = "The PyPA recommended tool for installing Python packages." -optional = false -python-versions = ">=3.8" -files = [ - {file = "pip-24.2-py3-none-any.whl", hash = "sha256:2cd581cf58ab7fcfca4ce8efa6dcacd0de5bf8d0a3eb9ec927e07405f4d9e2a2"}, - {file = "pip-24.2.tar.gz", hash = "sha256:5b5e490b5e9cb275c879595064adce9ebd31b854e3e803740b72f9ccf34a45b8"}, -] - -[[package]] -name = "pkgutil-resolve-name" -version = "1.3.10" -description = "Resolve a name to an object." -optional = false -python-versions = ">=3.6" -files = [ - {file = "pkgutil_resolve_name-1.3.10-py3-none-any.whl", hash = "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e"}, - {file = "pkgutil_resolve_name-1.3.10.tar.gz", hash = "sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174"}, -] - [[package]] name = "platformdirs" version = "4.2.2" @@ -2823,20 +1851,6 @@ docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx- test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] type = ["mypy (>=1.8)"] -[[package]] -name = "prometheus-client" -version = "0.20.0" -description = "Python client for the Prometheus monitoring system." -optional = false -python-versions = ">=3.8" -files = [ - {file = "prometheus_client-0.20.0-py3-none-any.whl", hash = "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7"}, - {file = "prometheus_client-0.20.0.tar.gz", hash = "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89"}, -] - -[package.extras] -twisted = ["twisted"] - [[package]] name = "prompt-toolkit" version = "3.0.47" @@ -2916,65 +1930,6 @@ files = [ {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] -[[package]] -name = "pydantic" -version = "1.10.17" -description = "Data validation and settings management using python type hints" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pydantic-1.10.17-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fa51175313cc30097660b10eec8ca55ed08bfa07acbfe02f7a42f6c242e9a4b"}, - {file = "pydantic-1.10.17-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7e8988bb16988890c985bd2093df9dd731bfb9d5e0860db054c23034fab8f7a"}, - {file = "pydantic-1.10.17-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:371dcf1831f87c9e217e2b6a0c66842879a14873114ebb9d0861ab22e3b5bb1e"}, - {file = "pydantic-1.10.17-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4866a1579c0c3ca2c40575398a24d805d4db6cb353ee74df75ddeee3c657f9a7"}, - {file = "pydantic-1.10.17-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:543da3c6914795b37785703ffc74ba4d660418620cc273490d42c53949eeeca6"}, - {file = "pydantic-1.10.17-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7623b59876f49e61c2e283551cc3647616d2fbdc0b4d36d3d638aae8547ea681"}, - {file = "pydantic-1.10.17-cp310-cp310-win_amd64.whl", hash = "sha256:409b2b36d7d7d19cd8310b97a4ce6b1755ef8bd45b9a2ec5ec2b124db0a0d8f3"}, - {file = "pydantic-1.10.17-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fa43f362b46741df8f201bf3e7dff3569fa92069bcc7b4a740dea3602e27ab7a"}, - {file = "pydantic-1.10.17-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2a72d2a5ff86a3075ed81ca031eac86923d44bc5d42e719d585a8eb547bf0c9b"}, - {file = "pydantic-1.10.17-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4ad32aed3bf5eea5ca5decc3d1bbc3d0ec5d4fbcd72a03cdad849458decbc63"}, - {file = "pydantic-1.10.17-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aeb4e741782e236ee7dc1fb11ad94dc56aabaf02d21df0e79e0c21fe07c95741"}, - {file = "pydantic-1.10.17-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d2f89a719411cb234105735a520b7c077158a81e0fe1cb05a79c01fc5eb59d3c"}, - {file = "pydantic-1.10.17-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db3b48d9283d80a314f7a682f7acae8422386de659fffaba454b77a083c3937d"}, - {file = "pydantic-1.10.17-cp311-cp311-win_amd64.whl", hash = "sha256:9c803a5113cfab7bbb912f75faa4fc1e4acff43e452c82560349fff64f852e1b"}, - {file = "pydantic-1.10.17-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:820ae12a390c9cbb26bb44913c87fa2ff431a029a785642c1ff11fed0a095fcb"}, - {file = "pydantic-1.10.17-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c1e51d1af306641b7d1574d6d3307eaa10a4991542ca324f0feb134fee259815"}, - {file = "pydantic-1.10.17-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e53fb834aae96e7b0dadd6e92c66e7dd9cdf08965340ed04c16813102a47fab"}, - {file = "pydantic-1.10.17-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e2495309b1266e81d259a570dd199916ff34f7f51f1b549a0d37a6d9b17b4dc"}, - {file = "pydantic-1.10.17-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:098ad8de840c92ea586bf8efd9e2e90c6339d33ab5c1cfbb85be66e4ecf8213f"}, - {file = "pydantic-1.10.17-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:525bbef620dac93c430d5d6bdbc91bdb5521698d434adf4434a7ef6ffd5c4b7f"}, - {file = "pydantic-1.10.17-cp312-cp312-win_amd64.whl", hash = "sha256:6654028d1144df451e1da69a670083c27117d493f16cf83da81e1e50edce72ad"}, - {file = "pydantic-1.10.17-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c87cedb4680d1614f1d59d13fea353faf3afd41ba5c906a266f3f2e8c245d655"}, - {file = "pydantic-1.10.17-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11289fa895bcbc8f18704efa1d8020bb9a86314da435348f59745473eb042e6b"}, - {file = "pydantic-1.10.17-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94833612d6fd18b57c359a127cbfd932d9150c1b72fea7c86ab58c2a77edd7c7"}, - {file = "pydantic-1.10.17-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d4ecb515fa7cb0e46e163ecd9d52f9147ba57bc3633dca0e586cdb7a232db9e3"}, - {file = "pydantic-1.10.17-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7017971ffa7fd7808146880aa41b266e06c1e6e12261768a28b8b41ba55c8076"}, - {file = "pydantic-1.10.17-cp37-cp37m-win_amd64.whl", hash = "sha256:e840e6b2026920fc3f250ea8ebfdedf6ea7a25b77bf04c6576178e681942ae0f"}, - {file = "pydantic-1.10.17-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bfbb18b616abc4df70591b8c1ff1b3eabd234ddcddb86b7cac82657ab9017e33"}, - {file = "pydantic-1.10.17-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebb249096d873593e014535ab07145498957091aa6ae92759a32d40cb9998e2e"}, - {file = "pydantic-1.10.17-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8c209af63ccd7b22fba94b9024e8b7fd07feffee0001efae50dd99316b27768"}, - {file = "pydantic-1.10.17-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4b40c9e13a0b61583e5599e7950490c700297b4a375b55b2b592774332798b7"}, - {file = "pydantic-1.10.17-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c31d281c7485223caf6474fc2b7cf21456289dbaa31401844069b77160cab9c7"}, - {file = "pydantic-1.10.17-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ae5184e99a060a5c80010a2d53c99aee76a3b0ad683d493e5f0620b5d86eeb75"}, - {file = "pydantic-1.10.17-cp38-cp38-win_amd64.whl", hash = "sha256:ad1e33dc6b9787a6f0f3fd132859aa75626528b49cc1f9e429cdacb2608ad5f0"}, - {file = "pydantic-1.10.17-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e17c0ee7192e54a10943f245dc79e36d9fe282418ea05b886e1c666063a7b54"}, - {file = "pydantic-1.10.17-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cafb9c938f61d1b182dfc7d44a7021326547b7b9cf695db5b68ec7b590214773"}, - {file = "pydantic-1.10.17-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95ef534e3c22e5abbdbdd6f66b6ea9dac3ca3e34c5c632894f8625d13d084cbe"}, - {file = "pydantic-1.10.17-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62d96b8799ae3d782df7ec9615cb59fc32c32e1ed6afa1b231b0595f6516e8ab"}, - {file = "pydantic-1.10.17-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ab2f976336808fd5d539fdc26eb51f9aafc1f4b638e212ef6b6f05e753c8011d"}, - {file = "pydantic-1.10.17-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8ad363330557beac73159acfbeed220d5f1bfcd6b930302a987a375e02f74fd"}, - {file = "pydantic-1.10.17-cp39-cp39-win_amd64.whl", hash = "sha256:48db882e48575ce4b39659558b2f9f37c25b8d348e37a2b4e32971dd5a7d6227"}, - {file = "pydantic-1.10.17-py3-none-any.whl", hash = "sha256:e41b5b973e5c64f674b3b4720286ded184dcc26a691dd55f34391c62c6934688"}, - {file = "pydantic-1.10.17.tar.gz", hash = "sha256:f434160fb14b353caf634149baaf847206406471ba70e64657c1e8330277a991"}, -] - -[package.dependencies] -typing-extensions = ">=4.2.0" - -[package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] - [[package]] name = "pydantic" version = "2.8.2" @@ -2990,8 +1945,8 @@ files = [ annotated-types = ">=0.4.0" pydantic-core = "2.20.1" typing-extensions = [ - {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, {version = ">=4.6.1", markers = "python_version < \"3.13\""}, + {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, ] [package.extras] @@ -3100,26 +2055,30 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pydata-sphinx-theme" -version = "0.8.1" +version = "0.14.4" description = "Bootstrap-based Sphinx theme from the PyData community" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pydata_sphinx_theme-0.8.1-py3-none-any.whl", hash = "sha256:af2c99cb0b43d95247b1563860942ba75d7f1596360594fce510caaf8c4fcc16"}, - {file = "pydata_sphinx_theme-0.8.1.tar.gz", hash = "sha256:96165702253917ece13dd895e23b96ee6dce422dcc144d560806067852fe1fed"}, + {file = "pydata_sphinx_theme-0.14.4-py3-none-any.whl", hash = "sha256:ac15201f4c2e2e7042b0cad8b30251433c1f92be762ddcefdb4ae68811d918d9"}, + {file = "pydata_sphinx_theme-0.14.4.tar.gz", hash = "sha256:f5d7a2cb7a98e35b9b49d3b02cec373ad28958c2ed5c9b1ffe6aff6c56e9de5b"}, ] [package.dependencies] +accessible-pygments = "*" +Babel = "*" beautifulsoup4 = "*" docutils = "!=0.17.0" packaging = "*" -sphinx = ">=3.5.4,<5" +pygments = ">=2.7" +sphinx = ">=5.0" +typing-extensions = "*" [package.extras] -coverage = ["codecov", "pydata-sphinx-theme[test]", "pytest-cov"] -dev = ["nox", "pre-commit", "pydata-sphinx-theme[coverage]", "pyyaml"] -doc = ["jupyter_sphinx", "myst-parser", "numpy", "numpydoc", "pandas", "plotly", "pytest", "pytest-regressions", "sphinx-sitemap", "sphinxext-rediraffe", "xarray"] -test = ["pydata-sphinx-theme[doc]", "pytest"] +a11y = ["pytest-playwright"] +dev = ["nox", "pre-commit", "pydata-sphinx-theme[doc,test]", "pyyaml"] +doc = ["ablog (>=0.11.0rc2)", "colorama", "ipykernel", "ipyleaflet", "jupyter_sphinx", "jupyterlite-sphinx", "linkify-it-py", "matplotlib", "myst-parser", "nbsphinx", "numpy", "numpydoc", "pandas", "plotly", "rich", "sphinx-autoapi (>=3.0.0)", "sphinx-copybutton", "sphinx-design", "sphinx-favicon (>=1.0.1)", "sphinx-sitemap", "sphinx-togglebutton", "sphinxcontrib-youtube (<1.4)", "sphinxext-rediraffe", "xarray"] +test = ["pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "pygments" @@ -3149,17 +2108,6 @@ files = [ [package.dependencies] six = ">=1.5" -[[package]] -name = "python-json-logger" -version = "2.0.7" -description = "A python library adding a json log formatter" -optional = false -python-versions = ">=3.6" -files = [ - {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, - {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, -] - [[package]] name = "pytz" version = "2024.1" @@ -3194,21 +2142,6 @@ files = [ {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, ] -[[package]] -name = "pywinpty" -version = "2.0.13" -description = "Pseudo terminal support for Windows from Python." -optional = false -python-versions = ">=3.8" -files = [ - {file = "pywinpty-2.0.13-cp310-none-win_amd64.whl", hash = "sha256:697bff211fb5a6508fee2dc6ff174ce03f34a9a233df9d8b5fe9c8ce4d5eaf56"}, - {file = "pywinpty-2.0.13-cp311-none-win_amd64.whl", hash = "sha256:b96fb14698db1284db84ca38c79f15b4cfdc3172065b5137383910567591fa99"}, - {file = "pywinpty-2.0.13-cp312-none-win_amd64.whl", hash = "sha256:2fd876b82ca750bb1333236ce98488c1be96b08f4f7647cfdf4129dfad83c2d4"}, - {file = "pywinpty-2.0.13-cp38-none-win_amd64.whl", hash = "sha256:61d420c2116c0212808d31625611b51caf621fe67f8a6377e2e8b617ea1c1f7d"}, - {file = "pywinpty-2.0.13-cp39-none-win_amd64.whl", hash = "sha256:71cb613a9ee24174730ac7ae439fd179ca34ccb8c5349e8d7b72ab5dea2c6f4b"}, - {file = "pywinpty-2.0.13.tar.gz", hash = "sha256:c34e32351a3313ddd0d7da23d27f835c860d32fe4ac814d372a3ea9594f41dde"}, -] - [[package]] name = "pyyaml" version = "6.0.2" @@ -3392,63 +2325,6 @@ files = [ [package.dependencies] cffi = {version = "*", markers = "implementation_name == \"pypy\""} -[[package]] -name = "qtconsole" -version = "5.5.2" -description = "Jupyter Qt console" -optional = false -python-versions = ">=3.8" -files = [ - {file = "qtconsole-5.5.2-py3-none-any.whl", hash = "sha256:42d745f3d05d36240244a04e1e1ec2a86d5d9b6edb16dbdef582ccb629e87e0b"}, - {file = "qtconsole-5.5.2.tar.gz", hash = "sha256:6b5fb11274b297463706af84dcbbd5c92273b1f619e6d25d08874b0a88516989"}, -] - -[package.dependencies] -ipykernel = ">=4.1" -jupyter-client = ">=4.1" -jupyter-core = "*" -packaging = "*" -pygments = "*" -pyzmq = ">=17.1" -qtpy = ">=2.4.0" -traitlets = "<5.2.1 || >5.2.1,<5.2.2 || >5.2.2" - -[package.extras] -doc = ["Sphinx (>=1.3)"] -test = ["flaky", "pytest", "pytest-qt"] - -[[package]] -name = "qtpy" -version = "2.4.1" -description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6)." -optional = false -python-versions = ">=3.7" -files = [ - {file = "QtPy-2.4.1-py3-none-any.whl", hash = "sha256:1c1d8c4fa2c884ae742b069151b0abe15b3f70491f3972698c683b8e38de839b"}, - {file = "QtPy-2.4.1.tar.gz", hash = "sha256:a5a15ffd519550a1361bdc56ffc07fda56a6af7292f17c7b395d4083af632987"}, -] - -[package.dependencies] -packaging = "*" - -[package.extras] -test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"] - -[[package]] -name = "referencing" -version = "0.35.1" -description = "JSON Referencing + Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, - {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, -] - -[package.dependencies] -attrs = ">=22.2.0" -rpds-py = ">=0.7.0" - [[package]] name = "regex" version = "2024.7.24" @@ -3558,143 +2434,6 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] -[[package]] -name = "rfc3339-validator" -version = "0.1.4" -description = "A pure python RFC3339 validator" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, - {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, -] - -[package.dependencies] -six = "*" - -[[package]] -name = "rfc3986-validator" -version = "0.1.1" -description = "Pure python rfc3986 validator" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, - {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, -] - -[[package]] -name = "rpds-py" -version = "0.20.0" -description = "Python bindings to Rust's persistent data structures (rpds)" -optional = false -python-versions = ">=3.8" -files = [ - {file = "rpds_py-0.20.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3ad0fda1635f8439cde85c700f964b23ed5fc2d28016b32b9ee5fe30da5c84e2"}, - {file = "rpds_py-0.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9bb4a0d90fdb03437c109a17eade42dfbf6190408f29b2744114d11586611d6f"}, - {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6377e647bbfd0a0b159fe557f2c6c602c159fc752fa316572f012fc0bf67150"}, - {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb851b7df9dda52dc1415ebee12362047ce771fc36914586b2e9fcbd7d293b3e"}, - {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e0f80b739e5a8f54837be5d5c924483996b603d5502bfff79bf33da06164ee2"}, - {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a8c94dad2e45324fc74dce25e1645d4d14df9a4e54a30fa0ae8bad9a63928e3"}, - {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e604fe73ba048c06085beaf51147eaec7df856824bfe7b98657cf436623daf"}, - {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:df3de6b7726b52966edf29663e57306b23ef775faf0ac01a3e9f4012a24a4140"}, - {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf258ede5bc22a45c8e726b29835b9303c285ab46fc7c3a4cc770736b5304c9f"}, - {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:55fea87029cded5df854ca7e192ec7bdb7ecd1d9a3f63d5c4eb09148acf4a7ce"}, - {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ae94bd0b2f02c28e199e9bc51485d0c5601f58780636185660f86bf80c89af94"}, - {file = "rpds_py-0.20.0-cp310-none-win32.whl", hash = "sha256:28527c685f237c05445efec62426d285e47a58fb05ba0090a4340b73ecda6dee"}, - {file = "rpds_py-0.20.0-cp310-none-win_amd64.whl", hash = "sha256:238a2d5b1cad28cdc6ed15faf93a998336eb041c4e440dd7f902528b8891b399"}, - {file = "rpds_py-0.20.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489"}, - {file = "rpds_py-0.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318"}, - {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db"}, - {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:758406267907b3781beee0f0edfe4a179fbd97c0be2e9b1154d7f0a1279cf8e5"}, - {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d61339e9f84a3f0767b1995adfb171a0d00a1185192718a17af6e124728e0f5"}, - {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1259c7b3705ac0a0bd38197565a5d603218591d3f6cee6e614e380b6ba61c6f6"}, - {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209"}, - {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7e60cb630f674a31f0368ed32b2a6b4331b8350d67de53c0359992444b116dd3"}, - {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbe982f38565bb50cb7fb061ebf762c2f254ca3d8c20d4006878766e84266272"}, - {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:514b3293b64187172bc77c8fb0cdae26981618021053b30d8371c3a902d4d5ad"}, - {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d0a26ffe9d4dd35e4dfdd1e71f46401cff0181c75ac174711ccff0459135fa58"}, - {file = "rpds_py-0.20.0-cp311-none-win32.whl", hash = "sha256:89c19a494bf3ad08c1da49445cc5d13d8fefc265f48ee7e7556839acdacf69d0"}, - {file = "rpds_py-0.20.0-cp311-none-win_amd64.whl", hash = "sha256:c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c"}, - {file = "rpds_py-0.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6"}, - {file = "rpds_py-0.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b"}, - {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739"}, - {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c"}, - {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee"}, - {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96"}, - {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4"}, - {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef"}, - {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821"}, - {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940"}, - {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174"}, - {file = "rpds_py-0.20.0-cp312-none-win32.whl", hash = "sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139"}, - {file = "rpds_py-0.20.0-cp312-none-win_amd64.whl", hash = "sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585"}, - {file = "rpds_py-0.20.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29"}, - {file = "rpds_py-0.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91"}, - {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24"}, - {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7"}, - {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9"}, - {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8"}, - {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879"}, - {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f"}, - {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c"}, - {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2"}, - {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57"}, - {file = "rpds_py-0.20.0-cp313-none-win32.whl", hash = "sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a"}, - {file = "rpds_py-0.20.0-cp313-none-win_amd64.whl", hash = "sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2"}, - {file = "rpds_py-0.20.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f2fbf7db2012d4876fb0d66b5b9ba6591197b0f165db8d99371d976546472a24"}, - {file = "rpds_py-0.20.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1e5f3cd7397c8f86c8cc72d5a791071431c108edd79872cdd96e00abd8497d29"}, - {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce9845054c13696f7af7f2b353e6b4f676dab1b4b215d7fe5e05c6f8bb06f965"}, - {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c3e130fd0ec56cb76eb49ef52faead8ff09d13f4527e9b0c400307ff72b408e1"}, - {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b16aa0107ecb512b568244ef461f27697164d9a68d8b35090e9b0c1c8b27752"}, - {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa7f429242aae2947246587d2964fad750b79e8c233a2367f71b554e9447949c"}, - {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af0fc424a5842a11e28956e69395fbbeab2c97c42253169d87e90aac2886d751"}, - {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b8c00a3b1e70c1d3891f0db1b05292747f0dbcfb49c43f9244d04c70fbc40eb8"}, - {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:40ce74fc86ee4645d0a225498d091d8bc61f39b709ebef8204cb8b5a464d3c0e"}, - {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4fe84294c7019456e56d93e8ababdad5a329cd25975be749c3f5f558abb48253"}, - {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:338ca4539aad4ce70a656e5187a3a31c5204f261aef9f6ab50e50bcdffaf050a"}, - {file = "rpds_py-0.20.0-cp38-none-win32.whl", hash = "sha256:54b43a2b07db18314669092bb2de584524d1ef414588780261e31e85846c26a5"}, - {file = "rpds_py-0.20.0-cp38-none-win_amd64.whl", hash = "sha256:a1862d2d7ce1674cffa6d186d53ca95c6e17ed2b06b3f4c476173565c862d232"}, - {file = "rpds_py-0.20.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3fde368e9140312b6e8b6c09fb9f8c8c2f00999d1823403ae90cc00480221b22"}, - {file = "rpds_py-0.20.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9824fb430c9cf9af743cf7aaf6707bf14323fb51ee74425c380f4c846ea70789"}, - {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11ef6ce74616342888b69878d45e9f779b95d4bd48b382a229fe624a409b72c5"}, - {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c52d3f2f82b763a24ef52f5d24358553e8403ce05f893b5347098014f2d9eff2"}, - {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d35cef91e59ebbeaa45214861874bc6f19eb35de96db73e467a8358d701a96c"}, - {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d72278a30111e5b5525c1dd96120d9e958464316f55adb030433ea905866f4de"}, - {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda"}, - {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6632f2d04f15d1bd6fe0eedd3b86d9061b836ddca4c03d5cf5c7e9e6b7c14580"}, - {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d0b67d87bb45ed1cd020e8fbf2307d449b68abc45402fe1a4ac9e46c3c8b192b"}, - {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ec31a99ca63bf3cd7f1a5ac9fe95c5e2d060d3c768a09bc1d16e235840861420"}, - {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22e6c9976e38f4d8c4a63bd8a8edac5307dffd3ee7e6026d97f3cc3a2dc02a0b"}, - {file = "rpds_py-0.20.0-cp39-none-win32.whl", hash = "sha256:569b3ea770c2717b730b61998b6c54996adee3cef69fc28d444f3e7920313cf7"}, - {file = "rpds_py-0.20.0-cp39-none-win_amd64.whl", hash = "sha256:e6900ecdd50ce0facf703f7a00df12374b74bbc8ad9fe0f6559947fb20f82364"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:617c7357272c67696fd052811e352ac54ed1d9b49ab370261a80d3b6ce385045"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9426133526f69fcaba6e42146b4e12d6bc6c839b8b555097020e2b78ce908dcc"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deb62214c42a261cb3eb04d474f7155279c1a8a8c30ac89b7dcb1721d92c3c02"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fcaeb7b57f1a1e071ebd748984359fef83ecb026325b9d4ca847c95bc7311c92"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d454b8749b4bd70dd0a79f428731ee263fa6995f83ccb8bada706e8d1d3ff89d"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d807dc2051abe041b6649681dce568f8e10668e3c1c6543ebae58f2d7e617855"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c20f0ddeb6e29126d45f89206b8291352b8c5b44384e78a6499d68b52ae511"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b7f19250ceef892adf27f0399b9e5afad019288e9be756d6919cb58892129f51"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4f1ed4749a08379555cebf4650453f14452eaa9c43d0a95c49db50c18b7da075"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:dcedf0b42bcb4cfff4101d7771a10532415a6106062f005ab97d1d0ab5681c60"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:39ed0d010457a78f54090fafb5d108501b5aa5604cc22408fc1c0c77eac14344"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:bb273176be34a746bdac0b0d7e4e2c467323d13640b736c4c477881a3220a989"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f918a1a130a6dfe1d7fe0f105064141342e7dd1611f2e6a21cd2f5c8cb1cfb3e"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f60012a73aa396be721558caa3a6fd49b3dd0033d1675c6d59c4502e870fcf0c"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d2b1ad682a3dfda2a4e8ad8572f3100f95fad98cb99faf37ff0ddfe9cbf9d03"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:614fdafe9f5f19c63ea02817fa4861c606a59a604a77c8cdef5aa01d28b97921"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa518bcd7600c584bf42e6617ee8132869e877db2f76bcdc281ec6a4113a53ab"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0475242f447cc6cb8a9dd486d68b2ef7fbee84427124c232bff5f63b1fe11e5"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f90a4cd061914a60bd51c68bcb4357086991bd0bb93d8aa66a6da7701370708f"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:def7400461c3a3f26e49078302e1c1b38f6752342c77e3cf72ce91ca69fb1bc1"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:65794e4048ee837494aea3c21a28ad5fc080994dfba5b036cf84de37f7ad5074"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:faefcc78f53a88f3076b7f8be0a8f8d35133a3ecf7f3770895c25f8813460f08"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5b4f105deeffa28bbcdff6c49b34e74903139afa690e35d2d9e3c2c2fba18cec"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fdfc3a892927458d98f3d55428ae46b921d1f7543b89382fdb483f5640daaec8"}, - {file = "rpds_py-0.20.0.tar.gz", hash = "sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121"}, -] - [[package]] name = "ruff" version = "0.5.6" @@ -3722,38 +2461,6 @@ files = [ {file = "ruff-0.5.6.tar.gz", hash = "sha256:07c9e3c2a8e1fe377dd460371c3462671a728c981c3205a5217291422209f642"}, ] -[[package]] -name = "send2trash" -version = "1.8.3" -description = "Send file to trash natively under Mac OS X, Windows and Linux" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -files = [ - {file = "Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9"}, - {file = "Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf"}, -] - -[package.extras] -nativelib = ["pyobjc-framework-Cocoa", "pywin32"] -objc = ["pyobjc-framework-Cocoa"] -win32 = ["pywin32"] - -[[package]] -name = "setuptools" -version = "72.1.0" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "setuptools-72.1.0-py3-none-any.whl", hash = "sha256:5a03e1860cf56bb6ef48ce186b0e557fdba433237481a9a625176c2831be15d1"}, - {file = "setuptools-72.1.0.tar.gz", hash = "sha256:8d243eff56d095e5817f796ede6ae32941278f542e0f941867cc05ae52b162ec"}, -] - -[package.extras] -core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "ordered-set (>=3.1.1)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.11.*)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (<0.4)", "pytest-ruff (>=0.2.1)", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] - [[package]] name = "six" version = "1.16.0" @@ -3800,27 +2507,27 @@ files = [ [[package]] name = "sphinx" -version = "4.5.0" +version = "7.1.2" description = "Python documentation generator" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"}, - {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"}, + {file = "sphinx-7.1.2-py3-none-any.whl", hash = "sha256:d170a81825b2fcacb6dfd5a0d7f578a053e45d3f2b153fecc948c37344eb4cbe"}, + {file = "sphinx-7.1.2.tar.gz", hash = "sha256:780f4d32f1d7d1126576e0e5ecc19dc32ab76cd24e950228dcf7b1f6d3d9e22f"}, ] [package.dependencies] alabaster = ">=0.7,<0.8" -babel = ">=1.3" -colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.14,<0.18" -imagesize = "*" -importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} -Jinja2 = ">=2.3" -packaging = "*" -Pygments = ">=2.0" -requests = ">=2.5.0" -snowballstemmer = ">=1.1" +babel = ">=2.9" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.18.1,<0.21" +imagesize = ">=1.3" +importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} +Jinja2 = ">=3.0" +packaging = ">=21.0" +Pygments = ">=2.13" +requests = ">=2.25.0" +snowballstemmer = ">=2.0" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" sphinxcontrib-htmlhelp = ">=2.0.0" @@ -3830,8 +2537,8 @@ sphinxcontrib-serializinghtml = ">=1.1.5" [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["docutils-stubs", "flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "types-requests", "types-typed-ast"] -test = ["cython", "html5lib", "pytest", "pytest-cov", "typed-ast"] +lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-simplify", "isort", "mypy (>=0.990)", "ruff", "sphinx-lint", "types-requests"] +test = ["cython", "filelock", "html5lib", "pytest (>=4.6)"] [[package]] name = "sphinx-autobuild" @@ -3852,99 +2559,6 @@ sphinx = "*" [package.extras] test = ["pytest", "pytest-cov"] -[[package]] -name = "sphinx-book-theme" -version = "0.3.3" -description = "A clean book theme for scientific explanations and documentation with Sphinx" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sphinx_book_theme-0.3.3-py3-none-any.whl", hash = "sha256:9685959dbbb492af005165ef1b9229fdd5d5431580ac181578beae3b4d012d91"}, - {file = "sphinx_book_theme-0.3.3.tar.gz", hash = "sha256:0ec36208ff14c6d6bf8aee1f1f8268e0c6e2bfa3cef6e41143312b25275a6217"}, -] - -[package.dependencies] -pydata-sphinx-theme = ">=0.8.0,<0.9.0" -pyyaml = "*" -sphinx = ">=3,<5" - -[package.extras] -code-style = ["pre-commit (>=2.7.0,<2.8.0)"] -doc = ["ablog (>=0.10.13,<0.11.0)", "folium", "ipywidgets", "matplotlib", "myst-nb (>=0.13.2,<0.14.0)", "nbclient", "numpy", "numpydoc", "pandas", "plotly", "sphinx (>=4.0,<5.0)", "sphinx-copybutton", "sphinx-design", "sphinx-examples", "sphinx-tabs", "sphinx-thebe (>=0.1.1)", "sphinx-togglebutton (>=0.2.1)", "sphinxcontrib-bibtex (>=2.2,<3.0)", "sphinxcontrib-youtube", "sphinxext-opengraph"] -test = ["beautifulsoup4 (>=4.6.1,<5)", "coverage", "myst-nb (>=0.13.2,<0.14.0)", "pytest (>=6.0.1,<6.1.0)", "pytest-cov", "pytest-regressions (>=2.0.1,<2.1.0)", "sphinx_thebe"] - -[[package]] -name = "sphinx-copybutton" -version = "0.5.2" -description = "Add a copy button to each of your code cells." -optional = false -python-versions = ">=3.7" -files = [ - {file = "sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd"}, - {file = "sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e"}, -] - -[package.dependencies] -sphinx = ">=1.8" - -[package.extras] -code-style = ["pre-commit (==2.12.1)"] -rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"] - -[[package]] -name = "sphinx-panels" -version = "0.6.0" -description = "A sphinx extension for creating panels in a grid layout." -optional = false -python-versions = "*" -files = [ - {file = "sphinx-panels-0.6.0.tar.gz", hash = "sha256:d36dcd26358117e11888f7143db4ac2301ebe90873ac00627bf1fe526bf0f058"}, - {file = "sphinx_panels-0.6.0-py3-none-any.whl", hash = "sha256:bd64afaf85c07f8096d21c8247fc6fd757e339d1be97832c8832d6ae5ed2e61d"}, -] - -[package.dependencies] -docutils = "*" -sphinx = ">=2,<5" - -[package.extras] -code-style = ["pre-commit (>=2.7.0,<2.8.0)"] -live-dev = ["sphinx-autobuild", "web-compile (>=0.2.0,<0.3.0)"] -testing = ["pytest (>=6.0.1,<6.1.0)", "pytest-regressions (>=2.0.1,<2.1.0)"] -themes = ["myst-parser (>=0.12.9,<0.13.0)", "pydata-sphinx-theme (>=0.4.0,<0.5.0)", "sphinx-book-theme (>=0.0.36,<0.1.0)", "sphinx-rtd-theme"] - -[[package]] -name = "sphinx-rtd-theme" -version = "1.3.0" -description = "Read the Docs theme for Sphinx" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -files = [ - {file = "sphinx_rtd_theme-1.3.0-py2.py3-none-any.whl", hash = "sha256:46ddef89cc2416a81ecfbeaceab1881948c014b1b6e4450b815311a89fb977b0"}, - {file = "sphinx_rtd_theme-1.3.0.tar.gz", hash = "sha256:590b030c7abb9cf038ec053b95e5380b5c70d61591eb0b552063fbe7c41f0931"}, -] - -[package.dependencies] -docutils = "<0.19" -sphinx = ">=1.6,<8" -sphinxcontrib-jquery = ">=4,<5" - -[package.extras] -dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"] - -[[package]] -name = "sphinx-typlog-theme" -version = "0.8.0" -description = "A typlog Sphinx theme" -optional = false -python-versions = "*" -files = [ - {file = "sphinx_typlog_theme-0.8.0-py2.py3-none-any.whl", hash = "sha256:b0ab728ab31d071523af0229bcb6427a13493958b3fc2bb7db381520fab77de4"}, - {file = "sphinx_typlog_theme-0.8.0.tar.gz", hash = "sha256:61dbf97b1fde441bd03a5409874571e229898b67fb3080400837b8f4cee46659"}, -] - -[package.extras] -dev = ["livereload", "sphinx"] - [[package]] name = "sphinxcontrib-applehelp" version = "1.0.4" @@ -3990,20 +2604,6 @@ files = [ lint = ["docutils-stubs", "flake8", "mypy"] test = ["html5lib", "pytest"] -[[package]] -name = "sphinxcontrib-jquery" -version = "4.1" -description = "Extension to include jQuery on newer Sphinx releases" -optional = false -python-versions = ">=2.7" -files = [ - {file = "sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a"}, - {file = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae"}, -] - -[package.dependencies] -Sphinx = ">=1.8" - [[package]] name = "sphinxcontrib-jsmath" version = "1.0.1" @@ -4154,20 +2754,6 @@ pure-eval = "*" [package.extras] tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] -[[package]] -name = "tabulate" -version = "0.9.0" -description = "Pretty-print tabular data" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, - {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, -] - -[package.extras] -widechars = ["wcwidth"] - [[package]] name = "tenacity" version = "8.5.0" @@ -4183,27 +2769,6 @@ files = [ doc = ["reno", "sphinx"] test = ["pytest", "tornado (>=4.5)", "typeguard"] -[[package]] -name = "terminado" -version = "0.18.1" -description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." -optional = false -python-versions = ">=3.8" -files = [ - {file = "terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0"}, - {file = "terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e"}, -] - -[package.dependencies] -ptyprocess = {version = "*", markers = "os_name != \"nt\""} -pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} -tornado = ">=6.1.0" - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] -typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] - [[package]] name = "tiktoken" version = "0.7.0" @@ -4256,35 +2821,6 @@ requests = ">=2.26.0" [package.extras] blobfile = ["blobfile (>=2)"] -[[package]] -name = "tinycss2" -version = "1.3.0" -description = "A tiny CSS parser" -optional = false -python-versions = ">=3.8" -files = [ - {file = "tinycss2-1.3.0-py3-none-any.whl", hash = "sha256:54a8dbdffb334d536851be0226030e9505965bb2f30f21a4a82c55fb2a80fae7"}, - {file = "tinycss2-1.3.0.tar.gz", hash = "sha256:152f9acabd296a8375fbca5b84c961ff95971fcfc32e79550c8df8e29118c54d"}, -] - -[package.dependencies] -webencodings = ">=0.4" - -[package.extras] -doc = ["sphinx", "sphinx_rtd_theme"] -test = ["pytest", "ruff"] - -[[package]] -name = "tokenize-rt" -version = "6.0.0" -description = "A wrapper around the stdlib `tokenize` which roundtrips." -optional = false -python-versions = ">=3.8" -files = [ - {file = "tokenize_rt-6.0.0-py2.py3-none-any.whl", hash = "sha256:d4ff7ded2873512938b4f8cbb98c9b07118f01d30ac585a30d7a88353ca36d22"}, - {file = "tokenize_rt-6.0.0.tar.gz", hash = "sha256:b9711bdfc51210211137499b5e355d3de5ec88a85d2025c520cbb921b5194367"}, -] - [[package]] name = "toml" version = "0.10.2" @@ -4296,17 +2832,6 @@ files = [ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] - [[package]] name = "tornado" version = "6.4.1" @@ -4362,17 +2887,6 @@ files = [ docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] -[[package]] -name = "types-python-dateutil" -version = "2.9.0.20240316" -description = "Typing stubs for python-dateutil" -optional = false -python-versions = ">=3.8" -files = [ - {file = "types-python-dateutil-2.9.0.20240316.tar.gz", hash = "sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202"}, - {file = "types_python_dateutil-2.9.0.20240316-py3-none-any.whl", hash = "sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b"}, -] - [[package]] name = "typing-extensions" version = "4.12.2" @@ -4399,20 +2913,6 @@ files = [ mypy-extensions = ">=0.3.0" typing-extensions = ">=3.7.4" -[[package]] -name = "uri-template" -version = "1.3.0" -description = "RFC 6570 URI Template Processor" -optional = false -python-versions = ">=3.7" -files = [ - {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, - {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, -] - -[package.extras] -dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-modern-annotations", "flake8-noqa", "flake8-pyproject", "flake8-requirements", "flake8-typechecking-import", "flake8-use-fstring", "mypy", "pep8-naming", "types-PyYAML"] - [[package]] name = "urllib3" version = "2.2.2" @@ -4441,59 +2941,6 @@ files = [ {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] -[[package]] -name = "webcolors" -version = "24.6.0" -description = "A library for working with the color formats defined by HTML and CSS." -optional = false -python-versions = ">=3.8" -files = [ - {file = "webcolors-24.6.0-py3-none-any.whl", hash = "sha256:8cf5bc7e28defd1d48b9e83d5fc30741328305a8195c29a8e668fa45586568a1"}, - {file = "webcolors-24.6.0.tar.gz", hash = "sha256:1d160d1de46b3e81e58d0a280d0c78b467dc80f47294b91b1ad8029d2cedb55b"}, -] - -[package.extras] -docs = ["furo", "sphinx", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-notfound-page", "sphinxext-opengraph"] -tests = ["coverage[toml]"] - -[[package]] -name = "webencodings" -version = "0.5.1" -description = "Character encoding aliases for legacy web content" -optional = false -python-versions = "*" -files = [ - {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, - {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, -] - -[[package]] -name = "websocket-client" -version = "1.8.0" -description = "WebSocket client for Python with low level API options" -optional = false -python-versions = ">=3.8" -files = [ - {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, - {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, -] - -[package.extras] -docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] -optional = ["python-socks", "wsaccel"] -test = ["websockets"] - -[[package]] -name = "widgetsnbextension" -version = "4.0.11" -description = "Jupyter interactive widgets for Jupyter Notebook" -optional = false -python-versions = ">=3.7" -files = [ - {file = "widgetsnbextension-4.0.11-py3-none-any.whl", hash = "sha256:55d4d6949d100e0d08b94948a42efc3ed6dfdc0e9468b2c4b128c9a2ce3a7a36"}, - {file = "widgetsnbextension-4.0.11.tar.gz", hash = "sha256:8b22a8f1910bfd188e596fe7fc05dcbd87e810c8a4ba010bdb3da86637398474"}, -] - [[package]] name = "yarl" version = "1.9.4" @@ -4615,4 +3062,4 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [metadata] lock-version = "2.0" python-versions = ">=3.8.1,<4.0" -content-hash = "ff5ce3229f5a3b23c3416929a58b2f93af06646e2b21fbf87ffd4b4bca5a1f02" +content-hash = "554e91ae90b2306b46bdb37c4a4ff08c257eea199161cc99206de4b3603ce54c" diff --git a/pyproject.toml b/pyproject.toml index 5fa28082c18..d4d4f0bf115 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,24 +10,14 @@ repository = "https://www.github.com/langchain-ai/langchain" [tool.poetry.dependencies] python = ">=3.8.1,<4.0" -black = "^24.2.0" [tool.poetry.group.docs.dependencies] -langchain = { path = "libs/langchain/", develop = true } -autodoc_pydantic = "^1.8.0" -myst_parser = "^0.18.1" -nbsphinx = "^0.8.9" -sphinx = "^4.5.0" -sphinx-autobuild = "^2021.3.14" -sphinx_book_theme = "^0.3.3" -sphinx_rtd_theme = "^1.0.0" -sphinx-typlog-theme = "^0.8.0" -sphinx-panels = "^0.6.0" +autodoc_pydantic = "^1" +sphinx = "^7" +myst-parser = "^3" +sphinx-autobuild = "^2021" +pydata-sphinx-theme = "^0.14" toml = "^0.10.2" -myst-nb = "^0.17.1" -linkchecker = "^10.2.1" -sphinx-copybutton = "^0.5.1" -nbdoc = "^0.0.82" [tool.poetry.group.lint.dependencies] ruff = "^0.5.0" diff --git a/templates/csv-agent/csv_agent/agent.py b/templates/csv-agent/csv_agent/agent.py index faac805d90b..72b73c683b1 100644 --- a/templates/csv-agent/csv_agent/agent.py +++ b/templates/csv-agent/csv_agent/agent.py @@ -2,12 +2,12 @@ from pathlib import Path import pandas as pd from langchain.agents import AgentExecutor, OpenAIFunctionsAgent -from langchain.tools.retriever import create_retriever_tool from langchain_community.chat_models import ChatOpenAI from langchain_community.embeddings import OpenAIEmbeddings from langchain_community.vectorstores import FAISS from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.pydantic_v1 import BaseModel, Field +from langchain_core.tools.retriever import create_retriever_tool from langchain_experimental.tools import PythonAstREPLTool MAIN_DIR = Path(__file__).parents[1] diff --git a/templates/neo4j-semantic-layer/neo4j_semantic_layer/information_tool.py b/templates/neo4j-semantic-layer/neo4j_semantic_layer/information_tool.py index 03fb550572f..780bf15f22d 100644 --- a/templates/neo4j-semantic-layer/neo4j_semantic_layer/information_tool.py +++ b/templates/neo4j-semantic-layer/neo4j_semantic_layer/information_tool.py @@ -7,7 +7,7 @@ from langchain.callbacks.manager import ( # Import things that are needed generically from langchain.pydantic_v1 import BaseModel, Field -from langchain.tools import BaseTool +from langchain_core.tools import BaseTool from neo4j_semantic_layer.utils import get_candidates, graph diff --git a/templates/neo4j-semantic-layer/neo4j_semantic_layer/memory_tool.py b/templates/neo4j-semantic-layer/neo4j_semantic_layer/memory_tool.py index 784ba8f4325..b1c43ef6535 100644 --- a/templates/neo4j-semantic-layer/neo4j_semantic_layer/memory_tool.py +++ b/templates/neo4j-semantic-layer/neo4j_semantic_layer/memory_tool.py @@ -7,7 +7,7 @@ from langchain.callbacks.manager import ( # Import things that are needed generically from langchain.pydantic_v1 import BaseModel, Field -from langchain.tools import BaseTool +from langchain_core.tools import BaseTool from neo4j_semantic_layer.utils import get_candidates, get_user_id, graph diff --git a/templates/neo4j-semantic-layer/neo4j_semantic_layer/recommendation_tool.py b/templates/neo4j-semantic-layer/neo4j_semantic_layer/recommendation_tool.py index db816aee3e9..6849b376ecd 100644 --- a/templates/neo4j-semantic-layer/neo4j_semantic_layer/recommendation_tool.py +++ b/templates/neo4j-semantic-layer/neo4j_semantic_layer/recommendation_tool.py @@ -5,7 +5,7 @@ from langchain.callbacks.manager import ( CallbackManagerForToolRun, ) from langchain.pydantic_v1 import BaseModel, Field -from langchain.tools import BaseTool +from langchain_core.tools import BaseTool from neo4j_semantic_layer.utils import get_candidates, get_user_id, graph diff --git a/templates/neo4j-semantic-ollama/neo4j_semantic_ollama/information_tool.py b/templates/neo4j-semantic-ollama/neo4j_semantic_ollama/information_tool.py index 9ed31d2723e..e4f61b33ae6 100644 --- a/templates/neo4j-semantic-ollama/neo4j_semantic_ollama/information_tool.py +++ b/templates/neo4j-semantic-ollama/neo4j_semantic_ollama/information_tool.py @@ -7,7 +7,7 @@ from langchain.callbacks.manager import ( # Import things that are needed generically from langchain.pydantic_v1 import BaseModel, Field -from langchain.tools import BaseTool +from langchain_core.tools import BaseTool from neo4j_semantic_ollama.utils import get_candidates, graph diff --git a/templates/neo4j-semantic-ollama/neo4j_semantic_ollama/memory_tool.py b/templates/neo4j-semantic-ollama/neo4j_semantic_ollama/memory_tool.py index f455f70c4b7..3e5ff478ac3 100644 --- a/templates/neo4j-semantic-ollama/neo4j_semantic_ollama/memory_tool.py +++ b/templates/neo4j-semantic-ollama/neo4j_semantic_ollama/memory_tool.py @@ -7,7 +7,7 @@ from langchain.callbacks.manager import ( # Import things that are needed generically from langchain.pydantic_v1 import BaseModel, Field -from langchain.tools import BaseTool +from langchain_core.tools import BaseTool from neo4j_semantic_ollama.utils import get_candidates, get_user_id, graph diff --git a/templates/neo4j-semantic-ollama/neo4j_semantic_ollama/recommendation_tool.py b/templates/neo4j-semantic-ollama/neo4j_semantic_ollama/recommendation_tool.py index dc85c7c7398..211216705ab 100644 --- a/templates/neo4j-semantic-ollama/neo4j_semantic_ollama/recommendation_tool.py +++ b/templates/neo4j-semantic-ollama/neo4j_semantic_ollama/recommendation_tool.py @@ -5,7 +5,7 @@ from langchain.callbacks.manager import ( CallbackManagerForToolRun, ) from langchain.pydantic_v1 import BaseModel, Field -from langchain.tools import BaseTool +from langchain_core.tools import BaseTool from neo4j_semantic_ollama.utils import get_candidates, get_user_id, graph diff --git a/templates/neo4j-semantic-ollama/neo4j_semantic_ollama/smalltalk_tool.py b/templates/neo4j-semantic-ollama/neo4j_semantic_ollama/smalltalk_tool.py index 0b2469f2d10..7efefa74dbb 100644 --- a/templates/neo4j-semantic-ollama/neo4j_semantic_ollama/smalltalk_tool.py +++ b/templates/neo4j-semantic-ollama/neo4j_semantic_ollama/smalltalk_tool.py @@ -5,7 +5,7 @@ from langchain.callbacks.manager import ( CallbackManagerForToolRun, ) from langchain.pydantic_v1 import BaseModel, Field -from langchain.tools import BaseTool +from langchain_core.tools import BaseTool response = ( "Create a final answer that says if they " diff --git a/templates/openai-functions-agent-gmail/openai_functions_agent/agent.py b/templates/openai-functions-agent-gmail/openai_functions_agent/agent.py index 029de2cc4b9..3614a838222 100644 --- a/templates/openai-functions-agent-gmail/openai_functions_agent/agent.py +++ b/templates/openai-functions-agent-gmail/openai_functions_agent/agent.py @@ -18,7 +18,7 @@ from langchain_community.utilities.tavily_search import TavilySearchAPIWrapper from langchain_core.messages import AIMessage, HumanMessage from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.pydantic_v1 import BaseModel, Field -from langchain_core.tools import tool +from langchain_core.tools.convert import tool @tool diff --git a/templates/openai-functions-tool-retrieval-agent/openai_functions_tool_retrieval_agent/agent.py b/templates/openai-functions-tool-retrieval-agent/openai_functions_tool_retrieval_agent/agent.py index 9bf2457765a..3d1bbfb8e0e 100644 --- a/templates/openai-functions-tool-retrieval-agent/openai_functions_tool_retrieval_agent/agent.py +++ b/templates/openai-functions-tool-retrieval-agent/openai_functions_tool_retrieval_agent/agent.py @@ -2,7 +2,6 @@ from typing import Dict, List, Tuple from langchain.agents import ( AgentExecutor, - Tool, ) from langchain.agents.format_scratchpad import format_to_openai_functions from langchain.agents.output_parsers import OpenAIFunctionsAgentOutputParser @@ -20,7 +19,7 @@ from langchain_core.prompts import ( ) from langchain_core.pydantic_v1 import BaseModel, Field from langchain_core.runnables import Runnable, RunnableLambda, RunnableParallel -from langchain_core.tools import BaseTool +from langchain_core.tools import BaseTool, Tool # Create the tools search = TavilySearchAPIWrapper() diff --git a/templates/python-lint/python_lint/agent_executor.py b/templates/python-lint/python_lint/agent_executor.py index 4cddb33f33b..fb9f143e169 100644 --- a/templates/python-lint/python_lint/agent_executor.py +++ b/templates/python-lint/python_lint/agent_executor.py @@ -4,12 +4,12 @@ import subprocess # nosec import tempfile from langchain.agents import AgentType, initialize_agent -from langchain.agents.tools import Tool from langchain.pydantic_v1 import BaseModel, Field, ValidationError, validator from langchain_community.chat_models import ChatOpenAI from langchain_core.language_models import BaseLLM from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables import ConfigurableField, Runnable +from langchain_core.tools import Tool def strip_python_markdown_tags(text: str) -> str: diff --git a/templates/retrieval-agent-fireworks/retrieval_agent_fireworks/chain.py b/templates/retrieval-agent-fireworks/retrieval_agent_fireworks/chain.py index 6fef1ba1a97..8398515f668 100644 --- a/templates/retrieval-agent-fireworks/retrieval_agent_fireworks/chain.py +++ b/templates/retrieval-agent-fireworks/retrieval_agent_fireworks/chain.py @@ -5,13 +5,13 @@ from langchain.agents import AgentExecutor from langchain.agents.format_scratchpad import format_log_to_str from langchain.agents.output_parsers import ReActJsonSingleInputOutputParser from langchain.callbacks.manager import CallbackManagerForRetrieverRun -from langchain.tools.render import render_text_description -from langchain.tools.retriever import create_retriever_tool from langchain_community.chat_models.fireworks import ChatFireworks from langchain_community.utilities.arxiv import ArxivAPIWrapper from langchain_core.documents import Document from langchain_core.pydantic_v1 import BaseModel from langchain_core.retrievers import BaseRetriever +from langchain_core.tools.render import render_text_description +from langchain_core.tools.retriever import create_retriever_tool MODEL_ID = "accounts/fireworks/models/mixtral-8x7b-instruct" diff --git a/templates/retrieval-agent/retrieval_agent/chain.py b/templates/retrieval-agent/retrieval_agent/chain.py index f74e37d71b6..e360f4ba2ad 100644 --- a/templates/retrieval-agent/retrieval_agent/chain.py +++ b/templates/retrieval-agent/retrieval_agent/chain.py @@ -5,7 +5,6 @@ from langchain.agents import AgentExecutor from langchain.agents.format_scratchpad import format_to_openai_function_messages from langchain.agents.output_parsers import OpenAIFunctionsAgentOutputParser from langchain.callbacks.manager import CallbackManagerForRetrieverRun -from langchain.tools.retriever import create_retriever_tool from langchain_community.tools.convert_to_openai import format_tool_to_openai_function from langchain_community.utilities.arxiv import ArxivAPIWrapper from langchain_core.documents import Document @@ -13,6 +12,7 @@ from langchain_core.messages import AIMessage, HumanMessage from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.pydantic_v1 import BaseModel, Field from langchain_core.retrievers import BaseRetriever +from langchain_core.tools.retriever import create_retriever_tool from langchain_openai import AzureChatOpenAI diff --git a/templates/shopping-assistant/shopping_assistant/agent.py b/templates/shopping-assistant/shopping_assistant/agent.py index b14d1e2b7a3..a243e0704aa 100644 --- a/templates/shopping-assistant/shopping_assistant/agent.py +++ b/templates/shopping-assistant/shopping_assistant/agent.py @@ -9,9 +9,10 @@ from langchain_core.prompts import ( MessagesPlaceholder, ) from langchain_core.pydantic_v1 import BaseModel, Field +from langchain_core.tools import tool from langchain_openai import ChatOpenAI -tools = [IonicTool().tool()] +tools = [tool(IonicTool())] llm = ChatOpenAI(temperature=0.5, model_name="gpt-3.5-turbo-1106", streaming=True) diff --git a/templates/solo-performance-prompting-agent/solo_performance_prompting_agent/agent.py b/templates/solo-performance-prompting-agent/solo_performance_prompting_agent/agent.py index 671d589df1e..3e9c272f08c 100644 --- a/templates/solo-performance-prompting-agent/solo_performance_prompting_agent/agent.py +++ b/templates/solo-performance-prompting-agent/solo_performance_prompting_agent/agent.py @@ -1,9 +1,9 @@ from langchain.agents import AgentExecutor from langchain.agents.format_scratchpad import format_xml from langchain.tools import DuckDuckGoSearchRun -from langchain.tools.render import render_text_description from langchain_community.llms import OpenAI from langchain_core.pydantic_v1 import BaseModel +from langchain_core.tools.render import render_text_description from solo_performance_prompting_agent.parser import parse_output from solo_performance_prompting_agent.prompts import conversational_prompt diff --git a/templates/xml-agent/xml_agent/agent.py b/templates/xml-agent/xml_agent/agent.py index 921de0bc9ef..39627569bfa 100644 --- a/templates/xml-agent/xml_agent/agent.py +++ b/templates/xml-agent/xml_agent/agent.py @@ -3,10 +3,10 @@ from typing import List, Tuple from langchain.agents import AgentExecutor from langchain.agents.format_scratchpad import format_xml from langchain.tools import DuckDuckGoSearchRun -from langchain.tools.render import render_text_description from langchain_anthropic import ChatAnthropic from langchain_core.messages import AIMessage, HumanMessage from langchain_core.pydantic_v1 import BaseModel, Field +from langchain_core.tools.render import render_text_description from xml_agent.prompts import conversational_prompt, parse_output