diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 000000000..6a62f410c --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,60 @@ +name: Docs + +on: + pull_request: + paths: + - "docs/**" + - "mkdocs.yml" + - "AGENTS.md" + - "redisvl/**/*.py" + - "pyproject.toml" + - "uv.lock" + - ".readthedocs.yaml" + - ".github/workflows/docs.yml" + push: + branches: + - main + +env: + UV_VERSION: "0.7.13" + +jobs: + build: + name: mkdocs build --strict + runs-on: ubuntu-latest + steps: + - name: Check out repository + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Install Python + uses: actions/setup-python@v6 + with: + python-version: "3.11" + + - name: Install uv + uses: astral-sh/setup-uv@v6 + with: + version: ${{ env.UV_VERSION }} + enable-cache: true + python-version: "3.11" + cache-dependency-glob: | + pyproject.toml + uv.lock + + - name: Install docs dependencies + run: uv sync --frozen --group docs + + - name: Build docs (strict) + env: + DISABLE_MKDOCS_2_WARNING: "true" + run: uv run mkdocs build --strict + + - name: Upload built site + if: always() + uses: actions/upload-artifact@v4 + with: + name: site + path: site/ + retention-days: 7 diff --git a/.gitignore b/.gitignore index 16c99a570..7424c0fe2 100644 --- a/.gitignore +++ b/.gitignore @@ -105,8 +105,8 @@ instance/ # Scrapy stuff: .scrapy -# Sphinx documentation -docs/_build/ +# mkdocs build cache +.cache/ # PyBuilder .pybuilder/ diff --git a/.readthedocs.yaml b/.readthedocs.yaml index e526ec65f..f94a418f2 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -26,10 +26,6 @@ build: UV_PROJECT_ENVIRONMENT="${READTHEDOCS_VIRTUALENV_PATH}" \ ~/.local/bin/uv sync --frozen --group docs -# Build documentation in the "docs/" directory with Sphinx -sphinx: - configuration: docs/conf.py - -formats: - - pdf - - epub +# Build documentation with mkdocs +mkdocs: + configuration: mkdocs.yml diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 000000000..e34f1ebbf --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,131 @@ +# AGENTS.md + +Quick reference for AI agents using `redisvl`. For agents working *on* the +codebase itself, see [docs/for-ais-only/](docs/for-ais-only/index.md). + +## What redisvl is + +A Python library for using Redis as a vector database. It wraps Redis Search +(`FT.CREATE`, `FT.SEARCH`, `FT.AGGREGATE`, vector index types) behind: + +- **`SearchIndex` / `AsyncSearchIndex`**: schema-driven index management. +- **Query classes**: `VectorQuery`, `VectorRangeQuery`, `FilterQuery`, + `HybridQuery`, `MultiVectorQuery`, `TextQuery`, `CountQuery`, `SQLQuery`. +- **Filter expressions**: `Tag`, `Text`, `Num`, `Geo`, `GeoRadius`. +- **Extensions**: `SemanticCache`, `LangCacheSemanticCache`, `EmbeddingsCache`, + `MessageHistory` / `SemanticMessageHistory`, `SemanticRouter`. +- **Vectorizers**: OpenAI, Azure OpenAI, Cohere, HuggingFace + (sentence-transformers), Mistral, Vertex AI, Bedrock, VoyageAI, custom. +- **Rerankers**: Cohere, HuggingFace cross-encoder, VoyageAI. +- **CLI**: `rvl index`, `rvl stats`, `rvl mcp`, `rvl version`. +- **MCP server**: serves an existing Redis index over stdio / HTTP / SSE. + +## Install + +```bash +pip install redisvl +# common provider extras +pip install redisvl[openai,cohere,sentence-transformers] +# everything (heavy) +pip install redisvl[all] +``` + +Requires Python 3.10+ and a Redis 8.x instance with the search module +(`docker run -d -p 6379:6379 redis:8.4`). + +## Minimum viable use + +```python +from redisvl.schema import IndexSchema +from redisvl.index import SearchIndex +from redisvl.query import VectorQuery + +schema = IndexSchema.from_dict({ + "index": {"name": "docs", "prefix": "doc:", "storage_type": "hash"}, + "fields": [ + {"name": "title", "type": "text"}, + {"name": "category", "type": "tag"}, + {"name": "embedding", "type": "vector", + "attrs": {"dims": 1536, "algorithm": "hnsw", + "distance_metric": "cosine", "datatype": "float32"}}, + ], +}) + +index = SearchIndex(schema, redis_url="redis://localhost:6379") +index.create(overwrite=True) + +index.load([ + {"title": "intro", "category": "guide", "embedding": vector_bytes}, +]) + +results = index.query(VectorQuery( + vector=query_embedding, + vector_field_name="embedding", + return_fields=["title", "category"], + num_results=10, +)) +``` + +## Public import paths (stable) + +Use the **subpackage**, not the module: + +```python +from redisvl.index import SearchIndex, AsyncSearchIndex +from redisvl.schema import IndexSchema +from redisvl.query import ( + VectorQuery, VectorRangeQuery, FilterQuery, CountQuery, TextQuery, + HybridQuery, MultiVectorQuery, AggregateHybridQuery, SQLQuery, Vector, +) +from redisvl.query.filter import Tag, Text, Num, Geo, GeoRadius +from redisvl.extensions.cache.llm import SemanticCache, LangCacheSemanticCache +from redisvl.extensions.message_history import ( + MessageHistory, SemanticMessageHistory, +) +from redisvl.extensions.router import SemanticRouter, Route, RoutingConfig +from redisvl.utils.vectorize import ( + HFTextVectorizer, OpenAITextVectorizer, AzureOpenAITextVectorizer, + CohereTextVectorizer, MistralAITextVectorizer, VoyageAIVectorizer, + VertexAIVectorizer, BedrockVectorizer, CustomVectorizer, +) +from redisvl.utils.rerank import ( + CohereReranker, HFCrossEncoderReranker, VoyageAIReranker, +) +``` + +## What docs to read + +- Concepts → [docs/concepts/](docs/concepts/index.md): how indexes, schemas, + queries, and extensions fit together. +- User Guide → [docs/user_guide/](docs/user_guide/index.md): notebooks for + every common task. +- API Reference → [docs/api/](docs/api/index.md): the generated reference. +- Examples → [docs/examples/](docs/examples/index.md): links to + redis-ai-resources for end-to-end recipes. +- For AI Agents (codebase contributors) → + [docs/for-ais-only/](docs/for-ais-only/index.md). + +## Machine-readable indexes + +When the docs are built, they emit: + +- [`llms.txt`](https://docs.redisvl.com/llms.txt) — flat index of every doc. +- [`llms-full.txt`](https://docs.redisvl.com/llms-full.txt) — concatenated + full content for one-shot loading. + +## Things to know before suggesting code + +- **Always combine schema + algorithm changes.** Bundling datatype and + algorithm changes into a single index patch produces one drop/rebuild cycle + instead of two. +- **`MessageHistory` / `SemanticMessageHistory`** replace the deprecated + `SessionManager` / `SemanticSessionManager`. The old names still import but + emit a `DeprecationWarning` and will be removed. +- **SVS-VAMANA** requires Redis ≥ 8.2.0 with Redis Search ≥ 2.8.10 and only + supports `float16` / `float32` datatypes. +- **`SQLQuery`** requires the `redisvl[sql-redis]` extra and translates SQL + `SELECT` into `FT.SEARCH` / `FT.AGGREGATE` via the + [sql-redis](https://github.com/redis-developer/sql-redis) project. +- **`HybridQuery` vs `AggregateHybridQuery`** weight scores differently: + `HybridQuery.linear_alpha` weights *text*, `AggregateHybridQuery.alpha` + weights *vector*. Recheck `alpha` when switching. diff --git a/Makefile b/Makefile index e4d63d8e3..585295562 100644 --- a/Makefile +++ b/Makefile @@ -73,12 +73,11 @@ check: lint test ## Run all checks (lint + test) docs-build: ## Build documentation @echo "📚 Building documentation" - uv run make -C docs html + uv run mkdocs build --strict docs-serve: ## Serve documentation locally - @echo "🌐 Serving documentation at http://localhost:8000" - @echo "📁 Make sure docs are built first with 'make docs-build'" - uv run python -m http.server --directory docs/_build/html + @echo "🌐 Serving documentation at http://127.0.0.1:8000" + uv run mkdocs serve --dev-addr 127.0.0.1:8000 build: ## Build wheel and source distribution @echo "🏗️ Building distribution packages" diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index 1eb4e097f..000000000 --- a/docs/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line, and also -# from the environment for the first two. -SPHINXOPTS ?= -SPHINXBUILD ?= sphinx-build -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - - # build docs - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/_extension/gallery_directive.py b/docs/_extension/gallery_directive.py deleted file mode 100644 index 4f14ed2e6..000000000 --- a/docs/_extension/gallery_directive.py +++ /dev/null @@ -1,161 +0,0 @@ -"""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 - -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}} {grid_columns} -{container_options} - -{content} - -````` -""" - -GRID_CARD = """ -````{{grid-item-card}} {title} -{card_options} - -{content} -```` -""" - - -class GalleryDirective(SphinxDirective): - """A directive to show a gallery of images and links in a grid.""" - - name = "gallery-grid" - has_content = True - required_arguments = 0 - optional_arguments = 1 - final_argument_whitespace = True - option_spec = { - # 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]: - 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.warn(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) - - # Read in YAML so we can generate the gallery - grid_data = safe_load(yaml_string) - - grid_items = [] - for item in grid_data: - # Grid card parameters - options = {} - if "website" in item: - options["link"] = item["website"] - - if "class-card" in self.options: - options["class-card"] = self.options["class-card"] - - if "img-background" in item: - options["img-background"] = item["img-background"] - - if "img-top" in item: - options["img-top"] = item["img-top"] - - if "img-bottom" in item: - options["img-bottom"] = item["img-bottom"] - - options_str = "\n".join(f":{k}: {v}" for k, v in options.items()) + "\n\n" - - # Grid card content - content_str = "" - if "header" in item: - content_str += f"{item['header']}\n\n^^^\n\n" - - if "image" in item: - content_str += f"![Gallery image]({item['image']})\n\n" - - if "content" in item: - content_str += f"{item['content']}\n\n" - - if "footer" in item: - content_str += f"+++\n\n{item['footer']}\n\n" - - title = item.get("title", "") - content_str += "\n" - grid_items.append( - GRID_CARD.format( - card_options=options_str, content=content_str, title=title - ) - ) - - # Parse the template with Sphinx Design to create an output - container = nodes.container() - # Prep the options for the template grid - container_options = {"gutter": 2, "class-container": "gallery-directive"} - if "class-container" in self.options: - container_options[ - "class-container" - ] += f' {self.options["class-container"]}' - container_options_str = "\n".join( - f":{k}: {v}" for k, v in container_options.items() - ) - - # Create the directive string for the grid - grid_directive = TEMPLATE_GRID.format( - grid_columns=self.options.get("grid-columns", "1 2 3 4"), - container_options=container_options_str, - content="\n".join(grid_items), - ) - # Parse content as a directive so Sphinx Design processes it - self.state.nested_parse([grid_directive], 0, container) - # Sphinx Design outputs a container too, so just use that - container = container.children[0] - - # Add extra classes - if self.options.get("container-class", []): - container.attributes["classes"] += self.options.get("class", []) - return [container] - - -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", GalleryDirective) - - return { - "parallel_read_safe": True, - "parallel_write_safe": True, - } diff --git a/docs/_static/.nojekyll b/docs/_static/.nojekyll deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/_static/Redis_Favicon_144x144_Red.png b/docs/_static/Redis_Favicon_144x144_Red.png deleted file mode 100644 index 32b0e9263..000000000 Binary files a/docs/_static/Redis_Favicon_144x144_Red.png and /dev/null differ diff --git a/docs/_static/Redis_Favicon_16x16_Red.png b/docs/_static/Redis_Favicon_16x16_Red.png deleted file mode 100644 index c6bd004b7..000000000 Binary files a/docs/_static/Redis_Favicon_16x16_Red.png and /dev/null differ diff --git a/docs/_static/Redis_Logo_Red_RGB.svg b/docs/_static/Redis_Logo_Red_RGB.svg deleted file mode 100644 index 1471c56b3..000000000 --- a/docs/_static/Redis_Logo_Red_RGB.svg +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - -]> - - - - - - - - - - - diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css deleted file mode 100644 index 2cfaab18f..000000000 --- a/docs/_static/css/custom.css +++ /dev/null @@ -1,190 +0,0 @@ -.logo__image { - transform: scale(.7); -} - -/* Show the primary sidebar on the landing page (override hide-on-wide) */ -.bd-sidebar-primary.hide-on-wide { - display: flex !important; -} - -/* Sidebar navigation hover styles - gray background only (light mode) */ -html[data-theme="light"] .bd-sidebar-primary .toctree-l1 > a:hover, -html[data-theme="light"] .bd-sidebar-primary .toctree-l2 > a:hover, -html[data-theme="light"] .bd-sidebar-primary .toctree-l3 > a:hover, -html[data-theme="light"] .bd-sidebar-primary nav.bd-links a:hover { - background-color: rgba(0, 0, 0, 0.04) !important; - border-radius: 8px !important; - color: inherit !important; - text-decoration: none !important; -} - -/* Sidebar navigation hover styles (dark mode) */ -html[data-theme="dark"] .bd-sidebar-primary .toctree-l1 > a:hover, -html[data-theme="dark"] .bd-sidebar-primary .toctree-l2 > a:hover, -html[data-theme="dark"] .bd-sidebar-primary .toctree-l3 > a:hover, -html[data-theme="dark"] .bd-sidebar-primary nav.bd-links a:hover { - background-color: rgba(255, 255, 255, 0.08) !important; - border-radius: 8px !important; - color: inherit !important; - text-decoration: none !important; -} - -/* Active/current page styling (light mode) */ -html[data-theme="light"] .bd-sidebar-primary .toctree-l1.current.active > a, -html[data-theme="light"] .bd-sidebar-primary .toctree-l2.current > a, -html[data-theme="light"] .bd-sidebar-primary li.current.active > a.reference.internal { - background-color: rgba(0, 0, 0, 0.06) !important; - border-radius: 8px !important; - border-left: none !important; - color: inherit !important; -} - -/* Active/current page styling (dark mode) */ -html[data-theme="dark"] .bd-sidebar-primary .toctree-l1.current.active > a, -html[data-theme="dark"] .bd-sidebar-primary .toctree-l2.current > a, -html[data-theme="dark"] .bd-sidebar-primary li.current.active > a.reference.internal { - background-color: rgba(255, 255, 255, 0.1) !important; - border-radius: 8px !important; - border-left: none !important; - color: inherit !important; -} - -/* Override default link colors in sidebar */ -.bd-sidebar-primary nav.bd-links a, -.bd-sidebar-primary nav.bd-links a:visited, -.bd-sidebar-primary nav.bd-links a:active, -.bd-sidebar-primary nav.bd-links a:focus { - color: var(--pst-color-text-base) !important; - text-decoration: none !important; - border-left: none !important; -} - -.bd-sidebar-primary nav.bd-links a:hover { - color: var(--pst-color-text-base) !important; - text-decoration: none !important; -} - -/* Remove blue left border (box-shadow) from expanded/active sections */ -nav.bd-links .current > a, -nav.bd-links .current > a:focus-visible { - box-shadow: none !important; - border-left: none !important; - color: inherit !important; - font-weight: inherit !important; -} - -/* Light mode color overrides */ -:root, -html:not([data-theme]), -html[data-theme="light"] { - --pst-color-table-row-zebra-high-bg: #fff !important; - --pst-color-table-row-zebra-low-bg: #f5f5f5 !important; - --pst-color-table-heading-bg: #f0f0f0 !important; - --pst-color-table-row-hover-bg: #e8e8e8 !important; - --pst-color-secondary: #666 !important; - --pst-color-secondary-bg: #f0f0f0 !important; - --pst-color-surface: #fcfcfc !important; - --pst-color-text-muted: #6e6e80 !important; - --pst-color-inline-code: #9a4a4a !important; - --pst-color-blockquote-notch: #6e6e80 !important; -} - -/* Dark mode color overrides */ -html[data-theme="dark"] { - --pst-color-table-row-zebra-high-bg: #1e1e1e !important; - --pst-color-table-row-zebra-low-bg: #2a2a2a !important; - --pst-color-table-heading-bg: #333 !important; - --pst-color-table-row-hover-bg: #3a3a3a !important; - --pst-color-secondary: #aaa !important; - --pst-color-secondary-bg: #333 !important; - --pst-color-surface: #1e1e1e !important; - --pst-color-text-muted: #9ca4af !important; - --pst-color-inline-code: #e8a0a0 !important; - --pst-color-blockquote-notch: #9ca4af !important; -} - -/* Class/function names in API docs */ -html[data-theme="light"] .sig-name { - color: #005B82 !important; -} - -html[data-theme="dark"] .sig-name { - color: #6db3d0 !important; -} - -/* Syntax highlighting - literals/numbers use blue-brown for color blindness accessibility */ -/* Prevents green/brown confusion for protanopia/deuteranopia */ -html[data-theme="light"] .highlight .l, -html[data-theme="light"] .highlight .m, -html[data-theme="light"] .highlight .mb, -html[data-theme="light"] .highlight .mf, -html[data-theme="light"] .highlight .mh, -html[data-theme="light"] .highlight .mi, -html[data-theme="light"] .highlight .mo, -html[data-theme="light"] .highlight .il, -html[data-theme="light"] .highlight .ld, -html[data-theme="light"] .highlight .kt { - color: #6B5B3D !important; -} - -/* Code block border radius */ -div.literal-block-wrapper, -div.highlight, -div[class*=highlight-] { - border-radius: 8px !important; -} - -div.literal-block-wrapper div[class*=highlight-] pre, -pre { - border-radius: 8px !important; -} - -/* Direct table styling override (light mode) */ -html[data-theme="light"] .table tbody tr:nth-child(odd) { - background-color: #f5f5f5 !important; -} - -html[data-theme="light"] .table tbody tr:nth-child(2n) { - background-color: #fff !important; -} - -html[data-theme="light"] .table thead tr { - background-color: #f0f0f0 !important; - border-bottom: 2px solid #ccc !important; -} - -html[data-theme="light"] .table tbody tr:hover { - background-color: #e8e8e8 !important; -} - -/* Direct table styling override (dark mode) */ -html[data-theme="dark"] .table tbody tr:nth-child(odd) { - background-color: #2a2a2a !important; -} - -html[data-theme="dark"] .table tbody tr:nth-child(2n) { - background-color: #1e1e1e !important; -} - -html[data-theme="dark"] .table thead tr { - background-color: #333 !important; - border-bottom: 2px solid #555 !important; -} - -html[data-theme="dark"] .table tbody tr:hover { - background-color: #3a3a3a !important; -} - -/* Right sidebar TOC active item - Redis red */ -.toc-entry a.nav-link.active { - box-shadow: inset 1px 0 0 #DC382D !important; - color: #DC382D !important; - font-weight: normal !important; -} - -/* Right sidebar TOC hover - no underline, subtle color change */ -.toc-entry a.nav-link:hover, -.toc-entry a.nav-link.active:hover { - text-decoration: none !important; - color: #DC382D !important; -} \ No newline at end of file diff --git a/docs/_static/gallery.yaml b/docs/_static/gallery.yaml deleted file mode 100644 index c05e5f974..000000000 --- a/docs/_static/gallery.yaml +++ /dev/null @@ -1,37 +0,0 @@ -# RAG & Search Demos -- title: Redis RAG Workbench - website: https://github.com/redis-developer/redis-rag-workbench -- title: Arxiv Paper Search - website: https://github.com/redis-developer/redis-arxiv-search -- title: ArxivChatGuru - website: https://github.com/redis-developer/ArxivChatGuru -- title: eCommerce Search - website: https://github.com/redis-developer/redis-product-search -- title: Redis Movies Searcher (Java) - website: https://github.com/redis-developer/redis-movies-searcher - -# Agent Demos -- title: Agentic RAG - website: https://github.com/redis-developer/agentic-rag -- title: Shopping AI Agent - website: https://github.com/redis-developer/shopping-ai-agent-langgraph-js-demo -- title: Restaurant Discovery AI Agent - website: https://github.com/redis-developer/restaurant-discovery-ai-agent-demo -- title: Podcast Chatbot with Agent Memory - website: https://github.com/redis-developer/podcast-chatbot-with-agent-memory-azure-demo -- title: Car Dealership Assistant - website: https://github.com/redis-developer/dealership-chatbot-agent-memory-demo -- title: Multi-Agent Text Adventure Game - website: https://github.com/redis-developer/multi-agent-ai-text-adventure-game-with-agent-memory-langgraph-js-azure -- title: Memory-Aware Alexa Assistant - website: https://github.com/redis-developer/my-jarvis-alexa-skill - -# Specialized Demos -- title: Virtual Banking Assistant - website: https://github.com/redis-developer/banking-agent-semantic-routing-demo -- title: LLM Recommender for Hotels - website: https://github.com/redis-developer/LLM-Recommender -- title: Real-Time Embeddings with Bytewax - website: https://github.com/awmatheson/real-time-embeddings -- title: Redis VSS Streamlit Demo - website: https://github.com/antonum/Redis-VSS-Streamlit diff --git a/docs/_static/site.webmanifest b/docs/_static/site.webmanifest deleted file mode 100644 index d41b4c048..000000000 --- a/docs/_static/site.webmanifest +++ /dev/null @@ -1 +0,0 @@ -{"name":"","short_name":"","icons":[{"src":"Redis_Favicon_144x144_Red.png","sizes":"144x144","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html deleted file mode 100644 index fd969f3d9..000000000 --- a/docs/_templates/layout.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends "!layout.html" %} - -{% block footer %} -{{ super() }} - - - -{% endblock %} \ No newline at end of file diff --git a/docs/api/cache.md b/docs/api/cache.md new file mode 100644 index 000000000..62ecb04f3 --- /dev/null +++ b/docs/api/cache.md @@ -0,0 +1,27 @@ +--- +description: Semantic cache, embeddings cache, and LangCache integrations for RedisVL. +--- + +# Cache + +## SemanticCache + +::: redisvl.extensions.cache.llm.SemanticCache + options: + show_root_heading: true + inherited_members: true + +## LangCacheSemanticCache + +::: redisvl.extensions.cache.llm.LangCacheSemanticCache + options: + show_root_heading: true + inherited_members: true + +## Cache Schema Classes + +### CacheEntry + +::: redisvl.extensions.cache.llm.schema.CacheEntry + options: + show_root_heading: true diff --git a/docs/api/cache.rst b/docs/api/cache.rst deleted file mode 100644 index 02f31a3b9..000000000 --- a/docs/api/cache.rst +++ /dev/null @@ -1,71 +0,0 @@ -********* -LLM Cache -********* - -SemanticCache -============= - -.. _semantic_cache_api: - -.. currentmodule:: redisvl.extensions.cache.llm - -.. autoclass:: SemanticCache - :show-inheritance: - :members: - :inherited-members: - - -LangCacheSemanticCache -====================== - -.. _langcache_semantic_cache_api: - -.. currentmodule:: redisvl.extensions.cache.llm - -.. autoclass:: LangCacheSemanticCache - :show-inheritance: - :members: - :inherited-members: - - -Cache Schema Classes -==================== - -CacheEntry ----------- - -.. _cache_entry_api: - -.. currentmodule:: redisvl.extensions.cache.llm.schema - -.. autoclass:: CacheEntry - :members: - :show-inheritance: - -CacheHit --------- - -.. _cache_hit_api: - -.. currentmodule:: redisvl.extensions.cache.llm.schema - -.. autoclass:: CacheHit - :members: - :show-inheritance: - - -**************** -Embeddings Cache -**************** - -EmbeddingsCache -=============== - -.. _embeddings_cache_api: - -.. currentmodule:: redisvl.extensions.cache.embeddings - -.. autoclass:: EmbeddingsCache - :show-inheritance: - :members: - :inherited-members: diff --git a/docs/api/filter.md b/docs/api/filter.md new file mode 100644 index 000000000..9681105db --- /dev/null +++ b/docs/api/filter.md @@ -0,0 +1,55 @@ +--- +description: Filter expressions for RedisVL queries. +--- + +# Filter + +Filter expressions are composable predicates over indexed fields. Combine them +with `&` and `|` to build complex `WHERE`-style conditions for any RedisVL +query. + +## FilterExpression + +::: redisvl.query.filter.FilterExpression + options: + show_root_heading: true + +## Tag + +::: redisvl.query.filter.Tag + options: + show_root_heading: true + filters: + - "!^__hash__$" + +## Text + +::: redisvl.query.filter.Text + options: + show_root_heading: true + filters: + - "!^__hash__$" + +## Num + +::: redisvl.query.filter.Num + options: + show_root_heading: true + filters: + - "!^__hash__$" + +## Geo + +::: redisvl.query.filter.Geo + options: + show_root_heading: true + filters: + - "!^__hash__$" + +## GeoRadius + +::: redisvl.query.filter.GeoRadius + options: + show_root_heading: true + filters: + - "!^__hash__$" diff --git a/docs/api/filter.rst b/docs/api/filter.rst deleted file mode 100644 index bcd11ab3f..000000000 --- a/docs/api/filter.rst +++ /dev/null @@ -1,70 +0,0 @@ -****** -Filter -****** - -.. _filter_api: - -FilterExpression -================ - -.. currentmodule:: redisvl.query.filter - -.. autoclass:: FilterExpression - -Tag -=== - -.. currentmodule:: redisvl.query.filter - -.. autoclass:: Tag - :members: - :special-members: - :exclude-members: __hash__ - - -Text -==== - - -.. currentmodule:: redisvl.query.filter - - -.. autoclass:: Text - :members: - :special-members: - :exclude-members: __hash__ - - -Num -=== - - -.. currentmodule:: redisvl.query.filter - - -.. autoclass:: Num - :members: - :special-members: - :exclude-members: __hash__ - - -Geo -=== - -.. currentmodule:: redisvl.query.filter - -.. autoclass:: Geo - :members: - :special-members: - :exclude-members: __hash__ - - -GeoRadius -========= - -.. currentmodule:: redisvl.query.filter - -.. autoclass:: GeoRadius - :members: - :special-members: - :exclude-members: __hash__ diff --git a/docs/api/index.md b/docs/api/index.md index 1da7df593..66add2f05 100644 --- a/docs/api/index.md +++ b/docs/api/index.md @@ -1,28 +1,71 @@ --- -myst: - html_meta: - "description lang=en": | - API documentation for RedisVL +description: RedisVL API reference. Generated from docstrings. --- -# RedisVL API +# API Reference -Reference documentation for the RedisVL API. +Reference documentation for the public RedisVL API. Each class and function is generated from the docstrings in the source. -```{toctree} -:caption: RedisVL API -:maxdepth: 2 +
-schema -searchindex -vector -query -filter -vectorizer -reranker -cache -message_history -router -cli -``` +- :material-file-tree:{ .lg .middle } **[Schema](schema.md)** + --- + + Define the structure of an index: fields, types, attributes, and storage. + +- :material-database-search:{ .lg .middle } **[Search Index](searchindex.md)** + + --- + + Create, manage, load, and search indexes. Sync and async variants. + +- :material-vector-square:{ .lg .middle } **[Vector](vector.md)** + + --- + + `Vector` containers for multi-vector queries. + +- :material-magnify:{ .lg .middle } **[Query](query.md)** + + --- + + Vector, range, hybrid, text, filter, count, multi-vector, and SQL query builders. + +- :material-filter:{ .lg .middle } **[Filter](filter.md)** + + --- + + Tag, text, numeric, geo, and geo-radius filter expressions. + +- :material-tools:{ .lg .middle } **[Vectorizer](vectorizer.md)** + + --- + + Embedding providers: OpenAI, Cohere, HuggingFace, Vertex, Bedrock, Mistral, VoyageAI. + +- :material-sort:{ .lg .middle } **[Reranker](reranker.md)** + + --- + + Cross-encoder rerankers from Cohere, HuggingFace, and VoyageAI. + +- :material-cached:{ .lg .middle } **[Cache](cache.md)** + + --- + + Semantic cache, embeddings cache, and LangCache integrations. + +- :material-message-text:{ .lg .middle } **[Message History](message_history.md)** + + --- + + Persistent chat history with recency or semantic retrieval. + +- :material-source-branch:{ .lg .middle } **[Router](router.md)** + + --- + + Semantic routing for intent detection and query classification. + +
diff --git a/docs/api/message_history.md b/docs/api/message_history.md new file mode 100644 index 000000000..240a4a9c6 --- /dev/null +++ b/docs/api/message_history.md @@ -0,0 +1,19 @@ +--- +description: LLM message history primitives for RedisVL. +--- + +# LLM Message History + +## SemanticMessageHistory + +::: redisvl.extensions.message_history.semantic_history.SemanticMessageHistory + options: + show_root_heading: true + inherited_members: true + +## MessageHistory + +::: redisvl.extensions.message_history.message_history.MessageHistory + options: + show_root_heading: true + inherited_members: true diff --git a/docs/api/message_history.rst b/docs/api/message_history.rst deleted file mode 100644 index 1f5be14fe..000000000 --- a/docs/api/message_history.rst +++ /dev/null @@ -1,28 +0,0 @@ -******************* -LLM Message History -******************* - -SemanticMessageHistory -====================== - -.. _semantic_message_history_api: - -.. currentmodule:: redisvl.extensions.message_history.semantic_history - -.. autoclass:: SemanticMessageHistory - :show-inheritance: - :members: - :inherited-members: - - -MessageHistory -============== - -.. _message_history_api: - -.. currentmodule:: redisvl.extensions.message_history.message_history - -.. autoclass:: MessageHistory - :show-inheritance: - :members: - :inherited-members: diff --git a/docs/api/query.md b/docs/api/query.md new file mode 100644 index 000000000..92041cf12 --- /dev/null +++ b/docs/api/query.md @@ -0,0 +1,173 @@ +--- +description: Query builders for RedisVL: vector, range, hybrid, text, filter, count, multi-vector, and SQL. +--- + +# Query + +Query classes provide a structured way to define simple or complex queries for +different use cases. Each class wraps the underlying redis-py +[Query module](https://github.com/redis/redis-py/blob/master/redis/commands/search/query.py) +with extended functionality for ease of use. + +## VectorQuery + +::: redisvl.query.VectorQuery + options: + show_root_heading: true + inherited_members: true + filters: + - "!^_" + - "!^add_filter$" + - "!^get_args$" + - "!^highlight$" + - "!^return_field$" + - "!^summarize$" + +!!! note "Runtime parameters for performance tuning" + + `VectorQuery` supports runtime parameters for HNSW and SVS-VAMANA indexes + that can be adjusted at query time without rebuilding the index. + + **HNSW:** `ef_runtime` controls search accuracy (higher = better recall, + slower search). + + **SVS-VAMANA:** `search_window_size`, `use_search_history`, and + `search_buffer_capacity`. + + ```python + from redisvl.query import VectorQuery + + query = VectorQuery( + vector=[0.1, 0.2, 0.3], + vector_field_name="embedding", + num_results=10, + ef_runtime=150, # higher = better recall + ) + ``` + +## VectorRangeQuery + +::: redisvl.query.VectorRangeQuery + options: + show_root_heading: true + inherited_members: true + filters: + - "!^_" + - "!^add_filter$" + - "!^get_args$" + - "!^highlight$" + - "!^return_field$" + - "!^summarize$" + +!!! note "Runtime parameters for range queries" + + `VectorRangeQuery` supports `epsilon` (HNSW & SVS-VAMANA) plus the + SVS-VAMANA-specific `search_window_size`, `use_search_history`, and + `search_buffer_capacity`. + +## AggregateHybridQuery + +::: redisvl.query.AggregateHybridQuery + options: + show_root_heading: true + inherited_members: true + filters: + - "!^_" + - "!^add_filter$" + - "!^get_args$" + - "!^highlight$" + - "!^return_field$" + - "!^summarize$" + +!!! note + + `AggregateHybridQuery` uses `FT.AGGREGATE` and does **not** support runtime + parameters. For `ef_runtime` / `search_window_size` etc. use + [`HybridQuery`](#hybridquery), [`VectorQuery`](#vectorquery), or + [`VectorRangeQuery`](#vectorrangequery). + +!!! note + + `HybridQuery` and `AggregateHybridQuery` apply linear combination + inconsistently. `HybridQuery` uses `linear_alpha` to weight the text + score, while `AggregateHybridQuery` uses `alpha` to weight the vector + score. Take care when switching between them. + +## HybridQuery + +::: redisvl.query.hybrid.HybridQuery + options: + show_root_heading: true + inherited_members: true + +## TextQuery + +::: redisvl.query.TextQuery + options: + show_root_heading: true + inherited_members: true + filters: + - "!^_" + - "!^add_filter$" + - "!^get_args$" + - "!^highlight$" + - "!^return_field$" + - "!^summarize$" + +## FilterQuery + +::: redisvl.query.FilterQuery + options: + show_root_heading: true + inherited_members: true + filters: + - "!^_" + - "!^add_filter$" + - "!^get_args$" + - "!^highlight$" + - "!^return_field$" + - "!^summarize$" + +## CountQuery + +::: redisvl.query.CountQuery + options: + show_root_heading: true + inherited_members: true + filters: + - "!^_" + - "!^add_filter$" + - "!^get_args$" + - "!^highlight$" + - "!^return_field$" + - "!^summarize$" + +## MultiVectorQuery + +::: redisvl.query.MultiVectorQuery + options: + show_root_heading: true + inherited_members: true + filters: + - "!^_" + - "!^add_filter$" + - "!^get_args$" + - "!^highlight$" + - "!^return_field$" + - "!^summarize$" + +## SQLQuery + +::: redisvl.query.SQLQuery + options: + show_root_heading: true + +!!! note + + `SQLQuery` requires the optional `sql-redis` package. Install with + `pip install redisvl[sql-redis]`. + + It accepts a `sql_redis_options` dictionary that is passed through to the + `sql-redis` executor. The most common option is `schema_cache_strategy`: + `"lazy"` (default) loads schemas on demand, `"load_all"` loads them all up + front. diff --git a/docs/api/query.rst b/docs/api/query.rst deleted file mode 100644 index 4602f4f75..000000000 --- a/docs/api/query.rst +++ /dev/null @@ -1,263 +0,0 @@ - -***** -Query -***** - -Query classes in RedisVL provide a structured way to define simple or complex -queries for different use cases. Each query class wraps the ``redis-py`` Query module -https://github.com/redis/redis-py/blob/master/redis/commands/search/query.py with extended functionality for ease-of-use. - - -VectorQuery -=========== - -.. currentmodule:: redisvl.query - - -.. autoclass:: VectorQuery - :members: - :inherited-members: - :show-inheritance: - :exclude-members: add_filter,get_args,highlight,return_field,summarize - -.. note:: - **Runtime Parameters for Performance Tuning** - - VectorQuery supports runtime parameters for HNSW and SVS-VAMANA indexes that can be adjusted at query time without rebuilding the index: - - **HNSW Parameters:** - - - ``ef_runtime``: Controls search accuracy (higher = better recall, slower search) - - **SVS-VAMANA Parameters:** - - - ``search_window_size``: Size of search window for KNN searches - - ``use_search_history``: Whether to use search buffer (OFF/ON/AUTO) - - ``search_buffer_capacity``: Tuning parameter for 2-level compression - - Example with HNSW runtime parameters: - - .. code-block:: python - - from redisvl.query import VectorQuery - - query = VectorQuery( - vector=[0.1, 0.2, 0.3], - vector_field_name="embedding", - num_results=10, - ef_runtime=150 # Higher for better recall - ) - - Example with SVS-VAMANA runtime parameters: - - .. code-block:: python - - query = VectorQuery( - vector=[0.1, 0.2, 0.3], - vector_field_name="embedding", - num_results=10, - search_window_size=20, - use_search_history='ON', - search_buffer_capacity=30 - ) - - -VectorRangeQuery -================ - - -.. currentmodule:: redisvl.query - - -.. autoclass:: VectorRangeQuery - :members: - :inherited-members: - :show-inheritance: - :exclude-members: add_filter,get_args,highlight,return_field,summarize - -.. note:: - **Runtime Parameters for Range Queries** - - VectorRangeQuery supports runtime parameters for controlling range search behavior: - - **HNSW & SVS-VAMANA Parameters:** - - - ``epsilon``: Range search approximation factor (default: 0.01) - - **SVS-VAMANA Parameters:** - - - ``search_window_size``: Size of search window - - ``use_search_history``: Whether to use search buffer (OFF/ON/AUTO) - - ``search_buffer_capacity``: Tuning parameter for 2-level compression - - Example: - - .. code-block:: python - - from redisvl.query import VectorRangeQuery - - query = VectorRangeQuery( - vector=[0.1, 0.2, 0.3], - vector_field_name="embedding", - distance_threshold=0.3, - epsilon=0.05, # Approximation factor - search_window_size=20, # SVS-VAMANA only - use_search_history='AUTO' # SVS-VAMANA only - ) - -AggregateHybridQuery -==================== - - -.. currentmodule:: redisvl.query - - -.. autoclass:: AggregateHybridQuery - :members: - :inherited-members: - :show-inheritance: - :exclude-members: add_filter,get_args,highlight,return_field,summarize - -.. note:: - The ``stopwords`` parameter in :class:`AggregateHybridQuery` (and :class:`HybridQuery`) controls query-time stopword filtering (client-side). - For index-level stopwords configuration (server-side), see :class:`redisvl.schema.IndexInfo.stopwords`. - Using query-time stopwords with index-level ``STOPWORDS 0`` is counterproductive. - -.. note:: - :class:`HybridQuery` and :class:`AggregateHybridQuery` apply linear combination inconsistently. :class:`HybridQuery` uses ``linear_alpha`` to weight the text score, while :class:`AggregateHybridQuery` uses ``alpha`` to weight the vector score. When switching between the two classes, take care to revise your ``alpha`` setting. - -.. note:: - **Runtime Parameters for Hybrid Queries** - - **Important:** AggregateHybridQuery uses FT.AGGREGATE commands which do NOT support runtime parameters. - Runtime parameters (``ef_runtime``, ``search_window_size``, ``use_search_history``, ``search_buffer_capacity``) - are only supported with FT.SEARCH commands. - - For runtime parameter support, use :class:`HybridQuery`, :class:`VectorQuery`, or :class:`VectorRangeQuery` instead of AggregateHybridQuery. - - Example with HybridQuery (supports runtime parameters): - - .. code-block:: python - - from redisvl.query import HybridQuery - - query = HybridQuery( - text="query string", - text_field_name="description", - vector=[0.1, 0.2, 0.3], - vector_field_name="embedding", - vector_search_method="KNN", - knn_ef_runtime=150, # Runtime parameters work with HybridQuery - return_fields=["description"], - num_results=10, - ) - -HybridQuery -================ - - -.. currentmodule:: redisvl.query.hybrid - - -.. autoclass:: HybridQuery - :members: - :inherited-members: - :show-inheritance: - -.. note:: - The ``stopwords`` parameter in :class:`HybridQuery` (and :class:`AggregateHybridQuery`) controls query-time stopword filtering (client-side). - For index-level stopwords configuration (server-side), see :class:`redisvl.schema.IndexInfo.stopwords`. - Using query-time stopwords with index-level ``STOPWORDS 0`` is counterproductive. - -.. note:: - :class:`HybridQuery` and :class:`AggregateHybridQuery` apply linear combination inconsistently. :class:`HybridQuery` uses ``linear_alpha`` to weight the text score, while :class:`AggregateHybridQuery` uses ``alpha`` to weight the vector score. When switching between the two classes, take care to revise your ``alpha`` setting. - -TextQuery -================ - - -.. currentmodule:: redisvl.query - - -.. autoclass:: TextQuery - :members: - :inherited-members: - :show-inheritance: - :exclude-members: add_filter,get_args,highlight,return_field,summarize - -.. note:: - The ``stopwords`` parameter in :class:`TextQuery` controls query-time stopword filtering (client-side). - For index-level stopwords configuration (server-side), see :class:`redisvl.schema.IndexInfo.stopwords`. - Using query-time stopwords with index-level ``STOPWORDS 0`` is counterproductive. - - -FilterQuery -=========== - - -.. currentmodule:: redisvl.query - - -.. autoclass:: FilterQuery - :members: - :inherited-members: - :show-inheritance: - :exclude-members: add_filter,get_args,highlight,return_field,summarize - - - -CountQuery -========== - -.. currentmodule:: redisvl.query - - -.. autoclass:: CountQuery - :members: - :inherited-members: - :show-inheritance: - :exclude-members: add_filter,get_args,highlight,return_field,summarize - - - -MultiVectorQuery -================ - -.. currentmodule:: redisvl.query - - -.. autoclass:: MultiVectorQuery - :members: - :inherited-members: - :show-inheritance: - :exclude-members: add_filter,get_args,highlight,return_field,summarize - - -SQLQuery -======== - -.. currentmodule:: redisvl.query - - -.. autoclass:: SQLQuery - :members: - :show-inheritance: - -.. note:: - SQLQuery requires the optional ``sql-redis`` package. Install with: - ``pip install redisvl[sql-redis]`` - -.. note:: - SQLQuery translates SQL SELECT statements into Redis FT.SEARCH or FT.AGGREGATE commands. - The SQL syntax supports WHERE clauses, field selection, ordering, and parameterized queries - for vector similarity searches. - -.. note:: - SQLQuery accepts a ``sql_redis_options`` dictionary that is passed through to - ``sql-redis`` executor creation. The most common option is - ``schema_cache_strategy``: - - - ``"lazy"`` (default) loads schemas on demand, which keeps one-off or - narrow queries cheaper. - - ``"load_all"`` eagerly loads all schemas up front, which can help when - running many SQL queries across many indexes. diff --git a/docs/api/reranker.md b/docs/api/reranker.md new file mode 100644 index 000000000..237250685 --- /dev/null +++ b/docs/api/reranker.md @@ -0,0 +1,27 @@ +--- +description: Reranker providers for RedisVL: Cohere, HuggingFace cross-encoder, VoyageAI. +--- + +# Rerankers + +Rerankers reorder a candidate list using a higher-quality model after the +initial vector or hybrid search. RedisVL provides adapters for several +reranking services and local cross-encoders. + +## CohereReranker + +::: redisvl.utils.rerank.cohere.CohereReranker + options: + show_root_heading: true + +## HFCrossEncoderReranker + +::: redisvl.utils.rerank.hf_cross_encoder.HFCrossEncoderReranker + options: + show_root_heading: true + +## VoyageAIReranker + +::: redisvl.utils.rerank.voyageai.VoyageAIReranker + options: + show_root_heading: true diff --git a/docs/api/reranker.rst b/docs/api/reranker.rst deleted file mode 100644 index 3515b0ae4..000000000 --- a/docs/api/reranker.rst +++ /dev/null @@ -1,38 +0,0 @@ -*********** -Rerankers -*********** - -CohereReranker -============== - -.. _coherereranker_api: - -.. currentmodule:: redisvl.utils.rerank.cohere - -.. autoclass:: CohereReranker - :show-inheritance: - :members: - - -HFCrossEncoderReranker -====================== - -.. _hfcrossencoderreranker_api: - -.. currentmodule:: redisvl.utils.rerank.hf_cross_encoder - -.. autoclass:: HFCrossEncoderReranker - :show-inheritance: - :members: - - -VoyageAIReranker -================ - -.. _voyageaireranker_api: - -.. currentmodule:: redisvl.utils.rerank.voyageai - -.. autoclass:: VoyageAIReranker - :show-inheritance: - :members: diff --git a/docs/api/router.md b/docs/api/router.md new file mode 100644 index 000000000..7245b71f4 --- /dev/null +++ b/docs/api/router.md @@ -0,0 +1,35 @@ +--- +description: Semantic router for RedisVL. +--- + +# Semantic Router + +## SemanticRouter + +::: redisvl.extensions.router.SemanticRouter + options: + show_root_heading: true + +## RoutingConfig + +::: redisvl.extensions.router.RoutingConfig + options: + show_root_heading: true + +## Route + +::: redisvl.extensions.router.Route + options: + show_root_heading: true + +## RouteMatch + +::: redisvl.extensions.router.schema.RouteMatch + options: + show_root_heading: true + +## DistanceAggregationMethod + +::: redisvl.extensions.router.schema.DistanceAggregationMethod + options: + show_root_heading: true diff --git a/docs/api/router.rst b/docs/api/router.rst deleted file mode 100644 index 191d3e0fb..000000000 --- a/docs/api/router.rst +++ /dev/null @@ -1,51 +0,0 @@ - -*************** -Semantic Router -*************** - -.. _semantic_router_api: - - -Semantic Router -=============== - -.. currentmodule:: redisvl.extensions.router - -.. autoclass:: SemanticRouter - :members: - - -Routing Config -============== - -.. currentmodule:: redisvl.extensions.router - -.. autoclass:: RoutingConfig - :members: - - -Route -===== - -.. currentmodule:: redisvl.extensions.router - -.. autoclass:: Route - :members: - - -Route Match -=========== - -.. currentmodule:: redisvl.extensions.router.schema - -.. autoclass:: RouteMatch - :members: - - -Distance Aggregation Method -=========================== - -.. currentmodule:: redisvl.extensions.router.schema - -.. autoclass:: DistanceAggregationMethod - :members: diff --git a/docs/api/schema.md b/docs/api/schema.md new file mode 100644 index 000000000..74f53cff4 --- /dev/null +++ b/docs/api/schema.md @@ -0,0 +1,188 @@ +--- +description: IndexSchema and field type API reference for RedisVL. +--- + +# Schema + +Schemas describe an index: which fields exist, their types, attributes, and the +storage backing them. Build them in YAML, in Python dictionaries, or directly +from objects. + +A schema is composed of three top-level pieces: + +| Component | Description | +|-----------|-------------| +| `version` | Schema spec version. Current supported version is `0.1.0`. | +| `index` | Index settings: name, key prefix, key separator, storage type. | +| `fields` | Subset of fields to index, with type-specific attributes. | + +## IndexSchema + +::: redisvl.schema.IndexSchema + options: + members_order: source + filters: + - "!^_" + - "!^generate_fields$" + - "!^validate_and_create_fields$" + - "!^redis_fields$" + +## Index-Level Stopwords Configuration + +The `IndexInfo` class supports index-level stopwords configuration through the +`stopwords` field. This controls which words are filtered during indexing +(server-side), as opposed to query-time filtering (client-side). + +**Configuration Options:** + +- `None` (default): Use Redis default stopwords (~300 common words) +- `[]` (empty list): Disable stopwords completely (`STOPWORDS 0`) +- Custom list: Specify your own stopwords (e.g. `["the", "a", "an"]`) + +```python +from redisvl.schema import IndexSchema + +# Disable stopwords to search for phrases like "Bank of Glasberliner" +schema = IndexSchema.from_dict({ + "index": { + "name": "company-idx", + "prefix": "company", + "stopwords": [], # STOPWORDS 0 + }, + "fields": [ + {"name": "name", "type": "text"}, + ], +}) +``` + +For detailed information about stopwords configuration and best practices, see +the [Advanced Queries](../user_guide/11_advanced_queries.ipynb) guide. + +## Field Types + +### Text Fields + +::: redisvl.schema.fields.TextField + options: + show_root_heading: true + +::: redisvl.schema.fields.TextFieldAttributes + options: + show_root_heading: true + members_order: source + +### Tag Fields + +::: redisvl.schema.fields.TagField + options: + show_root_heading: true + +::: redisvl.schema.fields.TagFieldAttributes + options: + show_root_heading: true + members_order: source + +### Numeric Fields + +::: redisvl.schema.fields.NumericField + options: + show_root_heading: true + +::: redisvl.schema.fields.NumericFieldAttributes + options: + show_root_heading: true + members_order: source + +### Geo Fields + +::: redisvl.schema.fields.GeoField + options: + show_root_heading: true + +::: redisvl.schema.fields.GeoFieldAttributes + options: + show_root_heading: true + members_order: source + +## Vector Field Types + +All vector fields share a base set of attributes (`dims`, `algorithm`, +`datatype`, `distance_metric`, `initial_cap`, `index_missing`) and add +algorithm-specific configuration on top. + +### Common Vector Attributes + +::: redisvl.schema.fields.BaseVectorFieldAttributes + options: + show_root_heading: true + members_order: source + +### HNSW + +Graph-based approximate search with excellent recall. Best for general-purpose +vector search (10K–1M+ vectors). + +::: redisvl.schema.fields.HNSWVectorField + options: + show_root_heading: true + +::: redisvl.schema.fields.HNSWVectorFieldAttributes + options: + show_root_heading: true + members_order: source + +### SVS-VAMANA + +Fast approximate nearest neighbor search with optional compression. Best for +large datasets (>100K vectors) on Intel hardware with memory constraints. +Requires Redis >= 8.2.0 with Redis Search >= 2.8.10. + +::: redisvl.schema.fields.SVSVectorField + options: + show_root_heading: true + +::: redisvl.schema.fields.SVSVectorFieldAttributes + options: + show_root_heading: true + members_order: source + +### FLAT + +Brute-force exact search. Best for small datasets (<10K vectors) requiring +100% accuracy. + +::: redisvl.schema.fields.FlatVectorField + options: + show_root_heading: true + +::: redisvl.schema.fields.FlatVectorFieldAttributes + options: + show_root_heading: true + +## SVS-VAMANA Configuration Utilities + +For SVS-VAMANA indices, RedisVL provides utilities to help configure +compression settings and estimate memory savings. + +### CompressionAdvisor + +::: redisvl.utils.compression.CompressionAdvisor + options: + show_root_heading: true + +### SVSConfig + +::: redisvl.utils.compression.SVSConfig + options: + show_root_heading: true + +## Vector Algorithm Comparison + +| Algorithm | Best for | Performance | Memory | Trade-offs | +|-----------|----------|-------------|--------|------------| +| **FLAT** | <100K vectors | 100% recall, O(n) | Minimal | Exact, slow at scale | +| **HNSW** | 100K–1M+ vectors | 95–99% recall, O(log n) | Moderate | Fast approximate | +| **SVS-VAMANA** | Memory-constrained, large | 90–95% recall, O(log n) | Low (with compression) | Intel-optimized, requires Redis >= 8.2 | + +For complete Redis field documentation, see the official +[FT.CREATE reference](https://redis.io/commands/ft.create/). diff --git a/docs/api/schema.rst b/docs/api/schema.rst deleted file mode 100644 index aab08fc31..000000000 --- a/docs/api/schema.rst +++ /dev/null @@ -1,522 +0,0 @@ -*********** -Schema -*********** - -Schema in RedisVL provides a structured format to define index settings and -field configurations using the following three components: - -.. list-table:: - :widths: 20 80 - :header-rows: 1 - - * - Component - - Description - * - `version` - - The version of the schema spec. Current supported version is `0.1.0`. - * - `index` - - Index specific settings like name, key prefix, key separator, and storage type. - * - `fields` - - Subset of fields within your data to include in the index and any custom settings. - - -IndexSchema -=========== - -.. _indexschema_api: - -.. currentmodule:: redisvl.schema - -.. autoclass:: IndexSchema - :members: - :exclude-members: generate_fields,validate_and_create_fields,redis_fields - - -Index-Level Stopwords Configuration -==================================== - -The :class:`IndexInfo` class supports index-level stopwords configuration through -the ``stopwords`` field. This controls which words are filtered during indexing -(server-side), as opposed to query-time filtering (client-side). - -**Configuration Options:** - -- ``None`` (default): Use Redis default stopwords (~300 common words) -- ``[]`` (empty list): Disable stopwords completely (``STOPWORDS 0``) -- Custom list: Specify your own stopwords (e.g., ``["the", "a", "an"]``) - -**Example:** - -.. code-block:: python - - from redisvl.schema import IndexSchema - - # Disable stopwords to search for phrases like "Bank of Glasberliner" - schema = IndexSchema.from_dict({ - "index": { - "name": "company-idx", - "prefix": "company", - "stopwords": [] # STOPWORDS 0 - }, - "fields": [ - {"name": "name", "type": "text"} - ] - }) - -**Important Notes:** - -- Index-level stopwords affect what gets indexed (server-side) -- Query-time stopwords (in :class:`TextQuery` and :class:`AggregateHybridQuery`) affect what gets searched (client-side) -- Using query-time stopwords with index-level ``STOPWORDS 0`` is counterproductive - -For detailed information about stopwords configuration and best practices, see the -Advanced Queries user guide (``docs/user_guide/11_advanced_queries.ipynb``). - - -Defining Fields -=============== - -Fields in the schema can be defined in YAML format or as a Python dictionary, specifying a name, type, an optional path, and attributes for customization. - -**YAML Example**: - -.. code-block:: yaml - - - name: title - type: text - path: $.document.title - attrs: - weight: 1.0 - no_stem: false - withsuffixtrie: true - -**Python Dictionary Example**: - -.. code-block:: python - - { - "name": "location", - "type": "geo", - "attrs": { - "sortable": true - } - } - -Basic Field Types -================= - -RedisVL supports several basic field types for indexing different kinds of data. Each field type has specific attributes that customize its indexing and search behavior. - -Text Fields ------------ - -Text fields support full-text search with stemming, phonetic matching, and other text analysis features. - -.. currentmodule:: redisvl.schema.fields - -.. autoclass:: TextField - :members: - :show-inheritance: - -.. autoclass:: TextFieldAttributes - :members: - :undoc-members: - -Tag Fields ----------- - -Tag fields are optimized for exact-match filtering and faceted search on categorical data. - -.. autoclass:: TagField - :members: - :show-inheritance: - -.. autoclass:: TagFieldAttributes - :members: - :undoc-members: - -Numeric Fields --------------- - -Numeric fields support range queries and sorting on numeric data. - -.. autoclass:: NumericField - :members: - :show-inheritance: - -.. autoclass:: NumericFieldAttributes - :members: - :undoc-members: - -Geo Fields ----------- - -Geo fields enable location-based search with geographic coordinates. - -.. autoclass:: GeoField - :members: - :show-inheritance: - -.. autoclass:: GeoFieldAttributes - :members: - :undoc-members: - -Vector Field Types -================== - -Vector fields enable semantic similarity search using various algorithms. All vector fields share common attributes but have algorithm-specific configurations. - -Common Vector Attributes ------------------------- - -All vector field types share these base attributes: - -.. autoclass:: BaseVectorFieldAttributes - :members: - :undoc-members: - -**Key Attributes:** - -- `dims`: Dimensionality of the vector (e.g., 768, 1536). -- `algorithm`: Indexing algorithm for vector search: - - - `flat`: Brute-force exact search. 100% recall, slower for large datasets. Best for <10K vectors. - - `hnsw`: Graph-based approximate search. Fast with high recall (95-99%). Best for general use. - - `svs-vamana`: SVS-VAMANA (Scalable Vector Search with VAMANA graph algorithm) provides fast approximate nearest neighbor search with optional compression support. This algorithm is optimized for Intel hardware and offers reduced memory usage through vector compression. - - .. note:: - For detailed algorithm comparison and selection guidance, see :ref:`vector-algorithm-comparison`. - -- `datatype`: Float precision (`bfloat16`, `float16`, `float32`, `float64`). Note: SVS-VAMANA only supports `float16` and `float32`. -- `distance_metric`: Similarity metric (`COSINE`, `L2`, `IP`). -- `initial_cap`: Initial capacity hint for memory allocation (optional). -- `index_missing`: When True, allows searching for documents missing this field (optional). - -HNSW Vector Fields ------------------- - -HNSW (Hierarchical Navigable Small World) - Graph-based approximate search with excellent recall. **Best for general-purpose vector search (10K-1M+ vectors).** - -.. dropdown:: When to use HNSW & Performance Details - :color: info - - **Use HNSW when:** - - - Medium to large datasets (100K-1M+ vectors) requiring high recall rates - - Search accuracy is more important than memory usage - - Need general-purpose vector search with balanced performance - - Cross-platform deployments where hardware-specific optimizations aren't available - - **Performance characteristics:** - - - **Search speed**: Very fast approximate search with tunable accuracy (via ``ef_runtime`` at query time) - - **Memory usage**: Higher than compressed SVS-VAMANA but reasonable for most applications - - **Recall quality**: Excellent recall rates (95-99%), tunable via ``ef_runtime`` parameter - - **Build time**: Moderate construction time, faster than SVS-VAMANA for smaller datasets - - **Runtime parameters** (adjustable at query time without rebuilding index): - - - ``ef_runtime``: Controls search accuracy (higher = better recall, slower search). Default: 10 - - ``epsilon``: Range search approximation factor for VectorRangeQuery. Default: 0.01 - -.. autoclass:: HNSWVectorField - :members: - :show-inheritance: - -.. autoclass:: HNSWVectorFieldAttributes - :members: - :undoc-members: - -**HNSW Examples:** - -**Balanced configuration (recommended starting point):** - -.. code-block:: yaml - - - name: embedding - type: vector - attrs: - algorithm: hnsw - dims: 768 - distance_metric: cosine - datatype: float32 - # Index-time parameters (set during index creation) - m: 16 # Graph connectivity - ef_construction: 200 # Build-time accuracy - # Note: ef_runtime can be set at query time via VectorQuery - -**High-recall configuration:** - -.. code-block:: yaml - - - name: embedding - type: vector - attrs: - algorithm: hnsw - dims: 768 - distance_metric: cosine - datatype: float32 - # Index-time parameters tuned for maximum accuracy - m: 32 - ef_construction: 400 - # Note: ef_runtime=50 can be set at query time for higher recall - -SVS-VAMANA Vector Fields ------------------------- - -SVS-VAMANA (Scalable Vector Search with VAMANA graph algorithm) provides fast approximate nearest neighbor search with optional compression support. This algorithm is optimized for Intel hardware and offers reduced memory usage through vector compression. **Best for large datasets (>100K vectors) on Intel hardware with memory constraints.** - -.. dropdown:: When to use SVS-VAMANA & Detailed Guide - :color: info - - **Requirements:** - - Redis >= 8.2.0 with Redis Search >= 2.8.10 - - datatype must be 'float16' or 'float32' (float64/bfloat16 not supported) - - **Use SVS-VAMANA when:** - - Large datasets where memory is expensive - - Cloud deployments with memory-based pricing - - When 90-95% recall is acceptable - - High-dimensional vectors (>1024 dims) with LeanVec compression - - **Performance vs other algorithms:** - - **vs FLAT**: Much faster search, significantly lower memory usage with compression, but approximate results - - - **vs HNSW**: Better memory efficiency with compression, similar or better recall, Intel-optimized - - **Runtime parameters** (adjustable at query time without rebuilding index): - - - ``epsilon``: Range search approximation factor. Default: 0.01 - - ``search_window_size``: Size of search window for KNN searches. Higher = better recall, slower search - - ``use_search_history``: Whether to use search buffer (OFF/ON/AUTO). Default: AUTO - - ``search_buffer_capacity``: Tuning parameter for 2-level compression. Default: search_window_size - - **Compression selection guide:** - - - **No compression**: Best performance, standard memory usage - - - **LVQ4/LVQ8**: Good balance of compression (2x-4x) and performance - - - **LeanVec4x8/LeanVec8x8**: Maximum compression (up to 8x) with dimensionality reduction - - **Memory Savings Examples (1M vectors, 768 dims):** - - No compression (float32): 3.1 GB - - - LVQ4x4 compression: 1.6 GB (~48% savings) - - - LeanVec4x8 + reduce to 384: 580 MB (~81% savings) - -.. autoclass:: SVSVectorField - :members: - :show-inheritance: - -.. autoclass:: SVSVectorFieldAttributes - :members: - :undoc-members: - -**SVS-VAMANA Examples:** - -**Basic configuration (no compression):** - -.. code-block:: yaml - - - name: embedding - type: vector - attrs: - algorithm: svs-vamana - dims: 768 - distance_metric: cosine - datatype: float32 - # Index-time parameters (set during index creation) - graph_max_degree: 40 - construction_window_size: 250 - # Note: search_window_size and other runtime params can be set at query time - -**High-performance configuration with compression:** - -.. code-block:: yaml - - - name: embedding - type: vector - attrs: - algorithm: svs-vamana - dims: 768 - distance_metric: cosine - datatype: float32 - # Index-time parameters tuned for better recall - graph_max_degree: 64 - construction_window_size: 500 - # Maximum compression with dimensionality reduction - compression: LeanVec4x8 - reduce: 384 # 50% dimensionality reduction - training_threshold: 1000 - # Note: search_window_size=40 can be set at query time for higher recall - -**Important Notes:** - -- **Requirements**: SVS-VAMANA requires Redis >= 8.2 with Redis Search >= 2.8.10. -- **Datatype limitations**: SVS-VAMANA only supports `float16` and `float32` datatypes (not `bfloat16` or `float64`). -- **Compression compatibility**: The `reduce` parameter is only valid with LeanVec compression types (`LeanVec4x8` or `LeanVec8x8`). -- **Platform considerations**: Intel's proprietary LVQ and LeanVec optimizations are not available in Redis Open Source. On non-Intel platforms and Redis Open Source, SVS-VAMANA with compression falls back to basic 8-bit scalar quantization. -- **Performance tip**: Runtime parameters like ``search_window_size``, ``epsilon``, and ``use_search_history`` can be adjusted at query time without rebuilding the index. Start with defaults and tune ``search_window_size`` first for your speed vs accuracy requirements. - -FLAT Vector Fields ------------------- - -FLAT - Brute-force exact search. **Best for small datasets (<10K vectors) requiring 100% accuracy.** - -.. dropdown:: When to use FLAT & Performance Details - :color: info - - **Use FLAT when:** - - Small datasets (<100K vectors) where exact results are required - - Search accuracy is critical and approximate results are not acceptable - - Baseline comparisons when evaluating approximate algorithms - - Simple use cases where setup simplicity is more important than performance - - **Performance characteristics:** - - **Search accuracy**: 100% exact results (no approximation) - - **Search speed**: Linear time O(n) - slower as dataset grows - - **Memory usage**: Minimal overhead, stores vectors as-is - - **Build time**: Fastest index construction (no preprocessing) - - **Trade-offs vs other algorithms:** - - **vs HNSW**: Much slower search but exact results, faster index building - - **vs SVS-VAMANA**: Slower search and higher memory usage, but exact results - -.. autoclass:: FlatVectorField - :members: - :show-inheritance: - -.. autoclass:: FlatVectorFieldAttributes - :members: - :undoc-members: - -**FLAT Example:** - -.. code-block:: yaml - - - name: embedding - type: vector - attrs: - algorithm: flat - dims: 768 - distance_metric: cosine - datatype: float32 - # Optional: tune for batch processing - block_size: 1024 - -**Note**: FLAT is recommended for small datasets or when exact results are mandatory. For larger datasets, consider HNSW or SVS-VAMANA for better performance. - -SVS-VAMANA Configuration Utilities -================================== - -For SVS-VAMANA indices, RedisVL provides utilities to help configure compression settings and estimate memory savings. - -CompressionAdvisor ------------------- - -.. currentmodule:: redisvl.utils.compression - -.. autoclass:: CompressionAdvisor - :members: - :show-inheritance: - -SVSConfig ---------- - -.. autoclass:: SVSConfig - :members: - :show-inheritance: - -.. _vector-algorithm-comparison: - -Vector Algorithm Comparison -=========================== - -This section provides detailed guidance for choosing between vector search algorithms. - -Algorithm Selection Guide -------------------------- - -.. list-table:: Vector Algorithm Comparison - :header-rows: 1 - :widths: 15 20 20 20 25 - - * - Algorithm - - Best For - - Performance - - Memory Usage - - Trade-offs - * - **FLAT** - - Small datasets (<100K vectors) - - 100% recall, O(n) search - - Minimal overhead - - Exact but slow for large data - * - **HNSW** - - General purpose (100K-1M+ vectors) - - 95-99% recall, O(log n) search - - Moderate (graph overhead) - - Fast approximate search - * - **SVS-VAMANA** - - Large datasets with memory constraints - - 90-95% recall, O(log n) search - - Low (with compression) - - Intel-optimized, requires newer Redis - -When to Use Each Algorithm --------------------------- - -**Choose FLAT when:** - - Dataset size < 100,000 vectors - - Exact results are mandatory - - Simple setup is preferred - - Query latency is not critical - -**Choose HNSW when:** - - Dataset size 100K - 1M+ vectors - - Need balanced speed and accuracy - - Cross-platform compatibility required - - Most common choice for production - -**Choose SVS-VAMANA when:** - - Dataset size > 100K vectors - - Memory usage is a primary concern - - Running on Intel hardware - - Can accept 90-95% recall for memory savings - -Performance Characteristics ---------------------------- - -**Search Speed:** - - FLAT: Linear time O(n) - gets slower as data grows - - HNSW: Logarithmic time O(log n) - scales well - - SVS-VAMANA: Logarithmic time O(log n) - scales well - -**Memory Usage (1M vectors, 768 dims, float32):** - - FLAT: ~3.1 GB (baseline) - - HNSW: ~3.7 GB (20% overhead for graph) - - SVS-VAMANA: 1.6-3.1 GB (depends on compression) - -**Recall Quality:** - - FLAT: 100% (exact search) - - HNSW: 95-99% (tunable via ``ef_runtime`` at query time) - - SVS-VAMANA: 90-95% (tunable via ``search_window_size`` at query time, also depends on compression) - -Migration Considerations ------------------------- - -**From FLAT to HNSW:** - - Straightforward migration - - Expect slight recall reduction but major speed improvement - - Tune ``ef_runtime`` at query time to balance speed vs accuracy (no index rebuild needed) - -**From HNSW to SVS-VAMANA:** - - Requires Redis >= 8.2 with Redis Search >= 2.8.10 - - Change datatype to float16 or float32 if using others - - Consider compression options for memory savings - -**From SVS-VAMANA to others:** - - May need to change datatype back if using float64/bfloat16 - - HNSW provides similar performance with broader compatibility - -For complete Redis field documentation, see: https://redis.io/commands/ft.create/ \ No newline at end of file diff --git a/docs/api/searchindex.md b/docs/api/searchindex.md new file mode 100644 index 000000000..436269b7c --- /dev/null +++ b/docs/api/searchindex.md @@ -0,0 +1,24 @@ +--- +description: SearchIndex and AsyncSearchIndex API reference for RedisVL. +--- + +# Search Index Classes + +| Class | Description | +|-------|-------------| +| [`SearchIndex`](#searchindex) | Primary class to write, read, and search across data structures in Redis. | +| [`AsyncSearchIndex`](#asyncsearchindex) | Async variant of `SearchIndex`. | + +## SearchIndex + +::: redisvl.index.SearchIndex + options: + show_root_heading: true + inherited_members: true + +## AsyncSearchIndex + +::: redisvl.index.AsyncSearchIndex + options: + show_root_heading: true + inherited_members: true diff --git a/docs/api/searchindex.rst b/docs/api/searchindex.rst deleted file mode 100644 index 6080d2744..000000000 --- a/docs/api/searchindex.rst +++ /dev/null @@ -1,36 +0,0 @@ -******************** -Search Index Classes -******************** - -.. list-table:: - :widths: 25 75 - :header-rows: 1 - - * - Class - - Description - * - :ref:`searchindex_api` - - Primary class to write, read, and search across data structures in Redis. - * - :ref:`asyncsearchindex_api` - - Async version of the SearchIndex to write, read, and search across data structures in Redis. - -.. _searchindex_api: - -SearchIndex -=========== - -.. currentmodule:: redisvl.index - -.. autoclass:: SearchIndex - :inherited-members: - :members: - -.. _asyncsearchindex_api: - -AsyncSearchIndex -================ - -.. currentmodule:: redisvl.index - -.. autoclass:: AsyncSearchIndex - :inherited-members: - :members: diff --git a/docs/api/vector.md b/docs/api/vector.md new file mode 100644 index 000000000..5fb1e38db --- /dev/null +++ b/docs/api/vector.md @@ -0,0 +1,16 @@ +--- +description: Vector API reference for RedisVL. +--- + +# Vector + +The `Vector` class is a container that encapsulates a numerical vector, its +datatype, the corresponding index field name, and an optional importance +weight. It is used when constructing multi-vector queries with +[`MultiVectorQuery`](query.md#multivectorquery). + +## Vector + +::: redisvl.query.Vector + options: + show_root_heading: true diff --git a/docs/api/vector.rst b/docs/api/vector.rst deleted file mode 100644 index c82ec18dd..000000000 --- a/docs/api/vector.rst +++ /dev/null @@ -1,17 +0,0 @@ - -****** -Vector -****** - -The Vector class in RedisVL is a container that encapsulates a numerical vector, it's datatype, corresponding index field name, and optional importance weight. It is used when constructing multi-vector queries using the MultiVectorQuery class. - - -Vector -=========== - -.. currentmodule:: redisvl.query - - -.. autoclass:: Vector - :members: - :exclude-members: diff --git a/docs/api/vectorizer.md b/docs/api/vectorizer.md new file mode 100644 index 000000000..ed5dd4c1a --- /dev/null +++ b/docs/api/vectorizer.md @@ -0,0 +1,74 @@ +--- +description: Vectorizer providers for RedisVL: OpenAI, Cohere, HuggingFace, Vertex, Bedrock, Mistral, VoyageAI. +--- + +# Vectorizers + +Vectorizers convert text into embedding vectors. RedisVL ships with adapters +for common cloud and local providers, all behind a single interface. + +!!! note "Backwards compatibility" + + Several vectorizers have deprecated aliases in `redisvl.utils.vectorize.text`: + + - `VoyageAITextVectorizer` → use `VoyageAIVectorizer` + - `VertexAITextVectorizer` → use `VertexAIVectorizer` + - `BedrockTextVectorizer` → use `BedrockVectorizer` + - `CustomTextVectorizer` → use `CustomVectorizer` + + These aliases are deprecated as of version 0.13.0 and will be removed in a + future major release. + +## HFTextVectorizer + +::: redisvl.utils.vectorize.text.huggingface.HFTextVectorizer + options: + show_root_heading: true + +## OpenAITextVectorizer + +::: redisvl.utils.vectorize.text.openai.OpenAITextVectorizer + options: + show_root_heading: true + +## AzureOpenAITextVectorizer + +::: redisvl.utils.vectorize.text.azureopenai.AzureOpenAITextVectorizer + options: + show_root_heading: true + +## VertexAIVectorizer + +::: redisvl.utils.vectorize.vertexai.VertexAIVectorizer + options: + show_root_heading: true + +## CohereTextVectorizer + +::: redisvl.utils.vectorize.text.cohere.CohereTextVectorizer + options: + show_root_heading: true + +## BedrockVectorizer + +::: redisvl.utils.vectorize.bedrock.BedrockVectorizer + options: + show_root_heading: true + +## CustomVectorizer + +::: redisvl.utils.vectorize.custom.CustomVectorizer + options: + show_root_heading: true + +## VoyageAIVectorizer + +::: redisvl.utils.vectorize.voyageai.VoyageAIVectorizer + options: + show_root_heading: true + +## MistralAITextVectorizer + +::: redisvl.utils.vectorize.text.mistral.MistralAITextVectorizer + options: + show_root_heading: true diff --git a/docs/api/vectorizer.rst b/docs/api/vectorizer.rst deleted file mode 100644 index e7167efc9..000000000 --- a/docs/api/vectorizer.rst +++ /dev/null @@ -1,143 +0,0 @@ -*********** -Vectorizers -*********** - -.. note:: - **Backwards Compatibility:** Several vectorizers have deprecated aliases - available in the ``redisvl.utils.vectorize.text`` module for backwards - compatibility: - - - ``VoyageAITextVectorizer`` → Use ``VoyageAIVectorizer`` instead - - ``VertexAITextVectorizer`` → Use ``VertexAIVectorizer`` instead - - ``BedrockTextVectorizer`` → Use ``BedrockVectorizer`` instead - - ``CustomTextVectorizer`` → Use ``CustomVectorizer`` instead - - These aliases are deprecated as of version 0.13.0 and will be removed - in a future major release. - -HFTextVectorizer -================ - -.. _hftextvectorizer_api: - -.. currentmodule:: redisvl.utils.vectorize.text.huggingface - -.. autoclass:: HFTextVectorizer - :show-inheritance: - :members: - - -OpenAITextVectorizer -==================== - -.. _openaitextvectorizer_api: - -.. currentmodule:: redisvl.utils.vectorize.text.openai - -.. autoclass:: OpenAITextVectorizer - :show-inheritance: - :members: - - -AzureOpenAITextVectorizer -========================= - -.. _azureopenaitextvectorizer_api: - -.. currentmodule:: redisvl.utils.vectorize.text.azureopenai - -.. autoclass:: AzureOpenAITextVectorizer - :show-inheritance: - :members: - - -VertexAIVectorizer -====================== - -.. _vertexaivectorizer_api: - -.. currentmodule:: redisvl.utils.vectorize.vertexai - -.. note:: - For backwards compatibility, an alias ``VertexAITextVectorizer`` is available - in the ``redisvl.utils.vectorize.text`` module. This alias is deprecated - as of version 0.13.0 and will be removed in a future major release. - -.. autoclass:: VertexAIVectorizer - :show-inheritance: - :members: - - -CohereTextVectorizer -==================== - -.. _coheretextvectorizer_api: - -.. currentmodule:: redisvl.utils.vectorize.text.cohere - -.. autoclass:: CohereTextVectorizer - :show-inheritance: - :members: - - -BedrockVectorizer -===================== - -.. _bedrockvectorizer_api: - -.. currentmodule:: redisvl.utils.vectorize.bedrock - -.. note:: - For backwards compatibility, an alias ``BedrockTextVectorizer`` is available - in the ``redisvl.utils.vectorize.text`` module. This alias is deprecated - as of version 0.13.0 and will be removed in a future major release. - -.. autoclass:: BedrockVectorizer - :show-inheritance: - :members: - - -CustomVectorizer -==================== - -.. _customvectorizer_api: - -.. currentmodule:: redisvl.utils.vectorize.custom - -.. note:: - For backwards compatibility, an alias ``CustomTextVectorizer`` is available - in the ``redisvl.utils.vectorize.text`` module. This alias is deprecated - as of version 0.13.0 and will be removed in a future major release. - -.. autoclass:: CustomVectorizer - :show-inheritance: - :members: - - -VoyageAIVectorizer -====================== - -.. _voyageaivectorizer_api: - -.. currentmodule:: redisvl.utils.vectorize.voyageai - -.. note:: - For backwards compatibility, an alias ``VoyageAITextVectorizer`` is available - in the ``redisvl.utils.vectorize.text`` module. This alias is deprecated - as of version 0.13.0 and will be removed in a future major release. - -.. autoclass:: VoyageAIVectorizer - :show-inheritance: - :members: - - -MistralAITextVectorizer -======================== - -.. _mistralaitextvectorizer_api: - -.. currentmodule:: redisvl.utils.vectorize.text.mistral - -.. autoclass:: MistralAITextVectorizer - :show-inheritance: - :members: diff --git a/docs/_static/Redis_Favicon_32x32_Red.png b/docs/assets/favicon.png similarity index 100% rename from docs/_static/Redis_Favicon_32x32_Red.png rename to docs/assets/favicon.png diff --git a/docs/assets/redis-logo-script-red.svg b/docs/assets/redis-logo-script-red.svg new file mode 100644 index 000000000..082a5a882 --- /dev/null +++ b/docs/assets/redis-logo-script-red.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/assets/redis-logo-script.svg b/docs/assets/redis-logo-script.svg new file mode 100644 index 000000000..151ac350f --- /dev/null +++ b/docs/assets/redis-logo-script.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_static/redisvl-architecture.svg b/docs/assets/redisvl-architecture.svg similarity index 100% rename from docs/_static/redisvl-architecture.svg rename to docs/assets/redisvl-architecture.svg diff --git a/docs/concepts/architecture.md b/docs/concepts/architecture.md index 3cd596330..c2e539132 100644 --- a/docs/concepts/architecture.md +++ b/docs/concepts/architecture.md @@ -1,19 +1,9 @@ ---- -myst: - html_meta: - "description lang=en": | - RedisVL architecture - how the library structures vector search on Redis. ---- # Architecture RedisVL sits between your application and Redis, providing a structured way to define, populate, and query vector search indexes. -```{image} /_static/redisvl-architecture.svg -:alt: RedisVL Architecture -:align: center -:width: 100% -``` +![RedisVL Architecture](../assets/redisvl-architecture.svg) ## The Core Pattern @@ -67,7 +57,7 @@ Each extension manages its own Redis index internally. You interact with a clean --- -**Related concepts:** {doc}`search-and-indexing` covers schemas and field types in detail. {doc}`queries` explains the different query types available. +**Related concepts:** [search-and-indexing](search-and-indexing.md) covers schemas and field types in detail. [queries](queries.md) explains the different query types available. -**Learn more:** {doc}`/user_guide/01_getting_started` covers the core workflow. {doc}`extensions` explains each extension pattern in detail. +**Learn more:** the [Getting Started](../user_guide/01_getting_started.ipynb) notebook covers the core workflow. [Extensions](extensions.md) explains each extension pattern in detail. diff --git a/docs/concepts/extensions.md b/docs/concepts/extensions.md index 54c54eb57..2aa352e42 100644 --- a/docs/concepts/extensions.md +++ b/docs/concepts/extensions.md @@ -1,9 +1,3 @@ ---- -myst: - html_meta: - "description lang=en": | - RedisVL extensions - semantic caching, embeddings caching, message history, and routing. ---- # Extensions @@ -33,9 +27,9 @@ In applications serving multiple users or contexts, you often want separate cach ### Redis vs LangCache managed service -`SemanticCache` stores data in your Redis deployment and uses RedisVL’s search index under the hood—you control sizing, networking, and advanced filtering with {doc}`FilterExpression `. +`SemanticCache` stores data in your Redis deployment and uses RedisVL’s search index under the hood—you control sizing, networking, and advanced filtering with [FilterExpression](../api/filter.md). -If you prefer a hosted semantic cache that is operated as a service you can use `LangCacheSemanticCache` (install `redisvl[langcache]`). It uses the LangCache API endpoint instead of Redis directly. While these are similar, they do not share all the same properties. Refer to {doc}`/user_guide/03_llmcache` to see `SemanticCache` in detail, and {doc}`/user_guide/13_langcache_semantic_cache` covers `LangCacheSemanticCache` in detail. +If you prefer a hosted semantic cache that is operated as a service you can use `LangCacheSemanticCache` (install `redisvl[langcache]`). It uses the LangCache API endpoint instead of Redis directly. While these are similar, they do not share all the same properties. Refer to [user_guide/03_llmcache](../user_guide/03_llmcache.ipynb) to see `SemanticCache` in detail, and [user_guide/13_langcache_semantic_cache](../user_guide/13_langcache_semantic_cache.ipynb) covers `LangCacheSemanticCache` in detail. ## Embeddings Cache @@ -49,15 +43,16 @@ This is useful when the same content is embedded multiple times—common in appl ### Wrapping Vectorizers -The embeddings cache can wrap any {doc}`vectorizer `, adding transparent caching. Calling the wrapped vectorizer checks the cache first. This requires no changes to your embedding code—just wrap the vectorizer and caching happens automatically. +The embeddings cache can wrap any [vectorizer](utilities.md), adding transparent caching. Calling the wrapped vectorizer checks the cache first. This requires no changes to your embedding code—just wrap the vectorizer and caching happens automatically. ## Message History LLMs are stateless. To have a conversation, you must include previous messages in each prompt. Message history manages this context, storing conversation turns and retrieving them when building prompts. -```{note} -`SessionManager` and `SemanticSessionManager` have been renamed to `MessageHistory` and `SemanticMessageHistory`. The old names are deprecated and will be removed in a future release. -``` +!!! note + + `SessionManager` and `SemanticSessionManager` have been renamed to `MessageHistory` and `SemanticMessageHistory`. The old names are deprecated and will be removed in a future release. + ### Storage Model @@ -73,7 +68,7 @@ Semantic message history adds vector search. Messages are embedded, and you can Session tags are critical for multi-user applications. Each user's conversation should be isolated, so retrieving context for User A doesn't include messages from User B. The session tag provides this isolation, and you can structure sessions however makes sense—per-user, per-thread, per-agent, or any other grouping. -**Learn more:** {doc}`/user_guide/07_message_history` explains conversation management in detail. +**Learn more:** [user_guide/07_message_history](../user_guide/07_message_history.ipynb) explains conversation management in detail. ## Semantic Router @@ -95,8 +90,8 @@ If no route matches (all distances exceed their thresholds), the router returns Semantic routing is useful for intent classification (determining what a user wants), topic detection (categorizing content), guardrails (detecting and blocking certain query types), and agent dispatch (sending queries to specialized sub-agents). -**Learn more:** {doc}`/user_guide/08_semantic_router` walks through routing setup in detail. +**Learn more:** [user_guide/08_semantic_router](../user_guide/08_semantic_router.ipynb) walks through routing setup in detail. --- -**Related concepts:** {doc}`queries` explains the query types used internally by extensions. {doc}`utilities` covers vectorizers used for embedding. +**Related concepts:** [queries](queries.md) explains the query types used internally by extensions. [utilities](utilities.md) covers vectorizers used for embedding. diff --git a/docs/concepts/field-attributes.md b/docs/concepts/field-attributes.md index c7764a4a7..090a650b0 100644 --- a/docs/concepts/field-attributes.md +++ b/docs/concepts/field-attributes.md @@ -1,9 +1,3 @@ ---- -myst: - html_meta: - "description lang=en": | - RedisVL field attributes - configuring sortable, no_index, index_missing, and other field options. ---- # Field Attributes @@ -261,7 +255,7 @@ Geo fields support the common attributes (`sortable`, `no_index`, `index_missing ## Vector Field Attributes -Vector fields have a different attribute structure. See {doc}`/api/schema` for complete vector field documentation. +Vector fields have a different attribute structure. See [api/schema](../api/schema.md) for complete vector field documentation. Key vector attributes: - `dims`: Vector dimensionality (required) @@ -374,5 +368,5 @@ fields: path: $.location ``` -**Learn more:** {doc}`/api/schema` provides the complete API reference for all field types and attributes. +**Learn more:** [api/schema](../api/schema.md) provides the complete API reference for all field types and attributes. diff --git a/docs/concepts/index.md b/docs/concepts/index.md index a68d0802e..675fd97e4 100644 --- a/docs/concepts/index.md +++ b/docs/concepts/index.md @@ -1,77 +1,53 @@ --- -myst: - html_meta: - "description lang=en": | - Core concepts for RedisVL - architecture, search, indexing, and AI extensions. +description: Core concepts for RedisVL. Architecture, search and indexing, field attributes, query types, utilities, MCP, and extensions. --- # Concepts -Foundational knowledge for building AI applications with RedisVL. These concepts are language-agnostic and apply across all RedisVL implementations. +Foundational knowledge for building AI applications with RedisVL. These concepts apply across every RedisVL implementation and explain why the library is shaped the way it is. -::::{grid} 2 -:gutter: 3 +
-:::{grid-item-card} 🏗️ Architecture -:link: architecture -:link-type: doc +- :material-sitemap:{ .lg .middle } **[Architecture](architecture.md)** -How RedisVL components connect: schemas, indexes, queries, and extensions. -::: + --- -:::{grid-item-card} 🔍 Search & Indexing -:link: search-and-indexing -:link-type: doc + How RedisVL components connect: schemas, indexes, queries, and extensions. -Schemas, fields, documents, storage types, and query patterns. -::: +- :material-database-search:{ .lg .middle } **[Search and indexing](search-and-indexing.md)** -:::{grid-item-card} 🏷️ Field Attributes -:link: field-attributes -:link-type: doc + --- -Configure sortable, no_index, index_missing, and other field options. -::: + Schemas, fields, documents, storage types, and query patterns. -:::{grid-item-card} 🔎 Query Types -:link: queries -:link-type: doc +- :material-tag-multiple:{ .lg .middle } **[Field attributes](field-attributes.md)** -Vector, filter, text, hybrid, and multi-vector query options. -::: + --- -:::{grid-item-card} 🔧 Utilities -:link: utilities -:link-type: doc + Configure sortable, no_index, index_missing, and other per-field options. -Vectorizers for embeddings and rerankers for result optimization. -::: +- :material-magnify:{ .lg .middle } **[Query types](queries.md)** -:::{grid-item-card} 🧠 MCP -:link: mcp -:link-type: doc + --- -How RedisVL exposes an existing Redis index to MCP clients through a stable tool contract. -::: + Vector, filter, text, hybrid, and multi-vector query options. -:::{grid-item-card} 🧩 Extensions -:link: extensions -:link-type: doc +- :material-tools:{ .lg .middle } **[Utilities](utilities.md)** -Pre-built patterns: caching, message history, and semantic routing. -::: + --- -:::: + Vectorizers for embeddings and rerankers for result optimization. -```{toctree} -:maxdepth: 2 -:hidden: +- :material-robot:{ .lg .middle } **[MCP](mcp.md)** -architecture -search-and-indexing -field-attributes -queries -utilities -mcp -extensions -``` + --- + + How RedisVL exposes an existing Redis index to MCP clients through a stable tool contract. + +- :material-puzzle:{ .lg .middle } **[Extensions](extensions.md)** + + --- + + Pre-built patterns: caching, message history, and semantic routing. + +
diff --git a/docs/concepts/mcp.md b/docs/concepts/mcp.md index 9a6970e51..f83beaf86 100644 --- a/docs/concepts/mcp.md +++ b/docs/concepts/mcp.md @@ -1,9 +1,3 @@ ---- -myst: - html_meta: - "description lang=en": | - RedisVL MCP concepts: how the RedisVL MCP server exposes an existing Redis index to MCP clients. ---- # RedisVL MCP @@ -107,4 +101,4 @@ RedisVL MCP is a good fit when: - you need a read-only or tightly controlled write boundary - you want to reuse an existing Redis index without rebuilding retrieval logic in every client -For setup steps, config, commands, and examples, see {doc}`/user_guide/how_to_guides/mcp`. +For setup steps, config, commands, and examples, see [Run RedisVL MCP](../user_guide/how_to_guides/mcp.md). diff --git a/docs/concepts/queries.md b/docs/concepts/queries.md index 05adfe25e..5b0378695 100644 --- a/docs/concepts/queries.md +++ b/docs/concepts/queries.md @@ -1,9 +1,3 @@ ---- -myst: - html_meta: - "description lang=en": | - RedisVL query types - vector search, filtering, text search, and hybrid queries. ---- # Query Types @@ -132,9 +126,10 @@ results = index.query(query) Use when neither pure keyword search nor pure semantic search gives good enough results. Common in RAG applications where you want both exact matches and semantic understanding. -```{note} -HybridQuery requires Redis >= 8.4.0 and redis-py >= 7.1.0. -``` +!!! note + + HybridQuery requires Redis >= 8.4.0 and redis-py >= 7.1.0. + ### AggregateHybridQuery @@ -275,9 +270,10 @@ query = SQLQuery(""" Use when your team is more comfortable with SQL syntax, or when integrating with tools that generate SQL. -```{note} -SQLQuery requires the optional `sql-redis` package. Install with: `pip install redisvl[sql-redis]` -``` +!!! note + + SQLQuery requires the optional `sql-redis` package. Install with: `pip install redisvl[sql-redis]` + For comprehensive examples including geographic filtering, date functions, and vector search, see the [SQL to Redis Queries guide](../user_guide/12_sql_to_redis_queries.ipynb). @@ -329,5 +325,5 @@ query = HybridQuery( ) ``` -**Learn more:** {doc}`/user_guide/11_advanced_queries` demonstrates these query types in detail. +**Learn more:** [user_guide/11_advanced_queries](../user_guide/11_advanced_queries.ipynb) demonstrates these query types in detail. diff --git a/docs/concepts/search-and-indexing.md b/docs/concepts/search-and-indexing.md index b4fe69569..5a86adcf1 100644 --- a/docs/concepts/search-and-indexing.md +++ b/docs/concepts/search-and-indexing.md @@ -1,9 +1,3 @@ ---- -myst: - html_meta: - "description lang=en": | - RedisVL search and indexing - schemas, field types, storage, and query patterns. ---- # Search & Indexing @@ -108,7 +102,7 @@ Planning your schema carefully upfront reduces the need for migrations, but the --- -**Related concepts:** {doc}`field-attributes` explains how to configure field options like `sortable` and `index_missing`. {doc}`queries` covers the different query types available. +**Related concepts:** [field-attributes](field-attributes.md) explains how to configure field options like `sortable` and `index_missing`. [queries](queries.md) covers the different query types available. -**Learn more:** {doc}`/user_guide/01_getting_started` walks through building your first index. {doc}`/user_guide/05_hash_vs_json` compares storage options in depth. {doc}`/user_guide/02_complex_filtering` covers query composition. +**Learn more:** [user_guide/01_getting_started](../user_guide/01_getting_started.ipynb) walks through building your first index. [user_guide/05_hash_vs_json](../user_guide/05_hash_vs_json.ipynb) compares storage options in depth. [user_guide/02_complex_filtering](../user_guide/02_complex_filtering.ipynb) covers query composition. diff --git a/docs/concepts/utilities.md b/docs/concepts/utilities.md index 77ae9ed78..73304d00f 100644 --- a/docs/concepts/utilities.md +++ b/docs/concepts/utilities.md @@ -1,9 +1,3 @@ ---- -myst: - html_meta: - "description lang=en": | - RedisVL utilities - vectorizers for embeddings and rerankers for result optimization. ---- # Utilities @@ -35,7 +29,7 @@ Vectorizers handle batching internally, breaking large batches into provider-app ### Supported Providers -RedisVL includes vectorizers for OpenAI, Azure OpenAI, Cohere, HuggingFace (local), Mistral, Google Vertex AI, AWS Bedrock, VoyageAI, and others. See the {doc}`/api/vectorizer` for the complete list. You can also create custom vectorizers that wrap any embedding function. +RedisVL includes vectorizers for OpenAI, Azure OpenAI, Cohere, HuggingFace (local), Mistral, Google Vertex AI, AWS Bedrock, VoyageAI, and others. See the [api/vectorizer](../api/vectorizer.md) for the complete list. You can also create custom vectorizers that wrap any embedding function. ## Rerankers @@ -69,7 +63,7 @@ This pattern separates recall (finding everything potentially relevant) from pre --- -**Related concepts:** {doc}`queries` explains how to use embeddings in vector search queries. {doc}`search-and-indexing` covers schema configuration for vector fields. +**Related concepts:** [queries](queries.md) explains how to use embeddings in vector search queries. [search-and-indexing](search-and-indexing.md) covers schema configuration for vector fields. -**Learn more:** {doc}`/user_guide/04_vectorizers` covers embedding providers. {doc}`/user_guide/06_rerankers` explains reranking in practice. +**Learn more:** [user_guide/04_vectorizers](../user_guide/04_vectorizers.ipynb) covers embedding providers. [user_guide/06_rerankers](../user_guide/06_rerankers.ipynb) explains reranking in practice. diff --git a/docs/conf.py b/docs/conf.py deleted file mode 100644 index cfac39be9..000000000 --- a/docs/conf.py +++ /dev/null @@ -1,145 +0,0 @@ -# Configuration file for the Sphinx documentation builder. -# -# This file only contains a selection of the most common options. For a full -# list see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -import os -import sys -sys.path.insert(0, os.path.abspath('.')) - -print(f"Sphinx is using Python executable at: {sys.executable}", flush=True) -print(f"Python version: {sys.version}", flush=True) - -# -- Project information ----------------------------------------------------- - -from redisvl import __version__ - -project = 'RedisVL' -copyright = '2024, Redis Inc.' -author = 'Redis Applied AI' -version = __version__ - -# The full version, including alpha/beta/rc tags -release = version - - -# -- General configuration --------------------------------------------------- - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.todo', - 'sphinx.ext.coverage', - 'sphinx.ext.imgmath', - 'sphinx.ext.viewcode', - 'sphinx.ext.githubpages', - 'sphinx.ext.autosummary', - 'sphinx.ext.napoleon', - "sphinx_design", - "sphinx_copybutton", - "_extension.gallery_directive", - "myst_nb", - "sphinx_favicon" -] - - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store', "**.ipynb_checkpoints"] - - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. -html_theme = "sphinx_book_theme" - -# Pygments syntax highlighting style -pygments_style = "friendly" -pygments_dark_style = "monokai" - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] -html_css_files = ["css/custom.css"] -html_title = "RedisVL" -html_logo = "_static/Redis_Favicon_32x32_Red.png" -html_favicon = "_static/Redis_Favicon_32x32_Red.png" - -html_context = { - "github_user": "redis", - "github_repo": "redis-vl-python", - "github_version": "main", - "doc_path": "docs", - "default_mode": "auto", -} - -# This allows us to use ::: to denote directives, useful for admonitions -myst_enable_extensions = ["colon_fence"] -myst_heading_anchors = 3 - -# Sphinx Book Theme options -html_theme_options = { - "repository_url": "https://github.com/redis/redis-vl-python", - "use_repository_button": True, - "use_edit_page_button": True, - "use_source_button": True, - "use_issues_button": True, - "use_download_button": True, - "use_fullscreen_button": True, - "repository_branch": "main", - "path_to_docs": "docs", - "show_navbar_depth": 2, - "navigation_depth": 4, - "show_toc_level": 3, - "home_page_in_toc": True, - "logo": { - "text": "Redis Vector Library", - "image_light": "_static/Redis_Favicon_32x32_Red.png", - "image_dark": "_static/Redis_Favicon_32x32_Red.png", - }, -} - - -autoclass_content = 'both' -add_module_names = False - -nb_execution_mode = "off" - -# -- Options for autosummary/autodoc output ------------------------------------ -autosummary_generate = True -autodoc_typehints = "description" -autodoc_member_order = "groupwise" - -# -- Options for autoapi ------------------------------------------------------- -autoapi_type = "python" -autoapi_dirs = ["../src/redisvl"] -autoapi_keep_files = True -autoapi_root = "api" -autoapi_member_order = "groupwise" - - -# -- favicon options --------------------------------------------------------- - -# see https://sphinx-favicon.readthedocs.io for more information about the -# sphinx-favicon extension - -favicons = [ - # generic icons compatible with most browsers - "Redis_Favicon_32x32_Red.png", - "Redis_Favicon_16x16_Red.png", - "Redis_Favicon_144x144_Red.png", -] diff --git a/docs/examples/index.md b/docs/examples/index.md index 843ae24dd..7ec7b2213 100644 --- a/docs/examples/index.md +++ b/docs/examples/index.md @@ -1,33 +1,21 @@ --- -myst: - html_meta: - "description lang=en": | - Examples for RedisVL users +description: Examples and code recipes for RedisVL. RAG, agents, semantic caching, recommendation systems, and more. --- - # Example Gallery Explore community examples of RedisVL in the wild. -```{tip} -For a comprehensive collection of Redis AI examples, tutorials, and recipes, visit the -**[Redis AI Resources](https://github.com/redis-developer/redis-ai-resources)** repository. -It includes notebooks for RAG, agents, semantic caching, recommendation systems, and more. -``` - -## Demo Applications +!!! tip -Full-stack applications showcasing RedisVL and Redis vector search capabilities. + For a comprehensive collection of Redis AI examples, tutorials, and recipes, visit the + **[Redis AI Resources](https://github.com/redis-developer/redis-ai-resources)** repository. + It includes notebooks for RAG, agents, semantic caching, recommendation systems, and more. -```{gallery-grid} ../_static/gallery.yaml -:grid-columns: "1 1 2 2" -``` +!!! note -```{note} -If you are using RedisVL, please consider adding your example to this page by -opening a Pull Request on [GitHub](https://github.com/redis/redis-vl-python) -``` + If you are using RedisVL, please consider adding your example to this page by + opening a Pull Request on [GitHub](https://github.com/redis/redis-vl-python). --- @@ -112,7 +100,6 @@ Reduce costs and latency with caching and routing. Looking for more examples and tutorials? -- **[Redis AI Resources](https://github.com/redis-developer/redis-ai-resources)** -- Comprehensive collection of code recipes, demos, and tutorials -- **[Java Recipes](https://github.com/redis-developer/redis-ai-resources/tree/main/java-recipes)** -- Spring AI, Redis OM Spring, and semantic routing examples -- **[Redis Developer Hub](https://redis.io/developers/)** -- Official Redis developer resources - +- **[Redis AI Resources](https://github.com/redis-developer/redis-ai-resources)** — Comprehensive collection of code recipes, demos, and tutorials +- **[Java Recipes](https://github.com/redis-developer/redis-ai-resources/tree/main/java-recipes)** — Spring AI, Redis OM Spring, and semantic routing examples +- **[Redis Developer Hub](https://redis.io/developers/)** — Official Redis developer resources diff --git a/docs/for-ais-only/BUILD_AND_TEST.md b/docs/for-ais-only/BUILD_AND_TEST.md new file mode 100644 index 000000000..034ae5e28 --- /dev/null +++ b/docs/for-ais-only/BUILD_AND_TEST.md @@ -0,0 +1,100 @@ +--- +description: Exact build, test, and docs commands for AI agents working on the redisvl repository. +--- + +# Build and test + +The shortest path from a fresh checkout to a green build. + +## One-time setup + +```bash +make install # uv sync --all-extras +make redis-start # docker run -d --name redis -p 6379:6379 redis:8.4 +``` + +`make install` uses [uv](https://docs.astral.sh/uv/) and writes the lock file +in `uv.lock`. Do **not** edit `pyproject.toml` to add or remove dependencies; +use `uv add` / `uv remove` (with `--group dev` or `--group docs` where +appropriate) so the lock stays consistent. + +`make redis-start` is required for any test that talks to Redis. +`testcontainers` will create its own ephemeral container per integration test, +but the notebook suite uses the long-lived container on port 6379. + +## Format and lint + +```bash +make format # isort + black on redisvl/ and tests/ +make check-types # mypy +make lint # format + check-types +``` + +Run `make format` before committing. CI re-runs the same commands. + +## Tests + +```bash +make test # default suite (no API-dependent tests) +make test ARGS="--run-api-tests" # full suite including paid providers +make test-all # alias for the above +make test-verbose # -vv -s +make test-notebooks # nbval-lax across docs/user_guide/*.ipynb +``` + +`make test` runs `pytest -n auto`. Set `ARGS="-k name_substring"` to subset. + +API-dependent tests need the appropriate environment variables set, for +example `OPENAI_API_KEY`, `COHERE_API_KEY`, `VOYAGE_API_KEY`, +`LANGCACHE_API_KEY`, etc. Tests that require keys you have not provided are +skipped, not failed. + +## Docs + +```bash +make docs-build # mkdocs build --strict +make docs-serve # mkdocs serve --dev-addr 127.0.0.1:8000 +``` + +`docs-build` is the contract: it must pass with `--strict`, which fails on +broken cross-references and on unrecognized config. `docs-serve` watches the +`redisvl/` package as well as the docs tree, so changes to docstrings reflow +the API reference live. + +The docs depend on the `docs` group: + +```bash +uv sync --group docs +``` + +The lock file already pins compatible versions; `make install` pulls these in +as part of the default groups. + +## Pre-commit + +```bash +pre-commit install +pre-commit run --all-files +``` + +The hooks run formatting, type checking, and a codespell pass. + +## Releasing + +The release workflow auto-bumps `pyproject.toml` `version`. **Do not** edit +that field by hand. Tag conventions and the actual cut are handled in CI. + +## Things that *will* break the build + +- Adding a public symbol without re-exporting it from the relevant + `__init__.py`. The mkdocstrings pages reference subpackage paths, not module + paths. +- Changing a docstring section header from a Google-style `Args:` / + `Returns:` / `Raises:` to a non-Google format. mkdocstrings is configured + with `docstring_style: google`. +- Renaming a notebook under `docs/user_guide/`. The path appears in + `mkdocs.yml`'s `nav:` section and in the how-to-guide and use-case index + cards. Update all three. +- Editing `pyproject.toml` directly to bump or add a dependency. Use `uv add`. +- Adding a doc file outside the `nav:` tree without listing it. `mkdocs build + --strict` fails on orphaned pages. diff --git a/docs/for-ais-only/FAILURE_MODES.md b/docs/for-ais-only/FAILURE_MODES.md new file mode 100644 index 000000000..600d61ba5 --- /dev/null +++ b/docs/for-ais-only/FAILURE_MODES.md @@ -0,0 +1,103 @@ +--- +description: Common ways changes break the redisvl test suite or surface as runtime errors, and the canonical fixes. +--- + +# Failure modes + +The recurring ways a redisvl change goes wrong, and the smallest fix that +restores green. + +## `mkdocs build --strict` fails + +### "Doc file ... contains a link to ... which is not found" + +A page links to another page that doesn't exist (typo, wrong relative path, +or the target file was deleted/renamed). + +- **Notebook references**: notebook nodes are addressed by their on-disk + path, including the `.ipynb` suffix. From `docs/concepts/extensions.md` the + Getting Started notebook is `../user_guide/01_getting_started.ipynb`, **not** + `../user_guide/01_getting_started.md`. +- **API references**: API pages use `.md`. From `docs/concepts/utilities.md` + the vectorizer reference is `../api/vectorizer.md`. +- **Concept-to-concept refs**: stay flat — `[Architecture](architecture.md)`, + not `[Architecture](../concepts/architecture.md)`. + +### "404 page exists but is not in the navigation" + +You added a new page under `docs/` but didn't add it to `nav:` in +`mkdocs.yml`. Either add it or delete it. + +### "mkdocstrings could not find ..." + +The dotted path under `:::` does not import. mkdocstrings imports the package +in-process; if the import fails (missing optional extra, circular import) the +whole API page fails. Reproduce with: + +```bash +uv run python -c "from redisvl.utils.vectorize.text.openai import OpenAITextVectorizer" +``` + +If it fails, the docs will fail too. Either fix the import or wrap the page's +listing in a different module path. + +## Tests fail with `redis.exceptions.ConnectionError` + +The container is not running: + +```bash +make redis-start +``` + +If `make redis-start` says `Conflict. The container name "/redis" is already +in use`, you have a stopped container; `make redis-stop && make redis-start`. + +## Notebook tests (`make test-notebooks`) fail with output mismatch + +`nbval-lax` compares cell outputs loosely, but it still flags hard +exceptions and changed sentinel values. Common causes: + +- Schema or query API changed and the notebook still calls the old surface — + re-run the notebook locally, save the corrected outputs, commit. +- A newer Redis version changed default behavior (most often around stopwords + or scoring). Either pin the notebook to a Redis version or rewrite the + assertion. +- The SVS-VAMANA notebook (`09_svs_vamana.ipynb`) requires Redis 8.2+. The + Makefile auto-skips it when running against an older container. + +## Type checking fails after adding an optional dependency + +Optional providers (OpenAI, Cohere, etc.) are imported lazily inside the +vectorizer modules. If you add a new top-level import for an optional package, +either: + +- gate it behind `if TYPE_CHECKING:` for type-only imports, or +- wrap it in a try/except `ImportError` and raise a clear error from + `__init__` when the provider is actually used. + +Mypy is configured with `ignore_missing_imports = true`, so you will see the +failure first as a runtime `ImportError`, not a type error. + +## `uv sync` complains about a stale lock + +Someone hand-edited `pyproject.toml`. Re-run the dependency change through uv: + +```bash +uv add # or +uv add --group docs +``` + +That regenerates `uv.lock` consistently. + +## A notebook drifts from the docs + +Three things must agree on every notebook rename or addition: + +1. The notebook file under `docs/user_guide/`. +2. The `nav:` entry in `mkdocs.yml`. +3. The card and quick-reference table entries in + `docs/user_guide/how_to_guides/index.md` and + `docs/user_guide/use_cases/index.md`. + +If you add a notebook and only do (1) + (2), the user-facing index pages will +silently miss the new content; `mkdocs build --strict` will not flag that. diff --git a/docs/for-ais-only/REPOSITORY_MAP.md b/docs/for-ais-only/REPOSITORY_MAP.md new file mode 100644 index 000000000..a5ee5c0f2 --- /dev/null +++ b/docs/for-ais-only/REPOSITORY_MAP.md @@ -0,0 +1,118 @@ +--- +description: Source-tree map of the redisvl repository for AI agents working on the codebase. +--- + +# Repository map + +The redisvl repo is a flat Python package plus the docs and tests. Every public +symbol is reachable from `redisvl.`; sub-modules under those names +are implementation detail and may be reorganized between minor versions. + +## Top level + +| Path | Purpose | +|------|---------| +| `redisvl/` | The library source. | +| `tests/` | Pytest suite. `unit/` is offline; `integration/` requires Redis (via `testcontainers`); `notebooks/` runs the user-guide notebooks. | +| `docs/` | mkdocs source tree (Concepts, User Guide, Examples, API, For AI Agents). | +| `mkdocs.yml` | Site config (Material theme, Redis branding, mkdocstrings, mkdocs-jupyter, llmstxt). | +| `pyproject.toml` | Package metadata, optional extras, dev/docs dep groups. | +| `Makefile` | Convenience targets for install, format, lint, test, docs. | +| `.readthedocs.yaml` | RTD build config (uv install + mkdocs build). | +| `AGENTS.md` | Quick reference for AI agents *using* the library. | +| `CLAUDE.md` | Project conventions surfaced to coding agents. | +| `CONTRIBUTING.md` | Contributor onboarding. | + +## Package layout + +``` +redisvl/ +├── __init__.py # version + public re-exports +├── exceptions.py # public exception classes +├── types.py # type aliases for sync/async redis clients +├── version.py # __version__ source of truth +│ +├── cli/ # `rvl` CLI entry points +│ ├── runner.py # main(); wires sub-commands +│ ├── index.py # `rvl index` (create, list, info, delete) +│ ├── stats.py # `rvl stats` +│ ├── mcp.py # `rvl mcp` +│ └── version.py # `rvl version` +│ +├── extensions/ +│ ├── cache/ # SemanticCache, EmbeddingsCache, LangCacheSemanticCache +│ ├── llmcache/ # legacy alias kept for back-compat imports +│ ├── message_history/ # MessageHistory + SemanticMessageHistory +│ ├── router/ # SemanticRouter, Route, RoutingConfig +│ └── session_manager/ # deprecated alias of message_history +│ +├── index/ +│ ├── index.py # SearchIndex, AsyncSearchIndex +│ └── storage.py # Hash and JSON storage adapters +│ +├── mcp/ # `rvl mcp` server implementation +│ ├── config.py # YAML config loading + env-var substitution +│ ├── server.py # FastMCP server wiring +│ ├── tools/ # search + upsert MCP tool implementations +│ └── filters.py # schema-derived typed filter helpers +│ +├── migration/ # internal migration helpers +│ +├── query/ +│ ├── query.py # VectorQuery, VectorRangeQuery, FilterQuery, CountQuery, TextQuery, MultiVectorQuery, AggregateHybridQuery, Vector +│ ├── hybrid.py # HybridQuery (FT.SEARCH-based hybrid) +│ ├── filter.py # Tag/Text/Num/Geo/GeoRadius filter expressions +│ ├── aggregate.py # AggregateQuery base class +│ └── sql.py # SQLQuery (delegates to sql-redis) +│ +├── redis/ +│ ├── connection.py # client factories, sentinel, cluster helpers +│ ├── constants.py # version constants +│ └── utils.py # bytes/dict conversions, cluster-aware FT helpers +│ +├── schema/ +│ ├── schema.py # IndexSchema, IndexInfo, StorageType +│ ├── fields.py # TextField, TagField, NumericField, GeoField, FlatVectorField, HNSWVectorField, SVSVectorField + *Attributes +│ ├── type_utils.py +│ └── validation.py +│ +└── utils/ + ├── compression.py # CompressionAdvisor, SVSConfig + ├── full_text_query_helper.py + ├── log.py + ├── redis_protocol.py + ├── token_escaper.py + ├── utils.py # deprecated_argument, deprecated_function, sync_wrapper + ├── rerank/ # CohereReranker, HFCrossEncoderReranker, VoyageAIReranker + └── vectorize/ # text/{openai,azureopenai,cohere,huggingface,mistral}, voyageai, vertexai, bedrock, custom +``` + +## Where things are publicly imported from + +User-facing imports use the **subpackage**, never the module: + +```python +from redisvl.index import SearchIndex, AsyncSearchIndex +from redisvl.schema import IndexSchema +from redisvl.query import VectorQuery, FilterQuery, HybridQuery, MultiVectorQuery, Vector +from redisvl.query.filter import Tag, Text, Num, Geo, GeoRadius +from redisvl.extensions.cache.llm import SemanticCache, LangCacheSemanticCache +from redisvl.extensions.message_history import MessageHistory, SemanticMessageHistory +from redisvl.extensions.router import SemanticRouter, Route, RoutingConfig +from redisvl.utils.vectorize import HFTextVectorizer, OpenAITextVectorizer # etc. +from redisvl.utils.rerank import CohereReranker, HFCrossEncoderReranker, VoyageAIReranker +``` + +If you change the **module** something lives in, keep the subpackage import +working: re-export through `__init__.py`. + +## Test layout + +| Path | Scope | +|------|-------| +| `tests/unit/` | Pure unit tests, no Redis. Safe to run anywhere. | +| `tests/integration/` | Spins up Redis via `testcontainers`. Requires Docker. | +| `tests/notebooks/` (via `make test-notebooks`) | Executes every `docs/user_guide/*.ipynb` end-to-end with `nbval-lax`. | + +API-dependent tests (LangCache, paid vectorizer/reranker providers) only run +when invoked with `pytest --run-api-tests`. They require the relevant API keys. diff --git a/docs/for-ais-only/index.md b/docs/for-ais-only/index.md new file mode 100644 index 000000000..beb0af485 --- /dev/null +++ b/docs/for-ais-only/index.md @@ -0,0 +1,46 @@ +--- +description: For AI agents working on the redisvl codebase. Repository map, build and test, failure modes. +--- + +# For AI Agents + +This section is written for AI coding agents working on the redisvl codebase +itself, not for end users of the library. + +If you are an AI agent contributing patches, start here. The user-facing docs +(Concepts, User Guide, API Reference) are the right reading for understanding +what the library does. The pages in this section are about *how the source is +laid out*, *how to build and test it*, and *how it tends to fail*. + +A flat [`AGENTS.md`](https://github.com/redis/redis-vl-python/blob/main/AGENTS.md) +file lives at the repo root with a usage-oriented quick reference for agents +that need to call the library, not contribute to it. + +
+ +- :material-map:{ .lg .middle } **[Repository map](REPOSITORY_MAP.md)** + + --- + + Where every package lives, what it owns, and which tests cover it. + +- :material-hammer-wrench:{ .lg .middle } **[Build and test](BUILD_AND_TEST.md)** + + --- + + The exact `make` targets, environment variables, and Redis fixtures the + test suite expects. + +- :material-bug:{ .lg .middle } **[Failure modes](FAILURE_MODES.md)** + + --- + + The common ways changes break the test suite or surface as runtime errors, + and the canonical fixes. + +
+ +## Machine-readable indexes + +- [`llms.txt`](https://docs.redisvl.com/llms.txt) — short, flat index of every doc page in this site. +- [`llms-full.txt`](https://docs.redisvl.com/llms-full.txt) — full content of every doc page concatenated for one-shot loading. diff --git a/docs/index.md b/docs/index.md index 8ccc795b2..3562ad351 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,21 +1,17 @@ --- -myst: - html_meta: - "description lang=en": | - RedisVL documentation - the AI-native Python client for Redis. -html_theme.sidebar_secondary.remove: false +description: RedisVL documentation. The AI-native Redis Python client for vector search, semantic caching, message history, and more. --- -```{image} _static/Redis_Logo_Red_RGB.svg -:alt: Redis -:width: 240px -:align: center -``` +
-

Redis Vector Library

-

The AI-native Redis Python client

+![Redis](assets/redis-logo-script-red.svg){ .rds-hero__logo } ---- +# Redis Vector Library + +The AI-native Redis Python client +{ .rds-hero__tagline } + +
## Quick Start @@ -29,56 +25,45 @@ docker run -d --name redis -p 6379:6379 redis:8.4 Or connect to [Redis Cloud](https://redis.io/cloud) for a managed experience. -→ *{doc}`/user_guide/01_getting_started`* +→ *[Getting Started](user_guide/01_getting_started.ipynb)* --- ## Explore the Docs -::::{grid} 2 -:gutter: 4 +
-:::{grid-item-card} 📖 Concepts -:link: concepts/index -:link-type: doc -:class-card: sd-shadow-sm +- :material-book-open-variant:{ .lg .middle } **[Concepts](concepts/index.md)** -Understand how RedisVL works. Architecture, search fundamentals, and extension patterns. -::: + --- -:::{grid-item-card} 🚀 User Guides -:link: user_guide/index -:link-type: doc -:class-card: sd-shadow-sm + Understand how RedisVL works. Architecture, search fundamentals, field attributes, query types, and extension patterns. -Step-by-step tutorials. Installation, getting started, and deep dives on every feature. -::: +- :material-rocket-launch:{ .lg .middle } **[User Guide](user_guide/index.md)** -:::{grid-item-card} 💡 Examples -:link: examples/index -:link-type: doc -:class-card: sd-shadow-sm + --- -Real-world applications. RAG pipelines, chatbots, recommendation systems, and more. -::: + Step by step. Installation, getting started, and task-oriented recipes for every feature. -:::{grid-item-card} 📚 API Reference -:link: api/index -:link-type: doc -:class-card: sd-shadow-sm +- :material-lightbulb-on:{ .lg .middle } **[Examples](examples/index.md)** -Complete API documentation. Classes, methods, parameters, and examples. -::: + --- -:::: + Real-world applications. RAG pipelines, chatbots, recommendation systems, and more. -```{toctree} -:maxdepth: 2 -:hidden: +- :material-api:{ .lg .middle } **[API Reference](api/index.md)** -Concepts -User Guides -Examples -API -Changelog -``` + --- + + Every public class, method, and parameter, generated from docstrings. + +
+ +## For AI agents + +If you are an AI agent reading these docs, start with +[`AGENTS.md`](https://github.com/redis/redis-vl-python/blob/main/AGENTS.md) +at the repo root for a usage-oriented quick reference, or +[For AI Agents](for-ais-only/index.md) for an internal map of the source tree. A +flat [`llms.txt`](https://docs.redisvl.com/llms.txt) index of every doc page is +also auto-generated at build time. diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 2119f5109..000000000 --- a/docs/make.bat +++ /dev/null @@ -1,35 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=. -set BUILDDIR=_build - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd diff --git a/docs/stylesheets/redis-brand.css b/docs/stylesheets/redis-brand.css new file mode 100644 index 000000000..72412fb73 --- /dev/null +++ b/docs/stylesheets/redis-brand.css @@ -0,0 +1,91 @@ +/* Redis brand tokens and Material theme overrides for the redisvl docs. + * Mirrors the redis-docs tailwind palette (Redis red #FF4438, Redis ink + * #091A23) and self-hosts the Space Grotesk + Space Mono pairing used on + * redis.io. + */ +@import url("https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=Space+Mono:wght@400;700&display=swap"); + +:root { + /* Mirrors redis-docs tailwind.config.js. */ + --rds-red: #FF4438; /* redis-red-500: primary brand red */ + --rds-red-hover: #D52D1F; /* redis-red-600: hover/pressed */ + --rds-red-bright: #E4291E; /* redis-red-700 */ + --rds-midnight: #091A23; /* redis-ink-900 */ + --rds-ink: #161F31; /* midnight-700 */ + --rds-slate: #2D4754; /* redis-pen-700 */ + --rds-mute: #B9C2C6; /* redis-pen-300 */ + --rds-line: #E8EBEC; /* redis-pen-200 */ + --rds-bg: #FFFFFF; +} + +/* Wire the Redis red into Material's primary/accent slots so the top bar, + * search bar, links, and active nav items pick it up. */ +:root, +[data-md-color-scheme="default"], +[data-md-color-scheme="slate"] { + --md-primary-fg-color: var(--rds-red); + --md-primary-fg-color--light: #FF6B5F; + --md-primary-fg-color--dark: var(--rds-red-hover); + --md-accent-fg-color: var(--rds-red); + --md-accent-fg-color--transparent: rgba(255, 68, 56, 0.1); +} + +/* Bold every top-level entry in the left sidebar. With navigation.sections, + * group labels (Concepts, User Guide, ...) get the section-title treatment, + * but single-page top-level items like Home stay regular weight. This rule + * gives them the same visual weight as the section headers. */ +.md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link { + font-weight: 700; +} + +/* Landing-page hero: Redis script logo stacked over the wordmark and tagline. + * Mirrors the marketing card used on docs.redisvl.com hand-offs. */ +.rds-hero { + text-align: center; + margin: 1.5rem auto 2.5rem; + padding: 0 1rem; +} + +.rds-hero__logo { + display: block; + margin: 0 auto 0.75rem; + width: clamp(180px, 32vw, 280px); + aspect-ratio: 85 / 27; + height: auto; +} + +.rds-hero h1 { + margin: 0; + font-weight: 700; + font-size: clamp(1.5rem, 3.2vw, 2.125rem); + line-height: 1.15; + color: var(--rds-midnight); + letter-spacing: -0.01em; +} + +[data-md-color-scheme="slate"] .rds-hero h1 { + color: #F2F4F5; +} + +.rds-hero__tagline { + margin: 0.5rem 0 0; + font-size: clamp(1rem, 2vw, 1.25rem); + color: var(--rds-slate); + font-weight: 400; +} + +[data-md-color-scheme="slate"] .rds-hero__tagline { + color: var(--rds-mute); +} + +/* Layout: pin the left sidebar to the viewport's left edge and the right + * TOC to the viewport's right edge by removing Material's centered grid + * cap. Sidebars keep their default 12.1rem widths; the content column + * absorbs all remaining space. Header/tabs use the same grid so they + * also span full width, keeping the layout consistent. + */ +@media screen and (min-width: 76.25em) { + .md-grid { + max-width: none; + } +} diff --git a/docs/user_guide/how_to_guides/index.md b/docs/user_guide/how_to_guides/index.md index 08a748978..0b773f51f 100644 --- a/docs/user_guide/how_to_guides/index.md +++ b/docs/user_guide/how_to_guides/index.md @@ -1,49 +1,58 @@ +--- +description: Task-oriented recipes for RedisVL. LLM extensions, querying, embeddings, optimization, storage, and CLI operations. +--- + # How-To Guides How-to guides are **task-oriented** recipes that help you accomplish specific goals. Each guide focuses on solving a particular problem and can be completed independently. -::::{grid} 2 -:gutter: 3 +
+ +- :material-robot:{ .lg .middle } **LLM Extensions** + + --- + + - [Cache LLM Responses](../03_llmcache.ipynb) — semantic caching to reduce costs and latency + - [Use LangCache as the LLM cache](../13_langcache_semantic_cache.ipynb) — managed cache service with LangCache + - [Manage LLM Message History](../07_message_history.ipynb) — persistent chat history with relevancy retrieval + - [Route Queries with SemanticRouter](../08_semantic_router.ipynb) — classify intents and route queries -:::{grid-item-card} 🤖 LLM Extensions +- :material-magnify:{ .lg .middle } **Querying** -- [Cache LLM Responses](../03_llmcache.ipynb) -- semantic caching to reduce costs and latency -- [Use LangCache as the LLM cache](../13_langcache_semantic_cache.ipynb) -- managed cache service with LangCache -- [Manage LLM Message History](../07_message_history.ipynb) -- persistent chat history with relevancy retrieval -- [Route Queries with SemanticRouter](../08_semantic_router.ipynb) -- classify intents and route queries -::: + --- -:::{grid-item-card} 🔍 Querying + - [Query and Filter Data](../02_complex_filtering.ipynb) — combine tag, numeric, geo, and text filters + - [Use Advanced Query Types](../11_advanced_queries.ipynb) — hybrid, multi-vector, range, and text queries + - [Write SQL Queries for Redis](../12_sql_to_redis_queries.ipynb) — translate SQL to Redis query syntax -- [Query and Filter Data](../02_complex_filtering.ipynb) -- combine tag, numeric, geo, and text filters -- [Use Advanced Query Types](../11_advanced_queries.ipynb) -- hybrid, multi-vector, range, and text queries -- [Write SQL Queries for Redis](../12_sql_to_redis_queries.ipynb) -- translate SQL to Redis query syntax -::: +- :material-vector-square:{ .lg .middle } **Embeddings** -:::{grid-item-card} 🧮 Embeddings + --- -- [Create Embeddings with Vectorizers](../04_vectorizers.ipynb) -- OpenAI, Cohere, HuggingFace, and more -- [Cache Embeddings](../10_embeddings_cache.ipynb) -- reduce costs by caching embedding vectors -::: + - [Create Embeddings with Vectorizers](../04_vectorizers.ipynb) — OpenAI, Cohere, HuggingFace, and more + - [Cache Embeddings](../10_embeddings_cache.ipynb) — reduce costs by caching embedding vectors -:::{grid-item-card} ⚡ Optimization +- :material-flash:{ .lg .middle } **Optimization** -- [Rerank Search Results](../06_rerankers.ipynb) -- improve relevance with cross-encoders and rerankers -- [Optimize Indexes with SVS-VAMANA](../09_svs_vamana.ipynb) -- graph-based vector search with compression -::: + --- -:::{grid-item-card} 💾 Storage + - [Rerank Search Results](../06_rerankers.ipynb) — improve relevance with cross-encoders and rerankers + - [Optimize Indexes with SVS-VAMANA](../09_svs_vamana.ipynb) — graph-based vector search with compression -- [Choose a Storage Type](../05_hash_vs_json.ipynb) -- Hash vs JSON formats and nested data -::: +- :material-database:{ .lg .middle } **Storage** -:::{grid-item-card} 💻 CLI Operations + --- -- [Manage Indices with the CLI](../cli.ipynb) -- create, inspect, and delete indices from your terminal -- [Run RedisVL MCP](mcp.md) -- expose an existing Redis index to MCP clients -::: + - [Choose a Storage Type](../05_hash_vs_json.ipynb) — Hash vs JSON formats and nested data -:::: +- :material-console:{ .lg .middle } **CLI & MCP** + + --- + + - [Manage Indices with the CLI](../cli.ipynb) — create, inspect, and delete indices from your terminal + - [Run RedisVL MCP](mcp.md) — expose an existing Redis index to MCP clients + +
## Quick Reference @@ -63,21 +72,3 @@ How-to guides are **task-oriented** recipes that help you accomplish specific go | Decide on storage format | [Choose a Storage Type](../05_hash_vs_json.ipynb) | | Manage indices from terminal | [Manage Indices with the CLI](../cli.ipynb) | | Expose an index through MCP | [Run RedisVL MCP](mcp.md) | - -```{toctree} -:hidden: - -Cache LLM Responses <../03_llmcache> -Use LangCache as the LLM cache <../13_langcache_semantic_cache> -Manage LLM Message History <../07_message_history> -Route Queries with SemanticRouter <../08_semantic_router> -Query and Filter Data <../02_complex_filtering> -Create Embeddings with Vectorizers <../04_vectorizers> -Choose a Storage Type <../05_hash_vs_json> -Rerank Search Results <../06_rerankers> -Optimize Indexes with SVS-VAMANA <../09_svs_vamana> -Cache Embeddings <../10_embeddings_cache> -Use Advanced Query Types <../11_advanced_queries> -Write SQL Queries for Redis <../12_sql_to_redis_queries> -Run RedisVL MCP -``` diff --git a/docs/user_guide/how_to_guides/mcp.md b/docs/user_guide/how_to_guides/mcp.md index 5a1755aa0..818896368 100644 --- a/docs/user_guide/how_to_guides/mcp.md +++ b/docs/user_guide/how_to_guides/mcp.md @@ -1,15 +1,12 @@ --- -myst: - html_meta: - "description lang=en": | - How to run the RedisVL MCP server, configure it, and use its search and upsert tools. +description: Run the RedisVL MCP server, configure it, and use its search and upsert tools. --- # Run RedisVL MCP This guide shows how to run the RedisVL MCP server against an existing Redis index, configure its behavior, and use the MCP tools it exposes. -For the higher-level design, see {doc}`/concepts/mcp`. +For the higher-level design, see [MCP](../../concepts/mcp.md). ## Before You Start @@ -53,9 +50,9 @@ Run it over SSE: uvx --from redisvl[mcp] rvl mcp --config /path/to/mcp.yaml --transport sse --host 0.0.0.0 --port 9000 ``` -```{warning} -Streamable HTTP and SSE endpoints are **unauthenticated by default**. Only bind to public interfaces (`--host 0.0.0.0`) on trusted networks or behind an authenticating reverse proxy. When not using `--read-only`, the `upsert-records` tool is also exposed to any client that can reach the server. -``` +!!! warning + + Streamable HTTP and SSE endpoints are **unauthenticated by default**. Only bind to public interfaces (`--host 0.0.0.0`) on trusted networks or behind an authenticating reverse proxy. When not using `--read-only`, the `upsert-records` tool is also exposed to any client that can reach the server. Run it in read-only mode to expose search without upsert: @@ -167,338 +164,3 @@ indexes: - `vectorizer` is required for query embedding and server-side embedding, but optional for fulltext-only configs - `runtime.max_result_window` caps deep paging by limiting the maximum `offset + limit` - `schema_overrides` is only for patching incomplete field attrs discovered from Redis - -### Fulltext-Only Config - -For a non-vector deployment, omit vector-only settings entirely: - -```yaml -server: - redis_url: ${REDIS_URL} - -indexes: - knowledge: - redis_name: knowledge - - search: - type: fulltext - params: - text_scorer: BM25STD - stopwords: english - - runtime: - text_field_name: content - default_limit: 10 - max_limit: 25 - max_result_window: 1000 - max_upsert_records: 64 - skip_embedding_if_present: true - startup_timeout_seconds: 30 - request_timeout_seconds: 60 - max_concurrency: 16 -``` - -## Tool Contracts - -RedisVL MCP exposes a small, implementation-owned contract. - -### `search-records` - -Arguments: - -- `query` -- `limit` -- `offset` -- `filter` -- `return_fields` - -Example request payload: - -```json -{ - "query": "incident response runbook", - "limit": 2, - "offset": 0, - "filter": { - "and": [ - { "field": "category", "op": "eq", "value": "operations" }, - { "field": "rating", "op": "gte", "value": 4 } - ] - }, - "return_fields": ["title", "content", "category", "rating"] -} -``` - -Example response payload: - -```json -{ - "search_type": "hybrid", - "offset": 0, - "limit": 2, - "results": [ - { - "id": "knowledge:runbook:eu-failover", - "score": 0.82, - "score_type": "hybrid_score", - "record": { - "title": "EU failover runbook", - "content": "Restore traffic after a regional failover.", - "category": "operations", - "rating": 5 - } - } - ] -} -``` - -Notes: - -- `search_type` is response metadata, not a request argument -- when `return_fields` is omitted, RedisVL MCP returns all non-vector fields -- returning the configured vector field is rejected -- `filter` accepts either a raw string or a JSON DSL object -- the `search-records` tool description includes schema-derived hints for typed JSON DSL filter fields, object-filter `exists` support, and valid `return_fields` -- `offset + limit` must stay within `runtime.max_result_window` -- startup rejects schemas that use MCP-reserved score metadata field names: - `id`, `__key`, `key`, `score`, `vector_distance`, `__score`, `text_score`, `vector_similarity`, `hybrid_score` - -### `upsert-records` - -Arguments: - -- `records` -- `id_field` -- `skip_embedding_if_present` - -Example request payload: - -```json -{ - "records": [ - { - "doc_id": "doc-42", - "content": "Updated operational guidance for failover handling.", - "category": "operations", - "rating": 5 - } - ], - "id_field": "doc_id" -} -``` - -Example response payload: - -```json -{ - "status": "success", - "keys_upserted": 1, - "keys": ["knowledge:doc-42"] -} -``` - -Notes: - -- this tool is not registered in read-only mode -- when server-side embedding is configured, records that need embedding must contain `runtime.default_embed_text_field` -- when `skip_embedding_if_present` is `true`, records that already contain the configured vector field can skip re-embedding -- when a vector field is configured but server-side embedding is disabled, callers must supply vectors explicitly - -## Search Examples - -### Read-Only Vector Search - -Use read-only mode when assistants should only retrieve data: - -```bash -uvx --from redisvl[mcp] rvl mcp --config /path/to/mcp.yaml --read-only -``` - -With a `search.type` of `vector`, callers send only the query, filters, pagination, and field projection: - -```json -{ - "query": "cache invalidation incident", - "limit": 3, - "return_fields": ["title", "content", "category"] -} -``` - -### Raw String Filter - -Pass a raw Redis filter string through unchanged: - -```json -{ - "query": "science", - "filter": "@category:{science}", - "return_fields": ["content", "category"] -} -``` - -### JSON DSL Filter - -The DSL supports logical operators and type-checked field operators: - -```json -{ - "query": "science", - "filter": { - "and": [ - { "field": "category", "op": "eq", "value": "science" }, - { "field": "rating", "op": "gte", "value": 4 } - ] - }, - "return_fields": ["content", "category", "rating"] -} -``` - -### Pagination and Field Projection - -```json -{ - "query": "science", - "limit": 1, - "offset": 1, - "return_fields": ["content", "category"] -} -``` - -### Hybrid Search With `schema_overrides` - -Use `schema_overrides` when Redis inspection cannot recover complete vector attrs, then keep hybrid behavior in config: - -```yaml -schema_overrides: - fields: - - name: embedding - type: vector - attrs: - algorithm: flat - dims: 1536 - datatype: float32 - distance_metric: cosine - -search: - type: hybrid - params: - text_scorer: BM25STD - stopwords: english - vector_search_method: KNN - combination_method: LINEAR - linear_text_weight: 0.3 -``` - -The MCP caller still sends the same request shape: - -```json -{ - "query": "legacy cache invalidation flow", - "filter": { "field": "category", "op": "eq", "value": "release-notes" }, - "return_fields": ["title", "content", "release_version"] -} -``` - -## Upsert Examples - -### Auto-Embed New Records - -If a record does not include the configured vector field, RedisVL MCP embeds `runtime.default_embed_text_field` and writes the result: - -```json -{ - "records": [ - { - "content": "First upserted document", - "category": "science", - "rating": 5 - }, - { - "content": "Second upserted document", - "category": "health", - "rating": 4 - } - ] -} -``` - -### Update Existing Records With `id_field` - -```json -{ - "records": [ - { - "doc_id": "doc-1", - "content": "Updated content", - "category": "engineering", - "rating": 5 - } - ], - "id_field": "doc_id" -} -``` - -### Control Re-Embedding With `skip_embedding_if_present` - -```json -{ - "records": [ - { - "doc_id": "doc-2", - "content": "Existing content", - "category": "science", - "rating": 4 - } - ], - "id_field": "doc_id", - "skip_embedding_if_present": false -} -``` - -Set `skip_embedding_if_present` to `false` when you want the server to regenerate embeddings during upsert. In most cases, the caller should omit the vector field and let the server manage embeddings from `runtime.default_embed_text_field`. - -### Plain Writes Without Embedding - -For fulltext-only indexes, `upsert-records` can write records without any vectorizer or vector field configuration: - -```json -{ - "records": [ - { - "content": "Updated FAQ entry", - "category": "support", - "rating": 5 - } - ] -} -``` - -If you configure a vector field but omit server-side embedding support, the caller must send vectors in each record instead of relying on the server to generate them. - -## Troubleshooting - -### Missing MCP Dependencies - -If `rvl mcp` reports missing optional dependencies, install the MCP extra: - -```bash -pip install redisvl[mcp] -``` - -If the configured vectorizer needs a provider SDK, install that provider extra too. Fulltext-only configs can omit the vectorizer entirely. - -### Configured Redis Index Does Not Exist - -The server only binds to an existing index. Create the index first, then point `indexes..redis_name` at that index name. - -### Missing Required Environment Variables - -YAML values support `${VAR}` and `${VAR:-default}` substitution. Missing required variables fail startup before the server registers tools. - -### Vectorizer Dimension Mismatch - -If the vectorizer dims do not match the configured vector field dims, startup fails. Make sure the embedding model and the effective vector field dimensions are aligned. - -### Hybrid Config Requires Native Runtime Support - -Some hybrid params depend on native hybrid support in Redis and redis-py. If your environment does not support that path, remove native-only params such as `knn_ef_runtime` or upgrade Redis and redis-py. diff --git a/docs/user_guide/index.md b/docs/user_guide/index.md index 680abb3fc..75868d708 100644 --- a/docs/user_guide/index.md +++ b/docs/user_guide/index.md @@ -1,85 +1,59 @@ --- -myst: - html_meta: - "description lang=en": | - User guides for RedisVL - Learn how to build AI applications with Redis as your vector database +description: RedisVL user guide. Installation, getting started, how-to guides, CLI reference, and use cases. --- -# Guides +# User Guide -Welcome to the RedisVL guides! Whether you're just getting started or building advanced AI applications, these guides will help you make the most of Redis as your vector database. +RedisVL guides cover everything from installation to advanced AI patterns. Whether you're just getting started or building production workloads, these guides will help you make the most of Redis as your vector database. -::::{grid} 2 -:gutter: 3 +
-:::{grid-item-card} 📦 Installation -:link: installation -:link-type: doc +- :material-package-variant:{ .lg .middle } **[Installation](installation.md)** -**Set up RedisVL.** Install the library and configure your Redis instance for vector search. + --- -+++ -pip install • Redis Cloud • Docker -::: + Set up RedisVL. Install the library and configure your Redis instance for vector search. -:::{grid-item-card} 🚀 Getting Started -:link: 01_getting_started -:link-type: doc + pip install · Redis Cloud · Docker -**New to RedisVL?** Start here to learn the basics and build your first vector search application in minutes. +- :material-rocket-launch:{ .lg .middle } **[Getting Started](01_getting_started.ipynb)** -+++ -Schema → Index → Load → Query -::: + --- -:::{grid-item-card} 🛠️ How-To Guides -:link: how_to_guides/index -:link-type: doc + New to RedisVL? Start here to learn the basics and build your first vector search application in minutes. -**Solve specific problems.** Task-oriented recipes for LLM extensions, querying, embeddings, optimization, and storage. + Schema → Index → Load → Query -+++ -LLM Caching • Filtering • MCP • Reranking -::: +- :material-tools:{ .lg .middle } **[How-To Guides](how_to_guides/index.md)** -:::{grid-item-card} 🧠 MCP Setup -:link: how_to_guides/mcp -:link-type: doc + --- -**Expose Redis through MCP.** Run the RedisVL MCP server, configure one existing index, and use search or optional upsert tools. + Solve specific problems. Task-oriented recipes for LLM extensions, querying, embeddings, optimization, and storage. -+++ -stdio, HTTP, SSE • One index • Search and upsert -::: + LLM Caching · Filtering · MCP · Reranking -:::{grid-item-card} 💻 CLI Reference -:link: cli -:link-type: doc +- :material-robot:{ .lg .middle } **[MCP Setup](how_to_guides/mcp.md)** -**Command-line tools.** Manage indices, inspect stats, and work with schemas using the `rvl` CLI. + --- -+++ -rvl index • rvl stats • Schema YAML -::: + Expose Redis through MCP. Run the RedisVL MCP server, configure one existing index, and use search or optional upsert tools. -:::{grid-item-card} 💡 Use Cases -:link: use_cases/index -:link-type: doc + stdio · HTTP · SSE -**Apply RedisVL to real-world problems.** See which guides map to your use case. +- :material-console:{ .lg .middle } **[CLI Reference](cli.ipynb)** -+++ -Agent Context • Agent Optimization • Search • RecSys -::: + --- -:::: + Command-line tools. Manage indices, inspect stats, and work with schemas using the `rvl` CLI. -```{toctree} -:maxdepth: 2 + rvl index · rvl stats · Schema YAML -Installation -Getting Started <01_getting_started> -how_to_guides/index -CLI Reference -use_cases/index -``` +- :material-lightbulb-on:{ .lg .middle } **[Use Cases](use_cases/index.md)** + + --- + + Apply RedisVL to real-world problems. See which guides map to your use case. + + Agent Context · Agent Optimization · Search · RecSys + +
diff --git a/docs/user_guide/installation.md b/docs/user_guide/installation.md index d0aed6cec..84d2228ec 100644 --- a/docs/user_guide/installation.md +++ b/docs/user_guide/installation.md @@ -1,10 +1,3 @@ ---- -myst: - html_meta: - "description lang=en": | - Installation instructions for RedisVL ---- - # Install RedisVL There are a few ways to install RedisVL. The easiest way is to use pip. @@ -14,7 +7,7 @@ There are a few ways to install RedisVL. The easiest way is to use pip. Install `redisvl` into your Python (>=3.10) environment using `pip`: ```bash -$ pip install -U redisvl +pip install -U redisvl ``` RedisVL comes with a few dependencies that are automatically installed, however, several optional @@ -22,36 +15,36 @@ dependencies can be installed separately based on your needs: ```bash # Vectorizer providers -$ pip install redisvl[openai] # OpenAI embeddings -$ pip install redisvl[cohere] # Cohere embeddings and reranking -$ pip install redisvl[mistralai] # Mistral AI embeddings -$ pip install redisvl[voyageai] # Voyage AI embeddings and reranking -$ pip install redisvl[sentence-transformers] # HuggingFace local embeddings -$ pip install redisvl[vertexai] # Google Vertex AI embeddings -$ pip install redisvl[bedrock] # AWS Bedrock embeddings +pip install redisvl[openai] # OpenAI embeddings +pip install redisvl[cohere] # Cohere embeddings and reranking +pip install redisvl[mistralai] # Mistral AI embeddings +pip install redisvl[voyageai] # Voyage AI embeddings and reranking +pip install redisvl[sentence-transformers] # HuggingFace local embeddings +pip install redisvl[vertexai] # Google Vertex AI embeddings +pip install redisvl[bedrock] # AWS Bedrock embeddings # Other optional features -$ pip install redisvl[mcp] # RedisVL MCP server support (Python 3.10+) -$ pip install redisvl[langcache] # LangCache managed service integration -$ pip install redisvl[sql-redis] # SQL query support +pip install redisvl[mcp] # RedisVL MCP server support (Python 3.10+) +pip install redisvl[langcache] # LangCache managed service integration +pip install redisvl[sql-redis] # SQL query support ``` If you use ZSH, remember to escape the brackets: ```bash -$ pip install redisvl\[openai\] +pip install redisvl\[openai\] ``` You can install multiple optional dependencies at once: ```bash -$ pip install redisvl[mcp,openai,cohere,sentence-transformers] +pip install redisvl[mcp,openai,cohere,sentence-transformers] ``` To install **all** optional dependencies at once: ```bash -$ pip install redisvl[all] +pip install redisvl[all] ``` ## Install RedisVL from Source @@ -59,11 +52,11 @@ $ pip install redisvl[all] To install RedisVL from source, clone the repository and install the package using `pip`: ```bash -$ git clone https://github.com/redis/redis-vl-python.git && cd redis-vl-python -$ pip install . +git clone https://github.com/redis/redis-vl-python.git && cd redis-vl-python +pip install . # or for an editable installation (for developers of RedisVL) -$ pip install -e . +pip install -e . ``` ## Development Installation @@ -72,16 +65,16 @@ For contributors who want to develop RedisVL, we recommend using [uv](https://do ```bash # Clone the repository -$ git clone https://github.com/redis/redis-vl-python.git && cd redis-vl-python +git clone https://github.com/redis/redis-vl-python.git && cd redis-vl-python # Install uv if you don't have it -$ pip install uv +pip install uv # Install all dependencies (including dev and docs) -$ uv sync +uv sync # Or use make -$ make install +make install ``` This installs the package in editable mode along with all development dependencies (testing, linting, type checking) and documentation dependencies. @@ -90,19 +83,19 @@ This installs the package in editable mode along with all development dependenci ```bash # Run tests (no external APIs required) -$ make test +make test # Run all tests (includes API-dependent tests) -$ make test-all +make test-all # Format code -$ make format +make format # Run type checking -$ make check-types +make check-types # Run full check (lint + test) -$ make check +make check ``` ### Pre-commit Hooks @@ -110,27 +103,26 @@ $ make check We use pre-commit hooks to ensure code quality. Install them with: ```bash -$ pre-commit install +pre-commit install ``` Run hooks manually on all files: ```bash -$ pre-commit run --all-files +pre-commit run --all-files ``` ## Installing Redis RedisVL requires Redis with [Redis Search](https://redis.io/docs/latest/develop/ai/search-and-query/) available. There are several options: -1. [Redis Cloud](https://redis.io/cloud), a fully managed cloud offering with a free tier -2. [Redis 8+ (Docker)](https://redis.io/downloads/), for local development and testing -3. [Redis Enterprise](https://redis.com/redis-enterprise/), a commercial self-hosted option +1. [Redis Cloud](https://redis.io/cloud) — a fully managed cloud offering with a free tier +2. [Redis 8+ (Docker)](https://redis.io/downloads/) — for local development and testing +3. [Redis Enterprise](https://redis.com/redis-enterprise/) — a commercial self-hosted option ### Redis Cloud -Redis Cloud is the easiest way to get started with RedisVL. You can sign up for a free account [here](https://redis.io/cloud). Make sure to have `Redis Search` -enabled when creating your database. +Redis Cloud is the easiest way to get started with RedisVL. You can sign up for a free account [here](https://redis.io/cloud). Make sure to have **Redis Search** enabled when creating your database. ### Redis 8+ (local development) @@ -142,6 +134,7 @@ docker run -d --name redis -p 6379:6379 redis:8.4 Redis 8 includes Redis Search and built-in vector search capabilities. + ### Redis Enterprise (self-hosted) Redis Enterprise is a commercial offering that can be self-hosted. You can download the latest version [here](https://redis.io/downloads/). @@ -159,19 +152,19 @@ from redisvl.index import SearchIndex, AsyncSearchIndex # Format: redis+sentinel://[username:password@]host1:port1,host2:port2/service_name[/db] index = SearchIndex.from_yaml( "schema.yaml", - redis_url="redis+sentinel://sentinel1:26379,sentinel2:26379/mymaster" + redis_url="redis+sentinel://sentinel1:26379,sentinel2:26379/mymaster", ) # Async connection via Sentinel async_index = AsyncSearchIndex.from_yaml( "schema.yaml", - redis_url="redis+sentinel://sentinel1:26379,sentinel2:26379/mymaster" + redis_url="redis+sentinel://sentinel1:26379,sentinel2:26379/mymaster", ) # With authentication and database selection index = SearchIndex.from_yaml( "schema.yaml", - redis_url="redis+sentinel://user:pass@sentinel1:26379,sentinel2:26379/mymaster/0" + redis_url="redis+sentinel://user:pass@sentinel1:26379,sentinel2:26379/mymaster/0", ) ``` diff --git a/docs/user_guide/use_cases/index.md b/docs/user_guide/use_cases/index.md index 121809227..d4877a0a9 100644 --- a/docs/user_guide/use_cases/index.md +++ b/docs/user_guide/use_cases/index.md @@ -1,40 +1,51 @@ +--- +description: Apply RedisVL to real-world AI workloads. Agent context, optimization, search, recommendations. +--- + # Use Cases RedisVL powers a wide range of AI applications. Here's how to apply its features to common use cases. -::::{grid} 2 -:gutter: 3 +
+ +- :material-brain:{ .lg .middle } **Agent Context** + + --- + + Provide agents with the right information at the right time. + + - **RAG** — Retrieval-Augmented Generation with [vector search](../01_getting_started.ipynb) and [hybrid queries](../11_advanced_queries.ipynb) + - **Memory** — Persistent [message history](../07_message_history.ipynb) across sessions + - **Context Engineering** — Combine [filtering](../02_complex_filtering.ipynb), [reranking](../06_rerankers.ipynb), and [embeddings](../04_vectorizers.ipynb) to curate the optimal context window + +- :material-flash:{ .lg .middle } **Agent Optimization** + + --- + + Reduce latency and cost for AI workloads. + + - **Semantic Caching** — Cache LLM responses by meaning with [SemanticCache](../03_llmcache.ipynb) + - **Embeddings Caching** — Avoid redundant embedding calls with [EmbeddingsCache](../10_embeddings_cache.ipynb) + - **Semantic Routing** — Route queries to the right handler with [SemanticRouter](../08_semantic_router.ipynb) -:::{grid-item-card} 🧠 Agent Context -Provide agents with the right information at the right time. +- :material-magnify:{ .lg .middle } **General Search** -- **RAG** -- Retrieval-Augmented Generation with [vector search](../01_getting_started.ipynb) and [hybrid queries](../11_advanced_queries.ipynb) -- **Memory** -- Persistent [message history](../07_message_history.ipynb) across sessions -- **Context Engineering** -- Combine [filtering](../02_complex_filtering.ipynb), [reranking](../06_rerankers.ipynb), and [embeddings](../04_vectorizers.ipynb) to curate the optimal context window -::: + --- -:::{grid-item-card} ⚡ Agent Optimization -Reduce latency and cost for AI workloads. + Build search experiences that understand meaning, not just keywords. -- **Semantic Caching** -- Cache LLM responses by meaning with [SemanticCache](../03_llmcache.ipynb) -- **Embeddings Caching** -- Avoid redundant embedding calls with [EmbeddingsCache](../10_embeddings_cache.ipynb) -- **Semantic Routing** -- Route queries to the right handler with [SemanticRouter](../08_semantic_router.ipynb) -::: + - **Semantic Search** — [Vector queries](../01_getting_started.ipynb) with [complex filtering](../02_complex_filtering.ipynb) + - **Hybrid Search** — Combine keyword and vector search with [advanced query types](../11_advanced_queries.ipynb) + - **SQL Translation** — Use familiar SQL syntax with [SQLQuery](../12_sql_to_redis_queries.ipynb) -:::{grid-item-card} 🔍 General Search -Build search experiences that understand meaning, not just keywords. +- :material-account-multiple:{ .lg .middle } **Personalization & RecSys** -- **Semantic Search** -- [Vector queries](../01_getting_started.ipynb) with [complex filtering](../02_complex_filtering.ipynb) -- **Hybrid Search** -- Combine keyword and vector search with [advanced query types](../11_advanced_queries.ipynb) -- **SQL Translation** -- Use familiar SQL syntax with [SQLQuery](../12_sql_to_redis_queries.ipynb) -::: + --- -:::{grid-item-card} 🎯 Personalization & RecSys -Drive engagement with personalized recommendations. + Drive engagement with personalized recommendations. -- **User Similarity** -- Find similar users or items using [vector search](../01_getting_started.ipynb) -- **Real-Time Ranking** -- Combine vector similarity with [metadata filtering](../02_complex_filtering.ipynb) and [reranking](../06_rerankers.ipynb) -- **Multi-Signal Matching** -- Search across multiple embedding fields with [MultiVectorQuery](../11_advanced_queries.ipynb) -::: + - **User Similarity** — Find similar users or items using [vector search](../01_getting_started.ipynb) + - **Real-Time Ranking** — Combine vector similarity with [metadata filtering](../02_complex_filtering.ipynb) and [reranking](../06_rerankers.ipynb) + - **Multi-Signal Matching** — Search across multiple embedding fields with [MultiVectorQuery](../11_advanced_queries.ipynb) -:::: +
diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 000000000..5cf397d8b --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,217 @@ +site_name: Redis Vector Library +site_description: The AI-native Redis Python client. Vector search, semantic caching, message history, and more. +site_url: https://docs.redisvl.com/ +repo_url: https://github.com/redis/redis-vl-python +repo_name: redis/redis-vl-python +edit_uri: edit/main/docs/ +copyright: Copyright © 2026 Redis Inc. + +docs_dir: docs + +theme: + name: material + language: en + logo: assets/redis-logo-script.svg + favicon: assets/favicon.png + font: + text: Space Grotesk + code: Space Mono + palette: + - media: "(prefers-color-scheme)" + toggle: + icon: material/brightness-auto + name: Switch to light mode + - media: "(prefers-color-scheme: light)" + scheme: default + primary: custom + accent: custom + toggle: + icon: material/brightness-7 + name: Switch to dark mode + - media: "(prefers-color-scheme: dark)" + scheme: slate + primary: custom + accent: custom + toggle: + icon: material/brightness-4 + name: Switch to system preference + features: + - navigation.instant + - navigation.instant.progress + - navigation.tracking + - navigation.sections + - navigation.indexes + - navigation.top + - navigation.footer + - toc.follow + - search.suggest + - search.highlight + - search.share + - content.code.copy + - content.code.annotate + - content.tabs.link + - content.action.edit + - content.action.view + - content.tooltips + icon: + repo: fontawesome/brands/github + edit: material/pencil + view: material/eye + +extra: + social: + - icon: fontawesome/brands/github + link: https://github.com/redis/redis-vl-python + - icon: fontawesome/brands/python + link: https://pypi.org/project/redisvl/ + +extra_css: + - stylesheets/redis-brand.css + +plugins: + - search + - autorefs + - section-index + - git-revision-date-localized: + enable_creation_date: false + type: timeago + fallback_to_build_date: true + - mkdocstrings: + default_handler: python + handlers: + python: + paths: [.] + options: + docstring_style: google + show_source: true + show_root_heading: true + show_root_full_path: false + show_symbol_type_heading: true + show_symbol_type_toc: true + members_order: source + separate_signature: true + show_signature_annotations: true + signature_crossrefs: true + merge_init_into_class: true + docstring_section_style: table + inherited_members: true + filters: + - "!^_" + - mkdocs-jupyter: + execute: false + include_source: true + ignore_h1_titles: true + remove_tag_config: + remove_input_tags: + - hide_input + remove_cell_tags: + - hide_cell + - llmstxt: + full_output: llms-full.txt + sections: + Concepts: + - concepts/*.md + User Guide: + - user_guide/*.md + - user_guide/how_to_guides/*.md + - user_guide/use_cases/*.md + API Reference: + - api/*.md + For AI Agents: + - for-ais-only/*.md + - redirects: + redirect_maps: {} + +markdown_extensions: + - abbr + - admonition + - attr_list + - def_list + - footnotes + - md_in_html + - tables + - toc: + permalink: true + toc_depth: 3 + - pymdownx.betterem + - pymdownx.caret + - pymdownx.details + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg + - pymdownx.highlight: + anchor_linenums: true + line_spans: __span + pygments_lang_class: true + - pymdownx.inlinehilite + - pymdownx.keys + - pymdownx.mark + - pymdownx.smartsymbols + - pymdownx.snippets + - pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format + - pymdownx.tabbed: + alternate_style: true + slugify: !!python/object/apply:pymdownx.slugs.slugify {kwds: {case: lower}} + - pymdownx.tasklist: + custom_checkbox: true + - pymdownx.tilde + +watch: + - redisvl + - AGENTS.md + +nav: + - Home: index.md + - Concepts: + - concepts/index.md + - Architecture: concepts/architecture.md + - Search and indexing: concepts/search-and-indexing.md + - Field attributes: concepts/field-attributes.md + - Query types: concepts/queries.md + - Utilities: concepts/utilities.md + - MCP: concepts/mcp.md + - Extensions: concepts/extensions.md + - User Guide: + - user_guide/index.md + - Installation: user_guide/installation.md + - Getting Started: user_guide/01_getting_started.ipynb + - How-To Guides: + - user_guide/how_to_guides/index.md + - Cache LLM Responses: user_guide/03_llmcache.ipynb + - Use LangCache: user_guide/13_langcache_semantic_cache.ipynb + - Manage LLM Message History: user_guide/07_message_history.ipynb + - Route Queries with SemanticRouter: user_guide/08_semantic_router.ipynb + - Query and Filter Data: user_guide/02_complex_filtering.ipynb + - Use Advanced Query Types: user_guide/11_advanced_queries.ipynb + - Write SQL Queries for Redis: user_guide/12_sql_to_redis_queries.ipynb + - Create Embeddings with Vectorizers: user_guide/04_vectorizers.ipynb + - Cache Embeddings: user_guide/10_embeddings_cache.ipynb + - Rerank Search Results: user_guide/06_rerankers.ipynb + - Optimize Indexes with SVS-VAMANA: user_guide/09_svs_vamana.ipynb + - Choose a Storage Type: user_guide/05_hash_vs_json.ipynb + - Manage Indices with the CLI: user_guide/cli.ipynb + - Run RedisVL MCP: user_guide/how_to_guides/mcp.md + - Use Cases: user_guide/use_cases/index.md + - Examples: examples/index.md + - API Reference: + - api/index.md + - Schema: api/schema.md + - Search Index: api/searchindex.md + - Vector: api/vector.md + - Query: api/query.md + - Filter: api/filter.md + - Vectorizer: api/vectorizer.md + - Reranker: api/reranker.md + - Cache: api/cache.md + - Message History: api/message_history.md + - Router: api/router.md + - For AI Agents: + - for-ais-only/index.md + - Repository map: for-ais-only/REPOSITORY_MAP.md + - Build and test: for-ais-only/BUILD_AND_TEST.md + - Failure modes: for-ais-only/FAILURE_MODES.md + - Changelog: https://github.com/redis/redis-vl-python/releases diff --git a/pyproject.toml b/pyproject.toml index a891362e7..47ec82cc4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -106,14 +106,15 @@ dev = [ "langcache>=0.9.0", ] docs = [ - "sphinx>=4.4.0", - "sphinx-book-theme>=1.0.0", - "nbsphinx>=0.9.3,<0.10", - "jinja2>=3.1.3,<4", - "sphinx-copybutton>=0.5.2,<0.6", - "sphinx-favicon>=1.0.1,<2", - "sphinx-design>=0.5.0,<0.6", - "myst-nb>=1.1.0,<2", + "mkdocs>=1.6", + "mkdocs-autorefs>=1.2", + "mkdocs-git-revision-date-localized-plugin>=1.2", + "mkdocs-jupyter>=0.25", + "mkdocs-llmstxt>=0.2", + "mkdocs-material>=9.5", + "mkdocs-redirects>=1.2", + "mkdocs-section-index>=0.3", + "mkdocstrings[python]>=0.26", ] [tool.uv] diff --git a/redisvl/extensions/cache/llm/langcache.py b/redisvl/extensions/cache/llm/langcache.py index f41c748e7..b1620e9d3 100644 --- a/redisvl/extensions/cache/llm/langcache.py +++ b/redisvl/extensions/cache/llm/langcache.py @@ -569,7 +569,7 @@ def update(self, key: str, **kwargs) -> None: Args: key (str): The key of the document to update. - **kwargs: Field-value pairs to update. + **kwargs (Any): Field-value pairs to update. Raises: NotImplementedError: LangCache does not support entry updates. @@ -587,7 +587,7 @@ async def aupdate(self, key: str, **kwargs) -> None: Args: key (str): The key of the document to update. - **kwargs: Field-value pairs to update. + **kwargs (Any): Field-value pairs to update. Raises: NotImplementedError: LangCache does not support entry updates. diff --git a/redisvl/extensions/cache/llm/semantic.py b/redisvl/extensions/cache/llm/semantic.py index 096e08d6d..04a1adb12 100644 --- a/redisvl/extensions/cache/llm/semantic.py +++ b/redisvl/extensions/cache/llm/semantic.py @@ -372,7 +372,7 @@ def check( return_fields (Optional[List[str]], optional): The fields to include in each returned result. If None, defaults to all available fields in the cached entry. - filter_expression (Optional[FilterExpression]) : Optional filter expression + filter_expression (Optional[FilterExpression]): Optional filter expression that can be used to filter cache results. Defaults to None and the full cache will be searched. distance_threshold (Optional[float]): The threshold for semantic @@ -463,7 +463,7 @@ async def acheck( return_fields (Optional[List[str]], optional): The fields to include in each returned result. If None, defaults to all available fields in the cached entry. - filter_expression (Optional[FilterExpression]) : Optional filter expression + filter_expression (Optional[FilterExpression]): Optional filter expression that can be used to filter cache results. Defaults to None and the full cache will be searched. distance_threshold (Optional[float]): The threshold for semantic @@ -704,8 +704,8 @@ def update(self, key: str, **kwargs) -> None: key (str): the key of the document to update using kwargs. Raises: - ValueError if an incorrect mapping is provided as a kwarg. - TypeError if metadata is provided and not of type dict. + ValueError: if an incorrect mapping is provided as a kwarg. + TypeError: if metadata is provided and not of type dict. .. code-block:: python @@ -745,8 +745,8 @@ async def aupdate(self, key: str, **kwargs) -> None: key (str): the key of the document to update using kwargs. Raises: - ValueError if an incorrect mapping is provided as a kwarg. - TypeError if metadata is provided and not of type dict. + ValueError: if an incorrect mapping is provided as a kwarg. + TypeError: if metadata is provided and not of type dict. .. code-block:: python diff --git a/redisvl/extensions/message_history/semantic_history.py b/redisvl/extensions/message_history/semantic_history.py index 319cc0e3b..46ef56a63 100644 --- a/redisvl/extensions/message_history/semantic_history.py +++ b/redisvl/extensions/message_history/semantic_history.py @@ -202,7 +202,7 @@ def get_relevant( Args: prompt (str): The message text to search for in message history as_text (bool): Whether to return the prompts and responses as text - or as JSON. + or as JSON. top_k (int): The number of previous messages to return. Default is 5. session_tag (Optional[str]): Tag of the entries linked to a specific conversation session. Defaults to instance ULID. diff --git a/redisvl/extensions/router/semantic.py b/redisvl/extensions/router/semantic.py index 53767040b..4e8989349 100644 --- a/redisvl/extensions/router/semantic.py +++ b/redisvl/extensions/router/semantic.py @@ -710,7 +710,7 @@ def add_route_references( """Add a reference(s) to an existing route. Args: - router_name (str): The name of the router. + route_name (str): The name of the route. references (Union[str, List[str]]): The reference or list of references to add. Returns: @@ -774,8 +774,9 @@ def get_route_references( """Get references for an existing route route. Args: - router_name (str): The name of the router. - references (Union[str, List[str]]): The reference or list of references to add. + route_name (str): The name of the route. + reference_ids (List[str]): The list of reference ids to fetch. + keys (List[str]): The list of fully qualified keys to fetch. Returns: List[Dict[str, Any]]]: Reference objects stored @@ -810,9 +811,9 @@ def delete_route_references( """Get references for an existing semantic router route. Args: - router_name Optional(str): The name of the router. - reference_ids Optional(List[str]]): The reference or list of references to delete. - keys Optional(List[str]]): List of fully qualified keys (prefix:router:reference_id) to delete. + route_name (Optional[str]): The name of the route. + reference_ids (Optional[List[str]]): The reference or list of references to delete. + keys (Optional[List[str]]): List of fully qualified keys (prefix:router:reference_id) to delete. Returns: int: Number of objects deleted diff --git a/redisvl/index/index.py b/redisvl/index/index.py index 4d7a871ba..ac9769ec3 100644 --- a/redisvl/index/index.py +++ b/redisvl/index/index.py @@ -337,14 +337,14 @@ def storage_type(self) -> StorageType: return self.schema.index.storage_type @classmethod - def from_yaml(cls, schema_path: str, **kwargs): + def from_yaml(cls, schema_path: str, **kwargs) -> "BaseSearchIndex": """Create a SearchIndex from a YAML schema file. Args: schema_path (str): Path to the YAML schema file. Returns: - SearchIndex: A RedisVL SearchIndex object. + A RedisVL SearchIndex object. .. code-block:: python @@ -356,14 +356,14 @@ def from_yaml(cls, schema_path: str, **kwargs): return cls(schema=schema, **kwargs) @classmethod - def from_dict(cls, schema_dict: dict[str, Any], **kwargs): + def from_dict(cls, schema_dict: dict[str, Any], **kwargs) -> "BaseSearchIndex": """Create a SearchIndex from a dictionary. Args: schema_dict (Dict[str, Any]): A dictionary containing the schema. Returns: - SearchIndex: A RedisVL SearchIndex object. + A RedisVL SearchIndex object. .. code-block:: python diff --git a/redisvl/query/query.py b/redisvl/query/query.py index ef7d0fc49..d34d5c552 100644 --- a/redisvl/query/query.py +++ b/redisvl/query/query.py @@ -256,17 +256,19 @@ def _query_string(self, value: str | None): """Setter for _query_string to maintain compatibility with parent class.""" self._built_query_string = value - def return_fields(self, *fields, skip_decode: str | list[str] | None = None): + def return_fields( + self, *fields, skip_decode: str | list[str] | None = None + ) -> "BaseQuery": """ Set the fields to return with search results. Args: - *fields: Variable number of field names to return. + *fields (str): Variable number of field names to return. skip_decode: Optional field name or list of field names that should not be decoded. Useful for binary data like embeddings. Returns: - self: Returns the query object for method chaining. + The query object for method chaining. Raises: TypeError: If skip_decode is not a string, list, or None. @@ -1593,7 +1595,7 @@ def set_text_weights(self, weights: dict[str, float]): """Set or update the text weights for the query. Args: - text_weights: Dictionary of word:weight mappings + weights: Dictionary of word:weight mappings """ self._text_weights = self._parse_text_weights(weights) self._built_query_string = None diff --git a/redisvl/utils/vectorize/base.py b/redisvl/utils/vectorize/base.py index ee6437b31..2ac81180f 100644 --- a/redisvl/utils/vectorize/base.py +++ b/redisvl/utils/vectorize/base.py @@ -2,7 +2,7 @@ import logging from enum import Enum from pathlib import Path -from typing import Annotated, Any, Callable +from typing import Annotated, Any, Callable, Generator from pydantic import BaseModel, ConfigDict, Field, field_validator @@ -85,7 +85,7 @@ def embed( preprocess: Function to apply to the content before embedding as_buffer: Return the embedding as a binary buffer instead of a list skip_cache: Bypass the cache for this request - **kwargs: Additional model-specific parameters + **kwargs (Any): Additional model-specific parameters Returns: The vector embedding as either a list of floats or binary buffer @@ -155,7 +155,7 @@ def embed_many( batch_size: Number of items to process in each API call as_buffer: Return embeddings as binary buffers instead of lists skip_cache: Bypass the cache for this request - **kwargs: Additional model-specific parameters + **kwargs (Any): Additional model-specific parameters Returns: List of vector embeddings in the same order as the inputs @@ -215,7 +215,7 @@ async def aembed( preprocess: Function to apply to the content before embedding as_buffer: Return the embedding as a binary buffer instead of a list skip_cache: Bypass the cache for this request - **kwargs: Additional model-specific parameters + **kwargs (Any): Additional model-specific parameters Returns: The vector embedding as either a list of floats or binary buffer @@ -288,7 +288,7 @@ async def aembed_many( batch_size: Number of texts to process in each API call as_buffer: Return embeddings as binary buffers instead of lists skip_cache: Bypass the cache for this request - **kwargs: Additional model-specific parameters + **kwargs (Any): Additional model-specific parameters Returns: List of vector embeddings in the same order as the inputs @@ -532,7 +532,9 @@ async def _astore_in_cache_batch( f"Error storing batch in embedding cache asynchronously: {str(e)}" ) - def batchify(self, seq: list, size: int, preprocess: Callable | None = None): + def batchify( + self, seq: list, size: int, preprocess: Callable | None = None + ) -> Generator[list, None, None]: """Split a sequence into batches of specified size. Args: @@ -541,7 +543,7 @@ def batchify(self, seq: list, size: int, preprocess: Callable | None = None): preprocess: Optional function to preprocess each item Yields: - Batches of the sequence + Batches of the sequence. """ for pos in range(0, len(seq), size): if preprocess is not None: diff --git a/redisvl/utils/vectorize/text/huggingface.py b/redisvl/utils/vectorize/text/huggingface.py index 5fb6e8bc4..6ac08c2bf 100644 --- a/redisvl/utils/vectorize/text/huggingface.py +++ b/redisvl/utils/vectorize/text/huggingface.py @@ -89,7 +89,7 @@ def __init__( Defaults to 'float32'. cache (Optional[EmbeddingsCache]): Optional EmbeddingsCache instance to cache embeddings for better performance with repeated texts. Defaults to None. - **kwargs: Additional parameters to pass to the SentenceTransformer + **kwargs (Any): Additional parameters to pass to the SentenceTransformer constructor. Raises: diff --git a/uv.lock b/uv.lock index 7dd88824c..fe612ae2a 100644 --- a/uv.lock +++ b/uv.lock @@ -9,18 +9,6 @@ resolution-markers = [ "python_full_version < '3.11'", ] -[[package]] -name = "accessible-pygments" -version = "0.0.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pygments" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/bc/c1/bbac6a50d02774f91572938964c582fff4270eee73ab822a4aeea4d8b11b/accessible_pygments-0.0.5.tar.gz", hash = "sha256:40918d3e6a2b619ad424cb91e556bd3bd8865443d9f22f1dcdf79e33c8046872", size = 1377899, upload-time = "2024-05-10T11:23:10.216Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl", hash = "sha256:88ae3211e68a1d0b011504b2ffc1691feafce124b845bd072ab6f9f66f34d4b7", size = 1395903, upload-time = "2024-05-10T11:23:08.421Z" }, -] - [[package]] name = "aiofile" version = "3.9.0" @@ -184,15 +172,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, ] -[[package]] -name = "alabaster" -version = "0.7.16" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c9/3e/13dd8e5ed9094e734ac430b5d0eb4f2bb001708a8b7856cbf8e084e001ba/alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", size = 23776, upload-time = "2024-01-10T00:56:10.189Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92", size = 13511, upload-time = "2024-01-10T00:56:08.388Z" }, -] - [[package]] name = "annotated-types" version = "0.7.0" @@ -279,11 +258,11 @@ wheels = [ [[package]] name = "babel" -version = "2.17.0" +version = "2.18.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, + { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, ] [[package]] @@ -295,6 +274,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", size = 30181, upload-time = "2024-05-28T17:01:53.112Z" }, ] +[[package]] +name = "backrefs" +version = "7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/a7dd63622beef68cc0d3c3c36d472e143dd95443d5ebf14cd1a5b4dfbf11/backrefs-7.0.tar.gz", hash = "sha256:4989bb9e1e99eb23647c7160ed51fb21d0b41b5d200f2d3017da41e023097e82", size = 7012453, upload-time = "2026-04-28T16:28:04.215Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/39/39a31d7eae729ea14ed10c3ccef79371197177b9355a86cb3525709e8502/backrefs-7.0-py310-none-any.whl", hash = "sha256:b57cd227ea556b0aed3dc9b8da4628db4eabc0402c6d7fcfc69283a93955f7e9", size = 380824, upload-time = "2026-04-28T16:27:55.647Z" }, + { url = "https://files.pythonhosted.org/packages/c9/b5/9302644225ba7dfa934a2ff2b9c7bb85701313a90dddb3dfaf693fa5bae2/backrefs-7.0-py311-none-any.whl", hash = "sha256:a0fa7360c63509e9e077e174ef4e6d3c21c8db94189b9d957289ae6d794b9475", size = 392626, upload-time = "2026-04-28T16:27:57.42Z" }, + { url = "https://files.pythonhosted.org/packages/36/da/87912ddec6e06feffbaa3d7aa18fc6352bee2e8f1fee185d7d1690f8f4e8/backrefs-7.0-py312-none-any.whl", hash = "sha256:ca42ce6a49ace3d75684dfa9937f3373902a63284ecb385ce36d15e5dcb41c12", size = 398537, upload-time = "2026-04-28T16:27:58.913Z" }, + { url = "https://files.pythonhosted.org/packages/00/bb/90ba423612b6aa0adccc6b1874bcd4a9b44b660c0c16f346611e00f64ac3/backrefs-7.0-py313-none-any.whl", hash = "sha256:f2c52955d631b9e1ac4cd56209f0a3a946d592b98e7790e77699339ae01c102a", size = 400491, upload-time = "2026-04-28T16:28:00.928Z" }, + { url = "https://files.pythonhosted.org/packages/3e/5c/fb93d3092640a24dfb7bd7727a24016d7c01774ca013e60efd3f683c8002/backrefs-7.0-py314-none-any.whl", hash = "sha256:a6448b28180e3ca01134c9cf09dcebafad8531072e09903c5451748a05f24bc9", size = 412349, upload-time = "2026-04-28T16:28:02.412Z" }, +] + [[package]] name = "beartype" version = "0.22.9" @@ -306,15 +298,15 @@ wheels = [ [[package]] name = "beautifulsoup4" -version = "4.14.2" +version = "4.14.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "soupsieve" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/77/e9/df2358efd7659577435e2177bfa69cba6c33216681af51a707193dec162a/beautifulsoup4-4.14.2.tar.gz", hash = "sha256:2a98ab9f944a11acee9cc848508ec28d9228abfd522ef0fad6a02a72e0ded69e", size = 625822, upload-time = "2025-09-29T10:05:42.613Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b0/1c6a16426d389813b48d95e26898aff79abbde42ad353958ad95cc8c9b21/beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86", size = 627737, upload-time = "2025-11-30T15:08:26.084Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl", hash = "sha256:5ef6fa3a8cbece8488d66985560f97ed091e22bbc4e9c2338508a9d5de6d4515", size = 106392, upload-time = "2025-09-29T10:05:43.771Z" }, + { url = "https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb", size = 107721, upload-time = "2025-11-30T15:08:24.087Z" }, ] [[package]] @@ -354,14 +346,14 @@ wheels = [ [[package]] name = "bleach" -version = "6.2.0" +version = "6.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "webencodings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/76/9a/0e33f5054c54d349ea62c277191c020c2d6ef1d65ab2cb1993f91ec846d1/bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f", size = 203083, upload-time = "2024-10-29T18:30:40.477Z" } +sdist = { url = "https://files.pythonhosted.org/packages/07/18/3c8523962314be6bf4c8989c79ad9531c825210dd13a8669f6b84336e8bd/bleach-6.3.0.tar.gz", hash = "sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22", size = 203533, upload-time = "2025-10-27T17:57:39.211Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/55/96142937f66150805c25c4d0f31ee4132fd33497753400734f9dfdcbdc66/bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e", size = 163406, upload-time = "2024-10-29T18:30:38.186Z" }, + { url = "https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl", hash = "sha256:fe10ec77c93ddf3d13a73b035abaac7a9f5e436513864ccdad516693213c65d6", size = 164437, upload-time = "2025-10-27T17:57:37.538Z" }, ] [package.optional-dependencies] @@ -1279,6 +1271,42 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/da/71/ae30dadffc90b9006d77af76b393cb9dfbfc9629f339fc1574a1c52e6806/future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216", size = 491326, upload-time = "2024-02-21T11:52:35.956Z" }, ] +[[package]] +name = "ghp-import" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943, upload-time = "2022-05-02T15:47:16.11Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload-time = "2022-05-02T15:47:14.552Z" }, +] + +[[package]] +name = "gitdb" +version = "4.0.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "smmap" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684, upload-time = "2025-01-02T07:20:46.413Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794, upload-time = "2025-01-02T07:20:43.624Z" }, +] + +[[package]] +name = "gitpython" +version = "3.1.50" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "gitdb" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/f6/354ae6491228b5eb40e10d89c4d13c651fe1cf7556e35ebdded50cff57ce/gitpython-3.1.50.tar.gz", hash = "sha256:80da2d12504d52e1f998772dc5baf6e553f8d2fcfe1fcc226c9d9a2ee3372dcc", size = 219798, upload-time = "2026-05-06T04:01:26.571Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/7a/1c6e3562dfd8950adbb11ffbc65d21e7c89d01a6e4f137fa981056de25c5/gitpython-3.1.50-py3-none-any.whl", hash = "sha256:d352abe2908d07355014abdd21ddf798c2a961469239afec4962e9da884858f9", size = 212507, upload-time = "2026-05-06T04:01:23.799Z" }, +] + [[package]] name = "google-api-core" version = "2.25.2" @@ -1524,64 +1552,12 @@ grpc = [ ] [[package]] -name = "greenlet" -version = "3.2.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/03/b8/704d753a5a45507a7aab61f18db9509302ed3d0a27ac7e0359ec2905b1a6/greenlet-3.2.4.tar.gz", hash = "sha256:0dca0d95ff849f9a364385f36ab49f50065d76964944638be9691e1832e9f86d", size = 188260, upload-time = "2025-08-07T13:24:33.51Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7d/ed/6bfa4109fcb23a58819600392564fea69cdc6551ffd5e69ccf1d52a40cbc/greenlet-3.2.4-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:8c68325b0d0acf8d91dde4e6f930967dd52a5302cd4062932a6b2e7c2969f47c", size = 271061, upload-time = "2025-08-07T13:17:15.373Z" }, - { url = "https://files.pythonhosted.org/packages/2a/fc/102ec1a2fc015b3a7652abab7acf3541d58c04d3d17a8d3d6a44adae1eb1/greenlet-3.2.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:94385f101946790ae13da500603491f04a76b6e4c059dab271b3ce2e283b2590", size = 629475, upload-time = "2025-08-07T13:42:54.009Z" }, - { url = "https://files.pythonhosted.org/packages/c5/26/80383131d55a4ac0fb08d71660fd77e7660b9db6bdb4e8884f46d9f2cc04/greenlet-3.2.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f10fd42b5ee276335863712fa3da6608e93f70629c631bf77145021600abc23c", size = 640802, upload-time = "2025-08-07T13:45:25.52Z" }, - { url = "https://files.pythonhosted.org/packages/9f/7c/e7833dbcd8f376f3326bd728c845d31dcde4c84268d3921afcae77d90d08/greenlet-3.2.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c8c9e331e58180d0d83c5b7999255721b725913ff6bc6cf39fa2a45841a4fd4b", size = 636703, upload-time = "2025-08-07T13:53:12.622Z" }, - { url = "https://files.pythonhosted.org/packages/e9/49/547b93b7c0428ede7b3f309bc965986874759f7d89e4e04aeddbc9699acb/greenlet-3.2.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58b97143c9cc7b86fc458f215bd0932f1757ce649e05b640fea2e79b54cedb31", size = 635417, upload-time = "2025-08-07T13:18:25.189Z" }, - { url = "https://files.pythonhosted.org/packages/7f/91/ae2eb6b7979e2f9b035a9f612cf70f1bf54aad4e1d125129bef1eae96f19/greenlet-3.2.4-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c2ca18a03a8cfb5b25bc1cbe20f3d9a4c80d8c3b13ba3df49ac3961af0b1018d", size = 584358, upload-time = "2025-08-07T13:18:23.708Z" }, - { url = "https://files.pythonhosted.org/packages/f7/85/433de0c9c0252b22b16d413c9407e6cb3b41df7389afc366ca204dbc1393/greenlet-3.2.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fe0a28a7b952a21e2c062cd5756d34354117796c6d9215a87f55e38d15402c5", size = 1113550, upload-time = "2025-08-07T13:42:37.467Z" }, - { url = "https://files.pythonhosted.org/packages/a1/8d/88f3ebd2bc96bf7747093696f4335a0a8a4c5acfcf1b757717c0d2474ba3/greenlet-3.2.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8854167e06950ca75b898b104b63cc646573aa5fef1353d4508ecdd1ee76254f", size = 1137126, upload-time = "2025-08-07T13:18:20.239Z" }, - { url = "https://files.pythonhosted.org/packages/f1/29/74242b7d72385e29bcc5563fba67dad94943d7cd03552bac320d597f29b2/greenlet-3.2.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f47617f698838ba98f4ff4189aef02e7343952df3a615f847bb575c3feb177a7", size = 1544904, upload-time = "2025-11-04T12:42:04.763Z" }, - { url = "https://files.pythonhosted.org/packages/c8/e2/1572b8eeab0f77df5f6729d6ab6b141e4a84ee8eb9bc8c1e7918f94eda6d/greenlet-3.2.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af41be48a4f60429d5cad9d22175217805098a9ef7c40bfef44f7669fb9d74d8", size = 1611228, upload-time = "2025-11-04T12:42:08.423Z" }, - { url = "https://files.pythonhosted.org/packages/d6/6f/b60b0291d9623c496638c582297ead61f43c4b72eef5e9c926ef4565ec13/greenlet-3.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:73f49b5368b5359d04e18d15828eecc1806033db5233397748f4ca813ff1056c", size = 298654, upload-time = "2025-08-07T13:50:00.469Z" }, - { url = "https://files.pythonhosted.org/packages/a4/de/f28ced0a67749cac23fecb02b694f6473f47686dff6afaa211d186e2ef9c/greenlet-3.2.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:96378df1de302bc38e99c3a9aa311967b7dc80ced1dcc6f171e99842987882a2", size = 272305, upload-time = "2025-08-07T13:15:41.288Z" }, - { url = "https://files.pythonhosted.org/packages/09/16/2c3792cba130000bf2a31c5272999113f4764fd9d874fb257ff588ac779a/greenlet-3.2.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1ee8fae0519a337f2329cb78bd7a8e128ec0f881073d43f023c7b8d4831d5246", size = 632472, upload-time = "2025-08-07T13:42:55.044Z" }, - { url = "https://files.pythonhosted.org/packages/ae/8f/95d48d7e3d433e6dae5b1682e4292242a53f22df82e6d3dda81b1701a960/greenlet-3.2.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94abf90142c2a18151632371140b3dba4dee031633fe614cb592dbb6c9e17bc3", size = 644646, upload-time = "2025-08-07T13:45:26.523Z" }, - { url = "https://files.pythonhosted.org/packages/d5/5e/405965351aef8c76b8ef7ad370e5da58d57ef6068df197548b015464001a/greenlet-3.2.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:4d1378601b85e2e5171b99be8d2dc85f594c79967599328f95c1dc1a40f1c633", size = 640519, upload-time = "2025-08-07T13:53:13.928Z" }, - { url = "https://files.pythonhosted.org/packages/25/5d/382753b52006ce0218297ec1b628e048c4e64b155379331f25a7316eb749/greenlet-3.2.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0db5594dce18db94f7d1650d7489909b57afde4c580806b8d9203b6e79cdc079", size = 639707, upload-time = "2025-08-07T13:18:27.146Z" }, - { url = "https://files.pythonhosted.org/packages/1f/8e/abdd3f14d735b2929290a018ecf133c901be4874b858dd1c604b9319f064/greenlet-3.2.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2523e5246274f54fdadbce8494458a2ebdcdbc7b802318466ac5606d3cded1f8", size = 587684, upload-time = "2025-08-07T13:18:25.164Z" }, - { url = "https://files.pythonhosted.org/packages/5d/65/deb2a69c3e5996439b0176f6651e0052542bb6c8f8ec2e3fba97c9768805/greenlet-3.2.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1987de92fec508535687fb807a5cea1560f6196285a4cde35c100b8cd632cc52", size = 1116647, upload-time = "2025-08-07T13:42:38.655Z" }, - { url = "https://files.pythonhosted.org/packages/3f/cc/b07000438a29ac5cfb2194bfc128151d52f333cee74dd7dfe3fb733fc16c/greenlet-3.2.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:55e9c5affaa6775e2c6b67659f3a71684de4c549b3dd9afca3bc773533d284fa", size = 1142073, upload-time = "2025-08-07T13:18:21.737Z" }, - { url = "https://files.pythonhosted.org/packages/67/24/28a5b2fa42d12b3d7e5614145f0bd89714c34c08be6aabe39c14dd52db34/greenlet-3.2.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c9c6de1940a7d828635fbd254d69db79e54619f165ee7ce32fda763a9cb6a58c", size = 1548385, upload-time = "2025-11-04T12:42:11.067Z" }, - { url = "https://files.pythonhosted.org/packages/6a/05/03f2f0bdd0b0ff9a4f7b99333d57b53a7709c27723ec8123056b084e69cd/greenlet-3.2.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03c5136e7be905045160b1b9fdca93dd6727b180feeafda6818e6496434ed8c5", size = 1613329, upload-time = "2025-11-04T12:42:12.928Z" }, - { url = "https://files.pythonhosted.org/packages/d8/0f/30aef242fcab550b0b3520b8e3561156857c94288f0332a79928c31a52cf/greenlet-3.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:9c40adce87eaa9ddb593ccb0fa6a07caf34015a29bf8d344811665b573138db9", size = 299100, upload-time = "2025-08-07T13:44:12.287Z" }, - { url = "https://files.pythonhosted.org/packages/44/69/9b804adb5fd0671f367781560eb5eb586c4d495277c93bde4307b9e28068/greenlet-3.2.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd", size = 274079, upload-time = "2025-08-07T13:15:45.033Z" }, - { url = "https://files.pythonhosted.org/packages/46/e9/d2a80c99f19a153eff70bc451ab78615583b8dac0754cfb942223d2c1a0d/greenlet-3.2.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb", size = 640997, upload-time = "2025-08-07T13:42:56.234Z" }, - { url = "https://files.pythonhosted.org/packages/3b/16/035dcfcc48715ccd345f3a93183267167cdd162ad123cd93067d86f27ce4/greenlet-3.2.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f28588772bb5fb869a8eb331374ec06f24a83a9c25bfa1f38b6993afe9c1e968", size = 655185, upload-time = "2025-08-07T13:45:27.624Z" }, - { url = "https://files.pythonhosted.org/packages/31/da/0386695eef69ffae1ad726881571dfe28b41970173947e7c558d9998de0f/greenlet-3.2.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5c9320971821a7cb77cfab8d956fa8e39cd07ca44b6070db358ceb7f8797c8c9", size = 649926, upload-time = "2025-08-07T13:53:15.251Z" }, - { url = "https://files.pythonhosted.org/packages/68/88/69bf19fd4dc19981928ceacbc5fd4bb6bc2215d53199e367832e98d1d8fe/greenlet-3.2.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c60a6d84229b271d44b70fb6e5fa23781abb5d742af7b808ae3f6efd7c9c60f6", size = 651839, upload-time = "2025-08-07T13:18:30.281Z" }, - { url = "https://files.pythonhosted.org/packages/19/0d/6660d55f7373b2ff8152401a83e02084956da23ae58cddbfb0b330978fe9/greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0", size = 607586, upload-time = "2025-08-07T13:18:28.544Z" }, - { url = "https://files.pythonhosted.org/packages/8e/1a/c953fdedd22d81ee4629afbb38d2f9d71e37d23caace44775a3a969147d4/greenlet-3.2.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0", size = 1123281, upload-time = "2025-08-07T13:42:39.858Z" }, - { url = "https://files.pythonhosted.org/packages/3f/c7/12381b18e21aef2c6bd3a636da1088b888b97b7a0362fac2e4de92405f97/greenlet-3.2.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20fb936b4652b6e307b8f347665e2c615540d4b42b3b4c8a321d8286da7e520f", size = 1151142, upload-time = "2025-08-07T13:18:22.981Z" }, - { url = "https://files.pythonhosted.org/packages/27/45/80935968b53cfd3f33cf99ea5f08227f2646e044568c9b1555b58ffd61c2/greenlet-3.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee7a6ec486883397d70eec05059353b8e83eca9168b9f3f9a361971e77e0bcd0", size = 1564846, upload-time = "2025-11-04T12:42:15.191Z" }, - { url = "https://files.pythonhosted.org/packages/69/02/b7c30e5e04752cb4db6202a3858b149c0710e5453b71a3b2aec5d78a1aab/greenlet-3.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:326d234cbf337c9c3def0676412eb7040a35a768efc92504b947b3e9cfc7543d", size = 1633814, upload-time = "2025-11-04T12:42:17.175Z" }, - { url = "https://files.pythonhosted.org/packages/e9/08/b0814846b79399e585f974bbeebf5580fbe59e258ea7be64d9dfb253c84f/greenlet-3.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:a7d4e128405eea3814a12cc2605e0e6aedb4035bf32697f72deca74de4105e02", size = 299899, upload-time = "2025-08-07T13:38:53.448Z" }, - { url = "https://files.pythonhosted.org/packages/49/e8/58c7f85958bda41dafea50497cbd59738c5c43dbbea5ee83d651234398f4/greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31", size = 272814, upload-time = "2025-08-07T13:15:50.011Z" }, - { url = "https://files.pythonhosted.org/packages/62/dd/b9f59862e9e257a16e4e610480cfffd29e3fae018a68c2332090b53aac3d/greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945", size = 641073, upload-time = "2025-08-07T13:42:57.23Z" }, - { url = "https://files.pythonhosted.org/packages/f7/0b/bc13f787394920b23073ca3b6c4a7a21396301ed75a655bcb47196b50e6e/greenlet-3.2.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc", size = 655191, upload-time = "2025-08-07T13:45:29.752Z" }, - { url = "https://files.pythonhosted.org/packages/f2/d6/6adde57d1345a8d0f14d31e4ab9c23cfe8e2cd39c3baf7674b4b0338d266/greenlet-3.2.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c5111ccdc9c88f423426df3fd1811bfc40ed66264d35aa373420a34377efc98a", size = 649516, upload-time = "2025-08-07T13:53:16.314Z" }, - { url = "https://files.pythonhosted.org/packages/7f/3b/3a3328a788d4a473889a2d403199932be55b1b0060f4ddd96ee7cdfcad10/greenlet-3.2.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504", size = 652169, upload-time = "2025-08-07T13:18:32.861Z" }, - { url = "https://files.pythonhosted.org/packages/ee/43/3cecdc0349359e1a527cbf2e3e28e5f8f06d3343aaf82ca13437a9aa290f/greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671", size = 610497, upload-time = "2025-08-07T13:18:31.636Z" }, - { url = "https://files.pythonhosted.org/packages/b8/19/06b6cf5d604e2c382a6f31cafafd6f33d5dea706f4db7bdab184bad2b21d/greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b", size = 1121662, upload-time = "2025-08-07T13:42:41.117Z" }, - { url = "https://files.pythonhosted.org/packages/a2/15/0d5e4e1a66fab130d98168fe984c509249c833c1a3c16806b90f253ce7b9/greenlet-3.2.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae", size = 1149210, upload-time = "2025-08-07T13:18:24.072Z" }, - { url = "https://files.pythonhosted.org/packages/1c/53/f9c440463b3057485b8594d7a638bed53ba531165ef0ca0e6c364b5cc807/greenlet-3.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e343822feb58ac4d0a1211bd9399de2b3a04963ddeec21530fc426cc121f19b", size = 1564759, upload-time = "2025-11-04T12:42:19.395Z" }, - { url = "https://files.pythonhosted.org/packages/47/e4/3bb4240abdd0a8d23f4f88adec746a3099f0d86bfedb623f063b2e3b4df0/greenlet-3.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca7f6f1f2649b89ce02f6f229d7c19f680a6238af656f61e0115b24857917929", size = 1634288, upload-time = "2025-11-04T12:42:21.174Z" }, - { url = "https://files.pythonhosted.org/packages/0b/55/2321e43595e6801e105fcfdee02b34c0f996eb71e6ddffca6b10b7e1d771/greenlet-3.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:554b03b6e73aaabec3745364d6239e9e012d64c68ccd0b8430c64ccc14939a8b", size = 299685, upload-time = "2025-08-07T13:24:38.824Z" }, - { url = "https://files.pythonhosted.org/packages/22/5c/85273fd7cc388285632b0498dbbab97596e04b154933dfe0f3e68156c68c/greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0", size = 273586, upload-time = "2025-08-07T13:16:08.004Z" }, - { url = "https://files.pythonhosted.org/packages/d1/75/10aeeaa3da9332c2e761e4c50d4c3556c21113ee3f0afa2cf5769946f7a3/greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f", size = 686346, upload-time = "2025-08-07T13:42:59.944Z" }, - { url = "https://files.pythonhosted.org/packages/c0/aa/687d6b12ffb505a4447567d1f3abea23bd20e73a5bed63871178e0831b7a/greenlet-3.2.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c17b6b34111ea72fc5a4e4beec9711d2226285f0386ea83477cbb97c30a3f3a5", size = 699218, upload-time = "2025-08-07T13:45:30.969Z" }, - { url = "https://files.pythonhosted.org/packages/dc/8b/29aae55436521f1d6f8ff4e12fb676f3400de7fcf27fccd1d4d17fd8fecd/greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1", size = 694659, upload-time = "2025-08-07T13:53:17.759Z" }, - { url = "https://files.pythonhosted.org/packages/92/2e/ea25914b1ebfde93b6fc4ff46d6864564fba59024e928bdc7de475affc25/greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735", size = 695355, upload-time = "2025-08-07T13:18:34.517Z" }, - { url = "https://files.pythonhosted.org/packages/72/60/fc56c62046ec17f6b0d3060564562c64c862948c9d4bc8aa807cf5bd74f4/greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337", size = 657512, upload-time = "2025-08-07T13:18:33.969Z" }, - { url = "https://files.pythonhosted.org/packages/23/6e/74407aed965a4ab6ddd93a7ded3180b730d281c77b765788419484cdfeef/greenlet-3.2.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2917bdf657f5859fbf3386b12d68ede4cf1f04c90c3a6bc1f013dd68a22e2269", size = 1612508, upload-time = "2025-11-04T12:42:23.427Z" }, - { url = "https://files.pythonhosted.org/packages/0d/da/343cd760ab2f92bac1845ca07ee3faea9fe52bee65f7bcb19f16ad7de08b/greenlet-3.2.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:015d48959d4add5d6c9f6c5210ee3803a830dce46356e3bc326d6776bde54681", size = 1680760, upload-time = "2025-11-04T12:42:25.341Z" }, - { url = "https://files.pythonhosted.org/packages/e3/a5/6ddab2b4c112be95601c13428db1d8b6608a8b6039816f2ba09c346c08fc/greenlet-3.2.4-cp314-cp314-win_amd64.whl", hash = "sha256:e37ab26028f12dbb0ff65f29a8d3d44a765c61e729647bf2ddfbbed621726f01", size = 303425, upload-time = "2025-08-07T13:32:27.59Z" }, +name = "griffelib" +version = "2.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/82/74f4a3310cdabfbb10da554c3a672847f1ed33c6f61dd472681ce7f1fe67/griffelib-2.0.2.tar.gz", hash = "sha256:3cf20b3bc470e83763ffbf236e0076b1211bac1bc67de13daf494640f2de707e", size = 166461, upload-time = "2026-03-27T11:34:51.091Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/8c/c9138d881c79aa0ea9ed83cbd58d5ca75624378b38cee225dcf5c42cc91f/griffelib-2.0.2-py3-none-any.whl", hash = "sha256:925c857658fb1ba40c0772c37acbc2ab650bd794d9c1b9726922e36ea4117ea1", size = 142357, upload-time = "2026-03-27T11:34:46.275Z" }, ] [[package]] @@ -1771,15 +1747,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, ] -[[package]] -name = "imagesize" -version = "1.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026, upload-time = "2022-07-01T12:21:05.687Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769, upload-time = "2022-07-01T12:21:02.467Z" }, -] - [[package]] name = "importlib-metadata" version = "8.7.0" @@ -2176,25 +2143,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, ] -[[package]] -name = "jupyter-cache" -version = "1.0.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "click" }, - { name = "importlib-metadata" }, - { name = "nbclient" }, - { name = "nbformat" }, - { name = "pyyaml" }, - { name = "sqlalchemy" }, - { name = "tabulate" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/bb/f7/3627358075f183956e8c4974603232b03afd4ddc7baf72c2bc9fff522291/jupyter_cache-1.0.1.tar.gz", hash = "sha256:16e808eb19e3fb67a223db906e131ea6e01f03aa27f49a7214ce6a5fec186fb9", size = 32048, upload-time = "2024-11-15T16:03:55.322Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/64/6b/67b87da9d36bff9df7d0efbd1a325fa372a43be7158effaf43ed7b22341d/jupyter_cache-1.0.1-py3-none-any.whl", hash = "sha256:9c3cafd825ba7da8b5830485343091143dff903e4d8c69db9349b728b140abf6", size = 33907, upload-time = "2024-11-15T16:03:54.021Z" }, -] - [[package]] name = "jupyter-client" version = "8.6.3" @@ -2233,6 +2181,23 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884, upload-time = "2023-11-23T09:26:34.325Z" }, ] +[[package]] +name = "jupytext" +version = "1.19.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "mdit-py-plugins" }, + { name = "nbformat" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/13/a5/80c02f307c8ce863cb33e27daf049315e9d96979e14eead700923b5ec9cc/jupytext-1.19.1.tar.gz", hash = "sha256:82587c07e299173c70ed5e8ec7e75183edf1be289ed518bab49ad0d4e3d5f433", size = 4307829, upload-time = "2026-01-25T21:35:13.276Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl", hash = "sha256:d8975035155d034bdfde5c0c37891425314b7ea8d3a6c4b5d18c294348714cd9", size = 170478, upload-time = "2026-01-25T21:35:11.17Z" }, +] + [[package]] name = "keyring" version = "25.7.0" @@ -2313,6 +2278,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/14/e8/edff4de49cf364eb9ee88d13da0a555844df32438413bf53d90d507b97cd/langsmith-0.4.37-py3-none-any.whl", hash = "sha256:e34a94ce7277646299e4703a0f6e2d2c43647a28e8b800bb7ef82fd87a0ec766", size = 396111, upload-time = "2025-10-15T22:33:57.392Z" }, ] +[[package]] +name = "markdown" +version = "3.10.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2b/f4/69fa6ed85ae003c2378ffa8f6d2e3234662abd02c10d216c0ba96081a238/markdown-3.10.2.tar.gz", hash = "sha256:994d51325d25ad8aa7ce4ebaec003febcce822c3f8c911e3b17c52f7f589f950", size = 368805, upload-time = "2026-02-09T14:57:26.942Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl", hash = "sha256:e91464b71ae3ee7afd3017d9f358ef0baf158fd9a298db92f1d4761133824c36", size = 108180, upload-time = "2026-02-09T14:57:25.787Z" }, +] + [[package]] name = "markdown-it-py" version = "3.0.0" @@ -2325,6 +2299,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" }, ] +[[package]] +name = "markdownify" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3f/bc/c8c8eea5335341306b0fa7e1cb33c5e1c8d24ef70ddd684da65f41c49c92/markdownify-1.2.2.tar.gz", hash = "sha256:b274f1b5943180b031b699b199cbaeb1e2ac938b75851849a31fd0c3d6603d09", size = 18816, upload-time = "2025-11-16T19:21:18.565Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/ce/f1e3e9d959db134cedf06825fae8d5b294bd368aacdd0831a3975b7c4d55/markdownify-1.2.2-py3-none-any.whl", hash = "sha256:3f02d3cc52714084d6e589f70397b6fc9f2f3a8531481bf35e8cc39f975e186a", size = 15724, upload-time = "2025-11-16T19:21:17.622Z" }, +] + [[package]] name = "markupsafe" version = "3.0.3" @@ -2456,16 +2443,42 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fd/d9/eaa1f80170d2b7c5ba23f3b59f766f3a0bb41155fbc32a69adfa1adaaef9/mcp-1.26.0-py3-none-any.whl", hash = "sha256:904a21c33c25aa98ddbeb47273033c435e595bbacfdb177f4bd87f6dceebe1ca", size = 233615, upload-time = "2026-01-24T19:40:30.652Z" }, ] +[[package]] +name = "mdformat" +version = "0.7.22" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/eb/b5cbf2484411af039a3d4aeb53a5160fae25dd8c84af6a4243bc2f3fedb3/mdformat-0.7.22.tar.gz", hash = "sha256:eef84fa8f233d3162734683c2a8a6222227a229b9206872e6139658d99acb1ea", size = 34610, upload-time = "2025-01-30T18:00:51.418Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/6f/94a7344f6d634fe3563bea8b33bccedee37f2726f7807e9a58440dc91627/mdformat-0.7.22-py3-none-any.whl", hash = "sha256:61122637c9e1d9be1329054f3fa216559f0d1f722b7919b060a8c2a4ae1850e5", size = 34447, upload-time = "2025-01-30T18:00:48.708Z" }, +] + +[[package]] +name = "mdformat-tables" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdformat" }, + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/64/fc/995ba209096bdebdeb8893d507c7b32b7e07d9a9f2cdc2ec07529947794b/mdformat_tables-1.0.0.tar.gz", hash = "sha256:a57db1ac17c4a125da794ef45539904bb8a9592e80557d525e1f169c96daa2c8", size = 6106, upload-time = "2024-08-23T23:41:33.413Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/37/d78e37d14323da3f607cd1af7daf262cb87fe614a245c15ad03bb03a2706/mdformat_tables-1.0.0-py3-none-any.whl", hash = "sha256:94cd86126141b2adc3b04c08d1441eb1272b36c39146bab078249a41c7240a9a", size = 5104, upload-time = "2024-08-23T23:41:31.863Z" }, +] + [[package]] name = "mdit-py-plugins" -version = "0.5.0" +version = "0.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655, upload-time = "2025-08-11T07:25:49.083Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/3d/e0e8d9d1cee04f758120915e2b2a3a07eb41f8cf4654b4734788a522bcd1/mdit_py_plugins-0.6.0.tar.gz", hash = "sha256:2436f14a7295837ac9228a36feeabda867c4abc488c8d019ad5c0bda88eee040", size = 56025, upload-time = "2026-05-07T12:20:42.295Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f", size = 57205, upload-time = "2025-08-11T07:25:47.597Z" }, + { url = "https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl", hash = "sha256:f7e7a25d8b616fee99cb1e330da73451d11a8061baf39bb9663ab9ce0e005b90", size = 66655, upload-time = "2026-05-07T12:20:41.226Z" }, ] [[package]] @@ -2477,6 +2490,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] +[[package]] +name = "mergedeep" +version = "1.3.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661, upload-time = "2021-02-05T18:55:30.623Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354, upload-time = "2021-02-05T18:55:29.583Z" }, +] + [[package]] name = "mistralai" version = "1.9.11" @@ -2497,14 +2519,207 @@ wheels = [ [[package]] name = "mistune" -version = "3.1.4" +version = "3.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/84/620cc3f7e3adf6f5067e10f4dbae71295d8f9e16d5d3f9ef97c40f2f592c/mistune-3.2.1.tar.gz", hash = "sha256:7c8e5501d38bac1582e067e46c8343f17d57ea1aaa735823f3aba1fd59c88a28", size = 98003, upload-time = "2026-05-03T14:33:22.312Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl", hash = "sha256:78cdb0ba5e938053ccf63651b352508d2efa9411dc8810bfb05f2dc5140c0048", size = 53749, upload-time = "2026-05-03T14:33:20.551Z" }, +] + +[[package]] +name = "mkdocs" +version = "1.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "ghp-import" }, + { name = "jinja2" }, + { name = "markdown" }, + { name = "markupsafe" }, + { name = "mergedeep" }, + { name = "mkdocs-get-deps" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "pyyaml" }, + { name = "pyyaml-env-tag" }, + { name = "watchdog" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159, upload-time = "2024-08-30T12:24:06.899Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload-time = "2024-08-30T12:24:05.054Z" }, +] + +[[package]] +name = "mkdocs-autorefs" +version = "1.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown" }, + { name = "markupsafe" }, + { name = "mkdocs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/c0/f641843de3f612a6b48253f39244165acff36657a91cc903633d456ae1ac/mkdocs_autorefs-1.4.4.tar.gz", hash = "sha256:d54a284f27a7346b9c38f1f852177940c222da508e66edc816a0fa55fc6da197", size = 56588, upload-time = "2026-02-10T15:23:55.105Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/de/a3e710469772c6a89595fc52816da05c1e164b4c866a89e3cb82fb1b67c5/mkdocs_autorefs-1.4.4-py3-none-any.whl", hash = "sha256:834ef5408d827071ad1bc69e0f39704fa34c7fc05bc8e1c72b227dfdc5c76089", size = 25530, upload-time = "2026-02-10T15:23:53.817Z" }, +] + +[[package]] +name = "mkdocs-get-deps" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mergedeep" }, + { name = "platformdirs" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/25/b3cccb187655b9393572bde9b09261d267c3bf2f2cdabe347673be5976a6/mkdocs_get_deps-0.2.2.tar.gz", hash = "sha256:8ee8d5f316cdbbb2834bc1df6e69c08fe769a83e040060de26d3c19fad3599a1", size = 11047, upload-time = "2026-03-10T02:46:33.632Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/29/744136411e785c4b0b744d5413e56555265939ab3a104c6a4b719dad33fd/mkdocs_get_deps-0.2.2-py3-none-any.whl", hash = "sha256:e7878cbeac04860b8b5e0ca31d3abad3df9411a75a32cde82f8e44b6c16ff650", size = 9555, upload-time = "2026-03-10T02:46:32.256Z" }, +] + +[[package]] +name = "mkdocs-git-revision-date-localized-plugin" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel" }, + { name = "gitpython" }, + { name = "mkdocs" }, + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/aa/16/25d7b1b930a802bf8b0c6ee64a9b34ea6e7d0a34c6bc69adbbb59b9d2f4b/mkdocs_git_revision_date_localized_plugin-1.5.1.tar.gz", hash = "sha256:2b0239455cd84784dd87ac8dfc9253fe4b2dd35e102696f21b5d34e2175981c6", size = 449557, upload-time = "2026-01-26T13:34:30.912Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/3f/4f663fb7e889fbb2fabef7a67ddd96f8355edca917aa724c6c6cda352d01/mkdocs_git_revision_date_localized_plugin-1.5.1-py3-none-any.whl", hash = "sha256:b00fd36ed0f9b2326b1488fd8fa31bf2ce64e68c4aa60a9ce857f10719571903", size = 26150, upload-time = "2026-01-26T13:34:28.768Z" }, +] + +[[package]] +name = "mkdocs-jupyter" +version = "0.26.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ipykernel" }, + { name = "jupytext" }, + { name = "mkdocs" }, + { name = "mkdocs-material" }, + { name = "nbconvert" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/aa/f8d15409a9a3112486994a80d5a975694c7d145c4f8b5b484aeb383420ef/mkdocs_jupyter-0.26.3.tar.gz", hash = "sha256:e1e8bd48a1b96542e84e3028e3066112bac7b94d95ab69f8b91305c84003ca26", size = 1628353, upload-time = "2026-04-17T18:56:31.517Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/95/cf3f7fe4910cf0365fa8ea0c731f4b8a624d97cd76ea777913ac8d0868e2/mkdocs_jupyter-0.26.3-py3-none-any.whl", hash = "sha256:cd6644fb578131157194d750fd4d10fc2fd8f1e84e00036ee62df3b5b4b84c82", size = 1459740, upload-time = "2026-04-17T18:56:30.031Z" }, +] + +[[package]] +name = "mkdocs-llmstxt" +version = "0.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "markdownify" }, + { name = "mdformat" }, + { name = "mdformat-tables" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7f/f5/4c31cdffa7c09bf48d8c7a50d8342dc100abac98ac4150826bc11afc0c9f/mkdocs_llmstxt-0.5.0.tar.gz", hash = "sha256:b2fa9e6d68df41d7467e948a4745725b6c99434a36b36204857dbd7bb3dfe041", size = 33909, upload-time = "2025-11-20T14:02:24.861Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/2b/82928cc9e8d9269cd79e7ebf015efdc4945e6c646e86ec1d4dba1707f215/mkdocs_llmstxt-0.5.0-py3-none-any.whl", hash = "sha256:753c699913d2d619a9072604b26b6dc9f5fb6d257d9b107857f80c8a0b787533", size = 12040, upload-time = "2025-11-20T14:02:23.483Z" }, +] + +[[package]] +name = "mkdocs-material" +version = "9.7.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel" }, + { name = "backrefs" }, + { name = "colorama" }, + { name = "jinja2" }, + { name = "markdown" }, + { name = "mkdocs" }, + { name = "mkdocs-material-extensions" }, + { name = "paginate" }, + { name = "pygments" }, + { name = "pymdown-extensions" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/45/29/6d2bcf41ae40802c4beda2432396fff97b8456fb496371d1bc7aad6512ec/mkdocs_material-9.7.6.tar.gz", hash = "sha256:00bdde50574f776d328b1862fe65daeaf581ec309bd150f7bff345a098c64a69", size = 4097959, upload-time = "2026-03-19T15:41:58.161Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/01/bc663630c510822c95c47a66af9fa7a443c295b47d5f041e5e6ae62ef659/mkdocs_material-9.7.6-py3-none-any.whl", hash = "sha256:71b84353921b8ea1ba84fe11c50912cc512da8fe0881038fcc9a0761c0e635ba", size = 9305470, upload-time = "2026-03-19T15:41:55.217Z" }, +] + +[[package]] +name = "mkdocs-material-extensions" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847, upload-time = "2023-11-22T19:09:45.208Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728, upload-time = "2023-11-22T19:09:43.465Z" }, +] + +[[package]] +name = "mkdocs-redirects" +version = "1.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mkdocs" }, + { name = "properdocs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/73/25/49725f78ca5d3026b09973f7a2b3a8b179cc2e8c15e43d5a13bc79f6b274/mkdocs_redirects-1.2.3.tar.gz", hash = "sha256:5e980330999299729a2d6a125347d1af78023d68a23681a4de3053ce7dfe2e51", size = 7712, upload-time = "2026-03-28T13:57:41.766Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/90/871b1cddc01d2ba1637b858eeeabc2e3013dc8df591306b5567b98ef0870/mkdocs_redirects-1.2.3-py3-none-any.whl", hash = "sha256:ec7312fff462d03ec16395d0c001006a418f8d0c21cdf2b47ff11cf839dc3ce0", size = 6245, upload-time = "2026-03-28T13:57:40.466Z" }, +] + +[[package]] +name = "mkdocs-section-index" +version = "0.3.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mkdocs" }, + { name = "properdocs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f1/e2/64d0f3f054ca8efe61e706006ff5f0d49ad99620c62c2e04818573391c33/mkdocs_section_index-0.3.12.tar.gz", hash = "sha256:285635bf86c643b0fc7a343053d7a818049817bff4408f52b80c4367bd5e7268", size = 14946, upload-time = "2026-04-16T19:20:00.953Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/4d/a330cab5e055d45e924cec69da54a3d8ed37643964f8d1fa1a772b496273/mkdocs_section_index-0.3.12-py3-none-any.whl", hash = "sha256:a1100039546beb4ebef63ce6fc91f3195fb9c0c3763105d4d3d7cd31e0a046eb", size = 8932, upload-time = "2026-04-16T19:19:59.741Z" }, +] + +[[package]] +name = "mkdocstrings" +version = "1.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "jinja2" }, + { name = "markdown" }, + { name = "markupsafe" }, + { name = "mkdocs" }, + { name = "mkdocs-autorefs" }, + { name = "pymdown-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1d/5d/f888d4d3eb31359b327bc9b17a212d6ef03fe0b0682fbb3fc2cb849fb12b/mkdocstrings-1.0.4.tar.gz", hash = "sha256:3969a6515b77db65fd097b53c1b7aa4ae840bd71a2ee62a6a3e89503446d7172", size = 100088, upload-time = "2026-04-15T09:16:53.376Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/94/be70f8ee9c45f2f62b39a1f0e9303bc20e138a8f3b8e50ffd89498e177e1/mkdocstrings-1.0.4-py3-none-any.whl", hash = "sha256:63464b4b29053514f32a1dbbf604e52876d5e638111b0c295ab7ed3cac73ca9b", size = 35560, upload-time = "2026-04-15T09:16:51.436Z" }, +] + +[package.optional-dependencies] +python = [ + { name = "mkdocstrings-python" }, +] + +[[package]] +name = "mkdocstrings-python" +version = "2.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "griffelib" }, + { name = "mkdocs-autorefs" }, + { name = "mkdocstrings" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d7/02/a7fb8b21d4d55ac93cdcde9d3638da5dd0ebdd3a4fed76c7725e10b81cbe/mistune-3.1.4.tar.gz", hash = "sha256:b5a7f801d389f724ec702840c11d8fc48f2b33519102fc7ee739e8177b672164", size = 94588, upload-time = "2025-08-29T07:20:43.594Z" } +sdist = { url = "https://files.pythonhosted.org/packages/29/33/c225eaf898634bdda489a6766fc35d1683c640bffe0e0acd10646b13536d/mkdocstrings_python-2.0.3.tar.gz", hash = "sha256:c518632751cc869439b31c9d3177678ad2bfa5c21b79b863956ad68fc92c13b8", size = 199083, upload-time = "2026-02-20T10:38:36.368Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/f0/8282d9641415e9e33df173516226b404d367a0fc55e1a60424a152913abc/mistune-3.1.4-py3-none-any.whl", hash = "sha256:93691da911e5d9d2e23bc54472892aff676df27a75274962ff9edc210364266d", size = 53481, upload-time = "2025-08-29T07:20:42.218Z" }, + { url = "https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl", hash = "sha256:0b83513478bdfd803ff05aa43e9b1fca9dd22bcd9471f09ca6257f009bc5ee12", size = 104779, upload-time = "2026-02-20T10:38:34.517Z" }, ] [[package]] @@ -2759,48 +2974,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, ] -[[package]] -name = "myst-nb" -version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "importlib-metadata" }, - { name = "ipykernel" }, - { name = "ipython", version = "8.37.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "ipython", version = "9.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "jupyter-cache" }, - { name = "myst-parser" }, - { name = "nbclient" }, - { name = "nbformat" }, - { name = "pyyaml" }, - { name = "sphinx" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/21/83/a894bd8dea7a6e9f053502ee8413484dcbf75a219013d6a72e971c0fecfd/myst_nb-1.3.0.tar.gz", hash = "sha256:df3cd4680f51a5af673fd46b38b562be3559aef1475e906ed0f2e66e4587ce4b", size = 81963, upload-time = "2025-07-13T22:49:38.493Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/a6/03d410c114b8c4856579b3d294dafc27626a7690a552625eec42b16dfa41/myst_nb-1.3.0-py3-none-any.whl", hash = "sha256:1f36af3c19964960ec4e51ac30949b6ed6df220356ffa8d60dd410885e132d7d", size = 82396, upload-time = "2025-07-13T22:49:37.019Z" }, -] - -[[package]] -name = "myst-parser" -version = "4.0.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "docutils" }, - { name = "jinja2" }, - { name = "markdown-it-py" }, - { name = "mdit-py-plugins" }, - { name = "pyyaml" }, - { name = "sphinx" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/66/a5/9626ba4f73555b3735ad86247a8077d4603aa8628537687c839ab08bfe44/myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4", size = 93985, upload-time = "2025-02-12T10:53:03.833Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/df/76d0321c3797b54b60fef9ec3bd6f4cfd124b9e422182156a1dd418722cf/myst_parser-4.0.1-py3-none-any.whl", hash = "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d", size = 84579, upload-time = "2025-02-12T10:53:02.078Z" }, -] - [[package]] name = "nbclient" -version = "0.10.2" +version = "0.10.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jupyter-client" }, @@ -2808,14 +2984,14 @@ dependencies = [ { name = "nbformat" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/87/66/7ffd18d58eae90d5721f9f39212327695b749e23ad44b3881744eaf4d9e8/nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193", size = 62424, upload-time = "2024-12-19T10:32:27.164Z" } +sdist = { url = "https://files.pythonhosted.org/packages/56/91/1c1d5a4b9a9ebba2b4e32b8c852c2975c872aec1fe42ab5e516b2cecd193/nbclient-0.10.4.tar.gz", hash = "sha256:1e54091b16e6da39e297b0ece3e10f6f29f4ac4e8ee515d29f8a7099bd6553c9", size = 62554, upload-time = "2025-12-23T07:45:46.369Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d", size = 25434, upload-time = "2024-12-19T10:32:24.139Z" }, + { url = "https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl", hash = "sha256:9162df5a7373d70d606527300a95a975a47c137776cd942e52d9c7e29ff83440", size = 25465, upload-time = "2025-12-23T07:45:44.51Z" }, ] [[package]] name = "nbconvert" -version = "7.16.6" +version = "7.17.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "beautifulsoup4" }, @@ -2833,9 +3009,9 @@ dependencies = [ { name = "pygments" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a3/59/f28e15fc47ffb73af68a8d9b47367a8630d76e97ae85ad18271b9db96fdf/nbconvert-7.16.6.tar.gz", hash = "sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582", size = 857715, upload-time = "2025-01-28T09:29:14.724Z" } +sdist = { url = "https://files.pythonhosted.org/packages/01/b1/708e53fe2e429c103c6e6e159106bcf0357ac41aa4c28772bd8402339051/nbconvert-7.17.1.tar.gz", hash = "sha256:34d0d0a7e73ce3cbab6c5aae8f4f468797280b01fd8bd2ca746da8569eddd7d2", size = 865311, upload-time = "2026-04-08T00:44:14.914Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl", hash = "sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b", size = 258525, upload-time = "2025-01-28T09:29:12.551Z" }, + { url = "https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl", hash = "sha256:aa85c087b435e7bf1ffd03319f658e285f2b89eccab33bc1ba7025495ab3e7c8", size = 261927, upload-time = "2026-04-08T00:44:12.845Z" }, ] [[package]] @@ -2853,23 +3029,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454, upload-time = "2024-04-04T11:20:34.895Z" }, ] -[[package]] -name = "nbsphinx" -version = "0.9.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "docutils" }, - { name = "jinja2" }, - { name = "nbconvert" }, - { name = "nbformat" }, - { name = "sphinx" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/1e/84/b1856b7651ac34e965aa567a158714c7f3bd42a1b1ce76bf423ffb99872c/nbsphinx-0.9.7.tar.gz", hash = "sha256:abd298a686d55fa894ef697c51d44f24e53aa312dadae38e82920f250a5456fe", size = 180479, upload-time = "2025-03-03T19:46:08.069Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/49/2d/8c8e635bcc6757573d311bb3c5445426382f280da32b8cd6d82d501ef4a4/nbsphinx-0.9.7-py3-none-any.whl", hash = "sha256:7292c3767fea29e405c60743eee5393682a83982ab202ff98f5eb2db02629da8", size = 31660, upload-time = "2025-03-03T19:46:06.581Z" }, -] - [[package]] name = "nbval" version = "0.11.0" @@ -3362,6 +3521,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, ] +[[package]] +name = "paginate" +version = "0.5.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252, upload-time = "2024-08-25T14:17:24.139Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746, upload-time = "2024-08-25T14:17:22.55Z" }, +] + [[package]] name = "pandocfilters" version = "1.5.1" @@ -3677,6 +3845,29 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, ] +[[package]] +name = "properdocs" +version = "1.6.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "ghp-import" }, + { name = "jinja2" }, + { name = "markdown" }, + { name = "markupsafe" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "platformdirs" }, + { name = "pyyaml" }, + { name = "pyyaml-env-tag" }, + { name = "watchdog" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ec/29/f27a4e1eddf72ed3db6e47818fbafe6debbf09fd7051f9c1a007239b46ef/properdocs-1.6.7.tar.gz", hash = "sha256:adc7b16e562890af0e098a7e5b02e3a81c20894a87d6a28d345c9300de73c26e", size = 276141, upload-time = "2026-03-20T20:07:48.167Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/4d/fc923f5c85318ee8cc903566dc4e0ebe41b2dfc1d2ecf5546db232397ed6/properdocs-1.6.7-py3-none-any.whl", hash = "sha256:6fa0cfa2e01bf338f684892c8a506cf70ea88ae7f3479c933b6fa20168101cbd", size = 225406, upload-time = "2026-03-20T20:07:46.875Z" }, +] + [[package]] name = "proto-plus" version = "1.26.1" @@ -3940,25 +4131,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl", hash = "sha256:d56fd801823dbeae7f0975e1f8c8e25c258eb75d278ea7abb5d9cebb01b56237", size = 58929, upload-time = "2026-02-19T13:45:06.034Z" }, ] -[[package]] -name = "pydata-sphinx-theme" -version = "0.15.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "accessible-pygments" }, - { name = "babel" }, - { name = "beautifulsoup4" }, - { name = "docutils" }, - { name = "packaging" }, - { name = "pygments" }, - { name = "sphinx" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/67/ea/3ab478cccacc2e8ef69892c42c44ae547bae089f356c4b47caf61730958d/pydata_sphinx_theme-0.15.4.tar.gz", hash = "sha256:7762ec0ac59df3acecf49fd2f889e1b4565dbce8b88b2e29ee06fdd90645a06d", size = 2400673, upload-time = "2024-06-25T19:28:45.041Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/d3/c622950d87a2ffd1654208733b5bd1c5645930014abed8f4c0d74863988b/pydata_sphinx_theme-0.15.4-py3-none-any.whl", hash = "sha256:2136ad0e9500d0949f96167e63f3e298620040aea8f9c74621959eda5d4cf8e6", size = 4640157, upload-time = "2024-06-25T19:28:42.383Z" }, -] - [[package]] name = "pygments" version = "2.19.2" @@ -4001,6 +4173,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1a/a7/69460c4a6af7575449e615144aa2205b89408dc2969b87bc3df2f262ad0b/pylint-3.3.9-py3-none-any.whl", hash = "sha256:01f9b0462c7730f94786c283f3e52a1fbdf0494bbe0971a78d7277ef46a751e7", size = 523465, upload-time = "2025-10-05T18:41:41.766Z" }, ] +[[package]] +name = "pymdown-extensions" +version = "10.21.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/08/f1c908c581fd11913da4711ea7ba32c0eee40b0190000996bb863b0c9349/pymdown_extensions-10.21.2.tar.gz", hash = "sha256:c3f55a5b8a1d0edf6699e35dcbea71d978d34ff3fa79f3d807b8a5b3fa90fbdc", size = 853922, upload-time = "2026-03-29T15:01:55.233Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/27/a2fc51a4a122dfd1015e921ae9d22fee3d20b0b8080d9a704578bf9deece/pymdown_extensions-10.21.2-py3-none-any.whl", hash = "sha256:5c0fd2a2bea14eb39af8ff284f1066d898ab2187d81b889b75d46d4348c01638", size = 268901, upload-time = "2026-03-29T15:01:53.244Z" }, +] + [[package]] name = "pyperclip" version = "1.11.0" @@ -4201,6 +4386,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, ] +[[package]] +name = "pyyaml-env-tag" +version = "1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737, upload-time = "2025-05-13T15:24:01.64Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload-time = "2025-05-13T15:23:59.629Z" }, +] + [[package]] name = "pyzmq" version = "27.1.0" @@ -4288,7 +4485,7 @@ wheels = [ [[package]] name = "redisvl" -version = "0.18.0" +version = "0.18.1" source = { editable = "." } dependencies = [ { name = "jsonpath-ng" }, @@ -4377,14 +4574,15 @@ dev = [ { name = "types-pyyaml" }, ] docs = [ - { name = "jinja2" }, - { name = "myst-nb" }, - { name = "nbsphinx" }, - { name = "sphinx" }, - { name = "sphinx-book-theme" }, - { name = "sphinx-copybutton" }, - { name = "sphinx-design" }, - { name = "sphinx-favicon" }, + { name = "mkdocs" }, + { name = "mkdocs-autorefs" }, + { name = "mkdocs-git-revision-date-localized-plugin" }, + { name = "mkdocs-jupyter" }, + { name = "mkdocs-llmstxt" }, + { name = "mkdocs-material" }, + { name = "mkdocs-redirects" }, + { name = "mkdocs-section-index" }, + { name = "mkdocstrings", extra = ["python"] }, ] [package.metadata] @@ -4447,14 +4645,15 @@ dev = [ { name = "types-pyyaml" }, ] docs = [ - { name = "jinja2", specifier = ">=3.1.3,<4" }, - { name = "myst-nb", specifier = ">=1.1.0,<2" }, - { name = "nbsphinx", specifier = ">=0.9.3,<0.10" }, - { name = "sphinx", specifier = ">=4.4.0" }, - { name = "sphinx-book-theme", specifier = ">=1.0.0" }, - { name = "sphinx-copybutton", specifier = ">=0.5.2,<0.6" }, - { name = "sphinx-design", specifier = ">=0.5.0,<0.6" }, - { name = "sphinx-favicon", specifier = ">=1.0.1,<2" }, + { name = "mkdocs", specifier = ">=1.6" }, + { name = "mkdocs-autorefs", specifier = ">=1.2" }, + { name = "mkdocs-git-revision-date-localized-plugin", specifier = ">=1.2" }, + { name = "mkdocs-jupyter", specifier = ">=0.25" }, + { name = "mkdocs-llmstxt", specifier = ">=0.2" }, + { name = "mkdocs-material", specifier = ">=9.5" }, + { name = "mkdocs-redirects", specifier = ">=1.2" }, + { name = "mkdocs-section-index", specifier = ">=0.3" }, + { name = "mkdocstrings", extras = ["python"], specifier = ">=0.26" }, ] [[package]] @@ -5113,161 +5312,30 @@ wheels = [ ] [[package]] -name = "sniffio" -version = "1.3.1" +name = "smmap" +version = "5.0.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/ea/49c993d6dfdd7338c9b1000a0f36817ed7ec84577ae2e52f890d1a4ff909/smmap-5.0.3.tar.gz", hash = "sha256:4d9debb8b99007ae47165abc08670bd74cb74b5227dda7f643eccc4e9eb5642c", size = 22506, upload-time = "2026-03-09T03:43:26.1Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, + { url = "https://files.pythonhosted.org/packages/c1/d4/59e74daffcb57a07668852eeeb6035af9f32cbfd7a1d2511f17d2fe6a738/smmap-5.0.3-py3-none-any.whl", hash = "sha256:c106e05d5a61449cf6ba9a1e650227ecfb141590d2a98412103ff35d89fc7b2f", size = 24390, upload-time = "2026-03-09T03:43:24.361Z" }, ] [[package]] -name = "snowballstemmer" -version = "3.0.1" +name = "sniffio" +version = "1.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/75/a7/9810d872919697c9d01295633f5d574fb416d47e535f258272ca1f01f447/snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895", size = 105575, upload-time = "2025-05-09T16:34:51.843Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", size = 103274, upload-time = "2025-05-09T16:34:50.371Z" }, + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, ] [[package]] name = "soupsieve" -version = "2.8" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6d/e6/21ccce3262dd4889aa3332e5a119a3491a95e8f60939870a3a035aabac0d/soupsieve-2.8.tar.gz", hash = "sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f", size = 103472, upload-time = "2025-08-27T15:39:51.78Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl", hash = "sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c", size = 36679, upload-time = "2025-08-27T15:39:50.179Z" }, -] - -[[package]] -name = "sphinx" -version = "7.4.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "alabaster" }, - { name = "babel" }, - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "docutils" }, - { name = "imagesize" }, - { name = "jinja2" }, - { name = "packaging" }, - { name = "pygments" }, - { name = "requests" }, - { name = "snowballstemmer" }, - { name = "sphinxcontrib-applehelp" }, - { name = "sphinxcontrib-devhelp" }, - { name = "sphinxcontrib-htmlhelp" }, - { name = "sphinxcontrib-jsmath" }, - { name = "sphinxcontrib-qthelp" }, - { name = "sphinxcontrib-serializinghtml" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5b/be/50e50cb4f2eff47df05673d361095cafd95521d2a22521b920c67a372dcb/sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe", size = 8067911, upload-time = "2024-07-20T14:46:56.059Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/ef/153f6803c5d5f8917dbb7f7fcf6d34a871ede3296fa89c2c703f5f8a6c8e/sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239", size = 3401624, upload-time = "2024-07-20T14:46:52.142Z" }, -] - -[[package]] -name = "sphinx-book-theme" -version = "1.1.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pydata-sphinx-theme" }, - { name = "sphinx" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/45/19/d002ed96bdc7738c15847c730e1e88282d738263deac705d5713b4d8fa94/sphinx_book_theme-1.1.4.tar.gz", hash = "sha256:73efe28af871d0a89bd05856d300e61edce0d5b2fbb7984e84454be0fedfe9ed", size = 439188, upload-time = "2025-02-20T16:32:32.581Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/51/9e/c41d68be04eef5b6202b468e0f90faf0c469f3a03353f2a218fd78279710/sphinx_book_theme-1.1.4-py3-none-any.whl", hash = "sha256:843b3f5c8684640f4a2d01abd298beb66452d1b2394cd9ef5be5ebd5640ea0e1", size = 433952, upload-time = "2025-02-20T16:32:31.009Z" }, -] - -[[package]] -name = "sphinx-copybutton" -version = "0.5.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "sphinx" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fc/2b/a964715e7f5295f77509e59309959f4125122d648f86b4fe7d70ca1d882c/sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd", size = 23039, upload-time = "2023-04-14T08:10:22.998Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e", size = 13343, upload-time = "2023-04-14T08:10:20.844Z" }, -] - -[[package]] -name = "sphinx-design" -version = "0.5.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "sphinx" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fd/d0/62a7cee178d30f7217c4badea17eeca020801c0053773098d9ff65636a60/sphinx_design-0.5.0.tar.gz", hash = "sha256:e8e513acea6f92d15c6de3b34e954458f245b8e761b45b63950f65373352ab00", size = 2152330, upload-time = "2023-07-27T12:45:33.302Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/17/52/a1e9d72ecf56047df714a3dd0840a5148e4e83c100e8e0046bcea60a1054/sphinx_design-0.5.0-py3-none-any.whl", hash = "sha256:1af1267b4cea2eedd6724614f19dcc88fe2e15aff65d06b2f6252cee9c4f4c1e", size = 2173865, upload-time = "2023-07-27T12:45:30.249Z" }, -] - -[[package]] -name = "sphinx-favicon" -version = "1.0.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "sphinx" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b1/25/3c78b785c3ea991597c310ac6bdc7949c2a7549e031dbb22db4ce8d1b99b/sphinx-favicon-1.0.1.tar.gz", hash = "sha256:df796de32125609c1b4a8964db74270ebf4502089c27cd53f542354dc0b57e8e", size = 8162, upload-time = "2023-03-02T23:28:47.635Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/92/c2/152bd6c211b847e525d2c7004fd98e3ac5baeace192716da8cd9c9ec2427/sphinx_favicon-1.0.1-py3-none-any.whl", hash = "sha256:7c93d6b634cb4c9687ceab67a8526f05d3b02679df94e273e51a43282e6b034c", size = 6997, upload-time = "2023-03-02T23:28:45.985Z" }, -] - -[[package]] -name = "sphinxcontrib-applehelp" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053, upload-time = "2024-07-29T01:09:00.465Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300, upload-time = "2024-07-29T01:08:58.99Z" }, -] - -[[package]] -name = "sphinxcontrib-devhelp" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967, upload-time = "2024-07-29T01:09:23.417Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530, upload-time = "2024-07-29T01:09:21.945Z" }, -] - -[[package]] -name = "sphinxcontrib-htmlhelp" -version = "2.1.0" +version = "2.8.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617, upload-time = "2024-07-29T01:09:37.889Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/ae/2d9c981590ed9999a0d91755b47fc74f74de286b0f5cee14c9269041e6c4/soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349", size = 118627, upload-time = "2026-01-20T04:27:02.457Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705, upload-time = "2024-07-29T01:09:36.407Z" }, -] - -[[package]] -name = "sphinxcontrib-jsmath" -version = "1.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787, upload-time = "2019-01-21T16:10:16.347Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071, upload-time = "2019-01-21T16:10:14.333Z" }, -] - -[[package]] -name = "sphinxcontrib-qthelp" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165, upload-time = "2024-07-29T01:09:56.435Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743, upload-time = "2024-07-29T01:09:54.885Z" }, -] - -[[package]] -name = "sphinxcontrib-serializinghtml" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080, upload-time = "2024-07-29T01:10:09.332Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072, upload-time = "2024-07-29T01:10:08.203Z" }, + { url = "https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95", size = 37016, upload-time = "2026-01-20T04:27:01.012Z" }, ] [[package]] @@ -5283,51 +5351,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2d/6d/f0c5f171dae8154afa3e59e5c219a286e18478f8127eb822cc62da94c560/sql_redis-0.4.0-py3-none-any.whl", hash = "sha256:c395c883f5e6e633178a362b0f1a748923c0816e68e10827ae5e44cad4b21654", size = 41689, upload-time = "2026-04-06T16:26:33.943Z" }, ] -[[package]] -name = "sqlalchemy" -version = "2.0.44" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "greenlet", marker = "platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f0/f2/840d7b9496825333f532d2e3976b8eadbf52034178aac53630d09fe6e1ef/sqlalchemy-2.0.44.tar.gz", hash = "sha256:0ae7454e1ab1d780aee69fd2aae7d6b8670a581d8847f2d1e0f7ddfbf47e5a22", size = 9819830, upload-time = "2025-10-10T14:39:12.935Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/a7/e9ccfa7eecaf34c6f57d8cb0bb7cbdeeff27017cc0f5d0ca90fdde7a7c0d/sqlalchemy-2.0.44-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c77f3080674fc529b1bd99489378c7f63fcb4ba7f8322b79732e0258f0ea3ce", size = 2137282, upload-time = "2025-10-10T15:36:10.965Z" }, - { url = "https://files.pythonhosted.org/packages/b1/e1/50bc121885bdf10833a4f65ecbe9fe229a3215f4d65a58da8a181734cae3/sqlalchemy-2.0.44-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4c26ef74ba842d61635b0152763d057c8d48215d5be9bb8b7604116a059e9985", size = 2127322, upload-time = "2025-10-10T15:36:12.428Z" }, - { url = "https://files.pythonhosted.org/packages/46/f2/a8573b7230a3ce5ee4b961a2d510d71b43872513647398e595b744344664/sqlalchemy-2.0.44-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4a172b31785e2f00780eccab00bc240ccdbfdb8345f1e6063175b3ff12ad1b0", size = 3214772, upload-time = "2025-10-10T15:34:15.09Z" }, - { url = "https://files.pythonhosted.org/packages/4a/d8/c63d8adb6a7edaf8dcb6f75a2b1e9f8577960a1e489606859c4d73e7d32b/sqlalchemy-2.0.44-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9480c0740aabd8cb29c329b422fb65358049840b34aba0adf63162371d2a96e", size = 3214434, upload-time = "2025-10-10T15:47:00.473Z" }, - { url = "https://files.pythonhosted.org/packages/ee/a6/243d277a4b54fae74d4797957a7320a5c210c293487f931cbe036debb697/sqlalchemy-2.0.44-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:17835885016b9e4d0135720160db3095dc78c583e7b902b6be799fb21035e749", size = 3155365, upload-time = "2025-10-10T15:34:17.932Z" }, - { url = "https://files.pythonhosted.org/packages/5f/f8/6a39516ddd75429fd4ee5a0d72e4c80639fab329b2467c75f363c2ed9751/sqlalchemy-2.0.44-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cbe4f85f50c656d753890f39468fcd8190c5f08282caf19219f684225bfd5fd2", size = 3178910, upload-time = "2025-10-10T15:47:02.346Z" }, - { url = "https://files.pythonhosted.org/packages/43/f0/118355d4ad3c39d9a2f5ee4c7304a9665b3571482777357fa9920cd7a6b4/sqlalchemy-2.0.44-cp310-cp310-win32.whl", hash = "sha256:2fcc4901a86ed81dc76703f3b93ff881e08761c63263c46991081fd7f034b165", size = 2105624, upload-time = "2025-10-10T15:38:15.552Z" }, - { url = "https://files.pythonhosted.org/packages/61/83/6ae5f9466f8aa5d0dcebfff8c9c33b98b27ce23292df3b990454b3d434fd/sqlalchemy-2.0.44-cp310-cp310-win_amd64.whl", hash = "sha256:9919e77403a483ab81e3423151e8ffc9dd992c20d2603bf17e4a8161111e55f5", size = 2129240, upload-time = "2025-10-10T15:38:17.175Z" }, - { url = "https://files.pythonhosted.org/packages/e3/81/15d7c161c9ddf0900b076b55345872ed04ff1ed6a0666e5e94ab44b0163c/sqlalchemy-2.0.44-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fe3917059c7ab2ee3f35e77757062b1bea10a0b6ca633c58391e3f3c6c488dd", size = 2140517, upload-time = "2025-10-10T15:36:15.64Z" }, - { url = "https://files.pythonhosted.org/packages/d4/d5/4abd13b245c7d91bdf131d4916fd9e96a584dac74215f8b5bc945206a974/sqlalchemy-2.0.44-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:de4387a354ff230bc979b46b2207af841dc8bf29847b6c7dbe60af186d97aefa", size = 2130738, upload-time = "2025-10-10T15:36:16.91Z" }, - { url = "https://files.pythonhosted.org/packages/cb/3c/8418969879c26522019c1025171cefbb2a8586b6789ea13254ac602986c0/sqlalchemy-2.0.44-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3678a0fb72c8a6a29422b2732fe423db3ce119c34421b5f9955873eb9b62c1e", size = 3304145, upload-time = "2025-10-10T15:34:19.569Z" }, - { url = "https://files.pythonhosted.org/packages/94/2d/fdb9246d9d32518bda5d90f4b65030b9bf403a935cfe4c36a474846517cb/sqlalchemy-2.0.44-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cf6872a23601672d61a68f390e44703442639a12ee9dd5a88bbce52a695e46e", size = 3304511, upload-time = "2025-10-10T15:47:05.088Z" }, - { url = "https://files.pythonhosted.org/packages/7d/fb/40f2ad1da97d5c83f6c1269664678293d3fe28e90ad17a1093b735420549/sqlalchemy-2.0.44-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:329aa42d1be9929603f406186630135be1e7a42569540577ba2c69952b7cf399", size = 3235161, upload-time = "2025-10-10T15:34:21.193Z" }, - { url = "https://files.pythonhosted.org/packages/95/cb/7cf4078b46752dca917d18cf31910d4eff6076e5b513c2d66100c4293d83/sqlalchemy-2.0.44-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:70e03833faca7166e6a9927fbee7c27e6ecde436774cd0b24bbcc96353bce06b", size = 3261426, upload-time = "2025-10-10T15:47:07.196Z" }, - { url = "https://files.pythonhosted.org/packages/f8/3b/55c09b285cb2d55bdfa711e778bdffdd0dc3ffa052b0af41f1c5d6e582fa/sqlalchemy-2.0.44-cp311-cp311-win32.whl", hash = "sha256:253e2f29843fb303eca6b2fc645aca91fa7aa0aa70b38b6950da92d44ff267f3", size = 2105392, upload-time = "2025-10-10T15:38:20.051Z" }, - { url = "https://files.pythonhosted.org/packages/c7/23/907193c2f4d680aedbfbdf7bf24c13925e3c7c292e813326c1b84a0b878e/sqlalchemy-2.0.44-cp311-cp311-win_amd64.whl", hash = "sha256:7a8694107eb4308a13b425ca8c0e67112f8134c846b6e1f722698708741215d5", size = 2130293, upload-time = "2025-10-10T15:38:21.601Z" }, - { url = "https://files.pythonhosted.org/packages/62/c4/59c7c9b068e6813c898b771204aad36683c96318ed12d4233e1b18762164/sqlalchemy-2.0.44-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72fea91746b5890f9e5e0997f16cbf3d53550580d76355ba2d998311b17b2250", size = 2139675, upload-time = "2025-10-10T16:03:31.064Z" }, - { url = "https://files.pythonhosted.org/packages/d6/ae/eeb0920537a6f9c5a3708e4a5fc55af25900216bdb4847ec29cfddf3bf3a/sqlalchemy-2.0.44-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:585c0c852a891450edbb1eaca8648408a3cc125f18cf433941fa6babcc359e29", size = 2127726, upload-time = "2025-10-10T16:03:35.934Z" }, - { url = "https://files.pythonhosted.org/packages/d8/d5/2ebbabe0379418eda8041c06b0b551f213576bfe4c2f09d77c06c07c8cc5/sqlalchemy-2.0.44-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b94843a102efa9ac68a7a30cd46df3ff1ed9c658100d30a725d10d9c60a2f44", size = 3327603, upload-time = "2025-10-10T15:35:28.322Z" }, - { url = "https://files.pythonhosted.org/packages/45/e5/5aa65852dadc24b7d8ae75b7efb8d19303ed6ac93482e60c44a585930ea5/sqlalchemy-2.0.44-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:119dc41e7a7defcefc57189cfa0e61b1bf9c228211aba432b53fb71ef367fda1", size = 3337842, upload-time = "2025-10-10T15:43:45.431Z" }, - { url = "https://files.pythonhosted.org/packages/41/92/648f1afd3f20b71e880ca797a960f638d39d243e233a7082c93093c22378/sqlalchemy-2.0.44-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0765e318ee9179b3718c4fd7ba35c434f4dd20332fbc6857a5e8df17719c24d7", size = 3264558, upload-time = "2025-10-10T15:35:29.93Z" }, - { url = "https://files.pythonhosted.org/packages/40/cf/e27d7ee61a10f74b17740918e23cbc5bc62011b48282170dc4c66da8ec0f/sqlalchemy-2.0.44-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2e7b5b079055e02d06a4308d0481658e4f06bc7ef211567edc8f7d5dce52018d", size = 3301570, upload-time = "2025-10-10T15:43:48.407Z" }, - { url = "https://files.pythonhosted.org/packages/3b/3d/3116a9a7b63e780fb402799b6da227435be878b6846b192f076d2f838654/sqlalchemy-2.0.44-cp312-cp312-win32.whl", hash = "sha256:846541e58b9a81cce7dee8329f352c318de25aa2f2bbe1e31587eb1f057448b4", size = 2103447, upload-time = "2025-10-10T15:03:21.678Z" }, - { url = "https://files.pythonhosted.org/packages/25/83/24690e9dfc241e6ab062df82cc0df7f4231c79ba98b273fa496fb3dd78ed/sqlalchemy-2.0.44-cp312-cp312-win_amd64.whl", hash = "sha256:7cbcb47fd66ab294703e1644f78971f6f2f1126424d2b300678f419aa73c7b6e", size = 2130912, upload-time = "2025-10-10T15:03:24.656Z" }, - { url = "https://files.pythonhosted.org/packages/45/d3/c67077a2249fdb455246e6853166360054c331db4613cda3e31ab1cadbef/sqlalchemy-2.0.44-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ff486e183d151e51b1d694c7aa1695747599bb00b9f5f604092b54b74c64a8e1", size = 2135479, upload-time = "2025-10-10T16:03:37.671Z" }, - { url = "https://files.pythonhosted.org/packages/2b/91/eabd0688330d6fd114f5f12c4f89b0d02929f525e6bf7ff80aa17ca802af/sqlalchemy-2.0.44-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0b1af8392eb27b372ddb783b317dea0f650241cea5bd29199b22235299ca2e45", size = 2123212, upload-time = "2025-10-10T16:03:41.755Z" }, - { url = "https://files.pythonhosted.org/packages/b0/bb/43e246cfe0e81c018076a16036d9b548c4cc649de241fa27d8d9ca6f85ab/sqlalchemy-2.0.44-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b61188657e3a2b9ac4e8f04d6cf8e51046e28175f79464c67f2fd35bceb0976", size = 3255353, upload-time = "2025-10-10T15:35:31.221Z" }, - { url = "https://files.pythonhosted.org/packages/b9/96/c6105ed9a880abe346b64d3b6ddef269ddfcab04f7f3d90a0bf3c5a88e82/sqlalchemy-2.0.44-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b87e7b91a5d5973dda5f00cd61ef72ad75a1db73a386b62877d4875a8840959c", size = 3260222, upload-time = "2025-10-10T15:43:50.124Z" }, - { url = "https://files.pythonhosted.org/packages/44/16/1857e35a47155b5ad927272fee81ae49d398959cb749edca6eaa399b582f/sqlalchemy-2.0.44-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:15f3326f7f0b2bfe406ee562e17f43f36e16167af99c4c0df61db668de20002d", size = 3189614, upload-time = "2025-10-10T15:35:32.578Z" }, - { url = "https://files.pythonhosted.org/packages/88/ee/4afb39a8ee4fc786e2d716c20ab87b5b1fb33d4ac4129a1aaa574ae8a585/sqlalchemy-2.0.44-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e77faf6ff919aa8cd63f1c4e561cac1d9a454a191bb864d5dd5e545935e5a40", size = 3226248, upload-time = "2025-10-10T15:43:51.862Z" }, - { url = "https://files.pythonhosted.org/packages/32/d5/0e66097fc64fa266f29a7963296b40a80d6a997b7ac13806183700676f86/sqlalchemy-2.0.44-cp313-cp313-win32.whl", hash = "sha256:ee51625c2d51f8baadf2829fae817ad0b66b140573939dd69284d2ba3553ae73", size = 2101275, upload-time = "2025-10-10T15:03:26.096Z" }, - { url = "https://files.pythonhosted.org/packages/03/51/665617fe4f8c6450f42a6d8d69243f9420f5677395572c2fe9d21b493b7b/sqlalchemy-2.0.44-cp313-cp313-win_amd64.whl", hash = "sha256:c1c80faaee1a6c3428cecf40d16a2365bcf56c424c92c2b6f0f9ad204b899e9e", size = 2127901, upload-time = "2025-10-10T15:03:27.548Z" }, - { url = "https://files.pythonhosted.org/packages/9c/5e/6a29fa884d9fb7ddadf6b69490a9d45fded3b38541713010dad16b77d015/sqlalchemy-2.0.44-py3-none-any.whl", hash = "sha256:19de7ca1246fbef9f9d1bff8f1ab25641569df226364a0e40457dc5457c54b05", size = 1928718, upload-time = "2025-10-10T15:29:45.32Z" }, -] - [[package]] name = "sqlglot" version = "28.6.0" @@ -5389,15 +5412,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" }, ] -[[package]] -name = "tabulate" -version = "0.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090, upload-time = "2022-10-06T17:21:48.54Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252, upload-time = "2022-10-06T17:21:44.262Z" }, -] - [[package]] name = "tenacity" version = "9.1.2" @@ -5740,6 +5754,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, ] +[[package]] +name = "tzdata" +version = "2026.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/19/1b9b0e29f30c6d35cb345486df41110984ea67ae69dddbc0e8a100999493/tzdata-2026.2.tar.gz", hash = "sha256:9173fde7d80d9018e02a662e168e5a2d04f87c41ea174b139fbef642eda62d10", size = 198254, upload-time = "2026-04-24T15:22:08.651Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl", hash = "sha256:bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7", size = 349321, upload-time = "2026-04-24T15:22:05.876Z" }, +] + [[package]] name = "uncalled-for" version = "0.2.0" @@ -5809,6 +5832,38 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bf/e9/e13785fb2a3c605ea924ce2e54d235e423f6d6e45ddb09574963655ec111/voyageai-0.3.6-py3-none-any.whl", hash = "sha256:e282f9cef87eb949e2dd30ffe911689f1068c50b8c3c6e90e97793f2a52c83dd", size = 34465, upload-time = "2025-12-09T01:32:51.32Z" }, ] +[[package]] +name = "watchdog" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload-time = "2024-11-01T14:07:13.037Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/56/90994d789c61df619bfc5ce2ecdabd5eeff564e1eb47512bd01b5e019569/watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26", size = 96390, upload-time = "2024-11-01T14:06:24.793Z" }, + { url = "https://files.pythonhosted.org/packages/55/46/9a67ee697342ddf3c6daa97e3a587a56d6c4052f881ed926a849fcf7371c/watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112", size = 88389, upload-time = "2024-11-01T14:06:27.112Z" }, + { url = "https://files.pythonhosted.org/packages/44/65/91b0985747c52064d8701e1075eb96f8c40a79df889e59a399453adfb882/watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3", size = 89020, upload-time = "2024-11-01T14:06:29.876Z" }, + { url = "https://files.pythonhosted.org/packages/e0/24/d9be5cd6642a6aa68352ded4b4b10fb0d7889cb7f45814fb92cecd35f101/watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c", size = 96393, upload-time = "2024-11-01T14:06:31.756Z" }, + { url = "https://files.pythonhosted.org/packages/63/7a/6013b0d8dbc56adca7fdd4f0beed381c59f6752341b12fa0886fa7afc78b/watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2", size = 88392, upload-time = "2024-11-01T14:06:32.99Z" }, + { url = "https://files.pythonhosted.org/packages/d1/40/b75381494851556de56281e053700e46bff5b37bf4c7267e858640af5a7f/watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c", size = 89019, upload-time = "2024-11-01T14:06:34.963Z" }, + { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471, upload-time = "2024-11-01T14:06:37.745Z" }, + { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449, upload-time = "2024-11-01T14:06:39.748Z" }, + { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054, upload-time = "2024-11-01T14:06:41.009Z" }, + { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload-time = "2024-11-01T14:06:42.952Z" }, + { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload-time = "2024-11-01T14:06:45.084Z" }, + { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload-time = "2024-11-01T14:06:47.324Z" }, + { url = "https://files.pythonhosted.org/packages/30/ad/d17b5d42e28a8b91f8ed01cb949da092827afb9995d4559fd448d0472763/watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881", size = 87902, upload-time = "2024-11-01T14:06:53.119Z" }, + { url = "https://files.pythonhosted.org/packages/5c/ca/c3649991d140ff6ab67bfc85ab42b165ead119c9e12211e08089d763ece5/watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11", size = 88380, upload-time = "2024-11-01T14:06:55.19Z" }, + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload-time = "2024-11-01T14:07:03.893Z" }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload-time = "2024-11-01T14:07:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload-time = "2024-11-01T14:07:06.376Z" }, + { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload-time = "2024-11-01T14:07:07.547Z" }, + { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload-time = "2024-11-01T14:07:09.525Z" }, + { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload-time = "2024-11-01T14:07:10.686Z" }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" }, +] + [[package]] name = "watchfiles" version = "1.1.1"