From a7f9ce9a3a9e6d80c428ebf995462cb6e57d36bc Mon Sep 17 00:00:00 2001 From: ehhuang Date: Mon, 22 Sep 2025 22:53:48 -0700 Subject: [PATCH 01/27] chore: fix build (#3522) # What does this PR do? error: https://github.com/llamastack/llama-stack-ops/actions/runs/17932015232/job/50990948479 ## Test Plan GITHUB_ACTIONS=true BUILD_PLATFORM=linux/amd64 USE_COPY_NOT_MOUNT=true LLAMA_STACK_DIR=. uv run --with llama-stack llama stack build --distro starter --image-type container --image-name ehhuang/distribution-starter succeeds --- llama_stack/core/build_container.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/llama_stack/core/build_container.sh b/llama_stack/core/build_container.sh index 424b40a9d..8e47fc592 100755 --- a/llama_stack/core/build_container.sh +++ b/llama_stack/core/build_container.sh @@ -147,7 +147,7 @@ WORKDIR /app RUN dnf -y update && dnf install -y iputils git net-tools wget \ vim-minimal python3.12 python3.12-pip python3.12-wheel \ - python3.12-setuptools python3.12-devel gcc make && \ + python3.12-setuptools python3.12-devel gcc gcc-c++ make && \ ln -s /bin/pip3.12 /bin/pip && ln -s /bin/python3.12 /bin/python && dnf clean all ENV UV_SYSTEM_PYTHON=1 @@ -164,7 +164,7 @@ RUN apt-get update && apt-get install -y \ procps psmisc lsof \ traceroute \ bubblewrap \ - gcc \ + gcc g++ \ && rm -rf /var/lib/apt/lists/* ENV UV_SYSTEM_PYTHON=1 From 62e0aef7bc3ba08dd7aca31f08f1033f217b40aa Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Tue, 23 Sep 2025 12:30:00 -0400 Subject: [PATCH 02/27] fix: return llama stack model id from embeddings (#3525) # What does this PR do? the openai_embeddings method on OpenAIMixin was returning the provider's model id instead of the llama stack name ## Test Plan before - ``` $ ./scripts/integration-tests.sh --stack-config server:ci-tests --setup gpt --subdirs inference --inference-mode live --pattern test_openai_embeddings_single_string ... FAILED tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_single_string[openai_client-emb=openai/text-embedding-3-small] - AssertionError: assert 'text-embedding-3-small' == 'openai/text-...dding-3-small' FAILED tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_single_string[llama_stack_client-emb=openai/text-embedding-3-small] - AssertionError: assert 'text-embedding-3-small' == 'openai/text-...dding-3-small' ========================================== 2 failed, 95 deselected, 4 warnings in 3.87s =========================================== ``` after - ``` $ ./scripts/integration-tests.sh --stack-config server:ci-tests --setup gpt --subdirs inference --inference-mode live --pattern test_openai_embeddings_single_string ... ========================================== 2 passed, 95 deselected, 4 warnings in 2.12s =========================================== ``` --- llama_stack/providers/utils/inference/openai_mixin.py | 2 +- tests/integration/suites.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/llama_stack/providers/utils/inference/openai_mixin.py b/llama_stack/providers/utils/inference/openai_mixin.py index c57f65bca..2fe343f63 100644 --- a/llama_stack/providers/utils/inference/openai_mixin.py +++ b/llama_stack/providers/utils/inference/openai_mixin.py @@ -296,7 +296,7 @@ class OpenAIMixin(ABC): return OpenAIEmbeddingsResponse( data=data, - model=response.model, + model=model, usage=usage, ) diff --git a/tests/integration/suites.py b/tests/integration/suites.py index fb2c44308..354dc1f4c 100644 --- a/tests/integration/suites.py +++ b/tests/integration/suites.py @@ -87,7 +87,7 @@ SETUP_DEFINITIONS: dict[str, Setup] = { description="OpenAI GPT models for high-quality responses and tool calling", defaults={ "text_model": "openai/gpt-4o", - "embedding_model": "sentence-transformers/all-MiniLM-L6-v2", + "embedding_model": "openai/text-embedding-3-small", }, ), "tgi": Setup( From 2be869b3effb772eda516251163261302c605199 Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Tue, 23 Sep 2025 12:56:33 -0400 Subject: [PATCH 03/27] fix(dev): fix vllm inference recording (await models.list) (#3524) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # What does this PR do? fix inference recording for vLLM closes #3523 ## Test Plan ``` $ ./scripts/integration-tests.sh --stack-config server:ci-tests --setup vllm --subdirs inference --inference-mode record --pattern test_text_chat_completion_non_streaming === Llama Stack Integration Test Runner === Stack Config: server:ci-tests Setup: vllm Inference Mode: record Test Suite: base Test Subdirs: inference Test Pattern: test_text_chat_completion_non_streaming ... === Applying Setup Environment Variables === Setting up environment variables: export VLLM_URL='http://localhost:8000/v1' === Starting Llama Stack Server === Waiting for Llama Stack Server to start... ✅ Llama Stack Server started successfully === Running Integration Tests === Test subdirs to run: inference Added test files from inference: 6 files === Running all collected tests in a single pytest command === Total test files: 6 + pytest -s -v tests/integration/inference/test_openai_completion.py tests/integration/inference/test_batch_inference.py tests/integration/inference/test_openai_embeddings.py tests/integration/inference/test_text_inference.py tests/integration/inference/test_vision_inference.py tests/integration/inference/test_embedding.py --stack-config=server:ci-tests --inference-mode=record -k 'not( builtin_tool or safety_with_image or code_interpreter or test_rag or test_inference_store_tool_calls ) and test_text_chat_completion_non_streaming' --setup=vllm --color=yes --capture=tee-sys INFO 2025-09-23 10:35:36,662 tests.integration.conftest:86 tests: Applying setup 'vllm' ======================================================= test session starts ======================================================= platform linux -- Python 3.12.11, pytest-8.4.2, pluggy-1.6.0 -- .../.venv/bin/python3 cachedir: .pytest_cache metadata: {'Python': '3.12.11', 'Platform': 'Linux-6.16.7-200.fc42.x86_64-x86_64-with-glibc2.41', 'Packages': {'pytest': '8.4.2', 'pluggy': '1.6.0'}, 'Plugins': {'html': '4.1.1', 'anyio': '4.9.0', 'timeout': '2.4.0', 'cov': '6.2.1', 'asyncio': '1.1.0', 'nbval': '0.11.0', 'socket': '0.7.0', 'json-report': '1.5.0', 'metadata': '3.1.1'}} rootdir: ... configfile: pyproject.toml plugins: html-4.1.1, anyio-4.9.0, timeout-2.4.0, cov-6.2.1, asyncio-1.1.0, nbval-0.11.0, socket-0.7.0, json-report-1.5.0, metadata-3.1.1 asyncio: mode=Mode.AUTO, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function collected 97 items / 95 deselected / 2 selected tests/integration/inference/test_text_inference.py::test_text_chat_completion_non_streaming[txt=vllm/Qwen/Qwen3-0.6B-inference:chat_completion:non_streaming_01] instantiating llama_stack_client Port 8321 is already in use, assuming server is already running... llama_stack_client instantiated in 0.044s PASSED [ 50%] tests/integration/inference/test_text_inference.py::test_text_chat_completion_non_streaming[txt=vllm/Qwen/Qwen3-0.6B-inference:chat_completion:non_streaming_02] PASSED [100%] ====================================================== slowest 10 durations ======================================================= 1.62s call tests/integration/inference/test_text_inference.py::test_text_chat_completion_non_streaming[txt=vllm/Qwen/Qwen3-0.6B-inference:chat_completion:non_streaming_02] 0.93s call tests/integration/inference/test_text_inference.py::test_text_chat_completion_non_streaming[txt=vllm/Qwen/Qwen3-0.6B-inference:chat_completion:non_streaming_01] 0.62s setup tests/integration/inference/test_text_inference.py::test_text_chat_completion_non_streaming[txt=vllm/Qwen/Qwen3-0.6B-inference:chat_completion:non_streaming_01] (3 durations < 0.005s hidden. Use -vv to show these durations.) ========================================== 2 passed, 95 deselected, 6 warnings in 3.26s =========================================== + exit_code=0 + set +x ✅ All tests completed successfully ``` ``` $ git status ... Untracked files: (use "git add ..." to include in what will be committed) tests/integration/recordings/responses/032f8c5a1289.json tests/integration/recordings/responses/c42baf6a3700.json tests/integration/recordings/responses/models-bd032f995f2a-fb68f5a6.json ... ``` --- llama_stack/providers/remote/inference/vllm/vllm.py | 2 +- tests/unit/providers/inference/test_remote_vllm.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/llama_stack/providers/remote/inference/vllm/vllm.py b/llama_stack/providers/remote/inference/vllm/vllm.py index b4079c39f..15f807846 100644 --- a/llama_stack/providers/remote/inference/vllm/vllm.py +++ b/llama_stack/providers/remote/inference/vllm/vllm.py @@ -504,7 +504,7 @@ class VLLMInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin, Inference, ModelsPro except ValueError: pass # Ignore statically unknown model, will check live listing try: - res = await self.client.models.list() + res = self.client.models.list() except APIConnectionError as e: raise ValueError( f"Failed to connect to vLLM at {self.config.url}. Please check if vLLM is running and accessible at that URL." diff --git a/tests/unit/providers/inference/test_remote_vllm.py b/tests/unit/providers/inference/test_remote_vllm.py index 9545e0cf6..4dc2e0c16 100644 --- a/tests/unit/providers/inference/test_remote_vllm.py +++ b/tests/unit/providers/inference/test_remote_vllm.py @@ -62,7 +62,7 @@ from llama_stack.providers.remote.inference.vllm.vllm import ( @pytest.fixture(scope="module") def mock_openai_models_list(): - with patch("openai.resources.models.AsyncModels.list", new_callable=AsyncMock) as mock_list: + with patch("openai.resources.models.AsyncModels.list") as mock_list: yield mock_list From 9406a998b967552977c7c8d514bb48a7d1c31be0 Mon Sep 17 00:00:00 2001 From: ehhuang Date: Tue, 23 Sep 2025 10:14:41 -0700 Subject: [PATCH 04/27] chore: refactor tracingmiddelware (#3520) # What does this PR do? Just moving TracingMiddleware to a new file ## Test Plan CI --- llama_stack/core/server/server.py | 71 ++--------------------------- llama_stack/core/server/tracing.py | 72 ++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 68 deletions(-) create mode 100644 llama_stack/core/server/tracing.py diff --git a/llama_stack/core/server/server.py b/llama_stack/core/server/server.py index 9cca42268..7d119c139 100644 --- a/llama_stack/core/server/server.py +++ b/llama_stack/core/server/server.py @@ -25,7 +25,6 @@ from typing import Annotated, Any, get_origin import httpx import rich.pretty import yaml -from aiohttp import hdrs from fastapi import Body, FastAPI, HTTPException, Request, Response from fastapi import Path as FastapiPath from fastapi.exceptions import RequestValidationError @@ -45,17 +44,13 @@ from llama_stack.core.datatypes import ( process_cors_config, ) from llama_stack.core.distribution import builtin_automatically_routed_apis -from llama_stack.core.external import ExternalApiSpec, load_external_apis +from llama_stack.core.external import load_external_apis from llama_stack.core.request_headers import ( PROVIDER_DATA_VAR, request_provider_data_context, user_from_scope, ) -from llama_stack.core.server.routes import ( - find_matching_route, - get_all_api_routes, - initialize_route_impls, -) +from llama_stack.core.server.routes import get_all_api_routes from llama_stack.core.stack import ( Stack, cast_image_name_to_string, @@ -73,13 +68,12 @@ from llama_stack.providers.inline.telemetry.meta_reference.telemetry import ( ) from llama_stack.providers.utils.telemetry.tracing import ( CURRENT_TRACE_CONTEXT, - end_trace, setup_logger, - start_trace, ) from .auth import AuthenticationMiddleware from .quota import QuotaMiddleware +from .tracing import TracingMiddleware REPO_ROOT = Path(__file__).parent.parent.parent.parent @@ -299,65 +293,6 @@ def create_dynamic_typed_route(func: Any, method: str, route: str) -> Callable: return route_handler -class TracingMiddleware: - def __init__(self, app, impls, external_apis: dict[str, ExternalApiSpec]): - self.app = app - self.impls = impls - self.external_apis = external_apis - # FastAPI built-in paths that should bypass custom routing - self.fastapi_paths = ("/docs", "/redoc", "/openapi.json", "/favicon.ico", "/static") - - async def __call__(self, scope, receive, send): - if scope.get("type") == "lifespan": - return await self.app(scope, receive, send) - - path = scope.get("path", "") - - # Check if the path is a FastAPI built-in path - if path.startswith(self.fastapi_paths): - # Pass through to FastAPI's built-in handlers - logger.debug(f"Bypassing custom routing for FastAPI built-in path: {path}") - return await self.app(scope, receive, send) - - if not hasattr(self, "route_impls"): - self.route_impls = initialize_route_impls(self.impls, self.external_apis) - - try: - _, _, route_path, webmethod = find_matching_route( - scope.get("method", hdrs.METH_GET), path, self.route_impls - ) - except ValueError: - # If no matching endpoint is found, pass through to FastAPI - logger.debug(f"No matching route found for path: {path}, falling back to FastAPI") - return await self.app(scope, receive, send) - - trace_attributes = {"__location__": "server", "raw_path": path} - - # Extract W3C trace context headers and store as trace attributes - headers = dict(scope.get("headers", [])) - traceparent = headers.get(b"traceparent", b"").decode() - if traceparent: - trace_attributes["traceparent"] = traceparent - tracestate = headers.get(b"tracestate", b"").decode() - if tracestate: - trace_attributes["tracestate"] = tracestate - - trace_path = webmethod.descriptive_name or route_path - trace_context = await start_trace(trace_path, trace_attributes) - - async def send_with_trace_id(message): - if message["type"] == "http.response.start": - headers = message.get("headers", []) - headers.append([b"x-trace-id", str(trace_context.trace_id).encode()]) - message["headers"] = headers - await send(message) - - try: - return await self.app(scope, receive, send_with_trace_id) - finally: - await end_trace() - - class ClientVersionMiddleware: def __init__(self, app): self.app = app diff --git a/llama_stack/core/server/tracing.py b/llama_stack/core/server/tracing.py new file mode 100644 index 000000000..c48fc4d33 --- /dev/null +++ b/llama_stack/core/server/tracing.py @@ -0,0 +1,72 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. +from aiohttp import hdrs + +from llama_stack.core.external import ExternalApiSpec +from llama_stack.core.server.routes import find_matching_route, initialize_route_impls +from llama_stack.log import get_logger +from llama_stack.providers.utils.telemetry.tracing import end_trace, start_trace + +logger = get_logger(name=__name__, category="core::server") + + +class TracingMiddleware: + def __init__(self, app, impls, external_apis: dict[str, ExternalApiSpec]): + self.app = app + self.impls = impls + self.external_apis = external_apis + # FastAPI built-in paths that should bypass custom routing + self.fastapi_paths = ("/docs", "/redoc", "/openapi.json", "/favicon.ico", "/static") + + async def __call__(self, scope, receive, send): + if scope.get("type") == "lifespan": + return await self.app(scope, receive, send) + + path = scope.get("path", "") + + # Check if the path is a FastAPI built-in path + if path.startswith(self.fastapi_paths): + # Pass through to FastAPI's built-in handlers + logger.debug(f"Bypassing custom routing for FastAPI built-in path: {path}") + return await self.app(scope, receive, send) + + if not hasattr(self, "route_impls"): + self.route_impls = initialize_route_impls(self.impls, self.external_apis) + + try: + _, _, route_path, webmethod = find_matching_route( + scope.get("method", hdrs.METH_GET), path, self.route_impls + ) + except ValueError: + # If no matching endpoint is found, pass through to FastAPI + logger.debug(f"No matching route found for path: {path}, falling back to FastAPI") + return await self.app(scope, receive, send) + + trace_attributes = {"__location__": "server", "raw_path": path} + + # Extract W3C trace context headers and store as trace attributes + headers = dict(scope.get("headers", [])) + traceparent = headers.get(b"traceparent", b"").decode() + if traceparent: + trace_attributes["traceparent"] = traceparent + tracestate = headers.get(b"tracestate", b"").decode() + if tracestate: + trace_attributes["tracestate"] = tracestate + + trace_path = webmethod.descriptive_name or route_path + trace_context = await start_trace(trace_path, trace_attributes) + + async def send_with_trace_id(message): + if message["type"] == "http.response.start": + headers = message.get("headers", []) + headers.append([b"x-trace-id", str(trace_context.trace_id).encode()]) + message["headers"] = headers + await send(message) + + try: + return await self.app(scope, receive, send_with_trace_id) + finally: + await end_trace() From d07ebce4d9cb742c5b04e2a1c888ba36f1d11058 Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Tue, 23 Sep 2025 15:37:23 -0400 Subject: [PATCH 05/27] feat: (re-)enable Databricks inference adapter (#3500) # What does this PR do? add/enable the Databricks inference adapter Databricks inference adapter was broken, closes #3486 - remove deprecated completion / chat_completion endpoints - enable dynamic model listing w/o refresh, listing is not async - use SecretStr instead of str for token - backward incompatible change: for consistency with databricks docs, env DATABRICKS_URL -> DATABRICKS_HOST and DATABRICKS_API_TOKEN -> DATABRICKS_TOKEN - databricks urls are custom per user/org, add special recorder handling for databricks urls - add integration test --setup databricks - enable chat completions tests - enable embeddings tests - disable n > 1 tests - disable embeddings base64 tests - disable embeddings dimensions tests note: reasoning models, e.g. gpt oss, fail because databricks has a custom, incompatible response format ## Test Plan ci and ``` ./scripts/integration-tests.sh --stack-config server:ci-tests --setup databricks --subdirs inference --pattern openai ``` note: databricks needs to be manually added to the ci-tests distro for replay testing --- .../providers/inference/remote_databricks.md | 6 +- llama_stack/providers/registry/inference.py | 2 +- .../remote/inference/databricks/__init__.py | 3 +- .../remote/inference/databricks/config.py | 10 +- .../remote/inference/databricks/databricks.py | 191 +- llama_stack/testing/inference_recorder.py | 4 + .../inference/test_openai_completion.py | 2 +- .../inference/test_openai_embeddings.py | 4 +- .../recordings/responses/121a72d1c4cf.json | 728 ++++ .../recordings/responses/249b7f0ddde6.json | 56 + .../recordings/responses/28648cf8d421.json | 56 + .../recordings/responses/29585e055e6f.json | 56 + .../recordings/responses/3ef0f9aab128.json | 344 ++ .../recordings/responses/441e2832387f.json | 1061 ++++++ .../recordings/responses/5fa0e98f3d84.json | 1061 ++++++ .../recordings/responses/6d937e5e9233.json | 1061 ++++++ .../recordings/responses/7f53b458dad9.json | 83 + .../recordings/responses/875323ed9913.json | 3125 +++++++++++++++++ .../recordings/responses/9b9e8cf39b15.json | 1062 ++++++ .../recordings/responses/d64ffaa0de6f.json | 1062 ++++++ .../recordings/responses/e509387fc329.json | 168 + .../recordings/responses/ecf6f0c51485.json | 536 +++ .../recordings/responses/ffd7b58fded8.json | 1061 ++++++ tests/integration/suites.py | 8 + 24 files changed, 11649 insertions(+), 101 deletions(-) create mode 100644 tests/integration/recordings/responses/121a72d1c4cf.json create mode 100644 tests/integration/recordings/responses/249b7f0ddde6.json create mode 100644 tests/integration/recordings/responses/28648cf8d421.json create mode 100644 tests/integration/recordings/responses/29585e055e6f.json create mode 100644 tests/integration/recordings/responses/3ef0f9aab128.json create mode 100644 tests/integration/recordings/responses/441e2832387f.json create mode 100644 tests/integration/recordings/responses/5fa0e98f3d84.json create mode 100644 tests/integration/recordings/responses/6d937e5e9233.json create mode 100644 tests/integration/recordings/responses/7f53b458dad9.json create mode 100644 tests/integration/recordings/responses/875323ed9913.json create mode 100644 tests/integration/recordings/responses/9b9e8cf39b15.json create mode 100644 tests/integration/recordings/responses/d64ffaa0de6f.json create mode 100644 tests/integration/recordings/responses/e509387fc329.json create mode 100644 tests/integration/recordings/responses/ecf6f0c51485.json create mode 100644 tests/integration/recordings/responses/ffd7b58fded8.json diff --git a/docs/source/providers/inference/remote_databricks.md b/docs/source/providers/inference/remote_databricks.md index d0ac89055..3b418f7d4 100644 --- a/docs/source/providers/inference/remote_databricks.md +++ b/docs/source/providers/inference/remote_databricks.md @@ -9,13 +9,13 @@ Databricks inference provider for running models on Databricks' unified analytic | Field | Type | Required | Default | Description | |-------|------|----------|---------|-------------| | `url` | `` | No | | The URL for the Databricks model serving endpoint | -| `api_token` | `` | No | | The Databricks API token | +| `api_token` | `` | No | | The Databricks API token | ## Sample Configuration ```yaml -url: ${env.DATABRICKS_URL:=} -api_token: ${env.DATABRICKS_API_TOKEN:=} +url: ${env.DATABRICKS_HOST:=} +api_token: ${env.DATABRICKS_TOKEN:=} ``` diff --git a/llama_stack/providers/registry/inference.py b/llama_stack/providers/registry/inference.py index 658611698..89d7f55e8 100644 --- a/llama_stack/providers/registry/inference.py +++ b/llama_stack/providers/registry/inference.py @@ -142,7 +142,7 @@ def available_providers() -> list[ProviderSpec]: api=Api.inference, adapter_type="databricks", provider_type="remote::databricks", - pip_packages=[], + pip_packages=["databricks-sdk"], module="llama_stack.providers.remote.inference.databricks", config_class="llama_stack.providers.remote.inference.databricks.DatabricksImplConfig", description="Databricks inference provider for running models on Databricks' unified analytics platform.", diff --git a/llama_stack/providers/remote/inference/databricks/__init__.py b/llama_stack/providers/remote/inference/databricks/__init__.py index 89da31130..24f658a2b 100644 --- a/llama_stack/providers/remote/inference/databricks/__init__.py +++ b/llama_stack/providers/remote/inference/databricks/__init__.py @@ -5,10 +5,11 @@ # the root directory of this source tree. from .config import DatabricksImplConfig -from .databricks import DatabricksInferenceAdapter async def get_adapter_impl(config: DatabricksImplConfig, _deps): + from .databricks import DatabricksInferenceAdapter + assert isinstance(config, DatabricksImplConfig), f"Unexpected config type: {type(config)}" impl = DatabricksInferenceAdapter(config) await impl.initialize() diff --git a/llama_stack/providers/remote/inference/databricks/config.py b/llama_stack/providers/remote/inference/databricks/config.py index cc2a2c302..67cd0480c 100644 --- a/llama_stack/providers/remote/inference/databricks/config.py +++ b/llama_stack/providers/remote/inference/databricks/config.py @@ -6,7 +6,7 @@ from typing import Any -from pydantic import BaseModel, Field +from pydantic import BaseModel, Field, SecretStr from llama_stack.schema_utils import json_schema_type @@ -17,16 +17,16 @@ class DatabricksImplConfig(BaseModel): default=None, description="The URL for the Databricks model serving endpoint", ) - api_token: str = Field( - default=None, + api_token: SecretStr = Field( + default=SecretStr(None), description="The Databricks API token", ) @classmethod def sample_run_config( cls, - url: str = "${env.DATABRICKS_URL:=}", - api_token: str = "${env.DATABRICKS_API_TOKEN:=}", + url: str = "${env.DATABRICKS_HOST:=}", + api_token: str = "${env.DATABRICKS_TOKEN:=}", **kwargs: Any, ) -> dict[str, Any]: return { diff --git a/llama_stack/providers/remote/inference/databricks/databricks.py b/llama_stack/providers/remote/inference/databricks/databricks.py index 34ee59212..f2dc302e0 100644 --- a/llama_stack/providers/remote/inference/databricks/databricks.py +++ b/llama_stack/providers/remote/inference/databricks/databricks.py @@ -4,23 +4,26 @@ # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. -from collections.abc import AsyncGenerator +from collections.abc import AsyncIterator +from typing import Any -from openai import OpenAI +from databricks.sdk import WorkspaceClient from llama_stack.apis.common.content_types import ( InterleavedContent, InterleavedContentItem, ) from llama_stack.apis.inference import ( - ChatCompletionRequest, ChatCompletionResponse, + ChatCompletionResponseStreamChunk, + CompletionResponse, + CompletionResponseStreamChunk, EmbeddingsResponse, EmbeddingTaskType, Inference, LogProbConfig, Message, - OpenAIEmbeddingsResponse, + OpenAICompletion, ResponseFormat, SamplingParams, TextTruncation, @@ -29,49 +32,50 @@ from llama_stack.apis.inference import ( ToolDefinition, ToolPromptFormat, ) -from llama_stack.models.llama.sku_types import CoreModelId +from llama_stack.apis.models import Model, ModelType +from llama_stack.log import get_logger from llama_stack.providers.utils.inference.model_registry import ( - ModelRegistryHelper, - build_hf_repo_model_entry, -) -from llama_stack.providers.utils.inference.openai_compat import ( - OpenAIChatCompletionToLlamaStackMixin, - OpenAICompletionToLlamaStackMixin, - get_sampling_options, - process_chat_completion_response, - process_chat_completion_stream_response, -) -from llama_stack.providers.utils.inference.prompt_adapter import ( - chat_completion_request_to_prompt, + ProviderModelEntry, ) +from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from .config import DatabricksImplConfig -SAFETY_MODELS_ENTRIES = [] +logger = get_logger(name=__name__, category="inference::databricks") -# https://docs.databricks.com/aws/en/machine-learning/model-serving/foundation-model-overview -MODEL_ENTRIES = [ - build_hf_repo_model_entry( - "databricks-meta-llama-3-1-70b-instruct", - CoreModelId.llama3_1_70b_instruct.value, + +# source: https://docs.databricks.com/aws/en/machine-learning/foundation-model-apis/supported-models +EMBEDDING_MODEL_ENTRIES = { + "databricks-gte-large-en": ProviderModelEntry( + provider_model_id="databricks-gte-large-en", + metadata={ + "embedding_dimension": 1024, + "context_length": 8192, + }, ), - build_hf_repo_model_entry( - "databricks-meta-llama-3-1-405b-instruct", - CoreModelId.llama3_1_405b_instruct.value, + "databricks-bge-large-en": ProviderModelEntry( + provider_model_id="databricks-bge-large-en", + metadata={ + "embedding_dimension": 1024, + "context_length": 512, + }, ), -] + SAFETY_MODELS_ENTRIES +} class DatabricksInferenceAdapter( - ModelRegistryHelper, + OpenAIMixin, Inference, - OpenAIChatCompletionToLlamaStackMixin, - OpenAICompletionToLlamaStackMixin, ): def __init__(self, config: DatabricksImplConfig) -> None: - ModelRegistryHelper.__init__(self, model_entries=MODEL_ENTRIES) self.config = config + def get_api_key(self) -> str: + return self.config.api_token.get_secret_value() + + def get_base_url(self) -> str: + return f"{self.config.url}/serving-endpoints" + async def initialize(self) -> None: return @@ -80,72 +84,54 @@ class DatabricksInferenceAdapter( async def completion( self, - model: str, + model_id: str, content: InterleavedContent, sampling_params: SamplingParams | None = None, response_format: ResponseFormat | None = None, stream: bool | None = False, logprobs: LogProbConfig | None = None, - ) -> AsyncGenerator: + ) -> CompletionResponse | AsyncIterator[CompletionResponseStreamChunk]: + raise NotImplementedError() + + async def openai_completion( + self, + model: str, + prompt: str | list[str] | list[int] | list[list[int]], + best_of: int | None = None, + echo: bool | None = None, + frequency_penalty: float | None = None, + logit_bias: dict[str, float] | None = None, + logprobs: bool | None = None, + max_tokens: int | None = None, + n: int | None = None, + presence_penalty: float | None = None, + seed: int | None = None, + stop: str | list[str] | None = None, + stream: bool | None = None, + stream_options: dict[str, Any] | None = None, + temperature: float | None = None, + top_p: float | None = None, + user: str | None = None, + guided_choice: list[str] | None = None, + prompt_logprobs: int | None = None, + suffix: str | None = None, + ) -> OpenAICompletion: raise NotImplementedError() async def chat_completion( self, - model: str, + model_id: str, messages: list[Message], sampling_params: SamplingParams | None = None, - response_format: ResponseFormat | None = None, tools: list[ToolDefinition] | None = None, tool_choice: ToolChoice | None = ToolChoice.auto, tool_prompt_format: ToolPromptFormat | None = None, + response_format: ResponseFormat | None = None, stream: bool | None = False, logprobs: LogProbConfig | None = None, tool_config: ToolConfig | None = None, - ) -> AsyncGenerator: - if sampling_params is None: - sampling_params = SamplingParams() - request = ChatCompletionRequest( - model=model, - messages=messages, - sampling_params=sampling_params, - tools=tools or [], - stream=stream, - logprobs=logprobs, - tool_config=tool_config, - ) - - client = OpenAI(base_url=self.config.url, api_key=self.config.api_token) - if stream: - return self._stream_chat_completion(request, client) - else: - return await self._nonstream_chat_completion(request, client) - - async def _nonstream_chat_completion( - self, request: ChatCompletionRequest, client: OpenAI - ) -> ChatCompletionResponse: - params = self._get_params(request) - r = client.completions.create(**params) - return process_chat_completion_response(r, request) - - async def _stream_chat_completion(self, request: ChatCompletionRequest, client: OpenAI) -> AsyncGenerator: - params = self._get_params(request) - - async def _to_async_generator(): - s = client.completions.create(**params) - for chunk in s: - yield chunk - - stream = _to_async_generator() - async for chunk in process_chat_completion_stream_response(stream, request): - yield chunk - - def _get_params(self, request: ChatCompletionRequest) -> dict: - return { - "model": request.model, - "prompt": chat_completion_request_to_prompt(request, self.get_llama_model(request.model)), - "stream": request.stream, - **get_sampling_options(request.sampling_params), - } + ) -> ChatCompletionResponse | AsyncIterator[ChatCompletionResponseStreamChunk]: + raise NotImplementedError() async def embeddings( self, @@ -157,12 +143,39 @@ class DatabricksInferenceAdapter( ) -> EmbeddingsResponse: raise NotImplementedError() - async def openai_embeddings( - self, - model: str, - input: str | list[str], - encoding_format: str | None = "float", - dimensions: int | None = None, - user: str | None = None, - ) -> OpenAIEmbeddingsResponse: - raise NotImplementedError() + async def list_models(self) -> list[Model] | None: + self._model_cache = {} # from OpenAIMixin + ws_client = WorkspaceClient(host=self.config.url, token=self.get_api_key()) # TODO: this is not async + endpoints = ws_client.serving_endpoints.list() + for endpoint in endpoints: + model = Model( + provider_id=self.__provider_id__, + provider_resource_id=endpoint.name, + identifier=endpoint.name, + ) + if endpoint.task == "llm/v1/chat": + model.model_type = ModelType.llm # this is redundant, but informative + elif endpoint.task == "llm/v1/embeddings": + if endpoint.name not in EMBEDDING_MODEL_ENTRIES: + logger.warning(f"No metadata information available for embedding model {endpoint.name}, skipping.") + continue + model.model_type = ModelType.embedding + model.metadata = EMBEDDING_MODEL_ENTRIES[endpoint.name].metadata + else: + logger.warning(f"Unknown model type, skipping: {endpoint}") + continue + + self._model_cache[endpoint.name] = model + + return list(self._model_cache.values()) + + async def register_model(self, model: Model) -> Model: + if not await self.check_model_availability(model.provider_resource_id): + raise ValueError(f"Model {model.provider_resource_id} is not available in Databricks workspace.") + return model + + async def unregister_model(self, model_id: str) -> None: + pass + + async def should_refresh_models(self) -> bool: + return False diff --git a/llama_stack/testing/inference_recorder.py b/llama_stack/testing/inference_recorder.py index 1071da13f..dacf69606 100644 --- a/llama_stack/testing/inference_recorder.py +++ b/llama_stack/testing/inference_recorder.py @@ -267,6 +267,10 @@ async def _patched_inference_method(original_method, self, client_type, endpoint raise ValueError(f"Unknown client type: {client_type}") url = base_url.rstrip("/") + endpoint + # Special handling for Databricks URLs to avoid leaking workspace info + # e.g. https://adb-1234567890123456.7.cloud.databricks.com -> https://...cloud.databricks.com + if "cloud.databricks.com" in url: + url = "__databricks__" + url.split("cloud.databricks.com")[-1] method = "POST" headers = {} body = kwargs diff --git a/tests/integration/inference/test_openai_completion.py b/tests/integration/inference/test_openai_completion.py index b232f8658..8ca3860c3 100644 --- a/tests/integration/inference/test_openai_completion.py +++ b/tests/integration/inference/test_openai_completion.py @@ -98,6 +98,7 @@ def skip_if_doesnt_support_n(client_with_models, model_id): # the entered value was 2. Update the candidateCount value and try again.', 'status': 'INVALID_ARGUMENT'} "remote::tgi", # TGI ignores n param silently "remote::together", # `n` > 1 is not supported when streaming tokens. Please disable `stream` + "remote::databricks", # Bad request: parameter "n" must be equal to 1 for streaming mode ): pytest.skip(f"Model {model_id} hosted by {provider.provider_type} doesn't support n param.") @@ -110,7 +111,6 @@ def skip_if_model_doesnt_support_openai_chat_completion(client_with_models, mode "inline::vllm", "remote::bedrock", "remote::cerebras", - "remote::databricks", "remote::runpod", "remote::watsonx", # watsonx returns 404 when hitting the /openai/v1 endpoint ): diff --git a/tests/integration/inference/test_openai_embeddings.py b/tests/integration/inference/test_openai_embeddings.py index ce3d2a8ea..ff18c0418 100644 --- a/tests/integration/inference/test_openai_embeddings.py +++ b/tests/integration/inference/test_openai_embeddings.py @@ -42,6 +42,7 @@ def skip_if_model_doesnt_support_encoding_format_base64(client, model_id): provider = provider_from_model(client, model_id) if provider.provider_type in ( "remote::together", # param silently ignored, always returns floats + "remote::databricks", # param silently ignored, always returns floats "remote::fireworks", # param silently ignored, always returns list of floats ): pytest.skip(f"Model {model_id} hosted by {provider.provider_type} does not support encoding_format='base64'.") @@ -52,6 +53,8 @@ def skip_if_model_doesnt_support_variable_dimensions(client_with_models, model_i if provider.provider_type in ( "remote::together", # returns 400 "inline::sentence-transformers", + # Error code: 400 - {'error_code': 'BAD_REQUEST', 'message': 'Bad request: json: unknown field "dimensions"\n'} + "remote::databricks", ): pytest.skip( f"Model {model_id} hosted by {provider.provider_type} does not support variable output embedding dimensions." @@ -75,7 +78,6 @@ def skip_if_model_doesnt_support_openai_embeddings(client, model_id): "inline::meta-reference", "remote::bedrock", "remote::cerebras", - "remote::databricks", "remote::runpod", "remote::sambanova", "remote::tgi", diff --git a/tests/integration/recordings/responses/121a72d1c4cf.json b/tests/integration/recordings/responses/121a72d1c4cf.json new file mode 100644 index 000000000..2f4bd7dce --- /dev/null +++ b/tests/integration/recordings/responses/121a72d1c4cf.json @@ -0,0 +1,728 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/chat/completions", + "headers": {}, + "body": { + "model": "databricks-meta-llama-3-3-70b-instruct", + "messages": [ + { + "role": "user", + "content": "Hello, world!" + } + ], + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "databricks-meta-llama-3-3-70b-instruct" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 3, + "prompt_tokens": 14, + "total_tokens": 17, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "Hello! ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 3, + "prompt_tokens": 14, + "total_tokens": 17, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "It's ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 5, + "prompt_tokens": 14, + "total_tokens": 19, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "nice ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 6, + "prompt_tokens": 14, + "total_tokens": 20, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "to ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 7, + "prompt_tokens": 14, + "total_tokens": 21, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "meet ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 8, + "prompt_tokens": 14, + "total_tokens": 22, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "you. ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 10, + "prompt_tokens": 14, + "total_tokens": 24, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "Is ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 11, + "prompt_tokens": 14, + "total_tokens": 25, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "there ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 12, + "prompt_tokens": 14, + "total_tokens": 26, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "something ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 13, + "prompt_tokens": 14, + "total_tokens": 27, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "I ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 14, + "prompt_tokens": 14, + "total_tokens": 28, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "can ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 15, + "prompt_tokens": 14, + "total_tokens": 29, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "help ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 16, + "prompt_tokens": 14, + "total_tokens": 30, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "you ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 17, + "prompt_tokens": 14, + "total_tokens": 31, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "with ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 18, + "prompt_tokens": 14, + "total_tokens": 32, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "or ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 19, + "prompt_tokens": 14, + "total_tokens": 33, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "would ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 20, + "prompt_tokens": 14, + "total_tokens": 34, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "you ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 21, + "prompt_tokens": 14, + "total_tokens": 35, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "like ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 22, + "prompt_tokens": 14, + "total_tokens": 36, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "to ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 23, + "prompt_tokens": 14, + "total_tokens": 37, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "chat?", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 25, + "prompt_tokens": 14, + "total_tokens": 39, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 25, + "prompt_tokens": 14, + "total_tokens": 39, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/249b7f0ddde6.json b/tests/integration/recordings/responses/249b7f0ddde6.json new file mode 100644 index 000000000..7bb5a221c --- /dev/null +++ b/tests/integration/recordings/responses/249b7f0ddde6.json @@ -0,0 +1,56 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/chat/completions", + "headers": {}, + "body": { + "model": "databricks-meta-llama-3-3-70b-instruct", + "messages": [ + { + "role": "user", + "content": "Hello, world!" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "databricks-meta-llama-3-3-70b-instruct" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "chatcmpl_52eec823-4235-473d-b25a-f0af4ebd4837", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "Hello! It's great to meet you. Is there something I can help you with, or would you like to chat?", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": null + } + } + ], + "created": 1758326506, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 26, + "prompt_tokens": 14, + "total_tokens": 40, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/28648cf8d421.json b/tests/integration/recordings/responses/28648cf8d421.json new file mode 100644 index 000000000..65b1fd216 --- /dev/null +++ b/tests/integration/recordings/responses/28648cf8d421.json @@ -0,0 +1,56 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/chat/completions", + "headers": {}, + "body": { + "model": "databricks-meta-llama-3-3-70b-instruct", + "messages": [ + { + "role": "user", + "content": "Which planet do humans live on?" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "databricks-meta-llama-3-3-70b-instruct" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "chatcmpl_e846ea96-9636-4eb4-bde4-84510478617b", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "Humans live on the planet Earth.", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": null + } + } + ], + "created": 1758326497, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 8, + "prompt_tokens": 17, + "total_tokens": 25, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/29585e055e6f.json b/tests/integration/recordings/responses/29585e055e6f.json new file mode 100644 index 000000000..a65292935 --- /dev/null +++ b/tests/integration/recordings/responses/29585e055e6f.json @@ -0,0 +1,56 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/chat/completions", + "headers": {}, + "body": { + "model": "databricks-meta-llama-3-3-70b-instruct", + "messages": [ + { + "role": "user", + "content": "Which planet has rings around it with a name starting with letter S?" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "databricks-meta-llama-3-3-70b-instruct" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "chatcmpl_094a74d8-2e39-45ce-8eb9-64d505bd24e9", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "The answer is Saturn! Saturn is a planet in our solar system that is known for its stunning ring system. The rings of Saturn are made up of ice and rock particles that range in size from tiny dust grains to massive boulders. They are a beautiful sight to behold, and astronomers and space enthusiasts alike have been fascinated by them for centuries.\n\nSo, the planet with rings around it with a name starting with the letter S is indeed Saturn!", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": null + } + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 91, + "prompt_tokens": 24, + "total_tokens": 115, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/3ef0f9aab128.json b/tests/integration/recordings/responses/3ef0f9aab128.json new file mode 100644 index 000000000..622707090 --- /dev/null +++ b/tests/integration/recordings/responses/3ef0f9aab128.json @@ -0,0 +1,344 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/chat/completions", + "headers": {}, + "body": { + "model": "databricks-meta-llama-3-3-70b-instruct", + "messages": [ + { + "role": "user", + "content": "What's the name of the Sun in latin?" + } + ], + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "databricks-meta-llama-3-3-70b-instruct" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_2c653de2-afd4-4075-bc8d-8200562a191b", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326497, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 2, + "prompt_tokens": 20, + "total_tokens": 22, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_2c653de2-afd4-4075-bc8d-8200562a191b", + "choices": [ + { + "delta": { + "content": "The ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326497, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 2, + "prompt_tokens": 20, + "total_tokens": 22, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_2c653de2-afd4-4075-bc8d-8200562a191b", + "choices": [ + { + "delta": { + "content": "Latin ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326497, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 3, + "prompt_tokens": 20, + "total_tokens": 23, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_2c653de2-afd4-4075-bc8d-8200562a191b", + "choices": [ + { + "delta": { + "content": "name ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326497, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 4, + "prompt_tokens": 20, + "total_tokens": 24, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_2c653de2-afd4-4075-bc8d-8200562a191b", + "choices": [ + { + "delta": { + "content": "for ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326497, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 5, + "prompt_tokens": 20, + "total_tokens": 25, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_2c653de2-afd4-4075-bc8d-8200562a191b", + "choices": [ + { + "delta": { + "content": "the ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326497, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 6, + "prompt_tokens": 20, + "total_tokens": 26, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_2c653de2-afd4-4075-bc8d-8200562a191b", + "choices": [ + { + "delta": { + "content": "Sun ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326497, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 7, + "prompt_tokens": 20, + "total_tokens": 27, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_2c653de2-afd4-4075-bc8d-8200562a191b", + "choices": [ + { + "delta": { + "content": "is ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326497, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 8, + "prompt_tokens": 20, + "total_tokens": 28, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_2c653de2-afd4-4075-bc8d-8200562a191b", + "choices": [ + { + "delta": { + "content": "\"Sol\".", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326498, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 11, + "prompt_tokens": 20, + "total_tokens": 31, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_2c653de2-afd4-4075-bc8d-8200562a191b", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null + } + ], + "created": 1758326498, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 11, + "prompt_tokens": 20, + "total_tokens": 31, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/441e2832387f.json b/tests/integration/recordings/responses/441e2832387f.json new file mode 100644 index 000000000..f61876dff --- /dev/null +++ b/tests/integration/recordings/responses/441e2832387f.json @@ -0,0 +1,1061 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/embeddings", + "headers": {}, + "body": { + "model": "databricks-bge-large-en", + "input": "This is completely different content", + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "databricks-bge-large-en" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.005889892578125, + 0.03662109375, + 0.00455474853515625, + -0.01403045654296875, + -0.0139312744140625, + -0.044647216796875, + -0.033111572265625, + 0.006198883056640625, + 0.009521484375, + 0.02587890625, + 0.0250396728515625, + 0.0076904296875, + 0.02386474609375, + -0.07257080078125, + -0.033843994140625, + -0.04425048828125, + -0.0298004150390625, + -0.005153656005859375, + -0.06475830078125, + 0.01128387451171875, + -0.0176849365234375, + 0.0234527587890625, + -0.052398681640625, + -0.029266357421875, + 0.006107330322265625, + 0.006404876708984375, + -0.00574493408203125, + 0.029296875, + 0.05401611328125, + 0.077392578125, + 0.026885986328125, + 0.0233612060546875, + -0.040985107421875, + -0.057281494140625, + 0.02801513671875, + 0.01204681396484375, + 0.0341796875, + -0.0088348388671875, + -0.037322998046875, + -0.01293182373046875, + -0.00850677490234375, + -0.0379638671875, + 0.061737060546875, + -0.002628326416015625, + -0.0726318359375, + 0.005680084228515625, + -0.024383544921875, + 0.0057830810546875, + 0.004962921142578125, + -0.0211029052734375, + -0.0009322166442871094, + -0.01172637939453125, + 0.03814697265625, + 0.031829833984375, + 0.00893402099609375, + -0.0103912353515625, + -0.0096435546875, + 0.0013179779052734375, + -0.0169525146484375, + 0.029388427734375, + -0.0293426513671875, + 0.0229949951171875, + 0.032196044921875, + -0.041656494140625, + 0.03936767578125, + -0.002346038818359375, + -0.06414794921875, + -0.030029296875, + 0.0117340087890625, + -0.0699462890625, + -0.0187530517578125, + 0.029632568359375, + 0.006427764892578125, + -0.00824737548828125, + -0.0279541015625, + -0.00687408447265625, + -0.04034423828125, + 0.0058746337890625, + 0.0391845703125, + 0.0206451416015625, + 0.013397216796875, + 0.03936767578125, + -0.0264892578125, + -0.01320648193359375, + -0.07244873046875, + -0.01422119140625, + 0.017425537109375, + 0.0238189697265625, + 0.0158233642578125, + 0.00638580322265625, + 0.0133056640625, + 0.034637451171875, + -0.044891357421875, + -0.035552978515625, + 0.0017194747924804688, + 0.032135009765625, + -0.00498199462890625, + 0.038116455078125, + -0.004489898681640625, + -0.0201263427734375, + 0.03704833984375, + -0.0044097900390625, + 0.04345703125, + 0.0657958984375, + -0.0523681640625, + 0.0046539306640625, + 0.0281982421875, + -0.019073486328125, + -0.04541015625, + -0.0288238525390625, + -0.01512908935546875, + -0.029205322265625, + 0.0159759521484375, + -0.0270233154296875, + 0.016571044921875, + 0.06243896484375, + -0.00286865234375, + 0.0225982666015625, + -0.0308074951171875, + -0.054168701171875, + 0.03265380859375, + -0.004390716552734375, + -0.038909912109375, + 0.0028820037841796875, + 0.03350830078125, + -0.04388427734375, + 0.018646240234375, + 0.047607421875, + -0.00824737548828125, + 0.0076446533203125, + 0.0247344970703125, + -0.0589599609375, + 0.0035724639892578125, + 0.0273895263671875, + 0.01824951171875, + 9.298324584960938e-06, + 0.005329132080078125, + 0.027801513671875, + -0.038055419921875, + -0.001285552978515625, + -0.0036182403564453125, + 0.0230712890625, + -0.01540374755859375, + 0.053314208984375, + 0.00814056396484375, + -0.0184783935546875, + 0.0399169921875, + -0.0167083740234375, + -0.033477783203125, + 0.0292510986328125, + 0.0068359375, + -0.0259552001953125, + 0.00730133056640625, + 0.0019626617431640625, + -0.05096435546875, + -0.011810302734375, + 0.019317626953125, + 0.0090484619140625, + -0.024871826171875, + 0.00749969482421875, + -0.0242767333984375, + 0.034912109375, + -0.01163482666015625, + 0.060455322265625, + -0.0188140869140625, + 0.0308074951171875, + -0.03948974609375, + -0.0166473388671875, + -0.022308349609375, + -0.0123138427734375, + 0.004344940185546875, + 0.01180267333984375, + -0.035980224609375, + 0.0021114349365234375, + 0.0272369384765625, + 0.05224609375, + 0.02679443359375, + 0.0104217529296875, + 0.05029296875, + 0.0626220703125, + -0.0276031494140625, + 0.034088134765625, + 0.01763916015625, + 0.0384521484375, + 0.0278472900390625, + -0.050537109375, + 0.0304107666015625, + -0.0770263671875, + -0.03240966796875, + -0.0172882080078125, + 0.0028133392333984375, + 0.04296875, + -0.02532958984375, + 0.0228424072265625, + 0.0517578125, + 0.0209197998046875, + -0.043914794921875, + -0.0236663818359375, + 0.007259368896484375, + -0.09613037109375, + -0.03155517578125, + 0.024169921875, + -0.038299560546875, + 0.067138671875, + 0.02850341796875, + 0.006702423095703125, + 0.04388427734375, + 0.06329345703125, + -0.01103973388671875, + -0.0004940032958984375, + -0.004425048828125, + 0.007343292236328125, + -0.0135040283203125, + 0.00536346435546875, + 0.019561767578125, + -0.022186279296875, + -0.07403564453125, + 0.0162353515625, + -0.0423583984375, + -0.007659912109375, + 0.0005707740783691406, + 0.0404052734375, + 0.052520751953125, + 0.027801513671875, + 0.0155487060546875, + 0.0110015869140625, + 0.01172637939453125, + 0.030670166015625, + -0.009979248046875, + -0.033538818359375, + -0.00862884521484375, + 0.0263671875, + -0.022705078125, + 0.0166473388671875, + 0.017486572265625, + 0.0033206939697265625, + 0.03814697265625, + 0.021026611328125, + -0.031524658203125, + 0.005008697509765625, + 0.0229644775390625, + 0.0211029052734375, + 0.09307861328125, + 0.035888671875, + 0.0220794677734375, + -0.0092315673828125, + 0.0141754150390625, + 0.00789642333984375, + 0.004543304443359375, + 0.0177154541015625, + 0.0209808349609375, + 0.0008139610290527344, + 0.047149658203125, + -0.0045166015625, + -0.014984130859375, + 0.01751708984375, + 0.01311492919921875, + 0.048004150390625, + -0.037384033203125, + -0.00403594970703125, + -0.01155853271484375, + 0.014434814453125, + -0.0121002197265625, + -0.00244903564453125, + -0.0005030632019042969, + -0.047027587890625, + -0.02947998046875, + -0.02691650390625, + -0.01200103759765625, + -0.031494140625, + -0.0599365234375, + -0.08416748046875, + -0.0511474609375, + 0.00531768798828125, + -0.013641357421875, + -0.0012845993041992188, + 0.057708740234375, + -0.00951385498046875, + 0.07830810546875, + -0.022613525390625, + -0.0171661376953125, + 0.004962921142578125, + -0.020904541015625, + 0.021728515625, + 0.0118255615234375, + -0.009674072265625, + -0.046630859375, + 0.01224517822265625, + 0.01244354248046875, + -0.01189422607421875, + -0.00862884521484375, + 0.04400634765625, + 0.003513336181640625, + 0.022186279296875, + 0.0045013427734375, + 0.038818359375, + 0.006313323974609375, + -0.0112762451171875, + 0.0013637542724609375, + -0.032440185546875, + -0.022216796875, + 0.003993988037109375, + -0.0113372802734375, + 0.00848388671875, + -0.00128173828125, + 0.0343017578125, + 0.06561279296875, + -0.032684326171875, + 0.054901123046875, + 0.02728271484375, + -0.01209259033203125, + 0.0179901123046875, + 0.0156097412109375, + 0.06671142578125, + -0.02117919921875, + 0.0224456787109375, + 0.01959228515625, + 0.04803466796875, + 0.01491546630859375, + -0.02593994140625, + 0.004741668701171875, + -0.04034423828125, + 0.03582763671875, + -0.01186370849609375, + -0.01049041748046875, + 0.0102996826171875, + 0.01235198974609375, + -0.0833740234375, + 0.0124053955078125, + -0.040924072265625, + -0.0230255126953125, + -0.0316162109375, + -0.038848876953125, + -0.0401611328125, + 0.017669677734375, + -0.0217132568359375, + -0.0073699951171875, + -0.01194000244140625, + -0.0012226104736328125, + -0.0044403076171875, + -0.0087127685546875, + -0.010833740234375, + -0.0004792213439941406, + 0.04132080078125, + 0.02874755859375, + 0.012542724609375, + -0.043060302734375, + -0.00215911865234375, + 0.015594482421875, + 0.02294921875, + -0.004100799560546875, + -0.01419830322265625, + -0.0084686279296875, + 0.025665283203125, + 0.01108551025390625, + 0.0179290771484375, + -0.014129638671875, + 0.033477783203125, + 0.01270294189453125, + -0.030670166015625, + 0.0099945068359375, + 0.0003094673156738281, + 0.0244140625, + -0.07879638671875, + -0.030120849609375, + -0.020416259765625, + -0.01873779296875, + 0.051361083984375, + 0.0293121337890625, + -0.042633056640625, + 0.059783935546875, + -0.002498626708984375, + -0.04345703125, + 0.0031948089599609375, + -0.0242156982421875, + -0.0129852294921875, + 0.047149658203125, + -0.01375579833984375, + 0.04638671875, + -0.06341552734375, + -0.027496337890625, + -0.008331298828125, + 0.03338623046875, + 0.021453857421875, + 0.0252685546875, + 0.0159149169921875, + -0.030548095703125, + -0.060394287109375, + 0.030059814453125, + -0.01552581787109375, + -0.017608642578125, + -0.00232696533203125, + 0.0185394287109375, + -0.00392913818359375, + -0.023773193359375, + -0.0206298828125, + 0.0286712646484375, + 0.0280609130859375, + 0.07501220703125, + 0.044281005859375, + 0.044677734375, + 0.01454925537109375, + 0.00276947021484375, + 0.026947021484375, + -0.07177734375, + -0.00011664628982543945, + 0.013458251953125, + 0.032073974609375, + -0.03179931640625, + 0.021484375, + -0.040069580078125, + -0.00019931793212890625, + -0.03131103515625, + 0.045379638671875, + -0.00018787384033203125, + 0.0045013427734375, + -0.0202178955078125, + -0.022247314453125, + 0.01322174072265625, + 0.0283660888671875, + -0.02520751953125, + 0.006397247314453125, + -0.01971435546875, + 0.00017535686492919922, + -0.0210418701171875, + -0.047149658203125, + -0.01512908935546875, + -0.04083251953125, + 0.04595947265625, + -0.034149169921875, + 0.004978179931640625, + -0.0341796875, + 0.0064544677734375, + -0.0814208984375, + -0.030120849609375, + 0.00618743896484375, + 0.0210113525390625, + 0.009124755859375, + 0.01287841796875, + -0.0167999267578125, + 0.0189666748046875, + 0.052490234375, + -0.030181884765625, + -0.00571441650390625, + 0.0006885528564453125, + -0.00867462158203125, + 0.03314208984375, + 0.032012939453125, + -0.02362060546875, + 0.00484466552734375, + -0.0283966064453125, + -0.04296875, + 0.0222320556640625, + -0.033355712890625, + 0.0308685302734375, + -0.01480865478515625, + -0.02447509765625, + 0.06158447265625, + 0.010894775390625, + -0.00445556640625, + 0.009613037109375, + 0.0086212158203125, + -0.00328826904296875, + -0.04718017578125, + -0.0202484130859375, + 0.048492431640625, + -0.0139923095703125, + 0.0059814453125, + 0.01212310791015625, + -0.0123748779296875, + -0.0006394386291503906, + 0.009002685546875, + -0.00732421875, + -0.03265380859375, + 0.024688720703125, + -0.025848388671875, + -0.000652313232421875, + 0.0202484130859375, + 0.00806427001953125, + -0.031707763671875, + -0.018218994140625, + 0.022369384765625, + 0.00391387939453125, + 0.0027618408203125, + -0.042877197265625, + -0.031158447265625, + -0.04754638671875, + -0.0161285400390625, + 0.0235137939453125, + 0.004619598388671875, + -0.01904296875, + -0.0128326416015625, + 0.0182952880859375, + -0.017578125, + 0.01351165771484375, + -0.01287078857421875, + -0.019073486328125, + -0.006992340087890625, + 0.0102996826171875, + 0.0202789306640625, + 0.034637451171875, + -0.0435791015625, + -0.0469970703125, + 0.01523590087890625, + -0.0235748291015625, + 0.0009484291076660156, + -0.028106689453125, + -0.00466156005859375, + 0.03240966796875, + -0.01348114013671875, + -0.00836181640625, + 0.00905609130859375, + -0.006557464599609375, + 0.0305023193359375, + 0.0045318603515625, + 0.0341796875, + -0.018096923828125, + -0.029205322265625, + 0.00849151611328125, + 0.021484375, + 0.01548004150390625, + 0.0013208389282226562, + -0.03790283203125, + -0.0008292198181152344, + 0.01470947265625, + 0.0080413818359375, + 0.01593017578125, + -0.047454833984375, + -0.0290679931640625, + -0.039337158203125, + 0.0169525146484375, + -0.02227783203125, + 0.00890350341796875, + -0.049346923828125, + -0.007007598876953125, + -0.0034503936767578125, + 0.06231689453125, + -0.0172119140625, + -0.0377197265625, + 0.019775390625, + -0.0225982666015625, + -0.029571533203125, + -0.049560546875, + -0.01462554931640625, + -0.006298065185546875, + -0.01104736328125, + -0.046722412109375, + 0.09295654296875, + -0.01861572265625, + 0.0007691383361816406, + -0.0166015625, + -0.007537841796875, + -0.0026874542236328125, + 0.00222015380859375, + -0.04345703125, + -0.05328369140625, + 0.01209259033203125, + 0.006122589111328125, + -0.00672149658203125, + 0.05181884765625, + -0.044708251953125, + 0.060760498046875, + -0.053802490234375, + 0.004150390625, + 0.025238037109375, + 0.031585693359375, + -0.0145263671875, + 0.0059967041015625, + 0.03497314453125, + -0.049530029296875, + -0.001049041748046875, + 0.006557464599609375, + -0.002605438232421875, + 0.0203094482421875, + -0.03387451171875, + -0.0124053955078125, + 0.0227508544921875, + -0.0116424560546875, + -0.02105712890625, + 0.011383056640625, + -0.00797271728515625, + -0.0277557373046875, + -0.0438232421875, + 0.007556915283203125, + 0.0302581787109375, + -0.05389404296875, + 0.030029296875, + 0.04803466796875, + 0.00606536865234375, + -0.03179931640625, + -0.062744140625, + 0.01119232177734375, + 0.009796142578125, + 0.03515625, + 0.0295257568359375, + -0.022247314453125, + -0.00946807861328125, + -0.01390838623046875, + -0.0202178955078125, + 0.0163421630859375, + -0.04443359375, + -0.02691650390625, + 0.060882568359375, + -0.04241943359375, + -0.006923675537109375, + 0.003765106201171875, + -0.058441162109375, + -0.0232086181640625, + 0.0264129638671875, + 0.06494140625, + 0.05230712890625, + 0.05859375, + 0.0176849365234375, + 0.0270233154296875, + -0.017730712890625, + -0.01433563232421875, + 0.007747650146484375, + -0.0239410400390625, + 0.06805419921875, + -0.0028285980224609375, + -0.052734375, + 0.040802001953125, + 0.0261077880859375, + -0.07470703125, + -0.0298309326171875, + -0.0452880859375, + 0.00824737548828125, + -0.010650634765625, + -0.0192108154296875, + 0.01433563232421875, + -0.047698974609375, + 0.0180511474609375, + 0.028564453125, + 0.015869140625, + -0.0207366943359375, + 0.027191162109375, + 0.027618408203125, + -0.039306640625, + 0.00316619873046875, + 0.01094818115234375, + 0.0018987655639648438, + -0.039306640625, + -0.01837158203125, + -0.0157012939453125, + -0.00572967529296875, + 0.0391845703125, + 0.0233917236328125, + 0.0238189697265625, + -0.041107177734375, + -0.004375457763671875, + -0.0171051025390625, + -0.0135498046875, + -0.0026378631591796875, + 0.00885009765625, + 0.00708770751953125, + 0.0175628662109375, + -0.044097900390625, + -0.0238494873046875, + -0.00856781005859375, + -0.01554107666015625, + 0.0017499923706054688, + 0.0264434814453125, + -0.04473876953125, + 0.0244293212890625, + 0.045867919921875, + -0.0013370513916015625, + -0.01371002197265625, + 0.006992340087890625, + -0.060882568359375, + -0.0357666015625, + -0.0117950439453125, + -0.0157012939453125, + -0.0185089111328125, + -0.0108489990234375, + 0.026336669921875, + 0.0172271728515625, + -0.0096435546875, + 0.0005636215209960938, + 0.07177734375, + -0.01287078857421875, + 0.0176544189453125, + -0.0161895751953125, + 0.028533935546875, + -0.0262603759765625, + -0.044769287109375, + 0.0121612548828125, + -0.0675048828125, + 0.0328369140625, + -0.04119873046875, + -0.032073974609375, + 0.0220794677734375, + -0.0207061767578125, + 0.03759765625, + 0.023345947265625, + 0.039520263671875, + -0.0273590087890625, + -0.041229248046875, + 0.0235137939453125, + 0.0162200927734375, + 0.0101776123046875, + 0.003505706787109375, + 0.0025691986083984375, + -0.010986328125, + -0.006969451904296875, + -0.001949310302734375, + -0.0650634765625, + -0.021270751953125, + -0.0020580291748046875, + -0.0175323486328125, + 0.007450103759765625, + -0.05426025390625, + -0.0309600830078125, + 0.004131317138671875, + -0.0135345458984375, + 0.01113128662109375, + -0.01435089111328125, + -0.01458740234375, + 0.03460693359375, + -0.040496826171875, + -0.0430908203125, + 0.042724609375, + -0.029632568359375, + 0.0760498046875, + -0.0113067626953125, + 0.0239715576171875, + -0.01203155517578125, + -0.0170135498046875, + 0.035003662109375, + 0.044158935546875, + 0.00901031494140625, + 0.004322052001953125, + -0.0270843505859375, + 0.021087646484375, + -0.015838623046875, + 0.00946044921875, + -0.0081787109375, + -0.0225067138671875, + 0.0008111000061035156, + 0.0120849609375, + 0.056854248046875, + 0.03277587890625, + -0.00989532470703125, + -0.0304107666015625, + -0.0126800537109375, + -0.01305389404296875, + -0.0086212158203125, + 0.031341552734375, + 0.0038909912109375, + -0.0179595947265625, + 0.037567138671875, + -0.023773193359375, + 0.02117919921875, + -0.016571044921875, + -0.0264129638671875, + 0.007450103759765625, + 0.0221710205078125, + 0.0094451904296875, + -0.02569580078125, + -0.009979248046875, + -0.0186004638671875, + 0.00505828857421875, + -0.0160980224609375, + 0.013275146484375, + 0.01322174072265625, + 0.0350341796875, + -0.0035552978515625, + -0.06317138671875, + 0.0192108154296875, + 0.01110076904296875, + -0.01422119140625, + 0.0176239013671875, + -0.024658203125, + 0.0133514404296875, + 0.00501251220703125, + -0.00806427001953125, + 0.0150604248046875, + 0.00988006591796875, + -0.0296478271484375, + 0.0207366943359375, + 0.004566192626953125, + -0.007236480712890625, + -0.029022216796875, + 0.035797119140625, + 0.05859375, + -0.0169677734375, + -0.027191162109375, + 0.049591064453125, + 0.00817108154296875, + 0.003818511962890625, + -0.01067352294921875, + 0.007610321044921875, + 0.00888824462890625, + -0.0102691650390625, + 0.00792694091796875, + 0.002132415771484375, + 0.048675537109375, + 0.058013916015625, + -0.0027027130126953125, + -0.0032215118408203125, + 0.0228118896484375, + 0.04052734375, + -0.00669097900390625, + 0.0035495758056640625, + -0.03070068359375, + -0.015350341796875, + -0.03668212890625, + -0.04974365234375, + -0.01354217529296875, + 0.005977630615234375, + 0.013641357421875, + -0.004852294921875, + 0.00846099853515625, + -0.02398681640625, + -0.0153350830078125, + -0.04718017578125, + 0.00800323486328125, + 0.033660888671875, + -0.045684814453125, + 0.0175323486328125, + -0.0186614990234375, + -0.0014123916625976562, + -0.03472900390625, + 0.039459228515625, + -0.0204315185546875, + 0.0143890380859375, + 0.033203125, + 0.0093994140625, + 0.013824462890625, + 0.07568359375, + 0.0186920166015625, + 0.018035888671875, + -0.0015544891357421875, + -0.004608154296875, + 0.019744873046875, + 0.018310546875, + -0.00574493408203125, + -0.03265380859375, + -0.0565185546875, + -0.01178741455078125, + 0.0019626617431640625, + -0.00908660888671875, + -0.015869140625, + 0.0146484375, + 0.0153350830078125, + -0.04595947265625, + 0.0166473388671875, + -0.0185699462890625, + 0.01082611083984375, + 0.016998291015625, + 0.0123443603515625, + -0.061614990234375, + -0.0255279541015625, + 2.6702880859375e-05, + 0.01285552978515625, + 0.007755279541015625, + 0.0384521484375, + -0.03338623046875, + 0.09210205078125, + 0.0340576171875, + -0.04547119140625, + 0.0037212371826171875, + 0.016693115234375, + 0.0276336669921875, + -0.0491943359375, + 0.0108795166015625, + -0.032745361328125, + 0.0026111602783203125, + 0.033050537109375, + -0.0260772705078125, + 0.025360107421875, + 0.0216522216796875, + -0.0181884765625, + -0.02813720703125, + 0.006916046142578125, + 0.0438232421875, + -0.0208587646484375, + 0.006694793701171875, + 0.042510986328125, + 0.0310821533203125, + 0.018646240234375, + 0.006679534912109375, + -0.0242462158203125, + -0.024627685546875, + -0.017852783203125, + -0.03997802734375, + 0.01947021484375, + -0.04144287109375, + -0.01554107666015625, + -0.03564453125, + -0.03253173828125, + 0.00821685791015625, + -0.00682830810546875, + -0.00689697265625, + -0.05438232421875, + 0.032684326171875, + -0.01352691650390625, + 0.0199127197265625, + 0.0220794677734375, + -0.043670654296875, + -0.0447998046875, + 0.033355712890625, + 0.03863525390625, + 0.03863525390625, + 0.05340576171875, + 0.0552978515625, + 0.01355743408203125, + 0.0294952392578125, + -0.03680419921875, + 0.040557861328125, + -0.006328582763671875, + -0.0758056640625, + -0.04296875, + 0.0003204345703125, + 0.00783538818359375, + -0.00736236572265625, + 0.06103515625, + 0.07342529296875, + -0.035247802734375, + -0.018585205078125, + -0.08740234375, + 0.01611328125, + -0.027191162109375, + -0.02789306640625, + -0.058929443359375, + 0.037994384765625, + 0.0032634735107421875, + 0.000904083251953125, + 0.00237274169921875, + -0.053314208984375, + 0.252197265625, + 0.0201416015625, + 0.020294189453125, + -0.039764404296875, + 0.031219482421875, + 0.0716552734375, + -0.00881195068359375, + -0.042633056640625, + 0.033721923828125, + -0.0186614990234375, + 0.0408935546875, + -0.04510498046875, + 0.0010547637939453125, + 0.039459228515625, + -0.003971099853515625, + 0.046173095703125, + -0.01324462890625, + 0.01239776611328125, + 0.01861572265625, + -0.02569580078125, + -0.029937744140625, + 0.004360198974609375, + -0.01396942138671875, + 0.053070068359375, + -0.006992340087890625, + -0.00678253173828125, + -0.00962066650390625, + -0.0280914306640625, + 0.0233154296875, + -2.8192996978759766e-05, + 0.035247802734375, + -0.01180267333984375, + 0.017913818359375, + -0.0217132568359375, + -0.07159423828125, + 0.032684326171875, + -0.0134429931640625, + -2.8014183044433594e-06, + 0.0214691162109375, + 0.00933074951171875, + -0.0262298583984375, + 0.01715087890625, + 0.05853271484375, + 0.0016260147094726562, + 0.0115203857421875, + 0.0285186767578125, + -0.01525115966796875, + 0.01490020751953125, + 0.008758544921875, + -0.03143310546875, + 0.01473236083984375, + -0.0310821533203125, + 0.052490234375, + -0.04559326171875, + -0.028228759765625, + -0.0306396484375, + 0.053314208984375, + -0.02252197265625, + 0.01259613037109375, + -0.041351318359375, + 0.050689697265625, + 0.029510498046875, + -0.0048370361328125, + 0.0228729248046875, + -0.07598876953125, + 0.002864837646484375, + 0.025634765625, + 0.037841796875, + 0.0079345703125, + -0.01256561279296875, + -0.0172271728515625, + 0.014862060546875, + 0.01177978515625, + -0.01216888427734375, + 0.032257080078125, + 0.0227813720703125, + -0.0308990478515625, + 0.01556396484375, + 0.037628173828125, + 0.004791259765625, + -0.05010986328125, + -0.030029296875, + -0.0085601806640625, + 0.0182952880859375, + 0.0045623779296875, + 0.0187835693359375, + -0.0009293556213378906, + 0.017181396484375, + -0.0096435546875, + 0.0160064697265625, + 0.003387451171875, + 0.019317626953125, + 0.0026836395263671875, + 0.0135040283203125, + 0.01096343994140625 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "bge-large-en-v1.5", + "object": "list", + "usage": { + "prompt_tokens": 7, + "total_tokens": 7 + }, + "id": "99bb4102-70b2-4de8-b079-11ceba9e2356" + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/5fa0e98f3d84.json b/tests/integration/recordings/responses/5fa0e98f3d84.json new file mode 100644 index 000000000..6d1934db3 --- /dev/null +++ b/tests/integration/recordings/responses/5fa0e98f3d84.json @@ -0,0 +1,1061 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/embeddings", + "headers": {}, + "body": { + "model": "databricks-bge-large-en", + "input": "This is the first text", + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "databricks-bge-large-en" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.01300048828125, + -0.0307769775390625, + 0.0278472900390625, + 0.0173797607421875, + -0.004108428955078125, + -0.019775390625, + -0.005260467529296875, + -0.01538848876953125, + 0.0567626953125, + 0.003536224365234375, + -0.0169219970703125, + 0.0191802978515625, + 0.0301971435546875, + 0.021575927734375, + -0.036102294921875, + -0.0178375244140625, + -0.03515625, + -0.005229949951171875, + -0.05975341796875, + 0.015533447265625, + -0.03729248046875, + 0.0310516357421875, + -0.11224365234375, + -0.0496826171875, + -0.0016756057739257812, + 0.0186614990234375, + -0.01056671142578125, + 0.0153350830078125, + 0.0567626953125, + 0.058746337890625, + 0.00414276123046875, + 0.0159149169921875, + 0.0209808349609375, + -0.0246429443359375, + -0.01021575927734375, + -0.01007080078125, + 0.0307464599609375, + -0.036590576171875, + -0.0290374755859375, + -0.04132080078125, + 0.0186614990234375, + 0.02069091796875, + 0.0469970703125, + 0.01215362548828125, + -0.07952880859375, + -0.0269317626953125, + -0.01092529296875, + -0.03765869140625, + 0.0024623870849609375, + -0.05084228515625, + -0.00670623779296875, + -0.0273895263671875, + 0.028656005859375, + 0.00414276123046875, + 0.014923095703125, + 0.00577545166015625, + -0.0271759033203125, + -0.01259613037109375, + -0.024932861328125, + 0.019287109375, + 0.027099609375, + 0.01190948486328125, + 0.020782470703125, + -0.0271148681640625, + -0.01309967041015625, + 0.0008511543273925781, + -0.0255126953125, + -0.01064300537109375, + 0.0301361083984375, + -0.0207672119140625, + -0.0238494873046875, + 0.039703369140625, + -0.004852294921875, + -0.035675048828125, + -0.031646728515625, + 0.0097503662109375, + -0.0361328125, + -0.01041412353515625, + -0.0258026123046875, + 0.04144287109375, + -0.003757476806640625, + 0.0242156982421875, + 0.01155853271484375, + -0.006023406982421875, + -0.055084228515625, + -0.033355712890625, + -0.02618408203125, + 0.002880096435546875, + -0.007568359375, + 0.0033969879150390625, + 0.031341552734375, + 0.040679931640625, + -0.009735107421875, + 0.036346435546875, + 0.032470703125, + 0.034210205078125, + -0.02166748046875, + 0.0291290283203125, + 0.012969970703125, + 0.022979736328125, + 0.0246429443359375, + 0.0496826171875, + -0.0250091552734375, + 0.0611572265625, + -0.04180908203125, + 0.0034999847412109375, + -0.00743865966796875, + 0.004436492919921875, + -0.0298309326171875, + -0.0201873779296875, + 0.0005083084106445312, + -0.004283905029296875, + 0.033447265625, + 0.0010995864868164062, + -0.037261962890625, + 0.032806396484375, + 0.017181396484375, + 0.0028533935546875, + -0.0164794921875, + 0.02081298828125, + 0.005153656005859375, + 0.042724609375, + -0.002956390380859375, + -0.0309600830078125, + -0.0206298828125, + -0.01181793212890625, + -0.0019388198852539062, + 0.064697265625, + -0.029296875, + 0.0205078125, + 0.0117950439453125, + -0.04632568359375, + 0.03485107421875, + 0.046478271484375, + -0.01471710205078125, + 0.00803375244140625, + 0.003437042236328125, + 0.00856781005859375, + 0.01177215576171875, + -0.0487060546875, + -0.011383056640625, + -0.0186767578125, + -0.01123046875, + 0.080810546875, + 0.0056304931640625, + 0.0104522705078125, + -0.033203125, + 0.0024662017822265625, + -0.054962158203125, + 0.0694580078125, + -0.024749755859375, + 0.03118896484375, + -0.0007967948913574219, + 0.01020050048828125, + -0.01641845703125, + -0.00728607177734375, + -0.00225067138671875, + -0.01412200927734375, + -0.0150146484375, + -0.0005183219909667969, + -0.00033545494079589844, + 0.0165252685546875, + -0.036773681640625, + 0.0170135498046875, + -0.0225830078125, + 0.0224609375, + -0.006313323974609375, + 0.0167083740234375, + 0.0267791748046875, + -0.0062103271484375, + -0.0037822723388671875, + 0.0220947265625, + 0.006069183349609375, + 0.03631591796875, + 0.0121917724609375, + 0.00653839111328125, + -0.00872802734375, + 0.00353240966796875, + 0.05755615234375, + 0.0115509033203125, + 0.0150146484375, + 0.004638671875, + 0.033233642578125, + 0.034759521484375, + 0.00016629695892333984, + 0.00634002685546875, + -0.004199981689453125, + -0.03656005859375, + -0.01055145263671875, + 0.01349639892578125, + -0.0182952880859375, + 0.0107879638671875, + -0.01959228515625, + 0.0286865234375, + 0.037109375, + 0.00951385498046875, + -0.022186279296875, + -0.00518798828125, + -0.012237548828125, + -0.0760498046875, + -0.04241943359375, + 0.032318115234375, + -0.0208892822265625, + 0.04150390625, + -0.027008056640625, + -0.0102691650390625, + 0.0223388671875, + 0.069091796875, + -0.0174713134765625, + 0.00495147705078125, + 0.018218994140625, + -0.0037670135498046875, + -0.05859375, + 0.036346435546875, + 0.0281982421875, + -0.0225830078125, + -0.059722900390625, + 0.02783203125, + -0.004913330078125, + -0.005916595458984375, + -0.01027679443359375, + 0.0146636962890625, + 0.039276123046875, + 0.03839111328125, + -7.092952728271484e-06, + 0.0035457611083984375, + -0.017578125, + 0.060516357421875, + -0.027496337890625, + -0.0276641845703125, + 0.00525665283203125, + 0.0220794677734375, + -0.01255035400390625, + 0.054840087890625, + 0.01885986328125, + 0.0275421142578125, + 0.0751953125, + 0.06365966796875, + -0.0019741058349609375, + 0.007007598876953125, + -0.00962066650390625, + 0.00543975830078125, + 0.050201416015625, + 0.0099639892578125, + 0.014495849609375, + 0.0225677490234375, + 0.03277587890625, + 0.0185089111328125, + -0.01261138916015625, + 0.035675048828125, + -0.002635955810546875, + 0.025177001953125, + 0.051025390625, + -0.002857208251953125, + -0.035980224609375, + -0.0233612060546875, + 0.0259246826171875, + 0.043731689453125, + -0.03631591796875, + -0.0205535888671875, + 0.0258331298828125, + 0.007709503173828125, + 0.0019741058349609375, + 0.0112457275390625, + -0.00962066650390625, + 0.003932952880859375, + -0.0183868408203125, + -0.01013946533203125, + -0.0245208740234375, + -0.059600830078125, + -0.0197296142578125, + -0.042022705078125, + -0.06231689453125, + 0.00949859619140625, + -0.050384521484375, + 0.0228118896484375, + 0.035614013671875, + -0.02691650390625, + 0.043426513671875, + -0.035858154296875, + -0.00539398193359375, + -0.021697998046875, + -0.045928955078125, + 0.043548583984375, + 0.019989013671875, + -0.004436492919921875, + 0.014373779296875, + -0.00946807861328125, + -0.02752685546875, + 0.029510498046875, + -0.0313720703125, + -0.019500732421875, + 0.0028400421142578125, + -0.02923583984375, + 0.01177978515625, + -0.01392364501953125, + 0.0087738037109375, + 0.00730133056640625, + -0.0221405029296875, + -0.034271240234375, + 0.0168914794921875, + -0.0263824462890625, + 0.01641845703125, + -0.0372314453125, + -0.035736083984375, + 0.0180206298828125, + 0.0290069580078125, + -0.0531005859375, + 0.004638671875, + 0.01534271240234375, + -0.01064300537109375, + 0.047882080078125, + -0.0401611328125, + 0.003963470458984375, + -0.039459228515625, + 0.0111541748046875, + -0.00875091552734375, + 0.02001953125, + -0.0019073486328125, + -0.02301025390625, + -0.007709503173828125, + -0.00791168212890625, + -0.0266265869140625, + -0.042510986328125, + -0.00812530517578125, + -0.00514984130859375, + 0.032073974609375, + -0.05523681640625, + 0.0565185546875, + -0.07373046875, + -0.060150146484375, + -0.031951904296875, + -0.00015366077423095703, + 0.053466796875, + 0.01171875, + 0.01244354248046875, + -0.0310211181640625, + -0.01078033447265625, + 0.026458740234375, + -0.0183258056640625, + 0.0382080078125, + -0.061920166015625, + 0.006927490234375, + 0.053131103515625, + -0.03759765625, + 0.00118255615234375, + -0.005329132080078125, + 0.022491455078125, + 0.01111602783203125, + 0.036956787109375, + 0.006259918212890625, + 0.0269317626953125, + 0.02313232421875, + 0.0269012451171875, + 0.0251922607421875, + 0.01297760009765625, + -0.041473388671875, + 0.00983428955078125, + 0.0380859375, + 0.014739990234375, + -0.0020618438720703125, + 0.029052734375, + 0.0095062255859375, + -0.03717041015625, + 0.005931854248046875, + -0.0296173095703125, + -0.0215301513671875, + 0.0200042724609375, + 0.01776123046875, + -0.07244873046875, + 0.0662841796875, + -0.0185546875, + -0.04071044921875, + 1.6093254089355469e-06, + -0.0360107421875, + 0.01258087158203125, + 0.0638427734375, + -0.042633056640625, + 0.053375244140625, + -0.0606689453125, + 0.00624847412109375, + -0.0152740478515625, + 0.013214111328125, + 0.06646728515625, + 0.0623779296875, + 0.0245513916015625, + 0.032501220703125, + -0.0294952392578125, + 0.005298614501953125, + -0.018280029296875, + 0.0007944107055664062, + -0.0029621124267578125, + 0.040069580078125, + -0.01544952392578125, + -0.04461669921875, + -0.08184814453125, + 0.022918701171875, + 0.0177001953125, + 0.0225372314453125, + 0.0205078125, + 0.0163116455078125, + 0.01546478271484375, + 0.0248565673828125, + 0.0229644775390625, + -0.030426025390625, + 0.00832366943359375, + -0.0206451416015625, + 0.041656494140625, + -0.0162353515625, + 0.0013532638549804688, + -0.03948974609375, + -0.03436279296875, + -0.020599365234375, + -0.006168365478515625, + 0.011962890625, + 0.004177093505859375, + -0.01540374755859375, + 0.0323486328125, + 0.03680419921875, + 0.0252532958984375, + -0.04962158203125, + -0.0222015380859375, + -0.006427764892578125, + 0.0165863037109375, + 0.0418701171875, + -0.01125335693359375, + 0.0044708251953125, + -0.02197265625, + 0.0261077880859375, + 0.052337646484375, + -0.0202789306640625, + -0.0123138427734375, + -0.0027790069580078125, + -0.00917816162109375, + -0.039154052734375, + 0.0104522705078125, + 0.006923675537109375, + -0.03033447265625, + 0.042083740234375, + -0.05230712890625, + 0.03900146484375, + 0.036956787109375, + -0.01467132568359375, + -0.01357269287109375, + -0.0272369384765625, + -0.0266265869140625, + 0.032806396484375, + 0.032196044921875, + -0.0152130126953125, + -0.035003662109375, + 0.0011014938354492188, + -0.049346923828125, + 0.03424072265625, + -0.04925537109375, + 0.02288818359375, + 0.019134521484375, + 0.00014913082122802734, + 0.0132293701171875, + 0.013916015625, + -0.04022216796875, + 0.017547607421875, + -0.01541900634765625, + -0.004467010498046875, + -0.0162200927734375, + -0.04736328125, + 0.061553955078125, + -0.0025634765625, + -0.031524658203125, + 0.016204833984375, + 0.03558349609375, + -0.035308837890625, + 0.0007781982421875, + 0.0413818359375, + 0.0041046142578125, + 0.009521484375, + -0.0184173583984375, + 0.04437255859375, + -0.0377197265625, + -0.0347900390625, + -0.001834869384765625, + -0.029510498046875, + -0.004055023193359375, + -0.039306640625, + -0.0249481201171875, + -0.0295562744140625, + -0.0596923828125, + -0.00229644775390625, + -0.052734375, + 0.00623321533203125, + -0.0234527587890625, + 0.0171356201171875, + 0.0438232421875, + -0.048370361328125, + -0.043365478515625, + -0.0185546875, + -0.02874755859375, + -0.0655517578125, + -0.006557464599609375, + -0.021728515625, + -0.010772705078125, + 0.031951904296875, + -0.006317138671875, + -0.022125244140625, + 0.04705810546875, + -0.0033588409423828125, + 0.01386260986328125, + -0.0256805419921875, + -0.01126861572265625, + -0.01068115234375, + -0.004871368408203125, + 0.0174713134765625, + -0.00893402099609375, + 0.0021152496337890625, + 0.03240966796875, + 0.032806396484375, + 0.0278472900390625, + -0.0092620849609375, + -0.00623321533203125, + -0.0200347900390625, + 0.06085205078125, + 0.0181732177734375, + -0.036346435546875, + -0.030364990234375, + 0.0007157325744628906, + -0.0192718505859375, + 0.035552978515625, + 0.058197021484375, + -0.005950927734375, + -0.022705078125, + -0.027557373046875, + -0.01226806640625, + -0.023284912109375, + 0.00394439697265625, + -0.04779052734375, + 0.00958251953125, + 0.0025482177734375, + 0.0156402587890625, + 0.0207366943359375, + -0.0278472900390625, + -0.0187835693359375, + -0.05572509765625, + 0.0070037841796875, + -0.016998291015625, + 0.00757598876953125, + -0.020904541015625, + 0.01358795166015625, + -0.04718017578125, + 0.0810546875, + 0.0008759498596191406, + 0.0289459228515625, + 0.004367828369140625, + 0.001079559326171875, + -0.0044403076171875, + 0.051605224609375, + -0.022491455078125, + -0.004711151123046875, + 0.0279083251953125, + 0.00826263427734375, + 0.024444580078125, + 0.05169677734375, + -0.00017201900482177734, + 0.060546875, + -0.00821685791015625, + -0.01861572265625, + -0.02703857421875, + -0.03253173828125, + 0.0009636878967285156, + 0.0299835205078125, + 0.0295562744140625, + -0.030670166015625, + -0.0186767578125, + -0.024017333984375, + 0.04669189453125, + 0.032318115234375, + -0.03192138671875, + -0.04388427734375, + -0.0238494873046875, + -0.034759521484375, + -0.0391845703125, + 0.01192474365234375, + -0.0025539398193359375, + -0.031524658203125, + -0.040069580078125, + 0.004673004150390625, + 0.0281219482421875, + -0.0498046875, + 0.00946044921875, + 0.0887451171875, + -0.0245361328125, + -0.040252685546875, + -0.07769775390625, + 0.0345458984375, + 0.0028324127197265625, + -0.004245758056640625, + -0.0168914794921875, + -0.015716552734375, + -0.00974273681640625, + -0.00637054443359375, + -0.0257568359375, + -0.060516357421875, + -0.046112060546875, + -0.01220703125, + 0.06451416015625, + 0.003177642822265625, + 0.054473876953125, + 0.00506591796875, + -0.037841796875, + -0.05377197265625, + 0.02008056640625, + 0.056396484375, + -0.0255126953125, + 0.00876617431640625, + 0.02618408203125, + 0.009918212890625, + -0.0024261474609375, + -0.019561767578125, + -0.01163482666015625, + -0.010711669921875, + 0.06396484375, + 0.00426483154296875, + -0.00417327880859375, + 0.0269317626953125, + 0.0628662109375, + -0.0367431640625, + -0.019073486328125, + 0.00896453857421875, + -0.0185089111328125, + -0.0350341796875, + -0.072265625, + 0.00481414794921875, + -0.0237579345703125, + -0.0294647216796875, + 0.00992584228515625, + 0.0103302001953125, + 0.012115478515625, + 0.0276336669921875, + 0.0048675537109375, + 0.0126495361328125, + 0.015899658203125, + -0.01947021484375, + 0.06011962890625, + -0.03350830078125, + 0.0025196075439453125, + -0.0099029541015625, + -0.0080108642578125, + -0.022674560546875, + -0.0100555419921875, + 0.046875, + 0.00885009765625, + 0.01506805419921875, + 0.0294952392578125, + -0.0172119140625, + 0.03167724609375, + -0.036651611328125, + -0.032012939453125, + 0.044921875, + -0.031982421875, + -0.04046630859375, + -0.037078857421875, + 0.0192718505859375, + 0.021820068359375, + 0.01058197021484375, + -0.0278167724609375, + 0.0057373046875, + 0.022979736328125, + -0.0251617431640625, + -0.0224456787109375, + -0.03369140625, + -0.05419921875, + -0.0496826171875, + -0.03472900390625, + -0.01401519775390625, + -0.00966644287109375, + 0.00826263427734375, + 0.04705810546875, + 0.0037441253662109375, + 0.011077880859375, + 0.00984954833984375, + 0.07171630859375, + -0.022125244140625, + 0.034027099609375, + 0.01471710205078125, + 0.0287933349609375, + -0.021148681640625, + -0.07513427734375, + -0.00858306884765625, + -0.0228271484375, + -0.01434326171875, + -0.0197906494140625, + -0.039398193359375, + -0.007152557373046875, + -0.0267181396484375, + 0.03558349609375, + 0.036468505859375, + -0.0016937255859375, + -0.01549530029296875, + -0.0126953125, + 0.01396942138671875, + 0.03045654296875, + 0.0002930164337158203, + 0.0008139610290527344, + 0.01012420654296875, + -0.04638671875, + -0.0022907257080078125, + -0.00420379638671875, + -0.04547119140625, + -0.0306854248046875, + 0.018341064453125, + 0.06475830078125, + 0.002140045166015625, + -4.756450653076172e-05, + -0.0159454345703125, + -0.01983642578125, + -0.06646728515625, + -0.02008056640625, + 0.0162353515625, + -0.00949859619140625, + -0.00934600830078125, + -0.0035190582275390625, + 0.00396728515625, + 0.045013427734375, + 0.0211944580078125, + 0.037811279296875, + 0.002819061279296875, + -0.0117034912109375, + 0.0125274658203125, + -0.035369873046875, + 0.020111083984375, + -0.002223968505859375, + 0.0081024169921875, + -0.0119476318359375, + -0.03033447265625, + 0.018402099609375, + -0.0010623931884765625, + 0.0165863037109375, + -0.039581298828125, + -0.0192413330078125, + -0.0153350830078125, + 0.027130126953125, + 0.027374267578125, + 0.0033359527587890625, + 0.0098114013671875, + -0.03350830078125, + 0.0060577392578125, + -0.0258026123046875, + -0.03790283203125, + 0.00394439697265625, + -0.0261077880859375, + -0.039459228515625, + 0.0438232421875, + 0.0051422119140625, + -0.037200927734375, + 0.02203369140625, + -0.0216522216796875, + 0.038818359375, + 0.01024627685546875, + 0.002735137939453125, + -0.0335693359375, + 0.03863525390625, + -0.016571044921875, + 0.019073486328125, + -0.01971435546875, + 0.00658416748046875, + -0.0250091552734375, + 0.04095458984375, + -0.026611328125, + -0.01708984375, + 0.037994384765625, + 0.01073455810546875, + 0.0078887939453125, + 0.0240325927734375, + -0.039276123046875, + -0.01390838623046875, + -0.007671356201171875, + -0.0081787109375, + -0.0006136894226074219, + 0.04876708984375, + -0.042327880859375, + -0.01160430908203125, + -0.00730133056640625, + -0.0035247802734375, + -0.01708984375, + 0.01404571533203125, + 0.0172271728515625, + 0.016448974609375, + 0.01128387451171875, + 0.05499267578125, + 0.046661376953125, + -0.01551055908203125, + 0.030517578125, + -0.0007624626159667969, + 0.0347900390625, + 0.007526397705078125, + -0.029571533203125, + -0.0261383056640625, + 0.049102783203125, + 0.05126953125, + 0.0007534027099609375, + -0.03955078125, + 0.0159149169921875, + 0.0281524658203125, + -0.00868988037109375, + 0.01261138916015625, + -0.01190948486328125, + -0.0142364501953125, + 0.011505126953125, + -0.00649261474609375, + -0.0223541259765625, + -0.0269622802734375, + -0.0017566680908203125, + -0.00547027587890625, + 0.0247039794921875, + -0.0201568603515625, + -0.0095062255859375, + -0.032470703125, + -0.026947021484375, + 0.0423583984375, + -0.049957275390625, + 0.0188751220703125, + -0.039154052734375, + -0.040130615234375, + 0.0133819580078125, + 0.043914794921875, + 0.00439453125, + 0.0254669189453125, + 0.0156097412109375, + 0.015777587890625, + 0.03839111328125, + 0.0185546875, + 0.01479339599609375, + 0.037872314453125, + -0.049072265625, + -0.0086669921875, + 0.0309906005859375, + -0.005401611328125, + -0.0011138916015625, + -0.0181732177734375, + -0.0670166015625, + 0.055145263671875, + 0.0015096664428710938, + -0.0135650634765625, + 0.0190277099609375, + -0.0017004013061523438, + -0.0185546875, + -0.0277557373046875, + -0.0106201171875, + -0.019134521484375, + 0.041961669921875, + 0.053802490234375, + -0.046600341796875, + -0.055511474609375, + 0.04498291015625, + 0.0082550048828125, + 0.05096435546875, + 0.0008788108825683594, + 0.061279296875, + -0.012451171875, + 0.06805419921875, + 0.0135955810546875, + -0.058380126953125, + -0.0175323486328125, + -0.002735137939453125, + -0.004039764404296875, + -0.022735595703125, + 0.0015687942504882812, + -0.0675048828125, + -0.00839996337890625, + -0.00408172607421875, + -0.0199737548828125, + -0.035369873046875, + 0.038665771484375, + -0.0268402099609375, + -0.0230865478515625, + -0.00982666015625, + 0.01318359375, + -0.045013427734375, + 0.015777587890625, + 0.0023441314697265625, + 0.036407470703125, + 0.01319122314453125, + -0.0235443115234375, + -0.058990478515625, + 0.007480621337890625, + 0.01372528076171875, + -0.03118896484375, + 0.042266845703125, + -0.0242767333984375, + -0.01161956787109375, + -0.0242767333984375, + -0.060455322265625, + 0.016571044921875, + 0.002826690673828125, + -0.0040130615234375, + -0.060272216796875, + -0.01224517822265625, + 0.0211944580078125, + 0.0114288330078125, + 0.006984710693359375, + -0.029083251953125, + 0.0023708343505859375, + 0.025665283203125, + 0.06109619140625, + 0.007843017578125, + 0.06585693359375, + 0.0233917236328125, + -0.0027370452880859375, + 0.0167388916015625, + 0.00818634033203125, + 0.07269287109375, + -0.016357421875, + -0.0025577545166015625, + -0.037750244140625, + -0.004741668701171875, + -0.0252227783203125, + -0.03570556640625, + 0.036865234375, + 0.09661865234375, + 0.0114288330078125, + 0.01126861572265625, + -0.061981201171875, + -0.0028972625732421875, + -0.0164337158203125, + -0.002788543701171875, + -0.015167236328125, + 0.0302581787109375, + 0.0008015632629394531, + 0.02532958984375, + 0.0169677734375, + -0.07049560546875, + 0.2607421875, + 0.070556640625, + 0.01314544677734375, + -0.02349853515625, + 0.000370025634765625, + 0.0196075439453125, + 0.052337646484375, + -0.0251922607421875, + 0.031524658203125, + -0.0300750732421875, + 0.03631591796875, + -0.008056640625, + 0.00844573974609375, + 0.0284576416015625, + 0.00574493408203125, + 0.04852294921875, + -0.051116943359375, + -0.0020885467529296875, + 0.0004630088806152344, + -0.0206298828125, + -0.042022705078125, + 0.0276031494140625, + -0.0037784576416015625, + 0.0335693359375, + -0.0273284912109375, + 0.01387786865234375, + 0.052978515625, + -0.053009033203125, + -0.024200439453125, + -0.0283050537109375, + 0.0178375244140625, + -0.0246124267578125, + 0.0180816650390625, + -0.0277252197265625, + -0.056549072265625, + -0.0095672607421875, + -0.015655517578125, + -0.01212310791015625, + -0.0002384185791015625, + 0.028900146484375, + -0.0172576904296875, + -0.0163726806640625, + 0.06292724609375, + -0.0174407958984375, + 0.00988006591796875, + -0.006946563720703125, + -0.0006666183471679688, + 0.03765869140625, + 0.0059967041015625, + -0.034454345703125, + 0.04132080078125, + -0.0143890380859375, + 0.03216552734375, + -0.043487548828125, + -0.045562744140625, + -0.007755279541015625, + 0.05303955078125, + -0.0157318115234375, + -0.00830078125, + 0.0087127685546875, + 0.004756927490234375, + 0.0110015869140625, + -0.007556915283203125, + 0.0087738037109375, + -0.053955078125, + 0.0213470458984375, + 0.026641845703125, + 0.0550537109375, + 0.01244354248046875, + 0.011383056640625, + -0.00438690185546875, + -0.040313720703125, + 0.008148193359375, + -0.064208984375, + 0.0172119140625, + 0.05621337890625, + -0.01290130615234375, + 0.030609130859375, + 0.00180816650390625, + -0.00966644287109375, + -0.01045989990234375, + -0.005466461181640625, + 0.004817962646484375, + -0.005615234375, + -0.0028095245361328125, + 0.042724609375, + -0.019683837890625, + -0.0187835693359375, + -0.027923583984375, + 0.0271148681640625, + 0.050384521484375, + 0.028228759765625, + 0.00827789306640625, + 0.023284912109375, + -0.0209197998046875 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "bge-large-en-v1.5", + "object": "list", + "usage": { + "prompt_tokens": 7, + "total_tokens": 7 + }, + "id": "ebf0740c-96e5-4350-83ea-2844cf0395ab" + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/6d937e5e9233.json b/tests/integration/recordings/responses/6d937e5e9233.json new file mode 100644 index 000000000..e22290402 --- /dev/null +++ b/tests/integration/recordings/responses/6d937e5e9233.json @@ -0,0 +1,1061 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/embeddings", + "headers": {}, + "body": { + "model": "databricks-bge-large-en", + "input": "Hello, world!", + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "databricks-bge-large-en" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.0243682861328125, + 0.0479736328125, + 0.007320404052734375, + -0.007663726806640625, + -0.0391845703125, + 0.0010662078857421875, + 0.060638427734375, + 0.047119140625, + 0.048858642578125, + 0.0029773712158203125, + 0.01132965087890625, + 0.0019140243530273438, + -0.00670623779296875, + -0.0010347366333007812, + -0.0482177734375, + 0.002079010009765625, + -0.0033283233642578125, + -0.03924560546875, + -0.04217529296875, + 0.001712799072265625, + -0.0150909423828125, + 0.0198211669921875, + -0.06884765625, + -0.0138092041015625, + 0.0121612548828125, + 0.025177001953125, + 0.048248291015625, + -0.0016126632690429688, + 0.04901123046875, + 0.049224853515625, + -0.016845703125, + 0.00646209716796875, + -0.0130767822265625, + -0.05352783203125, + -0.0234832763671875, + -0.015594482421875, + 0.024658203125, + -0.018310546875, + -0.03765869140625, + -0.033782958984375, + 0.031951904296875, + 0.01262664794921875, + 0.05194091796875, + -0.0309295654296875, + -0.0728759765625, + 0.0146942138671875, + 0.0018930435180664062, + 0.011932373046875, + 0.047637939453125, + -0.03485107421875, + 0.0034923553466796875, + 0.0225982666015625, + -0.01311492919921875, + -0.01568603515625, + -0.00933837890625, + 0.01116180419921875, + -0.047332763671875, + 0.030975341796875, + -0.0184173583984375, + 0.0289306640625, + 0.0161590576171875, + 0.036956787109375, + 0.043121337890625, + -0.07110595703125, + -0.005107879638671875, + 0.03271484375, + -0.017303466796875, + -0.028717041015625, + 0.03729248046875, + -2.0623207092285156e-05, + -0.040008544921875, + 0.02294921875, + 0.0014362335205078125, + -0.00107574462890625, + -0.044647216796875, + 0.038604736328125, + -0.0067138671875, + 0.0249176025390625, + -0.022857666015625, + 0.01739501953125, + -0.005096435546875, + 0.024871826171875, + -0.00920867919921875, + -7.003545761108398e-05, + -0.032562255859375, + -0.023773193359375, + 0.0253143310546875, + 0.0243988037109375, + -0.00439453125, + -0.0207672119140625, + 0.057159423828125, + 0.03338623046875, + -0.004795074462890625, + -0.002796173095703125, + 0.067626953125, + 0.01195526123046875, + -0.0282745361328125, + 0.004787445068359375, + -0.001255035400390625, + 0.031005859375, + 0.032684326171875, + 0.042144775390625, + -0.044281005859375, + 0.0017604827880859375, + -0.0316162109375, + -0.01284027099609375, + -0.0007252693176269531, + -0.025054931640625, + -0.0179595947265625, + -0.0215911865234375, + -0.02642822265625, + 0.0166168212890625, + 0.0232391357421875, + 0.0304107666015625, + -0.004180908203125, + 0.049163818359375, + 0.0036373138427734375, + 0.030517578125, + -0.009368896484375, + -0.0110321044921875, + 0.017578125, + 0.03570556640625, + 0.007595062255859375, + -0.0289764404296875, + -0.020111083984375, + -0.048828125, + -0.0297698974609375, + 0.0643310546875, + 0.0033664703369140625, + 0.005657196044921875, + 0.0011434555053710938, + -0.019561767578125, + 0.04833984375, + 0.026123046875, + 0.0166778564453125, + -0.006191253662109375, + -0.012725830078125, + 0.05255126953125, + 0.02337646484375, + -0.04766845703125, + 0.007572174072265625, + -0.016082763671875, + -0.024993896484375, + 0.0716552734375, + 0.0211639404296875, + 0.047271728515625, + -0.0005006790161132812, + 0.02728271484375, + -0.0146942138671875, + 0.006595611572265625, + -0.01763916015625, + 0.0258331298828125, + 0.0009965896606445312, + 0.047943115234375, + -0.0140838623046875, + 0.004795074462890625, + 0.016387939453125, + 0.0284576416015625, + 0.0004839897155761719, + 0.007007598876953125, + 0.01253509521484375, + 0.038116455078125, + -0.0047454833984375, + 0.01114654541015625, + -0.018798828125, + -0.0033206939697265625, + -0.0377197265625, + -0.0242462158203125, + 0.004734039306640625, + -0.0223236083984375, + -0.0184173583984375, + -0.0226287841796875, + -0.02947998046875, + 0.005565643310546875, + 0.02227783203125, + 0.017791748046875, + 0.004779815673828125, + -0.004360198974609375, + 0.03790283203125, + 0.0192108154296875, + -0.0406494140625, + 0.01287078857421875, + -0.0167388916015625, + 0.0208740234375, + -0.0011205673217773438, + 0.007511138916015625, + 0.0105133056640625, + 0.002498626708984375, + -0.0158538818359375, + -0.0284881591796875, + 0.02337646484375, + 0.0155181884765625, + -0.032989501953125, + 0.0212249755859375, + 0.00875091552734375, + 0.018218994140625, + -0.0212860107421875, + 0.019744873046875, + 0.00045418739318847656, + -0.08154296875, + -0.051849365234375, + 0.016021728515625, + 0.0020904541015625, + 0.0062255859375, + -0.0002894401550292969, + -0.02752685546875, + -0.01546478271484375, + 0.035552978515625, + -0.04132080078125, + -0.0205535888671875, + -0.0018558502197265625, + 0.017974853515625, + -0.02044677734375, + 0.0246734619140625, + 0.006023406982421875, + -0.04498291015625, + -0.03277587890625, + 0.02935791015625, + -0.0034332275390625, + 0.0013437271118164062, + 0.0211029052734375, + 0.021453857421875, + 0.032196044921875, + 0.052734375, + 0.007572174072265625, + 0.0148162841796875, + -0.0284881591796875, + 0.039703369140625, + -0.00885009765625, + -0.00823211669921875, + -0.0213165283203125, + 0.04022216796875, + -0.0076904296875, + 0.03790283203125, + 0.03350830078125, + 0.0139617919921875, + 0.047698974609375, + 0.03594970703125, + 0.01540374755859375, + -0.0192413330078125, + -0.043609619140625, + -0.01105499267578125, + 0.0203094482421875, + 0.0216217041015625, + 0.01076507568359375, + -0.0039215087890625, + 0.032745361328125, + -0.036468505859375, + 0.0056304931640625, + 0.0173492431640625, + -0.0246734619140625, + 0.04962158203125, + 0.06695556640625, + 0.008270263671875, + -0.038482666015625, + -0.03350830078125, + 0.01265716552734375, + 0.096435546875, + -0.045440673828125, + -0.0272979736328125, + -0.019866943359375, + 0.0192413330078125, + -0.00597381591796875, + 0.004711151123046875, + 0.003437042236328125, + 0.007965087890625, + 0.01374053955078125, + 0.00811004638671875, + -0.008148193359375, + -0.0648193359375, + -0.0164794921875, + -0.01540374755859375, + -0.037322998046875, + 0.032684326171875, + -0.014862060546875, + -0.0034198760986328125, + 0.0149383544921875, + 0.0007529258728027344, + 0.02630615234375, + -0.0213775634765625, + 0.003299713134765625, + 0.00030112266540527344, + 0.037139892578125, + 0.0167999267578125, + -0.006191253662109375, + -0.01290130615234375, + -0.02490234375, + -0.03173828125, + -0.00937652587890625, + 0.050994873046875, + -0.054473876953125, + -0.0012388229370117188, + 0.009033203125, + 0.023712158203125, + -0.041168212890625, + 0.0338134765625, + -0.033447265625, + 0.021392822265625, + -0.0234832763671875, + -0.032928466796875, + -0.0080413818359375, + 0.004138946533203125, + -0.0240631103515625, + -0.020111083984375, + -0.0230560302734375, + 0.01381683349609375, + -0.0003304481506347656, + -0.03802490234375, + 0.0404052734375, + 0.005603790283203125, + -0.0276947021484375, + 0.06805419921875, + 0.02374267578125, + -0.01119232177734375, + -0.0311737060546875, + 0.027313232421875, + 0.037445068359375, + 0.051055908203125, + -0.0277557373046875, + -0.0142974853515625, + -0.0214385986328125, + -0.0245819091796875, + -0.011077880859375, + -0.0645751953125, + -0.00604248046875, + 0.0298004150390625, + 0.021240234375, + -0.038421630859375, + 0.030792236328125, + -0.050384521484375, + -0.0648193359375, + -0.0531005859375, + -0.042236328125, + 0.0177764892578125, + 0.00933837890625, + -0.0125885009765625, + -0.014984130859375, + -0.008392333984375, + 0.0144805908203125, + -0.0050506591796875, + 0.062347412109375, + -0.05401611328125, + -0.0012826919555664062, + 0.0300750732421875, + -0.022735595703125, + 0.00600433349609375, + -0.005542755126953125, + -0.0218048095703125, + -0.033477783203125, + 0.036895751953125, + 0.0011653900146484375, + -0.01519012451171875, + 0.00815582275390625, + 0.03436279296875, + 0.006931304931640625, + 0.0411376953125, + -0.08392333984375, + -0.0008335113525390625, + 0.052947998046875, + -0.03778076171875, + 0.02288818359375, + 0.03662109375, + 0.01922607421875, + -0.07257080078125, + 0.0016756057739257812, + -0.053466796875, + 0.007511138916015625, + 0.0200653076171875, + 0.02423095703125, + -0.049102783203125, + 0.03399658203125, + -0.032257080078125, + -0.037445068359375, + -0.0171051025390625, + -0.0419921875, + -0.0039825439453125, + 0.0290985107421875, + -0.019439697265625, + 0.0311737060546875, + -0.037353515625, + 0.0143280029296875, + -0.038482666015625, + 0.0158233642578125, + 0.10565185546875, + 0.058624267578125, + 0.00908660888671875, + -0.031005859375, + 0.0009670257568359375, + -0.01027679443359375, + -0.0089874267578125, + -0.0589599609375, + -0.0002715587615966797, + 0.02197265625, + -0.03179931640625, + -0.0462646484375, + -0.06512451171875, + 0.038055419921875, + 0.0237579345703125, + 0.0552978515625, + 0.027008056640625, + -0.032470703125, + -0.00787353515625, + -0.00040912628173828125, + -0.0008325576782226562, + -0.029754638671875, + 0.0034885406494140625, + -0.023101806640625, + 0.045684814453125, + 0.02154541015625, + -0.009765625, + -0.052001953125, + -0.004901885986328125, + -0.0172119140625, + 0.047027587890625, + 0.007537841796875, + 0.0268096923828125, + -0.0257415771484375, + 0.03631591796875, + 0.0024166107177734375, + -0.0122222900390625, + -0.07391357421875, + -0.01837158203125, + -0.054840087890625, + -0.005481719970703125, + 0.0140380859375, + -0.017974853515625, + -0.032318115234375, + -0.0526123046875, + 0.04766845703125, + 0.0280303955078125, + 0.0154876708984375, + -0.04254150390625, + 0.005245208740234375, + -0.0006666183471679688, + -0.0401611328125, + 0.040618896484375, + 0.029937744140625, + -0.0228424072265625, + 0.04779052734375, + -0.07373046875, + 0.042999267578125, + 0.0223846435546875, + -0.0178985595703125, + 0.0134429931640625, + -0.012176513671875, + -0.003997802734375, + 0.003917694091796875, + 0.005260467529296875, + -0.0029735565185546875, + -0.0227203369140625, + 0.01233673095703125, + -0.047515869140625, + -0.007526397705078125, + -0.01702880859375, + 0.0036563873291015625, + -0.01329803466796875, + -0.0197296142578125, + 0.032196044921875, + 0.0310516357421875, + -0.01275634765625, + 0.01366424560546875, + -0.02935791015625, + 0.042755126953125, + -0.008056640625, + -0.016143798828125, + 0.04058837890625, + -0.0185394287109375, + -0.019989013671875, + 0.034881591796875, + -0.00836944580078125, + -0.0103607177734375, + 0.0269012451171875, + 0.00766754150390625, + -0.004276275634765625, + -0.0098114013671875, + -0.005584716796875, + 0.0081939697265625, + 0.0257415771484375, + 0.013580322265625, + 0.005298614501953125, + -0.04595947265625, + -0.0149688720703125, + -0.025177001953125, + -0.022430419921875, + 0.0013055801391601562, + -0.06842041015625, + 0.031494140625, + 0.01027679443359375, + 0.0236968994140625, + 0.0092315673828125, + -0.0010576248168945312, + 0.0303802490234375, + -0.0270538330078125, + -0.06201171875, + -0.033477783203125, + -0.0107574462890625, + -0.038604736328125, + 0.002689361572265625, + -0.01690673828125, + 0.01245880126953125, + 0.039703369140625, + 0.0190887451171875, + -0.0283050537109375, + -0.006378173828125, + -0.0009150505065917969, + -0.00804901123046875, + -0.0223236083984375, + 0.007198333740234375, + -0.0350341796875, + -0.0036983489990234375, + -0.01174163818359375, + 0.02728271484375, + -0.017730712890625, + 0.003070831298828125, + 0.00037789344787597656, + 0.053863525390625, + 0.01947021484375, + 0.0274505615234375, + -0.030731201171875, + 0.033416748046875, + -0.00205230712890625, + -0.050384521484375, + -0.0300750732421875, + 0.03692626953125, + 0.00922393798828125, + 0.027679443359375, + 0.024505615234375, + -0.0200958251953125, + -0.0162353515625, + -0.035614013671875, + -0.0180816650390625, + -0.01378631591796875, + -0.051483154296875, + -0.0247802734375, + -0.047607421875, + -0.0023021697998046875, + 0.0163726806640625, + -0.01210784912109375, + -0.055328369140625, + 0.0200042724609375, + -0.03497314453125, + 0.019439697265625, + -0.0516357421875, + -0.0261077880859375, + -0.0270233154296875, + 0.031890869140625, + -0.0285186767578125, + 0.05194091796875, + -0.05377197265625, + 0.0123748779296875, + -0.00536346435546875, + 0.01293182373046875, + -0.00853729248046875, + 0.048828125, + -0.03656005859375, + -0.019134521484375, + 0.0128173828125, + 0.02239990234375, + 0.00693511962890625, + 0.016143798828125, + 0.0106353759765625, + 0.0193328857421875, + -0.0130462646484375, + -0.0036907196044921875, + -0.0496826171875, + -0.008270263671875, + -0.00862884521484375, + -0.006038665771484375, + 0.012481689453125, + 0.0024471282958984375, + -0.0162506103515625, + -0.0277099609375, + 0.05450439453125, + 0.01306915283203125, + -0.038665771484375, + -0.0211944580078125, + -0.029937744140625, + -0.07232666015625, + -0.01654052734375, + -0.00275421142578125, + -0.006153106689453125, + 0.013336181640625, + -0.07171630859375, + 0.0396728515625, + 0.0193023681640625, + -0.039520263671875, + -0.0004703998565673828, + 0.086181640625, + 0.04376220703125, + 1.0848045349121094e-05, + -0.0850830078125, + 0.019866943359375, + 0.021575927734375, + -0.0094146728515625, + -0.0240936279296875, + 0.005275726318359375, + -0.007709503173828125, + -0.01079559326171875, + -0.0399169921875, + -0.036895751953125, + -0.0626220703125, + 0.0146026611328125, + 0.0478515625, + -0.0107421875, + 0.06195068359375, + -0.01995849609375, + -0.015716552734375, + -0.05828857421875, + 0.0450439453125, + 0.0609130859375, + -0.0169677734375, + 0.04852294921875, + 0.061798095703125, + 0.020782470703125, + 0.0745849609375, + -0.0207672119140625, + -0.006103515625, + -0.005077362060546875, + 0.060546875, + 0.052001953125, + 0.0223236083984375, + 0.039947509765625, + 0.04290771484375, + -0.08245849609375, + -0.05889892578125, + -0.01288604736328125, + -0.01274871826171875, + -0.0205078125, + -0.02252197265625, + 0.01885986328125, + -0.031219482421875, + -0.001827239990234375, + 0.037017822265625, + 0.0251617431640625, + 0.01308441162109375, + 0.009918212890625, + -0.0158233642578125, + 0.0374755859375, + -0.01476287841796875, + 0.0255889892578125, + 0.052734375, + -0.055694580078125, + 0.00720977783203125, + -0.02154541015625, + -0.0135498046875, + -0.059539794921875, + 0.00965118408203125, + 0.0171966552734375, + -0.0018405914306640625, + 0.04217529296875, + 0.0625, + 0.0028438568115234375, + 0.01142120361328125, + -0.0301361083984375, + 0.0011587142944335938, + 0.0281829833984375, + -0.06756591796875, + -0.054046630859375, + -0.032073974609375, + -0.005840301513671875, + -0.012420654296875, + 0.010589599609375, + -0.01111602783203125, + -0.0022716522216796875, + 0.01248931884765625, + 0.007843017578125, + -0.01446533203125, + -0.0340576171875, + -0.0116119384765625, + -0.0863037109375, + -0.06610107421875, + -0.037261962890625, + 0.0012655258178710938, + -0.0133819580078125, + 0.00974273681640625, + 0.0316162109375, + 0.01081085205078125, + 0.00048232078552246094, + 0.02093505859375, + -0.010101318359375, + 0.030487060546875, + -0.02203369140625, + 0.05535888671875, + -0.048095703125, + -0.07977294921875, + -0.0194854736328125, + 0.01558685302734375, + -0.016387939453125, + -0.009063720703125, + -0.01232147216796875, + -0.0062103271484375, + -0.037506103515625, + 0.068359375, + 0.0291748046875, + 0.0236358642578125, + -0.0322265625, + -0.045379638671875, + 0.0196533203125, + 0.0159454345703125, + -0.01800537109375, + 0.00954437255859375, + -0.00803375244140625, + -0.06939697265625, + 0.00830841064453125, + 0.00640106201171875, + -0.0055999755859375, + -0.030517578125, + -0.031524658203125, + 0.037994384765625, + -0.01062774658203125, + -0.02191162109375, + -0.022064208984375, + -0.01910400390625, + -0.02130126953125, + -0.01213836669921875, + 0.005229949951171875, + 0.0032253265380859375, + -0.035552978515625, + 0.024017333984375, + -0.033233642578125, + 0.035003662109375, + -0.0125579833984375, + 0.006519317626953125, + -0.0276641845703125, + 0.00983428955078125, + -0.01611328125, + -0.005413055419921875, + 0.005756378173828125, + -0.002681732177734375, + 0.0206756591796875, + 0.011566162109375, + 0.042449951171875, + 0.0367431640625, + -0.0124053955078125, + 0.016357421875, + -0.041748046875, + -0.01325225830078125, + -0.0445556640625, + 0.005359649658203125, + 0.00762176513671875, + 0.0350341796875, + -0.0133056640625, + -0.0222930908203125, + 0.01392364501953125, + 0.0010623931884765625, + -0.016998291015625, + 0.05047607421875, + -0.0814208984375, + -0.0211029052734375, + 0.0263671875, + -0.032623291015625, + 0.0297698974609375, + -0.014556884765625, + -0.044921875, + 0.048095703125, + -0.002788543701171875, + -0.0197601318359375, + -0.029144287109375, + 0.02972412109375, + 0.0357666015625, + -0.01448822021484375, + -0.041015625, + -0.032623291015625, + 0.0235443115234375, + -0.004947662353515625, + 0.03955078125, + -0.04803466796875, + -0.0026874542236328125, + -0.007442474365234375, + 0.0084686279296875, + -0.03460693359375, + 0.0084075927734375, + 0.0223388671875, + -0.006168365478515625, + 0.008941650390625, + 0.025238037109375, + 0.02325439453125, + -0.061309814453125, + 0.032806396484375, + 0.00958251953125, + 0.020233154296875, + -0.07159423828125, + 0.00543212890625, + 0.0033130645751953125, + 0.0158233642578125, + 0.01070404052734375, + 0.0645751953125, + 0.01120758056640625, + 0.0396728515625, + 0.046356201171875, + 0.021270751953125, + 0.0213165283203125, + 0.0188446044921875, + -0.0170135498046875, + -0.0034465789794921875, + 0.0163421630859375, + 0.04315185546875, + 0.048583984375, + 0.01153564453125, + 0.0272216796875, + 0.023406982421875, + -0.01265716552734375, + 0.023712158203125, + 0.012664794921875, + -0.014862060546875, + 0.0026035308837890625, + 0.0243072509765625, + 0.017791748046875, + -0.024658203125, + 0.023101806640625, + 0.01052093505859375, + -0.0004978179931640625, + 0.0232696533203125, + -0.01464080810546875, + -0.029388427734375, + -0.034393310546875, + 0.055206298828125, + 0.0024013519287109375, + 0.004993438720703125, + -0.007015228271484375, + -0.0167236328125, + -0.0046234130859375, + 0.054718017578125, + -0.01953125, + 0.038665771484375, + 0.01062774658203125, + 0.0281829833984375, + 0.01030731201171875, + 0.0160980224609375, + 0.03961181640625, + 0.0221099853515625, + -0.03533935546875, + -0.018463134765625, + -0.006557464599609375, + -0.00804901123046875, + 0.005634307861328125, + 0.0168304443359375, + -0.053375244140625, + 0.0667724609375, + -0.022674560546875, + -0.018035888671875, + 0.0113983154296875, + -0.0215606689453125, + -0.039794921875, + -0.055908203125, + 0.041290283203125, + -0.01555633544921875, + -0.011627197265625, + 0.032379150390625, + -0.0202178955078125, + -0.0015087127685546875, + 0.0290374755859375, + 0.004978179931640625, + 0.04437255859375, + 0.03375244140625, + 0.02423095703125, + -0.01399993896484375, + 0.037200927734375, + 0.033935546875, + -0.02838134765625, + 0.002597808837890625, + 0.016082763671875, + -0.0019969940185546875, + 0.0058746337890625, + 0.009552001953125, + -0.054779052734375, + -0.01059722900390625, + -0.0202178955078125, + -0.0311431884765625, + 0.0242767333984375, + 0.039337158203125, + -0.01715087890625, + -0.0095062255859375, + 0.019378662109375, + 0.0175323486328125, + -0.037567138671875, + 0.044525146484375, + 0.009613037109375, + 0.0133819580078125, + -0.0284576416015625, + 0.0039215087890625, + -0.03118896484375, + 0.0152130126953125, + -0.0085601806640625, + -0.07598876953125, + -0.0252532958984375, + -0.0245513916015625, + -0.004016876220703125, + -0.0257110595703125, + -0.043426513671875, + 0.00421142578125, + 0.0116424560546875, + 0.0092010498046875, + -0.040283203125, + -0.00799560546875, + 0.00630950927734375, + -0.0121917724609375, + 0.01617431640625, + -0.01107025146484375, + 0.0160064697265625, + 0.003955841064453125, + 0.07904052734375, + 0.0166015625, + 0.06036376953125, + 0.0250701904296875, + 0.0017480850219726562, + 0.0211029052734375, + -0.0021076202392578125, + 0.04669189453125, + 0.00598907470703125, + 0.0146026611328125, + -0.05615234375, + 0.035186767578125, + -0.022308349609375, + -0.00556182861328125, + 0.0125274658203125, + 0.047027587890625, + -0.01129150390625, + -0.017791748046875, + -0.01611328125, + -0.025360107421875, + -0.042724609375, + -0.038055419921875, + -0.043243408203125, + 0.06304931640625, + -0.0006055831909179688, + 0.01317596435546875, + -0.0104522705078125, + -0.058074951171875, + 0.219482421875, + 0.053009033203125, + 0.03497314453125, + 0.04620361328125, + 0.022979736328125, + 0.007904052734375, + 0.0115814208984375, + -0.02972412109375, + -0.00899505615234375, + -0.032257080078125, + 0.01507568359375, + 0.020660400390625, + 0.035369873046875, + 0.06304931640625, + 0.034332275390625, + 0.05010986328125, + -0.035797119140625, + -0.0011224746704101562, + -0.0100860595703125, + -0.0208740234375, + -0.07159423828125, + 0.007293701171875, + 0.0208587646484375, + 0.0219573974609375, + 0.0124359130859375, + 0.0298004150390625, + 0.0124053955078125, + -0.0430908203125, + -0.02056884765625, + -0.0255889892578125, + 0.05975341796875, + 0.0030193328857421875, + 0.0343017578125, + -0.0016508102416992188, + -0.04510498046875, + 0.03271484375, + -0.0237884521484375, + -0.036651611328125, + -0.0244293212890625, + 0.032806396484375, + -0.0238189697265625, + -0.026641845703125, + 0.0220794677734375, + -0.0005793571472167969, + -0.0118865966796875, + 0.031707763671875, + -0.037384033203125, + 0.004970550537109375, + -0.0082855224609375, + -0.0213470458984375, + 0.041259765625, + -0.048492431640625, + 0.0428466796875, + -0.03643798828125, + -0.044036865234375, + -0.01506805419921875, + -0.01001739501953125, + 0.004314422607421875, + -0.0275115966796875, + -0.0032634735107421875, + -0.00293731689453125, + 0.0285797119140625, + -0.0169830322265625, + -0.018463134765625, + -0.05340576171875, + -0.00955963134765625, + 0.024017333984375, + 0.044708251953125, + 0.003948211669921875, + -0.026641845703125, + -0.044708251953125, + -0.0254974365234375, + -0.01161956787109375, + -0.05841064453125, + 0.002246856689453125, + 0.051910400390625, + -0.0134429931640625, + -0.0028285980224609375, + 0.00647735595703125, + 0.00742340087890625, + -9.709596633911133e-05, + 0.027099609375, + 0.01171875, + -0.0048675537109375, + -0.00347900390625, + 0.05621337890625, + -0.0117950439453125, + -0.006793975830078125, + -0.00884246826171875, + 0.01467132568359375, + 0.071044921875, + 0.0311737060546875, + 0.00567626953125, + -0.0268707275390625, + 0.0014009475708007812 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "bge-large-en-v1.5", + "object": "list", + "usage": { + "prompt_tokens": 6, + "total_tokens": 6 + }, + "id": "087ac5ef-08bc-459a-a20e-5aa4502151da" + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/7f53b458dad9.json b/tests/integration/recordings/responses/7f53b458dad9.json new file mode 100644 index 000000000..a7a98c739 --- /dev/null +++ b/tests/integration/recordings/responses/7f53b458dad9.json @@ -0,0 +1,83 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/chat/completions", + "headers": {}, + "body": { + "model": "databricks-meta-llama-3-3-70b-instruct", + "messages": [ + { + "role": "user", + "content": "What's the weather in Tokyo? Use the get_weather function to get the weather." + } + ], + "stream": false, + "tools": [ + { + "type": "function", + "function": { + "name": "get_weather", + "description": "Get the weather in a given city", + "parameters": { + "type": "object", + "properties": { + "city": { + "type": "string", + "description": "The city to get the weather for" + } + } + } + } + } + ] + }, + "endpoint": "/v1/chat/completions", + "model": "databricks-meta-llama-3-3-70b-instruct" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "chatcmpl_e54eaa97-ace3-4af6-b3a2-b1627bc77488", + "choices": [ + { + "finish_reason": "tool_calls", + "index": 0, + "logprobs": null, + "message": { + "content": null, + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [ + { + "id": "call_9c7f9e5f-c6eb-4c3c-a7b3-e9fe0e786b50", + "function": { + "arguments": "{ \"city\": \"Tokyo\" }", + "name": "get_weather" + }, + "type": "function" + } + ] + } + } + ], + "created": 1758326507, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 15, + "prompt_tokens": 682, + "total_tokens": 697, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/875323ed9913.json b/tests/integration/recordings/responses/875323ed9913.json new file mode 100644 index 000000000..03b44ee35 --- /dev/null +++ b/tests/integration/recordings/responses/875323ed9913.json @@ -0,0 +1,3125 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/embeddings", + "headers": {}, + "body": { + "model": "databricks-bge-large-en", + "input": [ + "Hello, world!", + "How are you today?", + "This is a test." + ], + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "databricks-bge-large-en" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.0243988037109375, + 0.047943115234375, + 0.007335662841796875, + -0.007709503173828125, + -0.0391845703125, + 0.0010442733764648438, + 0.060638427734375, + 0.047119140625, + 0.048828125, + 0.0029754638671875, + 0.01132965087890625, + 0.0018949508666992188, + -0.0067138671875, + -0.0010623931884765625, + -0.0482177734375, + 0.00206756591796875, + -0.00333404541015625, + -0.03924560546875, + -0.042205810546875, + 0.001739501953125, + -0.0150909423828125, + 0.0198516845703125, + -0.06890869140625, + -0.01383209228515625, + 0.01207733154296875, + 0.0251617431640625, + 0.048248291015625, + -0.0016155242919921875, + 0.04901123046875, + 0.049224853515625, + -0.016845703125, + 0.006439208984375, + -0.01308441162109375, + -0.05352783203125, + -0.02349853515625, + -0.0156097412109375, + 0.0246734619140625, + -0.0182952880859375, + -0.03765869140625, + -0.033782958984375, + 0.031982421875, + 0.012603759765625, + 0.05194091796875, + -0.030975341796875, + -0.0728759765625, + 0.014678955078125, + 0.0018672943115234375, + 0.01189422607421875, + 0.047576904296875, + -0.034820556640625, + 0.003490447998046875, + 0.0225830078125, + -0.01312255859375, + -0.015655517578125, + -0.00928497314453125, + 0.01117706298828125, + -0.04730224609375, + 0.03094482421875, + -0.0184173583984375, + 0.0289306640625, + 0.01617431640625, + 0.0369873046875, + 0.043121337890625, + -0.07110595703125, + -0.005035400390625, + 0.032684326171875, + -0.017303466796875, + -0.0286865234375, + 0.037322998046875, + -2.2411346435546875e-05, + -0.0400390625, + 0.0229034423828125, + 0.0014581680297851562, + -0.0011243820190429688, + -0.044647216796875, + 0.03863525390625, + -0.0066986083984375, + 0.0248565673828125, + -0.0228118896484375, + 0.01739501953125, + -0.005123138427734375, + 0.024932861328125, + -0.0092315673828125, + -6.16908073425293e-05, + -0.032623291015625, + -0.023834228515625, + 0.02532958984375, + 0.0243988037109375, + -0.0043792724609375, + -0.0207977294921875, + 0.057159423828125, + 0.03338623046875, + -0.004833221435546875, + -0.0027980804443359375, + 0.067626953125, + 0.0119476318359375, + -0.0282745361328125, + 0.00478363037109375, + -0.0012569427490234375, + 0.031005859375, + 0.03271484375, + 0.042083740234375, + -0.04437255859375, + 0.001743316650390625, + -0.031646728515625, + -0.01284027099609375, + -0.0006976127624511719, + -0.024993896484375, + -0.017974853515625, + -0.0216064453125, + -0.0264434814453125, + 0.0166473388671875, + 0.023223876953125, + 0.030426025390625, + -0.00421142578125, + 0.04913330078125, + 0.00365447998046875, + 0.0305633544921875, + -0.00933837890625, + -0.01103973388671875, + 0.017578125, + 0.035736083984375, + 0.00762176513671875, + -0.0289764404296875, + -0.0201263427734375, + -0.048828125, + -0.0297698974609375, + 0.0643310546875, + 0.0034046173095703125, + 0.005626678466796875, + 0.0011930465698242188, + -0.01959228515625, + 0.04833984375, + 0.0261077880859375, + 0.0166473388671875, + -0.006198883056640625, + -0.0127410888671875, + 0.05255126953125, + 0.023345947265625, + -0.04766845703125, + 0.007568359375, + -0.01605224609375, + -0.0249786376953125, + 0.0716552734375, + 0.021148681640625, + 0.047271728515625, + -0.0004963874816894531, + 0.0272979736328125, + -0.0146942138671875, + 0.006557464599609375, + -0.0176239013671875, + 0.025848388671875, + 0.0009784698486328125, + 0.047943115234375, + -0.0140838623046875, + 0.00478363037109375, + 0.0163726806640625, + 0.0284576416015625, + 0.0004887580871582031, + 0.00702667236328125, + 0.01250457763671875, + 0.03814697265625, + -0.00475311279296875, + 0.01116943359375, + -0.0187835693359375, + -0.003292083740234375, + -0.037750244140625, + -0.024200439453125, + 0.00476837158203125, + -0.0223236083984375, + -0.0184326171875, + -0.0226287841796875, + -0.029449462890625, + 0.00551605224609375, + 0.022247314453125, + 0.0177764892578125, + 0.004779815673828125, + -0.00438690185546875, + 0.03790283203125, + 0.0191650390625, + -0.04058837890625, + 0.01287841796875, + -0.0167694091796875, + 0.020904541015625, + -0.0011262893676757812, + 0.0074920654296875, + 0.010528564453125, + 0.0025463104248046875, + -0.0158843994140625, + -0.0284881591796875, + 0.0233917236328125, + 0.01557159423828125, + -0.033050537109375, + 0.021240234375, + 0.00876617431640625, + 0.0182342529296875, + -0.0213470458984375, + 0.019744873046875, + 0.0004127025604248047, + -0.08154296875, + -0.051849365234375, + 0.0160064697265625, + 0.0020732879638671875, + 0.0062408447265625, + -0.0002663135528564453, + -0.02752685546875, + -0.01544952392578125, + 0.035552978515625, + -0.0413818359375, + -0.0205535888671875, + -0.0018510818481445312, + 0.0179595947265625, + -0.02044677734375, + 0.0246734619140625, + 0.00603485107421875, + -0.04498291015625, + -0.0328369140625, + 0.0293426513671875, + -0.003444671630859375, + 0.0013523101806640625, + 0.021087646484375, + 0.0214996337890625, + 0.0322265625, + 0.052734375, + 0.007595062255859375, + 0.01483154296875, + -0.0285186767578125, + 0.039642333984375, + -0.00885009765625, + -0.008209228515625, + -0.02130126953125, + 0.040191650390625, + -0.007656097412109375, + 0.03790283203125, + 0.033477783203125, + 0.01396942138671875, + 0.0477294921875, + 0.03594970703125, + 0.0153961181640625, + -0.0192108154296875, + -0.043609619140625, + -0.01102447509765625, + 0.0202789306640625, + 0.0216827392578125, + 0.0107421875, + -0.003948211669921875, + 0.032745361328125, + -0.036468505859375, + 0.00565338134765625, + 0.017333984375, + -0.02471923828125, + 0.04962158203125, + 0.06695556640625, + 0.00830841064453125, + -0.038543701171875, + -0.033538818359375, + 0.0126495361328125, + 0.0963134765625, + -0.045501708984375, + -0.0272674560546875, + -0.0198516845703125, + 0.0192108154296875, + -0.005985260009765625, + 0.004718780517578125, + 0.0034332275390625, + 0.00797271728515625, + 0.013763427734375, + 0.00807952880859375, + -0.0081634521484375, + -0.0648193359375, + -0.0164794921875, + -0.0153961181640625, + -0.037322998046875, + 0.032684326171875, + -0.0148773193359375, + -0.0034275054931640625, + 0.01495361328125, + 0.0007452964782714844, + 0.0262908935546875, + -0.0213470458984375, + 0.0033168792724609375, + 0.00027680397033691406, + 0.037139892578125, + 0.01678466796875, + -0.006198883056640625, + -0.0129241943359375, + -0.0249176025390625, + -0.031768798828125, + -0.0093841552734375, + 0.05096435546875, + -0.054473876953125, + -0.0012273788452148438, + 0.0090484619140625, + 0.023712158203125, + -0.041168212890625, + 0.033782958984375, + -0.033447265625, + 0.0213623046875, + -0.023468017578125, + -0.032928466796875, + -0.00803375244140625, + 0.004177093505859375, + -0.0240478515625, + -0.020172119140625, + -0.0230255126953125, + 0.01380157470703125, + -0.00031375885009765625, + -0.03802490234375, + 0.0404052734375, + 0.0055999755859375, + -0.0276947021484375, + 0.0679931640625, + 0.023712158203125, + -0.0112152099609375, + -0.0311431884765625, + 0.0273284912109375, + 0.03741455078125, + 0.051055908203125, + -0.027740478515625, + -0.0143585205078125, + -0.0214691162109375, + -0.0245513916015625, + -0.01110076904296875, + -0.0645751953125, + -0.0060272216796875, + 0.0298614501953125, + 0.0212554931640625, + -0.038421630859375, + 0.0308074951171875, + -0.050384521484375, + -0.0648193359375, + -0.05316162109375, + -0.042205810546875, + 0.017822265625, + 0.00931549072265625, + -0.0125579833984375, + -0.0149688720703125, + -0.00836944580078125, + 0.0144805908203125, + -0.00506591796875, + 0.062347412109375, + -0.054046630859375, + -0.0012969970703125, + 0.0301361083984375, + -0.0227203369140625, + 0.005970001220703125, + -0.005603790283203125, + -0.0218048095703125, + -0.033477783203125, + 0.036895751953125, + 0.0012178421020507812, + -0.01517486572265625, + 0.00815582275390625, + 0.03436279296875, + 0.006923675537109375, + 0.0411376953125, + -0.08392333984375, + -0.0008368492126464844, + 0.052978515625, + -0.03778076171875, + 0.0228729248046875, + 0.03662109375, + 0.01922607421875, + -0.07257080078125, + 0.0016651153564453125, + -0.053466796875, + 0.0074920654296875, + 0.0200958251953125, + 0.024200439453125, + -0.049102783203125, + 0.033966064453125, + -0.032257080078125, + -0.0374755859375, + -0.0171051025390625, + -0.04205322265625, + -0.003955841064453125, + 0.0290985107421875, + -0.0194244384765625, + 0.031219482421875, + -0.037353515625, + 0.0143280029296875, + -0.038482666015625, + 0.0158233642578125, + 0.10565185546875, + 0.058685302734375, + 0.00910186767578125, + -0.031036376953125, + 0.0009794235229492188, + -0.01024627685546875, + -0.00899505615234375, + -0.059051513671875, + -0.0002980232238769531, + 0.0220184326171875, + -0.0318603515625, + -0.046234130859375, + -0.06512451171875, + 0.038055419921875, + 0.0237579345703125, + 0.05535888671875, + 0.0269775390625, + -0.032470703125, + -0.007843017578125, + -0.0004277229309082031, + -0.0008320808410644531, + -0.0297698974609375, + 0.00347900390625, + -0.0231170654296875, + 0.045684814453125, + 0.02154541015625, + -0.0097808837890625, + -0.052001953125, + -0.004913330078125, + -0.0172119140625, + 0.047088623046875, + 0.00754547119140625, + 0.0267791748046875, + -0.0257415771484375, + 0.03631591796875, + 0.0024356842041015625, + -0.0122222900390625, + -0.073974609375, + -0.0183258056640625, + -0.0548095703125, + -0.005504608154296875, + 0.0140838623046875, + -0.01800537109375, + -0.032318115234375, + -0.052703857421875, + 0.047607421875, + 0.0280303955078125, + 0.0155181884765625, + -0.042572021484375, + 0.005260467529296875, + -0.0006623268127441406, + -0.0401611328125, + 0.040618896484375, + 0.029937744140625, + -0.0228424072265625, + 0.04779052734375, + -0.07366943359375, + 0.042877197265625, + 0.022369384765625, + -0.017913818359375, + 0.013458251953125, + -0.0121612548828125, + -0.0040283203125, + 0.003917694091796875, + 0.00525665283203125, + -0.0029850006103515625, + -0.022705078125, + 0.0123443603515625, + -0.047576904296875, + -0.007537841796875, + -0.0170135498046875, + 0.0036563873291015625, + -0.01328277587890625, + -0.0197296142578125, + 0.032257080078125, + 0.0310821533203125, + -0.01271820068359375, + 0.01367950439453125, + -0.0293426513671875, + 0.04278564453125, + -0.0080413818359375, + -0.016143798828125, + 0.040557861328125, + -0.0185546875, + -0.019989013671875, + 0.03485107421875, + -0.00839996337890625, + -0.0103302001953125, + 0.0269317626953125, + 0.007663726806640625, + -0.004302978515625, + -0.00980377197265625, + -0.00559234619140625, + 0.008209228515625, + 0.0257415771484375, + 0.01360321044921875, + 0.005290985107421875, + -0.04595947265625, + -0.0149688720703125, + -0.0251617431640625, + -0.022491455078125, + 0.0013647079467773438, + -0.06842041015625, + 0.03143310546875, + 0.01025390625, + 0.0236968994140625, + 0.0092620849609375, + -0.0010786056518554688, + 0.0303802490234375, + -0.0270233154296875, + -0.06201171875, + -0.033477783203125, + -0.010772705078125, + -0.038604736328125, + 0.0026912689208984375, + -0.016876220703125, + 0.012451171875, + 0.039703369140625, + 0.019073486328125, + -0.0282745361328125, + -0.006443023681640625, + -0.0009312629699707031, + -0.008056640625, + -0.022308349609375, + 0.00717926025390625, + -0.0350341796875, + -0.0036983489990234375, + -0.011749267578125, + 0.02728271484375, + -0.01776123046875, + 0.0030460357666015625, + 0.00038242340087890625, + 0.0538330078125, + 0.019439697265625, + 0.0274505615234375, + -0.03076171875, + 0.033477783203125, + -0.002002716064453125, + -0.05035400390625, + -0.0300750732421875, + 0.036895751953125, + 0.00921630859375, + 0.0276947021484375, + 0.0244598388671875, + -0.0200653076171875, + -0.0162353515625, + -0.03564453125, + -0.0180816650390625, + -0.01381683349609375, + -0.051422119140625, + -0.024810791015625, + -0.047576904296875, + -0.002307891845703125, + 0.016357421875, + -0.01212310791015625, + -0.055328369140625, + 0.0200042724609375, + -0.035003662109375, + 0.01947021484375, + -0.05157470703125, + -0.0261077880859375, + -0.0270233154296875, + 0.031890869140625, + -0.0285491943359375, + 0.05194091796875, + -0.0537109375, + 0.0123443603515625, + -0.00536346435546875, + 0.01294708251953125, + -0.008514404296875, + 0.048797607421875, + -0.03656005859375, + -0.019134521484375, + 0.01282501220703125, + 0.02239990234375, + 0.006916046142578125, + 0.0161895751953125, + 0.0106201171875, + 0.0193023681640625, + -0.0130157470703125, + -0.003704071044921875, + -0.0496826171875, + -0.00824737548828125, + -0.0086212158203125, + -0.005970001220703125, + 0.01248931884765625, + 0.002422332763671875, + -0.0162811279296875, + -0.027679443359375, + 0.05450439453125, + 0.013031005859375, + -0.03863525390625, + -0.02117919921875, + -0.029937744140625, + -0.0723876953125, + -0.0164947509765625, + -0.002712249755859375, + -0.006168365478515625, + 0.013336181640625, + -0.07177734375, + 0.039642333984375, + 0.0193328857421875, + -0.039459228515625, + -0.00047898292541503906, + 0.086181640625, + 0.04376220703125, + 3.540515899658203e-05, + -0.0850830078125, + 0.0198974609375, + 0.02154541015625, + -0.00942230224609375, + -0.02410888671875, + 0.005283355712890625, + -0.007701873779296875, + -0.01079559326171875, + -0.039947509765625, + -0.03692626953125, + -0.0626220703125, + 0.014617919921875, + 0.047882080078125, + -0.01073455810546875, + 0.0618896484375, + -0.0198516845703125, + -0.0157318115234375, + -0.05828857421875, + 0.045013427734375, + 0.0609130859375, + -0.016937255859375, + 0.048553466796875, + 0.061798095703125, + 0.0208740234375, + 0.0745849609375, + -0.020751953125, + -0.00606536865234375, + -0.005092620849609375, + 0.060546875, + 0.052001953125, + 0.0223846435546875, + 0.0399169921875, + 0.042938232421875, + -0.08251953125, + -0.0589599609375, + -0.01287841796875, + -0.0127105712890625, + -0.0205078125, + -0.0225372314453125, + 0.0188446044921875, + -0.03125, + -0.0018014907836914062, + 0.037017822265625, + 0.0251617431640625, + 0.013092041015625, + 0.009918212890625, + -0.015838623046875, + 0.037506103515625, + -0.01477813720703125, + 0.025604248046875, + 0.052734375, + -0.055694580078125, + 0.007232666015625, + -0.02154541015625, + -0.01358795166015625, + -0.059539794921875, + 0.0096282958984375, + 0.0172119140625, + -0.0018491744995117188, + 0.042205810546875, + 0.06243896484375, + 0.002838134765625, + 0.011444091796875, + -0.0301361083984375, + 0.0011997222900390625, + 0.028167724609375, + -0.06756591796875, + -0.05401611328125, + -0.03204345703125, + -0.005840301513671875, + -0.0124359130859375, + 0.01061248779296875, + -0.0111541748046875, + -0.002239227294921875, + 0.01250457763671875, + 0.0078887939453125, + -0.014434814453125, + -0.0340576171875, + -0.0115966796875, + -0.0863037109375, + -0.06610107421875, + -0.0372314453125, + 0.001293182373046875, + -0.01338958740234375, + 0.0097503662109375, + 0.0316162109375, + 0.01081085205078125, + 0.0005192756652832031, + 0.02093505859375, + -0.010101318359375, + 0.0305328369140625, + -0.02203369140625, + 0.05535888671875, + -0.048126220703125, + -0.0797119140625, + -0.0194854736328125, + 0.01557159423828125, + -0.016387939453125, + -0.00905609130859375, + -0.0123138427734375, + -0.00618743896484375, + -0.0374755859375, + 0.068359375, + 0.0291748046875, + 0.023651123046875, + -0.032196044921875, + -0.045379638671875, + 0.0196685791015625, + 0.0159454345703125, + -0.0180206298828125, + 0.0095672607421875, + -0.00803375244140625, + -0.06939697265625, + 0.00830841064453125, + 0.006389617919921875, + -0.0055999755859375, + -0.030487060546875, + -0.031524658203125, + 0.03802490234375, + -0.01064300537109375, + -0.0218963623046875, + -0.0220794677734375, + -0.01910400390625, + -0.0213165283203125, + -0.0121002197265625, + 0.005268096923828125, + 0.0032634735107421875, + -0.035552978515625, + 0.024017333984375, + -0.033203125, + 0.03497314453125, + -0.01259613037109375, + 0.006511688232421875, + -0.0276336669921875, + 0.0098419189453125, + -0.016082763671875, + -0.005413055419921875, + 0.005741119384765625, + -0.0026645660400390625, + 0.020660400390625, + 0.011566162109375, + 0.042510986328125, + 0.036773681640625, + -0.0124053955078125, + 0.016387939453125, + -0.041748046875, + -0.01324462890625, + -0.04461669921875, + 0.005382537841796875, + 0.00766754150390625, + 0.0350341796875, + -0.0133514404296875, + -0.022308349609375, + 0.01395416259765625, + 0.0010786056518554688, + -0.016998291015625, + 0.050445556640625, + -0.08148193359375, + -0.0211181640625, + 0.0263671875, + -0.032684326171875, + 0.0298004150390625, + -0.0145721435546875, + -0.044921875, + 0.048065185546875, + -0.002777099609375, + -0.0197601318359375, + -0.029144287109375, + 0.029693603515625, + 0.0357666015625, + -0.01446533203125, + -0.04107666015625, + -0.032623291015625, + 0.0235443115234375, + -0.004932403564453125, + 0.03948974609375, + -0.04803466796875, + -0.002696990966796875, + -0.00742340087890625, + 0.0084991455078125, + -0.03466796875, + 0.00839996337890625, + 0.02239990234375, + -0.00612640380859375, + 0.00899505615234375, + 0.02520751953125, + 0.0232391357421875, + -0.061309814453125, + 0.032806396484375, + 0.00960540771484375, + 0.020233154296875, + -0.0716552734375, + 0.00543212890625, + 0.0033130645751953125, + 0.0158233642578125, + 0.010711669921875, + 0.0645751953125, + 0.01123046875, + 0.03961181640625, + 0.046295166015625, + 0.021240234375, + 0.02130126953125, + 0.0188446044921875, + -0.016998291015625, + -0.0034503936767578125, + 0.016357421875, + 0.043121337890625, + 0.048583984375, + 0.01155853271484375, + 0.027252197265625, + 0.023406982421875, + -0.0126495361328125, + 0.023712158203125, + 0.0126800537109375, + -0.0148773193359375, + 0.00258636474609375, + 0.024322509765625, + 0.0178070068359375, + -0.024658203125, + 0.0230865478515625, + 0.0105133056640625, + -0.00045037269592285156, + 0.023223876953125, + -0.01464080810546875, + -0.029388427734375, + -0.03436279296875, + 0.05517578125, + 0.0023937225341796875, + 0.0049896240234375, + -0.006999969482421875, + -0.0167083740234375, + -0.00464630126953125, + 0.0546875, + -0.0194854736328125, + 0.0386962890625, + 0.01062774658203125, + 0.028167724609375, + 0.01032257080078125, + 0.0160980224609375, + 0.03955078125, + 0.0221405029296875, + -0.035400390625, + -0.01849365234375, + -0.006534576416015625, + -0.00806427001953125, + 0.005580902099609375, + 0.016815185546875, + -0.053375244140625, + 0.06671142578125, + -0.0226593017578125, + -0.01800537109375, + 0.01136016845703125, + -0.021575927734375, + -0.039794921875, + -0.055908203125, + 0.041290283203125, + -0.0155181884765625, + -0.01160430908203125, + 0.03240966796875, + -0.0201873779296875, + -0.0015039443969726562, + 0.0290374755859375, + 0.004970550537109375, + 0.044342041015625, + 0.033782958984375, + 0.024200439453125, + -0.0140533447265625, + 0.0372314453125, + 0.033966064453125, + -0.02838134765625, + 0.0026264190673828125, + 0.016082763671875, + -0.0020294189453125, + 0.0058746337890625, + 0.00957489013671875, + -0.0548095703125, + -0.0106048583984375, + -0.0201873779296875, + -0.0311126708984375, + 0.0242767333984375, + 0.039337158203125, + -0.0171661376953125, + -0.00949859619140625, + 0.01934814453125, + 0.017608642578125, + -0.037506103515625, + 0.044525146484375, + 0.00963592529296875, + 0.01335906982421875, + -0.0284576416015625, + 0.0039215087890625, + -0.03118896484375, + 0.0152587890625, + -0.0085601806640625, + -0.07598876953125, + -0.0252685546875, + -0.0245819091796875, + -0.00405120849609375, + -0.025726318359375, + -0.04339599609375, + 0.004215240478515625, + 0.01166534423828125, + 0.0092315673828125, + -0.040283203125, + -0.00799560546875, + 0.0063629150390625, + -0.012176513671875, + 0.01617431640625, + -0.01105499267578125, + 0.0160369873046875, + 0.00394439697265625, + 0.07904052734375, + 0.016632080078125, + 0.0604248046875, + 0.0250701904296875, + 0.00177764892578125, + 0.0211181640625, + -0.00211334228515625, + 0.04669189453125, + 0.0059967041015625, + 0.01454925537109375, + -0.056121826171875, + 0.03515625, + -0.0222625732421875, + -0.005580902099609375, + 0.01251983642578125, + 0.0469970703125, + -0.0113067626953125, + -0.0177764892578125, + -0.0161285400390625, + -0.025390625, + -0.042724609375, + -0.03802490234375, + -0.04327392578125, + 0.06304931640625, + -0.0006208419799804688, + 0.01319122314453125, + -0.01045989990234375, + -0.058074951171875, + 0.219482421875, + 0.052978515625, + 0.035003662109375, + 0.046234130859375, + 0.022979736328125, + 0.00791168212890625, + 0.0115509033203125, + -0.02972412109375, + -0.009033203125, + -0.0322265625, + 0.01506805419921875, + 0.0206146240234375, + 0.035369873046875, + 0.0631103515625, + 0.0343017578125, + 0.050079345703125, + -0.035797119140625, + -0.001117706298828125, + -0.010101318359375, + -0.020904541015625, + -0.07159423828125, + 0.0073089599609375, + 0.0208892822265625, + 0.0219573974609375, + 0.012451171875, + 0.0298614501953125, + 0.0124053955078125, + -0.0430908203125, + -0.02056884765625, + -0.025604248046875, + 0.05975341796875, + 0.0030345916748046875, + 0.034271240234375, + -0.0016489028930664062, + -0.0450439453125, + 0.03271484375, + -0.023773193359375, + -0.036651611328125, + -0.0244140625, + 0.0328369140625, + -0.0238189697265625, + -0.0266876220703125, + 0.0220489501953125, + -0.000568389892578125, + -0.011932373046875, + 0.031768798828125, + -0.037384033203125, + 0.00494384765625, + -0.00827789306640625, + -0.0213470458984375, + 0.041259765625, + -0.048492431640625, + 0.042816162109375, + -0.03643798828125, + -0.043975830078125, + -0.0151214599609375, + -0.01001739501953125, + 0.004276275634765625, + -0.0275115966796875, + -0.003204345703125, + -0.0029449462890625, + 0.0285797119140625, + -0.0169677734375, + -0.018463134765625, + -0.05340576171875, + -0.0095367431640625, + 0.024078369140625, + 0.044708251953125, + 0.00394439697265625, + -0.0266876220703125, + -0.044769287109375, + -0.0255279541015625, + -0.0115814208984375, + -0.05841064453125, + 0.0022296905517578125, + 0.051910400390625, + -0.0134429931640625, + -0.0028533935546875, + 0.00644683837890625, + 0.00742340087890625, + -5.5670738220214844e-05, + 0.027099609375, + 0.0117340087890625, + -0.0048370361328125, + -0.003509521484375, + 0.0562744140625, + -0.01180267333984375, + -0.006748199462890625, + -0.00887298583984375, + 0.01462554931640625, + 0.07110595703125, + 0.0311737060546875, + 0.0056610107421875, + -0.026885986328125, + 0.0013914108276367188 + ], + "index": 0, + "object": "embedding" + }, + { + "embedding": [ + 0.05657958984375, + -0.01303863525390625, + -0.07171630859375, + 0.0257110595703125, + -0.04144287109375, + -0.0653076171875, + 0.0290985107421875, + 0.043731689453125, + 0.034576416015625, + 0.00887298583984375, + 0.027496337890625, + 0.01410675048828125, + -0.033477783203125, + 0.0227508544921875, + -0.052825927734375, + -0.048431396484375, + -0.002658843994140625, + -0.0045166015625, + -0.001861572265625, + 0.0042572021484375, + -0.0457763671875, + 0.05926513671875, + -0.07373046875, + 0.059356689453125, + -0.0259246826171875, + 0.0139007568359375, + -0.01395416259765625, + -0.0054779052734375, + 0.0095977783203125, + 0.0606689453125, + -0.045684814453125, + 0.0550537109375, + 0.0120697021484375, + -0.047698974609375, + 0.02215576171875, + -0.053192138671875, + 0.0205841064453125, + -0.027557373046875, + 0.020721435546875, + -0.01107025146484375, + 0.0023365020751953125, + 0.01224517822265625, + 0.065185546875, + -0.0263671875, + -0.057830810546875, + 0.0100860595703125, + -0.0093994140625, + -0.036468505859375, + 0.0039215087890625, + -0.023468017578125, + 0.00843048095703125, + 0.0224761962890625, + -0.026458740234375, + -0.0110321044921875, + 0.0426025390625, + -0.00511932373046875, + -0.01483917236328125, + 0.0163116455078125, + -0.0264129638671875, + -0.004299163818359375, + 0.0227508544921875, + 0.0265350341796875, + 0.0062408447265625, + -0.0718994140625, + -0.017974853515625, + 0.02496337890625, + -0.0202789306640625, + -0.02581787109375, + -0.001132965087890625, + -0.0164337158203125, + -0.043365478515625, + 0.0310211181640625, + -0.03863525390625, + -0.0193023681640625, + -0.0021533966064453125, + 0.020263671875, + 3.993511199951172e-06, + -0.00939178466796875, + 0.024383544921875, + 0.03875732421875, + 0.0219573974609375, + 0.007785797119140625, + -0.00616455078125, + 0.01285552978515625, + -0.029022216796875, + 0.00968170166015625, + 0.003932952880859375, + 0.0259246826171875, + 0.0110321044921875, + -0.029632568359375, + 0.03955078125, + 0.0439453125, + -0.03692626953125, + -0.0249786376953125, + 0.04290771484375, + 0.053436279296875, + -0.013702392578125, + 0.00914764404296875, + -0.0560302734375, + 0.01519775390625, + 0.0716552734375, + 0.0178070068359375, + -0.0181121826171875, + 0.0316162109375, + -0.060577392578125, + -0.007793426513671875, + 0.023406982421875, + -0.038604736328125, + -0.024505615234375, + -0.031524658203125, + -0.02227783203125, + 0.03778076171875, + 0.0150299072265625, + 0.037261962890625, + -0.02490234375, + 0.004779815673828125, + 0.01922607421875, + 0.056060791015625, + -0.007293701171875, + -0.012481689453125, + -0.00988006591796875, + -0.004314422607421875, + 0.01788330078125, + 0.005939483642578125, + -0.006855010986328125, + 0.00307464599609375, + -0.0635986328125, + 0.0673828125, + 0.004398345947265625, + -0.0141448974609375, + -0.01318359375, + 0.015533447265625, + 0.07952880859375, + 0.0267486572265625, + 0.00969696044921875, + -0.0020503997802734375, + -0.0038051605224609375, + 0.02349853515625, + 0.0025577545166015625, + -0.0249481201171875, + 0.0223236083984375, + -0.01531982421875, + -0.006320953369140625, + 0.0640869140625, + 0.023529052734375, + 0.0230255126953125, + 0.00557708740234375, + 0.029205322265625, + -0.017242431640625, + 0.01364898681640625, + 0.005817413330078125, + 0.046142578125, + -0.043548583984375, + 0.00994873046875, + -0.047882080078125, + -0.004795074462890625, + 0.0238494873046875, + -0.0012063980102539062, + -0.0140838623046875, + -0.006195068359375, + -0.0185089111328125, + -0.0006442070007324219, + -0.0261383056640625, + 0.0029087066650390625, + 0.01422882080078125, + 0.035858154296875, + -0.032806396484375, + 0.01500701904296875, + 0.01091766357421875, + -0.017303466796875, + 0.0166015625, + 0.0181732177734375, + -0.013916015625, + 0.009429931640625, + 0.003040313720703125, + 0.01971435546875, + 0.006145477294921875, + -0.005756378173828125, + 0.058135986328125, + 0.0009236335754394531, + -0.005275726318359375, + -0.034759521484375, + -0.022308349609375, + 0.0191650390625, + 0.001628875732421875, + -0.015716552734375, + 0.023468017578125, + -0.0273284912109375, + -0.001552581787109375, + -0.013458251953125, + -0.01551055908203125, + 0.035675048828125, + -0.006793975830078125, + 0.03619384765625, + -0.013916015625, + -0.009613037109375, + 0.035980224609375, + 0.00714874267578125, + 0.005367279052734375, + -0.07659912109375, + -0.041656494140625, + 0.0323486328125, + 0.00923919677734375, + 0.022430419921875, + 0.0010395050048828125, + -0.02783203125, + 0.01495361328125, + -0.0263824462890625, + -0.01824951171875, + -0.0026874542236328125, + 0.0117950439453125, + 0.0224456787109375, + -0.018951416015625, + 0.0019779205322265625, + 0.055145263671875, + -0.0107421875, + 0.0216217041015625, + 0.01361083984375, + -0.04754638671875, + -0.0231170654296875, + -0.00344085693359375, + 0.0433349609375, + 0.0287628173828125, + 0.0438232421875, + 0.00794219970703125, + -0.0042266845703125, + 0.005889892578125, + -0.00487518310546875, + -0.0221405029296875, + -0.03192138671875, + 0.0322265625, + 0.00891876220703125, + 0.03936767578125, + 0.007656097412109375, + 0.01018524169921875, + 0.0110321044921875, + 0.048583984375, + -0.01385498046875, + 0.04608154296875, + -0.023345947265625, + -0.0264434814453125, + 0.01552581787109375, + 0.05108642578125, + -0.026153564453125, + -0.002643585205078125, + 0.0262603759765625, + 0.00043892860412597656, + 0.002208709716796875, + -0.0023670196533203125, + -0.0033054351806640625, + 0.0416259765625, + 0.00308990478515625, + 0.0562744140625, + 0.033538818359375, + -0.053131103515625, + 0.004322052001953125, + 0.0174407958984375, + 0.062286376953125, + -0.028839111328125, + 0.0006632804870605469, + 0.03924560546875, + 0.011138916015625, + 0.002841949462890625, + -0.0038909912109375, + 0.0272674560546875, + -0.007427215576171875, + -0.0015783309936523438, + 0.050079345703125, + -0.0144195556640625, + -0.055145263671875, + 0.004947662353515625, + 0.00231170654296875, + -0.021759033203125, + -0.05413818359375, + -0.04248046875, + -0.040374755859375, + 0.038970947265625, + -0.006610870361328125, + 0.035797119140625, + -0.01306915283203125, + 0.0306243896484375, + -0.049652099609375, + -0.0232391357421875, + 0.0269775390625, + 0.00566864013671875, + 0.0231781005859375, + -0.01318359375, + -0.035369873046875, + 0.042388916015625, + 0.058349609375, + -0.0290679931640625, + -0.01021575927734375, + 0.005229949951171875, + -0.040374755859375, + -0.045623779296875, + -0.039154052734375, + 0.0164031982421875, + 0.047698974609375, + -0.039794921875, + -0.0149383544921875, + 0.061737060546875, + 0.03692626953125, + -0.00058746337890625, + 0.01445770263671875, + -0.016876220703125, + 0.0028228759765625, + 0.037384033203125, + -0.019317626953125, + 0.0175323486328125, + 0.0184173583984375, + -0.032257080078125, + 0.05633544921875, + 0.03033447265625, + -0.0094146728515625, + -0.045196533203125, + 0.0074310302734375, + 0.047088623046875, + 0.0162506103515625, + -0.022613525390625, + -0.0038623809814453125, + -0.05474853515625, + -0.00865936279296875, + -0.0222015380859375, + -0.0132293701171875, + -0.0308685302734375, + 0.0259246826171875, + -0.0088958740234375, + -0.0440673828125, + 0.039093017578125, + -0.0452880859375, + -0.056488037109375, + -0.021240234375, + -0.04376220703125, + 0.003742218017578125, + 0.005710601806640625, + 0.0106964111328125, + 0.06005859375, + -0.010101318359375, + 0.044769287109375, + -0.0096282958984375, + 0.05841064453125, + -0.0225677490234375, + -0.06829833984375, + 0.006496429443359375, + -0.0288238525390625, + 0.0200653076171875, + 0.00909423828125, + -0.0151214599609375, + 0.007610321044921875, + 0.01544952392578125, + -0.0268402099609375, + 0.0175018310546875, + -0.0214385986328125, + -0.0272979736328125, + 0.00273895263671875, + 0.0552978515625, + -0.044036865234375, + 0.0164031982421875, + 0.054046630859375, + 0.001293182373046875, + 0.043487548828125, + 0.0289764404296875, + 0.00934600830078125, + -0.018951416015625, + 0.046783447265625, + -0.012664794921875, + 0.0433349609375, + 0.00730133056640625, + 0.0239715576171875, + -0.0269775390625, + 0.0118865966796875, + -0.07781982421875, + 0.040252685546875, + -0.0161895751953125, + -0.035797119140625, + -0.042083740234375, + 0.0032138824462890625, + -0.0294952392578125, + -0.0014066696166992188, + -0.050140380859375, + 0.043304443359375, + -0.039520263671875, + 0.028900146484375, + 0.041595458984375, + 0.0621337890625, + 0.020477294921875, + -0.056365966796875, + 0.03155517578125, + 0.0011234283447265625, + -0.01244354248046875, + -0.011749267578125, + 0.0233306884765625, + 0.038177490234375, + -0.04364013671875, + -0.01099395751953125, + -0.07708740234375, + 0.030029296875, + -0.0209197998046875, + 0.034332275390625, + 0.0048675537109375, + 0.01065826416015625, + 0.00626373291015625, + 0.035186767578125, + 0.0712890625, + 0.003147125244140625, + -0.0175933837890625, + -0.03662109375, + 0.0096282958984375, + 0.034942626953125, + -0.0138397216796875, + -0.055755615234375, + 0.0197601318359375, + 0.01378631591796875, + 0.036224365234375, + 0.02960205078125, + -0.004787445068359375, + -0.007419586181640625, + 0.0301055908203125, + 0.006622314453125, + 0.00543975830078125, + -0.04498291015625, + -0.07183837890625, + -0.0274200439453125, + -0.0289154052734375, + 0.0168914794921875, + -0.0271453857421875, + 0.01678466796875, + 0.014678955078125, + 0.0408935546875, + 0.04473876953125, + 0.007160186767578125, + -0.00865936279296875, + -0.05511474609375, + -0.0004930496215820312, + -0.046661376953125, + 0.02484130859375, + 0.037139892578125, + -0.04925537109375, + 0.0041961669921875, + -0.0880126953125, + 0.0521240234375, + 0.0391845703125, + -0.0254058837890625, + 0.025543212890625, + 0.0063018798828125, + -0.0228271484375, + -0.02459716796875, + -0.0041961669921875, + -0.024383544921875, + -0.02935791015625, + 0.037750244140625, + -0.0921630859375, + -0.0236968994140625, + -0.0024261474609375, + -0.034210205078125, + 0.005367279052734375, + 0.0009765625, + 0.03192138671875, + 0.025634765625, + 0.0240631103515625, + -0.00328826904296875, + 0.01264190673828125, + 0.030517578125, + 0.0225372314453125, + 0.01378631591796875, + 0.051971435546875, + 0.01006317138671875, + 0.0128936767578125, + 0.03607177734375, + 0.0390625, + -0.021484375, + 0.00800323486328125, + 0.0258331298828125, + 0.0277099609375, + 0.03564453125, + -0.0202789306640625, + 0.01531219482421875, + -0.0152587890625, + 0.00983428955078125, + -0.0051422119140625, + -0.051055908203125, + -0.010101318359375, + 0.00893402099609375, + -0.040252685546875, + -0.05133056640625, + -0.05291748046875, + 0.0220184326171875, + 0.029296875, + 0.0041046142578125, + 0.032379150390625, + -0.037261962890625, + -0.0113677978515625, + -0.062347412109375, + -0.01439666748046875, + -0.0291290283203125, + -0.0126495361328125, + -0.054229736328125, + -0.00743865966796875, + 0.0105438232421875, + 0.007312774658203125, + -0.016448974609375, + -0.0113372802734375, + -0.041229248046875, + -0.006427764892578125, + 0.0282135009765625, + -0.038909912109375, + -0.0243377685546875, + -0.0161895751953125, + -0.0231781005859375, + 0.001476287841796875, + -0.0256805419921875, + 0.030242919921875, + -0.0211639404296875, + 0.0236968994140625, + 0.01119232177734375, + 0.0018024444580078125, + 0.0289764404296875, + 0.028411865234375, + -0.046783447265625, + -0.0002586841583251953, + 0.026611328125, + -0.037200927734375, + 0.00283050537109375, + 0.00838470458984375, + 0.03741455078125, + 0.032928466796875, + -0.00173187255859375, + -0.0199432373046875, + -0.0278778076171875, + -0.0684814453125, + 0.00913238525390625, + -0.03924560546875, + -0.048797607421875, + -0.041595458984375, + -0.0273284912109375, + -0.0194549560546875, + 0.01515960693359375, + -0.030364990234375, + -0.0034732818603515625, + -0.0144500732421875, + 0.0029468536376953125, + 0.026458740234375, + -0.0204925537109375, + -0.04376220703125, + -0.01318359375, + -0.0034465789794921875, + 0.035614013671875, + 0.026519775390625, + -0.031463623046875, + -0.00624847412109375, + 0.0032501220703125, + -0.0084991455078125, + -0.0202178955078125, + 0.01122283935546875, + -0.00534820556640625, + -0.00848388671875, + 0.01519775390625, + 0.006572723388671875, + -0.01027679443359375, + 0.04296875, + -0.01453399658203125, + 0.007167816162109375, + -0.032135009765625, + -0.0160369873046875, + -0.052978515625, + -0.00881195068359375, + -0.052154541015625, + 0.010955810546875, + -0.01491546630859375, + -0.033233642578125, + -0.027557373046875, + 0.00043892860412597656, + 0.04730224609375, + 0.051422119140625, + -0.016571044921875, + -0.044525146484375, + -0.0333251953125, + -0.045989990234375, + -0.003017425537109375, + -0.0039520263671875, + 0.0023212432861328125, + 0.00994873046875, + -0.040130615234375, + 0.051116943359375, + 0.0125732421875, + -0.0266876220703125, + 0.004421234130859375, + 0.06134033203125, + -0.00547027587890625, + 0.00766754150390625, + -0.07373046875, + 0.003940582275390625, + 0.032012939453125, + -0.0016727447509765625, + -0.043914794921875, + -0.0321044921875, + 0.004913330078125, + -0.024444580078125, + -0.0177154541015625, + -0.010955810546875, + -0.059051513671875, + 0.0171051025390625, + 0.043426513671875, + 0.00754547119140625, + 0.0634765625, + 0.03753662109375, + -0.0050201416015625, + -0.056060791015625, + 0.04998779296875, + 0.046478271484375, + 0.0140533447265625, + 0.042236328125, + -0.00408935546875, + -0.06103515625, + -0.007503509521484375, + -0.0390625, + -0.005077362060546875, + 0.0172271728515625, + 0.041778564453125, + 0.0175628662109375, + -0.013763427734375, + 0.052154541015625, + 0.05096435546875, + -0.041595458984375, + -0.03985595703125, + -0.0322265625, + 0.0138397216796875, + 0.003604888916015625, + -0.01244354248046875, + 0.00519561767578125, + -0.00344085693359375, + 0.004962921142578125, + 0.033905029296875, + 0.0231781005859375, + -0.01432037353515625, + 0.01763916015625, + -0.032073974609375, + 0.0306243896484375, + -0.047393798828125, + 0.009124755859375, + 0.006534576416015625, + -0.06036376953125, + 0.055511474609375, + -0.023223876953125, + 0.01806640625, + -0.027496337890625, + 0.016937255859375, + 0.02020263671875, + -0.0216217041015625, + 0.010589599609375, + 0.04296875, + 0.013763427734375, + 0.016998291015625, + 0.0238037109375, + 0.0183868408203125, + 0.0265350341796875, + -0.0494384765625, + -0.006572723388671875, + -0.030975341796875, + 0.00220489501953125, + -0.0153961181640625, + -0.00907135009765625, + -0.0175628662109375, + -0.002471923828125, + 0.037353515625, + 0.053131103515625, + -0.024139404296875, + 0.0004608631134033203, + -0.032135009765625, + -0.07452392578125, + -0.0621337890625, + 0.005794525146484375, + -0.020721435546875, + -0.0404052734375, + 0.039276123046875, + -0.01512908935546875, + -0.0162353515625, + -0.019134521484375, + 0.0122222900390625, + 0.0099639892578125, + 0.0093841552734375, + -0.045196533203125, + 0.055267333984375, + -0.048431396484375, + -0.052978515625, + -0.0182647705078125, + 0.03399658203125, + -0.0295562744140625, + 0.01239013671875, + -0.02276611328125, + 0.0007886886596679688, + -0.0469970703125, + 0.06591796875, + -0.0081329345703125, + 0.0038356781005859375, + -0.029937744140625, + -0.03875732421875, + -0.0027446746826171875, + 0.01214599609375, + 0.016693115234375, + -0.006130218505859375, + 0.0550537109375, + 0.0037059783935546875, + -0.0098419189453125, + -0.0009174346923828125, + -0.00543975830078125, + -0.00853729248046875, + -0.0019588470458984375, + 0.0157318115234375, + -0.0235748291015625, + -0.01067352294921875, + -0.057586669921875, + -0.005489349365234375, + -0.0250396728515625, + 0.0177459716796875, + -0.036834716796875, + 0.01010894775390625, + -0.046051025390625, + 0.02447509765625, + 0.0250091552734375, + 0.036376953125, + 0.0482177734375, + -0.006557464599609375, + 0.0006661415100097656, + 0.039794921875, + 0.0218658447265625, + 0.02783203125, + -0.01424407958984375, + -0.006687164306640625, + -0.01116180419921875, + 0.022003173828125, + 0.01508331298828125, + 0.04046630859375, + -0.0249176025390625, + 0.046783447265625, + -0.032135009765625, + -0.0565185546875, + -0.0406494140625, + 0.0010471343994140625, + -0.004970550537109375, + 0.03912353515625, + 0.044677734375, + -0.0322265625, + -0.005466461181640625, + -0.0177154541015625, + -0.0343017578125, + 0.0233917236328125, + -0.0283660888671875, + 0.003353118896484375, + 0.007205963134765625, + -0.002902984619140625, + 0.0174713134765625, + -0.02508544921875, + -0.049102783203125, + 0.00870513916015625, + -0.021240234375, + -0.0304107666015625, + -0.046112060546875, + 0.006832122802734375, + 0.040252685546875, + 0.0244140625, + -0.0260009765625, + 0.0204925537109375, + 0.01305389404296875, + 0.0183868408203125, + 0.004917144775390625, + -0.06298828125, + -0.00020122528076171875, + -0.04583740234375, + 0.01218414306640625, + -0.0316162109375, + -0.0008444786071777344, + 0.06903076171875, + 0.00920867919921875, + -0.0006356239318847656, + 0.01439666748046875, + 0.0228118896484375, + -0.0230255126953125, + -0.001232147216796875, + 0.0260772705078125, + 0.044342041015625, + -0.040863037109375, + 0.0046234130859375, + -0.0004677772521972656, + 0.00399017333984375, + 0.005584716796875, + 0.06134033203125, + -0.00959014892578125, + 0.03985595703125, + 0.040130615234375, + -0.0007066726684570312, + 0.02435302734375, + -0.01268768310546875, + -0.059356689453125, + -0.03997802734375, + 0.020355224609375, + 0.038787841796875, + 0.0007376670837402344, + -0.003978729248046875, + 0.002613067626953125, + 0.015533447265625, + -0.00855255126953125, + 0.044525146484375, + 0.0190887451171875, + 0.00556182861328125, + -0.02294921875, + 0.0037250518798828125, + -0.0091552734375, + -0.00839996337890625, + 0.033935546875, + -0.00464630126953125, + -0.0188140869140625, + -0.0259246826171875, + -0.03778076171875, + -0.01251983642578125, + -0.04986572265625, + -0.003742218017578125, + 0.01345062255859375, + 0.01047515869140625, + 0.009429931640625, + -0.0016651153564453125, + -0.016357421875, + 0.06134033203125, + 0.032501220703125, + 0.01666259765625, + 0.00809478759765625, + 0.003185272216796875, + 0.0292510986328125, + 0.042816162109375, + 0.0323486328125, + -0.00855255126953125, + -0.042022705078125, + -0.00937652587890625, + 0.0304718017578125, + -0.0455322265625, + -0.018035888671875, + 0.0179290771484375, + -0.011474609375, + 0.04498291015625, + 0.04486083984375, + -0.0221405029296875, + 0.0200653076171875, + -0.07171630859375, + 0.0217742919921875, + -0.032073974609375, + -0.0026874542236328125, + -0.0194854736328125, + -0.034698486328125, + -0.0017251968383789062, + -0.032073974609375, + 0.0181732177734375, + 0.040863037109375, + 0.0178985595703125, + 0.02886962890625, + -0.0292816162109375, + 0.03448486328125, + 0.00787353515625, + 0.02154541015625, + 0.0653076171875, + 0.01049041748046875, + -0.06597900390625, + 0.03143310546875, + -0.03228759765625, + -0.00637054443359375, + 0.0239410400390625, + -0.03369140625, + 0.023193359375, + -0.01158905029296875, + -0.04644775390625, + 0.01280975341796875, + 0.0382080078125, + 0.0002512931823730469, + -0.0440673828125, + 0.00988006591796875, + -0.006145477294921875, + -0.0296478271484375, + 0.048431396484375, + -0.01551055908203125, + 0.0196380615234375, + -0.00615692138671875, + 0.0144500732421875, + -0.0185699462890625, + 0.00763702392578125, + 0.0097503662109375, + -0.037017822265625, + 0.0013332366943359375, + -0.030914306640625, + -0.060516357421875, + -0.0116729736328125, + -0.0361328125, + 0.014129638671875, + 0.0267486572265625, + -0.0182037353515625, + -0.050750732421875, + -0.01531982421875, + 0.0465087890625, + -0.0296783447265625, + 0.016998291015625, + -0.00252532958984375, + 0.0134124755859375, + 0.022125244140625, + 0.025726318359375, + -0.012481689453125, + 0.061798095703125, + 0.0129241943359375, + -0.005947113037109375, + 0.01849365234375, + -0.051177978515625, + 0.055450439453125, + -0.0019464492797851562, + 0.0128936767578125, + -0.03411865234375, + 0.032989501953125, + -0.016021728515625, + -0.01294708251953125, + 0.037811279296875, + 0.056671142578125, + -0.000545501708984375, + -0.0296478271484375, + -0.0638427734375, + -0.06390380859375, + -0.0244140625, + 0.053436279296875, + -0.0296783447265625, + 0.08489990234375, + -0.007610321044921875, + 0.01091766357421875, + 0.0369873046875, + -0.0587158203125, + 0.1727294921875, + 0.0172119140625, + 0.05718994140625, + -0.00472259521484375, + -0.01422882080078125, + 0.00644683837890625, + -0.0230712890625, + 0.038665771484375, + -0.00897216796875, + -0.0172882080078125, + 0.048065185546875, + 0.0261077880859375, + 0.0165863037109375, + 0.045623779296875, + 0.01290130615234375, + 0.0220794677734375, + -0.0174713134765625, + -0.0084075927734375, + 0.00569915771484375, + -0.01153564453125, + -0.0225067138671875, + 0.015838623046875, + 0.032867431640625, + 0.0245208740234375, + -0.00766754150390625, + -0.006465911865234375, + 0.038055419921875, + -0.03900146484375, + -0.039764404296875, + -0.027496337890625, + 0.056915283203125, + -0.01226043701171875, + 0.0323486328125, + -0.006572723388671875, + -0.0374755859375, + -0.0006594657897949219, + -0.04071044921875, + -0.035797119140625, + -0.025543212890625, + 0.027679443359375, + -0.053985595703125, + -0.0218963623046875, + 6.031990051269531e-05, + -0.00080108642578125, + -0.01027679443359375, + 0.02191162109375, + -0.051116943359375, + 0.019073486328125, + -0.035125732421875, + 0.00820159912109375, + 0.06439208984375, + -0.059967041015625, + 0.030487060546875, + -0.033905029296875, + 0.011474609375, + 0.034423828125, + -0.01224517822265625, + 0.0301666259765625, + -0.0313720703125, + 0.0235595703125, + 0.01110076904296875, + -0.01364898681640625, + 0.007190704345703125, + -0.040191650390625, + -0.0015039443969726562, + 0.0287933349609375, + 0.093017578125, + 0.0226287841796875, + 0.00458526611328125, + -0.01953125, + -0.055145263671875, + 0.02874755859375, + -0.0242462158203125, + -0.0273284912109375, + 0.02313232421875, + 0.0120849609375, + -0.0274200439453125, + 0.00518798828125, + -0.0140838623046875, + -0.00997161865234375, + 0.0233917236328125, + 0.00920867919921875, + -0.005859375, + -0.027099609375, + 0.0267486572265625, + 0.041290283203125, + -0.029144287109375, + -0.0164794921875, + -0.049102783203125, + 0.036468505859375, + 0.04705810546875, + 0.0013570785522460938, + -0.014373779296875, + -0.049652099609375, + -0.0160369873046875 + ], + "index": 1, + "object": "embedding" + }, + { + "embedding": [ + 0.0028533935546875, + 0.02496337890625, + 0.00098419189453125, + 0.0380859375, + -0.03375244140625, + -0.00803375244140625, + -0.0254669189453125, + -0.0029392242431640625, + 0.0299072265625, + 0.043731689453125, + 0.022796630859375, + 0.00970458984375, + 0.0225677490234375, + -0.021209716796875, + -0.0238494873046875, + -0.00841522216796875, + -0.0259246826171875, + 0.022979736328125, + -0.044219970703125, + -0.0238494873046875, + -0.0286712646484375, + 0.02337646484375, + -0.023284912109375, + -0.0244903564453125, + -0.0252838134765625, + 0.0313720703125, + -0.0010843276977539062, + 0.01325225830078125, + 0.03387451171875, + 0.046142578125, + -0.010101318359375, + -0.0043182373046875, + -0.01149749755859375, + -0.0604248046875, + 0.01678466796875, + -0.042816162109375, + 0.0616455078125, + -0.034698486328125, + 0.00019788742065429688, + -0.036712646484375, + -0.007843017578125, + 0.016937255859375, + 0.029632568359375, + -0.0049285888671875, + -0.048858642578125, + -0.055816650390625, + -0.00350189208984375, + -0.0274505615234375, + 0.010040283203125, + 0.0028533935546875, + 0.00870513916015625, + 0.0067596435546875, + 0.0012569427490234375, + -0.006557464599609375, + 0.007381439208984375, + -0.01251220703125, + -0.0390625, + -0.00992584228515625, + -0.0498046875, + 0.06707763671875, + 0.038604736328125, + 0.00032448768615722656, + 0.024383544921875, + -0.06683349609375, + 0.002410888671875, + -0.024200439453125, + -0.0006031990051269531, + -0.00710296630859375, + 0.0101470947265625, + -0.041961669921875, + -0.0186920166015625, + 0.0282440185546875, + -0.008392333984375, + -0.01416778564453125, + -0.0110015869140625, + 0.01509857177734375, + -0.0017576217651367188, + 0.0268707275390625, + -0.0183258056640625, + 0.0440673828125, + 0.026214599609375, + 0.016387939453125, + -0.005741119384765625, + -0.0196533203125, + -0.06500244140625, + -0.007236480712890625, + 0.0125885009765625, + 0.0400390625, + 0.0238800048828125, + -0.0263214111328125, + 0.02227783203125, + 0.04522705078125, + -0.05224609375, + 0.0027523040771484375, + -0.0146026611328125, + 0.0017995834350585938, + 0.01849365234375, + 0.005207061767578125, + 0.0394287109375, + 0.01087188720703125, + 0.040008544921875, + 0.03131103515625, + 0.00656890869140625, + 0.05877685546875, + -0.07757568359375, + 0.03546142578125, + 0.008056640625, + -0.0090789794921875, + -0.045501708984375, + -0.031951904296875, + 0.0126495361328125, + -0.00858306884765625, + 0.024505615234375, + 0.01235198974609375, + -0.049591064453125, + 0.03826904296875, + -0.0131378173828125, + 0.03631591796875, + -0.029693603515625, + -0.002655029296875, + 0.0129241943359375, + 0.0269927978515625, + -0.0104217529296875, + -0.0224151611328125, + -0.01285552978515625, + 0.0112152099609375, + -0.017425537109375, + 0.0191497802734375, + -0.030609130859375, + -0.0268096923828125, + 0.017669677734375, + 0.01079559326171875, + 0.0235137939453125, + 0.047515869140625, + -0.00949859619140625, + 0.002231597900390625, + 0.037811279296875, + 0.0284271240234375, + 0.00551605224609375, + -0.02197265625, + -0.005588531494140625, + 0.0684814453125, + -0.002193450927734375, + 0.07635498046875, + 0.01107025146484375, + 0.01050567626953125, + -0.002208709716796875, + -0.007274627685546875, + -0.0303497314453125, + 0.0178070068359375, + -0.04315185546875, + -0.0292205810546875, + 0.00946044921875, + 0.004009246826171875, + -0.041259765625, + -0.00887298583984375, + -0.014129638671875, + -0.01032257080078125, + -0.02191162109375, + 0.006694793701171875, + -0.047821044921875, + 0.03973388671875, + -0.013885498046875, + 0.0097198486328125, + -0.0279541015625, + 0.005039215087890625, + -0.033660888671875, + -0.01033782958984375, + -0.00981903076171875, + -0.0179901123046875, + 0.034454345703125, + 0.0288238525390625, + -0.0196685791015625, + -0.0012006759643554688, + 0.02606201171875, + 0.0310211181640625, + 0.05682373046875, + -0.0088958740234375, + 0.01050567626953125, + 0.031707763671875, + -0.033416748046875, + 0.000152587890625, + 0.00464630126953125, + 0.0697021484375, + -0.0028858184814453125, + 0.026580810546875, + -0.00957489013671875, + -0.020294189453125, + -0.0098114013671875, + -0.0210113525390625, + -0.01849365234375, + 0.005054473876953125, + -0.011627197265625, + 0.041717529296875, + 0.01108551025390625, + 0.02947998046875, + -0.0241546630859375, + 0.0180816650390625, + -0.0029144287109375, + -0.103271484375, + -0.038787841796875, + 0.037109375, + -0.011444091796875, + 0.0167388916015625, + -0.0110015869140625, + -0.04638671875, + 0.013824462890625, + 0.032257080078125, + -0.012481689453125, + -0.0028228759765625, + 0.0280914306640625, + 0.038116455078125, + -0.0037441253662109375, + 0.01323699951171875, + 0.0157012939453125, + -0.00931549072265625, + -0.01065826416015625, + 0.033111572265625, + 0.007282257080078125, + -0.00421142578125, + -0.006046295166015625, + -0.006420135498046875, + 0.03985595703125, + 0.0202178955078125, + 0.0479736328125, + -0.028717041015625, + -0.01039886474609375, + 0.061492919921875, + -0.00939178466796875, + -0.013092041015625, + -0.0003349781036376953, + 0.061920166015625, + -0.0008783340454101562, + 0.0653076171875, + 0.034881591796875, + 0.004192352294921875, + 0.04278564453125, + 0.01557159423828125, + 0.01171112060546875, + 0.0247344970703125, + 0.03118896484375, + 0.0504150390625, + 0.06793212890625, + 0.0278472900390625, + -0.01226806640625, + 0.0115814208984375, + -0.0194549560546875, + -0.01053619384765625, + -0.0079498291015625, + 0.0195770263671875, + 0.039093017578125, + 0.0311737060546875, + 0.054351806640625, + 0.025787353515625, + -0.01593017578125, + -0.006805419921875, + 0.0295867919921875, + 0.053924560546875, + -0.005535125732421875, + -0.02777099609375, + -0.0176544189453125, + 0.0003268718719482422, + -0.0194854736328125, + -0.040924072265625, + 0.005893707275390625, + -0.00978851318359375, + -0.0055389404296875, + -0.0126495361328125, + 0.01079559326171875, + -0.042572021484375, + -0.049652099609375, + -0.027923583984375, + -0.08026123046875, + -0.0325927734375, + 0.0057830810546875, + -0.005401611328125, + 0.0245361328125, + -0.058197021484375, + 0.0106353759765625, + -0.05560302734375, + -0.0450439453125, + -0.018524169921875, + -0.0423583984375, + 0.0391845703125, + -0.012542724609375, + 0.03759765625, + -0.04400634765625, + 0.005687713623046875, + 0.0003685951232910156, + 0.023712158203125, + -0.020416259765625, + -0.027496337890625, + -0.0169219970703125, + -0.037567138671875, + 0.035308837890625, + -0.03118896484375, + 0.00336456298828125, + 0.0162811279296875, + 0.015838623046875, + -0.049346923828125, + 0.018707275390625, + 0.0260009765625, + -0.036529541015625, + 0.0028324127197265625, + -0.039093017578125, + 0.019256591796875, + 0.043731689453125, + -0.015045166015625, + 0.0043792724609375, + 0.035858154296875, + -0.01148223876953125, + 0.0191802978515625, + 0.00318145751953125, + -0.0009226799011230469, + -0.03143310546875, + 0.0611572265625, + 0.0283966064453125, + -0.004512786865234375, + 0.0258026123046875, + 0.0186920166015625, + -0.01161956787109375, + -0.044952392578125, + -0.017303466796875, + -0.0318603515625, + 6.258487701416016e-06, + 0.020233154296875, + 0.011444091796875, + -0.07904052734375, + 0.0169525146484375, + -0.0203094482421875, + -0.04840087890625, + -0.005283355712890625, + -0.0233001708984375, + 0.05218505859375, + 0.00774383544921875, + -0.0299072265625, + -0.0176544189453125, + 0.0186920166015625, + -0.0042724609375, + 0.00876617431640625, + 0.055389404296875, + -0.030120849609375, + -0.037628173828125, + 0.069091796875, + 0.0246124267578125, + 0.016082763671875, + -0.032135009765625, + -0.0210113525390625, + -0.00750732421875, + -0.02972412109375, + 0.0028018951416015625, + 0.020538330078125, + -0.0244140625, + 0.029083251953125, + 0.01149749755859375, + 0.016693115234375, + -0.0250244140625, + -0.0147552490234375, + 0.031890869140625, + -0.017242431640625, + -0.00396728515625, + 0.0094451904296875, + 0.0266571044921875, + 0.0151824951171875, + -0.03253173828125, + -0.07122802734375, + -0.03448486328125, + 0.004581451416015625, + 0.01221466064453125, + -0.076171875, + 0.03271484375, + -0.04571533203125, + 0.01430511474609375, + -0.01267242431640625, + -0.002696990966796875, + -0.037750244140625, + 0.036224365234375, + -0.0265045166015625, + 0.07373046875, + -0.0927734375, + -0.0274810791015625, + -0.0011959075927734375, + -0.016265869140625, + 0.054931640625, + 0.0022792816162109375, + 0.01229095458984375, + 0.0133514404296875, + -0.01800537109375, + -0.038818359375, + -0.0260467529296875, + 0.0190277099609375, + 0.0006594657897949219, + 0.01500701904296875, + 0.00787353515625, + -0.0662841796875, + -0.05706787109375, + 0.034393310546875, + 0.025909423828125, + 0.0283966064453125, + 0.00506591796875, + 0.00981903076171875, + -0.0289459228515625, + 0.0173492431640625, + 0.031982421875, + -0.07647705078125, + 0.012237548828125, + -0.023712158203125, + 0.0248870849609375, + 0.001804351806640625, + -0.0014505386352539062, + -0.05419921875, + 0.018707275390625, + -0.04119873046875, + -0.014678955078125, + 0.04071044921875, + 0.0184326171875, + 0.0024318695068359375, + 0.05633544921875, + -0.007747650146484375, + -0.01032257080078125, + -0.045928955078125, + -0.034515380859375, + -0.0265655517578125, + 0.0301971435546875, + 0.03021240234375, + -0.039825439453125, + 0.007434844970703125, + -0.034210205078125, + 0.050567626953125, + 0.0401611328125, + -0.0171051025390625, + -0.03240966796875, + -0.017822265625, + -0.0291748046875, + -0.05645751953125, + -0.004207611083984375, + 0.0504150390625, + -0.0006399154663085938, + 0.00363922119140625, + -0.03228759765625, + 0.022003173828125, + -0.00894927978515625, + -0.0189666748046875, + -0.026031494140625, + 0.01210784912109375, + 0.006107330322265625, + 0.0474853515625, + 0.029541015625, + -0.025634765625, + -0.0308837890625, + 0.0020122528076171875, + -0.08343505859375, + 0.039703369140625, + -0.0362548828125, + -0.002788543701171875, + -0.00844573974609375, + 0.0010480880737304688, + 0.004741668701171875, + 0.03240966796875, + -0.037811279296875, + -0.030364990234375, + 0.002361297607421875, + 0.02630615234375, + -0.035430908203125, + -0.024078369140625, + 0.048919677734375, + -0.00832366943359375, + -0.01076507568359375, + 0.034698486328125, + -0.01922607421875, + -1.901388168334961e-05, + -0.0005183219909667969, + -0.0005555152893066406, + -4.571676254272461e-05, + 0.0438232421875, + -0.03289794921875, + 0.00780487060546875, + -0.00637054443359375, + -0.01263427734375, + -0.0252227783203125, + -0.030120849609375, + 0.02496337890625, + -0.01317596435546875, + -0.028411865234375, + -0.0689697265625, + -0.02032470703125, + -0.024322509765625, + -0.0142974853515625, + 0.0015325546264648438, + 0.031585693359375, + 0.042694091796875, + 0.0172882080078125, + -0.011993408203125, + -0.018463134765625, + -0.0254058837890625, + -2.6404857635498047e-05, + -0.03558349609375, + -0.0082855224609375, + -0.0108795166015625, + 0.040283203125, + -0.01096343994140625, + -0.0256195068359375, + -0.028472900390625, + -0.00384521484375, + -0.0166168212890625, + 0.00010323524475097656, + -0.0338134765625, + 0.01320648193359375, + -0.0277557373046875, + 0.003246307373046875, + -0.00649261474609375, + 0.04364013671875, + -0.0145416259765625, + 0.0309295654296875, + 0.034149169921875, + 0.02587890625, + -0.01043701171875, + 0.0008220672607421875, + -0.051055908203125, + 0.04144287109375, + -0.005359649658203125, + -0.040130615234375, + -0.03564453125, + 0.00826263427734375, + -0.01416015625, + 0.0273895263671875, + 0.0391845703125, + -0.042449951171875, + -0.0247650146484375, + -0.035430908203125, + -0.01422119140625, + -0.00484466552734375, + 0.006114959716796875, + -0.062744140625, + -0.0174407958984375, + 0.0266876220703125, + 0.0295867919921875, + 0.00543975830078125, + 0.016143798828125, + -0.03472900390625, + -0.0523681640625, + 0.0192413330078125, + 0.01383209228515625, + 0.005420684814453125, + -0.0029506683349609375, + 0.01194000244140625, + -0.0204315185546875, + 0.061553955078125, + 0.003551483154296875, + 0.00183868408203125, + 0.0172882080078125, + 0.0061492919921875, + 0.01035308837890625, + 0.0268096923828125, + -0.006237030029296875, + -0.071533203125, + 0.010711669921875, + -0.019683837890625, + 0.004405975341796875, + 0.01056671142578125, + -0.061553955078125, + 0.0138092041015625, + -0.029205322265625, + -0.004718780517578125, + -0.0018320083618164062, + -0.0214996337890625, + -0.04718017578125, + -0.0274200439453125, + 0.03863525390625, + -0.0156097412109375, + -0.0027904510498046875, + -0.015777587890625, + 0.03887939453125, + 0.06292724609375, + 0.0236358642578125, + -0.049285888671875, + -0.01983642578125, + 0.007541656494140625, + -0.06658935546875, + 0.03515625, + 0.0182342529296875, + -0.0258331298828125, + -0.037109375, + -0.0140533447265625, + 0.061370849609375, + -0.01110076904296875, + 0.042724609375, + 0.0775146484375, + 0.017242431640625, + -0.035430908203125, + -0.0163421630859375, + 0.0343017578125, + 0.01534271240234375, + 0.009613037109375, + -0.0031414031982421875, + -0.050567626953125, + -0.03558349609375, + -0.01505279541015625, + -0.036590576171875, + -0.033416748046875, + -0.0310516357421875, + -0.0131683349609375, + 0.03875732421875, + -0.00307464599609375, + 0.043731689453125, + -0.03802490234375, + -0.043548583984375, + -0.056121826171875, + 0.0299835205078125, + 0.056243896484375, + 0.006195068359375, + 0.038726806640625, + 0.01971435546875, + -0.0289306640625, + 0.0075531005859375, + -0.006839752197265625, + -0.0185394287109375, + -0.021484375, + 0.048614501953125, + -0.0007834434509277344, + -0.027984619140625, + 0.054656982421875, + 0.04595947265625, + -0.08251953125, + -0.027984619140625, + -0.01293182373046875, + 0.006610870361328125, + -0.007511138916015625, + -0.0283660888671875, + -0.026153564453125, + -0.0338134765625, + -0.0063323974609375, + -0.006587982177734375, + 0.000370025634765625, + -0.01436614990234375, + 0.016937255859375, + -0.03985595703125, + -0.021331787109375, + -0.022186279296875, + -0.0160369873046875, + 0.036956787109375, + -0.04180908203125, + 0.0271759033203125, + -0.03680419921875, + 0.00010770559310913086, + -0.007709503173828125, + -0.00740814208984375, + 0.0156402587890625, + -0.006561279296875, + -0.01322174072265625, + 0.0223846435546875, + -0.0017213821411132812, + 0.0758056640625, + -0.02264404296875, + -0.0025196075439453125, + 0.06298828125, + -0.022064208984375, + -0.042755126953125, + -0.040496826171875, + 0.01519775390625, + 0.01458740234375, + 0.03399658203125, + -0.0606689453125, + -0.003391265869140625, + 0.05230712890625, + 0.0005717277526855469, + 0.041778564453125, + -0.006641387939453125, + -0.0792236328125, + -0.016815185546875, + -0.020477294921875, + 0.007640838623046875, + -0.0273895263671875, + 0.0014352798461914062, + 0.049530029296875, + 0.00978851318359375, + 0.0228729248046875, + -0.015228271484375, + 0.02557373046875, + -0.00959014892578125, + 0.00461578369140625, + -0.023101806640625, + 0.0157623291015625, + 0.003814697265625, + -0.0230560302734375, + -0.0189971923828125, + -0.0306549072265625, + -0.030670166015625, + 0.014373779296875, + -0.030242919921875, + -0.0098419189453125, + 5.3942203521728516e-05, + 0.036224365234375, + 0.0013380050659179688, + 0.01238250732421875, + -0.0100860595703125, + -0.02386474609375, + 0.0240478515625, + 0.0259246826171875, + -0.028350830078125, + -0.006107330322265625, + 0.01372528076171875, + -0.016693115234375, + -0.01473236083984375, + -0.022064208984375, + -0.007122039794921875, + -0.031494140625, + 0.01922607421875, + 0.04150390625, + -0.002681732177734375, + -0.012420654296875, + -0.04669189453125, + -0.042449951171875, + -0.0298614501953125, + -0.0032787322998046875, + -0.01824951171875, + -0.01308441162109375, + 0.01593017578125, + -0.004863739013671875, + -0.0017852783203125, + 0.04217529296875, + -0.00689697265625, + 0.03900146484375, + -0.0267333984375, + 0.0265655517578125, + 0.0175933837890625, + 0.007904052734375, + 0.048065185546875, + 0.0185699462890625, + 0.0011987686157226562, + 0.0271759033203125, + -0.01515960693359375, + -0.016815185546875, + -0.00913238525390625, + 0.007419586181640625, + -0.0248870849609375, + -0.0038013458251953125, + 0.041412353515625, + 0.0302734375, + -0.00223541259765625, + 0.0290985107421875, + 0.0184173583984375, + -0.01094818115234375, + 0.05517578125, + -0.01263427734375, + -0.06304931640625, + -0.01079559326171875, + -0.059173583984375, + -0.03387451171875, + -0.0166015625, + 0.01354217529296875, + -0.0171966552734375, + 0.041656494140625, + -0.061065673828125, + 6.115436553955078e-05, + 0.035186767578125, + 0.0093536376953125, + -0.01296234130859375, + 0.0036773681640625, + -0.005161285400390625, + 0.0328369140625, + 0.0058135986328125, + -0.010711669921875, + 0.01456451416015625, + 0.05029296875, + -0.05517578125, + -0.047760009765625, + -0.010040283203125, + -0.0162506103515625, + 0.0263824462890625, + 0.03448486328125, + -0.04473876953125, + 0.0030918121337890625, + -0.03662109375, + -0.01180267333984375, + 0.02117919921875, + -0.01097869873046875, + -0.040283203125, + 0.0011434555053710938, + -0.010040283203125, + 0.0229339599609375, + 0.0222015380859375, + 0.0303802490234375, + 0.01192474365234375, + -0.01971435546875, + -0.03607177734375, + 0.0202789306640625, + 0.0163116455078125, + -0.00910186767578125, + 0.0210113525390625, + -0.0048828125, + 0.0168914794921875, + -0.0006508827209472656, + 0.003749847412109375, + 0.0035152435302734375, + 0.058837890625, + 0.0007381439208984375, + 0.042449951171875, + 0.019744873046875, + 0.01123809814453125, + 0.0633544921875, + -0.0266876220703125, + -0.01116943359375, + 0.011444091796875, + -0.00478363037109375, + 0.024017333984375, + 0.014068603515625, + -0.04888916015625, + 0.0294036865234375, + 0.013946533203125, + -0.018157958984375, + 0.002025604248046875, + -0.042083740234375, + -0.005779266357421875, + -0.029205322265625, + -0.01152801513671875, + 0.056671142578125, + -0.0203857421875, + -0.00722503662109375, + -0.028778076171875, + 0.034210205078125, + 0.01528167724609375, + 0.03460693359375, + -0.063720703125, + -0.00913238525390625, + 0.0308990478515625, + 0.00931549072265625, + -0.003475189208984375, + 0.0372314453125, + -0.005645751953125, + 0.0035076141357421875, + -0.03582763671875, + 0.0175323486328125, + 0.035797119140625, + 0.0024662017822265625, + 0.006549835205078125, + -0.0253753662109375, + -0.040771484375, + 0.034912109375, + 0.0230560302734375, + -0.0153961181640625, + 0.04278564453125, + -0.0308990478515625, + 0.0107574462890625, + -0.047637939453125, + 0.044342041015625, + -0.053314208984375, + 0.0078277587890625, + 0.02587890625, + 0.007259368896484375, + -0.024017333984375, + 0.04351806640625, + 0.0088043212890625, + 0.00974273681640625, + 0.016387939453125, + 0.07025146484375, + 0.0384521484375, + 0.08349609375, + 0.040374755859375, + 0.0010919570922851562, + -0.007720947265625, + 0.0005850791931152344, + -0.031982421875, + -0.01873779296875, + -0.0055694580078125, + -0.0263824462890625, + 0.032196044921875, + 0.0005326271057128906, + -0.0243682861328125, + -0.022216796875, + 0.00919342041015625, + -0.01476287841796875, + -0.02642822265625, + -0.002208709716796875, + 0.033111572265625, + -0.0413818359375, + -0.0027637481689453125, + 0.037261962890625, + 0.0665283203125, + 0.069091796875, + -0.0264892578125, + -0.0164031982421875, + 0.037200927734375, + 0.006168365478515625, + -0.00885009765625, + 0.06927490234375, + 0.006622314453125, + -0.02978515625, + -0.038726806640625, + -0.04779052734375, + -0.00482177734375, + 0.0037670135498046875, + 0.0017404556274414062, + -0.03955078125, + 0.0244903564453125, + 0.0247650146484375, + 0.0080413818359375, + 0.0283203125, + -0.059173583984375, + -0.01015472412109375, + 0.0009374618530273438, + 0.0259246826171875, + -0.0095672607421875, + 0.057708740234375, + 0.037811279296875, + -0.002597808837890625, + 0.01207733154296875, + -0.023834228515625, + 0.0103912353515625, + 0.0178070068359375, + -0.0171661376953125, + -0.00450897216796875, + 0.002162933349609375, + -0.0215911865234375, + -0.0012865066528320312, + 0.0330810546875, + 0.033477783203125, + -0.035064697265625, + 0.0021991729736328125, + -0.09210205078125, + -0.039306640625, + -0.0170745849609375, + -0.019927978515625, + -0.032745361328125, + 0.06134033203125, + -0.02001953125, + -0.0026721954345703125, + 0.005886077880859375, + -0.0616455078125, + 0.280517578125, + -0.00572967529296875, + 6.103515625e-05, + -0.0281829833984375, + 0.01407623291015625, + 0.04193115234375, + 0.0369873046875, + -0.03472900390625, + -0.001708984375, + 0.040191650390625, + 0.0144500732421875, + 0.002353668212890625, + 0.01763916015625, + 0.004425048828125, + 0.0263214111328125, + 0.0245361328125, + -0.026031494140625, + 0.00881195068359375, + 0.052734375, + -0.0467529296875, + -0.0114593505859375, + -0.0014352798461914062, + -0.00457000732421875, + 0.029052734375, + 0.00042819976806640625, + 0.0007567405700683594, + 0.02972412109375, + -0.04779052734375, + 0.0103302001953125, + -0.01245880126953125, + 0.05010986328125, + -0.01751708984375, + 0.021514892578125, + -0.003448486328125, + -0.03509521484375, + 0.035736083984375, + 0.020721435546875, + -0.0233001708984375, + -0.02130126953125, + -0.01343536376953125, + 0.0022335052490234375, + 0.030181884765625, + 0.0615234375, + -0.01654052734375, + -0.053009033203125, + 0.041839599609375, + -0.03509521484375, + 0.055511474609375, + 0.0229034423828125, + -0.0289154052734375, + 0.035125732421875, + -0.01512908935546875, + 0.08172607421875, + 0.011749267578125, + -0.06494140625, + 0.00569915771484375, + 0.0238800048828125, + -0.021087646484375, + -0.029266357421875, + 0.0208740234375, + 0.0177154541015625, + -0.0079345703125, + 0.0253143310546875, + 0.01094818115234375, + -0.049102783203125, + 0.0128021240234375, + 0.04736328125, + 0.0009927749633789062, + -0.00463104248046875, + -0.003383636474609375, + 0.010223388671875, + 0.01253509521484375, + -0.0233612060546875, + -0.0190887451171875, + 0.02581787109375, + 0.0223846435546875, + -0.038116455078125, + 0.03155517578125, + 0.0011310577392578125, + -0.040740966796875, + -0.003936767578125, + -0.03936767578125, + 0.00121307373046875, + 0.020233154296875, + 0.027008056640625, + 0.03497314453125, + -0.0142059326171875, + -0.00968170166015625, + -0.0546875, + 0.01849365234375, + 0.01197052001953125, + 0.0102386474609375, + 0.0190277099609375, + 0.009857177734375, + -0.0213623046875 + ], + "index": 2, + "object": "embedding" + } + ], + "model": "bge-large-en-v1.5", + "object": "list", + "usage": { + "prompt_tokens": 20, + "total_tokens": 20 + }, + "id": "b276b935-8541-489d-b9f7-f4d7b2696e8f" + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/9b9e8cf39b15.json b/tests/integration/recordings/responses/9b9e8cf39b15.json new file mode 100644 index 000000000..9171738b6 --- /dev/null +++ b/tests/integration/recordings/responses/9b9e8cf39b15.json @@ -0,0 +1,1062 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/embeddings", + "headers": {}, + "body": { + "model": "databricks-bge-large-en", + "input": "Test user parameter", + "encoding_format": "base64", + "user": "test-user-123" + }, + "endpoint": "/v1/embeddings", + "model": "databricks-bge-large-en" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.038818359375, + -0.0207061767578125, + 0.00783538818359375, + 0.0081939697265625, + -0.041290283203125, + 0.0186920166015625, + 0.00027441978454589844, + 0.027862548828125, + 0.037994384765625, + 0.034454345703125, + 0.050537109375, + -0.0251007080078125, + -0.001983642578125, + -0.01161956787109375, + -0.040252685546875, + -0.01259613037109375, + 0.0064849853515625, + 0.018280029296875, + -0.01287841796875, + -0.00446319580078125, + 0.006011962890625, + 0.0250396728515625, + -0.07098388671875, + -0.0204010009765625, + -0.03741455078125, + -0.042266845703125, + 0.0081939697265625, + -0.01309967041015625, + 0.0323486328125, + 0.036865234375, + -0.038543701171875, + -0.0030841827392578125, + -0.0162200927734375, + -0.03985595703125, + 0.00453948974609375, + -0.0294342041015625, + 0.05145263671875, + -0.0531005859375, + -0.03289794921875, + -0.03399658203125, + 0.0081939697265625, + 0.00921630859375, + -0.01367950439453125, + -0.03607177734375, + -0.03997802734375, + -0.0266876220703125, + -0.056396484375, + -0.002017974853515625, + -0.0230560302734375, + -0.0205535888671875, + -0.0191192626953125, + -0.00901031494140625, + 0.03460693359375, + -0.01090240478515625, + -0.0172576904296875, + -0.03619384765625, + 0.00653076171875, + -0.00341033935546875, + -0.0390625, + 0.0634765625, + -0.0238494873046875, + 0.015960693359375, + -0.003719329833984375, + -0.046142578125, + 0.026123046875, + 0.0024566650390625, + 0.031524658203125, + -0.009185791015625, + 0.00116729736328125, + -0.029571533203125, + 0.00673675537109375, + 0.031524658203125, + -0.0112457275390625, + -0.0257110595703125, + -0.03350830078125, + 0.06622314453125, + 0.0250091552734375, + -0.00572967529296875, + -0.0058746337890625, + 0.0731201171875, + -0.00891876220703125, + 0.0177154541015625, + 0.0096893310546875, + 0.0139923095703125, + -0.07232666015625, + -0.0140228271484375, + 0.025238037109375, + 0.0265655517578125, + 0.0264892578125, + -0.00270843505859375, + -0.006641387939453125, + 0.03668212890625, + 0.00897979736328125, + -0.011505126953125, + 0.00983428955078125, + 0.0172271728515625, + 0.00867462158203125, + 0.00699615478515625, + 0.004863739013671875, + -0.0238494873046875, + 0.050201416015625, + 0.0484619140625, + 0.0288848876953125, + 0.041229248046875, + -0.0111083984375, + 0.0919189453125, + 0.007373809814453125, + 0.0178375244140625, + -0.042877197265625, + -0.0292816162109375, + -0.00487518310546875, + 0.005069732666015625, + 0.0262603759765625, + 0.021881103515625, + -0.055145263671875, + 0.005138397216796875, + 0.01123046875, + 0.006084442138671875, + -0.035675048828125, + -0.0247650146484375, + 0.052459716796875, + -0.0225372314453125, + 0.003650665283203125, + -0.028076171875, + 0.0042724609375, + -0.0269622802734375, + -0.0753173828125, + 0.038909912109375, + -0.00821685791015625, + -0.06915283203125, + -0.00516510009765625, + -0.0139923095703125, + 0.057342529296875, + 0.03759765625, + 0.00557708740234375, + 0.067138671875, + 0.01593017578125, + 0.0084075927734375, + 0.032135009765625, + -0.03582763671875, + 0.033416748046875, + 0.03668212890625, + -0.01407623291015625, + 0.06732177734375, + -0.00951385498046875, + 0.0413818359375, + 0.0012598037719726562, + -0.0021152496337890625, + -0.058624267578125, + 0.040008544921875, + -0.049530029296875, + -0.00897216796875, + -0.03240966796875, + 0.0014820098876953125, + 0.0141143798828125, + -0.0275421142578125, + 0.034515380859375, + 0.0027484893798828125, + 0.006805419921875, + 0.058135986328125, + -0.0285491943359375, + 0.040374755859375, + -0.02764892578125, + 0.030059814453125, + -0.00798797607421875, + 0.00278472900390625, + -0.0138397216796875, + -0.0080718994140625, + 0.03033447265625, + -0.03424072265625, + 0.0126495361328125, + 0.045257568359375, + -0.0020999908447265625, + -0.004810333251953125, + 0.043182373046875, + 0.0267791748046875, + 0.056915283203125, + 0.01361083984375, + 0.0165863037109375, + 0.0194091796875, + -0.0223388671875, + 0.042205810546875, + -0.0230560302734375, + 0.046875, + 0.0207672119140625, + 0.0193023681640625, + 0.018798828125, + -0.003459930419921875, + -0.048828125, + 0.0294342041015625, + 0.009918212890625, + -0.033447265625, + 0.0021953582763671875, + -0.01499176025390625, + -0.041015625, + 0.038543701171875, + 0.00728607177734375, + 0.02557373046875, + -0.0249786376953125, + -0.09344482421875, + -0.0380859375, + 0.01085662841796875, + -0.08184814453125, + 0.0106201171875, + 0.01702880859375, + -0.053070068359375, + 0.0012454986572265625, + 0.0217742919921875, + 0.0013647079467773438, + -0.0301666259765625, + 0.0247955322265625, + 0.028778076171875, + -0.045745849609375, + -0.033050537109375, + 0.00785064697265625, + -0.0193634033203125, + -0.0183258056640625, + 0.05029296875, + 0.005825042724609375, + 0.0258026123046875, + -0.01001739501953125, + 0.0357666015625, + 0.0357666015625, + 0.01294708251953125, + 0.02978515625, + -0.0148468017578125, + -0.0246429443359375, + 0.0797119140625, + -0.0192718505859375, + 0.007568359375, + 0.00833892822265625, + 0.004962921142578125, + -0.01812744140625, + 0.08563232421875, + -0.00814056396484375, + 0.044921875, + 0.05767822265625, + 0.0006213188171386719, + 0.01995849609375, + 0.020782470703125, + 0.021453857421875, + 0.041656494140625, + 0.01131439208984375, + 0.044921875, + -0.06787109375, + -0.01293182373046875, + 0.01103973388671875, + 0.0237274169921875, + -0.006160736083984375, + 0.061187744140625, + -0.01140594482421875, + 0.0545654296875, + 0.0352783203125, + 0.01093292236328125, + -0.03778076171875, + -0.0195770263671875, + 0.0179901123046875, + -0.007785797119140625, + -0.0401611328125, + 0.00499725341796875, + 0.00968170166015625, + 0.003509521484375, + 0.00508880615234375, + -0.0228271484375, + 0.0220184326171875, + -0.053466796875, + 0.041290283203125, + 0.00811767578125, + 0.004108428955078125, + -0.0521240234375, + 0.01568603515625, + -0.0226898193359375, + -0.026458740234375, + -0.04144287109375, + -0.025421142578125, + -0.0283660888671875, + 0.034942626953125, + -0.021636962890625, + -0.006786346435546875, + -0.0263671875, + 0.013641357421875, + -0.0560302734375, + -0.0015535354614257812, + 0.07000732421875, + 0.022308349609375, + 0.022613525390625, + -0.002166748046875, + -0.0254364013671875, + 0.00592803955078125, + 0.040435791015625, + -0.004367828369140625, + -0.028076171875, + 0.0034160614013671875, + -0.046051025390625, + -0.0101318359375, + -0.023345947265625, + 0.0150604248046875, + 0.02899169921875, + -0.0243988037109375, + -0.01531982421875, + -0.006866455078125, + 0.04766845703125, + -0.005859375, + 0.033416748046875, + -0.042633056640625, + -0.004199981689453125, + 0.0799560546875, + -0.020355224609375, + 0.0188140869140625, + 0.033966064453125, + -0.00638580322265625, + 0.040252685546875, + -0.009521484375, + -0.02020263671875, + -0.049072265625, + 0.023406982421875, + 0.04144287109375, + -0.01690673828125, + -0.01177978515625, + 0.003940582275390625, + -0.0205841064453125, + -0.03302001953125, + -0.0158538818359375, + 0.014190673828125, + -0.016326904296875, + 0.031524658203125, + -0.0225677490234375, + -0.0838623046875, + 0.0014591217041015625, + -0.034149169921875, + 0.01538848876953125, + -0.03973388671875, + -0.022003173828125, + 0.03515625, + 0.0123443603515625, + -0.017730712890625, + -0.024993896484375, + -0.00876617431640625, + -0.00799560546875, + -0.01947021484375, + 0.041656494140625, + -0.023223876953125, + 0.00521087646484375, + 0.0127716064453125, + 0.033050537109375, + 0.004669189453125, + 0.01395416259765625, + -0.00946044921875, + -0.03070068359375, + -0.023834228515625, + 0.0014295578002929688, + -0.006221771240234375, + -0.0157470703125, + -0.002391815185546875, + 0.0093536376953125, + 0.03857421875, + -0.00583648681640625, + 0.00028061866760253906, + 0.03826904296875, + 0.0131378173828125, + 0.00801849365234375, + 0.03741455078125, + 0.00445556640625, + 0.0026111602783203125, + -0.0204010009765625, + -0.05938720703125, + -0.060760498046875, + 0.042755126953125, + 0.02325439453125, + -0.058624267578125, + 0.02508544921875, + -0.026763916015625, + 0.017425537109375, + -0.0119171142578125, + -0.0229949951171875, + -0.0201263427734375, + 0.020416259765625, + 0.005756378173828125, + 0.057403564453125, + -0.0121307373046875, + 0.001636505126953125, + -0.00739288330078125, + 0.001750946044921875, + 0.06219482421875, + 0.0491943359375, + 0.00327301025390625, + 0.0086822509765625, + -0.0020580291748046875, + -0.042449951171875, + 0.0162353515625, + -0.0174713134765625, + 0.00701904296875, + 0.0081939697265625, + -0.01861572265625, + -0.047149658203125, + -0.04107666015625, + 0.00457000732421875, + 0.01158905029296875, + 0.044403076171875, + 0.01177978515625, + 0.00873565673828125, + -0.009368896484375, + 0.018707275390625, + 0.04815673828125, + -0.0275726318359375, + 0.023712158203125, + -0.0162353515625, + 0.03375244140625, + 0.01120758056640625, + 0.0257415771484375, + -0.0489501953125, + 0.04254150390625, + -0.01520538330078125, + 0.01178741455078125, + 0.026153564453125, + -0.03277587890625, + -0.01216888427734375, + 0.0277862548828125, + 0.0103912353515625, + 0.005359649658203125, + -0.0307769775390625, + -0.060089111328125, + -0.01239013671875, + 0.00286102294921875, + 0.0290374755859375, + -0.0163421630859375, + -0.0279388427734375, + -0.005245208740234375, + 0.050933837890625, + 0.0496826171875, + -0.01491546630859375, + -0.0714111328125, + -0.00919342041015625, + -0.04046630859375, + -0.05535888671875, + -0.00629425048828125, + 0.059967041015625, + -0.0631103515625, + 0.007266998291015625, + -0.0528564453125, + -0.0033321380615234375, + -0.0009446144104003906, + -0.0210113525390625, + 0.02587890625, + 0.01155853271484375, + -0.026031494140625, + -0.02880859375, + 0.01739501953125, + -0.047760009765625, + -0.0601806640625, + 0.0158538818359375, + -0.06219482421875, + 0.027313232421875, + -0.0179443359375, + 0.000415802001953125, + -0.0361328125, + 0.0208892822265625, + 0.031524658203125, + 0.01708984375, + -0.0189666748046875, + -0.00891876220703125, + 0.03936767578125, + 0.01409912109375, + -0.004058837890625, + 0.01398468017578125, + 0.01555633544921875, + -0.0016756057739257812, + 0.00555419921875, + 0.031707763671875, + -0.005435943603515625, + 0.007686614990234375, + 0.042266845703125, + 0.0037708282470703125, + -0.050079345703125, + -0.004322052001953125, + -0.03546142578125, + 0.016082763671875, + -0.03515625, + -0.018768310546875, + -0.01500701904296875, + -0.043182373046875, + 0.042144775390625, + 0.050018310546875, + -0.049652099609375, + -0.0184173583984375, + -0.055206298828125, + -0.0158843994140625, + -0.0269622802734375, + -0.007541656494140625, + 0.0416259765625, + -0.023101806640625, + -0.0338134765625, + 0.00537872314453125, + -0.018890380859375, + -0.0196533203125, + 0.0284423828125, + -0.04345703125, + -0.01146697998046875, + 0.005596160888671875, + 0.02349853515625, + 0.001796722412109375, + -0.018585205078125, + -0.0413818359375, + 0.040130615234375, + -0.04986572265625, + -0.0106201171875, + -0.0138397216796875, + 0.0102386474609375, + 0.016937255859375, + -0.0044403076171875, + -0.03253173828125, + 0.0236358642578125, + -0.041229248046875, + 0.01373291015625, + -0.01102447509765625, + -0.022247314453125, + 0.0182342529296875, + -0.016693115234375, + -0.0111846923828125, + 0.02691650390625, + 0.033660888671875, + -0.0633544921875, + -0.0211639404296875, + 0.0036525726318359375, + -0.005706787109375, + 0.03643798828125, + 0.0284881591796875, + -0.00835418701171875, + -0.0312042236328125, + 0.006317138671875, + 0.01025390625, + -0.007843017578125, + 0.00213623046875, + -0.0772705078125, + -0.0279693603515625, + -0.06549072265625, + 0.0131683349609375, + 0.033294677734375, + -0.036590576171875, + 0.01375579833984375, + -0.046875, + 0.055511474609375, + -0.019378662109375, + -0.01172637939453125, + -0.01117706298828125, + 0.0234527587890625, + 0.00614166259765625, + 0.053619384765625, + -0.004131317138671875, + 0.028045654296875, + -0.0051727294921875, + 0.01395416259765625, + 0.0289154052734375, + 0.00588226318359375, + -0.04315185546875, + -0.030914306640625, + -0.01071929931640625, + 0.0054931640625, + -0.005695343017578125, + 0.029510498046875, + -0.032135009765625, + -0.007110595703125, + -0.0221099853515625, + 0.041961669921875, + -0.04669189453125, + -0.01526641845703125, + -0.0251007080078125, + 0.002231597900390625, + 0.00835418701171875, + -0.049346923828125, + -0.006175994873046875, + -0.0011625289916992188, + 0.0638427734375, + -0.033050537109375, + 0.0207977294921875, + 0.007640838623046875, + 0.005527496337890625, + -0.035888671875, + 0.0035114288330078125, + 0.04254150390625, + -0.032440185546875, + -0.01025390625, + -0.005802154541015625, + -0.037994384765625, + 0.07293701171875, + -0.037109375, + 0.0309295654296875, + 0.0806884765625, + 0.0208587646484375, + 0.0092926025390625, + -0.0221099853515625, + 0.041900634765625, + 0.03985595703125, + -0.004940032958984375, + 0.0001558065414428711, + 0.0010509490966796875, + -0.0295867919921875, + -0.04095458984375, + 0.00835418701171875, + -0.0499267578125, + -0.059173583984375, + 0.003086090087890625, + 0.042266845703125, + 0.015411376953125, + 0.047607421875, + 0.0098419189453125, + -0.05523681640625, + -0.054840087890625, + 0.026031494140625, + 0.0235137939453125, + 0.0303497314453125, + 0.0616455078125, + 0.035064697265625, + 0.002140045166015625, + 0.038238525390625, + -0.0106658935546875, + -0.00887298583984375, + -0.0594482421875, + 0.02154541015625, + 0.049102783203125, + -0.035003662109375, + 0.045379638671875, + 0.043243408203125, + -0.0849609375, + -0.049072265625, + -0.0207672119140625, + -0.033355712890625, + -0.003459930419921875, + -0.0258331298828125, + -0.07672119140625, + -0.0202789306640625, + -0.07354736328125, + -0.02008056640625, + -0.0282745361328125, + -0.01538848876953125, + 0.049713134765625, + -0.051849365234375, + 0.01007843017578125, + -0.03997802734375, + -0.015045166015625, + 0.045501708984375, + -0.0173797607421875, + 0.0284423828125, + -0.0355224609375, + -0.0199127197265625, + -0.0206146240234375, + 0.0223541259765625, + 0.012481689453125, + 0.00637054443359375, + 0.0032520294189453125, + 0.0179443359375, + 0.01454925537109375, + 0.08642578125, + 0.01959228515625, + 0.0304107666015625, + 0.05035400390625, + -0.07696533203125, + -0.04522705078125, + -0.0205841064453125, + 0.0058441162109375, + 0.0172576904296875, + -0.00305938720703125, + -0.0221099853515625, + 0.039306640625, + 0.06097412109375, + 0.064208984375, + -0.0030345916748046875, + -0.0574951171875, + -0.0170745849609375, + -0.024139404296875, + -0.037353515625, + -0.021575927734375, + -0.01416778564453125, + 0.01001739501953125, + 0.0217742919921875, + -0.0146636962890625, + -0.0311431884765625, + -0.03271484375, + 0.002338409423828125, + 0.0116424560546875, + -0.01043701171875, + -0.036773681640625, + 0.05645751953125, + 0.00579071044921875, + -0.0274200439453125, + -0.01483917236328125, + -0.0523681640625, + -0.03106689453125, + 0.006153106689453125, + -0.0242767333984375, + 0.0011644363403320312, + -0.023101806640625, + 0.050994873046875, + -0.0011348724365234375, + 0.0042724609375, + -0.02203369140625, + -0.01064300537109375, + -0.00403594970703125, + -0.002880096435546875, + -0.00252532958984375, + -0.0090789794921875, + 0.025848388671875, + -0.031890869140625, + 0.013458251953125, + -0.02325439453125, + 0.03985595703125, + -0.038055419921875, + 0.038543701171875, + -0.022552490234375, + 6.0617923736572266e-05, + -0.00537872314453125, + -0.0142822265625, + -0.00839996337890625, + -0.007266998291015625, + 0.012176513671875, + -0.0234375, + 0.0165557861328125, + 0.0034465789794921875, + 0.016510009765625, + 0.0261077880859375, + 0.023895263671875, + 0.01177215576171875, + -0.004302978515625, + -0.005054473876953125, + -0.0024166107177734375, + 0.03900146484375, + 0.006103515625, + 0.037628173828125, + 0.00865936279296875, + 0.0039825439453125, + 0.00817108154296875, + 0.00919342041015625, + 0.00438690185546875, + -0.0186004638671875, + 0.0243377685546875, + -0.01155853271484375, + 0.005313873291015625, + 0.00345611572265625, + 0.0197601318359375, + 0.0184783935546875, + 0.046600341796875, + 0.02471923828125, + 0.01131439208984375, + 0.054443359375, + 0.004425048828125, + -0.00814056396484375, + 0.0172882080078125, + -0.057281494140625, + -0.04962158203125, + 0.04095458984375, + -0.055145263671875, + -0.0192718505859375, + -0.01229095458984375, + -0.0292816162109375, + -0.0104522705078125, + 0.0016574859619140625, + -0.029205322265625, + -0.0003898143768310547, + 0.01690673828125, + 0.044586181640625, + 0.0313720703125, + -0.00354766845703125, + -0.01338958740234375, + -0.01513671875, + 0.020233154296875, + -0.044921875, + -0.01464080810546875, + 0.01531982421875, + 0.01090240478515625, + 0.04315185546875, + 0.0150604248046875, + -0.0184326171875, + 0.01407623291015625, + -0.01386260986328125, + -0.01349639892578125, + 0.03857421875, + 0.003665924072265625, + -0.032135009765625, + 0.02801513671875, + -0.07373046875, + 0.06744384765625, + -0.0194091796875, + 0.00547027587890625, + -0.011199951171875, + -0.0210418701171875, + 0.01198577880859375, + 0.040618896484375, + 0.021392822265625, + -0.045166015625, + 0.01007080078125, + 0.01029205322265625, + 0.024932861328125, + -0.0020008087158203125, + -0.0140380859375, + 0.00568389892578125, + 0.06329345703125, + 0.0506591796875, + 0.04449462890625, + -0.0031795501708984375, + 0.03741455078125, + 0.0367431640625, + -0.0153656005859375, + -0.02349853515625, + 0.052001953125, + 0.038177490234375, + -0.041656494140625, + 0.01091766357421875, + -0.03857421875, + -0.029754638671875, + -0.01287841796875, + 0.01328277587890625, + -0.017974853515625, + -0.058197021484375, + 0.0181427001953125, + -0.05010986328125, + 0.00897979736328125, + 0.0635986328125, + 0.0078125, + 0.00521087646484375, + 0.01580810546875, + -0.00948333740234375, + 0.017669677734375, + 0.0220947265625, + -0.0404052734375, + -0.0219268798828125, + 0.022125244140625, + 0.0362548828125, + -0.01502227783203125, + 0.0272216796875, + 0.01053619384765625, + 0.007904052734375, + -0.0540771484375, + 0.04864501953125, + 0.0296783447265625, + 0.0149688720703125, + -0.0258026123046875, + -0.029693603515625, + -0.05059814453125, + -0.0223846435546875, + 0.01166534423828125, + -0.002532958984375, + 0.0099639892578125, + -0.028045654296875, + 0.03570556640625, + -0.0200958251953125, + 0.0379638671875, + -0.0224151611328125, + -0.0022678375244140625, + 0.0216827392578125, + -0.0012235641479492188, + 0.04730224609375, + 0.0595703125, + -0.0027904510498046875, + 0.0305633544921875, + -0.01100921630859375, + 0.0211639404296875, + 0.036590576171875, + 0.004764556884765625, + 0.040496826171875, + -0.036590576171875, + -0.00864410400390625, + 0.0273590087890625, + -0.0218353271484375, + -0.00821685791015625, + -0.0601806640625, + -0.0244293212890625, + 0.02392578125, + -0.013641357421875, + -0.00039696693420410156, + -0.0209503173828125, + 0.039520263671875, + 0.01526641845703125, + -0.024200439453125, + -0.027679443359375, + 0.02264404296875, + -0.0455322265625, + 0.0057525634765625, + 0.039825439453125, + 0.02203369140625, + 0.01116180419921875, + -0.0531005859375, + 0.00942230224609375, + -0.0010519027709960938, + 0.01265716552734375, + -0.0247802734375, + -0.00292205810546875, + 0.0011491775512695312, + -0.0379638671875, + -0.0256195068359375, + -0.0306243896484375, + -0.0018663406372070312, + -0.006984710693359375, + 0.00447845458984375, + -0.04290771484375, + -0.014984130859375, + -0.00200653076171875, + 0.007274627685546875, + 0.01873779296875, + 0.01107025146484375, + 0.004299163818359375, + 0.003177642822265625, + 0.03155517578125, + 0.0062713623046875, + 0.050933837890625, + -0.00632476806640625, + -0.0455322265625, + -0.0158233642578125, + -0.035491943359375, + -0.0171051025390625, + -0.03662109375, + -0.021728515625, + 0.0268096923828125, + 0.02703857421875, + -0.0193634033203125, + -0.018707275390625, + -0.035308837890625, + 0.00925445556640625, + -0.0016641616821289062, + 0.024444580078125, + -0.044036865234375, + -0.0574951171875, + -0.0709228515625, + -0.01910400390625, + 0.003627777099609375, + 0.01151275634765625, + -0.0304107666015625, + 0.01275634765625, + 0.030914306640625, + -0.07611083984375, + 0.1944580078125, + 0.0160980224609375, + 0.014984130859375, + 0.010772705078125, + 0.01776123046875, + 0.04931640625, + 0.004299163818359375, + 0.005245208740234375, + -0.061981201171875, + -0.042694091796875, + 0.04083251953125, + 0.0007605552673339844, + -0.005481719970703125, + -0.016387939453125, + -0.005054473876953125, + 0.00936126708984375, + -0.007648468017578125, + -0.037567138671875, + 0.0240325927734375, + -0.0123443603515625, + -0.027252197265625, + -0.00286865234375, + 0.0184173583984375, + 0.0286407470703125, + 0.0092010498046875, + 0.022857666015625, + 0.047943115234375, + -0.00893402099609375, + 0.003383636474609375, + -0.019561767578125, + 0.06488037109375, + 0.00029969215393066406, + 0.043060302734375, + 0.0157623291015625, + -0.029327392578125, + 0.037261962890625, + 0.02532958984375, + 0.00390625, + -0.009552001953125, + -0.0235443115234375, + 0.0286407470703125, + -0.019134521484375, + -0.03131103515625, + -0.0004582405090332031, + -0.044586181640625, + 0.0195465087890625, + 0.0005121231079101562, + 0.06744384765625, + 0.0394287109375, + -0.00420379638671875, + 0.05645751953125, + -0.0089874267578125, + 0.0283355712890625, + -0.0273895263671875, + -0.06268310546875, + 0.04541015625, + -0.009674072265625, + 0.03466796875, + -0.038116455078125, + 0.0269927978515625, + -0.0219879150390625, + 0.00738525390625, + 0.00423431396484375, + 0.004169464111328125, + -0.0120086669921875, + 0.009368896484375, + -0.020263671875, + 0.01036834716796875, + -0.03948974609375, + -0.035552978515625, + 0.0036525726318359375, + 0.00521087646484375, + -0.006786346435546875, + -0.03607177734375, + 0.026031494140625, + 0.036163330078125, + -0.0161895751953125, + 0.02630615234375, + 0.00954437255859375, + -0.026458740234375, + 0.028564453125, + -0.01108551025390625, + 0.047760009765625, + -0.0257720947265625, + -0.001068115234375, + 0.01389312744140625, + -0.00641632080078125, + -0.00482940673828125, + -0.056671142578125, + -0.0018491744995117188, + 0.032257080078125, + 0.051788330078125, + -0.0172119140625, + -0.0018167495727539062, + -0.0031604766845703125 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "bge-large-en-v1.5", + "object": "list", + "usage": { + "prompt_tokens": 5, + "total_tokens": 5 + }, + "id": "2b932521-dccc-4a5e-a548-4cc9b6796188" + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/d64ffaa0de6f.json b/tests/integration/recordings/responses/d64ffaa0de6f.json new file mode 100644 index 000000000..0e7b19d29 --- /dev/null +++ b/tests/integration/recordings/responses/d64ffaa0de6f.json @@ -0,0 +1,1062 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/embeddings", + "headers": {}, + "body": { + "model": "databricks-bge-large-en", + "input": "Test user parameter", + "encoding_format": "float", + "user": "test-user-123" + }, + "endpoint": "/v1/embeddings", + "model": "databricks-bge-large-en" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.038818359375, + -0.0207061767578125, + 0.00783538818359375, + 0.0081939697265625, + -0.041290283203125, + 0.0186920166015625, + 0.00027441978454589844, + 0.027862548828125, + 0.037994384765625, + 0.034454345703125, + 0.050537109375, + -0.0251007080078125, + -0.001983642578125, + -0.01161956787109375, + -0.040252685546875, + -0.01259613037109375, + 0.0064849853515625, + 0.018280029296875, + -0.01287841796875, + -0.00446319580078125, + 0.006011962890625, + 0.0250396728515625, + -0.07098388671875, + -0.0204010009765625, + -0.03741455078125, + -0.042266845703125, + 0.0081939697265625, + -0.01309967041015625, + 0.0323486328125, + 0.036865234375, + -0.038543701171875, + -0.0030841827392578125, + -0.0162200927734375, + -0.03985595703125, + 0.00453948974609375, + -0.0294342041015625, + 0.05145263671875, + -0.0531005859375, + -0.03289794921875, + -0.03399658203125, + 0.0081939697265625, + 0.00921630859375, + -0.01367950439453125, + -0.03607177734375, + -0.03997802734375, + -0.0266876220703125, + -0.056396484375, + -0.002017974853515625, + -0.0230560302734375, + -0.0205535888671875, + -0.0191192626953125, + -0.00901031494140625, + 0.03460693359375, + -0.01090240478515625, + -0.0172576904296875, + -0.03619384765625, + 0.00653076171875, + -0.00341033935546875, + -0.0390625, + 0.0634765625, + -0.0238494873046875, + 0.015960693359375, + -0.003719329833984375, + -0.046142578125, + 0.026123046875, + 0.0024566650390625, + 0.031524658203125, + -0.009185791015625, + 0.00116729736328125, + -0.029571533203125, + 0.00673675537109375, + 0.031524658203125, + -0.0112457275390625, + -0.0257110595703125, + -0.03350830078125, + 0.06622314453125, + 0.0250091552734375, + -0.00572967529296875, + -0.0058746337890625, + 0.0731201171875, + -0.00891876220703125, + 0.0177154541015625, + 0.0096893310546875, + 0.0139923095703125, + -0.07232666015625, + -0.0140228271484375, + 0.025238037109375, + 0.0265655517578125, + 0.0264892578125, + -0.00270843505859375, + -0.006641387939453125, + 0.03668212890625, + 0.00897979736328125, + -0.011505126953125, + 0.00983428955078125, + 0.0172271728515625, + 0.00867462158203125, + 0.00699615478515625, + 0.004863739013671875, + -0.0238494873046875, + 0.050201416015625, + 0.0484619140625, + 0.0288848876953125, + 0.041229248046875, + -0.0111083984375, + 0.0919189453125, + 0.007373809814453125, + 0.0178375244140625, + -0.042877197265625, + -0.0292816162109375, + -0.00487518310546875, + 0.005069732666015625, + 0.0262603759765625, + 0.021881103515625, + -0.055145263671875, + 0.005138397216796875, + 0.01123046875, + 0.006084442138671875, + -0.035675048828125, + -0.0247650146484375, + 0.052459716796875, + -0.0225372314453125, + 0.003650665283203125, + -0.028076171875, + 0.0042724609375, + -0.0269622802734375, + -0.0753173828125, + 0.038909912109375, + -0.00821685791015625, + -0.06915283203125, + -0.00516510009765625, + -0.0139923095703125, + 0.057342529296875, + 0.03759765625, + 0.00557708740234375, + 0.067138671875, + 0.01593017578125, + 0.0084075927734375, + 0.032135009765625, + -0.03582763671875, + 0.033416748046875, + 0.03668212890625, + -0.01407623291015625, + 0.06732177734375, + -0.00951385498046875, + 0.0413818359375, + 0.0012598037719726562, + -0.0021152496337890625, + -0.058624267578125, + 0.040008544921875, + -0.049530029296875, + -0.00897216796875, + -0.03240966796875, + 0.0014820098876953125, + 0.0141143798828125, + -0.0275421142578125, + 0.034515380859375, + 0.0027484893798828125, + 0.006805419921875, + 0.058135986328125, + -0.0285491943359375, + 0.040374755859375, + -0.02764892578125, + 0.030059814453125, + -0.00798797607421875, + 0.00278472900390625, + -0.0138397216796875, + -0.0080718994140625, + 0.03033447265625, + -0.03424072265625, + 0.0126495361328125, + 0.045257568359375, + -0.0020999908447265625, + -0.004810333251953125, + 0.043182373046875, + 0.0267791748046875, + 0.056915283203125, + 0.01361083984375, + 0.0165863037109375, + 0.0194091796875, + -0.0223388671875, + 0.042205810546875, + -0.0230560302734375, + 0.046875, + 0.0207672119140625, + 0.0193023681640625, + 0.018798828125, + -0.003459930419921875, + -0.048828125, + 0.0294342041015625, + 0.009918212890625, + -0.033447265625, + 0.0021953582763671875, + -0.01499176025390625, + -0.041015625, + 0.038543701171875, + 0.00728607177734375, + 0.02557373046875, + -0.0249786376953125, + -0.09344482421875, + -0.0380859375, + 0.01085662841796875, + -0.08184814453125, + 0.0106201171875, + 0.01702880859375, + -0.053070068359375, + 0.0012454986572265625, + 0.0217742919921875, + 0.0013647079467773438, + -0.0301666259765625, + 0.0247955322265625, + 0.028778076171875, + -0.045745849609375, + -0.033050537109375, + 0.00785064697265625, + -0.0193634033203125, + -0.0183258056640625, + 0.05029296875, + 0.005825042724609375, + 0.0258026123046875, + -0.01001739501953125, + 0.0357666015625, + 0.0357666015625, + 0.01294708251953125, + 0.02978515625, + -0.0148468017578125, + -0.0246429443359375, + 0.0797119140625, + -0.0192718505859375, + 0.007568359375, + 0.00833892822265625, + 0.004962921142578125, + -0.01812744140625, + 0.08563232421875, + -0.00814056396484375, + 0.044921875, + 0.05767822265625, + 0.0006213188171386719, + 0.01995849609375, + 0.020782470703125, + 0.021453857421875, + 0.041656494140625, + 0.01131439208984375, + 0.044921875, + -0.06787109375, + -0.01293182373046875, + 0.01103973388671875, + 0.0237274169921875, + -0.006160736083984375, + 0.061187744140625, + -0.01140594482421875, + 0.0545654296875, + 0.0352783203125, + 0.01093292236328125, + -0.03778076171875, + -0.0195770263671875, + 0.0179901123046875, + -0.007785797119140625, + -0.0401611328125, + 0.00499725341796875, + 0.00968170166015625, + 0.003509521484375, + 0.00508880615234375, + -0.0228271484375, + 0.0220184326171875, + -0.053466796875, + 0.041290283203125, + 0.00811767578125, + 0.004108428955078125, + -0.0521240234375, + 0.01568603515625, + -0.0226898193359375, + -0.026458740234375, + -0.04144287109375, + -0.025421142578125, + -0.0283660888671875, + 0.034942626953125, + -0.021636962890625, + -0.006786346435546875, + -0.0263671875, + 0.013641357421875, + -0.0560302734375, + -0.0015535354614257812, + 0.07000732421875, + 0.022308349609375, + 0.022613525390625, + -0.002166748046875, + -0.0254364013671875, + 0.00592803955078125, + 0.040435791015625, + -0.004367828369140625, + -0.028076171875, + 0.0034160614013671875, + -0.046051025390625, + -0.0101318359375, + -0.023345947265625, + 0.0150604248046875, + 0.02899169921875, + -0.0243988037109375, + -0.01531982421875, + -0.006866455078125, + 0.04766845703125, + -0.005859375, + 0.033416748046875, + -0.042633056640625, + -0.004199981689453125, + 0.0799560546875, + -0.020355224609375, + 0.0188140869140625, + 0.033966064453125, + -0.00638580322265625, + 0.040252685546875, + -0.009521484375, + -0.02020263671875, + -0.049072265625, + 0.023406982421875, + 0.04144287109375, + -0.01690673828125, + -0.01177978515625, + 0.003940582275390625, + -0.0205841064453125, + -0.03302001953125, + -0.0158538818359375, + 0.014190673828125, + -0.016326904296875, + 0.031524658203125, + -0.0225677490234375, + -0.0838623046875, + 0.0014591217041015625, + -0.034149169921875, + 0.01538848876953125, + -0.03973388671875, + -0.022003173828125, + 0.03515625, + 0.0123443603515625, + -0.017730712890625, + -0.024993896484375, + -0.00876617431640625, + -0.00799560546875, + -0.01947021484375, + 0.041656494140625, + -0.023223876953125, + 0.00521087646484375, + 0.0127716064453125, + 0.033050537109375, + 0.004669189453125, + 0.01395416259765625, + -0.00946044921875, + -0.03070068359375, + -0.023834228515625, + 0.0014295578002929688, + -0.006221771240234375, + -0.0157470703125, + -0.002391815185546875, + 0.0093536376953125, + 0.03857421875, + -0.00583648681640625, + 0.00028061866760253906, + 0.03826904296875, + 0.0131378173828125, + 0.00801849365234375, + 0.03741455078125, + 0.00445556640625, + 0.0026111602783203125, + -0.0204010009765625, + -0.05938720703125, + -0.060760498046875, + 0.042755126953125, + 0.02325439453125, + -0.058624267578125, + 0.02508544921875, + -0.026763916015625, + 0.017425537109375, + -0.0119171142578125, + -0.0229949951171875, + -0.0201263427734375, + 0.020416259765625, + 0.005756378173828125, + 0.057403564453125, + -0.0121307373046875, + 0.001636505126953125, + -0.00739288330078125, + 0.001750946044921875, + 0.06219482421875, + 0.0491943359375, + 0.00327301025390625, + 0.0086822509765625, + -0.0020580291748046875, + -0.042449951171875, + 0.0162353515625, + -0.0174713134765625, + 0.00701904296875, + 0.0081939697265625, + -0.01861572265625, + -0.047149658203125, + -0.04107666015625, + 0.00457000732421875, + 0.01158905029296875, + 0.044403076171875, + 0.01177978515625, + 0.00873565673828125, + -0.009368896484375, + 0.018707275390625, + 0.04815673828125, + -0.0275726318359375, + 0.023712158203125, + -0.0162353515625, + 0.03375244140625, + 0.01120758056640625, + 0.0257415771484375, + -0.0489501953125, + 0.04254150390625, + -0.01520538330078125, + 0.01178741455078125, + 0.026153564453125, + -0.03277587890625, + -0.01216888427734375, + 0.0277862548828125, + 0.0103912353515625, + 0.005359649658203125, + -0.0307769775390625, + -0.060089111328125, + -0.01239013671875, + 0.00286102294921875, + 0.0290374755859375, + -0.0163421630859375, + -0.0279388427734375, + -0.005245208740234375, + 0.050933837890625, + 0.0496826171875, + -0.01491546630859375, + -0.0714111328125, + -0.00919342041015625, + -0.04046630859375, + -0.05535888671875, + -0.00629425048828125, + 0.059967041015625, + -0.0631103515625, + 0.007266998291015625, + -0.0528564453125, + -0.0033321380615234375, + -0.0009446144104003906, + -0.0210113525390625, + 0.02587890625, + 0.01155853271484375, + -0.026031494140625, + -0.02880859375, + 0.01739501953125, + -0.047760009765625, + -0.0601806640625, + 0.0158538818359375, + -0.06219482421875, + 0.027313232421875, + -0.0179443359375, + 0.000415802001953125, + -0.0361328125, + 0.0208892822265625, + 0.031524658203125, + 0.01708984375, + -0.0189666748046875, + -0.00891876220703125, + 0.03936767578125, + 0.01409912109375, + -0.004058837890625, + 0.01398468017578125, + 0.01555633544921875, + -0.0016756057739257812, + 0.00555419921875, + 0.031707763671875, + -0.005435943603515625, + 0.007686614990234375, + 0.042266845703125, + 0.0037708282470703125, + -0.050079345703125, + -0.004322052001953125, + -0.03546142578125, + 0.016082763671875, + -0.03515625, + -0.018768310546875, + -0.01500701904296875, + -0.043182373046875, + 0.042144775390625, + 0.050018310546875, + -0.049652099609375, + -0.0184173583984375, + -0.055206298828125, + -0.0158843994140625, + -0.0269622802734375, + -0.007541656494140625, + 0.0416259765625, + -0.023101806640625, + -0.0338134765625, + 0.00537872314453125, + -0.018890380859375, + -0.0196533203125, + 0.0284423828125, + -0.04345703125, + -0.01146697998046875, + 0.005596160888671875, + 0.02349853515625, + 0.001796722412109375, + -0.018585205078125, + -0.0413818359375, + 0.040130615234375, + -0.04986572265625, + -0.0106201171875, + -0.0138397216796875, + 0.0102386474609375, + 0.016937255859375, + -0.0044403076171875, + -0.03253173828125, + 0.0236358642578125, + -0.041229248046875, + 0.01373291015625, + -0.01102447509765625, + -0.022247314453125, + 0.0182342529296875, + -0.016693115234375, + -0.0111846923828125, + 0.02691650390625, + 0.033660888671875, + -0.0633544921875, + -0.0211639404296875, + 0.0036525726318359375, + -0.005706787109375, + 0.03643798828125, + 0.0284881591796875, + -0.00835418701171875, + -0.0312042236328125, + 0.006317138671875, + 0.01025390625, + -0.007843017578125, + 0.00213623046875, + -0.0772705078125, + -0.0279693603515625, + -0.06549072265625, + 0.0131683349609375, + 0.033294677734375, + -0.036590576171875, + 0.01375579833984375, + -0.046875, + 0.055511474609375, + -0.019378662109375, + -0.01172637939453125, + -0.01117706298828125, + 0.0234527587890625, + 0.00614166259765625, + 0.053619384765625, + -0.004131317138671875, + 0.028045654296875, + -0.0051727294921875, + 0.01395416259765625, + 0.0289154052734375, + 0.00588226318359375, + -0.04315185546875, + -0.030914306640625, + -0.01071929931640625, + 0.0054931640625, + -0.005695343017578125, + 0.029510498046875, + -0.032135009765625, + -0.007110595703125, + -0.0221099853515625, + 0.041961669921875, + -0.04669189453125, + -0.01526641845703125, + -0.0251007080078125, + 0.002231597900390625, + 0.00835418701171875, + -0.049346923828125, + -0.006175994873046875, + -0.0011625289916992188, + 0.0638427734375, + -0.033050537109375, + 0.0207977294921875, + 0.007640838623046875, + 0.005527496337890625, + -0.035888671875, + 0.0035114288330078125, + 0.04254150390625, + -0.032440185546875, + -0.01025390625, + -0.005802154541015625, + -0.037994384765625, + 0.07293701171875, + -0.037109375, + 0.0309295654296875, + 0.0806884765625, + 0.0208587646484375, + 0.0092926025390625, + -0.0221099853515625, + 0.041900634765625, + 0.03985595703125, + -0.004940032958984375, + 0.0001558065414428711, + 0.0010509490966796875, + -0.0295867919921875, + -0.04095458984375, + 0.00835418701171875, + -0.0499267578125, + -0.059173583984375, + 0.003086090087890625, + 0.042266845703125, + 0.015411376953125, + 0.047607421875, + 0.0098419189453125, + -0.05523681640625, + -0.054840087890625, + 0.026031494140625, + 0.0235137939453125, + 0.0303497314453125, + 0.0616455078125, + 0.035064697265625, + 0.002140045166015625, + 0.038238525390625, + -0.0106658935546875, + -0.00887298583984375, + -0.0594482421875, + 0.02154541015625, + 0.049102783203125, + -0.035003662109375, + 0.045379638671875, + 0.043243408203125, + -0.0849609375, + -0.049072265625, + -0.0207672119140625, + -0.033355712890625, + -0.003459930419921875, + -0.0258331298828125, + -0.07672119140625, + -0.0202789306640625, + -0.07354736328125, + -0.02008056640625, + -0.0282745361328125, + -0.01538848876953125, + 0.049713134765625, + -0.051849365234375, + 0.01007843017578125, + -0.03997802734375, + -0.015045166015625, + 0.045501708984375, + -0.0173797607421875, + 0.0284423828125, + -0.0355224609375, + -0.0199127197265625, + -0.0206146240234375, + 0.0223541259765625, + 0.012481689453125, + 0.00637054443359375, + 0.0032520294189453125, + 0.0179443359375, + 0.01454925537109375, + 0.08642578125, + 0.01959228515625, + 0.0304107666015625, + 0.05035400390625, + -0.07696533203125, + -0.04522705078125, + -0.0205841064453125, + 0.0058441162109375, + 0.0172576904296875, + -0.00305938720703125, + -0.0221099853515625, + 0.039306640625, + 0.06097412109375, + 0.064208984375, + -0.0030345916748046875, + -0.0574951171875, + -0.0170745849609375, + -0.024139404296875, + -0.037353515625, + -0.021575927734375, + -0.01416778564453125, + 0.01001739501953125, + 0.0217742919921875, + -0.0146636962890625, + -0.0311431884765625, + -0.03271484375, + 0.002338409423828125, + 0.0116424560546875, + -0.01043701171875, + -0.036773681640625, + 0.05645751953125, + 0.00579071044921875, + -0.0274200439453125, + -0.01483917236328125, + -0.0523681640625, + -0.03106689453125, + 0.006153106689453125, + -0.0242767333984375, + 0.0011644363403320312, + -0.023101806640625, + 0.050994873046875, + -0.0011348724365234375, + 0.0042724609375, + -0.02203369140625, + -0.01064300537109375, + -0.00403594970703125, + -0.002880096435546875, + -0.00252532958984375, + -0.0090789794921875, + 0.025848388671875, + -0.031890869140625, + 0.013458251953125, + -0.02325439453125, + 0.03985595703125, + -0.038055419921875, + 0.038543701171875, + -0.022552490234375, + 6.0617923736572266e-05, + -0.00537872314453125, + -0.0142822265625, + -0.00839996337890625, + -0.007266998291015625, + 0.012176513671875, + -0.0234375, + 0.0165557861328125, + 0.0034465789794921875, + 0.016510009765625, + 0.0261077880859375, + 0.023895263671875, + 0.01177215576171875, + -0.004302978515625, + -0.005054473876953125, + -0.0024166107177734375, + 0.03900146484375, + 0.006103515625, + 0.037628173828125, + 0.00865936279296875, + 0.0039825439453125, + 0.00817108154296875, + 0.00919342041015625, + 0.00438690185546875, + -0.0186004638671875, + 0.0243377685546875, + -0.01155853271484375, + 0.005313873291015625, + 0.00345611572265625, + 0.0197601318359375, + 0.0184783935546875, + 0.046600341796875, + 0.02471923828125, + 0.01131439208984375, + 0.054443359375, + 0.004425048828125, + -0.00814056396484375, + 0.0172882080078125, + -0.057281494140625, + -0.04962158203125, + 0.04095458984375, + -0.055145263671875, + -0.0192718505859375, + -0.01229095458984375, + -0.0292816162109375, + -0.0104522705078125, + 0.0016574859619140625, + -0.029205322265625, + -0.0003898143768310547, + 0.01690673828125, + 0.044586181640625, + 0.0313720703125, + -0.00354766845703125, + -0.01338958740234375, + -0.01513671875, + 0.020233154296875, + -0.044921875, + -0.01464080810546875, + 0.01531982421875, + 0.01090240478515625, + 0.04315185546875, + 0.0150604248046875, + -0.0184326171875, + 0.01407623291015625, + -0.01386260986328125, + -0.01349639892578125, + 0.03857421875, + 0.003665924072265625, + -0.032135009765625, + 0.02801513671875, + -0.07373046875, + 0.06744384765625, + -0.0194091796875, + 0.00547027587890625, + -0.011199951171875, + -0.0210418701171875, + 0.01198577880859375, + 0.040618896484375, + 0.021392822265625, + -0.045166015625, + 0.01007080078125, + 0.01029205322265625, + 0.024932861328125, + -0.0020008087158203125, + -0.0140380859375, + 0.00568389892578125, + 0.06329345703125, + 0.0506591796875, + 0.04449462890625, + -0.0031795501708984375, + 0.03741455078125, + 0.0367431640625, + -0.0153656005859375, + -0.02349853515625, + 0.052001953125, + 0.038177490234375, + -0.041656494140625, + 0.01091766357421875, + -0.03857421875, + -0.029754638671875, + -0.01287841796875, + 0.01328277587890625, + -0.017974853515625, + -0.058197021484375, + 0.0181427001953125, + -0.05010986328125, + 0.00897979736328125, + 0.0635986328125, + 0.0078125, + 0.00521087646484375, + 0.01580810546875, + -0.00948333740234375, + 0.017669677734375, + 0.0220947265625, + -0.0404052734375, + -0.0219268798828125, + 0.022125244140625, + 0.0362548828125, + -0.01502227783203125, + 0.0272216796875, + 0.01053619384765625, + 0.007904052734375, + -0.0540771484375, + 0.04864501953125, + 0.0296783447265625, + 0.0149688720703125, + -0.0258026123046875, + -0.029693603515625, + -0.05059814453125, + -0.0223846435546875, + 0.01166534423828125, + -0.002532958984375, + 0.0099639892578125, + -0.028045654296875, + 0.03570556640625, + -0.0200958251953125, + 0.0379638671875, + -0.0224151611328125, + -0.0022678375244140625, + 0.0216827392578125, + -0.0012235641479492188, + 0.04730224609375, + 0.0595703125, + -0.0027904510498046875, + 0.0305633544921875, + -0.01100921630859375, + 0.0211639404296875, + 0.036590576171875, + 0.004764556884765625, + 0.040496826171875, + -0.036590576171875, + -0.00864410400390625, + 0.0273590087890625, + -0.0218353271484375, + -0.00821685791015625, + -0.0601806640625, + -0.0244293212890625, + 0.02392578125, + -0.013641357421875, + -0.00039696693420410156, + -0.0209503173828125, + 0.039520263671875, + 0.01526641845703125, + -0.024200439453125, + -0.027679443359375, + 0.02264404296875, + -0.0455322265625, + 0.0057525634765625, + 0.039825439453125, + 0.02203369140625, + 0.01116180419921875, + -0.0531005859375, + 0.00942230224609375, + -0.0010519027709960938, + 0.01265716552734375, + -0.0247802734375, + -0.00292205810546875, + 0.0011491775512695312, + -0.0379638671875, + -0.0256195068359375, + -0.0306243896484375, + -0.0018663406372070312, + -0.006984710693359375, + 0.00447845458984375, + -0.04290771484375, + -0.014984130859375, + -0.00200653076171875, + 0.007274627685546875, + 0.01873779296875, + 0.01107025146484375, + 0.004299163818359375, + 0.003177642822265625, + 0.03155517578125, + 0.0062713623046875, + 0.050933837890625, + -0.00632476806640625, + -0.0455322265625, + -0.0158233642578125, + -0.035491943359375, + -0.0171051025390625, + -0.03662109375, + -0.021728515625, + 0.0268096923828125, + 0.02703857421875, + -0.0193634033203125, + -0.018707275390625, + -0.035308837890625, + 0.00925445556640625, + -0.0016641616821289062, + 0.024444580078125, + -0.044036865234375, + -0.0574951171875, + -0.0709228515625, + -0.01910400390625, + 0.003627777099609375, + 0.01151275634765625, + -0.0304107666015625, + 0.01275634765625, + 0.030914306640625, + -0.07611083984375, + 0.1944580078125, + 0.0160980224609375, + 0.014984130859375, + 0.010772705078125, + 0.01776123046875, + 0.04931640625, + 0.004299163818359375, + 0.005245208740234375, + -0.061981201171875, + -0.042694091796875, + 0.04083251953125, + 0.0007605552673339844, + -0.005481719970703125, + -0.016387939453125, + -0.005054473876953125, + 0.00936126708984375, + -0.007648468017578125, + -0.037567138671875, + 0.0240325927734375, + -0.0123443603515625, + -0.027252197265625, + -0.00286865234375, + 0.0184173583984375, + 0.0286407470703125, + 0.0092010498046875, + 0.022857666015625, + 0.047943115234375, + -0.00893402099609375, + 0.003383636474609375, + -0.019561767578125, + 0.06488037109375, + 0.00029969215393066406, + 0.043060302734375, + 0.0157623291015625, + -0.029327392578125, + 0.037261962890625, + 0.02532958984375, + 0.00390625, + -0.009552001953125, + -0.0235443115234375, + 0.0286407470703125, + -0.019134521484375, + -0.03131103515625, + -0.0004582405090332031, + -0.044586181640625, + 0.0195465087890625, + 0.0005121231079101562, + 0.06744384765625, + 0.0394287109375, + -0.00420379638671875, + 0.05645751953125, + -0.0089874267578125, + 0.0283355712890625, + -0.0273895263671875, + -0.06268310546875, + 0.04541015625, + -0.009674072265625, + 0.03466796875, + -0.038116455078125, + 0.0269927978515625, + -0.0219879150390625, + 0.00738525390625, + 0.00423431396484375, + 0.004169464111328125, + -0.0120086669921875, + 0.009368896484375, + -0.020263671875, + 0.01036834716796875, + -0.03948974609375, + -0.035552978515625, + 0.0036525726318359375, + 0.00521087646484375, + -0.006786346435546875, + -0.03607177734375, + 0.026031494140625, + 0.036163330078125, + -0.0161895751953125, + 0.02630615234375, + 0.00954437255859375, + -0.026458740234375, + 0.028564453125, + -0.01108551025390625, + 0.047760009765625, + -0.0257720947265625, + -0.001068115234375, + 0.01389312744140625, + -0.00641632080078125, + -0.00482940673828125, + -0.056671142578125, + -0.0018491744995117188, + 0.032257080078125, + 0.051788330078125, + -0.0172119140625, + -0.0018167495727539062, + -0.0031604766845703125 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "bge-large-en-v1.5", + "object": "list", + "usage": { + "prompt_tokens": 5, + "total_tokens": 5 + }, + "id": "cacd37ef-5f90-4201-91a8-3b7a9eb3564a" + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/e509387fc329.json b/tests/integration/recordings/responses/e509387fc329.json new file mode 100644 index 000000000..5f1600dab --- /dev/null +++ b/tests/integration/recordings/responses/e509387fc329.json @@ -0,0 +1,168 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/chat/completions", + "headers": {}, + "body": { + "model": "databricks-meta-llama-3-3-70b-instruct", + "messages": [ + { + "role": "user", + "content": "What's the weather in Tokyo? Use the get_weather function to get the weather." + } + ], + "stream": true, + "tools": [ + { + "type": "function", + "function": { + "name": "get_weather", + "description": "Get the weather in a given city", + "parameters": { + "type": "object", + "properties": { + "city": { + "type": "string", + "description": "The city to get the weather for" + } + } + } + } + } + ] + }, + "endpoint": "/v1/chat/completions", + "model": "databricks-meta-llama-3-3-70b-instruct" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_4c3ae1bf-991d-4266-a12d-b1e97ecbb7a0", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": [ + { + "index": 0, + "id": "call_87aed80e-f856-468f-9523-52db3018d83d", + "function": { + "arguments": "", + "name": "get_weather" + }, + "type": "function" + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326502, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 15, + "prompt_tokens": 682, + "total_tokens": 697, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_4c3ae1bf-991d-4266-a12d-b1e97ecbb7a0", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": [ + { + "index": 0, + "id": null, + "function": { + "arguments": "{ \"city\": \"Tokyo\" }", + "name": null + }, + "type": null + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326502, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 15, + "prompt_tokens": 682, + "total_tokens": 697, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_4c3ae1bf-991d-4266-a12d-b1e97ecbb7a0", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": [ + { + "index": 0, + "id": null, + "function": { + "arguments": "", + "name": null + }, + "type": null + } + ] + }, + "finish_reason": "tool_calls", + "index": 0, + "logprobs": null + } + ], + "created": 1758326502, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 15, + "prompt_tokens": 682, + "total_tokens": 697, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/ecf6f0c51485.json b/tests/integration/recordings/responses/ecf6f0c51485.json new file mode 100644 index 000000000..bfce388b0 --- /dev/null +++ b/tests/integration/recordings/responses/ecf6f0c51485.json @@ -0,0 +1,536 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/chat/completions", + "headers": {}, + "body": { + "model": "databricks-meta-llama-3-3-70b-instruct", + "messages": [ + { + "role": "user", + "content": "What is the name of the US captial?" + } + ], + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "databricks-meta-llama-3-3-70b-instruct" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 2, + "prompt_tokens": 20, + "total_tokens": 22, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "The ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 2, + "prompt_tokens": 20, + "total_tokens": 22, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "capital ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 3, + "prompt_tokens": 20, + "total_tokens": 23, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "of ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 4, + "prompt_tokens": 20, + "total_tokens": 24, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "the ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 5, + "prompt_tokens": 20, + "total_tokens": 25, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "United ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 6, + "prompt_tokens": 20, + "total_tokens": 26, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "States ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 7, + "prompt_tokens": 20, + "total_tokens": 27, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "is ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 8, + "prompt_tokens": 20, + "total_tokens": 28, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "Washington, ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 10, + "prompt_tokens": 20, + "total_tokens": 30, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "D.C. ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 13, + "prompt_tokens": 20, + "total_tokens": 33, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "(short ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 15, + "prompt_tokens": 20, + "total_tokens": 35, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "for ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 16, + "prompt_tokens": 20, + "total_tokens": 36, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "District ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 17, + "prompt_tokens": 20, + "total_tokens": 37, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "of ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 18, + "prompt_tokens": 20, + "total_tokens": 38, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "Columbia).", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 20, + "prompt_tokens": 20, + "total_tokens": 40, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 20, + "prompt_tokens": 20, + "total_tokens": 40, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/ffd7b58fded8.json b/tests/integration/recordings/responses/ffd7b58fded8.json new file mode 100644 index 000000000..266830307 --- /dev/null +++ b/tests/integration/recordings/responses/ffd7b58fded8.json @@ -0,0 +1,1061 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/embeddings", + "headers": {}, + "body": { + "model": "databricks-bge-large-en", + "input": "Test encoding format", + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "databricks-bge-large-en" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.0045623779296875, + 0.005718231201171875, + 0.032257080078125, + 0.0171661376953125, + -0.00754547119140625, + -0.013214111328125, + 0.0330810546875, + -0.016357421875, + 0.017730712890625, + 0.06915283203125, + 0.00887298583984375, + 0.0199432373046875, + 0.01116180419921875, + -0.046417236328125, + -0.0189361572265625, + -0.0311126708984375, + -0.004650115966796875, + -0.025146484375, + -0.021392822265625, + -0.0162200927734375, + -0.00208282470703125, + -0.010833740234375, + -0.0958251953125, + -0.007083892822265625, + -0.023406982421875, + 0.0030002593994140625, + 0.0154266357421875, + 0.004093170166015625, + 0.05731201171875, + 0.0210723876953125, + -0.0110931396484375, + 0.028839111328125, + 0.0003788471221923828, + -0.053924560546875, + 0.0292205810546875, + -0.032012939453125, + 0.041107177734375, + 0.0083465576171875, + -0.03961181640625, + -0.0218658447265625, + -0.007049560546875, + -0.0296173095703125, + 0.0517578125, + -0.03436279296875, + -0.0841064453125, + -0.03570556640625, + 7.337331771850586e-05, + 0.0462646484375, + -0.044097900390625, + -0.0108642578125, + -0.0008502006530761719, + 0.0187225341796875, + 0.019775390625, + 0.028472900390625, + -0.0252685546875, + -0.02337646484375, + 0.00464630126953125, + -0.0022029876708984375, + -0.0548095703125, + 0.042144775390625, + 0.03924560546875, + 0.0107421875, + 0.047821044921875, + -0.0550537109375, + -0.021759033203125, + -0.018035888671875, + -0.016387939453125, + 0.0186614990234375, + 0.00860595703125, + 0.01812744140625, + 0.019317626953125, + 0.043670654296875, + 0.0152130126953125, + -0.00255584716796875, + -0.042694091796875, + 0.00847625732421875, + -0.01114654541015625, + 0.006252288818359375, + -0.0232696533203125, + 0.054168701171875, + -0.024322509765625, + 0.016143798828125, + 0.0294342041015625, + -0.02679443359375, + -0.051727294921875, + -0.06646728515625, + 0.0298004150390625, + -0.00033164024353027344, + 0.047393798828125, + -0.01078033447265625, + -0.03118896484375, + 0.05731201171875, + -0.064453125, + -0.0006422996520996094, + -0.038055419921875, + 0.0127105712890625, + 0.0303192138671875, + -0.010528564453125, + -0.01029205322265625, + 0.01183319091796875, + 0.04827880859375, + 0.05413818359375, + 0.005893707275390625, + 0.049468994140625, + -0.0110931396484375, + 0.029937744140625, + -0.021728515625, + -0.007904052734375, + -0.040008544921875, + 0.0285491943359375, + -0.00038051605224609375, + -0.007091522216796875, + 0.034027099609375, + -0.0097503662109375, + -0.03533935546875, + 0.020660400390625, + 0.01262664794921875, + 0.002063751220703125, + -0.04937744140625, + -0.0301055908203125, + 0.025146484375, + -0.01358795166015625, + -0.00547027587890625, + -0.045196533203125, + -0.0380859375, + -0.007366180419921875, + -0.01308441162109375, + 0.026123046875, + -0.0201416015625, + -0.0130462646484375, + 0.0307464599609375, + 0.01503753662109375, + 0.0250396728515625, + -0.00676727294921875, + -0.0106964111328125, + 0.01372528076171875, + 0.01100921630859375, + -0.0052642822265625, + -0.0034885406494140625, + -0.013427734375, + -0.007450103759765625, + 0.0062713623046875, + -0.038726806640625, + 0.061279296875, + -0.0030994415283203125, + -0.0293731689453125, + 0.0296478271484375, + -0.040130615234375, + -0.0289459228515625, + 0.0172271728515625, + -0.0242767333984375, + -0.00984954833984375, + 0.02734375, + 0.036285400390625, + -0.050445556640625, + -0.0102386474609375, + -0.0005841255187988281, + 0.0013837814331054688, + -0.005401611328125, + 0.04010009765625, + -0.01593017578125, + 0.03472900390625, + -0.0401611328125, + 0.00841522216796875, + -0.02410888671875, + 0.07244873046875, + -0.0196990966796875, + -0.01120758056640625, + 0.01049041748046875, + -0.03643798828125, + 0.01971435546875, + -0.01277923583984375, + 0.01392364501953125, + 0.006435394287109375, + 0.0248870849609375, + 0.0184173583984375, + 0.0633544921875, + -0.014892578125, + 0.01422119140625, + 0.03338623046875, + -0.004886627197265625, + 0.0303955078125, + 0.005817413330078125, + 0.0221710205078125, + 0.00907135009765625, + 0.01255035400390625, + 0.00919342041015625, + -0.038787841796875, + -0.0377197265625, + 0.00921630859375, + 0.0232696533203125, + 0.01026153564453125, + -0.04864501953125, + 0.00725555419921875, + -0.040802001953125, + 0.0010881423950195312, + -0.02532958984375, + 0.01224517822265625, + -0.0156097412109375, + -0.080810546875, + -0.041015625, + 0.0226287841796875, + -0.0206146240234375, + 0.0014286041259765625, + -0.01232147216796875, + -0.047607421875, + 0.0094146728515625, + 0.0447998046875, + 0.0237579345703125, + -0.0027828216552734375, + 0.03643798828125, + -0.0006814002990722656, + -0.02862548828125, + 0.03326416015625, + 0.0236663818359375, + 0.00537109375, + -0.010650634765625, + 0.056182861328125, + -0.0051422119140625, + 0.04248046875, + 0.01482391357421875, + 0.016876220703125, + 0.047760009765625, + 0.0281524658203125, + 0.02252197265625, + -0.0284423828125, + 0.0131683349609375, + 0.044342041015625, + 0.0233306884765625, + -0.01459503173828125, + 0.0181121826171875, + 0.0224456787109375, + 0.01502227783203125, + 0.019500732421875, + 0.034149169921875, + 0.05859375, + 0.066162109375, + 0.06304931640625, + -0.00803375244140625, + 0.0328369140625, + -0.0016307830810546875, + 0.0224151611328125, + 0.0167694091796875, + 0.053070068359375, + 0.0187225341796875, + -0.0283355712890625, + -0.037933349609375, + -0.0215301513671875, + -0.01288604736328125, + 0.01416778564453125, + 0.006793975830078125, + 0.0252227783203125, + 0.072265625, + 0.01428985595703125, + -0.033843994140625, + -0.0274505615234375, + 0.0268096923828125, + 0.056671142578125, + -0.0494384765625, + -0.00928497314453125, + -0.003665924072265625, + -0.033843994140625, + 0.024200439453125, + -0.0146484375, + 0.0013151168823242188, + -0.005157470703125, + 0.007472991943359375, + -0.032867431640625, + 0.029327392578125, + -0.050048828125, + -0.020294189453125, + -0.03271484375, + -0.046783447265625, + -7.486343383789062e-05, + -0.041229248046875, + -0.004116058349609375, + 0.029754638671875, + -0.0709228515625, + -0.02032470703125, + -0.01824951171875, + 0.0032482147216796875, + -0.0091705322265625, + -0.0230255126953125, + 0.0235137939453125, + 0.004863739013671875, + 0.0389404296875, + -0.035491943359375, + -0.00278472900390625, + -0.00879669189453125, + 0.070556640625, + -0.02642822265625, + 0.01132965087890625, + 0.003208160400390625, + -0.02581787109375, + 0.01201629638671875, + -0.024383544921875, + -0.0379638671875, + 0.0225830078125, + 0.0013370513916015625, + -0.019927978515625, + -0.00830841064453125, + 0.00754547119140625, + -0.03985595703125, + -0.011383056640625, + -0.0123291015625, + -0.0054931640625, + 0.04852294921875, + -0.029022216796875, + 0.0283050537109375, + 0.045257568359375, + -0.0316162109375, + 0.025146484375, + 0.0285797119140625, + 0.0135345458984375, + -0.00942230224609375, + 0.057952880859375, + 0.037628173828125, + 3.2067298889160156e-05, + -0.0333251953125, + 0.003559112548828125, + -0.01468658447265625, + -0.0205078125, + 0.0034084320068359375, + -0.0072784423828125, + -0.00235748291015625, + 0.039154052734375, + -0.030426025390625, + -0.05987548828125, + 0.00841522216796875, + -0.03265380859375, + -0.041595458984375, + -0.00830841064453125, + -0.038299560546875, + 0.059814453125, + 0.038360595703125, + 0.0167999267578125, + -0.037628173828125, + 0.01397705078125, + 0.0287628173828125, + 0.031951904296875, + 0.0450439453125, + -0.02288818359375, + -0.01239776611328125, + 0.0302276611328125, + 0.0261993408203125, + 0.01480865478515625, + 0.0168914794921875, + -0.01084136962890625, + -0.0147552490234375, + -0.01104736328125, + 0.0181732177734375, + -0.0027904510498046875, + -0.0005908012390136719, + 0.0006856918334960938, + 0.0017976760864257812, + 0.0231781005859375, + -0.019805908203125, + 0.042388916015625, + 0.04364013671875, + 0.0027675628662109375, + 0.051116943359375, + 0.03814697265625, + 0.0248260498046875, + 0.01023101806640625, + -0.00536346435546875, + -0.0246124267578125, + -0.01381683349609375, + 0.0548095703125, + 0.01177978515625, + -0.045257568359375, + 0.0016565322875976562, + -0.029754638671875, + -0.0070648193359375, + -0.0043792724609375, + -0.004150390625, + -0.015625, + 0.08990478515625, + -0.00554656982421875, + 0.099365234375, + -0.08331298828125, + -0.0361328125, + -0.00835418701171875, + -0.01305389404296875, + 0.04742431640625, + 0.0291595458984375, + 0.025360107421875, + 0.052459716796875, + -0.0218505859375, + -0.03179931640625, + -0.050079345703125, + -0.0108795166015625, + -0.0007262229919433594, + 0.0210113525390625, + -0.01338958740234375, + -0.08001708984375, + -0.03387451171875, + 0.005092620849609375, + 0.024383544921875, + 0.0411376953125, + 0.0234375, + 0.0165252685546875, + -0.0147705078125, + 0.03826904296875, + 0.01358795166015625, + -0.02838134765625, + -0.006862640380859375, + 0.0001767873764038086, + 0.05078125, + -3.612041473388672e-05, + 0.037628173828125, + -0.039794921875, + 0.0001208186149597168, + -0.037353515625, + 0.014190673828125, + 0.0028057098388671875, + 0.01473236083984375, + 0.0026874542236328125, + 0.03466796875, + 0.060577392578125, + 0.038848876953125, + -0.054840087890625, + 0.017333984375, + -0.009033203125, + 0.01354217529296875, + 0.047088623046875, + -0.0484619140625, + -0.04241943359375, + -0.00551605224609375, + 0.01280975341796875, + 0.04815673828125, + 0.0267486572265625, + -0.038848876953125, + -0.02056884765625, + -0.0369873046875, + -0.030181884765625, + 0.0279083251953125, + 0.029510498046875, + -0.0008144378662109375, + -0.002239227294921875, + -0.019287109375, + 0.0287628173828125, + 0.0023288726806640625, + -0.027618408203125, + 0.039215087890625, + 0.0018749237060546875, + -0.0118560791015625, + 0.06396484375, + 0.032135009765625, + -0.0207061767578125, + -0.06610107421875, + 0.0183868408203125, + -0.0731201171875, + 0.0171966552734375, + -0.0289764404296875, + -0.0027141571044921875, + -0.0240936279296875, + -0.0106201171875, + 0.0279388427734375, + 0.04852294921875, + 0.016387939453125, + -0.0041656494140625, + 0.0115509033203125, + -0.0055999755859375, + -0.049957275390625, + -0.0301055908203125, + 0.04046630859375, + 0.01480865478515625, + -0.0251312255859375, + 0.026092529296875, + -0.04248046875, + 0.0012826919555664062, + 0.0021686553955078125, + 0.01482391357421875, + 0.004878997802734375, + 0.0211029052734375, + -0.039276123046875, + 0.01537322998046875, + -0.0216522216796875, + -0.02294921875, + -0.05987548828125, + -0.00550079345703125, + 0.03314208984375, + -0.005123138427734375, + -0.03985595703125, + 0.0122222900390625, + -0.0232391357421875, + -0.0235748291015625, + -0.01403045654296875, + 0.00440216064453125, + 0.0138092041015625, + 0.02685546875, + -0.00202178955078125, + -0.003665924072265625, + -0.0338134765625, + -0.052886962890625, + 0.01947021484375, + -0.0015516281127929688, + -0.028472900390625, + 0.04022216796875, + 0.052886962890625, + -0.0080413818359375, + -0.0281524658203125, + -0.0254364013671875, + 0.0228424072265625, + 0.0091400146484375, + 0.0175018310546875, + -0.034393310546875, + 0.02618408203125, + 0.019256591796875, + -0.0108795166015625, + -0.01514434814453125, + 0.0173187255859375, + -0.04095458984375, + -0.00974273681640625, + 0.005031585693359375, + -0.0024623870849609375, + -0.019256591796875, + -0.04449462890625, + -0.0289764404296875, + 0.029541015625, + -0.00250244140625, + -0.05609130859375, + -0.0467529296875, + 0.006435394287109375, + 0.0203704833984375, + 0.0535888671875, + 0.0172119140625, + -0.03857421875, + -0.0298309326171875, + -0.03564453125, + 0.015716552734375, + -0.0242767333984375, + 0.00946044921875, + -0.0347900390625, + -0.036529541015625, + -0.055450439453125, + 0.0701904296875, + 0.023284912109375, + -0.0300750732421875, + -0.03619384765625, + -0.046905517578125, + 0.0323486328125, + -0.039398193359375, + 0.001804351806640625, + -0.0173187255859375, + 0.03515625, + -0.0179595947265625, + 0.04534912109375, + -0.0157318115234375, + -0.009307861328125, + 0.0285797119140625, + 0.0350341796875, + -0.0025920867919921875, + 0.022308349609375, + -0.038604736328125, + -0.043121337890625, + 0.04620361328125, + -0.0109710693359375, + -0.03363037109375, + -0.060028076171875, + -0.0521240234375, + 0.0216064453125, + -0.053131103515625, + -0.004299163818359375, + -0.0221099853515625, + -0.002719879150390625, + -0.0031280517578125, + 0.0234832763671875, + 0.007503509521484375, + -0.036468505859375, + 0.006206512451171875, + -0.05859375, + 0.060882568359375, + 0.0206756591796875, + 0.03265380859375, + -0.03216552734375, + -0.000324249267578125, + -0.01195526123046875, + -0.0227508544921875, + 0.03997802734375, + -0.032562255859375, + -0.03533935546875, + -0.0016450881958007812, + -0.021759033203125, + 0.0625, + 0.004505157470703125, + 0.01861572265625, + 0.0911865234375, + -0.0258331298828125, + -0.01873779296875, + -0.01904296875, + 0.0251007080078125, + -0.0054779052734375, + -0.05908203125, + 0.0154876708984375, + 0.010986328125, + -0.042999267578125, + -0.00424957275390625, + -0.01611328125, + -0.0228729248046875, + -0.046173095703125, + 0.01299285888671875, + 0.0740966796875, + -0.0253753662109375, + 0.06494140625, + 0.0077056884765625, + -0.056884765625, + -0.0228118896484375, + 0.01288604736328125, + 0.0018978118896484375, + -0.0255584716796875, + 0.02862548828125, + -0.0004138946533203125, + 0.023681640625, + 0.0687255859375, + -0.05438232421875, + -0.0059051513671875, + 0.004825592041015625, + 0.057891845703125, + 0.0231170654296875, + -0.0108795166015625, + 0.01291656494140625, + 0.01824951171875, + -0.0643310546875, + -0.0465087890625, + -0.01512908935546875, + 0.0025043487548828125, + -0.0255584716796875, + -0.0139007568359375, + -0.0004246234893798828, + 0.01033782958984375, + 0.01084136962890625, + 0.00827789306640625, + 0.01337432861328125, + -0.024932861328125, + 0.03436279296875, + -0.00165557861328125, + -0.01009368896484375, + -0.01104736328125, + 0.00923919677734375, + 0.038330078125, + -0.0545654296875, + 0.037841796875, + -0.045654296875, + -0.02166748046875, + -0.04827880859375, + 0.0274505615234375, + 0.019439697265625, + 0.06573486328125, + 0.032562255859375, + 0.03961181640625, + 0.0010061264038085938, + 0.10302734375, + -0.01001739501953125, + 0.008819580078125, + -0.0105438232421875, + -0.041351318359375, + -0.0504150390625, + -0.0278472900390625, + 0.009124755859375, + 0.0023956298828125, + 0.0011882781982421875, + -0.04632568359375, + 0.02911376953125, + 0.0296478271484375, + -0.0016002655029296875, + 0.0670166015625, + -0.033294677734375, + 0.00479888916015625, + -0.02880859375, + -0.0002942085266113281, + 0.0008320808410644531, + -0.01067352294921875, + -0.020965576171875, + 0.019256591796875, + -0.020172119140625, + -0.0709228515625, + -0.01097869873046875, + 0.0233306884765625, + -0.0018224716186523438, + -0.0133209228515625, + -0.0400390625, + 0.0053558349609375, + 0.018035888671875, + -0.0238800048828125, + -0.001575469970703125, + -0.0615234375, + 0.009552001953125, + 0.01849365234375, + 0.0014886856079101562, + -0.0181732177734375, + -0.00417327880859375, + 0.04052734375, + 0.009063720703125, + 0.009796142578125, + -0.01515960693359375, + -0.01507568359375, + 0.0033111572265625, + -0.031036376953125, + 0.016021728515625, + 0.0264892578125, + 0.032135009765625, + 0.0018596649169921875, + -0.022979736328125, + -0.0278472900390625, + -0.00021076202392578125, + -0.044464111328125, + 0.0278778076171875, + 0.05078125, + -0.00783538818359375, + -0.00374603271484375, + -0.0111541748046875, + -0.0110015869140625, + -0.058807373046875, + 0.0151824951171875, + 0.00042319297790527344, + -0.017486572265625, + 0.044952392578125, + -0.0146484375, + -0.0107574462890625, + 0.046539306640625, + -0.0031185150146484375, + 0.0247955322265625, + -0.039520263671875, + -0.01019287109375, + 0.01393890380859375, + -0.0186767578125, + 0.0030517578125, + -0.00572967529296875, + 0.0276641845703125, + 0.0204925537109375, + -0.002101898193359375, + 0.015838623046875, + 0.0147552490234375, + 0.02105712890625, + -0.072509765625, + -0.042205810546875, + 0.0036258697509765625, + 0.005817413330078125, + 0.036529541015625, + 0.009979248046875, + -0.011260986328125, + -0.03179931640625, + -0.00010073184967041016, + 0.01532745361328125, + -0.0222930908203125, + -0.004119873046875, + -0.033447265625, + -0.040679931640625, + 0.0404052734375, + -0.037872314453125, + 0.01169586181640625, + -0.013916015625, + -0.041473388671875, + -0.001163482666015625, + -0.0073699951171875, + 0.0004177093505859375, + 0.0144500732421875, + 0.0229949951171875, + 0.0199127197265625, + 0.04730224609375, + -0.0408935546875, + 0.0009679794311523438, + 0.0197906494140625, + -0.0003771781921386719, + -0.057373046875, + 0.00334930419921875, + 0.009918212890625, + 0.035491943359375, + 0.0261993408203125, + 0.01050567626953125, + -0.052398681640625, + 0.01149749755859375, + -0.047637939453125, + -0.018951416015625, + 0.0206756591796875, + 0.0162811279296875, + -0.020538330078125, + 0.019287109375, + -0.047607421875, + 0.020294189453125, + 0.02783203125, + 0.0042877197265625, + 0.038970947265625, + -0.00925445556640625, + 0.01374053955078125, + 0.034820556640625, + 0.01418304443359375, + -0.019073486328125, + 0.0133514404296875, + -0.0017557144165039062, + 0.0234222412109375, + 0.044464111328125, + -0.020050048828125, + -0.0272979736328125, + 0.0257415771484375, + 0.0452880859375, + 0.033355712890625, + -0.0243377685546875, + 0.05853271484375, + 0.011749267578125, + -0.028839111328125, + -0.032135009765625, + 0.03631591796875, + 0.031219482421875, + 0.00884246826171875, + -0.006389617919921875, + -0.0206146240234375, + -0.025115966796875, + -0.00982666015625, + -0.0279388427734375, + -0.0104217529296875, + -0.03179931640625, + -0.040008544921875, + -0.017669677734375, + -0.0068511962890625, + 0.05462646484375, + -0.031768798828125, + -0.035369873046875, + -0.0163116455078125, + 0.0169830322265625, + 0.028900146484375, + 0.04638671875, + -0.03118896484375, + -0.003936767578125, + -0.0009298324584960938, + 0.0111236572265625, + 0.01134490966796875, + 0.03179931640625, + -0.0256805419921875, + 0.015625, + -0.04705810546875, + 0.033416748046875, + 0.00556182861328125, + -0.0183868408203125, + 0.00826263427734375, + 0.003082275390625, + -0.04827880859375, + 0.00426483154296875, + 0.0035648345947265625, + -0.01548004150390625, + 0.045379638671875, + -0.042205810546875, + 0.00409698486328125, + -0.0662841796875, + 0.005184173583984375, + -0.043487548828125, + 0.02398681640625, + -0.0020046234130859375, + -0.034637451171875, + 0.016632080078125, + 0.034759521484375, + -0.0283050537109375, + -0.0300750732421875, + 0.0186767578125, + 0.057098388671875, + 0.0123748779296875, + 0.072509765625, + -0.00934600830078125, + -0.040130615234375, + 0.00887298583984375, + 0.01251983642578125, + -0.0232696533203125, + -0.005542755126953125, + -0.004871368408203125, + -0.01358795166015625, + 0.0193634033203125, + -0.0301055908203125, + -0.027618408203125, + 0.01788330078125, + 0.019287109375, + -0.01617431640625, + -0.040435791015625, + 0.00432586669921875, + 0.01448822021484375, + -0.04547119140625, + 0.0235137939453125, + 0.03662109375, + 0.0606689453125, + 0.024688720703125, + -0.0204620361328125, + -0.0369873046875, + -0.00920867919921875, + -0.033538818359375, + -0.050567626953125, + 0.0017223358154296875, + -0.0301055908203125, + -0.01139068603515625, + -0.037567138671875, + -0.004940032958984375, + -0.0150909423828125, + -0.04656982421875, + 0.01102447509765625, + -0.0236053466796875, + 0.000415802001953125, + 0.029083251953125, + 0.0030460357666015625, + 0.02117919921875, + -0.0281219482421875, + -0.005443572998046875, + -0.01180267333984375, + 0.073486328125, + 0.001255035400390625, + 0.057891845703125, + 0.04217529296875, + -0.00998687744140625, + 0.015716552734375, + -0.03643798828125, + 0.00765228271484375, + 0.0200347900390625, + -0.020263671875, + 0.0112457275390625, + 0.010528564453125, + -0.02532958984375, + -0.0303955078125, + -0.00418853759765625, + 0.054107666015625, + -0.0703125, + -0.0185546875, + -0.056976318359375, + -0.0245208740234375, + -0.0221710205078125, + -0.0261383056640625, + -0.037628173828125, + 0.038360595703125, + -0.033050537109375, + -0.0007295608520507812, + -0.0044097900390625, + -0.043914794921875, + 0.2049560546875, + 0.0296783447265625, + 0.039825439453125, + -0.006969451904296875, + 0.017364501953125, + 0.0546875, + -0.0163421630859375, + -0.031707763671875, + -0.03057861328125, + -0.005191802978515625, + 0.034820556640625, + -0.0191650390625, + -5.3882598876953125e-05, + 0.033935546875, + -0.0012979507446289062, + 0.02667236328125, + -0.056610107421875, + -0.027801513671875, + 0.01141357421875, + -0.00223541259765625, + -0.049835205078125, + 0.0016870498657226562, + -0.00138092041015625, + 0.03118896484375, + 0.025238037109375, + -0.01535797119140625, + 0.0743408203125, + 0.0242462158203125, + 0.0235137939453125, + -0.041473388671875, + 0.0350341796875, + 0.0013580322265625, + 0.01250457763671875, + 0.0247650146484375, + -0.00829315185546875, + 0.0233154296875, + -0.022735595703125, + -0.039093017578125, + -0.00594329833984375, + -0.016693115234375, + -0.0021724700927734375, + -0.033172607421875, + 0.0234832763671875, + -0.0285797119140625, + -0.034881591796875, + 0.044464111328125, + 0.0047607421875, + 0.036163330078125, + 0.03411865234375, + 0.0023326873779296875, + 0.022796630859375, + -0.01108551025390625, + 0.04705810546875, + -0.0540771484375, + -0.032470703125, + 0.0148773193359375, + -0.035675048828125, + 0.00919342041015625, + 0.040069580078125, + 0.0131988525390625, + -0.048736572265625, + 0.05609130859375, + -0.0157318115234375, + -0.039031982421875, + -0.05462646484375, + 0.0135498046875, + -0.01078033447265625, + 0.05426025390625, + -0.01316070556640625, + -0.0184326171875, + -0.0252227783203125, + 0.02825927734375, + 0.024139404296875, + -0.00836944580078125, + -0.0002372264862060547, + 0.046630859375, + -0.0166473388671875, + 0.01148223876953125, + -0.0114288330078125, + -0.039459228515625, + 0.01456451416015625, + -0.046478271484375, + 0.02886962890625, + 0.00788116455078125, + 0.00789642333984375, + 0.05322265625, + -0.007289886474609375, + 0.01366424560546875, + -0.03369140625, + 0.040069580078125, + 0.044708251953125, + -0.00591278076171875, + -0.016326904296875, + 0.020965576171875, + -0.0248870849609375 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "bge-large-en-v1.5", + "object": "list", + "usage": { + "prompt_tokens": 5, + "total_tokens": 5 + }, + "id": "f6acf878-03d6-4245-a55e-e01b68ddd8c8" + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/suites.py b/tests/integration/suites.py index 354dc1f4c..f526bae51 100644 --- a/tests/integration/suites.py +++ b/tests/integration/suites.py @@ -108,6 +108,14 @@ SETUP_DEFINITIONS: dict[str, Setup] = { "embedding_model": "together/togethercomputer/m2-bert-80M-32k-retrieval", }, ), + "databricks": Setup( + name="databricks", + description="Databricks models", + defaults={ + "text_model": "databricks/databricks-meta-llama-3-3-70b-instruct", + "embedding_model": "databricks/databricks-bge-large-en", + }, + ), "fireworks": Setup( name="fireworks", description="Fireworks provider with a text model", From ce7a3b4dff728322b12a85bc79795b539b3ecbc0 Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Tue, 23 Sep 2025 16:26:00 -0400 Subject: [PATCH 06/27] feat: update Cerebras inference provider to support dynamic model listing (#3481) # What does this PR do? - update Cerebras to use OpenAIMixin - enable openai completions tests - enable openai chat completions tests - disable with n > 1 tests - add recording for --setup cerebras --subdirs inference --pattern openai ## Test Plan `./scripts/integration-tests.sh --stack-config server:ci-tests --setup cerebras --subdirs inference --pattern openai` ``` tests/integration/inference/test_openai_completion.py::test_openai_completion_non_streaming[txt=cerebras/llama-3.3-70b-inference:completion:sanity] instantiating llama_stack_client Port 8321 is already in use, assuming server is already running... llama_stack_client instantiated in 0.053s PASSED [ 2%] tests/integration/inference/test_openai_completion.py::test_openai_completion_non_streaming_suffix[txt=cerebras/llama-3.3-70b-inference:completion:suffix] SKIPPED (Suffix is not supported for the model: cerebras/llama-3.3-70b.) [ 4%] tests/integration/inference/test_openai_completion.py::test_openai_completion_streaming[txt=cerebras/llama-3.3-70b-inference:completion:sanity] PASSED [ 6%] tests/integration/inference/test_openai_completion.py::test_openai_completion_prompt_logprobs[txt=cerebras/llama-3.3-70b-1] SKIPPED (Model cerebras/llama-3.3-70b hosted by remote::cerebras doesn't support vllm extra_body parameters.) [ 8%] tests/integration/inference/test_openai_completion.py::test_openai_completion_guided_choice[txt=cerebras/llama-3.3-70b] SKIPPED (Model cerebras/llama-3.3-70b hosted by remote::cerebras doesn't support vllm extra_body parameters.) [ 10%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming[openai_client-txt=cerebras/llama-3.3-70b-inference:chat_completion:non_streaming_01] PASSED [ 12%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming[openai_client-txt=cerebras/llama-3.3-70b-inference:chat_completion:streaming_01] PASSED [ 14%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming_with_n[openai_client-txt=cerebras/llama-3.3-70b-inference:chat_completion:streaming_01] SKIPPED (Model cerebras/llama-3.3-70b hosted by remote::cere...) [ 17%] tests/integration/inference/test_openai_completion.py::test_inference_store[openai_client-txt=cerebras/llama-3.3-70b-True] PASSED [ 19%] tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[openai_client-txt=cerebras/llama-3.3-70b-True] PASSED [ 21%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming_with_file[txt=cerebras/llama-3.3-70b] SKIPPED (Model cerebras/llama-3.3-70b hosted by remote::cerebras doesn't support chat completion calls wit...) [ 23%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_single_string[openai_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 25%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_multiple_strings[openai_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 27%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_encoding_format_float[openai_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 29%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_dimensions[openai_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 31%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_user_parameter[openai_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 34%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_empty_list_error[openai_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 36%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_invalid_model_error[openai_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 38%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_different_inputs_different_outputs[openai_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 40%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_encoding_format_base64[openai_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 42%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_base64_batch_processing[openai_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 44%] tests/integration/inference/test_openai_completion.py::test_openai_completion_prompt_logprobs[txt=cerebras/llama-3.3-70b-0] SKIPPED (Model cerebras/llama-3.3-70b hosted by remote::cerebras doesn't support vllm extra_body parameters.) [ 46%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming[openai_client-txt=cerebras/llama-3.3-70b-inference:chat_completion:non_streaming_02] PASSED [ 48%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming[openai_client-txt=cerebras/llama-3.3-70b-inference:chat_completion:streaming_02] PASSED [ 51%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming_with_n[openai_client-txt=cerebras/llama-3.3-70b-inference:chat_completion:streaming_02] SKIPPED (Model cerebras/llama-3.3-70b hosted by remote::cere...) [ 53%] tests/integration/inference/test_openai_completion.py::test_inference_store[openai_client-txt=cerebras/llama-3.3-70b-False] PASSED [ 55%] tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[openai_client-txt=cerebras/llama-3.3-70b-False] PASSED [ 57%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_single_string[llama_stack_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 59%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_multiple_strings[llama_stack_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 61%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_encoding_format_float[llama_stack_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 63%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_dimensions[llama_stack_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 65%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_user_parameter[llama_stack_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 68%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_empty_list_error[llama_stack_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 70%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_invalid_model_error[llama_stack_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 72%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_different_inputs_different_outputs[llama_stack_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 74%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_encoding_format_base64[llama_stack_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 76%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_base64_batch_processing[llama_stack_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 78%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming[client_with_models-txt=cerebras/llama-3.3-70b-inference:chat_completion:non_streaming_01] PASSED [ 80%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming[client_with_models-txt=cerebras/llama-3.3-70b-inference:chat_completion:streaming_01] PASSED [ 82%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming_with_n[client_with_models-txt=cerebras/llama-3.3-70b-inference:chat_completion:streaming_01] SKIPPED (Model cerebras/llama-3.3-70b hosted by remote:...) [ 85%] tests/integration/inference/test_openai_completion.py::test_inference_store[client_with_models-txt=cerebras/llama-3.3-70b-True] PASSED [ 87%] tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[client_with_models-txt=cerebras/llama-3.3-70b-True] PASSED [ 89%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming[client_with_models-txt=cerebras/llama-3.3-70b-inference:chat_completion:non_streaming_02] PASSED [ 91%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming[client_with_models-txt=cerebras/llama-3.3-70b-inference:chat_completion:streaming_02] PASSED [ 93%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming_with_n[client_with_models-txt=cerebras/llama-3.3-70b-inference:chat_completion:streaming_02] SKIPPED (Model cerebras/llama-3.3-70b hosted by remote:...) [ 95%] tests/integration/inference/test_openai_completion.py::test_inference_store[client_with_models-txt=cerebras/llama-3.3-70b-False] PASSED [ 97%] tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[client_with_models-txt=cerebras/llama-3.3-70b-False] PASSED [100%] =================================================================================================================== slowest 10 durations ==================================================================================================================== 0.37s call tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming[openai_client-txt=cerebras/llama-3.3-70b-inference:chat_completion:non_streaming_01] 0.34s call tests/integration/inference/test_openai_completion.py::test_inference_store[openai_client-txt=cerebras/llama-3.3-70b-False] 0.18s call tests/integration/inference/test_openai_completion.py::test_inference_store[client_with_models-txt=cerebras/llama-3.3-70b-True] 0.17s setup tests/integration/inference/test_openai_completion.py::test_openai_completion_non_streaming[txt=cerebras/llama-3.3-70b-inference:completion:sanity] 0.15s call tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[client_with_models-txt=cerebras/llama-3.3-70b-True] 0.13s call tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[openai_client-txt=cerebras/llama-3.3-70b-True] 0.12s call tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[client_with_models-txt=cerebras/llama-3.3-70b-False] 0.12s call tests/integration/inference/test_openai_completion.py::test_inference_store[openai_client-txt=cerebras/llama-3.3-70b-True] 0.12s call tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[openai_client-txt=cerebras/llama-3.3-70b-False] 0.08s call tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming[client_with_models-txt=cerebras/llama-3.3-70b-inference:chat_completion:streaming_02] ================================================================================================================== short test summary info ================================================================================================================== SKIPPED [1] tests/integration/inference/test_openai_completion.py:75: Suffix is not supported for the model: cerebras/llama-3.3-70b. SKIPPED [3] tests/integration/inference/test_openai_completion.py:123: Model cerebras/llama-3.3-70b hosted by remote::cerebras doesn't support vllm extra_body parameters. SKIPPED [4] tests/integration/inference/test_openai_completion.py:103: Model cerebras/llama-3.3-70b hosted by remote::cerebras doesn't support n param. SKIPPED [1] tests/integration/inference/test_openai_completion.py:129: Model cerebras/llama-3.3-70b hosted by remote::cerebras doesn't support chat completion calls with base64 encoded files. SKIPPED [2] tests/integration/inference/test_openai_embeddings.py:90: embedding_model_id empty - skipping test SKIPPED [2] tests/integration/inference/test_openai_embeddings.py:112: embedding_model_id empty - skipping test SKIPPED [2] tests/integration/inference/test_openai_embeddings.py:136: embedding_model_id empty - skipping test SKIPPED [2] tests/integration/inference/test_openai_embeddings.py:154: embedding_model_id empty - skipping test SKIPPED [2] tests/integration/inference/test_openai_embeddings.py:175: embedding_model_id empty - skipping test SKIPPED [2] tests/integration/inference/test_openai_embeddings.py:195: embedding_model_id empty - skipping test SKIPPED [2] tests/integration/inference/test_openai_embeddings.py:206: embedding_model_id empty - skipping test SKIPPED [2] tests/integration/inference/test_openai_embeddings.py:217: embedding_model_id empty - skipping test SKIPPED [2] tests/integration/inference/test_openai_embeddings.py:244: embedding_model_id empty - skipping test SKIPPED [2] tests/integration/inference/test_openai_embeddings.py:278: embedding_model_id empty - skipping test ================================================================================================= 18 passed, 29 skipped, 50 deselected, 4 warnings in 3.02s ================================================================================================= ``` --- .../providers/inference/remote_cerebras.md | 2 +- .../remote/inference/cerebras/cerebras.py | 23 +- .../remote/inference/cerebras/config.py | 4 +- .../inference/test_openai_completion.py | 4 +- .../recordings/responses/0547d0909f24.json | 53 + .../recordings/responses/0648374e43e7.json | 146 +++ .../recordings/responses/0d3290adae1d.json | 93 ++ .../recordings/responses/2983cc1d79f0.json | 742 ++++++++++++ .../recordings/responses/3cdb5cab6ce6.json | 66 ++ .../recordings/responses/50a8dc5b8ece.json | 612 ++++++++++ .../recordings/responses/a1c5bf09ea53.json | 66 ++ .../recordings/responses/af6ca03dcbc3.json | 1025 +++++++++++++++++ .../recordings/responses/b459f403a5ae.json | 66 ++ .../recordings/responses/eefb4206a4a9.json | 378 ++++++ .../models-bd032f995f2a-af43cc69.json | 96 ++ tests/integration/suites.py | 7 + 16 files changed, 3370 insertions(+), 13 deletions(-) create mode 100644 tests/integration/recordings/responses/0547d0909f24.json create mode 100644 tests/integration/recordings/responses/0648374e43e7.json create mode 100644 tests/integration/recordings/responses/0d3290adae1d.json create mode 100644 tests/integration/recordings/responses/2983cc1d79f0.json create mode 100644 tests/integration/recordings/responses/3cdb5cab6ce6.json create mode 100644 tests/integration/recordings/responses/50a8dc5b8ece.json create mode 100644 tests/integration/recordings/responses/a1c5bf09ea53.json create mode 100644 tests/integration/recordings/responses/af6ca03dcbc3.json create mode 100644 tests/integration/recordings/responses/b459f403a5ae.json create mode 100644 tests/integration/recordings/responses/eefb4206a4a9.json create mode 100644 tests/integration/recordings/responses/models-bd032f995f2a-af43cc69.json diff --git a/docs/source/providers/inference/remote_cerebras.md b/docs/source/providers/inference/remote_cerebras.md index 7aa03dd0b..3bd3dda25 100644 --- a/docs/source/providers/inference/remote_cerebras.md +++ b/docs/source/providers/inference/remote_cerebras.md @@ -9,7 +9,7 @@ Cerebras inference provider for running models on Cerebras Cloud platform. | Field | Type | Required | Default | Description | |-------|------|----------|---------|-------------| | `base_url` | `` | No | https://api.cerebras.ai | Base URL for the Cerebras API | -| `api_key` | `pydantic.types.SecretStr \| None` | No | | Cerebras API Key | +| `api_key` | `` | No | | Cerebras API Key | ## Sample Configuration diff --git a/llama_stack/providers/remote/inference/cerebras/cerebras.py b/llama_stack/providers/remote/inference/cerebras/cerebras.py index 5e07c49ee..6947dbc87 100644 --- a/llama_stack/providers/remote/inference/cerebras/cerebras.py +++ b/llama_stack/providers/remote/inference/cerebras/cerebras.py @@ -5,6 +5,7 @@ # the root directory of this source tree. from collections.abc import AsyncGenerator +from urllib.parse import urljoin from cerebras.cloud.sdk import AsyncCerebras @@ -35,14 +36,13 @@ from llama_stack.providers.utils.inference.model_registry import ( ModelRegistryHelper, ) from llama_stack.providers.utils.inference.openai_compat import ( - OpenAIChatCompletionToLlamaStackMixin, - OpenAICompletionToLlamaStackMixin, get_sampling_options, process_chat_completion_response, process_chat_completion_stream_response, process_completion_response, process_completion_stream_response, ) +from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from llama_stack.providers.utils.inference.prompt_adapter import ( chat_completion_request_to_prompt, completion_request_to_prompt, @@ -53,10 +53,9 @@ from .models import MODEL_ENTRIES class CerebrasInferenceAdapter( + OpenAIMixin, ModelRegistryHelper, Inference, - OpenAIChatCompletionToLlamaStackMixin, - OpenAICompletionToLlamaStackMixin, ): def __init__(self, config: CerebrasImplConfig) -> None: ModelRegistryHelper.__init__( @@ -66,11 +65,17 @@ class CerebrasInferenceAdapter( self.config = config # TODO: make this use provider data, etc. like other providers - self.client = AsyncCerebras( + self._cerebras_client = AsyncCerebras( base_url=self.config.base_url, api_key=self.config.api_key.get_secret_value(), ) + def get_api_key(self) -> str: + return self.config.api_key.get_secret_value() + + def get_base_url(self) -> str: + return urljoin(self.config.base_url, "v1") + async def initialize(self) -> None: return @@ -107,14 +112,14 @@ class CerebrasInferenceAdapter( async def _nonstream_completion(self, request: CompletionRequest) -> CompletionResponse: params = await self._get_params(request) - r = await self.client.completions.create(**params) + r = await self._cerebras_client.completions.create(**params) return process_completion_response(r) async def _stream_completion(self, request: CompletionRequest) -> AsyncGenerator: params = await self._get_params(request) - stream = await self.client.completions.create(**params) + stream = await self._cerebras_client.completions.create(**params) async for chunk in process_completion_stream_response(stream): yield chunk @@ -156,14 +161,14 @@ class CerebrasInferenceAdapter( async def _nonstream_chat_completion(self, request: CompletionRequest) -> CompletionResponse: params = await self._get_params(request) - r = await self.client.completions.create(**params) + r = await self._cerebras_client.completions.create(**params) return process_chat_completion_response(r, request) async def _stream_chat_completion(self, request: CompletionRequest) -> AsyncGenerator: params = await self._get_params(request) - stream = await self.client.completions.create(**params) + stream = await self._cerebras_client.completions.create(**params) async for chunk in process_chat_completion_stream_response(stream, request): yield chunk diff --git a/llama_stack/providers/remote/inference/cerebras/config.py b/llama_stack/providers/remote/inference/cerebras/config.py index 699f6a1ef..519bd9119 100644 --- a/llama_stack/providers/remote/inference/cerebras/config.py +++ b/llama_stack/providers/remote/inference/cerebras/config.py @@ -20,8 +20,8 @@ class CerebrasImplConfig(BaseModel): default=os.environ.get("CEREBRAS_BASE_URL", DEFAULT_BASE_URL), description="Base URL for the Cerebras API", ) - api_key: SecretStr | None = Field( - default=os.environ.get("CEREBRAS_API_KEY"), + api_key: SecretStr = Field( + default=SecretStr(os.environ.get("CEREBRAS_API_KEY")), description="Cerebras API Key", ) diff --git a/tests/integration/inference/test_openai_completion.py b/tests/integration/inference/test_openai_completion.py index 8ca3860c3..931c144af 100644 --- a/tests/integration/inference/test_openai_completion.py +++ b/tests/integration/inference/test_openai_completion.py @@ -40,7 +40,6 @@ def skip_if_model_doesnt_support_openai_completion(client_with_models, model_id) "inline::sentence-transformers", "inline::vllm", "remote::bedrock", - "remote::cerebras", "remote::databricks", # Technically Nvidia does support OpenAI completions, but none of their hosted models # support both completions and chat completions endpoint and all the Llama models are @@ -98,6 +97,8 @@ def skip_if_doesnt_support_n(client_with_models, model_id): # the entered value was 2. Update the candidateCount value and try again.', 'status': 'INVALID_ARGUMENT'} "remote::tgi", # TGI ignores n param silently "remote::together", # `n` > 1 is not supported when streaming tokens. Please disable `stream` + # Error code 400 - {'message': '"n" > 1 is not currently supported', 'type': 'invalid_request_error', 'param': 'n', 'code': 'wrong_api_format'} + "remote::cerebras", "remote::databricks", # Bad request: parameter "n" must be equal to 1 for streaming mode ): pytest.skip(f"Model {model_id} hosted by {provider.provider_type} doesn't support n param.") @@ -110,6 +111,7 @@ def skip_if_model_doesnt_support_openai_chat_completion(client_with_models, mode "inline::sentence-transformers", "inline::vllm", "remote::bedrock", + "remote::databricks", "remote::cerebras", "remote::runpod", "remote::watsonx", # watsonx returns 404 when hitting the /openai/v1 endpoint diff --git a/tests/integration/recordings/responses/0547d0909f24.json b/tests/integration/recordings/responses/0547d0909f24.json new file mode 100644 index 000000000..a44e2f9dd --- /dev/null +++ b/tests/integration/recordings/responses/0547d0909f24.json @@ -0,0 +1,53 @@ +{ + "request": { + "method": "POST", + "url": "https://api.cerebras.ai/v1/v1/completions", + "headers": {}, + "body": { + "model": "llama-3.3-70b", + "prompt": "Respond to this question and explain your answer. Complete the sentence using one word: Roses are red, violets are ", + "stream": false, + "extra_body": {} + }, + "endpoint": "/v1/completions", + "model": "llama-3.3-70b" + }, + "response": { + "body": { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-6438a448-bbbd-4da1-af88-19390676b0e9", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "text": " blue, sugar is white, but my heart is ________________________.\nA) black\nB) pink\nC) blank\nD) broken\nMy answer is D) broken. This is because the traditional romantic poem has a positive tone until it comes to the heart, which represents the speaker's emotional state. The word \"broken\" shows that the speaker is hurting, which adds a element of sadness to the poem. This is a typical way to express sorrow or longing in poetry.\nThe best answer is D.<|eot_id|>" + } + ], + "created": 1758191351, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": { + "completion_tokens": 105, + "prompt_tokens": 26, + "total_tokens": 131, + "completion_tokens_details": null, + "prompt_tokens_details": { + "audio_tokens": null, + "cached_tokens": 0 + } + }, + "time_info": { + "queue_time": 0.00016155, + "prompt_time": 0.001595551, + "completion_time": 0.107480394, + "total_time": 0.11038637161254883, + "created": 1758191351 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/0648374e43e7.json b/tests/integration/recordings/responses/0648374e43e7.json new file mode 100644 index 000000000..96e4966ca --- /dev/null +++ b/tests/integration/recordings/responses/0648374e43e7.json @@ -0,0 +1,146 @@ +{ + "request": { + "method": "POST", + "url": "https://api.cerebras.ai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "llama-3.3-70b", + "messages": [ + { + "role": "user", + "content": "What's the weather in Tokyo? Use the get_weather function to get the weather." + } + ], + "stream": true, + "tools": [ + { + "type": "function", + "function": { + "name": "get_weather", + "description": "Get the weather in a given city", + "parameters": { + "type": "object", + "properties": { + "city": { + "type": "string", + "description": "The city to get the weather for" + } + } + } + } + } + ] + }, + "endpoint": "/v1/chat/completions", + "model": "llama-3.3-70b" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-8b6a9499-1a5f-46dc-96b7-3d2b71eecd99", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191362, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-8b6a9499-1a5f-46dc-96b7-3d2b71eecd99", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": [ + { + "index": 0, + "id": "439c86fe5", + "function": { + "arguments": "{\"city\": \"Tokyo\"}", + "name": "get_weather" + }, + "type": "function" + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191362, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-8b6a9499-1a5f-46dc-96b7-3d2b71eecd99", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": "tool_calls", + "index": 0, + "logprobs": null + } + ], + "created": 1758191362, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": { + "completion_tokens": 12, + "prompt_tokens": 248, + "total_tokens": 260, + "completion_tokens_details": null, + "prompt_tokens_details": { + "audio_tokens": null, + "cached_tokens": 0 + } + }, + "time_info": { + "queue_time": 0.00016941, + "prompt_time": 0.007276727, + "completion_time": 0.00388514, + "total_time": 0.013146162033081055, + "created": 1758191362 + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/0d3290adae1d.json b/tests/integration/recordings/responses/0d3290adae1d.json new file mode 100644 index 000000000..b428c7ec5 --- /dev/null +++ b/tests/integration/recordings/responses/0d3290adae1d.json @@ -0,0 +1,93 @@ +{ + "request": { + "method": "POST", + "url": "https://api.cerebras.ai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "llama-3.3-70b", + "messages": [ + { + "role": "user", + "content": "What's the weather in Tokyo? Use the get_weather function to get the weather." + } + ], + "stream": false, + "tools": [ + { + "type": "function", + "function": { + "name": "get_weather", + "description": "Get the weather in a given city", + "parameters": { + "type": "object", + "properties": { + "city": { + "type": "string", + "description": "The city to get the weather for" + } + } + } + } + } + ] + }, + "endpoint": "/v1/chat/completions", + "model": "llama-3.3-70b" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "chatcmpl-6228def9-c13d-4d7a-9029-e2c638a16f1b", + "choices": [ + { + "finish_reason": "tool_calls", + "index": 0, + "logprobs": null, + "message": { + "content": null, + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [ + { + "id": "1c40cbc30", + "function": { + "arguments": "{\"city\": \"Tokyo\"}", + "name": "get_weather" + }, + "type": "function" + } + ] + } + } + ], + "created": 1758191364, + "model": "llama-3.3-70b", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": { + "completion_tokens": 12, + "prompt_tokens": 248, + "total_tokens": 260, + "completion_tokens_details": null, + "prompt_tokens_details": { + "audio_tokens": null, + "cached_tokens": 0 + } + }, + "time_info": { + "queue_time": 0.00041449, + "prompt_time": 0.007237483, + "completion_time": 0.003803105, + "total_time": 0.013348102569580078, + "created": 1758191364 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/2983cc1d79f0.json b/tests/integration/recordings/responses/2983cc1d79f0.json new file mode 100644 index 000000000..c7a5e90ef --- /dev/null +++ b/tests/integration/recordings/responses/2983cc1d79f0.json @@ -0,0 +1,742 @@ +{ + "request": { + "method": "POST", + "url": "https://api.cerebras.ai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "llama-3.3-70b", + "messages": [ + { + "role": "user", + "content": "Hello, world!" + } + ], + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "llama-3.3-70b" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": "Hello", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": "!", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " It", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": "'s", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " nice", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " to", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " meet", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " you", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " Is", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " there", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " something", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " I", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " can", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " help", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " you", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " with", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " or", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " would", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " you", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " like", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " to", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " chat", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": "?", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": { + "completion_tokens": 25, + "prompt_tokens": 39, + "total_tokens": 64, + "completion_tokens_details": null, + "prompt_tokens_details": { + "audio_tokens": null, + "cached_tokens": 0 + } + }, + "time_info": { + "queue_time": 0.00030481, + "prompt_time": 0.002094315, + "completion_time": 0.011856632, + "total_time": 0.016039371490478516, + "created": 1758191361 + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/3cdb5cab6ce6.json b/tests/integration/recordings/responses/3cdb5cab6ce6.json new file mode 100644 index 000000000..1640b256c --- /dev/null +++ b/tests/integration/recordings/responses/3cdb5cab6ce6.json @@ -0,0 +1,66 @@ +{ + "request": { + "method": "POST", + "url": "https://api.cerebras.ai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "llama-3.3-70b", + "messages": [ + { + "role": "user", + "content": "Which planet do humans live on?" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "llama-3.3-70b" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "chatcmpl-839aab91-21a7-4ed9-b224-d22e524eda37", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "Humans live on Earth.", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": null + } + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": { + "completion_tokens": 6, + "prompt_tokens": 42, + "total_tokens": 48, + "completion_tokens_details": null, + "prompt_tokens_details": { + "audio_tokens": null, + "cached_tokens": 0 + } + }, + "time_info": { + "queue_time": 0.00028033, + "prompt_time": 0.001467015, + "completion_time": 0.007069593, + "total_time": 0.010509490966796875, + "created": 1758191360 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/50a8dc5b8ece.json b/tests/integration/recordings/responses/50a8dc5b8ece.json new file mode 100644 index 000000000..2c3776f0c --- /dev/null +++ b/tests/integration/recordings/responses/50a8dc5b8ece.json @@ -0,0 +1,612 @@ +{ + "request": { + "method": "POST", + "url": "https://api.cerebras.ai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "llama-3.3-70b", + "messages": [ + { + "role": "user", + "content": "What is the name of the US captial?" + } + ], + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "llama-3.3-70b" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": "The", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " name", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " of", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " US", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " capital", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " Washington", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " D", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": ".C", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " (", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": "short", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " for", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " District", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " of", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " Columbia", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": ").", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": { + "completion_tokens": 20, + "prompt_tokens": 45, + "total_tokens": 65, + "completion_tokens_details": null, + "prompt_tokens_details": { + "audio_tokens": null, + "cached_tokens": 0 + } + }, + "time_info": { + "queue_time": 0.000509825, + "prompt_time": 0.002284829, + "completion_time": 0.008430168, + "total_time": 0.012710094451904297, + "created": 1758191363 + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/a1c5bf09ea53.json b/tests/integration/recordings/responses/a1c5bf09ea53.json new file mode 100644 index 000000000..83b1ecfa4 --- /dev/null +++ b/tests/integration/recordings/responses/a1c5bf09ea53.json @@ -0,0 +1,66 @@ +{ + "request": { + "method": "POST", + "url": "https://api.cerebras.ai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "llama-3.3-70b", + "messages": [ + { + "role": "user", + "content": "Hello, world!" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "llama-3.3-70b" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "chatcmpl-1dcfef1f-f955-4158-a1fc-0c2643b60e4e", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "Hello! It's nice to meet you. Is there something I can help you with or would you like to chat?", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": null + } + } + ], + "created": 1758191362, + "model": "llama-3.3-70b", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": { + "completion_tokens": 25, + "prompt_tokens": 39, + "total_tokens": 64, + "completion_tokens_details": null, + "prompt_tokens_details": { + "audio_tokens": null, + "cached_tokens": 0 + } + }, + "time_info": { + "queue_time": 0.083508803, + "prompt_time": 0.003352167, + "completion_time": 0.011506416, + "total_time": 0.09965348243713379, + "created": 1758191362 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/af6ca03dcbc3.json b/tests/integration/recordings/responses/af6ca03dcbc3.json new file mode 100644 index 000000000..69b27aa8b --- /dev/null +++ b/tests/integration/recordings/responses/af6ca03dcbc3.json @@ -0,0 +1,1025 @@ +{ + "request": { + "method": "POST", + "url": "https://api.cerebras.ai/v1/v1/completions", + "headers": {}, + "body": { + "model": "llama-3.3-70b", + "prompt": "Respond to this question and explain your answer. Complete the sentence using one word: Roses are red, violets are ", + "max_tokens": 50, + "stream": true, + "extra_body": {} + }, + "endpoint": "/v1/completions", + "model": "llama-3.3-70b" + }, + "response": { + "body": [ + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " __" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "____________" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "_." + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "\n\n\n" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "##" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " Step" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " " + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "1" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": ":" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " Identify" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " the" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " context" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " of" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " the" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " sentence" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "\n" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "The" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " sentence" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " is" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " completing" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " a" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " well" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "-known" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " rhyme" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " that" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " describes" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " the" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " colors" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " associated" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " with" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " flowers" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": ".\n\n" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "##" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " Step" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " " + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "2" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": ":" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " Recall" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " the" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " traditional" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " completion" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " of" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " the" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " rhyme" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "\n" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "The" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " traditional" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " rhyme" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " states" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "," + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": "length", + "index": 0, + "logprobs": null, + "text": "" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": { + "completion_tokens": 50, + "prompt_tokens": 26, + "total_tokens": 76, + "completion_tokens_details": null, + "prompt_tokens_details": { + "audio_tokens": null, + "cached_tokens": 0 + } + }, + "time_info": { + "queue_time": 0.000103421, + "prompt_time": 0.001700221, + "completion_time": 0.050781803, + "total_time": 0.05472397804260254, + "created": 1758191353 + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/b459f403a5ae.json b/tests/integration/recordings/responses/b459f403a5ae.json new file mode 100644 index 000000000..8e4791d0e --- /dev/null +++ b/tests/integration/recordings/responses/b459f403a5ae.json @@ -0,0 +1,66 @@ +{ + "request": { + "method": "POST", + "url": "https://api.cerebras.ai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "llama-3.3-70b", + "messages": [ + { + "role": "user", + "content": "Which planet has rings around it with a name starting with letter S?" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "llama-3.3-70b" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "chatcmpl-e9e83004-bcd0-47f8-97c3-8e3d789a6573", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "The planet with rings around it that starts with the letter S is Saturn. Saturn's rings are one of the most prominent and well-known ring systems in our solar system.", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": null + } + } + ], + "created": 1758191362, + "model": "llama-3.3-70b", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": { + "completion_tokens": 35, + "prompt_tokens": 49, + "total_tokens": 84, + "completion_tokens_details": null, + "prompt_tokens_details": { + "audio_tokens": null, + "cached_tokens": 0 + } + }, + "time_info": { + "queue_time": 0.00091223, + "prompt_time": 0.00239449, + "completion_time": 0.013951346, + "total_time": 0.01872849464416504, + "created": 1758191362 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/eefb4206a4a9.json b/tests/integration/recordings/responses/eefb4206a4a9.json new file mode 100644 index 000000000..b6fa01c96 --- /dev/null +++ b/tests/integration/recordings/responses/eefb4206a4a9.json @@ -0,0 +1,378 @@ +{ + "request": { + "method": "POST", + "url": "https://api.cerebras.ai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "llama-3.3-70b", + "messages": [ + { + "role": "user", + "content": "What's the name of the Sun in latin?" + } + ], + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "llama-3.3-70b" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": "The", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": " Latin", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": " name", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": " for", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": " Sun", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": "Sol", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": "\".", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": { + "completion_tokens": 11, + "prompt_tokens": 45, + "total_tokens": 56, + "completion_tokens_details": null, + "prompt_tokens_details": { + "audio_tokens": null, + "cached_tokens": 0 + } + }, + "time_info": { + "queue_time": 9.281e-05, + "prompt_time": 0.002694912, + "completion_time": 0.003747467, + "total_time": 0.008375167846679688, + "created": 1758191360 + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/models-bd032f995f2a-af43cc69.json b/tests/integration/recordings/responses/models-bd032f995f2a-af43cc69.json new file mode 100644 index 000000000..031a676c0 --- /dev/null +++ b/tests/integration/recordings/responses/models-bd032f995f2a-af43cc69.json @@ -0,0 +1,96 @@ +{ + "request": { + "method": "POST", + "url": "https://api.cerebras.ai/v1/v1/models", + "headers": {}, + "body": {}, + "endpoint": "/v1/models", + "model": "" + }, + "response": { + "body": [ + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "llama-4-maverick-17b-128e-instruct", + "created": 0, + "object": "model", + "owned_by": "Cerebras" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "llama-4-scout-17b-16e-instruct", + "created": 0, + "object": "model", + "owned_by": "Cerebras" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "qwen-3-235b-a22b-instruct-2507", + "created": 0, + "object": "model", + "owned_by": "Cerebras" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "llama3.1-8b", + "created": 0, + "object": "model", + "owned_by": "Cerebras" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "qwen-3-32b", + "created": 0, + "object": "model", + "owned_by": "Cerebras" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "gpt-oss-120b", + "created": 0, + "object": "model", + "owned_by": "Cerebras" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "qwen-3-235b-a22b-thinking-2507", + "created": 0, + "object": "model", + "owned_by": "Cerebras" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "llama-3.3-70b", + "created": 0, + "object": "model", + "owned_by": "Cerebras" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "qwen-3-coder-480b", + "created": 0, + "object": "model", + "owned_by": "Cerebras" + } + } + ], + "is_streaming": false + } +} diff --git a/tests/integration/suites.py b/tests/integration/suites.py index f526bae51..649cd1c2e 100644 --- a/tests/integration/suites.py +++ b/tests/integration/suites.py @@ -108,6 +108,13 @@ SETUP_DEFINITIONS: dict[str, Setup] = { "embedding_model": "together/togethercomputer/m2-bert-80M-32k-retrieval", }, ), + "cerebras": Setup( + name="cerebras", + description="Cerebras models", + defaults={ + "text_model": "cerebras/llama-3.3-70b", + }, + ), "databricks": Setup( name="databricks", description="Databricks models", From 2f58d87c22fb1e8d5dd04a90dcb1e6d84111151a Mon Sep 17 00:00:00 2001 From: Nathan Weinberg <31703736+nathan-weinberg@users.noreply.github.com> Date: Tue, 23 Sep 2025 17:30:24 -0400 Subject: [PATCH 07/27] docs: fix typos in RAG docs (#3530) Signed-off-by: Nathan Weinberg --- docs/source/building_applications/rag.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/building_applications/rag.md b/docs/source/building_applications/rag.md index 802859e87..9390c0310 100644 --- a/docs/source/building_applications/rag.md +++ b/docs/source/building_applications/rag.md @@ -272,9 +272,9 @@ B64_ENCODED_IMAGE = base64.b64encode( "https://raw.githubusercontent.com/meta-llama/llama-stack/refs/heads/main/docs/_static/llama-stack.png" ).content ) -RAGDocuemnt( +RAGDocument( document_id="num-4", content={"type": "image", "image": {"data": B64_ENCODED_IMAGE}}, ) ``` -for more strongly typed interaction use the typed dicts found [here](https://github.com/meta-llama/llama-stack-client-python/blob/38cd91c9e396f2be0bec1ee96a19771582ba6f17/src/llama_stack_client/types/shared_params/document.py). +For more strongly typed interaction use the typed dicts found [here](https://github.com/meta-llama/llama-stack-client-python/blob/38cd91c9e396f2be0bec1ee96a19771582ba6f17/src/llama_stack_client/types/shared_params/document.py). From 48a551ecbcd8139ebb28b8b222382335311ae87d Mon Sep 17 00:00:00 2001 From: ehhuang Date: Wed, 24 Sep 2025 10:18:33 -0700 Subject: [PATCH 08/27] chore(perf): run guidellm benchmarks (#3421) # What does this PR do? - Mostly AI-generated scripts to run guidellm (https://github.com/vllm-project/guidellm) benchmarks on k8s setup - Stack is using image built from main on 9/11 ## Test Plan See updated README.md --- benchmarking/k8s-benchmark/README.md | 191 ++++++++---- benchmarking/k8s-benchmark/benchmark.py | 265 ---------------- .../k8s-benchmark/profile_running_server.sh | 52 ---- ...chmark-stack-s1-sw1-v1-20250922-103408.txt | 171 ++++++++++ ...chmark-stack-s1-sw2-v1-20250922-104457.txt | 171 ++++++++++ ...chmark-stack-s1-sw4-v1-20250922-105539.txt | 171 ++++++++++ ...ellm-benchmark-vllm-v1-20250922-111127.txt | 170 ++++++++++ .../vllm_replica1_benchmark_results.png | Bin 0 -> 575562 bytes benchmarking/k8s-benchmark/run-benchmark.sh | 148 --------- .../k8s-benchmark/scripts/generate_charts.py | 294 ++++++++++++++++++ .../scripts/run-all-benchmarks.sh | 103 ++++++ .../scripts/run-guidellm-benchmark.sh | 219 +++++++++++++ .../k8s-benchmark/stack-k8s.yaml.template | 6 +- pyproject.toml | 1 + 14 files changed, 1436 insertions(+), 526 deletions(-) delete mode 100644 benchmarking/k8s-benchmark/benchmark.py delete mode 100755 benchmarking/k8s-benchmark/profile_running_server.sh create mode 100644 benchmarking/k8s-benchmark/results/guidellm-benchmark-stack-s1-sw1-v1-20250922-103408.txt create mode 100644 benchmarking/k8s-benchmark/results/guidellm-benchmark-stack-s1-sw2-v1-20250922-104457.txt create mode 100644 benchmarking/k8s-benchmark/results/guidellm-benchmark-stack-s1-sw4-v1-20250922-105539.txt create mode 100644 benchmarking/k8s-benchmark/results/guidellm-benchmark-vllm-v1-20250922-111127.txt create mode 100644 benchmarking/k8s-benchmark/results/vllm_replica1_benchmark_results.png delete mode 100755 benchmarking/k8s-benchmark/run-benchmark.sh create mode 100755 benchmarking/k8s-benchmark/scripts/generate_charts.py create mode 100755 benchmarking/k8s-benchmark/scripts/run-all-benchmarks.sh create mode 100755 benchmarking/k8s-benchmark/scripts/run-guidellm-benchmark.sh diff --git a/benchmarking/k8s-benchmark/README.md b/benchmarking/k8s-benchmark/README.md index 3b0d0c4db..9b5e140f0 100644 --- a/benchmarking/k8s-benchmark/README.md +++ b/benchmarking/k8s-benchmark/README.md @@ -26,6 +26,7 @@ The benchmark suite measures critical performance indicators: - **Throughput**: Requests per second under sustained load - **Latency Distribution**: P50, P95, P99 response times - **Time to First Token (TTFT)**: Critical for streaming applications +- **Inter-Token Latency (ITL)**: Token generation speed for streaming - **Error Rates**: Request failures and timeout analysis This data enables data-driven architectural decisions and performance optimization efforts. @@ -49,49 +50,148 @@ kubectl get pods # Should see: llama-stack-benchmark-server, vllm-server, etc. ``` +## Benchmark Results + +We use [GuideLLM](https://github.com/neuralmagic/guidellm) against our k8s deployment for comprehensive performance testing. + + +### Performance - 1 vLLM Replica + +We vary the number of Llama Stack replicas with 1 vLLM replica and compare performance below. + +![Performance - 1 vLLM Replica](results/vllm_replica1_benchmark_results.png) + + +For full results see the `benchmarking/k8s-benchmark/results/` directory. + + ## Quick Start -### Basic Benchmarks +Follow the instructions below to run benchmarks similar to the ones above. -**Benchmark Llama Stack (default):** +### Comprehensive Benchmark Suite + +**Run all benchmarks with different cluster configurations:** ```bash -./run-benchmark.sh +./scripts/run-all-benchmarks.sh ``` -**Benchmark vLLM direct:** +This script will automatically: +- Scale deployments to different configurations +- Run benchmarks for each setup +- Generate output files with meaningful names that include setup information + +### Individual Benchmarks + +**Benchmark Llama Stack (runs against current cluster setup):** ```bash -./run-benchmark.sh --target vllm +./scripts/run-guidellm-benchmark.sh --target stack ``` -### Custom Configuration - -**Extended benchmark with high concurrency:** +**Benchmark vLLM direct (runs against current cluster setup):** ```bash -./run-benchmark.sh --target vllm --duration 120 --concurrent 20 +./scripts/run-guidellm-benchmark.sh --target vllm ``` -**Short test run:** +**Benchmark with custom parameters:** ```bash -./run-benchmark.sh --target stack --duration 30 --concurrent 5 +./scripts/run-guidellm-benchmark.sh --target stack --max-seconds 120 --prompt-tokens 1024 --output-tokens 512 ``` +**Benchmark with custom output file:** +```bash +./scripts/run-guidellm-benchmark.sh --target stack --output-file results/my-custom-benchmark.txt +``` + +### Generating Charts + +Once the benchmarks are run, you can generate performance charts from benchmark results: + +```bash +uv run ./scripts/generate_charts.py +``` + +This loads runs in the `results/` directory and creates visualizations comparing different configurations and replica counts. + +## Benchmark Workflow + +The benchmark suite is organized into two main scripts with distinct responsibilities: + +### 1. `run-all-benchmarks.sh` - Orchestration & Scaling +- **Purpose**: Manages different cluster configurations and orchestrates benchmark runs +- **Responsibilities**: + - Scales Kubernetes deployments (vLLM replicas, Stack replicas, worker counts) + - Runs benchmarks for each configuration + - Generates meaningful output filenames with setup information +- **Use case**: Running comprehensive performance testing across multiple configurations + +### 2. `run-guidellm-benchmark.sh` - Single Benchmark Execution +- **Purpose**: Executes a single benchmark against the current cluster state +- **Responsibilities**: + - Runs GuideLLM benchmark with configurable parameters + - Accepts custom output file paths + - No cluster scaling - benchmarks current deployment state +- **Use case**: Testing specific configurations or custom scenarios + +### Typical Workflow +1. **Comprehensive Testing**: Use `run-all-benchmarks.sh` to automatically test multiple configurations +2. **Custom Testing**: Use `run-guidellm-benchmark.sh` for specific parameter testing or manual cluster configurations +3. **Analysis**: Use `generate_charts.py` to visualize results from either approach + ## Command Reference -### run-benchmark.sh Options +### run-all-benchmarks.sh + +Orchestrates multiple benchmark runs with different cluster configurations. This script: +- Automatically scales deployments before each benchmark +- Runs benchmarks against the configured cluster setup +- Generates meaningfully named output files ```bash -./run-benchmark.sh [options] +./scripts/run-all-benchmarks.sh +``` + +**Configuration**: Edit the `configs` array in the script to customize benchmark configurations: +```bash +# Each line: (target, stack_replicas, vllm_replicas, stack_workers) +configs=( + "stack 1 1 1" + "stack 1 1 2" + "stack 1 1 4" + "vllm 1 1 -" +) +``` + +**Output files**: Generated with setup information in filename: +- Stack: `guidellm-benchmark-stack-s{replicas}-sw{workers}-v{vllm_replicas}-{timestamp}.txt` +- vLLM: `guidellm-benchmark-vllm-v{vllm_replicas}-{timestamp}.txt` + +### run-guidellm-benchmark.sh Options + +Runs a single benchmark against the current cluster setup (no scaling). + +```bash +./scripts/run-guidellm-benchmark.sh [options] Options: -t, --target Target to benchmark (default: stack) - -d, --duration Duration in seconds (default: 60) - -c, --concurrent Number of concurrent users (default: 10) + -s, --max-seconds Maximum duration in seconds (default: 60) + -p, --prompt-tokens Number of prompt tokens (default: 512) + -o, --output-tokens Number of output tokens (default: 256) + -r, --rate-type Rate type (default: concurrent) + -c, --rate Rate (default: 1,2,4,8,16,32,64,128) + --output-file Output file path (default: auto-generated) + --stack-deployment Name of the stack deployment (default: llama-stack-benchmark-server) + --vllm-deployment Name of the vllm deployment (default: vllm-server) + --stack-url URL of the stack service (default: http://llama-stack-benchmark-service:8323/v1/openai) -h, --help Show help message Examples: - ./run-benchmark.sh --target vllm # Benchmark vLLM direct - ./run-benchmark.sh --target stack # Benchmark Llama Stack - ./run-benchmark.sh -t vllm -d 120 -c 20 # vLLM with 120s, 20 users + ./scripts/run-guidellm-benchmark.sh --target vllm # Benchmark vLLM direct + ./scripts/run-guidellm-benchmark.sh --target stack # Benchmark Llama Stack (default) + ./scripts/run-guidellm-benchmark.sh -t vllm -s 60 -p 512 -o 256 # vLLM with custom parameters + ./scripts/run-guidellm-benchmark.sh --output-file results/my-benchmark.txt # Specify custom output file + ./scripts/run-guidellm-benchmark.sh --stack-deployment my-stack-server # Use custom stack deployment name ``` ## Local Testing @@ -100,55 +200,30 @@ Examples: For local development without Kubernetes: -**1. Start OpenAI mock server:** -```bash -uv run python openai-mock-server.py --port 8080 -``` - -**2. Run benchmark against mock server:** -```bash -uv run python benchmark.py \ - --base-url http://localhost:8080/v1 \ - --model mock-inference \ - --duration 30 \ - --concurrent 5 -``` - -**3. Test against local vLLM server:** -```bash -# If you have vLLM running locally on port 8000 -uv run python benchmark.py \ - --base-url http://localhost:8000/v1 \ - --model meta-llama/Llama-3.2-3B-Instruct \ - --duration 30 \ - --concurrent 5 -``` - -**4. Profile the running server:** -```bash -./profile_running_server.sh -``` - - - -### OpenAI Mock Server +**1. (Optional) Start Mock OpenAI server:** +There is a simple mock OpenAI server if you don't have an inference provider available. The `openai-mock-server.py` provides: - **OpenAI-compatible API** for testing without real models - **Configurable streaming delay** via `STREAM_DELAY_SECONDS` env var - **Consistent responses** for reproducible benchmarks - **Lightweight testing** without GPU requirements -**Mock server usage:** ```bash uv run python openai-mock-server.py --port 8080 ``` -The mock server is also deployed in k8s as `openai-mock-service:8080` and can be used by changing the Llama Stack configuration to use the `mock-vllm-inference` provider. +**2. Start Stack server:** +```bash +LLAMA_STACK_CONFIG=benchmarking/k8s-benchmark/stack_run_config.yaml uv run uvicorn llama_stack.core.server.server:create_app --port 8321 --workers 4 --factory +``` -## Files in this Directory - -- `benchmark.py` - Core benchmark script with async streaming support -- `run-benchmark.sh` - Main script with target selection and configuration -- `openai-mock-server.py` - Mock OpenAI API server for local testing -- `README.md` - This documentation file +**3. Run GuideLLM benchmark:** +```bash +GUIDELLM__PREFERRED_ROUTE="chat_completions" uv run guidellm benchmark run \ + --target "http://localhost:8321/v1/openai/v1" \ + --model "meta-llama/Llama-3.2-3B-Instruct" \ + --rate-type sweep \ + --max-seconds 60 \ + --data "prompt_tokens=256,output_tokens=128" --output-path='output.html' +``` diff --git a/benchmarking/k8s-benchmark/benchmark.py b/benchmarking/k8s-benchmark/benchmark.py deleted file mode 100644 index d5e34aa23..000000000 --- a/benchmarking/k8s-benchmark/benchmark.py +++ /dev/null @@ -1,265 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -""" -Simple benchmark script for Llama Stack with OpenAI API compatibility. -""" - -import argparse -import asyncio -import os -import random -import statistics -import time - -import aiohttp - - -class BenchmarkStats: - def __init__(self): - self.response_times = [] - self.ttft_times = [] - self.chunks_received = [] - self.errors = [] - self.success_count = 0 - self.total_requests = 0 - self.concurrent_users = 0 - self.start_time = None - self.end_time = None - self._lock = asyncio.Lock() - - async def add_result(self, response_time: float, chunks: int, ttft: float = None, error: str = None): - async with self._lock: - self.total_requests += 1 - if error: - self.errors.append(error) - else: - self.success_count += 1 - self.response_times.append(response_time) - self.chunks_received.append(chunks) - if ttft is not None: - self.ttft_times.append(ttft) - - def print_summary(self): - if not self.response_times: - print("No successful requests to report") - if self.errors: - print(f"Total errors: {len(self.errors)}") - print("First 5 errors:") - for error in self.errors[:5]: - print(f" {error}") - return - - total_time = self.end_time - self.start_time - success_rate = (self.success_count / self.total_requests) * 100 - - print(f"\n{'=' * 60}") - print("BENCHMARK RESULTS") - - print("\nResponse Time Statistics:") - print(f" Mean: {statistics.mean(self.response_times):.3f}s") - print(f" Median: {statistics.median(self.response_times):.3f}s") - print(f" Min: {min(self.response_times):.3f}s") - print(f" Max: {max(self.response_times):.3f}s") - - if len(self.response_times) > 1: - print(f" Std Dev: {statistics.stdev(self.response_times):.3f}s") - - percentiles = [50, 90, 95, 99] - sorted_times = sorted(self.response_times) - print("\nPercentiles:") - for p in percentiles: - idx = int(len(sorted_times) * p / 100) - 1 - idx = max(0, min(idx, len(sorted_times) - 1)) - print(f" P{p}: {sorted_times[idx]:.3f}s") - - if self.ttft_times: - print("\nTime to First Token (TTFT) Statistics:") - print(f" Mean: {statistics.mean(self.ttft_times):.3f}s") - print(f" Median: {statistics.median(self.ttft_times):.3f}s") - print(f" Min: {min(self.ttft_times):.3f}s") - print(f" Max: {max(self.ttft_times):.3f}s") - - if len(self.ttft_times) > 1: - print(f" Std Dev: {statistics.stdev(self.ttft_times):.3f}s") - - sorted_ttft = sorted(self.ttft_times) - print("\nTTFT Percentiles:") - for p in percentiles: - idx = int(len(sorted_ttft) * p / 100) - 1 - idx = max(0, min(idx, len(sorted_ttft) - 1)) - print(f" P{p}: {sorted_ttft[idx]:.3f}s") - - if self.chunks_received: - print("\nStreaming Statistics:") - print(f" Mean chunks per response: {statistics.mean(self.chunks_received):.1f}") - print(f" Total chunks received: {sum(self.chunks_received)}") - - print(f"{'=' * 60}") - print(f"Total time: {total_time:.2f}s") - print(f"Concurrent users: {self.concurrent_users}") - print(f"Total requests: {self.total_requests}") - print(f"Successful requests: {self.success_count}") - print(f"Failed requests: {len(self.errors)}") - print(f"Success rate: {success_rate:.1f}%") - print(f"Requests per second: {self.success_count / total_time:.2f}") - - if self.errors: - print("\nErrors (showing first 5):") - for error in self.errors[:5]: - print(f" {error}") - - -class LlamaStackBenchmark: - def __init__(self, base_url: str, model_id: str): - self.base_url = base_url.rstrip("/") - self.model_id = model_id - self.headers = {"Content-Type": "application/json"} - self.test_messages = [ - [{"role": "user", "content": "Hi"}], - [{"role": "user", "content": "What is the capital of France?"}], - [{"role": "user", "content": "Explain quantum physics in simple terms."}], - [{"role": "user", "content": "Write a short story about a robot learning to paint."}], - [ - {"role": "user", "content": "What is machine learning?"}, - {"role": "assistant", "content": "Machine learning is a subset of AI..."}, - {"role": "user", "content": "Can you give me a practical example?"}, - ], - ] - - async def make_async_streaming_request(self) -> tuple[float, int, float | None, str | None]: - """Make a single async streaming chat completion request.""" - messages = random.choice(self.test_messages) - payload = {"model": self.model_id, "messages": messages, "stream": True, "max_tokens": 100} - - start_time = time.time() - chunks_received = 0 - ttft = None - error = None - - session = aiohttp.ClientSession() - - try: - async with session.post( - f"{self.base_url}/chat/completions", - headers=self.headers, - json=payload, - timeout=aiohttp.ClientTimeout(total=30), - ) as response: - if response.status == 200: - async for line in response.content: - if line: - line_str = line.decode("utf-8").strip() - if line_str.startswith("data: "): - chunks_received += 1 - if ttft is None: - ttft = time.time() - start_time - if line_str == "data: [DONE]": - break - - if chunks_received == 0: - error = "No streaming chunks received" - else: - text = await response.text() - error = f"HTTP {response.status}: {text[:100]}" - - except Exception as e: - error = f"Request error: {str(e)}" - finally: - await session.close() - - response_time = time.time() - start_time - return response_time, chunks_received, ttft, error - - async def run_benchmark(self, duration: int, concurrent_users: int) -> BenchmarkStats: - """Run benchmark using async requests for specified duration.""" - stats = BenchmarkStats() - stats.concurrent_users = concurrent_users - stats.start_time = time.time() - - print(f"Starting benchmark: {duration}s duration, {concurrent_users} concurrent users") - print(f"Target URL: {self.base_url}/chat/completions") - print(f"Model: {self.model_id}") - - connector = aiohttp.TCPConnector(limit=concurrent_users) - async with aiohttp.ClientSession(connector=connector): - - async def worker(worker_id: int): - """Worker that sends requests sequentially until canceled.""" - request_count = 0 - while True: - try: - response_time, chunks, ttft, error = await self.make_async_streaming_request() - await stats.add_result(response_time, chunks, ttft, error) - request_count += 1 - - except asyncio.CancelledError: - break - except Exception as e: - await stats.add_result(0, 0, None, f"Worker {worker_id} error: {str(e)}") - - # Progress reporting task - async def progress_reporter(): - last_report_time = time.time() - while True: - try: - await asyncio.sleep(1) # Report every second - if time.time() >= last_report_time + 10: # Report every 10 seconds - elapsed = time.time() - stats.start_time - print( - f"Completed: {stats.total_requests} requests in {elapsed:.1f}s, RPS: {stats.total_requests / elapsed:.1f}" - ) - last_report_time = time.time() - except asyncio.CancelledError: - break - - # Spawn concurrent workers - tasks = [asyncio.create_task(worker(i)) for i in range(concurrent_users)] - progress_task = asyncio.create_task(progress_reporter()) - tasks.append(progress_task) - - # Wait for duration then cancel all tasks - await asyncio.sleep(duration) - - for task in tasks: - task.cancel() - - # Wait for all tasks to complete - await asyncio.gather(*tasks, return_exceptions=True) - - stats.end_time = time.time() - return stats - - -def main(): - parser = argparse.ArgumentParser(description="Llama Stack Benchmark Tool") - parser.add_argument( - "--base-url", - default=os.getenv("BENCHMARK_BASE_URL", "http://localhost:8000/v1/openai/v1"), - help="Base URL for the API (default: http://localhost:8000/v1/openai/v1)", - ) - parser.add_argument( - "--model", default=os.getenv("INFERENCE_MODEL", "test-model"), help="Model ID to use for requests" - ) - parser.add_argument("--duration", type=int, default=60, help="Duration in seconds to run benchmark (default: 60)") - parser.add_argument("--concurrent", type=int, default=10, help="Number of concurrent users (default: 10)") - - args = parser.parse_args() - - benchmark = LlamaStackBenchmark(args.base_url, args.model) - - try: - stats = asyncio.run(benchmark.run_benchmark(args.duration, args.concurrent)) - stats.print_summary() - - except KeyboardInterrupt: - print("\nBenchmark interrupted by user") - except Exception as e: - print(f"Benchmark failed: {e}") - - -if __name__ == "__main__": - main() diff --git a/benchmarking/k8s-benchmark/profile_running_server.sh b/benchmarking/k8s-benchmark/profile_running_server.sh deleted file mode 100755 index 65d620583..000000000 --- a/benchmarking/k8s-benchmark/profile_running_server.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash - -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -# Script to profile an already running Llama Stack server -# Usage: ./profile_running_server.sh [duration_seconds] [output_file] - -DURATION=${1:-60} # Default 60 seconds -OUTPUT_FILE=${2:-"llama_stack_profile"} # Default output file - -echo "Looking for running Llama Stack server..." - -# Find the server PID -SERVER_PID=$(ps aux | grep "llama_stack.core.server.server" | grep -v grep | awk '{print $2}' | head -1) - - -if [ -z "$SERVER_PID" ]; then - echo "Error: No running Llama Stack server found" - echo "Please start your server first with:" - echo "LLAMA_STACK_LOGGING=\"all=ERROR\" MOCK_INFERENCE_URL=http://localhost:8080 SAFETY_MODEL=llama-guard3:1b uv run --with llama-stack python -m llama_stack.core.server.server docs/source/distributions/k8s-benchmark/stack_run_config.yaml" - exit 1 -fi - -echo "Found Llama Stack server with PID: $SERVER_PID" - -# Start py-spy profiling -echo "Starting py-spy profiling for ${DURATION} seconds..." -echo "Output will be saved to: ${OUTPUT_FILE}.svg" -echo "" -echo "You can now run your load test..." -echo "" - -# Get the full path to py-spy -PYSPY_PATH=$(which py-spy) - -# Check if running as root, if not, use sudo -if [ "$EUID" -ne 0 ]; then - echo "py-spy requires root permissions on macOS. Running with sudo..." - sudo "$PYSPY_PATH" record -o "${OUTPUT_FILE}.svg" -d ${DURATION} -p $SERVER_PID -else - "$PYSPY_PATH" record -o "${OUTPUT_FILE}.svg" -d ${DURATION} -p $SERVER_PID -fi - -echo "" -echo "Profiling completed! Results saved to: ${OUTPUT_FILE}.svg" -echo "" -echo "To view the flame graph:" -echo "open ${OUTPUT_FILE}.svg" diff --git a/benchmarking/k8s-benchmark/results/guidellm-benchmark-stack-s1-sw1-v1-20250922-103408.txt b/benchmarking/k8s-benchmark/results/guidellm-benchmark-stack-s1-sw1-v1-20250922-103408.txt new file mode 100644 index 000000000..0f707a968 --- /dev/null +++ b/benchmarking/k8s-benchmark/results/guidellm-benchmark-stack-s1-sw1-v1-20250922-103408.txt @@ -0,0 +1,171 @@ +Collecting uv + Downloading uv-0.8.19-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (11 kB) +Downloading uv-0.8.19-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (20.9 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 20.9/20.9 MB 144.3 MB/s eta 0:00:00 +Installing collected packages: uv +Successfully installed uv-0.8.19 +WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv + +[notice] A new release of pip is available: 24.0 -> 25.2 +[notice] To update, run: pip install --upgrade pip +Using Python 3.11.13 environment at: /usr/local +Resolved 61 packages in 551ms +Downloading pillow (6.3MiB) +Downloading hf-xet (3.0MiB) +Downloading tokenizers (3.1MiB) +Downloading pygments (1.2MiB) +Downloading pandas (11.8MiB) +Downloading aiohttp (1.7MiB) +Downloading pydantic-core (1.9MiB) +Downloading numpy (16.2MiB) +Downloading transformers (11.1MiB) +Downloading pyarrow (40.8MiB) + Downloading pydantic-core + Downloading aiohttp + Downloading tokenizers + Downloading hf-xet + Downloading pygments + Downloading pillow + Downloading numpy + Downloading pandas + Downloading transformers + Downloading pyarrow +Prepared 61 packages in 1.23s +Installed 61 packages in 114ms + + aiohappyeyeballs==2.6.1 + + aiohttp==3.12.15 + + aiosignal==1.4.0 + + annotated-types==0.7.0 + + anyio==4.10.0 + + attrs==25.3.0 + + certifi==2025.8.3 + + charset-normalizer==3.4.3 + + click==8.1.8 + + datasets==4.1.1 + + dill==0.4.0 + + filelock==3.19.1 + + frozenlist==1.7.0 + + fsspec==2025.9.0 + + ftfy==6.3.1 + + guidellm==0.3.0 + + h11==0.16.0 + + h2==4.3.0 + + hf-xet==1.1.10 + + hpack==4.1.0 + + httpcore==1.0.9 + + httpx==0.28.1 + + huggingface-hub==0.35.0 + + hyperframe==6.1.0 + + idna==3.10 + + loguru==0.7.3 + + markdown-it-py==4.0.0 + + mdurl==0.1.2 + + multidict==6.6.4 + + multiprocess==0.70.16 + + numpy==2.3.3 + + packaging==25.0 + + pandas==2.3.2 + + pillow==11.3.0 + + propcache==0.3.2 + + protobuf==6.32.1 + + pyarrow==21.0.0 + + pydantic==2.11.9 + + pydantic-core==2.33.2 + + pydantic-settings==2.10.1 + + pygments==2.19.2 + + python-dateutil==2.9.0.post0 + + python-dotenv==1.1.1 + + pytz==2025.2 + + pyyaml==6.0.2 + + regex==2025.9.18 + + requests==2.32.5 + + rich==14.1.0 + + safetensors==0.6.2 + + six==1.17.0 + + sniffio==1.3.1 + + tokenizers==0.22.1 + + tqdm==4.67.1 + + transformers==4.56.2 + + typing-extensions==4.15.0 + + typing-inspection==0.4.1 + + tzdata==2025.2 + + urllib3==2.5.0 + + wcwidth==0.2.14 + + xxhash==3.5.0 + + yarl==1.20.1 +Using Python 3.11.13 environment at: /usr/local +Audited 1 package in 3ms +Note: Environment variable`HF_TOKEN` is set and is the current active token independently from the token you've just configured. +Creating backend... +Backend openai_http connected to http://llama-stack-benchmark-service:8323/v1/openai for model meta-llama/Llama-3.2-3B-Instruct. +Creating request loader... +Created loader with 1000 unique requests from prompt_tokens=512,output_tokens=256. + + +╭─ Benchmarks ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ [17:34:30] ⠋ 100% concurrent@1 (complete) Req: 0.3 req/s, 3.32s Lat, 1.0 Conc, 18 Comp, 1 Inc, 0 Err │ +│ Tok: 74.0 gen/s, 238.6 tot/s, 40.2ms TTFT, 13.4ms ITL, 546 Prompt, 246 Gen │ +│ [17:35:35] ⠋ 100% concurrent@2 (complete) Req: 0.6 req/s, 3.46s Lat, 2.0 Conc, 34 Comp, 2 Inc, 0 Err │ +│ Tok: 139.6 gen/s, 454.0 tot/s, 48.0ms TTFT, 14.1ms ITL, 546 Prompt, 243 Gen │ +│ [17:36:40] ⠋ 100% concurrent@4 (complete) Req: 1.1 req/s, 3.44s Lat, 3.9 Conc, 68 Comp, 4 Inc, 0 Err │ +│ Tok: 273.2 gen/s, 900.4 tot/s, 50.7ms TTFT, 14.3ms ITL, 546 Prompt, 238 Gen │ +│ [17:37:45] ⠋ 100% concurrent@8 (complete) Req: 2.2 req/s, 3.55s Lat, 7.7 Conc, 129 Comp, 8 Inc, 0 Err │ +│ Tok: 519.1 gen/s, 1699.8 tot/s, 66.0ms TTFT, 14.6ms ITL, 547 Prompt, 240 Gen │ +│ [17:38:50] ⠋ 100% concurrent@16 (complete) Req: 4.1 req/s, 3.76s Lat, 15.5 Conc, 247 Comp, 16 Inc, 0 Err │ +│ Tok: 1005.5 gen/s, 3256.7 tot/s, 101.0ms TTFT, 15.0ms ITL, 547 Prompt, 244 Gen │ +│ [17:39:56] ⠋ 100% concurrent@32 (complete) Req: 8.1 req/s, 3.84s Lat, 30.9 Conc, 483 Comp, 32 Inc, 0 Err │ +│ Tok: 1926.3 gen/s, 6327.2 tot/s, 295.7ms TTFT, 14.8ms ITL, 547 Prompt, 239 Gen │ +│ [17:41:03] ⠋ 100% concurrent@64 (complete) Req: 9.9 req/s, 6.05s Lat, 59.7 Conc, 576 Comp, 58 Inc, 0 Err │ +│ Tok: 2381.0 gen/s, 7774.5 tot/s, 1196.2ms TTFT, 20.2ms ITL, 547 Prompt, 241 Gen │ +│ [17:42:10] ⠋ 100% concurrent@128 (complete) Req: 9.2 req/s, 11.59s Lat, 107.2 Conc, 514 Comp, 117 Inc, 0 Err │ +│ Tok: 2233.4 gen/s, 7286.3 tot/s, 2403.9ms TTFT, 38.2ms ITL, 547 Prompt, 242 Gen │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +Generating... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ (8/8) [ 0:08:41 < 0:00:00 ] + +Benchmarks Metadata: + Run id:511a14fd-ba11-4ffa-92ef-7cc23db4dd38 + Duration:528.5 seconds + Profile:type=concurrent, strategies=['concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent'], streams=[1, 2, 4, 8, 16, 32, 64, 128] + Args:max_number=None, max_duration=60.0, warmup_number=None, warmup_duration=3.0, cooldown_number=None, cooldown_duration=None + Worker:type_='generative_requests_worker' backend_type='openai_http' backend_target='http://llama-stack-benchmark-service:8323/v1/openai' backend_model='meta-llama/Llama-3.2-3B-Instruct' + backend_info={'max_output_tokens': 16384, 'timeout': 300, 'http2': True, 'follow_redirects': True, 'headers': {}, 'text_completions_path': '/v1/completions', 'chat_completions_path': + '/v1/chat/completions'} + Request Loader:type_='generative_request_loader' data='prompt_tokens=512,output_tokens=256' data_args=None processor='meta-llama/Llama-3.2-3B-Instruct' processor_args=None + Extras:None + + +Benchmarks Info: +=================================================================================================================================================== +Metadata |||| Requests Made ||| Prompt Tok/Req ||| Output Tok/Req ||| Prompt Tok Total||| Output Tok Total|| + Benchmark| Start Time| End Time| Duration (s)| Comp| Inc| Err| Comp| Inc| Err| Comp| Inc| Err| Comp| Inc| Err| Comp| Inc| Err +--------------|-----------|---------|-------------|------|-----|-----|------|------|----|------|------|----|-------|------|----|-------|------|---- + concurrent@1| 17:34:35| 17:35:35| 60.0| 18| 1| 0| 546.4| 512.0| 0.0| 246.0| 14.0| 0.0| 9835| 512| 0| 4428| 14| 0 + concurrent@2| 17:35:40| 17:36:40| 60.0| 34| 2| 0| 546.4| 512.0| 0.0| 242.7| 80.0| 0.0| 18577| 1024| 0| 8253| 160| 0 + concurrent@4| 17:36:45| 17:37:45| 60.0| 68| 4| 0| 546.4| 512.0| 0.0| 238.1| 103.2| 0.0| 37156| 2048| 0| 16188| 413| 0 + concurrent@8| 17:37:50| 17:38:50| 60.0| 129| 8| 0| 546.7| 512.0| 0.0| 240.3| 180.0| 0.0| 70518| 4096| 0| 31001| 1440| 0 + concurrent@16| 17:38:55| 17:39:55| 60.0| 247| 16| 0| 546.6| 512.0| 0.0| 244.1| 142.6| 0.0| 135002| 8192| 0| 60300| 2281| 0 + concurrent@32| 17:40:01| 17:41:01| 60.0| 483| 32| 0| 546.5| 512.0| 0.0| 239.2| 123.2| 0.0| 263972| 16384| 0| 115540| 3944| 0 + concurrent@64| 17:41:08| 17:42:08| 60.0| 576| 58| 0| 546.6| 512.0| 0.0| 241.3| 13.9| 0.0| 314817| 29696| 0| 138976| 807| 0 +concurrent@128| 17:42:15| 17:43:15| 60.0| 514| 117| 0| 546.5| 512.0| 0.0| 241.6| 143.9| 0.0| 280911| 59904| 0| 124160| 16832| 0 +=================================================================================================================================================== + + +Benchmarks Stats: +======================================================================================================================================================= +Metadata | Request Stats || Out Tok/sec| Tot Tok/sec| Req Latency (sec) ||| TTFT (ms) ||| ITL (ms) ||| TPOT (ms) || + Benchmark| Per Second| Concurrency| mean| mean| mean| median| p99| mean| median| p99| mean| median| p99| mean| median| p99 +--------------|-----------|------------|------------|------------|------|-------|------|-------|-------|-------|-----|-------|-----|-----|-------|----- + concurrent@1| 0.30| 1.00| 74.0| 238.6| 3.32| 3.43| 3.61| 40.2| 39.3| 51.2| 13.4| 13.3| 14.0| 13.3| 13.2| 13.9 + concurrent@2| 0.58| 1.99| 139.6| 454.0| 3.46| 3.64| 3.74| 48.0| 45.8| 72.0| 14.1| 14.1| 14.5| 14.0| 14.0| 14.4 + concurrent@4| 1.15| 3.95| 273.2| 900.4| 3.44| 3.69| 3.74| 50.7| 47.2| 118.6| 14.3| 14.3| 14.4| 14.2| 14.2| 14.4 + concurrent@8| 2.16| 7.67| 519.1| 1699.8| 3.55| 3.76| 3.87| 66.0| 48.8| 208.2| 14.6| 14.5| 14.8| 14.5| 14.5| 14.8 + concurrent@16| 4.12| 15.48| 1005.5| 3256.7| 3.76| 3.90| 4.18| 101.0| 65.6| 396.7| 15.0| 15.0| 15.9| 15.0| 15.0| 15.9 + concurrent@32| 8.05| 30.89| 1926.3| 6327.2| 3.84| 4.04| 4.39| 295.7| 265.6| 720.4| 14.8| 14.9| 15.5| 14.8| 14.8| 15.3 + concurrent@64| 9.87| 59.74| 2381.0| 7774.5| 6.05| 6.18| 9.94| 1196.2| 1122.5| 4295.3| 20.2| 20.0| 25.8| 20.1| 19.9| 25.8 +concurrent@128| 9.25| 107.16| 2233.4| 7286.3| 11.59| 12.04| 14.46| 2403.9| 2322.3| 4001.5| 38.2| 38.5| 53.0| 38.0| 38.3| 52.7 +======================================================================================================================================================= + +Saving benchmarks report... +Benchmarks report saved to /benchmarks.json + +Benchmarking complete. diff --git a/benchmarking/k8s-benchmark/results/guidellm-benchmark-stack-s1-sw2-v1-20250922-104457.txt b/benchmarking/k8s-benchmark/results/guidellm-benchmark-stack-s1-sw2-v1-20250922-104457.txt new file mode 100644 index 000000000..21f1ef425 --- /dev/null +++ b/benchmarking/k8s-benchmark/results/guidellm-benchmark-stack-s1-sw2-v1-20250922-104457.txt @@ -0,0 +1,171 @@ +Collecting uv + Downloading uv-0.8.19-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (11 kB) +Downloading uv-0.8.19-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (20.9 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 20.9/20.9 MB 149.3 MB/s eta 0:00:00 +Installing collected packages: uv +Successfully installed uv-0.8.19 +WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv + +[notice] A new release of pip is available: 24.0 -> 25.2 +[notice] To update, run: pip install --upgrade pip +Using Python 3.11.13 environment at: /usr/local +Resolved 61 packages in 494ms +Downloading pandas (11.8MiB) +Downloading tokenizers (3.1MiB) +Downloading pygments (1.2MiB) +Downloading aiohttp (1.7MiB) +Downloading transformers (11.1MiB) +Downloading numpy (16.2MiB) +Downloading pillow (6.3MiB) +Downloading pydantic-core (1.9MiB) +Downloading hf-xet (3.0MiB) +Downloading pyarrow (40.8MiB) + Downloading pydantic-core + Downloading aiohttp + Downloading tokenizers + Downloading hf-xet + Downloading pillow + Downloading pygments + Downloading numpy + Downloading pandas + Downloading pyarrow + Downloading transformers +Prepared 61 packages in 1.24s +Installed 61 packages in 126ms + + aiohappyeyeballs==2.6.1 + + aiohttp==3.12.15 + + aiosignal==1.4.0 + + annotated-types==0.7.0 + + anyio==4.10.0 + + attrs==25.3.0 + + certifi==2025.8.3 + + charset-normalizer==3.4.3 + + click==8.1.8 + + datasets==4.1.1 + + dill==0.4.0 + + filelock==3.19.1 + + frozenlist==1.7.0 + + fsspec==2025.9.0 + + ftfy==6.3.1 + + guidellm==0.3.0 + + h11==0.16.0 + + h2==4.3.0 + + hf-xet==1.1.10 + + hpack==4.1.0 + + httpcore==1.0.9 + + httpx==0.28.1 + + huggingface-hub==0.35.0 + + hyperframe==6.1.0 + + idna==3.10 + + loguru==0.7.3 + + markdown-it-py==4.0.0 + + mdurl==0.1.2 + + multidict==6.6.4 + + multiprocess==0.70.16 + + numpy==2.3.3 + + packaging==25.0 + + pandas==2.3.2 + + pillow==11.3.0 + + propcache==0.3.2 + + protobuf==6.32.1 + + pyarrow==21.0.0 + + pydantic==2.11.9 + + pydantic-core==2.33.2 + + pydantic-settings==2.10.1 + + pygments==2.19.2 + + python-dateutil==2.9.0.post0 + + python-dotenv==1.1.1 + + pytz==2025.2 + + pyyaml==6.0.2 + + regex==2025.9.18 + + requests==2.32.5 + + rich==14.1.0 + + safetensors==0.6.2 + + six==1.17.0 + + sniffio==1.3.1 + + tokenizers==0.22.1 + + tqdm==4.67.1 + + transformers==4.56.2 + + typing-extensions==4.15.0 + + typing-inspection==0.4.1 + + tzdata==2025.2 + + urllib3==2.5.0 + + wcwidth==0.2.14 + + xxhash==3.5.0 + + yarl==1.20.1 +Using Python 3.11.13 environment at: /usr/local +Audited 1 package in 3ms +Note: Environment variable`HF_TOKEN` is set and is the current active token independently from the token you've just configured. +Creating backend... +Backend openai_http connected to http://llama-stack-benchmark-service:8323/v1/openai for model meta-llama/Llama-3.2-3B-Instruct. +Creating request loader... +Created loader with 1000 unique requests from prompt_tokens=512,output_tokens=256. + + +╭─ Benchmarks ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ [17:45:18] ⠋ 100% concurrent@1 (complete) Req: 0.3 req/s, 3.42s Lat, 1.0 Conc, 17 Comp, 1 Inc, 0 Err │ +│ Tok: 73.9 gen/s, 233.7 tot/s, 50.2ms TTFT, 13.4ms ITL, 547 Prompt, 253 Gen │ +│ [17:46:23] ⠋ 100% concurrent@2 (complete) Req: 0.6 req/s, 3.42s Lat, 2.0 Conc, 34 Comp, 2 Inc, 0 Err │ +│ Tok: 134.7 gen/s, 447.4 tot/s, 50.8ms TTFT, 14.3ms ITL, 546 Prompt, 235 Gen │ +│ [17:47:28] ⠋ 100% concurrent@4 (complete) Req: 1.1 req/s, 3.55s Lat, 3.9 Conc, 66 Comp, 4 Inc, 0 Err │ +│ Tok: 268.7 gen/s, 873.1 tot/s, 54.9ms TTFT, 14.4ms ITL, 547 Prompt, 243 Gen │ +│ [17:48:33] ⠋ 100% concurrent@8 (complete) Req: 2.2 req/s, 3.56s Lat, 7.8 Conc, 130 Comp, 8 Inc, 0 Err │ +│ Tok: 526.1 gen/s, 1728.4 tot/s, 60.6ms TTFT, 14.7ms ITL, 547 Prompt, 239 Gen │ +│ [17:49:38] ⠋ 100% concurrent@16 (complete) Req: 4.1 req/s, 3.79s Lat, 15.7 Conc, 246 Comp, 16 Inc, 0 Err │ +│ Tok: 1006.9 gen/s, 3268.6 tot/s, 74.8ms TTFT, 15.3ms ITL, 547 Prompt, 243 Gen │ +│ [17:50:44] ⠋ 100% concurrent@32 (complete) Req: 7.8 req/s, 3.95s Lat, 30.9 Conc, 467 Comp, 32 Inc, 0 Err │ +│ Tok: 1912.0 gen/s, 6191.6 tot/s, 119.1ms TTFT, 15.7ms ITL, 547 Prompt, 244 Gen │ +│ [17:51:50] ⠋ 100% concurrent@64 (complete) Req: 13.0 req/s, 4.75s Lat, 61.8 Conc, 776 Comp, 64 Inc, 0 Err │ +│ Tok: 3154.3 gen/s, 10273.3 tot/s, 339.1ms TTFT, 18.3ms ITL, 547 Prompt, 242 Gen │ +│ [17:52:58] ⠋ 100% concurrent@128 (complete) Req: 15.1 req/s, 7.82s Lat, 117.7 Conc, 898 Comp, 127 Inc, 0 Err │ +│ Tok: 3617.4 gen/s, 11843.9 tot/s, 1393.8ms TTFT, 26.8ms ITL, 547 Prompt, 240 Gen │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +Generating... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ (8/8) [ 0:08:41 < 0:00:00 ] + +Benchmarks Metadata: + Run id:f73d408e-256a-4c32-aa40-05e8d7098b66 + Duration:529.2 seconds + Profile:type=concurrent, strategies=['concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent'], streams=[1, 2, 4, 8, 16, 32, 64, 128] + Args:max_number=None, max_duration=60.0, warmup_number=None, warmup_duration=3.0, cooldown_number=None, cooldown_duration=None + Worker:type_='generative_requests_worker' backend_type='openai_http' backend_target='http://llama-stack-benchmark-service:8323/v1/openai' backend_model='meta-llama/Llama-3.2-3B-Instruct' + backend_info={'max_output_tokens': 16384, 'timeout': 300, 'http2': True, 'follow_redirects': True, 'headers': {}, 'text_completions_path': '/v1/completions', 'chat_completions_path': + '/v1/chat/completions'} + Request Loader:type_='generative_request_loader' data='prompt_tokens=512,output_tokens=256' data_args=None processor='meta-llama/Llama-3.2-3B-Instruct' processor_args=None + Extras:None + + +Benchmarks Info: +===================================================================================================================================================== +Metadata |||| Requests Made ||| Prompt Tok/Req ||| Output Tok/Req ||| Prompt Tok Total||| Output Tok Total || + Benchmark| Start Time| End Time| Duration (s)| Comp| Inc| Err| Comp| Inc| Err| Comp| Inc| Err| Comp| Inc| Err| Comp| Inc| Err +--------------|-----------|---------|-------------|------|-----|-----|------|------|----|------|------|----|-------|------|----|--------|------|----- + concurrent@1| 17:45:23| 17:46:23| 60.0| 17| 1| 0| 546.6| 512.0| 0.0| 252.8| 136.0| 0.0| 9292| 512| 0| 4298| 136| 0 + concurrent@2| 17:46:28| 17:47:28| 60.0| 34| 2| 0| 546.4| 512.0| 0.0| 235.4| 130.0| 0.0| 18577| 1024| 0| 8003| 260| 0 + concurrent@4| 17:47:33| 17:48:33| 60.0| 66| 4| 0| 546.5| 512.0| 0.0| 243.0| 97.5| 0.0| 36072| 2048| 0| 16035| 390| 0 + concurrent@8| 17:48:38| 17:49:38| 60.0| 130| 8| 0| 546.6| 512.0| 0.0| 239.2| 146.0| 0.0| 71052| 4096| 0| 31090| 1168| 0 + concurrent@16| 17:49:43| 17:50:43| 60.0| 246| 16| 0| 546.6| 512.0| 0.0| 243.3| 112.3| 0.0| 134456| 8192| 0| 59862| 1797| 0 + concurrent@32| 17:50:49| 17:51:49| 60.0| 467| 32| 0| 546.6| 512.0| 0.0| 244.2| 147.3| 0.0| 255242| 16384| 0| 114038| 4714| 0 + concurrent@64| 17:51:55| 17:52:55| 60.0| 776| 64| 0| 546.5| 512.0| 0.0| 242.2| 106.1| 0.0| 424115| 32768| 0| 187916| 6788| 0 +concurrent@128| 17:53:03| 17:54:03| 60.0| 898| 127| 0| 546.5| 512.0| 0.0| 240.3| 69.8| 0.0| 490789| 65024| 0| 215810| 8864| 0 +===================================================================================================================================================== + + +Benchmarks Stats: +====================================================================================================================================================== +Metadata | Request Stats || Out Tok/sec| Tot Tok/sec| Req Latency (sec)||| TTFT (ms) ||| ITL (ms) ||| TPOT (ms) || + Benchmark| Per Second| Concurrency| mean| mean| mean| median| p99| mean| median| p99| mean| median| p99| mean| median| p99 +--------------|-----------|------------|------------|------------|-----|-------|------|-------|-------|-------|-----|-------|-----|-----|-------|----- + concurrent@1| 0.29| 1.00| 73.9| 233.7| 3.42| 3.45| 3.50| 50.2| 50.9| 62.5| 13.4| 13.4| 13.5| 13.3| 13.3| 13.5 + concurrent@2| 0.57| 1.96| 134.7| 447.4| 3.42| 3.67| 4.12| 50.8| 49.2| 79.8| 14.3| 14.2| 15.9| 14.3| 14.2| 15.9 + concurrent@4| 1.11| 3.92| 268.7| 873.1| 3.55| 3.72| 3.80| 54.9| 51.7| 101.3| 14.4| 14.4| 14.5| 14.4| 14.4| 14.5 + concurrent@8| 2.20| 7.82| 526.1| 1728.4| 3.56| 3.78| 3.93| 60.6| 49.8| 189.5| 14.7| 14.7| 14.8| 14.6| 14.6| 14.8 + concurrent@16| 4.14| 15.66| 1006.9| 3268.6| 3.79| 3.94| 4.25| 74.8| 54.3| 328.4| 15.3| 15.3| 16.1| 15.2| 15.2| 16.0 + concurrent@32| 7.83| 30.91| 1912.0| 6191.6| 3.95| 4.07| 4.53| 119.1| 80.5| 674.0| 15.7| 15.6| 17.4| 15.7| 15.6| 17.3 + concurrent@64| 13.03| 61.85| 3154.3| 10273.3| 4.75| 4.93| 5.43| 339.1| 321.1| 1146.6| 18.3| 18.4| 19.3| 18.2| 18.3| 19.2 +concurrent@128| 15.05| 117.71| 3617.4| 11843.9| 7.82| 8.58| 13.35| 1393.8| 1453.0| 5232.2| 26.8| 26.7| 36.0| 26.7| 26.6| 35.9 +====================================================================================================================================================== + +Saving benchmarks report... +Benchmarks report saved to /benchmarks.json + +Benchmarking complete. diff --git a/benchmarking/k8s-benchmark/results/guidellm-benchmark-stack-s1-sw4-v1-20250922-105539.txt b/benchmarking/k8s-benchmark/results/guidellm-benchmark-stack-s1-sw4-v1-20250922-105539.txt new file mode 100644 index 000000000..a192f0ba3 --- /dev/null +++ b/benchmarking/k8s-benchmark/results/guidellm-benchmark-stack-s1-sw4-v1-20250922-105539.txt @@ -0,0 +1,171 @@ +Collecting uv + Downloading uv-0.8.19-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (11 kB) +Downloading uv-0.8.19-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (20.9 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 20.9/20.9 MB 156.8 MB/s eta 0:00:00 +Installing collected packages: uv +Successfully installed uv-0.8.19 +WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv + +[notice] A new release of pip is available: 24.0 -> 25.2 +[notice] To update, run: pip install --upgrade pip +Using Python 3.11.13 environment at: /usr/local +Resolved 61 packages in 480ms +Downloading pillow (6.3MiB) +Downloading pydantic-core (1.9MiB) +Downloading pyarrow (40.8MiB) +Downloading aiohttp (1.7MiB) +Downloading numpy (16.2MiB) +Downloading pygments (1.2MiB) +Downloading transformers (11.1MiB) +Downloading pandas (11.8MiB) +Downloading tokenizers (3.1MiB) +Downloading hf-xet (3.0MiB) + Downloading pydantic-core + Downloading aiohttp + Downloading tokenizers + Downloading hf-xet + Downloading pygments + Downloading pillow + Downloading numpy + Downloading pandas + Downloading pyarrow + Downloading transformers +Prepared 61 packages in 1.25s +Installed 61 packages in 126ms + + aiohappyeyeballs==2.6.1 + + aiohttp==3.12.15 + + aiosignal==1.4.0 + + annotated-types==0.7.0 + + anyio==4.10.0 + + attrs==25.3.0 + + certifi==2025.8.3 + + charset-normalizer==3.4.3 + + click==8.1.8 + + datasets==4.1.1 + + dill==0.4.0 + + filelock==3.19.1 + + frozenlist==1.7.0 + + fsspec==2025.9.0 + + ftfy==6.3.1 + + guidellm==0.3.0 + + h11==0.16.0 + + h2==4.3.0 + + hf-xet==1.1.10 + + hpack==4.1.0 + + httpcore==1.0.9 + + httpx==0.28.1 + + huggingface-hub==0.35.0 + + hyperframe==6.1.0 + + idna==3.10 + + loguru==0.7.3 + + markdown-it-py==4.0.0 + + mdurl==0.1.2 + + multidict==6.6.4 + + multiprocess==0.70.16 + + numpy==2.3.3 + + packaging==25.0 + + pandas==2.3.2 + + pillow==11.3.0 + + propcache==0.3.2 + + protobuf==6.32.1 + + pyarrow==21.0.0 + + pydantic==2.11.9 + + pydantic-core==2.33.2 + + pydantic-settings==2.10.1 + + pygments==2.19.2 + + python-dateutil==2.9.0.post0 + + python-dotenv==1.1.1 + + pytz==2025.2 + + pyyaml==6.0.2 + + regex==2025.9.18 + + requests==2.32.5 + + rich==14.1.0 + + safetensors==0.6.2 + + six==1.17.0 + + sniffio==1.3.1 + + tokenizers==0.22.1 + + tqdm==4.67.1 + + transformers==4.56.2 + + typing-extensions==4.15.0 + + typing-inspection==0.4.1 + + tzdata==2025.2 + + urllib3==2.5.0 + + wcwidth==0.2.14 + + xxhash==3.5.0 + + yarl==1.20.1 +Using Python 3.11.13 environment at: /usr/local +Audited 1 package in 4ms +Note: Environment variable`HF_TOKEN` is set and is the current active token independently from the token you've just configured. +Creating backend... +Backend openai_http connected to http://llama-stack-benchmark-service:8323/v1/openai for model meta-llama/Llama-3.2-3B-Instruct. +Creating request loader... +Created loader with 1000 unique requests from prompt_tokens=512,output_tokens=256. + + +╭─ Benchmarks ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ [17:55:59] ⠋ 100% concurrent@1 (complete) Req: 0.3 req/s, 3.33s Lat, 1.0 Conc, 18 Comp, 1 Inc, 0 Err │ +│ Tok: 74.0 gen/s, 238.0 tot/s, 49.6ms TTFT, 13.4ms ITL, 546 Prompt, 246 Gen │ +│ [17:57:04] ⠋ 100% concurrent@2 (complete) Req: 0.6 req/s, 3.32s Lat, 1.9 Conc, 35 Comp, 2 Inc, 0 Err │ +│ Tok: 137.1 gen/s, 457.5 tot/s, 50.6ms TTFT, 14.0ms ITL, 546 Prompt, 234 Gen │ +│ [17:58:09] ⠋ 100% concurrent@4 (complete) Req: 1.2 req/s, 3.42s Lat, 4.0 Conc, 69 Comp, 4 Inc, 0 Err │ +│ Tok: 276.7 gen/s, 907.2 tot/s, 52.7ms TTFT, 14.1ms ITL, 547 Prompt, 240 Gen │ +│ [17:59:14] ⠋ 100% concurrent@8 (complete) Req: 2.3 req/s, 3.47s Lat, 7.8 Conc, 134 Comp, 8 Inc, 0 Err │ +│ Tok: 541.4 gen/s, 1775.4 tot/s, 57.3ms TTFT, 14.3ms ITL, 547 Prompt, 240 Gen │ +│ [18:00:19] ⠋ 100% concurrent@16 (complete) Req: 4.3 req/s, 3.60s Lat, 15.6 Conc, 259 Comp, 16 Inc, 0 Err │ +│ Tok: 1034.8 gen/s, 3401.7 tot/s, 72.3ms TTFT, 14.8ms ITL, 547 Prompt, 239 Gen │ +│ [18:01:25] ⠋ 100% concurrent@32 (complete) Req: 8.4 req/s, 3.69s Lat, 31.1 Conc, 505 Comp, 32 Inc, 0 Err │ +│ Tok: 2029.7 gen/s, 6641.5 tot/s, 91.6ms TTFT, 15.0ms ITL, 547 Prompt, 241 Gen │ +│ [18:02:31] ⠋ 100% concurrent@64 (complete) Req: 13.6 req/s, 4.50s Lat, 61.4 Conc, 818 Comp, 64 Inc, 0 Err │ +│ Tok: 3333.9 gen/s, 10787.0 tot/s, 171.3ms TTFT, 17.8ms ITL, 547 Prompt, 244 Gen │ +│ [18:03:40] ⠋ 100% concurrent@128 (complete) Req: 16.1 req/s, 7.43s Lat, 119.5 Conc, 964 Comp, 122 Inc, 0 Err │ +│ Tok: 3897.0 gen/s, 12679.4 tot/s, 446.4ms TTFT, 28.9ms ITL, 547 Prompt, 243 Gen │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +Generating... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ (8/8) [ 0:08:41 < 0:00:00 ] + +Benchmarks Metadata: + Run id:5393e64f-d9f8-4548-95d8-da320bba1c24 + Duration:530.1 seconds + Profile:type=concurrent, strategies=['concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent'], streams=[1, 2, 4, 8, 16, 32, 64, 128] + Args:max_number=None, max_duration=60.0, warmup_number=None, warmup_duration=3.0, cooldown_number=None, cooldown_duration=None + Worker:type_='generative_requests_worker' backend_type='openai_http' backend_target='http://llama-stack-benchmark-service:8323/v1/openai' backend_model='meta-llama/Llama-3.2-3B-Instruct' + backend_info={'max_output_tokens': 16384, 'timeout': 300, 'http2': True, 'follow_redirects': True, 'headers': {}, 'text_completions_path': '/v1/completions', 'chat_completions_path': + '/v1/chat/completions'} + Request Loader:type_='generative_request_loader' data='prompt_tokens=512,output_tokens=256' data_args=None processor='meta-llama/Llama-3.2-3B-Instruct' processor_args=None + Extras:None + + +Benchmarks Info: +=================================================================================================================================================== +Metadata |||| Requests Made ||| Prompt Tok/Req ||| Output Tok/Req ||| Prompt Tok Total||| Output Tok Total|| + Benchmark| Start Time| End Time| Duration (s)| Comp| Inc| Err| Comp| Inc| Err| Comp| Inc| Err| Comp| Inc| Err| Comp| Inc| Err +--------------|-----------|---------|-------------|------|-----|-----|------|------|----|------|------|----|-------|------|----|-------|------|---- + concurrent@1| 17:56:04| 17:57:04| 60.0| 18| 1| 0| 546.4| 512.0| 0.0| 246.4| 256.0| 0.0| 9836| 512| 0| 4436| 256| 0 + concurrent@2| 17:57:09| 17:58:09| 60.0| 35| 2| 0| 546.4| 512.0| 0.0| 233.9| 132.0| 0.0| 19124| 1024| 0| 8188| 264| 0 + concurrent@4| 17:58:14| 17:59:14| 60.0| 69| 4| 0| 546.6| 512.0| 0.0| 239.9| 60.5| 0.0| 37715| 2048| 0| 16553| 242| 0 + concurrent@8| 17:59:19| 18:00:19| 60.0| 134| 8| 0| 546.6| 512.0| 0.0| 239.8| 126.6| 0.0| 73243| 4096| 0| 32135| 1013| 0 + concurrent@16| 18:00:24| 18:01:24| 60.0| 259| 16| 0| 546.6| 512.0| 0.0| 239.0| 115.7| 0.0| 141561| 8192| 0| 61889| 1851| 0 + concurrent@32| 18:01:30| 18:02:30| 60.0| 505| 32| 0| 546.5| 512.0| 0.0| 240.5| 113.2| 0.0| 275988| 16384| 0| 121466| 3623| 0 + concurrent@64| 18:02:37| 18:03:37| 60.0| 818| 64| 0| 546.6| 512.0| 0.0| 244.5| 132.4| 0.0| 447087| 32768| 0| 199988| 8475| 0 +concurrent@128| 18:03:45| 18:04:45| 60.0| 964| 122| 0| 546.5| 512.0| 0.0| 242.5| 133.1| 0.0| 526866| 62464| 0| 233789| 16241| 0 +=================================================================================================================================================== + + +Benchmarks Stats: +======================================================================================================================================================= +Metadata | Request Stats || Out Tok/sec| Tot Tok/sec| Req Latency (sec) ||| TTFT (ms) ||| ITL (ms) ||| TPOT (ms) || + Benchmark| Per Second| Concurrency| mean| mean| mean| median| p99| mean| median| p99| mean| median| p99| mean| median| p99 +--------------|-----------|------------|------------|------------|------|--------|------|------|-------|-------|-----|-------|-----|-----|-------|----- + concurrent@1| 0.30| 1.00| 74.0| 238.0| 3.33| 3.44| 3.63| 49.6| 47.2| 66.1| 13.4| 13.3| 14.0| 13.3| 13.3| 14.0 + concurrent@2| 0.59| 1.95| 137.1| 457.5| 3.32| 3.61| 3.67| 50.6| 48.6| 80.4| 14.0| 14.0| 14.2| 13.9| 13.9| 14.1 + concurrent@4| 1.15| 3.95| 276.7| 907.2| 3.42| 3.61| 3.77| 52.7| 49.7| 106.9| 14.1| 14.0| 14.6| 14.0| 13.9| 14.5 + concurrent@8| 2.26| 7.83| 541.4| 1775.4| 3.47| 3.70| 3.79| 57.3| 50.9| 171.3| 14.3| 14.3| 14.4| 14.2| 14.2| 14.4 + concurrent@16| 4.33| 15.57| 1034.8| 3401.7| 3.60| 3.81| 4.22| 72.3| 52.0| 292.9| 14.8| 14.7| 16.3| 14.7| 14.7| 16.3 + concurrent@32| 8.44| 31.12| 2029.7| 6641.5| 3.69| 3.89| 4.24| 91.6| 62.6| 504.6| 15.0| 15.0| 15.4| 14.9| 14.9| 15.4 + concurrent@64| 13.64| 61.40| 3333.9| 10787.0| 4.50| 4.61| 5.67| 171.3| 101.2| 1165.6| 17.8| 17.7| 19.2| 17.7| 17.6| 19.1 +concurrent@128| 16.07| 119.45| 3897.0| 12679.4| 7.43| 7.63| 9.74| 446.4| 195.8| 2533.1| 28.9| 28.9| 31.0| 28.8| 28.8| 30.9 +======================================================================================================================================================= + +Saving benchmarks report... +Benchmarks report saved to /benchmarks.json + +Benchmarking complete. diff --git a/benchmarking/k8s-benchmark/results/guidellm-benchmark-vllm-v1-20250922-111127.txt b/benchmarking/k8s-benchmark/results/guidellm-benchmark-vllm-v1-20250922-111127.txt new file mode 100644 index 000000000..8bee7d905 --- /dev/null +++ b/benchmarking/k8s-benchmark/results/guidellm-benchmark-vllm-v1-20250922-111127.txt @@ -0,0 +1,170 @@ +Collecting uv + Downloading uv-0.8.19-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (11 kB) +Downloading uv-0.8.19-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (20.9 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 20.9/20.9 MB 126.9 MB/s eta 0:00:00 +Installing collected packages: uv +Successfully installed uv-0.8.19 +WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv + +[notice] A new release of pip is available: 24.0 -> 25.2 +[notice] To update, run: pip install --upgrade pip +Using Python 3.11.13 environment at: /usr/local +Resolved 61 packages in 561ms +Downloading hf-xet (3.0MiB) +Downloading pillow (6.3MiB) +Downloading transformers (11.1MiB) +Downloading pyarrow (40.8MiB) +Downloading numpy (16.2MiB) +Downloading pandas (11.8MiB) +Downloading tokenizers (3.1MiB) +Downloading pydantic-core (1.9MiB) +Downloading pygments (1.2MiB) +Downloading aiohttp (1.7MiB) + Downloading pydantic-core + Downloading aiohttp + Downloading tokenizers + Downloading hf-xet + Downloading pygments + Downloading pillow + Downloading numpy + Downloading pandas + Downloading transformers + Downloading pyarrow +Prepared 61 packages in 1.25s +Installed 61 packages in 114ms + + aiohappyeyeballs==2.6.1 + + aiohttp==3.12.15 + + aiosignal==1.4.0 + + annotated-types==0.7.0 + + anyio==4.10.0 + + attrs==25.3.0 + + certifi==2025.8.3 + + charset-normalizer==3.4.3 + + click==8.1.8 + + datasets==4.1.1 + + dill==0.4.0 + + filelock==3.19.1 + + frozenlist==1.7.0 + + fsspec==2025.9.0 + + ftfy==6.3.1 + + guidellm==0.3.0 + + h11==0.16.0 + + h2==4.3.0 + + hf-xet==1.1.10 + + hpack==4.1.0 + + httpcore==1.0.9 + + httpx==0.28.1 + + huggingface-hub==0.35.0 + + hyperframe==6.1.0 + + idna==3.10 + + loguru==0.7.3 + + markdown-it-py==4.0.0 + + mdurl==0.1.2 + + multidict==6.6.4 + + multiprocess==0.70.16 + + numpy==2.3.3 + + packaging==25.0 + + pandas==2.3.2 + + pillow==11.3.0 + + propcache==0.3.2 + + protobuf==6.32.1 + + pyarrow==21.0.0 + + pydantic==2.11.9 + + pydantic-core==2.33.2 + + pydantic-settings==2.10.1 + + pygments==2.19.2 + + python-dateutil==2.9.0.post0 + + python-dotenv==1.1.1 + + pytz==2025.2 + + pyyaml==6.0.2 + + regex==2025.9.18 + + requests==2.32.5 + + rich==14.1.0 + + safetensors==0.6.2 + + six==1.17.0 + + sniffio==1.3.1 + + tokenizers==0.22.1 + + tqdm==4.67.1 + + transformers==4.56.2 + + typing-extensions==4.15.0 + + typing-inspection==0.4.1 + + tzdata==2025.2 + + urllib3==2.5.0 + + wcwidth==0.2.14 + + xxhash==3.5.0 + + yarl==1.20.1 +Using Python 3.11.13 environment at: /usr/local +Audited 1 package in 3ms +Note: Environment variable`HF_TOKEN` is set and is the current active token independently from the token you've just configured. +Creating backend... +Backend openai_http connected to http://vllm-server:8000 for model meta-llama/Llama-3.2-3B-Instruct. +Creating request loader... +Created loader with 1000 unique requests from prompt_tokens=512,output_tokens=256. + + +╭─ Benchmarks ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ [18:11:47] ⠋ 100% concurrent@1 (complete) Req: 0.3 req/s, 3.35s Lat, 1.0 Conc, 17 Comp, 1 Inc, 0 Err │ +│ Tok: 76.4 gen/s, 239.4 tot/s, 29.6ms TTFT, 13.0ms ITL, 547 Prompt, 256 Gen │ +│ [18:12:52] ⠋ 100% concurrent@2 (complete) Req: 0.6 req/s, 3.53s Lat, 2.0 Conc, 32 Comp, 2 Inc, 0 Err │ +│ Tok: 145.0 gen/s, 454.5 tot/s, 36.9ms TTFT, 13.7ms ITL, 546 Prompt, 256 Gen │ +│ [18:13:57] ⠋ 100% concurrent@4 (complete) Req: 1.1 req/s, 3.59s Lat, 4.0 Conc, 64 Comp, 4 Inc, 0 Err │ +│ Tok: 284.8 gen/s, 892.7 tot/s, 59.0ms TTFT, 13.9ms ITL, 546 Prompt, 256 Gen │ +│ [18:15:02] ⠋ 100% concurrent@8 (complete) Req: 2.2 req/s, 3.70s Lat, 8.0 Conc, 128 Comp, 7 Inc, 0 Err │ +│ Tok: 553.5 gen/s, 1735.2 tot/s, 79.8ms TTFT, 14.2ms ITL, 547 Prompt, 256 Gen │ +│ [18:16:08] ⠋ 100% concurrent@16 (complete) Req: 4.2 req/s, 3.83s Lat, 16.0 Conc, 240 Comp, 16 Inc, 0 Err │ +│ Tok: 1066.9 gen/s, 3344.6 tot/s, 97.5ms TTFT, 14.6ms ITL, 547 Prompt, 256 Gen │ +│ [18:17:13] ⠋ 100% concurrent@32 (complete) Req: 8.1 req/s, 3.94s Lat, 31.8 Conc, 480 Comp, 31 Inc, 0 Err │ +│ Tok: 2069.7 gen/s, 6488.4 tot/s, 120.8ms TTFT, 15.0ms ITL, 547 Prompt, 256 Gen │ +│ [18:18:20] ⠋ 100% concurrent@64 (complete) Req: 13.6 req/s, 4.60s Lat, 62.3 Conc, 813 Comp, 57 Inc, 0 Err │ +│ Tok: 3472.1 gen/s, 10884.9 tot/s, 190.9ms TTFT, 17.3ms ITL, 547 Prompt, 256 Gen │ +│ [18:19:28] ⠋ 100% concurrent@128 (complete) Req: 16.8 req/s, 7.37s Lat, 123.5 Conc, 1005 Comp, 126 Inc, 0 Err │ +│ Tok: 4289.1 gen/s, 13445.8 tot/s, 356.4ms TTFT, 27.5ms ITL, 547 Prompt, 256 Gen │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +Generating... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ (8/8) [ 0:08:43 < 0:00:00 ] + +Benchmarks Metadata: + Run id:8ccb6da1-83f4-4624-8d84-07c723b0b2a5 + Duration:530.4 seconds + Profile:type=concurrent, strategies=['concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent'], streams=[1, 2, 4, 8, 16, 32, 64, 128] + Args:max_number=None, max_duration=60.0, warmup_number=None, warmup_duration=3.0, cooldown_number=None, cooldown_duration=None + Worker:type_='generative_requests_worker' backend_type='openai_http' backend_target='http://vllm-server:8000' backend_model='meta-llama/Llama-3.2-3B-Instruct' backend_info={'max_output_tokens': + 16384, 'timeout': 300, 'http2': True, 'follow_redirects': True, 'headers': {}, 'text_completions_path': '/v1/completions', 'chat_completions_path': '/v1/chat/completions'} + Request Loader:type_='generative_request_loader' data='prompt_tokens=512,output_tokens=256' data_args=None processor='meta-llama/Llama-3.2-3B-Instruct' processor_args=None + Extras:None + + +Benchmarks Info: +===================================================================================================================================================== +Metadata |||| Requests Made ||| Prompt Tok/Req ||| Output Tok/Req ||| Prompt Tok Total||| Output Tok Total || + Benchmark| Start Time| End Time| Duration (s)| Comp| Inc| Err| Comp| Inc| Err| Comp| Inc| Err| Comp| Inc| Err| Comp| Inc| Err +--------------|-----------|---------|-------------|------|-----|-----|------|------|----|------|------|----|-------|------|----|--------|------|----- + concurrent@1| 18:11:52| 18:12:52| 60.0| 17| 1| 0| 546.5| 512.0| 0.0| 256.0| 231.0| 0.0| 9291| 512| 0| 4352| 231| 0 + concurrent@2| 18:12:57| 18:13:57| 60.0| 32| 2| 0| 546.5| 512.0| 0.0| 256.0| 251.0| 0.0| 17488| 1024| 0| 8192| 502| 0 + concurrent@4| 18:14:02| 18:15:02| 60.0| 64| 4| 0| 546.4| 512.0| 0.0| 256.0| 175.2| 0.0| 34972| 2048| 0| 16384| 701| 0 + concurrent@8| 18:15:07| 18:16:07| 60.0| 128| 7| 0| 546.6| 512.0| 0.0| 256.0| 50.7| 0.0| 69966| 3584| 0| 32768| 355| 0 + concurrent@16| 18:16:13| 18:17:13| 60.0| 240| 16| 0| 546.5| 512.0| 0.0| 256.0| 166.0| 0.0| 131170| 8192| 0| 61440| 2656| 0 + concurrent@32| 18:17:18| 18:18:18| 60.0| 480| 31| 0| 546.5| 512.0| 0.0| 256.0| 47.4| 0.0| 262339| 15872| 0| 122880| 1468| 0 + concurrent@64| 18:18:25| 18:19:25| 60.0| 813| 57| 0| 546.5| 512.0| 0.0| 256.0| 110.7| 0.0| 444341| 29184| 0| 208128| 6311| 0 +concurrent@128| 18:19:33| 18:20:33| 60.0| 1005| 126| 0| 546.5| 512.0| 0.0| 256.0| 65.8| 0.0| 549264| 64512| 0| 257280| 8296| 0 +===================================================================================================================================================== + + +Benchmarks Stats: +======================================================================================================================================================= +Metadata | Request Stats || Out Tok/sec| Tot Tok/sec| Req Latency (sec) ||| TTFT (ms) ||| ITL (ms) ||| TPOT (ms) || + Benchmark| Per Second| Concurrency| mean| mean| mean| median| p99| mean| median| p99| mean| median| p99| mean| median| p99 +--------------|-----------|------------|------------|------------|------|--------|------|------|-------|-------|-----|-------|-----|-----|-------|----- + concurrent@1| 0.30| 1.00| 76.4| 239.4| 3.35| 3.35| 3.38| 29.6| 29.0| 38.9| 13.0| 13.0| 13.1| 13.0| 13.0| 13.0 + concurrent@2| 0.57| 2.00| 145.0| 454.5| 3.53| 3.53| 3.55| 36.9| 39.0| 59.6| 13.7| 13.7| 13.8| 13.6| 13.7| 13.7 + concurrent@4| 1.11| 4.00| 284.8| 892.7| 3.59| 3.59| 3.65| 59.0| 65.7| 88.2| 13.9| 13.8| 14.1| 13.8| 13.8| 14.0 + concurrent@8| 2.16| 7.99| 553.5| 1735.2| 3.70| 3.69| 3.76| 79.8| 80.7| 152.6| 14.2| 14.2| 14.5| 14.1| 14.1| 14.4 + concurrent@16| 4.17| 15.97| 1066.9| 3344.6| 3.83| 3.82| 3.99| 97.5| 96.3| 283.9| 14.6| 14.6| 14.9| 14.6| 14.6| 14.8 + concurrent@32| 8.08| 31.84| 2069.7| 6488.4| 3.94| 3.90| 4.31| 120.8| 101.7| 564.3| 15.0| 14.9| 15.9| 14.9| 14.8| 15.9 + concurrent@64| 13.56| 62.34| 3472.1| 10884.9| 4.60| 4.54| 5.43| 190.9| 133.9| 1113.2| 17.3| 17.2| 18.2| 17.2| 17.2| 18.2 +concurrent@128| 16.75| 123.45| 4289.1| 13445.8| 7.37| 7.21| 9.21| 356.4| 161.9| 2319.9| 27.5| 27.5| 28.8| 27.4| 27.4| 28.7 +======================================================================================================================================================= + +Saving benchmarks report... +Benchmarks report saved to /benchmarks.json + +Benchmarking complete. diff --git a/benchmarking/k8s-benchmark/results/vllm_replica1_benchmark_results.png b/benchmarking/k8s-benchmark/results/vllm_replica1_benchmark_results.png new file mode 100644 index 0000000000000000000000000000000000000000..86c6c046e0d5ca35f41823bcbcfb34099f3efdc6 GIT binary patch literal 575562 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 z zD2x*%1DP1XA+wsU?%zW+bRU&fRdKl&?MguJ=<3>fi&Gg5B$dfxF(A$B2k&$T#Ji*f zqp;sQ6lD>u@M zx@27n4p5AiJKHknPJY{rL;~V2($)4b@W1uN@U3qr;#*=DrLC^!=K?PM+ z{5{LWam`_ZN|0`=Q~BoLiOYsETcgax#XX%_7Qg?yITAuZ2_OIM3|u?w4~f_$yp zmulJB&-uKwYcUymVkP?L;{4=TQ5DvQec9$XMY)rtK<17SnZ;7h!9;lgm&cU!j4%dd0(}+YB{T3) zyTK>+g0scE+2UF~Mt79(hAT1NTw%WOv52eql)4e0Rn?*s@G4(sTH92gR^_wOrZC?3 zZ96j=)L)F4l^o#d>mY)RfONO_{=>B5bpebd6>yQ&9+rm2Mtq}A%;vzvJ1L0pt2_TT zZBucoV*QY7b&}{x3ZPIQo`~*+n;fYWCBa%5EI5kPg(N6wDZM7wmhuA1^p{+hCue1Y z!st(eTHW?a*$zk_yed_fdPm^+pEHI(c<LDH(p3q{PK+zLLV8DYkJkJ7?hO>!EPi@KW%>MGDj=(d zSLkHAAd~4ajIbaX%3jDH-~lXx&aX9`ms1q<25NP8zJ*eDkS~bL&s&?Nn7VbUI-Je+ zhY7`YeV6&d8n8l&QIxkBdeZ9Wm#p)=I1y?l&ta3HBGP+<|7v^YAErerO+!ef>1sUO zIQOciyE8P;tG|0tiUkPJtrp>s2N|rd0c4p@#_~YyBM|hrSVJyohLnZ?90Ja7jZf6( zz-jgc6@n~A!6nJU)&pk9_>H0JM1QL9{|URTcRS$ zJ`dDWb8WE}UZj!fN|5iw1Nch%c&S+0e;J4z^(c0FmO*f6BwhEL;LJuj1(sDv0iWA_ z{c8`D!P#O-kUvtsAiPD6=!bRJ|8`$+8}^;c15l+14UvI1-L?R7oZW1R;OBBHO-y9H zSn%ngGhB%*%sg+@4}z+g&MK*p@yeTw&Y$;jI$l~_yE0n$HtsF!+Q5-VdEPoPLS-)W zqBbt#9QQvD-8l0E1D6@;N8sCDl zI{79GzLMdMw<@8Bk_d0}!1xf^`Px3Y>oEYbE`K9v|!G9GKI;YTJpG*Yb1rX~iRV#6}0l4OhshL^4bm&Et zQy?YJ-vMqvK*hu`SmfZ_tq18Kz5TX~Kv$6fVKQF7C-eRy*h=GdH{p^x2^rCl>nvFu zO>Nk7sln>qFUrhL9oZ@Da$lnRO?r~zHjP9(mz(dVc-NK1Xyw;*%r#psJRefmK3~{_&;DM;O{`E8DTW;0&pEAVnVn{$+{IQF*H!6aSfgMoIcHs+~Sdo7(m^M~F z+DllJEDt?Ian*nvS9QY|d#3&I)jl+%$Y24y=c~bX?+YZ$Y*4aM|L-er~hsa;`llC`;2eLa-dW48=|DvL$uwIG+NV&OtR3F9|s z&k&59hIWAw10b4NP-4^&cNU1XsDDEz8Jy+Xrlc5HTbYUwWdZ2?=z~154J1_J%F4=z ziMPxnc`zzq?5y?34B21|t>V(se4U0|*pU1^XdU{4V}uYbmri8b{G5ZOIPM==-93*wiazfN4m-@#t4qAo zrFrL@$rsOEhKx2qdg+IWJ8Ri*Zk$XzcsIkdY`PCBBz-iJfxJ19rzukTL+blT8MLOR z1_1`Ms3(CATT|rK%R}x<&9ASR+=WZ_ZG}eKgVon!7|*R)BQalesoPZSKVF?*wvqvJ zuTo6JzxXVngm?yk3*Y+EW|NUMbr)|Jx*MJyB-n?g+ zq6o$%f@@unQ3+pVj0t~nsW9^r0n#;qcT&vGsO+rSz0RHP^mKD;9Yw_;5w(0wnS+A^Wy?SQLA&_S&q$<2`-0ALK1{?DH84TfmJa!`pxk@qAN8;p z8de!^2%MRNPZUL<$F}&0c`LRe_wdDnQ;x73Da+O%Wj%_NFH!aMgp!^X61jE&5RuuM zO!$>^^nV9$807)PNw^v|gCe9bRDdY%taLYmY%HBBG)j`+^3y6U(9MwamP zawDh69hv2@Zwq5(jzpF8Na8S21fxwxdy99{cU;(a&qGG%>w4v@bwWpvRe!D6?VRi! zmE;U6{KW;zAAe9y6+(SOw3CJ&rl_cbg&O5`LjUj%Ep+M(BO!#hLx0J5frluAM4ArB zbGQ5|sSWoUz5TGZWA9n|-}r1sstZ8Wjnp57`@^6rk%y>7SX*F535gcu1Kcp_jk?41 zO|4DMTgBw=>0I*y2j+O=ObFzApF%sh?_IAPyQm#E=9|Rlk*#E5&%Bvk{qESlwSeG# zYbHNs0=2@bVM39n6Bk^iLIaox@XO2vGB_elA*$QJomveJX0#Bf`XrZL4M65mu)W%! zT_F?pJXOY8*-c4VIhgWs!gz2?WOe)KFo$9^3TJ6#`jIAsB-6=CkNur+86U5e}y8KYXlmi(~>kdb3x^?$b|3h zG_?8yApCOm1p!^a=uyfL1U7;h0vsS&IR6Bis`L>uUOnij|#+Q3!7N9q(XfS?`a&hHQk@zP>*vT&He(EDQyRQ*QrJLSx6(Js5K zf}arGju5S#hA%Ik@!m)dI1w74BW>4uVY*X@4-N|ZY)67gM1~qe4UOfk^U`znrpp7S zI5p-HU4*Lc!u6y**yiewO}`DG;o7z$Bt%uFyiVT?A9`x|TI3J%x#b)WyOV^(rfUP4 zbuk%`vn@got{R%AC+O24L9RoQAL*1&<3ymQoVgI03cZ=$(IABBt==01udps+^v1|T zG3g%X|JNhX`hkabEl@}OX9hzOMqf|he@`bAyu-!NM1|9Merw`76Vg(z-I=9%lySL= zT_bSe-0n?7h1o@XDKh#e0oe#}no~O}bYwP|98*#<6X;_d(o#}wyW>?ebkAUs)S>BU1fej7ni0W_yTl;~Jk0ED4$CsV@_@ZpjW?SGZB@ zW5TrZ*B(<3iuOJNw2}OY<&{q8;7)wUVbsi|86x@gj4ln}zI^A2T@`}T33qM!OpLZn}l^9z-V=!xLN9QcAEBLzXx%c78XFKhs2 z4TyT#=O9(dk17+`sVtXjoe9355}!vy1Z$fn?IIqdX74wQ|0Oj1m} z%alfP-mmSgYzHesrR*mMe$J%nw8?G9-P%r8;MmL<5O@3_&SqESBDw~m!ibykn02Qg zm;muci!A6*!sit8e5AcmQ(AO>?TYL~;;5Hu2jt73aDMdYFjOmx2qTk@?{{Q}zxqFANeq<53eEO;|IMtq z3ms9km34hg7}+>iSd}9ADpcbB{p&-nuwnXeBO#Xe^j|=2x-k(G2-gv3YHDg+L4g3e zT9Fe26#b3J$|KywTzW2rA&HBWUru zC)va{ZYim#@D(^Vao6SSeZSMC8Y`w-`VC^ROBy;;sy7B#`?-o{^E5m88Jygzw^9nt zeiH(#2#L3m6DN9-q{*C+ z{1IaVXxWXxrP%c3R>rq3oF^~3Sqw9lVDW2ju|>Vo=3=3F_-Z-9AGQY&R%k{bV-0Ne zT+PnnJ}KgAe_prD-G2tq;1H=!!3yQmiY3BxI82n90RQ%NyQDIYO0;blA`Cx*4n3Z2s7N9t;>KZ$(X|ekUFOhP}DZA3fYc*a2^jcqVo$52{GK4 zMtYRk3$C_=pv95d<9G(hau3JvY?c%G6YE|`N!IiALzORcNqObr0Poq-GppMwKfg@# z-iE%{0v?_%;m_WXi^15g$BO3~6LgP<+{d#N()%EM(I`hX$y-ieoa z-nrB&#taeE;!d%7?>pqnI0Bf6HWkjB@-$5%FC<~rMF^JMfg)&kd@8n?(5Q*=net7- z*_7^~@(Ugvx7uw!y-&1Sul_=v@`S2X?MBQ67Du7%soho-Kt=TY5R$SCtJ^wCmf_pB zaa5(~06t4Nl_GQRhJ&-7;Zhs*KF( z;sD1I;!*@ybFB{U2pSN!>T-28NKeB-GK098XoKl>yuHQy!DZ)Ui9E!|hM zW3*Y`l3kZxZm~WuJ2<&J1lyAz(@3e}Sc1 zkLTF91ZU zWm|tX3!wBmbZiJ7m*M<3kv}`bPk)TV&>9mgAWX0^QMW%a&4{gQBdLMIXoji@*n~ z2EUzA=qMpZs8Lla0K6|KGaI(-23#hh;`OC;oyoQTT;s2b7c>fu{bv|WJ8U3&R&RL7 ziCuUG!LH9RMX6eUSRPBSM4dHf6p^>fQ33|RzNJvCA6`stNi?QQdADZtQaLUce26|A zDi^*;4w6SFqT#rBvKCB2FCZ-@=1_RUmS?X)Xa?_VQwM}wlN>G)9J=yZ4H9FbB#m5+ z6wez)q4@&+RnlSiTAdw~Sg6$<+G^CO6J631ynTEkTK6N+2Y~U_$scKNReg|)4bSK( zTTLXUlgnWELGKen29|F-3!!x=z0?J8+clN@IcGW(Wz&cvG=JnmEzWDUbC|2-4_{hd z8OnL6Io(I;hmAY70Qb(R*Z@PulbkB)#wuiZjAFxj^k4dTK5aldFLq4{0O!)ia|()d ziNRuii|pXWGtnhHg_ci)Soj7DO@3@*A#PHK*XI89Sy6G+DtxXBrNlG@RtxL0sv|;I z%yxh+rbu)XjA}Wc1=pZWI}jCFo0)~3t$$}06&B);$6_xcl*e#|e2Ztk@sHrW7#+DY zrcoE*DSB)$)vlF`>C!1z%;I6V`)9dWXq#o!a{d~LW&SzMVyl&jj<9o2`lmEbGiiiG z$!wdhOaY7dnC(IihSc=*boC{$GAgajZFL{N+^nGweK9L*9d-5I^bPV~roYP(^^BBV zrsH4QGjPwxx2oGtxeXO6sNLHp;39w*TpPG0}a z(;_@yUO0Qq&zLc84ooV&`ZyLnZ1dsyq|0m;#T&q`G?ZRNhw+XSeauNE+8e!g%&IH9-6fDNr?cIT)%q%sXVqr_q#qr#L zm6(`-M>@CJu(my;XL=JCL> zAoetZL9=u=p8V3)hEqdSYZ!y()nU8bRB=Xh2&yk&TqujI6zy7GK@z#z*i z(etN#%h9l-39t$Y3&^*=z1zKYs#40Jq(knjt7|ehl{kVM4#;ZTw@YvvG`u1dK?b=F zGX4y(J#`T;wt^12yQKcK+d@*bD+ig%3NRVauGYnI+fG3|zf4whm)8mv&>QZc3CQh#KZc}tav~voYC{ZaMuBy6bOFQ zj}A~a9JpifU}x0SqK+f1=;h0o1&~O^fpt{#&=RWO4H`qbVvf_&)`C&myJ#J1(h6N$ z8rYbQ;>NiSY1ADFdmZ3;7-HJ&kVr$>w_v#HHiXBs7TE9>d1lo~V)&e0Y9n;jqv*se zJk!&gx4#yC-(H55DLi>SdcG&1GGTzSsrOTg@@Zw}d{c8su@^ro%EOH#k-esor6+;9 z329Wt4Oe&grrrxaDf|=^$Tg}%mIqcx(Ll)gBwXLU?JCI-ziJ~>s^3o zxK|M!*URRKOddaXZS#67PY20klkt}W1R7ln=?WZx_ITmaua zfZ!XMPQw01*gE^Ub3Qt<9(_(=uC|iaOR6(KDMvQ^@;PXdOls5>aY@%Hv?l$DXBV27 zQRqpK?&Nd-%ul_P^aXov_79t{f#G>f$*>A0Lr%b-%S)*e-aKvwjEwU|#GPK3txoB~Fdd|jCJm$jB znWw&fQj@>Epp&dbA?kp}emRzBPyWUfSDI-$W4wK`*{}}j=J!$a_cJ!vd(v%ZL!m88 zAHFjoiJH?^EP-2aEud#jQ&w{~yMwEskUJ>NHsJVABP(qu_Gp0_?;DDOZK~Gk=@`Wp zdzI{y8%rgV0NZAY5s5RQS1G08-f0;t+UD9|kNs_L6>eTB;&Bq_3fSi+5%}^5`S^10 zv2Hc~5i8%Ac%Aj2R-=wDCMaNAM-~FiLfql_*i0X0s_mI~-bxnp;T_++2g?R>b~8V; z;s5WUjt>a}ecs&qwbiI&0@fRPO<|YWz}?~xL{vgeeW)!M5QPb~7a+&dC{iYUMK443 zJEf;Qw;OQujA9#MWF)Bd@;g zHq@9g_L~|CI%0%QhjE-C=-4ZCGL5{rEg`(RJyuk)DQ-S``Fp$3IJF(|6CF4%`f2A) zMj@1x!uFh>$}EieK?s3Do#!8=v;aS4U98$RAq`hXhq@|TlTu=)pIgWWJKV6Z(!{1U zVlCa{Qd9t!U#hfLeE&ZOC80TC+4lsubylyN^N_@T>ZdwU8`lzl&f`NjuuHES3a^?y zp_->T%lPbDH{8_MF4nZ)-bOu1Fs3fqakr2s==A3{VG0cX&Jc8%J{k(;+kpl0mHsKH z;C>~gLIhTOrYAtLGiz}9-~GS+7Pqi}*u2k>GZYkXlx+tClElr66o2G$6ng*H=*7*u zCopSx*Smh1Y*y1*_2)5~~Z!#_hk)5G@Uecg6t)X?8IX~@kqLw`S+j#wbs z8Xp+&G9w?JSKpI5Ykhlwwc%jZCiXmj>Ry zQxG_a>}t?-9twrXL=VlFKzn+J3-Rad)+WWC1559u9Y5+; z`Xb;LDL7%g$)>8ES@3 z>)(lJn&#s{S%be*5S0a3oZg5hiEty{acEVZK?x0Ie8WehaYIj0#DZJld80ypI{F}t z%!X76_kuq}KQurAJyM8%8)K6N8-{SVqgo>53wEkoOs{(5ryJr!s&s<>>=cXCEX^G+Fu@iee+9kjqQ$BZ(u;e!^jg39v`sOzL0TR6fTcyMqPI?v}DXPvZ(@=~+QkH@~>JYEMRRa^FYq2?Oe0$o6! z$QD!GFB1hmR?Xq%siHLI!RpA4kjWS}w|+!pQfAuZ(-nKR zly@P+`D@fcddAjY6&=!AN+lN)BgAn*@^H9l<^z&lg`8wTEAfpguLb!9z+a60=Xg?U z;IZ67=9}LebveD(sc34KIFzP}bI^!4YK{K>M-tw4PMx^w`QR-}Y4_rgZ>LT5dTw9_ zcEN=-4e*jbUFQV%bX~nevB$Z%1-|;-loOcJbTC9F3th3}D7Q6thj*sTu`>MNQ)Q)t z8D_;LjLVh${5d&BMxyk@jZb3!0Wp^Zk1?9r;o7s@jhBVTCs{3>J*waROFt~Q0-ifB z6En!^HvC}veHdGg9KEsW=>Lm|^fxpxcP)Z)*8$Gh%v3SgW_x{xo^kkrrQi|wa~uEA zZ$roXw`b2@@<$Rat1*_+*#3zTZ)|kK_t-L{XX7AS!lQp5iUr%X3HT%QNzkDnf6Lg? zV&dGUenaIs{{YNRuhP-84-|uE3vSp8O~%4z8aoCv9CrBSfirr6IJDY5-WhNWgk037 z%gxPgPmm6s?8`NShGdStCixd$6Z*RK%0(fx!DF=5`weNl)_+g<%!@Y1`OC=q7wK|y zd-o3qr%o(N{>`H-zFa&xlDOZZg#Y45*Cw3K4F&P1FJT+?+(do)T7UXb5!6O~&1a#} z1f!(%w^wXn_Q3}+UJw%t=nsCMtDYJKHtoJ7uaz%_4X}uh_fxxBsE3mRTKL|a-?hU< z`W=ki(59EH1GZCefh68z)d%Y~8(pF<$hg?E7Bs`h%#<~_2(P^DA+QW-;Q|~U0kdYG zI%bUUcuQ3OJ>jSgHym|XUlTWU(2*R%#^wA*B8I@)8kH^+3?HvBX~SA# z*-p8CfEE9RV?wgBJHN*dKR$lNq6*LC_j>VfAdcY;{}c=d{BW!{Ss@-w4b zw&a%TlwWP0|C55E$2oV}I<-ECt?rkD44HCvs)P5!HwuCLi|eEdqgOXGGsBx)Bz@QS z%`}z);Y!VY2Rni3l&myDCj#@^x1Uf-52Ysxj`%R2#alRORlgq$nxQxq2-W6@Jcgh+ z0DwQYNyl5>hY56t;~G|CQ=1}ln>BeSx{w74q(6&Q%sZEMCNMi}h%vbi-fOu`I^;Z; zqK(NfN|+x|sALjjZ?r45D#dnCyzfskuZ`kLSEHRy05M_};~zkU5n|Nzc%FIF#%6hY zd;{XqV_m89&iqcY3U%I(BL29ypTgxObnMWiEvf_|^YfG3mm<1Th{5TUl3Eh7AjAeU zeSadFISe4GmASjDk}C?BiOpENlNyNAghoD!NeBtHsXWA19jvNz5}0Bu2RsHzt3+{a zhM$C7){Rv5SXeKRuVKr|6gszQld}KjkZ*X=`ib9RS`FL2Sg9l^hc>Akjz;u2<3Y;X zL)IqB)t6a(iV#1|@HlRiHPgRu8Vj8mBVAhb@Z4st%fs_S6U7JJA!~C zEkTT%d1AN%0FB8u!~==r*3&rB&|BNZ%9LMkkT+3A@92Uk6IZJX#9t3x*}Cz<1zF#R zFJA(fe-*OdkMd_!&Npax7RpzP9_L5bi5IX?GZ52m)Q2rv&5T|7{{8#2V0=efJq0Po zV~-Bv+%okH2Q%{eINTm|Hzs4TEl-pNq3M8XzZ#hFr(eFKsYzeHJ!eHC#&hCIcv^ra zWiC%%af-AOAt&`FtxRDwXKO<46deDo6qXc7UhNze&KZ?jpa+}Vm)x)rlyl{S^^PHK z#7wr8>wbG;HxzJ!*gsaZuZ+39P}P=^!u%eIbwa^GBOZL{--fLw22IOC14Ou4OyKf3 zci{IEnH8&CQ2E_Ba`i7aG!@_bJRP~wFM@No6g1a8Zgy2ZK8(m7-f)4|u9dBoQlg6< zecA|q(Ld3mDf(muy0o1JyE-nA|9yJ4Sm|QY>%s@12LH6|b-+6bl;E_p+-?=jHlg2v z0>@q(3Y?5Hjw10UGrzn)kmpLF#QMq1mBC#OiC3MHi z%j#fAdAyX1{HN}X@+I0@wk*y^J=5Q8b|uYGc{wN)$YqoNy>Z?~*U~6IZY!~Uv1J## zkJ=@tTif-$N@5w>DIY7kfeT=tey(*8&ex#?lt<~$_GB%Bf>$IONx0@pTUa>-v|tlolanAX>fmS52GbdODdFA7a>r^jip3Kr`IW!*hq|x*uTSk};vD^&}JsVXxnQUp*-R122L*1!K)B7yX^TrH&Ovm7U0{ zKk_3#xfVpmORd)AvXsj$Ny+^^?LFa_p7+tjPa7wA^_AjBJ&wN}eeMHaoS^fynSHYD zv`baHSfCmYr<3f{i_`~o!b`|SB`kH@Uz}!&i!$|BGN^XxfEZ~hwR*RQXhjyAhk@d=7r zI|{D4@J1EL4f}#}KqafN)7Y@8)W`FU+MOOj-qgc4bqm_BX~sdCzRQ4a z0xJPH0Zd|q_P`Nn|FuNJR4O|=yYW;W=_kDWd)|c`EG`|#L}!l!>GQ?Wt6c_xB5`Il z-eZ(v&Sysw#8~l+>s8(X+7Q-uKVGc#L4U~c7UW2qccX&9%X;iK2t?sD;?{UxCRgB+bcGmsHgjAq$D(vM*#z{U!K9^68d)!jYe1kr|BpxCu#4J<`yVolp+o%5#aub zhhceW$sYx1JP^jM#PQf>%(peLM~!UbGN!Jbr&h$DY%x&;;+XsbfSw z@g)5hO8$XAfW08C#c9_$g__Aovjo6yc4Z(0-_7_fu_1D8VOY$K1>h_Ayzd*}Sqy<* zQ%U<`6kC#h|H(tXM`0D~JI43OYa&L38D_}JA|gW5Vh4tVX+e-1KzXxw|{8s+W5z}390t2kuV*g=Zv zUvC|g;^c!QLI5;LMxmr?jyAIVbGx8PHXboLKs<%h2A;D95m(HuyXr3Jln5Zp>H=su z&sYgGs~x+UYq||MlVMDxD|nzwPP9bvPtK6fi$)UvMCnOP+LmVgDBuqyv5KhZI!5}a zCr4z5thcnO?S|{M74ICi`4C)h29IV7Y7NNBXj-oE{7BC<*3S0FE{#^>eb zc@EVX%u{{%SIc1jmh*HAG_2KolO=EOrW`QK2=7mlk68zhfdR%= z{jEG^G#`Qh4}83G8{Dy%fGK~oE}W`MEny_r{`c@8x2T5!jPVPF6RcJR?$@i6nc47^ zVwd90ie4A~N!TYCbJ?rclF`*=CRQQ$>wtMP^$N)`l8FrJWkp8O16%Bdmg-uy-v zTGT-dgEWRh(Ptr`JU*4c7VWH80+h|(r7o)z+7VrkQh}6BjVNmRNZuz4#?5NbUW2@R zUgJiJE9eHOYC9C#-S;K2D@&EBsc?(VG%}c4uF^kZo6IumQOQao46rPY5-FV>G zl6oo?^+gcf!n{p+{EZ5PFRMQ!c_CjefG^CyzNhx3fy+Yu7Sgb+M#PBmV+7NbZY+)d zqf{8JROC7bjE7M~-HHT;mCb-nT@7?1>HUnlr$8-03&1wA@$%Ygzk%(I=#<+V#Q2_@ejBT|fqv|vUH#$kSx^r4HSta46&x}#5ESJ{ zX?D!za)z4H22{)u2Oay*wz#08Z|%Pi;LvO} z4IIyOy`(H@V`D?2*#m9=LF?t*FgGfwa=Mqu0Sl1uXYIj2MqMb8SeWd{5+E^&a~iEv zF~rSbRBaIGuU$qro-_2tMmwar{2}e*h20ihs-BacejZJ1n!oN^UmQi8rj;2WMArZZ zWf;V+?c%2q;R4axQ1Gf2RPBW=}xxWQ2Du3O|?pu ztlmSs8u6n}x3T-YRK`cwj{JU-=P#pe_$~CmYB zro=7Ylksk^Jk#2dlZ#LJcb;dD7i2+;<;j*JX&&D8qd&A+FMdS*KaU)s4YZW16>Z% z(1@2Ky&SNWth%1wHi!fwAOM4|+o@h@3myw@KJs_S2gtZdmTTxJZ%Vjio%Hd9(aT(( zNB<95UmZ|Yy1k9#bsT#fKpGTOq(!aB%K-fBTQCbA@yEe)k(|J?nX%_0I>Xk=4q}uc!njSy8FbuE6_elJI`<+ZWXk zuEYj2va+_2DX&`t{n_Gq;hqNM*B$erW z=;-Vp3A~g=;i=UUe#|a5TQ6Ti>@FI$^70tR`zStA46M#wEaU0I#vr>{#hYH@0p{Yg5@MOuHnh&DSd_-kr_(2^@ zkbA&97bysXl?gB8oANZ;!P}oc1wI?EdAI!SG)-sBCD?p{D^-41=Nx{9mms+uV&8@1 z(Gzh0=eTl;wwseGtos;#!_S{2;fHnqkMA_qYalVc1vHC6F~qioP1@45X`ilupR@QP zLH~OMKB<7WV)Qckj`FJ~86MBTv*u1$&~wyjYNyzP&E`Ge?3l-@9DOlCo^q=aqCf3T zwmm=p;|A`q`mfQ@ZTy?TdSqa8BE1iTwmZKQ%e{H8wzhq9&+59>RtF7qALsgUj*g=n!oVU}XNF+h)`R*Piq+<(YCV_euayg zWt$sVJO%-=k#ud_5zpnzH6jSC0sq}v39TH|Gka$Fpd3j3BJBsbTNji-7 z+DT4}|6r;(?s1-2i@i&XoxB|-@9j-PrV!|uGy5~iL6}SL>jn}?itmFGC*b8p{#%H( zAqbz%ZzHWx>nUv?BN{zqlGo%T=NN)OzjQr`RDUerR~%)#Ufm{xdE0Udo9)$>^mwVXsBUp@S#D<+16H&``8OtZaln2<&JtMBOx!z8lIa z=KxKNc_>#`-`=2^%$#ZC8viO42yr6!BDiz5QfE~jxI6}lF9=L2k-n`UKc9v?F0ki& z^X?>1rJCn3n4U}z6k>m$g*^wkjQwyGM_*EPoc|jEcaSplFlT&4XV{ zp;C-mZ|$#y2J-A}c3sYIvhA@O;nd4oh1mG$_6P{NeYT}k>ddfgjS#p;FO5QR$xAs_ z>9xX{*GE6IVxor5+1jp&nM$9LkMbvsVe@{g*izDw+v*>;IAm+Jbs%+_?U123`z5Q- zbngvV4ERfxtxo0>#Uma2OaORP5U~x#!YbY<=ZJEZk>E)E-a7gjp~5}GJ8b&{8&1jAwicU6fxNQx#t1Vm7D+l$%t2r zKbG^0irrl2Y(*7PQu}>G_2`)z#zNi|KCsuaZwXh3!4iovnc8;SQNpGIO4UWQsfxJZ zLG{n1f^GAf_wFB$H$DQdb;HTOC)o2%O@M!dmvTS7|5xeJCe-$}XR3nwlB@@>k@TVS zOs~DK?oC2>}%HE zy$(i-IqThcbyOSwk+$sD#N<5Q*~~u3Bt>Om-7^Y}=e^4>j%9_J*@sV+<1MtOu@d=TD zRl5LgBQt+^ysdZZb-Kpu4W?W3nf>k_=1-;FNcA|l9Xsw57aM!kv7LiXwr64jlh-?HGF7 z3WJnt@b=j2nv&IMEb--HE8aPNy$5zfwylHb&=G$v?_~v23~UO3z~DN-5dtfSDGDOq z2dBHNONr_+y7F@Z(|8_?aTKEw+dDoVm7nQ-rFbt7bK~R35}q6`T=av~W+HuiZLNxQ zO??rZJt|1F!^*}WuX)(@6BTPCShmdQb0Z4TupiVSLwD)&!1&cBqJ<(Hl3Pi>A zi}=}a`uH8CsTJwz4sNVi6#I0{@NRBLUuLH_Qrm2GyUA~LI5TKgF2Fs$UU`GZVTt&1 zZ4}J3SSk<_RS*IVUyCki7LlVwKCe21!*mc&U)Rk=IZbH(jQ`#tA(c`<; z0X#C<|Gxh?UeUfU75`-^z7^>_)&F;u@eP1wq7nOP3?ll3OuD{q8enbL`67(}a&VU0 zjbSKKgjgP>HpWStSIS8|T~=lJ%+AWs@S538)#STSdAiy4+dN#1Q^5v=@m(v^TMB_e4C{c!Q@HdJhdP% zfLUdT2a`rgVhWfPhyb%A8;J2WfTxjURqU8b6&?|r)8i?0%Ggcix%kZdKMe|$l&J*g zCdDcw-xAo29E|8<4scq5q@h5BU2he^IAfzefsw#I7F-;x0ne;Q>`~){@JE3KXqIgW z%{EwZwedU_MBN(<#M2@WD8)gqbAP_cu=zk)4%xftWJpx&5wC2Z6tWz7xX2s0Gz>0< zXV22(-eVj8<47U)gZ0Hqn{FZ;n^OLr**cz0IVg5m%%V5uT5RUcFGgvnHV%f})M&s2 zc5S=%e}j@%d6 zTsWfivFwr{PpgZ|p8a5G8?n}A$vDhp2OfZi9A!og@H_uP;9szk750F8M(jrC4(V73 zF9x4^R{}|5E~pKJ^nfSp5Ac8pVwHu+UgDtehwf)1bVDAc4#H8&R^eT9oMAG|l+J*x zvtJw6-fs)pKD(FZ0rtK|n|P=(z*A=5=rJlhC^zYu82?2N)4Sv9iAK?6V&yIqtmO6< zHI22!W+fZY5~r$WpCGoJ9GB2GyC2i$=LWV+R`m@m82@#-Z3tB+lnF-E>085_6(k4< zi2->b`gb|-K;!u%wNVwg{K$;&(+@^e1YmHehd8<(AU>{q=y&8zUk=eBwX&d)NDs)gR;P5tW)b1nicE^FYQL<9V zX_Sjpq{V$nFULy+w0I;Pwt60LWCF4rVu{ZmjP>gjCod-Vmv|OV_rzbv9ezKhbn{jy zq;aP3$i|OIDd)jFsc$qzX-w`@gsh6l9c8~MeqmuY+jMe7CWllu5eN^|bwN*$kagqQ zN!Az&$Hygf*^qCBNHA+e=O$HO(Rh$WDAQ2>WFqi#@S&vTd|MiwxB3K!IKkDdiq$CW zGfzX|)|lJ6_cm$`HzdQVGC~h*r#(MnqWKeZ8w_twSpJ zt`b?=8ySOi7AI8pRg@BGN|2w@5F4A2LIb&D|-2#nxzlP|2WGh@y`?7GWJ zjLv(kplkAXaF*!PZBBPltVj`nhimQY+m)BFyLru@OawM{(avg?+XR!GQt)nS?a`eQ zNOL(f4nA~WBc2dfI@0;|Cvk5!Ea+Chu7zmllhB>J@~wiak9{e4SSd8u;r-VG5#tGs zVm>#%)`Ek=0m2P{f*A+0F3pXPV5v3-#g;7J-Qi-k>_rW>OTH=23`Wv89;^gqwCm@0 zo^QkU)j=6i13Mj7m<$*OC_%uc2X;Hz#_e&cV8;q|4l$@U#6xYg z9Z4wQ_I);vw0b}5*9kKN6#0X54YOv^@vSK;5VShBzmj{R+UxYqyY}*71%GjB)FFM` zp#x-AqU9jXsR@)7CPUzK47g(k0E$uzXU1QMBas^zp8F#x=ULl*A^Z)uy=@N$J+(t` z8Cb*5yvN_LG(Z*7VDGHAH2RHY=t#@b_IF(~C1EStjWv5Qa>`Xa!REB8J)US=OhSI_ zoax}hJ9_#ZoKR-7a76Eo9PaB3LWK!If)NxP1DXWs4MdrPSWWGIK{X4VoI|2N3a_Ia zfFO@1_lk1;Pd+KINYuiY4puUTUg3*m3mRG|R&g29PpXb?>kjQE%}wv@-PuZRQK+`3 zyyBp(8~ixfJ52Jx4jTjEMtT>ph%w+U;tdj|{ZhVF4mv``b?~s7I@slZqjZetFEoMo z$2){Hx7q3NLrVu=DTdy&CITauP5W1SOun7T~<(U`)3Ea zgt&crR|jD?_R22>8~$;GXn^ZcKzIxPOm2U*D#6AutEfp@YL1VJe?}nHIJjbmRMm4i zEk8L)=?(RyZGvv))1cU?Q|;KQb2dHAZtUa1mDhP3+6=(R5&~5Mvm$V;#0ZRR%K)P; z|FwKZ2|mSYQv?U$`u}xYCs+Y90NnSqS?+Cgjnoa!4)XZfGcdk;Nxgs7l(2i&xtYD) zBrSuSt>Hhqh$2ZLVxA~_{}IfmujJ9diZs97RewKK`IP)RI6oqiglX8M5a)tg#8U*h z)I%ARr1ZPvW^u&BBVh2~F+7KJe5~Bqttr8>_S2h=>{Lc_fs5ILKIf?k?P;{ zD}QY9x=_`sv*)bXGvN_Fb~9?HcEdA_DF2MvI{yTY8|z2Xnd!ULWAI(t!u46rs5hKD zPcOiE5|A9@!H?9|Voj0L9BQ4szzgo{Siqk|8NJg$oUV7pS*-79LJi7zK=Abucffd6 zJI#fKI(p@~-q5AV`OEoObc31#=nI0P+#MEQ)s2v`TS+d4SB<~DpZR$H41sDXVDa3% zSdeQDLe%;z)RawN4faPE{N3|hd7R#7&mHlz{~b&daKp_6JXLSVf2hz;deNCXJF^uO z_+aMkN5ULI!ahs?-EZNb>utwpBmcR+IGq}4ysfY zwIUFELOcbR2%mC@LU-oP11dt{$oHz78L2VeC8$AJL1sMbb?}@J$DKHryNlr;wJ+~_ z2xQYkZ_lo-uJyY?WZ<46@oy}6DxL`nWxk}0IGASl_zhVoOKU-Hb^y6q_3k`j)Zt2N zO$nag%B6kV(Wd5HQ%HEd^*Q#i|4q9uDe9J*(_d&DH5br3M@@(4FLn~ zMy-^n+buCFe7^T3^S>Fjd6#~D ziP28n%<>e^VWg^~N8g$3`Oj|%=XSJ?tU$DvX5BAiWglD4e=!631>~4Omw^x={>zu! zpvD+Sd^O=9kN-s_QqP9C&BouVuh8uLwAx49!J_{0c*{c<1MDpqfr9Q3Uv|HeE;p23 zwzub-{_kC9;6nb=KmY(8AQk2VVjkw5h6`y#~X0> zU;4FtK1e2ymst1Q=w9fs3ME~cVt;3^wb@5svRL7YIprhb>$F(+vu=Z*EpBQOS*QHl zkkSw$xuo4}Cj-TkbtIn!-&5II#GhgdB27YY#6wJaJ1p>69Yr=!YmSsY`388Jok=YV zp7;25XJxum0+U~yb)(z8bcrL|ZY}to{XT2iRmX2BW^~X7Nb5(wPR;O{Ie^a+Qc{fl z%pk>tp~an+;MVr6d_GVux1hkGJRN_CnMXowLnX65gLV;bWu-deN=qGg&B{B|mEUE( z>cd0d?e5TUxqUt4bUgp(%=*g`559lV^&@fHa;fpDl(n4q!b;f9Mk9+_qfQE4bn{uu5_w$VH zN>kS+K8mo{EM)xpn>=Gwd**5g<1n#z{Yc7IAJqJ$52O%SL%pS?sVDgQ`nn(<8rn*L z8Yh&|RpD&Euy`cr;r_ki!qM)L=Thl56Plgwpw<#De8YV_A$4DGIEaC7?yRI_-29x5 zRatB%_xQ3@U<9McR{TkV-lwdUdn+N9_`S#YZf)>>}@C&5N`fPAWU`)F@2?9|3ALXPxag3YkmhiP?#Fo?BCZEG&BY}EO75iwA2B3 z@pQp56X^_CCFe9SQ;`~vT$8|Bk23w98pLS>tmcF}DFjcengH0-(X}3{Lt}|W&b1L4- zTa}-FlNOo*sr`ICNPX=jrep;L(8tJouMim_ULYJZW(-ugRx z;t1s$<$&_bO6P#P#kAPN2Id1kaEv;!>CLkNI5-ve)^h*9fZHp@nx$35xQL+W(5+l(ZNfTl9v^7Sd$vuWO6>>=!764)HP zH9uIq{5O4;Z%Rf>`NP&1mtCU+i%5=#sBPu{ItSy138ALu%d8@z?AG*ha=rdRjsa}P7s-jr{Y5gD|0W}(y*UK<_}x%3yN1ip@jC*%JWjA- zMm)>dnsC`UMFc<%_P}Q5ac!Xs5d3Q@#?ym4jFC`MNmG*&;pAeVeUd-qa5q{!!4Mjk z4IqqNIbak6pT!43Sq{K^5w;D=Z2zpI_;M@3V|Ug{A1Z>8Tw30xH9d{~KF*ub;YHdb z=PD3CTu{NSj{4w`#-!2*Zae?{JKLVd-!4H&wG~4GwaWV?N97W~N4j}(K)F(-^xRv{ z22lWnxQH?uX(coWex1_5Y-{KQ_jYMSaL@~k>D(Tq2n4KdO$T@U+Z9$_xx06;K0@Ce zmA|hh=ekQnYierK9ekeR%Frc&^yR;KsQtr)xsL){^IV!=^Hek<2WK9P-uEi={+uZH zjC;;&gp~B5K^6r|3!=NFEx=_@(clw#(5JK%i zB(LkkNGSy|zC{yS`4ihS*>szEd`{eq-ivYVJ5Tn9 z?U~1hAHQ#|3PKx)&5Ef=$9uouTl};Myw_f*XVxf~G}@m&eVVk5595K7^ka`4Itwa2GGX8AtbQeTIm7-H_0zPEJm-TwD>yh5EcB`-%sz%;typljw9Mqg7lj~!ajIP0Q)1f4`r_;Q zwC#bxW9RR8Sm)Doi8_;8Kb)Mbyc+zIpZfYOd47Yq2~B9XKE1uO(@&hd2Ub{ijSR^t zpoez>2dQS)^~}7d-+qJL$=*94pa!fPgb{rO`%OO}O^X zVzYx0YOd}#;;b*X^d=TEdR-TVSJr)rOlAhU-$m^do;-zuPyCUto-YaZ2B-{zpl?nU z4h!l-KoT(RLInfu^PW49ff^g0mjy0oL;blE_#2sk<)|P73=QhI^y|(C2L<&`5RsE3 zVw^c(pFVf_RmmhEAn*QYp@vG~UsC%?M|Rg5m&clI zckN2auiC0>jQQS!)a}%Z`fla!_Ogei!3QL##gY%`_d2AA-iJB;^y-s+s6_04`kiFZ z?|!+F07Z1lwnhta8MRQl!=CB_eQ@&KcO6P;m7pBG1GNvcf^esJuTB7LJCkK;R(Y>p z9Zi`UD7H=RPFIWn`STfz>K9QkWC0J1Jhaj6Ngj1+YZO#)WDs}X=6h=Y&Yhc!qKxJdNsAla;DCKxXx57$WmQ)*GB&Nq{uUKou&#R6<9A z*A(2w)hj*97s@UZl8_`9SPX>M#^1Yl4`goFX=rHRO{5eRsj8`|!MPS%{QK8i4oVv6 zA};+dVMnlvo(3Ws`?;t1fC+BTxa4EOGybyST>EokufK33x;)Xn$3m|JxpJBb!qE?5V49AX)pmTBw#gGUY* z=_!*?lHuE5?By3E9uBn@`U7fTU)$O$3qDwFKpss8!iy{rj&ryVv;H*DdWABLrg)Wp zk;TwHrQh9Dz)q9y4G?D3!6B*=m?sMfD!+W52)=6FIV+j38-Q7VSS?Ur#Ee^{#_44f zy8I6F#)S{<76*&r2?7=BhKsD@0YB6){4;;!*TVW*Trg$XlT0C!?^~MDYJu7@Olthm zL0RYg<~8F^Rv|UtQ?zG-(05oN`@V9;Rs1lUdBvVSjRiYVtKq`Ku{Sh!z#9q|i}$rZ zAFF}f?CDD10m7{qLYd6hufK@wctm(QCo*7yHE}GTLfEVSir4yxn;M*k6)U%a z9vY{ouOIy3gD$m-qT)0-cyanDp8C&!C|8SM-jefJM)GM(TQllMgCXd5lVW`3kAT2c zAyigL%>Gq%n1k*D=gotA3q=!dP0MlhL)S+d8cNtgh#%#~ssRkJ~ zegEFBqT`-O1+lGUs}cd^@V{R%H5ArtnE-J!!i_9BM*y=7F%?w?yl5rxWAJmz)vFD_r%kWZ8v+)-1Iv5Z}pg;7B zrJDNtO+iP=*GL`dcTYSh52u|(Epe@jNv%|fHHkyX6RoDWya`MIi@rX#LQ4DKz+Pvt zR9SubgS}p|5bddd)a(D<{orejgK!%l^*A=Z;>_h=18C*^1!&z$i2RUDS2{(R~~%8@ovUJhVf{Q>)9s;G+J?5(g!p z)z+-tIP1gFPzgVJ|3L4#8|#(bcN~$2{&o2UE~|}+Y22Z#JHJ50B0>{zu*HS^BPCbB z;Yd3e-sgMly9_nV zM)oLIB#nFPyuCYSM;%N?Yvg=AZAj(`?xGiyt#qxxe4Bd@yjCKeg*!zsD4DNHz;=ndl2>L*~xz`X+Ds!d#6^h3r`{()j;|sx9S4 z;xqNS^T|gAl-}h6k>e^m!Sjr)gFQ(N+d_Wd<>i(3n!AL-hfQpZYK1M!ULGFaK#`== zIb1hM&FNew9a~5sv~r~U|2{kR(L>y8xW@SKjNCW;8vUPp&-y#(xAKZv`=+9HE%7vk zhXNK+E^iFXe-f)Sh+O-;=u;Z<$gJ{<%zQKb^-9q>JTD6W=zi*QYOj>%n;l3w1lj8h zwqq}+WrnDzy--xUxxFRTCAZju#6{1Uyzyl<_>V$oBeXyx<98cU!f}$gf!(3Z$gE1` zK7Xo<`sIJWB<46MC}C4pk>a2!kU=e6o%yF73G4prA_tG}6FtE&ecLSJL9NWO@BV7S|FkCHVEPUC7+C7$`8=UYS4w92;9( zw6eCgM>EFR+1UhoyU3s~qz>;Q)W$OSsHcXT8AXtb(FfF zdv~l7J8O|3C(@emD{}Pwdx^#u-o8a-7P`hnmagWoVd3KLUPa}eHf`aDcbNZ_>?oSilOcjTT^YO61Q zY(zCu*5zF^$(VD|PM+Tsmaje7zo_qCRZZ;vL)u;^{Z_D{kY$u&t5kx+{S3^%w*`OW zJo89{k|cR{nDH_D=Myj)ER}<9>~EehSs+=*ni1uMXFr)066fDM#lVZYb_bb*1 zW!8aKG7a<+Wp(v%wa1NWzHy4jA3NHcA)}KKQ?UPx%(2zW^{2*@IA70l3o?rRp2|jg z=JZ7$se>C6^Unpn0xIn$14CAie-ZbmF?r6praVi>XgGnR^ff~+4Vq)sXE05PdqVX* zE#a++3zbqm9t`>O6Y2Bt3tr;&8q~93-PZGpMBA9@u>nz#jqTm*GD~I|gF{0Hh=cA3&&$(6d@(jQ z2K%Y4e$w$na*E_SGlxIa0m9x;$z%-VHvHF+rEt>9c1$BYckN6IOGGv7^Yd&kx*`R75l^+;q-egdMF zb9(L>vOkWz?A;|fEFwNbu^)IMg%tW`la zwIrcNH{CN?=4|EGcnO=~9s^5+WmIp&Vc_4i>Hjl{$j%iaX%E}Ad!J8GZ(EynLWkCb zJ)sL61?-Emmn7pyOv09t^POj<=#T|QXbysqLZ-(^Pz5NVI4~s~9bJwemD3DKR!vTs zT-4ty+qc7dxhfUtzp)WMtg>l_ggYb@d)d;t*+mnDdM+qxXJpbQ{l9aF-(iZ#Ohf#0 zb(rqa9D26;*d$|}KM#{LX`8x9nmX5aK>$hbNA-qRZUbpmQCIhK#_eFagjtx^3AcX* zgq9&%A2Uq8|6s<{Inbp2bLEVr=Y&#fm9=i_*Wq$vhi)~9hBhMdW-4LXuRDIPZ~dQT zANV2Yqb?b2gZ(#(zxsK2e&<@fUOpd=d#fZXfRe!Rnh#QPg(&dI=bs2t7!1dkNC8zF zmh_O?p4h&qUv;v|UMfaIF-Q01ipO5NO>@yMmIHhGC?9-lFHa>CQW9lG1+fBoqVM^+ z+MmZGNk9-zpEj;|*F$)Agtfz9`|E{`j6ergJG7?2#{~B|Eu1mfDD7}`$x>cPNxvH< z(0(GIg){yduqm7oi8#1 z(B%UR**FsL6T2b%9tH-6??b7_9|ZsKz_*o*-r~C*DMyih(4M={VtjXs1)3x?$|}QW z3R$q^VfFg~sY$n#7G9+s|K8W~B<7en@7c3&*s0X*+K7iTpNx&)VATBb6`2XxjNN-` zpV#JobU#|BV9H-S8i9j;045n?5)vavO}VkHm#oKk606J7m-}E4 zy^*M?_ls?d+!HL}Y(>!$7lUU2=EUCLi9cxak@%i7$}hb;Q!5QhllLLKYKN336L1m7 z{p#4T&(RGrdNA~%7^|hORj#>P-5rlE{nqVfc67ZhT5^QX2tJd&0OWe_k z+|*Gf6c{3%<4ZAU`bGSvuj02zKE?vZ>tmSs-cl@TSACe8VdlnM&FdkCd}DoNc7*>& z-_NVvmsSbJBb?hJ9PBG%0S})6>#ah_%Lb!pj~|zSfJCzY0fJ8&0Cy^OkH{JoxIsN{gy9+$fI|csD%5qV&j3U(oJCwHocG|#Uvz31%&YTu;e5*A?9K*!34R|P3@HE zcA?1hm2UHw8q&~-lRV4I zwyk9q2aBJO3XU-WwMt~;ZR_y|6Hx>rWb~hI4g=Ae^N`O+&fWwyClS|H1@;-q=MHuiL^@`PPY;veQ_pJB9 zR{-z;{`r!CfPfb0Seoml79;Gg8GVfFa+1)bAByh!YzX+CSv%9IwU3ooQv1}Qlh68$ z*nTK~CC%*q+4!ZJW(i+<|I@~O8nZmzHq?N=+vQmdC<6;O4*?2tRl6WvOyskj411Mo z>a9rTs~?Y!78)=|))BO*j00=&KDU1(tgjr*gC9-EIN~^JQw6m}!-z<)1^+Cvl+hRV zBaPar@+mq9T;p%t~&BT96!%2=oC?oI;{M|9r~I2u80G_O-++#sdWwE7yU)-v!;jGk_7uv!w|l%~IeF3mQD@ zJxmq^#0bg&JS6kvKJI25XJ2XoXLB;05{o0yLkf zqV1gc%@)5qcuh{`2WO=g#r5hwe*DDOa^60k@!Z+qOE_&ek zCde}Nzx&8JF=U|u(h+9%{xY4nhOrBxtYK+m zNzXYhB|`!2KPL$(;#1}_Gj_*UHWPi({`9LWA6j-w4P+qE$t9&wN2aZzl#EO_g;m*S z=>3}Vn!F3PM)LAx#)YuX9j3V~oGm{+Zav%t0^%sv6+cgmx(NW%r{}q<9HD9dIpw^78a0 zZXaf{0GMAt05Y2lTGnw}7F!rDA8;7V)|c1^=LORrNq$h{&ryx zijNs^({eEXP5-DHe~M`>sDpSv1-x4C9UL4uSc7SD2Ml~%6Km;XXn+>)+_J^Nxzod{ zdVJRMa@S$Ubu>5PQ1-E3t3TNJ&7*w&Vv`p$Ov)K{ZM7Nf9k2>@e7-bBB59N8+^Rv( zJuS{qkcMp5ORCVah>J%(oYUkZ@Q&~2hDuuyz|wy7;I888Hbnhsv-}=XQju0til@jD zGMxL79AH_w@1SLi<~o}>H+7sq!a(_ncZ5JSPxoCr>-STBqD|WJrMi#>UJy~)9g}a0 zzJQ~ykKP+zd0O{(dw+&u&yV}9G_tll@qhd%v7ZYH42%bP^ejAi8yMJR!p<#V;Sa^G z@}1cuWRJM8uMi&KE^Kd-BW>w2caS?r5|5z#-UZ~xW?M`-_{?CiI^ z+}z!|F#uKD8fi#ikgr9q+2k^mW?+b#mEv>BJqG?%^drWB;G{@d;e6kK@;O##xOI%uNb*`}2EFlTIP{HRQx7C{2<>B<*pq zZNy`AJgN}h6bz2rWISrJhmGii{R6a2Pi`Wi{};Zv+%;-Cd#bK4w#a>1BFL?&!)=R{ z?npOqU2&*~ZnOd@4+J4Zsxbn?rH)x3yT6n?3HN}42KN0?rO?OHABFvF4Pz1rkz8c> zuj80r$MQfP0(m|hR z%@Gr{_ZyP-i{|F(R{vfOO({W)5)c#`>ewq}b${VP`bDA8pr8aKOoq}#7rgn!j=^K7 z8cY*$i006M6nQ^GBLa1u@&A~)FYkgCOub(3jQL%hlC*~uc^ONh)M}BlaF!qsuMbs6 z#;klZcW^Q3LMf%iFN#29Svszmrkr78>hZ?khFo8|M@WTZxd~gdt)%;*1Ag5R`2d&KGWXQ+(k2!9{IVN z7LS$`N?oec0R}|G49ppdGS;uQRTZ56L(nF;(3^e#lE~hdaSX;D&D8@jqOT`~ud+fA zYO)BHBeGK?xVk5_SwvJ)U|ezU20i^8EX|P0%1W)fOqgvjQ5jvk5P=_9_=7U4y!b}{ zNA2m`h7YD7vVJLUI;T11`@_|j)8pDJB$FLob_3{`yihuVyN`Em3 zIM^{OW%o5h>OJRluKoMm)m1EHP)6mKD7{X?DSxB5110Nk<-1XxIJWsvOM;Jy34SzI zE}oZ|vcJ-^61LNq=I(jseex9*6{r;6rEdXXGG<_Ch=8bmw3YW)dF{$Dy1v2D(b`$U z00KDFPfSc0-rpx1u?-FmcBm&HrytG|{ZZw5#hBlz@;B*oShZM_F(ETHJ|Q&`tHZuK zi!C0Gjirqm#j8^&AXmKwaMI;w-g;bWag>+{alE(P?f9k(*{w4 zgk&bq6{04mL%DdxKgm-6zV9J2s}z~oJ3_Cq!6rDyPptS_a?c}Q?eF7d*O7q4{ zN1gchT{!{Driz8PhD7e%9lMKOEkDnBWshP`u+F`1(sa1Y*##Vn)?wa-jVN%PN||Mp z>?*X<$-UYI2BP}IJ;GODTP{R-L`ckDY3IAOnV z)8IIp&y!UHxq3@G65F&DILjM)W5Qr>jyOPNmNV#OxVFG^irRLX`zSyrVFuQ$jSUS? zl$Ar&1R0o_AA=m&``x>C==eZ%`SRz<%!HZ)5zImTlOdj~SHCU-IZf5?M&;|~8dMI$^sYXC_jsE2RX%NtLR~c0 zB|F`E>#==3Nkp)U`b^NW?{6y58Tyfx?~M2hMgrq|U`cj!A6loeW7oTh5>Q&O$!bD! zXAhW4INE9PafW(+4l&-e8lHt<)a9H46r#oL{H-6c8YhI5Sx|BOR91P0Oa@K{G>W$i zNj4z0)XFtP-*J@6D8Ie_r0!l92xDg;hwBDY-On{O54a>=ym;YI57s{G)bV+FonvA3 z)ud@DDbr!AW(|W#d<`83leFFC<>l>wiPP&}U0qE~CC#;{4`ZfVcrHiIsimh-Z9n)l zC)x2jv0L&u6@Fzn7ukO{ye@Tn#+KK*Qq^ra@0yIif9HMCPkGTOCe?J)^3AgLw{NDl zJy9#~y!q$DTjvEPlopEqkh8ZVIps&1b(N+v-i_E8mE+UMxm=nr!}M6GniP9rRXDwS zhMwV0(E)`60k81!vKa?$ZlO@t{=Pyk^;2jA7=By#Z}9+X^ya^3>*#0Lw5YVLE>EXv zTZFf|D^k)zZE%LZp8Z<3e5+3)o#z@7Xc>ou*ETk3l{$PnmE^IvEMa>B6(6U_Dkug(g5Gp8}SbmrZ5v-M_!!FC{5CEA%@1envcdz#Deug>l7obk;RnA0Ho% zf#s#uRSpV&z&!#MinH4yvu?CGEguijw_Rdmb*I+fq@`>y4Au5dKTK^6v1GWT)-h+EeHh)p$o#EFt>sO1AmOJB9rOp z;?*=z%D-Y^uNgTD#oTQtnzF37hK7BmbwkhU*-u)%cRQJ|VxwY!EIrOM!z<4rt$bD7 zy9O$%CrV1e#ea6GhPmXSp``8(@$@9Gj>k5TWbXTLL7BTdt#WzYYA634{KdtDQ)V}f8FLO(H!BfIW2R|44Xc=xc#$zWHsWritF+iMn zhqPW9{iO6^FnbHoNKO0)G;3;W`>3$}`Dxnwn+pTU-ri>ivI`3f_4M?}r9JB6o=N)Z4wl+cAEdn9S>=>&+S>uK=l8+)EHZroO7j8uDr!Pyn zH#xVhm2+98nN5DeB9)B#`l1+5@PLb;P_`H@Qv)A@7+PA|!6>{q26;G=N0Q(3e91x{ zTB8ij7F6V|Loi{~BoD_dw1ScBxGiC;@jk*A1Y5h8fG(P!NoINl;H}%&gQbuWYHj=iI@&I~EC+_<`8D>z#&@%K>n(I1j z+kz~a>Gtg>EzMZyvhrNr0{|^YbxY)~;2M3G#2gXVI4gNnV3^QiD{ zi{C}T?&X+#90~&VB7MaYSP$h&KB713y0cBF1$6-Ee->^(_+CTn12W;-t~(?6iB~65 zB7jz68gdNrx0HaJ4LuzzXMkd_1bG2-eIEp12!YWPH2YxZ#@$MWA;XYk=;`SPh$~he zyt!g_=d5E_{p$-9l>SpQ$0BwwdbKj6>`8366&a6p+kC;%K;->P5rU0^gSsmrA%UZIG( zFh{wt9CNDf^1S-Zg+~sQggpwTB7;g~$iqwf7Yeq4EIQVHuKUxW8mG5B*}^}BGPhfi zcBv9dVU2$R-x91yn&*35_`12 zdZW`Yz{28I%bz{wD8-_#QU8tZI=0bz!7a6zHR?Ds!F`&9Rjof|aF7b0FIhAxCdaL< zfq6UBzIim_hIc6POz1S;E=ZxQ90%hiE}>&YbfAG6Z_+YkrdeR?_X$I4%6PpJz{wRm zV9Nnec#?(|#SYj?{Hz(#YB)mqEI!AUjyWk_uluv%!`U-uvZ<_K$p|>i^P(!mKWB&> z?)_NIC;zoNFK!NnVDs3`;*W|bqwglM?NWu73N0!+YW@_C*z%Q?Wxl zdmRD)Gsf4}i#zZy@MAr3a${?2Pn?)f^Q8(>8u_J-jc$Y#-_X#2A?Kl`t)fhR&AtKD zN8OgG83gkz#eg{ijZ!6`RHlIP6=0w;WD06s88izl!FX}M908Tx*6$zgV_Nv8D52sa zz$Jpeo2CCCl@$AlG^nIFR;UiemqfJw&~X++rQ4CxbQWga0}yNJoa@I#C607LfqnMx zhois$zGN{8 zbG8N6n7TfyN~j}9%E~(S8XX?&Bjk0;U!))2(S3U?Q+e+)R_mqPOFN@O0rXU@SvTY1 zR18bKU-_Z%s^hkU@5r}Sw;HGMBHJ`!`H{2$T309U6-giLyWb7n%q)jhVp~J89dtTb zU8k}RG6|z2Q=3LKQ;a-Rv#^1VOk8OV4m4*7M#-Uf+oYj_u&}VOWuXc^awTItw37y%1pv1-(d&0zeY_ z5^Y!B2RaG$4Lz#3SaU(c=x0%&MhUUSZ>*xWxmnL+ z)FK-j{mLyBHJ?Xr3%buLHf_CEkWp@Uf9;JCU^&iG%du|sQo^}5b z6r=*FqIvo1F89#(cgd)|D$NTX4h41Pm5Nz=JINjck(qE9MG6z(OFMcNJ_qV{OJTipic(e$-FojNLA&hC1RCi>BbUs)kpg3Sl}yJ!jh7b$Xsx2|3LmWrX_*LEqvM2%}*V_V%E;DN`L1K|t*H7%Zy15oy6d%Ld$I2eiYD zht|e@>z+S9NPvM#;_DTt@*v<7D13sQ_aGoO>r9aghe9KifS>wkKwWDQY$Rbv8*ymq zo!LORG+&N4i&zF%SeA^LynBvq`L(BNXLhuEB3jRpu*i>9y$Zq94Y^{+=$V=lb*S@Y zPy^2L^$GxI$lW{XMoj%Pd2qZ=Yn~xK_Hm`j%3M!`s8RnAgF#8_7SoeKg5@`H&`XVhg}%Ga_@G z@)97PCo#9A%=T=ADSKrqChIG;(8bCx^Fj<9wbn*fIy33XEK^=neNh^;F^5AjCZ+|3 zMBxi_!6uX0l>vn=c_yDdmd9p$Sns)G=sMYN);JuVA$V@r*wlpfd*@pz;umv2Eyk_W$wql~GmY-`}XCjy;ZoG-FZ%BHbtgA_5YZ4w3E-NtHpA zG-#xyF5O)sT?Vqg)=Pfx##Tf-k;iABW@Q$tE;?^qH@n@ zlL#ky+tOUOg@(8Y&?-`1j-M}&zM=Q9o0KxUSSQ++xSJ1M%=oC}n^S~)*MN2=Hs=3-qCP3hA{qb^pHTQYSSdakBGYzECX0s~#fI61)l!|Y}jSmLaD(9VrLuNU%? z?F@zkUltR|qUT$+!8-`PrL>iqZlmq>h12KH^FLFCGhhXQm=H2S@Wl*2rv)Gm2&#@C z?2Xl5Y?zxg%qx#8mpO6mO<(X#3!5LOe!^^-i4~W zbNy5_c%bJvoDC0i?{XhZ}u2Ui6jkqOe# zw}wEC^Ub{XY%#%C%jsC$ZuieIrFJR6g9Mmy6KXjvg*Buf06*BH$B%jOnLZXSJ1YuS zPFluT3&?n}%m?RFv2_`=3e#{}wv5$&L;zcpo{W3Y=Yu|50Xhjb>&YjOQN0md-R`VNH(FI<=V{1!!$>C`*Mi<0OfG08=fsvA;6zzC$}5AjLmwD zu`5^X*4=xh9tG(5@`&aHz25D#JkM$(V(~s?W_9}Qe3yZSdXkFO^M%DS?o`K5mR@za z+zg`0wm2Gqt>xozG_e(1zLO)`%v$7XO)R zd~q^x8`QTTjhsV(n{aNIMte4+KhFQB9e?526$JN)+nc0^QRbx!KWKY=1W^GwVL%Ovg%3lFC5Y!3tHVF`TDc)mk}wW*R~- z=EfQhUuE<3k}TfRknMP#0Yq4q@Iw-}G)oeh_-tO?V`1p~ch9ot1K+RMG6r_JY9VGa zv9cpD;%Bv4daiuUH)356Q?yUQ5EwaJ!)-&{zmVK6)P5 zYe3zC2v-nc0W8pbTT)uefMMQr2JjZKpXHh54__?<9s{7L`^U--Ulan>`MFLr`UF;t z=HpiGGye33W(8c10UYxKmf23g1qv8kwhu;3Xf-iW5kZQWXfbqRO54_%e51OQ zMmoA=Yddbk-fMzV>OC`Wx_um_7T#Ct7Dq{u^&9o%Flp2#6)FdWn(&(rMVh&I6;};srZ> zDR@|Q8;ElaJL_&gVbgE<2Ud&=UA%Y^MlxxTf?8TyB5WYY%^Ge$&b6CY@5d*wVTt`j z-X{y$X&yqnQMBTXQk@tweju}Qn^Qf{db39Afv1Dc$_mhfnrhm`KBEie8LQ&7CLu^4 zY8O>>o>$V+(3f)4(5Gv@mM4DKgoXy++5`Mkjog67WmZT77p6x@? z2m9EcC`YpuTLzTSBd=MopQEMt*!h~&w8pK|4Xcql#SK<3U52Iy*;SEF0A8^TVk#1C z`X5ILBr2n;V_^NuSjWO1u*DurhtE9_7p3mBA?MRQj<2Jo`puEy=O4%7oDDsI8!cq~ zyna4c%)D8g0pCH}(t&FXTlsoPs^>Hau|{Pe0lpQ~Svp)Ib1`zc`wp&APkK@stHbAZ z02?>XlvIKq(0ttAl1JLFm9kNC?YfZCyz5gg(}sU}#wdvOU9(Cagzos;$WVI+j-FJ4 z$EcQxw)=BP*z$KOo`x@CE1g%l6`NJtRG2k)i*^TZ_5~?83~)i=cuEvMJ%o1ubd|M2 zf%>LMSZYmK$=_hII|kfoDCKg?NO+ z$b6znl(+{AjAl7?TYNs4?XagHm35>NtX7CpZety?o0HM#Iwy5N;{w29BB$oQUXG6}zCojsZp$Z*ugHeFtq1*ywM4lm_*(-i}xa}2RVPD>>`+L!&Ox_!19 z&DcfQ3YWQdr6100w41$5}+=MxL%a zD0u(=D@gEj7{LDKdpK>$R&lh&-xhF=RXkJ!56?CVD!tDc6~ZtNm9zHW!-tkJ4ww6)JYfjo)!Stl3-!33p79d0e-hC7t+zDOo1KjUgK8k7h?myMEc3}c=Bf0@%W+8a+G+U4#iF|MQp<}g#;VFk38%4j!EM6 zce2%(X)1XYROORwime*&qeR4q0%ALEV}wUY+q%5(XFKQKZRA~DTafo-XXqHdEl-%{ za_ar`UldLqYeNJTy-g6mxdUQD+^|qhGb=)@!-B)3K#(s5V^s4^!?`3IgKMx{6Q8gh zCBNU&4hW`l#G%5TqEv-9u{rGSHPq zu*rswmNs+t3NdkFyCjbUEGhIrw0l8ghY$9P;Rs*s>t*He4=yZ2nnwbXG30oqt|f+;6SCE+~}SUYsVQ zik@sCfR{LGqYz*=;P%auva;H?xo$EsNg>=f1nDMd(LK?*9Dld#Br&#QdjK4l2o8UE zRg~^CEq>?DJP9gzf(U5An-uss+n3DAi#`jv`MfgOG?J*Q9*RzVpsr!Zy?gK7yLbJ= z!&5;n3!AQJK@r-tF$1 zZ(=zkTIeQCGn3yqrJMZzFG6jiq-nj&sgK^YAR`_Suh4hd=fUwe9cq-;il7KYAMYv~ z8loX;Cxto^GBgKm!wQKiJTrAikZv4N-i?kvvm(dNt6(i)o8L5m>*DIa8`&2{0Vp|x z+PvE!54;p>64nw$0@|86H7w_?w4e@`;N-hVRp6D(PAM6im`H#i*w90c7+tVQ{!E$O-oJql^Z7;}f-xbvgRDjN$ zg=4Bpz*f;Yxg$x)IwPVqC;zpbFIO6`clGP5yC=_FdtNsxgtf8uKE>RBbEiLa;t@Sv zu7y;YQX)EDzY|{B{PEyWlyM%F{5-Rtb4h7ODJmHL4H*!rAJ8zf%MA@hEa)ArD7_^S z`Wc{I12`=5%Bg*h%7T`9F98vCLJHV>NQ_MzDs=?rmj_2>>NJ0J~xa$ zF3rYK)E5{zswd|~pFBNs8RXlqHkKH+z7E>We|LY8*YJLK8xU^k=7;SzJGgqnMYCXbk|WQ=Y|+5k>vL(a%p2~C%sT44A~hC z3>&DQy}NVCy5K@^3xUSU+Y18k?417H%=dayPxR8X_JUwLv}CD}aNl)X5G5z49l_#q zo_SXd!HT^}SQ>C|E~>Pr;|hemh;&=g!Nf!vzu!N6AYzEIDj|!GK2+NSLs7#R_ogS7@w8D}H8;Gevo(0|a zNqz3|DIJVxgRgee9byQj2>Y8lqn`i%sOFOY$we8_rRRT#uA{&#m&-3+u=rWOpWQq} zKL{FI0zWZqK3lp1y58ktAB;SWtjdGmnB2vs6VtY9LzMkoEH;7} zEu@HZui1w`ZklxaD}|v{)s^OVFIKuZtd~%dvfLR;yYuI#=Jm~64~~b;z2Y}%uo@3Q z^_4JbB+FR&8|SH-3`M5LCSu$ES;YlRPS`j$>i$^$Q1sP3$?Sds^x>g?VA8Ga#`N=@ zI;!7+ctr^5f?0gl`-ciCp`C!zJ4MH`6bAI9vWR+e=9kw&*EydCEM>-2Q^2 zTNV%wzvm@D>`x8aU660}@$o^HfBEr99sX8TlUBU2^1Hl>yZGIEYxUh*6{-K0P`S!Y zMY?i(uPv@A%u?8qyIh^pNqQQIt=+!=89YdEW(%o{72awb`0Tga6K#l@*_{Tg@IkY> zGiF=G1(MUq=k5;}`YUPVgn?X)=G{*o)g|XxJLdHo0`x&eBTq;b z?J{?*gPQ;T_j@i#5x};js&GJmHt19aW_r+xK7>Li3(}Rsz$ke2J$-%Ufwr`Ur9DZ& z2jC@14nGV*#l?N_!*o{9Mkc{+hJ57v|ENUldBM2|qZu6pJ38kLzUP6+2_On*3u=r( zZi8sBL2TB@%U(mtW_X$BS0+fPe;xYKzTX=EwTpUsERQ;@Ik~>he|M2S(D_<=p@>VW zN`GX7#7Cks!|lUZW-hL-vSX0$$7BLF$nhbvSxh+7;k`{;oC`F|<#NnEv|Z&5 zr|RuZSOp}+am`{WNYRrjW(Z?gE>2kO`|-5V^>EhjG+7=zak_+42)xr&<5ulDt@RK? z!)Iq;X5)Lt#=+E_kIIY*B-*-p^e1ixPk7eT<(k^zD_^0CE&X9*>aLj}2%Q>NJL`_Q zx^8UQC+md~=|-bNV^9<^Zhl+**AD+S_^HoHay$;+)n?88z82iZdCMjS`Nk zoq;$tMpS;HDQ*e<<-ShIM!ZhsqyY0^{L9L4%s zZMuL+PfxMid-GI)&ri5^c2qgnqE=f`hd_Q6<3cRiKj1pFoD?{*@C+~6EE8TG^<5v0-&#G#poW z(B&x%?~R)vV8P)3e4`O`Y{?IKvOOV7MQllU&wxt$J-6}W`B`N&?BPb*$ z*kV9@CrKf2_ih`WlbRZnggtDBMvP}zx@U?RhQU7zL3zhFPJ}eq+s(_bf+`56_Wfj; zRqCKpdL4?M$D?mboa3@1^2n*u)Ed^-0c^FC-DF;&>SKP?tlp;*j=diqK^7Vbcusg5 zTbD7Ld%Nxbx1FP)Oe|Zt2z1#OCst1d_do0h<`kpEYQKGJ0XdC-SeQ{BI5)7Q^GvQA zUhS5Le=@A9V>nPqOzgkGDvL}Au2`^-D@G|T6m+)4#jO_GZ*6RF*=&a{l$4Y-VD5WS z{8De2Q^!Wtf7bbU8|(03rR8`yV+KV+`EC)qzK(qL)MS?gLzBSpuC_%U>mF6t+jC_~ zo>RsY9w!vkmE!DNhvSp7IjCf#Bfmjqa@wy95lD7++a7(ApXr{MpQX z3f1D@Ei4!8?8MhvNSVG}9m97v&#Z=GhSX((3hu0kzj*=##ZsnG{gaJN`(o;QQ6Y+1 z+HZ%RPf$Qew=8hRmeV~45rYR$w<>*7SG=^%sf9J>`P!-~9g_fusE?!;Nw6OFs< z_`pQ$IR8Fq?W(Z6OPF<(V8Hd4-`kR0v&pH>nN>F#^KEyMnhb=wKHl+pB`2bZPW;O? zVd8}1!qS3#I{SCsVqJa5CDnTd?(*|@JyGL^D8sys0#Mq*^nwC8)_B-lwoVeR@E-xH z6;rabvQyuugZ?t$&-3{+CWCC`4+Ox3JWz!l2uH|s+-&-~b@|sjZO(v=7>;4^6}Zlu zBb!s`LO^LcWsT+eV$l#qc2lG44pP6GkU%%!SLcXcoAzc^Ct=MX%>~bS>sHNwp7-11 z0pp=rPM$gg2B#7X%#$ngu**T}foL>*_oSRpqCp#oTcDu)Kd=NcHDWYKJ?f z;8VR|(_%^Vesve-_`feW#S>Geq&!sKc#kDE(=Zr0_w!4aN4|8h=M5fhRm#@ovT@Sl z)w*cZINIKos={OAba)#-jSGbB#Zo-yA+K3?*qAPRxz_9JrI0SaE4^*X2Qkzam^Sas zoJvB&dg5=sZSPcWV??X&;LWz}8rAtWcDUpA`!FE7O$8XFvCxNAbVDEZ$EQ@3eN@va zvp6eBeH}^#m{Y|aUaD21L5!v8kQ=O(DN5?ahY_n`l$ULtX?u*P|efR zlhv?;2Drv%-n5;iQ^IkFe=LM-9%du4%P-j*@drJ!ggLF?;c1=>Mr0^`VTFha?zx?y z<>XWZWd?2mTz|RGs!szgH&TF62la$}y1I!||f$K<2}~AK}0c@ZH=vp@^xRlF9a5?tz+ThSWTP zOj&;f-S}He2x{KQBmN=v>At%S#tLU2-DxHaLKzO?RaGkKV(04k&C6RUfSwGUOAau| z`(n=5pYx>r-#=B1s3@H5-wQ^OAaV~#baPRZMnlZuGy?3uyDH=lmbxE5%t3Qk$fj`k zXA=;JGC}G4zB2ijtBnx}4zd5&ynY})l;=xknS20Igx-WxT<7*JgaBZ(!aeREZAX@% zKnNZ`!tojsYehou4}ojk_+Qap=6SBEyFp4(b?@)&-5KnfVDGokY`ag$pgwE=^dNL; zrw~nNfUD{f%jKD>V6-t$f*2=>J?Aj>&{CzF#;tWKTlH9AGT^D zBKMLI(m!v})$jRDLO9`4vg+hnlSLk6L?X1~0ko3{N`M$4+FcLa1fW|PJ6qb9QmRxx+G@LdbxsA#8LwlOH2C)CTVcy< zc@x)@snrNgjF%L`E4;l#Z3qen3~zkvFfm54!_eD+mvrgy_O|qV#>E-d)Q|*PxXvvp z2>&4x+?j=jZ~ zNc%?Vd3wRl!BkM|$|ce$7Ka?xu*w3_0*2TpwZFR7&ewy_b-&ZteWRu8-bO&dRz|v> z+wz^w#^0wqZ>a*YYDnjuZlP%qSC@<)pO}lI(K;zt@e+b6kXHrIzbnpE`WaT?74Yl_ zs2zL+jOPBBhyrr9b$_y#2rNTn{zP4$kpg+{+jTEl#QwUuHN2MwELsmyv}8Cp3IfJB z>?F>eJI6Pj2@eJmONYpOOgVnQ9&IG6@%K_vf{M(rqGxD2G#z=(SC5*RX}m(e?~-1V zTs~Hmz=SIa>u&Ks&woBUGZ%+X zt?J+?i+_sx7hXNG&ZbPVHQZD&s<<&m0|bQuDo#I!(|`P<5#GW+(6Be^V$zw43RbZa z#%4p>YcW>6)ImD<5N-$aAAuMx5>`noIo`Xt_GqTuhWrw-%TqN{xLGewU}4S!hIR$S zPDTyE%(!a{p+`}ms?2oR7{8L;(}866eEs_My6^iBA7cFYHy?tZTo%F_OoBQ?G05um z#RUWI;!5DbJNe39;e@d)EulX&xF@83VGbN{q{ZfeDj zZ&z8$Gpt=r+4pF9AIFF|Y7G&coB9i2$xAlMYn(wi&zkyzAdRX5KV*w=5!Nb-0Uz3mZtDMwW()TvHTz2^0M=>X%)7thMw-aB_ zwS>$yo6(&YJgN=s6WZ8J{hnl%b(~r;|JLl3CET^R$M?6T}W*6`II{QS)g;T9yw=4&sCi9Sjs71a`@)_fjjHNTDG-CIV=tTqV9Q?>xuToMgx(O~{i?QFB(x+X6x$+&u3Z^cEA{Q*RrwV0?r`u<4ia z<^jcv_{s5u#VfVckwEcwGIHu%Mu)QKHEHe`rjZ$Lc6=&_gwBRvMO@$5rEm3Pmv%~~ zcNnLB%-q^As=B()e#fSszm-FkX*gJj$fnU*lCIuvfcb_z#F>q+bJ_y(=%820Ub;P_ z8{pqv-Xj6QGL(Gf35;YdUHGy;2`26gDb$#ziWFy^v zVUH7^t7T}77%1H|m{VWs=@*A%@bMw%-IJ@6=;U1DXB2S`wAWRR;yFy|V7lC}?KIuV zWRs;DV0|#ClFONv*^)y-Cf!LyOgx#VdU&TGj26>2*9$zn(=lfxJ??pq&oBt0$uZU> zH-&91_pw^R?D3hYGo=7NXsyf-Yh2)4eg|P6bDnY(%5TuN<$d170s;bv+ycUQ&BgGC zzq>Mf-&i4%EVP`?_h2*nstv`4`GhIVACxsvWCw0AoJF}fK@F*>L z+mpcgZ(Shcg;Gx>{KfZaLxnw`wfY5N_jMjV4gyi!1UB_j-|Mis(CE2FtBsrE${z!h z5x(tFBRka^E}-CMIodG9HJ$jsO|U7wd?&|MRg>$le2WsprGux@t~=47oK6_izg$pc z*+;cGn@%kgg(iV5aK#&nOU}U&5qR7_4t4NZ$kW|v5u@mS-tK^QElA#kOl^d3!M_S- zPqcz%{qZMGX@rAAGR&QKHzsu7(^W-73UM;6^7zb5GFXj6t5Xp*UE42`lT&$b=!e-H z?Ev;p&2Ybl-GzdFTh)-TWN%j`rm?rXGaBQUh;&^SgGA$|=`a*pjt_VCo^kO{H`Cx3 zzciDvY1K-0W?t}!lgzy8u=-($`>nf!VC+Sr$pjeob(1qW@*e=w-4OUGG!{@CIYrwM z^@L=?AO)yGw-If?Ip~kfSH$lisIQdMzhB(8&(DOZDaMlxsf^})0bkWZnycMgm$I$P z!ZO+zC^;`HFEuz1u5I!e@~$DovYNcE&(#SkYX`SQk&2_ z;AwtJ%gP71uGV&e6a@ztgVL?7E&CbYcJ7(H_u(MIZU2YssCk6^_m|w%B>_!b(E-m@ zl~Ab+Q^%EaSwMC&9_)t z)y{WM0iDkAZC!uh=&@sLAhJR7&T$J!1_fAKHnwC_&K}-10^q3{{krCCOCk*HC)~pL zD~~bc4jD@$TFTO&)|gqgVyS;YPp1yfsp4Kk$mOO1t{2eeC;Iw{DocllUR2qT;>zpO z^=Bw*9vl}j7&wJB#*A;R($7>~V8Hm6TD>YcW;n;Hh@#yOm8og6R%^=ft&&D+cIB+i}6cL_N<(=tA72800<}P)tKM{V?r(MgBFCKPpK8C0#;0?MVTP_7jSs64y zj;w==^8}JH*f&bFbdWKaCjW^cb$7tRTO*^xEaiYb4K3AG_yn8h?$LS59R8o7G5)ic zoi`?e4)~(z-IK0YA{KCDXhvF#9!$9`wY!E>=1y$@mDpA{Peen#3h9csjwC1d{}f_{ z&SKZ!g&2Y_)z5vnPOx@rajkXayfhHV(oYPDlJEA_?eXCPu2@9`%435#8@q)6K;03*x09=LusJF!M?W*%UU|s^&Qt?}z`*?uY-GrK+5Y+i3fw2Zk)y z@Q$n?8}i!>!|zi)%9Ud!wif-8_JW}|o;>W02}sj{#0+nZjq5!NYr^^hr4z^0xPCs@ zhE;gp0904`h?-U|ur};-jSBhlns~|Mrsj}jLc_oyfuz;T0Rg|%#3Kc(Slhs%g~xXs zet8g*5B_O&N&tt~$ldt!L>fa2P|uy^d&L;6-ZIPXb$!Vb9Y_M*1N zXPkco3U1P;KMDvqzxBuJRBT3eQ<>dUGoSX*2>3)647u>T= zw0R|Fd?knjCUD{O)eqP^h`G z-p)z~bf0nSCth4<+4Y?a`b#s9luK9#=miA*IOsp))(y-rWg|mbO#) z6$qSz*daO=miBEHa3tq~v_BD=`Pz`SwzeGo)@u+wQMKv-awqh~>moF)tQ`hR1&eHl zFC_sh3IaOel)TiN*r>&Tc*ouW5R9A?FL3Ig=pb%D^-c(c(=%?e5D}9ifoi{BmI~<& z?s22IvCo{|3#*G=J8t-V`oA+=r^N%cJkC<3y}RVm7r70wzA>=ZnP{O+>=K|RgSNUv zQ>|v*)1ddjbhtviY((MMA2yyg>Q|2wG>RiV=NzdKyPNcYo`P*=>XU$lf?EsTGH_=_HX=8FPch-L_y7r8WX7`MKXbtncN(E7K4%rc|TWw;^NWGwYBse2^TO zr2$lWU*toTtEsyU5CB6NwEZdt`!t~>>ya5#4?0M1@A>278Zq~`S0*?3tPS?^F0&Gh z$khzfLRPZwetSBs1ddN6r(<6}us5I)Rr6$z8Z`CpIsvE8>9gloE(rMU?pW27`!wcO zAeI|Smvzn3^-(XJ6}^Fhfi80bxO1jJw%!ezFRKo#RHbYY;M6k#mciYDNCAl=$n#kS zLrMq(FR$v#PB!c5dnD<#@8SGJ5~d*SDSa7CKu9_qnn|G)>A?;zsiy;&4ZfRInhhhq z(u->=wn~!b(Q)mmS|3Vud%77qRd?H>MD}ThS;np9$frE)E&>sNSB&>)PDI2;U2>q{ z)!bHh#$5;GW{PQr62g*r>g}|rzNdE?wwG;dO}kb{K^JR!0TixC7n|q>+`ObdnQ5NU z>pYI;@gRRA31y^Y(QqM5OpwBK;C7w&HP<7iA*7}qs$QaOIpw=6=}2(Lc^)e0!oXyU zMEJ9?$RZJ{TP!{KW|2z%QxFW;3ai?UxcsC))hfEdtG1`<*3$9>Ijj)q?v^%)y7G)* zx?#mcfHMPn6u(V22rN}Y_AQ)OVfvejDjmkfxq-rVM!zp#?jx%hkbHU@m`N#Dc+;GI z+Xy56(Q$p*wnQCX9rw06S03Mm)sH7s=YKxDLExRaR*nRd!8VjU_jfjg z(cGc#Xhdff;fUvgKPO}XGLc|2FB-B_NpIL4ewou*`R3{Ts(aBo0|i6a%a<-|@h}Fn zh*sCu`toe7)2yZy&o-NE-|H)EL1aIVhGrkz=K#&K(i{Sv@j{ceN96ia-A-E+p-5B=M`(AMH5E3Z2*RA2ERjEBv+3F;8b=0nQ% zsI2T{P}t{$1SEdCBfFX3$dpv~4rO}zu0!@iS%Cg8P9!BJwg5vr>&XeOLIWrpMeuNr zPuM-3z=9h{BIK?x5(om8?glF_B8E0(le($AEh`w9_sHdg4dDUC1;e3}8NLNCw#~5f zngNJt@+4ZlyW7fLT_N1C(vni4>^~3qd;e$UQ=)3G?fC7bNGY{fTtBy|f+&(H@Qd<+ z^Ms%=nlm7?Wg*6ku?=yiD)>*g+?TTq}naraw*0A)Y4)b=2>bYbKz4AEWKE-{;O!Rb2#+~;vS?(+)J zR}ZHnIsXEf>x62BOF2zN`{&k*!8`IJ6(ro%uK|OX0&I#gtUZ|NYh*cD7#Wyuz4tAm z_K?363MMj0|3B}AC_lgtlm>^(7lw5m1E{z)ze>0h?WjZYw?| z`hsqx!7n$kGzU+l7ve|}|5ae7X{@b9()HA<8~ww(wmr9WAoQn3b4H|z6MGguyBRk~ z26Byi?=Gprwvvs~RVXE#pD+RGzs8x0k2fHx*Picgj})IuzBynA7qKkE;&U90N$rQ8 z^%vasvw4}wsh|{Gr}#jh6F+nCA)jB=gm^NI@ITcIFZ|7YG0OwQl7} zkPXSqa#a`AZ7iPBJRdl0V@%<&OG1`E!}%@yMO+ zTb&H&`f_b2yst^x5XPhD;1udEu)xkXIfK{g{239F>JY;)R)aQ8;ZKHSAYw`@T~+SS zl>T!Dun_+MFf${EO`cZlk9G(J@>{nPv9~W!dIJK?VOu|P=29v)G!wA&Qf4M$J&Ex2VfKXX zVpq903N;K%UHd7> zW>|f-VFS=335i?^J4hep7_yHYCl~o1-zOZ$zqf5Qj>B=!YNcFFnv3?Jlz}ZjRr~km?uotO@`i#{{ zh~v^qI;v8!gu{G9aG$#SB7>>JU_>E%C!eqc5g&q0GyDU~Vg2-N=;acvUt`GMhp9?R z&+l#uOted(G9CS@_=gyjX*O|Tb5gsjF>)WU_E{BwPWhj_ZDrULXwuxak$$`7jDVSp zfiS9cOM{E%Uipw6nsJWGOd$h=YOlODb0IyzxxdJozd{xgYWCy6$ZdupbgY+RVvKxa zq81TH;(KUDtyu-;Z``_tcyDtlf*|<39FjjSVv%G}cuRVGg@lBV%+*PK*d^bj*@Soa z&+(!SVnkT|77nPf#iFe^S(zRArOUJ{Wj_NJkh|gy5v!wRq1R+;&Idyxmn2C)jWwzt zp33mMjEDC@R7PDXjkZ2Pu_n9~fA*Xq+c)?koeR zD{|UtNSkVq5zD!~akPjxaWpI_;xyS7vfFqpE^gJ=b9g5@#@i(#4fS>< zJ($bX%Zk8yVLJiwpBe$Zy}n!3HFVQOMsre45G+q;_eoBU+TcecQ3!_s@HE3|kJ?FO zaZ?{}`tCJMkAi7$t9cr|H{_i4+Sbz)De?iPWWBXFm%IhoT5m29G~R>N;j_LR#ywGA zzI=(DF4nI7yBG_(`yC{ZYr((Yw37ez7c6c$L2lzK(wf*OpQ>#0wMQr&29(*v31;^D zJj-n428{pno=D56C+YBzr<;)m5}UZF6H|VUd91t|A^a|g)&7&$-w1qdegl?ZdElQs z2Lm9d&Gwr<9*j7+f~}_4f8B#XmC)q;55rmB#po@R;c!gpT){OKS*3X;hLQKr@C9l^ z_i}B6`Xg?bY*zyJ6cOmO1Eu3VMTon@a#*hNj|A)>xu3TEgg&2@m>Gy`EF4S;Mi>+9 z%#yq|^IGj{i^+_A!4%hOFo-2Jc49R_;@>RdyuHs_#U>-j*|x^+;uX7uF8yi@ChYhp z*b}Nx859^e4GOPTp$mLt8Ic#)+QgZ9!^t?(@YSO=kzyv{Ja&QQd#!uMy`Y}i*Uf(d= zQ3c9v=PollELXych!=@U7!4$<~_C=v>g z-Khg3g)QdPsZ%R;OziCP5UiCa&=11|$S5VC`?A7V%aSC}D>8JjI`t|K7~f>fcr zxS#yD-?!d2j&|bGj0^M&H<<*=-Ke{q80XXt5Y-lGF{dJi?O1)D9?S~e`b%Z6U{>fH z`D16eaFFog?ELZoK~(0OvkToPInK2PwC_GKwJ2<_Id@@^1;bWz(y#;qJCP6xWaC?L zzAH`gvv*6l#&+0quE)cE`ZnTtG?YY20&LydcfxG2r9jVmj$Y7O z#~y{nShh|N=9*}YWAy*cJe&`QF{@aMz~|CoWFJF`-phEmHF_knZ$FAmG;lcqyG0zX zC3Kl&tg7_1RF+-tw#*ftvq`?wpFM4<$vDtsh9w%|9%~GMA?P7GD`2r~F}ZduHm`-Q zToMtLwKx>kw%mzlj6{3VVZ2oO+;iJegK1ejK?~E#=sd-qi!HGp%AXwZm6vpc+tQ_! zs5>VfCCw4A*%bkxwg;j7~T zlxy}3Dt{n(n-)iefOvv~CIRrx2Kje&H1}=vucC`QQ54f@#rQUGaif%#4QuwGPY%X>Gb2?pk+M+5btwz$hxd0%lQW| z*p2K=^ET~z3&6uXfc-{)BrFj|!lg{zmj;H@na(t054|Y_jEqdZqz-|fv`pjqyNyF! z{de(0FW2gtCq^v8KQx8~Yz^84?u_D#71VRjoY-C{@(;old^C%)uE82Mc~^`4JXa`W zHR)V6%p}M=QG2B`+NWiY=-YbVmk}6t_GH9&;|gk+H_5Qj9VTCCD{D}zhgBy+hByrv4?QxW`DMY@_)^Sd+(D@c2f?&E6RrZm zQdP`;)@fx{6pjBo&_1h9JBm^os3G(J3x~EIIjVk>>-6T5qX#pptdb6In^bR!95O8p zp0XfY9nxe@!fMWXazg@daX9Ma*{62)$mhTfLrean~uG z*!yl(F3?QUYkz&?M!mQuR$i_h-XnJD^ACGA1)jTSR)Xw;Ch<}V5Ezm&v?FTm+sd@| zDdtpy9kZ9*5kV^uOQ#2=Pp8|N5zEbAa~9clz;MZ$F9* z#NrZDV)mgc1(zLJfc8KmLou3;VVq2Yb2xLa=$IgjEh6vj&*9J*zL`MF#in4?X6dh@ zs_Av=!Xj!u@8WdWUukf9qw?i%bJu(aq;vVp8K$0HAGWSj%Tw+9ClMr1+c&tsLY#~M zyM!F~@McDIF1XJnC8~(6x@>z#+&-o5)vM_XGTA}x^h6U#_! zs75m20@-(ZAV6su5XLSp7nl$REtHgcnN9BC^c${+v*6G(+Y1daRLNn1;qeqFwRcG2;2_8XA5oX~*sVI1H8DPb@t7pK?2scg-ZWYNoXR zb+U69CwQGt$fIb7eIk`!Z=5TyN?nV$FX#5Nh(u!OBqA|8th2D85!67kNQR(EW@M(@ z1Vqrds$%iI*`iW>EB+=yC~T{u_hEDJf`w4w^2|6P1aPReOdVbEoYDbk%&ye6PP^Xa zFzh#?Ctn?;bkJT4TszKM9`lcQK62W1O*ZckRTuk?OkX{<+0O;Xooe|jVuBV`;sfWO ztr>@nSy3H504mtHf8{e*7-{~+O;GKvdnmOe;M85<3&@4Y19x|d;bsO{WI5fP9tnnT zZA!ARXCyNxl=DqfaZe#`#MV9O^;wb_7)hYZ%+2y*DWimygVDXPwSotMw{-6@xn;`7 z!iZi38xSv$2>`5(FNl|NzI^2h5Bbu=3Gc#b+2tvHoW-~iIvsMcZ z!1aQZDs}JSmgg#$_o*MJS_Y5d^LP{rp1$-9VzA>a$j=|eXU->RPzIor$=AGQXjjT5 z8^t80L%@TdTT_xd8GKsS=IxoziTv=-6HGHgnsfx5k7{-X|8k`g{$nH5FW2tcao;g$ ztMdA_ry*p43lGFFlJ{d*ViAiC596zbh;mkBJ9wsa&m<&Ha;Dtrj7GB1kfkBE6O{HN zFRM;7cA~74GFlc+UYNGjk1RUP1@BNV1G&KeEh!o1;=eqcT)aSNO}ifbsyaSHnqhJ5!Tqj zXf!cxb0O^`TY-?A+Zd=w&i78$U3 z;RI!MO${Y#n9Q``9vGc+DfD!8y9(v2XzWq_X==sO;d*ldTSYY~7W(*=aC!!YxkTh~ zJCx)Q=uhwab}#%`>3U)N9-=VL-M(J!5U#99mejv-Aj1>1VwBXe2blKq-+w>j=kOGR zLSdgB=^(}78i(%#Cb>?*4(u{<_uaG)!op8 z2Mg8*&8?u)lM`dUX+E}onp3kvsb|MHUoMbjjTQ0ODcRn>%=6vXjhc@B^M3TzQi#k1 zO9#1eGfjt0`+trxDg58D8h9?@OOo@?h?3wFoihT22hy%ex3inL>yxme4<7VTOpK4$ zwv!lLN0uww;i3NWPVWv44RP-|Z5_wLijsa!3*cFJ(!OYbs!2gi?Co67@bF&7vu91A zGcD^N-{JViyYl=udLXeA(E+i4=e4{gz8~EQ#ppUTerdByIbZ^c4w!(IkxYTOH4sLz z=r**(1*seEigqf#G30Fu<7hT!GxU@s@q<~x!$-C~A6FO|8OgsjivWjh?&SIs^aiUb;ML_tffykPWi%$E7z*W2`56ygP5M@)Es(e;WrUer%k<$3Y|_ z4GyfmO%pHmkdM#!)6;{WxboTFlTz!*_nC`;`=f6^H8o|swo+_8HQKQNTYDNXp{~O| z5}CYeu=^N7vFDm>z=^D`MNS$S7-*~55PduX92PM!(PaPA-rAEr4#uIPjbv9)*nPPpG(ORR9?vh(X)WT$jZ;>iqC#I zZ?Fa*4tYb-5U$gJ?GuhSR5r+Z$I!F;H|pE&K0P8&Rmtsvvv$@a@2WwYbR?1 zs*)PtjeFViJg6&cM&eMF2nL=!Ov(eLZi26dtT$TMiJSIa?-&b_8^-{V2BG6Eu>vk-{ZIa=-236psLD`{-iRnh*lA_7_- z;#x09k6%$8!6_UDEtmw(ot;PFWZ&8mxHe4#ggplaa@SD8hpv zsvmh(jq)m89#lzps}>|*@xOoXS@iw28?~kFBQJH}_QxFgEIGKbc6-AqkK0K;PRz8& zB|%>|GLw3;2_H{2&#mOf(?Pcmc2ZSFMtnsx9UGa{TyHiQZkRO62EdC@vt*~Y3fWmu z+~%4ZLs$~jwUFf)hQ)V{v->VC2({$G1Xi_w3ZH zbeg!rsVE*;0k`Vnhlz!5?+HbN?p``O@!#0nGCAt{jU|{`bg~1d^VX2DC8ul6Z<0J=-jpmU%y<4Xfxr+r zyrZJQ&5G{J%%rS90UCz@R_Gdq6Iv4YWX&NYP@adqOR8sXm2}XERZ%%d|NWGG00e}m zf~P`(0`ZpgHq_Pub*7m5z5V$_c*3`bOX1n+FbNuB5G63o;ZuC@JzJT+lCM?dxchx1 zKK7fZDnM3FH&kqTY$vRSl|)=mQSY^?k<*_86rITDPISAqQTrCqYc4X$ zQn)Dy!JGqNh~6dGO(H)9x2psCuv8V(LSaZxHk z`_vj-_de3hA=0%z(6eZLv|Msl^=j%yOHsxps(0IN;|!1H&hM-xNN|t$YUKQLv$Sgs z<9>Xy&}(bTC;4@v^T0iyGEfw{A)(Lrg)VHnX1DfCAVJ<`)y<-8I;=M#YgePw!UJ~C zvr#PS0;G^`TLO}6WOsulCwcrD?8u$`AkLU%n+BvRDYx~c<`SG?MKIT)!;3-1voaAW zI>faBtsD|!gtD0hX`%CW( zglng)fUz}u5<1mFsBb!<->+S1N4eI6ViOKax$T`D8!*zK*of(9Xj(w7Z{2|<^?3`O z=aGrMH8L$S4Jqhz*a%}q{kj$~R2p*wurq`Wyf8a}&1Ch@b*90PHVIH-Thu+b94MfM z-SLv))5dw$H;~B=qPLZ7J_Q8CA)F+DFNy3@y1Mbe#k)>r)iWmB?m;)602_G}%i>?W zAb?P@)V@L_-Mr|>movGbb1o%;$b7Kd-M$CA?SzpQS~oz4<2)cprh ze}`p0|D>R}5Gp5a8bM-Ss9+L<2$k)xgYpb{QjzOLyuQ>fW$DI5SYY8>=Ua4)1)HWX zrrI^+gvH)YIlm0&p&-ReDE9hoKKGEUVRJ zyNN88f&n%joDFi}DzNJ+TP&zG5fN5FvZF0~Jj6y?q1-au1}!iYNSGr7nYZ)$cMnp2 zr-E#ykCp3&+jga(@Ib6LF)`QlC~928+|H5QeINzyEFX<_ASjn%;*d9by4osAg#-#C zYtdj2U_1b}w0xzTC$AZ^hp9XMKepaFE~>nJA9vRkcXg3<4HOX9K&7P{R1~DUOGIiY zW$0E`F$jZ@?iymKpy081X zX86Xfvj6y>fmFTANzBV4(XTN%J~!DfWOs-2m1bk%?`yYxv+dQcBcn&IUz9M|3#)w& zy3H1itE<`$-of0mI2Is=g$Us`q*W4M*Yd5IBINm~pfpY$Y1A!fc3Io=Ij@#i|6#e zyTKlb;?;scl>)hV24oL@jf-%)BC1Dzybrh|?s`D zW~N{gmj;-34tlN_G+ff7Ui;6!SY2<^!@_}nYxer@47)D}X(;37s_(oO<%wLX4wRJ+ zWVCq2d4E`2R5f)?8zo}-y-mZ*Osm)rEgZ%;+3qa1$c>GqtQ=UGO3fJw+L`*;9u5k9 zi*?r9?R7MDZ){{ZTUT}Dcqg}p5MtZZ27p=}D{rL8DI+4xRY66{&>V6cAk<8c9XxYt zn>=DpO2=>gHXDlhNSfkQw)J#{t_R$Xl;LgB{KvWJIL`E2GXpOOK_em(_-%S8Qe(Z^ zq4#RoTGcc^e8=PX>C@?uX1(hvCdck+!>C8Ft6*1!bZw6vs~Z zQ&5^upu$s240y{2K26qobuo2?`IO{Mk9tmKgow%3e+?s4JE4 zdpS(PGJNVppPY$^f0k3WMU(EB=SJ38#k_O>wib`id-=(*9c@~tMn_e7Y1f3m-Al|G zhcb7X6;#p(Je;dPJUe{26|XoK&$CgOsc{T~p;p0D3QrKF4#euPd52Sg5z0>pu_ubg z+uPfGb~r^1S+k%~AuG3ove0oIC?0aL_28SG0~k7jB{94MiD5lP$HsOI;X(Zs8buIs zIB*Ao^c697Bex~`neJ!hk-CrrHbG>laksx_l8Xw62a%|#fLb`dPHdZ7S3&uR-FGydx_jMSr*yyd#(#(Zt7SyG4O%-i>-E_Ki zt^+44(}3;R8hKJc7*#7{<{rJ)0Z`X)I6{m7*b-GA%&ZZR%o3?^rr)RjPSg(@*_|)aawp%|fZJqdrLT`kF!PkWjNweXNigYjZnj(U)1h2b3M(ErbIL2a@yT8D%v z=q;bzl(@Veb(>RG2Z2ty1d<$+;Bt@_CcO70;Jh-cBguz|1a1l$N~&IlV4?iIyk(Og zDct93`rP*~8<)D6kRlv_2QRMpu0Nx5*}O3W}uVhOF_r+P9QN{_VT!9-`!;QTqc;x zfJw=CQ^%te6~?$`AI*J8*2>d6E>@u^rc;Ob=Um!838$g``>Oh)T)sR*q;Jsq7~l&l z!l&jppuPW9N)swjh{xLEQAWnu!ic?x*tgFvEGoj*ZGd!vdgjzrp_{UjX63n%u(#&x zhHM9J6=$5^{hC=q1Q1e!3ht;rFN*DN3Wegx?~e&EZ3vw#?6b|+cR{5!s(bNe(<@{l z@>;V8y{mo*eIDzn?s0RaG=!GOl^P`QAGN_mH*9PlJb^W^@=A=2jTl%6!Uq;{yzKI} zH0WmD3Elj4^pC{{3!b#oCl}Q4N>Z^0x zwiyR0RVp0pk*3k~qHW*8YYR+MI@tBpV#cLDq`grTmVv5F2H{i)k+Y#529DbY&N+W+dh|_3Dg}rOM5bHqh%tV zXT3mhx(1HyDiOqpfnM?SPf@ph)EC&X+Vsoe*ht_Sj3b|t-|O<2wLpu*DduWtwAL-; zX(H~TG0AdantX4##jn}VmW+3iw_*7;m++v*{FGQCRZmlABN7ADXM~qtx+5nr5~V{G z+i}pm--I`79mw=ZtPobd7u)%)^hV@s%w>7Ea63y5(MM5Zj)X2wrm_s=RWFIh4&SLZ z^xiVMtcmBGSsS>^f7Ws-u}1MPRAZ=hb8AIxrV4rck???b9hVKIrEQ>F=Rd})5GU_@ zp~}O?BNKghK=m+eGN-%3-yIuJ*`;Qu^hVWN9KzX;)nlks_#+j}V?CX+YFrRPs1WV3 zV~J3T*8nP+__P=z)rT~VXV%uI55TjO)m4`&qCmP{9^eAtW%tYTy@`5l>n2v!lJagwXJn+UT|g#sJi`3Eu8cu#>9?iDare!^o?H_@ zP*u(d1WgAFHf zhGmY977?$)Mg=-SneEDLLbGYbV)nHAO2nY~3xD-#g4UMf-L}K3gSLxxV0M3OJGti5 z>efart26my>Nqi-OXDS8VMi1fSy^r>81N(iL0-a#%J49(L*t0k-Tb=Ow<~Qk{-E6H zVeJaPt|e3HHJgT@ir3U^6rsl61&hTu?cx4|FsHyP83R^ly+Vm41P!e-OYvupA!10@ zh4}4Hs%mOrl%t%ndr~03q2QPJKK^p3m~l9L@YUOw3xwi(OBTvSP0Kg)#ws2V6@%?= zethU#UeW%@JnJz1G7WQH2wh~;#-igStDM8eK|E{zZVo@)EoPF~_AJ9`c$DcZ!wZ5L?4#1Iu9;JKoo9vXRX!FH&e($ zAuokoyk`(6*C}qI4r!LbBX!Za>tMrMKDjX=p_G-i>RQ(IcDWs4t`(K^#=B~dbADr< z)a1Lwv}`Z7({U+!y&tRl7FDVC<@3kK2gvvl@I7EXm|Owm^=c4Lw#d2|R;Yz)s zjmLJ?2SyT6LjTZ=NCZT!eX;3+i6p_jKdLe|#lLsx1B zJl3j}yT^DvfXo(7SA>s7R}}roAFl>&1%g+9_F9d7h@< z)~F`WZtXnyw6+wso%%fCe24q~-Xg8elJRZar}2#q|I4IXOiQoV4KOwTWW=ef;SE!1 zw5BsVwhWHF=cDu+(sgG$(d)n?%&C{u!S?(8@~L_EIj!}5r$a|0*BO(saVxZ*!u{MV zyzB-s(p>k*OI;d=@4K!&8Uu1Qs9K=2^Hn;7tUeh2V!EOb2hQiu(g*xB&tIT%xRcFr znUfRybNI`Lw%>2LInHE+maw`R#*^ZkGNM@rawT;@0@T$mzt1)#XlQ3A!n=c}o#fi} zIC|mfy+sX4fxuOlF%GeHim>U);I8%Uf4n1Y#d2R{pKiOp%_hJ1X?I_NF4@r?9ipL) zz)Z)H)1M}^Ij8y0lCCo$$p4>qnUN5M$>UN_o}Qkj8!EHz$wQs>;EIrgc3ONF-*3PD zrjB@>q*G3PACP@>{GJ4d6Fsn?5Je;mQNu54XlK)#scc|rFfK;ygt*(%Ltp!{rLE&r z3Bs}GnHaH83S7M_Q#?vF53BKz9d^<wBN>>60cg5=4{G@^MzA#K|AIp9GB5AHJmMY0)8 z5puft?wOiuSlvHCN2fc*wRgusD@hU+0wXr`H*MK!KJ}(tlB=E~vaU36vd;zJN0u=| zAy#A7%$~k$)Z&%xbvv4p%(-Dx-i!QJ>;1<=LPb!X-ul{cjDm@NigO)butaKjgchi; z8Bjz;Ma!>S{hZ~ZO^<>dI;NW5?>H;psVcpJ5`Y%zjK3pkx_XsQeY2e0&-J@TV^asY8-?#(g>$ zmu(CrFhZanyzhU$%p}nOkD8CE4lNNmIKXTaX@^5UZU|!q`bvZQ2vo=8{)i1d)Z~0h z{m#D*{bKe-jgM3nw%nq{b#wC-SDdXFv!z=mvmVYQ7#M>0fKNCg*9exv*(h;TCf@`h zLrXFYQqb?0i@%0Qo`$-nEwUOQfEvE*?SZPW&6?6?#$^kupL#E`d)1ZZ94(SFZW`sNu?o+(4`bXSE18}M zC45`bBIz%(83*A+E_6$WsL3TTBO9}(Sc)7}8ryduhX!`Fv#mA`fY$L8or73v!O#C5 zBlGTsZLkX;XG+!Pa7u{D#_Ltb2y069Yh>4H{D zVQa7XFV$|)brQYi3ms?l>!wLF7LBcf9Yy@`@cy0QOlxIF zxDOe+E(y>FlL@@co*Ad)loT?=U>(e`6=c6!~$z0lH38@5PzZN2s9j%J^5HGWkCDlm@weB4NvX^ugZ z3^}^dNw-y(5yf#rH(lwum0f&x<`x9l}JFn={5>PKYr$h-wx6%=; zg0Ht6AJ?@)hp)shy)7)YauB#hwLz5gL{b{{%DElqg92&7swpYkgJ0{lW4{9EI0af8 z5||%K7Lc0Xn+%ojIYSVLSSw3HaQvi44wf?vi-;!i%H3~4TU?B*KAPnN%!hPnVpo?7 zWfQtr+m07;nNOcD2aK$F!-^H!(1tt~6>ud`2YzrIyZ3g(&-{mu(sm!d=iEJJzNq%V zFn4fsv5G`xmObeiaM#x)BN`nXirQJ+!IcX@{5Cd}Q2o$XLL$V8EtkV#snc!1lOz9I z2oa=-gb)J}ep78|H>*2k7Q5+dxil!pDnu&6(Vs>3^Z-&0l;`sl7f-D`@$+L97S;vV zwXPiF4-Q>A=HQ|H^$O-kD!nfvW)wL+YWln-k7ZyJANgsoJyAEj8#5`Oc<4{(?;CHp zG=J&>g+hSl`wTF@Q(@K0&O|Aj)@VPa1NTNDH0g? z8r*}vT~%o7#@;l$LXSkgNvi@5lW2Q6bVl}C-=+rX3Qq;z)I!dnYa~yy*&M&~u-<8g zyMhQMf^MtJjDk5~w;d@IkT`5RpEzd)kSp=t|q?Wkya zj{p%2vV4axG4@2&{{`?VBFg|!SA@7{DI8nT<2!>%^{X%ajiJfZ4X|bch*{{igoK5q z0x*(|D$*F4g31aOumswQy-ehq$x=hJ5wBGfTb8_t{hR$6HR@0F4)$ZN4OOAW>lY6P zZ@0@q;A@D+Z6+krFtEAm)DN0@`P%t7wEJRc(jg-mx@=Y8f;NkumB_Z@+1ki7L>)W! z1vyWzb(rDe{}Vc{hrKdNaCG19U7frCTDZC-i?O)1#x6PP3@Q9bVv?D`w|dk*fv?>p zb*e-mq?IoN(G5Z@t`ReD3z$W+a&l@w424d#Y~v44CZXez2#QuyqAh@7X0EQfj3>5( zB(cHLj~zKc!RbL^3P&^szAd`bgz{`Ek?TwigT44-08t~xa&WXxfJ2cB2-d@K|46Qn z$xQtbRHFEN@*gc02zRPW(%mc#F|rM3aFuu+mpDez#MGK)Tg4GbM~3Y~BLD07rVY^? z8_$QoO(1dCx9*XjYJ6!mMm;C-b6v^bl9voa02$sZLAHt-%v@Y5&}M{PR5^?E`;G5S z#o;afd$z3s5`$?43A|zc&JT)S&{%%D*HW)a%G843tn9N}57ZnP5MZ>93x7^fita(G zzNHH4$?V3x0RB|k&UM2P(;$hI=viT0#`#B^2D*?R_!vV7uF(QSQM!V?gBkLRbiKC- z7B)nbmK1KCt{s^k`o|{5Jm#781xF!`7z>jwsd1@Lt9GJ=L5=WOC`r@c#qUp*SGs4( zXNY=$hHH#ZG*jy$veLu0hHX)R!G626_)<#AWf>TD4k6u+P(?N3+iddR1Ic9lng*WH zD_8B7M~6yr37o~lRoB-qS+227)diMG9}0ZUdhcW~xeW^fzx4>tptpEmL9D2Vsvy8g zMhx!k*8v=?CmcUx%c>nY#k#8%gLs>Q8^5kvK z*>mvAu*znHfv(+Iz4fFB*4!*911?RXUYXU7zXPm=pC)x$U*U|~s0=E+1$UaD84Q!}6pXw@s}qaR8m;@bJn? zQiT-6a(Syp2QjEX?yX&Le)3L*6?T(48As{el+hAFXe0)>KpsoOW`LuHp3( z&zP$C@!5Qe`f@mxCfAZv!jlvqAZJpZLkfgfH(ej4%cZhpUCA=6;ji(uo-}du7#*Q- zBM43FON$@Y5Eku~Jqrq3N~$XHawH)(6Jt1qUjDL!f6@P*HmO{UB(Umt`?7qxDf5Z- z`_+m_Hj{U_L0#|Nc4dTvy}3bn=fmhff7y2}(MpyA?Z#w8l?c2+Fk72@dnW8;+ZR*s zX`4Z@&p6NdHhm?3%fBCG#F{ltR^WIedqxiv^(wn8&nR_(X4RAuam1$tf&Dz4J^wPg& zZ~#^A8`xUFnfr0sq)7==u=jh4z+VTpc$Zb!LOM78bp#u0HX4 z?c@uGi??E2pMa~8(EY0`N7FM~H=pE?RNLA4F!9Bi`kc*j1i3|3bxp$!(xLg!58b{t z#?We%!`t7-L70EWdvjh^M&`k`ht}HS^ZD|;+|GC7+q1*5b{02(CW)PjIwg{j zIlnb~a;c`?%w*tI?G@Hg&C2iDuc}GWw@K;HpwGIT)tZv2KxP=|Vc&J~n!Wa)$*ZBP z8Q0(5?-o7MO*ug>CY~Ri!xqB{U$qEAR6~P>jH@5LWqyh0>kau@sYFD9Y$~c@qT_x~ z?u^6uME3LF7qFBqc=Xw;#_xYa#K?Q@)w`UcPJxzm2XcBU2I>)r;ULs?F?3o3-aA{s zn^Of62*2H6CKLczBqWA}G{?4}ECeJr`s1fgb+>ZI+TGlg1V`OPWzh1*}F&yy&Mir|VkYXZ0zy$5z->>fp zuC&cah&`}f3U~T`DZPri+xGEx`+Z0kLSZZ9k<1Rcto^34CSy0!AV+2mn(zI$ajzDN z)`(N9wb*Rs7i^3EO1GbW$;QuCy{nl^V#jOKh^`;4Be{3WNvS=d37uP zHX0BpEUPRQdR7C)g}63%C_H7v&?_WUQPU+s5>kNS(opEO=8t|*b2NHSARJMB2i|3#=j75h_-Hhz zsMnxJrl3(T)yKz2ILNh$kC+CyzwpL%K6K@zfK~4V!s&Z-;IO`~$liGF8>T)aH?y0M zem~a_?4pd}7SoJLHQ8~QafV$~5nLqJ0$O3>B_seDtm^vjd-zjP4VaV>8@j3xJzV4rSf($5(!yCv@sB6>DbgwAlS>{W z(XUcZ-9)nly}}!BwtUaVU#Aj-4=v>|E zv_2oGLf29DI9~?|S5vj|UY-Q>$oN|jFsPJTfh34pq27l|bBe5;9rH`+pMN6nftt zG0_(%h08GDS_a+DntkStYSKd*+_1n#2 zM@5s$zwmz*H6xH@CsgP6g1(3Xjy40{f4qDeYF;#Fw04^wj5zhy(rK|N?*Nsoj$U## zrw)zi!VzZP=AM5(`hNL!8wsAgBY6$IAGHI;r+ zJ4JumF=%GCOUV7>vf#b_OzP7t)oZ)9v0wem?!zr34n~d3Fljc7pvX{(a4M? zlLT(!LZ0ZS1{a7L@IrJNldszY!F2Y_N89=J&&#h$&2CDstu35{LHKG7f&zp<$ZL*7 zzId8ed2AM%46Jy)KpYG=0xX)&QmLOKt;a6g)Oy|hBZH=Dsu@3)w_QBB~Z+<~9NPQ}&t2Z3Km{wyMqZ5BjODD7V zHAD+~VPhknwX1}Qgm;IP#I$2hMiwY zQ3EdmzouJKQko)zg*K7v%QIF&UOGJw&Ei5NB+gj=&?(;+$E*u=F1LXeQsTKY5aJwd z?~>E=;%d2B7*gsVntHm!*xyiR@wwja&R+hE$d{^H;f4dBLM@!&QWUy5{zouh)k)Lm zB}j%O|Ap6sPs9Xgb>&#`LlTo0g^H**XAK*;&`@=2oV#1V$CKPeIfZAz-?eZbcpyvr z_~06G9S$m=noJ%dDj81Y!2A3_0$h7!6SeuLStipe z0Ocs&Z6N5V5LWB|0+(TR3bM<6y9Vz%JH0AQI=d=5_v)hKmo2^^s4ir=5k*I6FH#rl z$B@Z`T4km&8Eyt+q2HcG+3S>jLiBfy6i8NTbX`aFA z70u?901{GXwqfP^5sDT7A4-G=ib4BkmcEYXcz=wTJELRM-Y@U-5xA`=19{x;F3FHQ zH1wvvkv<@uxTbpBUz7l`F<;7uw{FoU)_%FoyYFB(;@Ff9icgp`eKX5c8GC1KYcaxX z)y*@nQwi!oM@nuLs%w)X6e1jk>)OMTr)N@nULW!nvpuVoA*?uk5_{J6Y`T?{LvSpX zSb^L^IiT%6@Q7rPiBb!Ecy&WVuiM!`uA$>Y1@nx+wJ8j;+gaMVUvfsgHfD+takl6l zS@7)u#~I~{N+f{)c2%jd$v5Tn-@$tKSrid`h3y5uC4SkjQp=n_RXnEBjt+-ZBI z3V#F%=H-=e4QCW{6U1wB{EZOB_y1@HvGDIQ&nD)x#^M^+)>kp*Us^96)L>!ZwT<~; zAN7?hm8DoqDg7S=R&zgPb8DJm}do6%fisX9Aw5VRg^cqhh(& zYE9@Ts(+s&4AY8K(He)3a2@(;g07IVYY=6=P%YZwmeZMs7c~HE!ccgP$zZkmF=^@- zE9Ue6ycf#m5{K6v4k*tS(g2~4<6wq2J#9Unn`^NIv@_I1-uDsQ7jXMk#qFKVvDiG3 z>Cm3^4-iT_n0w}r(PzmRB}#PcDC>A-Z`L!FVR>E5UzSdDTs`}dsMTa!GFG+d+L82H zzr#i9R&h#SOI~KvM9}@}*5%TXV2(pH3q_5PpSeUr@T7$x?iwR$0L3yC3K3vWowL4Y z%A3ZWSM$NPXbKq3_Too0dtPExL4V5uiV>xs342esZ(o3stZwDEFl=5JtX0n>r$bpgmupFXg1C6D8 z4wm0<>?8GMa!knz-E7v-KY2!p*d1u1QEr^b5u=rz-_@R1F~{w- zL({F-d-2zGw=t&Mr#IH>)t*|Wm^b{cAeLIRUT9p)2S4k8NHmr_Bfv6@ss#>q3ZwVt zg9B7ljITX`KhF!Aqfk`QCZA+L z9N%l~8hPTIk{G)p+1!2|*&3S6NGY=}&plH^jybn-h2<&59bW0Htsyb0{%ec(wi=il zXsW2Z0)IybSUOWM6Yc)FfDyXI{~o)xe;>P`S&)IxIlk} zldO%zO3UHj>gHMl9*VXlh`oR_VN4~62hN0SvSWx;A>-t0B*pQmX=a5Ymt}_(;!+DF z!wLP{>p(&mqE{EAbgKCoXz!)m7IfUtxtFk`-a4f7&pnn#+coP~Czlgrct{Hkqp^Q+ z+QeM8+3e!pN!wBlnfgk7LXpgf^=l?4YpT4HHbCOgqNmTEJrGAFz}~cLT?+zmQ(*Y! zD6S+Ymr=_2_umO%Y&!*n?#{6=BMu1(tp0yM;m&6j{qfb2P>`cm@DFLKF?XfM<(;=2 zqbHp{3w9+T3sf~!w{{y-nEt((_Q@~_vSSST=r2dfNBblpB(akB@+dv*Kq3TwV#2QQI7>qd|V z!xenyEoq7LprH4GB8t^a$@NqHcBPV3%M9d%7@8L$nzd{?G zqxhc?uhxJ1ga{d*Ki~cC^xjYG6MW4F)@oYT0!U39ttXb2h&wBHi!?RSx#a+SrSf;! zGA{yoD?@?jm%@D&=w6ZM3oqK63!+)j!F59GcD-9xUqQy)0`iE5e6ti7;CL)${Vx3L9nHNiPl3Acy zbZYE~J?$M~22yqoj&m6Unux~fuuOTLkOouYQNp_;w%U{xtGzEgr><*=@!non3JDH- zOUhn<7e7(HzBcgS)+>b#O(_hab^3!LXXfvnYRiYCS|oqsOkT6U%KuaK%d*k4A+x7_5BEH{g__X2b%z>;HeY=Rs*e|VLC8kzZ zDogrq9B<3M{h6J{<~2oP4EJ>HFljRrZLtB$Ug6~s3s9MdmJ>h7!w6xUBBZfnyI=?3y$D~RyNKD}76 zJI+6ln0>sChXKL+UPmHZj7_~xY!vO7Q)Rv?ACuj$l1-~sVG&M0Z1$ZppXvQn{k?~w1@%O#sp672JKW>T@E-L<@ zux{UP@%Vt-7u#Jw2Z%n#x&0xKM(rd9#(g&1POH}E$#2d&O_l%rLHIXi+QV!SY81;e z$xr|Bh5%Vtm%l@pXO*sw#HzG%i%i@5s^|mnvD2s0=f!HuzRl(><0ribt<};C&Lq->BosB*GW|W{Vkt}-bl5~&aDH;>d6Hp1E(I$zO^0WTElsp zJh#>qQD5J%v_KAHM{6yYtHRW=P2Zh14nM(Em&Y2G8K{Dsil1WKZIA%_=arT*id3NmH-|>yP|Qe&qKE?YMP?I!bTRNPcDL8EIg9e>cT&y=pm;E3LEu~mr*)C>-f#NH zTGEzfmsTA6enJSyQ!3NejN8$sq(qug6$PpMH5E^n3To{B#~0-zO_D;lMkh(u5s4KC z+!c6gQbK8+Dq3y6J!92Wq}tf{_!RWpc1fT0RHx85(a=C2k8e&A)O^s9b}b0wX|SsMj#nLL3=mQrV*^4 zqAvFB$@W#rmL%%0Y`O(4$S$(w?@a8_P@c{_=(b|tSm}!BK4S03mwSd_e@&^Vac}$i z_J`6JgqS`ox!rsj>xO&o0Gsq<)BKBDl<X!q&=R%7 zw*eHGhsQ+PX8EnVm9v;N0G?O^?1SaP1w>Yk+&1#{>`mdE29ws8!!lf&c7jdeS_?O!wcy){^KJ$8Q5FFkeqn2kJrx5Ipn= z!S(k+sD%t2fkbGm!c0s|2nUEbOeiCuFnn_ksJo%|=Dg3w=Bs%>Lv6|OiZ5 z2s!uQ5e99-OH5kY?MMMTaWYbT-o5y=?s2w{8eM9b&CxSEdurV$!jHeGaiDUN^>NP& z4WoA7^Gm9+`HmmbKDtHzZ@j0^Bm_Gk58Eq}dO+a(>4{`cz40gdu&+0lItLrv9sD=L zQQIoIXHve1fP@Avk%@C%ou7h1-xboa`~1n=5x1e=HAN|QHgEnQIH%9ycPhy)pgABb zKlC}9kn%loVhdT$=4$!465M+vuKb$wOS7@y>;{vAD9P~hS z-M#ME&Mud%-x)a=TB2#3<&LC9bbL&i1e*n8Y293#(Q6wY~-d=%Ba2SW7&OBFB-PmWoQ-ou5TY0D?={^{P#ebjYjT zg(Bs3>am$O+pC?T$4)U*N|a;RQZGu|ZO^Be&aPJy8(K)?-zVjmql5|&*oW2#+80p{ z`iNzOTrCZBfqP|5lk~NPMIcx!)I37QU%oSaM(O*KFG66`1Kxd~EAzsGGj`eQUMG$o z{rsP2bTi))ksS=N4xj4C49XV@3F)81YazrOlJ)ixM?q6O!07|LrLXq}^4>-8A;7K1k-Ae*(dHEskTwy;3Fc?)C5+P5hQ zZTmQ8t2Z%*+Xbc^A31Nr=YJF1w5c_eEaHr6@l-?cI=^_=bLe+YXK|Y6!Z{rgZD-#Z zuc$o!AT3^asAto^=}#1IQ~|qA?@DTLYvL0DxGS##Onu9V|JbNqx{NKB$Imr#H375> z%(~9jbwNt z2YXX~_o0TbFr}tM8WyeHmK3Q$VvwpqTzlcYMR^DJ^bVPYd$8AQ+*&^0A;0o=Rycm< zkMHB>gp41wQOn-GeP0~f)LX%K00U@6>Ah*Bi~tI18nsAE@V$FUay5I=vU<_|l^YfF zBlb0~!8CcZeOsKL-x}P1zY_ zkmRu|s1xa*{z8I!I_29zcR+D*ODV`j~@8d8Twcw^6or0ZI%{~5ca^F-`^zg z_m#d1y|THIA}O@M+2F*gr}l)%FV^Y2`0bj#_+a-@eS~i}uy#H1bWI62euhwn_>_ae zF{%oRC2W*3^%(1}UL6)@POheMu=dbMKK_XT6;cEVO@52WT6w_ltijf8|) z5@(!0y?SFJWT;;I>#agg)r$PEt{sN|9nQo5X}UyN5JXgU;$2f(4(!%M1|L7~QdYOtV~_l4Hgd`%raRC^Uc2^7Nd9Bv2fIYa{!&_W2&M&ke3^|5%ilgmUSmOvuom)EGGQ}w0i>}N5 zZQm|z5^+evHQhYMRjRJ84smeH4-X!&C4%&Fa+r~qj+UWoGNKaF-cAxfv*ewM9BAr1AVZeWeULWgcNv<%Ch&VC78JgG>z>n zyx=wrHx-Hr!b)a6F|8wMEm9vLvt5xr^n1q6|9u_*mi9}j_uiUO6$WU&#AEwVj~;i% zCO0;b!V4vnPkN4~JB`nEMJb@!&;l#?5_0}9GXDCtR)GK7^l2g}v!dYV-$H_e1$V9+ zZ+_^uxP};XXpH%zLyXEm1=+^G-YR706jvZ9wDCe&>_qt&>rZu zNe@&x(^LzM&1E}6CEus_?Xvy^Q;8AUmf8Ok(W34EYtzXz5<4LKt&eQ~u3V9P@a0Iz z@}`e0;yiu-rn0=fc<$RqVIgb1aJQDxJ+pFq-Kx5_R)k*ev_cBx1{&f=oW8F4E`|_w z3$4>j(Bl~34p1*WM_v=ID))*4GE-KQwpBPi!7Z3$+AZEP<-IL2TLk3OHABZ-+x4I6g>r(b*qA~hqx;co_n(LTFtOE=*uhnGtw=;9Gi1p!GC@9JQSP5VCU{qZa9IC zQEa6vQNS(^2mr?ZpR4nly=>_uKNZ8Mc@08qTya1)-eZ**5eS z+m7%iP=4=_*U^n|8ro7ye}7k6P==EtB;9vj*P`oy=ZOjTvZdz77-yLx!vC|4PA!vI zGIAPu-*nb_s9i5^i=YAS&!YSaPx4pNf;#8c_Uo}HVITCUweYK6IL5x1kYvvwQA|JR z8Br>3HE3DXE}VESxaGjq?~H|R11mA)yd0K^PzU-OsAJKA&&V#R5ScI*f<`vm^=mn= zPlc!T9UQccNWa2KoGqKxbd`EC=7QE+Av(`InTYs&#^LVDZb_eMlQ(5ofimT8_b->mrv7 zS>1Ib0;Oidj4<~nRdL}$Y9JNLK+s0+WMXDD@q;m-(2>1q;C65RLa2~;B%bl?TJfXJ zNAl=N&Ml?Ka-rIRMLe0|+kGpd6q{qoWlA%bLPllgjCAn<>F@P!n{2E7KTo+Epx8l! z6o9gDqF!=hdxfM=7neeN8CjJm?Q@*z&@*Xw6rT0wx!KU*niQ5 zLaMjrx0?QESK8;OjB>UBv5}6(oR8XTtE&K`zt#TMk2e~>Q-QQUIP2l_8wa}QYIFmv zTI$;apAqX{y}6*pUDL<)AVJt;IUVMQfiOS3OY12Y4>SfuH4#FX8yr|65fN@5quQd# zy;fKPCQ-RJv1ubs*2eU+7vXAcS4ZsXZ8SNCKI z37(eUZpp%2OLd!E31j2Aj1!YV_(Q#pnweX#=O}PqON&}`akq;3OG!D|KZkqSqerOyVZaffBJV`kO}%k zLXR4mY6&v*dag)lR7wokmmBFWw-IOjP@B0ne1*=3nJMOzseT%E{s+Vb*!~Z}-$#m7 zsM>AjL{mE5vlIEy(jeNg!_EB9&6tT6e+f#*a;!X$_(EI2mTe}X7-$O2D;ZezSbO|t zyAYBj4BLo8S$|=y0TFDoL9_rp!1Jbd!FUugiz~N-xkkOUm#)OsF|)CDjv8HVFf`7+ zCe^-Q@~rX=i$|81Olss$T)eCoh`W4IvxS1cHlTacqTW(02}0P<$F&e%|?$hba)Qk?GlAcOg;@_$Zcu&mpbqC{c>D)CCMaqY<>v5v{%lfxZ#p zSB-B3(D@KX+bTWX!-(eouDpCriS*yws)tYR=q#VLX&5jI7fJ09Lb9xs@b_a4xSh3e z_F9(wH5B<}LsIKi1-ygLBXyPv2}73p0*>Mt<;gBWJN1jCqt3U_1gYIpR>wVEEFO7q zFq^)F6(3p}byp0T=sz#sxJQ4NdG*EEL?Frs(CzSXoil0ElN8>ZdYkLa*fT@`Y)xc5 za#tR*b>)d}fF2MV;QW0la>|PCg@7$Ewc&0)Wvg}j6{3YT($muk5vm&eiQsmxdKZ{@ z7cN9Ar1|TEWaDD*yESk~6scWX!S4+0!^T-2{{450ADJhwPi)~i?a9n*d*QEv!zfRHrkgH5qSaNM7DHQP|lwmPn zVD-uI!Od2ynz^_8->V;G0M;49|KNE(sWOT(0u{Dw0dx_FGSU6t+=;jQXv59#3d=sb z49Y}d>+CZEOmm8b`g$&&LsM2_PHho%*7qiFRNKZN%P`H(YvC%=ox96{mp^S3U?zRm z6+xq^4bW># zqPHv0?JfD^*rhaaz|<$8UWy@zK`xtB&@XjQ(*$rD=j8urR zSjS9;hV%U0qFnaW2}ege=aI=T0MYDwn?;jt|I8$UrR0Ms* zW@CD_tqK_eq8kcsOcwCVgqlR55FEk}JBvev{Io=7p{0Kjf8CRNn zJ8S81Wf+5Y8hm;msTP+VygfPt%H!o`O^7~{(+Uj z%Nw&|p(gAy6WL0COOyR8*&XMH`P*02lFq!yI(#JX6^EPL0!`unN7h@1RhfP7!#a*S zionb$qU5N9NGsi_2q@Csh;ZnVZZJ_&x=XsHIi!e!G*X8SX%2m;L%!<)96#UpxBoa? zm%?+N+Iz2cuY28h>wo8uyqF$mA0tzCaS02|+^6tP64j2qN4TwovA3iP9on8|_m+HS zA2+~t+Pdasc5Vso?;HOixPOw6l?DD?qgU5U8f*w}yG-_Tft^@sNuRrZb1GM=g*`Qc z8jVJ8PXtM4#6-bn`Lg?Xh5J-_d0s8P1XF1iVe(i1eR;o_>(tb7H}t)Fvc6Z*#^qCF z4j#=GZf*${AM*I+ETLo;^K8``+F=%&SeXJwIPJ(+fq{V;)4-@DRQpw58Wjgi7Em>6 zXAcTiDQR2&{Q9WZ;+Ax91)pm5(!mh>#U}*qUxsbnUF*ue#8VATO4SHBhv#@AxFWxA zJxJOyF=abZUAdx?dWWbgH!G`|#x|jhSa9nu*o7+A!_xp+Xw#QH$nV4WB*5y;#(}E2 z)D-RS!fv~z00e!CJMytnnSkbVxkZ@p3}c6+yUThv%Ir<;*Zt_ihN)Tl;2m0YO9{4# zvPBwRBpa(-cQRrf)+)iaROU0l-rxrMA;-@+!`HNxNii%?9RzJUkSy zw{K-kO|!snL$Y4y=qux6NqzZ0E}ukQGEmXaU34uv!$Gab+Y?K7AlKI#19QQ9DZ`(a zIyK1oU&GINW=ZzU@AFI4NhvTQygMSg-t5@Jr{c2?!ZFZRKesmtwG=L!M@I)ouBYkW z)bQM;^MuQaBb>63vUuj1h933jR`a*)#^Bb)>Zns9{u%janyfaF6(*Y!bD;c_mdHVDz`_nIfXj(PU@WP5d zfyJul+Rnq0-Q#X|7Ea4rP{!G=Tocqmy8TYFOSx447W;Zh^^^7T-g$@1RR&{{g8gd& zQw!k+5!k;vg)cfwumn-beC>=#EBU@_Mgx~cg4 zs|L4WY#`IOEmX9z*Z&+)({uBRzZB3f7t63Y8E?{|3J4r*P8-!PsoKq9s8ian=*%%MoPVQLek= z^egWIjPZQjRR$;9YBm{0RkvboDaTz!Emok#3d0SOjl*h_#30$*1ooKl4sp2eyG+L= zd=GBiayGopdGFVfTTug$vUnQ{N6WvqyxS>vxzC#j28%NeZ!SCwy%hV8G!C~BS0rd% zX>_xfMMZg|tOI2Y+6BILWeGfr^IuHnT#?E5X-K7kAdL0$R23M>9PV`Yd}YDd7*PR6 z_@ia(J?i9T#~AUa#1NiFcC!}t5N>hC0xp}%d)dP3)GJOR_nx1pa#EpZD4@V*FD4do zGRtxinI!Mm>|DaP2$?8Y?0aApJI0d8P_X&5TO#gZ20^#jLI{(o1xK=@S8)m6@)m0pd?^KK|&;{4b@%%ULJ$X@_4>utv{dC zU#T%EfS<^@z60C@I+YbI4xtUguRTxLY8m!GAE6&ImF~Q}hnq+W(=_%%#JyX7!v#ACORPk}Abk6FJLcG1SP{143@T7~Z;LyYRG&nI1J%-%4#w=;$Ez){$# z>e}9UI(PjmKj8U27!}A1UQ81yA4gvu7wx6(-{KH;dU@L0DJIU3g zg{@`hq1l^noi5eu&WFnP(CNpKF#UU2Tg>fALAv)%*?l>4yg7m zM9xw=J{M~RyM_7bIHvl>3l}i%XS6<)zI`I#EGzWY-9E;&FN$d?^Q|%M!0B8%&eBD1 ziLKbv{AWjUJq*U2du)9+uU59yxN{NNS-#A;filjtk{Dka0fQoT$5p*BpI>_>dtttn zXQ(M6XN3@xry@6pWzHV!?N{8RmzD#_=TOH7VH$pT@j*kd+CneMW&DRiY{+ECGqZpI zV>auQ-MRD?61dsz?fgzO7Dh(tP^59{@)pPPzRA2??BoqX*{&ccip;Rl?Zq#i@=-Ts zz)9W@Q6Ii2#eENU*H&u~-9f4f>mvvI7!(JBj8lu%f^#wc?$FluwvqtXWj~w&_%{7N z>ruLuxRuSpj~&H?>d4CAU(q`+f(bcbY_(WR~IP01b_5ez0l-`E=>ASPC}u_<)g zT+Bw4Mu3`ZKYK>(Xg?~aROB{tI-B3d3nXu>i77DIXZbieJuzly=ZDt_zcn4rQ8Rf8d?`v!#BDl~h$OOYflbvQY1 z!J}+U))LGKFut4izMH$gagsah*whdP<+AKw_`|2p!;(Va-$qj1Pn4QNDW+O#yAD_z zgj8a`EPlkgS0A*o8nCB${qfckzgxHcrI0qxYBu~Ym}akb7DKdc3XiXtTwUH&LebHE z@>I?p=Z$&e`Y8i|k^YmA-yTD2w)R{2>Jm?osSSQ;YW8K=z2*6t9SF zhuJ9$z8|)U0iR;QzIpaCPV@VPOkKXY7;{=|uiu?A)DsW(Y2)(vlJ%`|IA60$B7#i=N57<@&@8!YZ}c(jH6aVR*VgF15bcy!~F# zI%R%mvs^Fh{k@l6Qg=nzm3v|I^o$SNVla|b)X{V#C{@w{yEL1|8$HOX>hNz5LS{Z5JznBX>jN96$K;Tj zk*pmJ`iE?7Hav=6<}A{3Q@1(~+z#SU=J(sqohSIi8ovt^1bUoeW{S3)Wwl%W>)$gC z7pSc!rj%kzL>}CNW~bBZi-~VL>*&)SlZIgs2$fx*3c5_jEZJ?&ar+=5&;2j76KCZi z=IHK4Y!pBzc#nC`<-*Y!Ij{kv)!D65>@@0hXy2n#wCRu60!Vd(P5YB75BBYSr(BzXInzBLx+oK%^aZE@a&S#!B;f>b6Exx!J^sn!_vb$-U?b%LLDNBC!pJRsx{xeg{$EE^`THg@Z`Ri*^t`FlUYI#-{0+=eAbfQzI8=1-DgVSY&o=@O`ZemicHF| zkPr@)<51lrH5{#IzTXV-sPF6pLQ>pwl}JOij$D| z(6#crV_?UsTxG>Js%cQMGDq&M``e~z7L_su#}QY92=6$X@`5`dHDEC=c{bAy3OM3POPYS`uSNH}|TslOx%r-VaWT z&ITlj>EU=*a}zcNx6{Ps<(TTXZ=_TX&vUBn4T#R>EUI>t1eqw!ha1U7T{~Pj;0uq3 z2kB!e4hyO7Y{$|cpMQg9Euv$okcKH$YJvlY&ia0JnLX5HIAo44Uq*yu_(wqSPHSPyhpkmcLc)iv96T?P+0>5)go<6|m_K<} zR~e)w8mc9f97WKmjRYOybk%PGQ8m*p`)I2v7gHXo9QU^=gk-rN-`|xKDoEZPCTHTA z@Au0Uo}beNF+Jb#eX(EtyQ{oWXpV@*WM_eVPDR}W-B2i-9+aP{vN4YMH|1ns%i z%hEfEGjL}Yqrqa-r~Y27R2HP_SwkK$5|)ppLG$WNqQ4+mFu;1S`aAeb#-1l2$n-mP z>J${}y8c_;eESNMI}6#|Q&Ee%%+uIc#k3SFP7PBn{kTzKj!0a?b5aI@f5q8au{oh5 zlEJH+sv}(=a&7wM1O26ar{LS}cCJI!05Rb}I)9-v7uW`D>k9+QU_FDmQ%}*^K6#9R zz%MiB-Qo}?A(=v0+KcpO&+aTRHE5Z}&N>HNqM(sp9eYC@q79g2S2DJB2SWB>RGfe6ND**lkKr>3WsDY?KSBQ@43gRC5ItT`}k%(Pn!mY0%! z`0(M&L-rwjF}wbV#hzANii>fC3H5g^d%`j-Y*3&*jcia9UEKQ*1?Sksn<6*cU+FB^ zHu@ci^IcXaC8M~ZxfVLHv>nq0$7tUITHy?|VddH_!ltYYYGAXjklrFu?K*h2bNe&w zyVLB0=Wj@KbQWNW-}~Z?p~n}w?e+h0fgxY6p6CK$IX6yf!dVb0DX|WI+@zIvh}*~k zACti(OB?e=@FK|!`OGT5Q`_ayWJE;D)wuY7zK%G0HccZKU4?IU0)dA?lz_8c(Kup7 z;pS$$u3jrp{-rl5Vp6jP%MmZ?c&o&)o(T7)314MCwD$Rp(wTA}chg7mZUae-P($SskpdTibTW*kgT0WTt4g;;N-eJPM#W6fPPA3jPf9PkLqm^ zbTT@$FKT-vDfXFwzk|RgHaBE%ezqSc57oUQ$rA8=Z*Rr z>iY0HkNa|ET;3u>SVCHrP8<)JzzEI>T3e%ug#m{7F+L8Q#so0d0Yfw~FiRAguS5)K zW1Z&cxRihHpKrMK9fTimP;HG?MLa)u$`;ke;O|grGr+lk$Lztn5V226$HXqm64Rr` zR9&u;PpUrBwI@M0TTJGQJc*^eCp9mOeUn@HaS~0Np>be8Y)~BdEO&(p`jBH{mYB%N zIVcC?4+WJFuW=$u-qJCWU$-JB1R^BpeY*q%c+2-|m+01M0gif{jx}2ScPYzVOqE78 zB?95uDy0@^2-@%GR?|b~-lVY`WB=_k#r!HBIh2JSl*C8TM*zjen-Vg*kRv64h6;~; zxh5FX0R#`Uc-|;E2nlxb`?i$eZ;-K%XuSw*4#2Wwd0;8PxqAobmc-6OvT`3{f^Ig* zKB?M?9qaVFQJ98e(PS-6t}_k4jg)8YDVUdg zt{|dSI51appf1?N%Qi#bfRT>94*p^V2jONB?a+n_;F_UT@E01-}T8#D}-W37ZDjU30_YT8gMGN(@j&2LvoC zQ`g%B#A+&?%50G9_%r~bC|X}t{%C&s=7B((3>!}XL$6r@aYgd5qxSX{dmGJANcs%AkA=u zXrZK&U(H+!k66Sp z)qw}7hyr{sQZ%|m^`~1e7NHH>?oe7yM6ht)arv$jez|Zi(|hN^Y*$gqqhx%~>zlE+ zDBUOO5JJte8zRcf1w;GT+ns|S= zJMlGs$J8>g+g`vH8nL!;-Hfya~qAh4O#%5(A(ys zc!NP$3j)($2&eDs|9ZwB12khdx_7&@0r3I3h9R?1Xq0c>*DXHZcwT}n<^%6+@J4E> zjn;VOh-)WR5Cu_Zv^%Klqko(aJ8V2;C;9a(xRL&vy)vwFlg3i%a9Pfhtyo3uCa$f~ zWzV+h+4;TSIBb_utLH9sl?#wISd1(8h-{yJOj^zK`iqJIGFiGo2q=ScdTJ_iij+}B zrrWUbw#$}fXGL|jJNUH{C#l2W3|m>$D7=ubGAABBBHWy zhE)&zP>U&UTn$s>{r*MM2fGF5Ntue9X$D=xOi!LAT3mu;w$JG*xL53IL0TvbUF) zm0Pwc_aQlGzQ4#MBs5gXb}&KsETlorHoMW$(HTQ_gf%ra%;`USNg#&zgcYwz0&zn^ zcY9%yysU7|9!)gvZH^XJ8`K4gdMvChHr}%-7yDyJI~*zDz24k%XSBX1?627Sj`nDR z$J71N@MC|5bOFKw4h_{R`XEW--!EDyFkggh7G--xJo^X2yZTi|_C8Z3i@7VB3^qUF zHpNMZu=oAZT64|;N0p=dVa%Etlq@PAN8k2=6<^XE`g=2IsWe#ag4K(0JpjD_XHNLE zq^pUZNe4>Iz?{+QJWYpJ-{ou6M(v8Lmu5v~ohlM)HtO_WSQ^B)8ktXn;-qhWTn#8JDePGVh8v1r> zTRW~GsaDFba6$6MsDRs zq;*YR02>8#Plb*jxMo2|O?j5x;Uq*p;srqx)CA9ovsHZ*^TV)zT*}>znPeW^ekgB< zlmw-QgLtA>leZ*WT_3FsJr>~Y(4gQ0x`w2J91zL+Zer`G0FY4YTwCp8D+J#gRSkM{>EkIYa0OkSpxmX zRr`mbH~Uo`9UVlqreG|1#X6&QtQ~Y9a=<*o7=4z?;Vz)a*@#YjCjianJo`wPzA!xk z^zUx%H)#8IC0NXq-3S=-zeRs*?jxpgW3hYDT`K20H_MuU zG~efoYj(NaUVU46>x7){vmdyUmtP$QiykRo4MjQZ7d5~W@gB~LgrTd*L>aM3^YZmY znk}M<$JJ05Gr`2|7IUjhf~&cCj#93crY*(af8YPFKNWSUqESyl{#9w{Usf z{I>OEU)Y;UPE98gwc$mjY-re&;7MJ7NP$*xv@4$E9x0(rit8upC|c-bXPj(^B;nPM z?9zYOl8@XVE9UZfRzxomaxb&)HZ+9V7;qNNWDSAV%ss63K|TeTUQ{bUI)oD(zXP28 zKGR|+r(Zk0hco!y`4P*zJa~`HpwOzPF;`h-SKn{`yE(D+{fL>qUY_3XTqM@yuw*~d zm0owTQv(FeKGbW@=OZeG9x2Ui`yoG{w`Dr8uDg#K(|s2+)XxlBeZlS=?7Z+&%KAuQ z;0y%md22tXH>Ac^!wPur`5uuCau&j}euQ@7akI(r$~w}i$;#T{sL?0Us1j_-Pv53k z2G;8wmZNu@o(Ta5cpB4q2Z^twbCK8mXjo=Pe_#b$OWk8wBl7>)yE%G=DOWR=e*+SuF8c$)oaeArNzBpkJ{aguROZiqF7>NM_K-jW}Vmw?XYj zmuDFGs%s$gqfqV+NcsBKPbNB?Ek?D1N7(O_g*D}0E$M@XljL%a?;KOW(@N$Qe~n)S zCaThpNAo_R)bK>K&AOC)p)4XKRQI*FomroTrKBa2_o4`}s(RC*nRwIG=Vej{Wn zU@}!QVB0Clg>;T95=byq!u>A;mGx+U#9si!aMtAz#t|~QQlTYd5x-7F(oeutP(oax z8S{aU(k;4>eF5YQXDzB93q(UHH{0wlrZq=T=}T44uWbWr?sSM)i0{`Nt}&l_ZS6eQg=6eV|oq-UGMm!{`)$7ZJ8DeG4ko@LBy zy4e(rnP3Ol_6#aX2Tk1y3vJ0iggaJNmso&`$<;#9`Qr+qxnOTHPQTenaYMklS=i0Z zD{fahtQCod*lo4?qKy{^(cN}TNI2P(t8L*pf>=GXRPV07uTwb7mFqMSAQl`L_`_7` zkeIn8w6S=KHzPxHd@JbD(%t*_mndgNPSPpOpZ>a`bMG{^DDe`BNOG?bNicm+n^&bX zN%Gr-8xK8YeoNYnjTp48i*k8o)%tHlVZ%WQaFf|^(e_KSD&7$V(?hTwZKt>q?JgMTyVm`TP5;+pqm1m1cB!0f{qr)AajYos(7FoN-QO^~7@9 zV81$`Bd0*xeR_v=V>VMj8{DquT*K7snfP6xwtQJ-ip=-wjRTNmJ>)3Mj5z99XCRw( zVNGz}-8DbH#gF_3K=4N_tfL(ZM3O~^5V{HMjXkf;VZJRijJo z4?EvT@XgvMKeE*2Z5p_02!mVE8nGqN~*q)8CJNk-TH1q`z6-6i>hh$v^4 z?)W(HgT(4z0qOF;^Cdus`hmiL%UoqQE}QLCU3!j#?l`&CB|i9%NJ81TG(mGpt}#5R zLUfox_*sP_5mRzW9CWuifx=5;v@Ux>exIqApP$`g zj+0FR!}to!mh4xrUeUWCyA(1;1yxV0Mi!a|PJaHgwy>u2($y=DpE3E$*>WAxJfR%t zO$8$bN1aY@kr?ZIs-9HTtGfLq9ZS>k-Z|U)=m5u`9^+YqF?tbKJNCbr)Q;*u;!7T? z4mbE5`8b9}M)M=BnSWIu&KI?qGi;Bx9gMcc2Cw+8m-;SMDi7=Em{TILoyS?uRB>tG z%PkB%_Aj@Y{Q$CH5wSQ}L2fZKx8h5a&UM35LqbiR3s%W=OiYq2m1}_ztBbcafC0-c zp4o;GffkS>sXf__>m&(VZ`+L5&slUSdQ(E-_8H?97x`Q|pG zalmi++4YKg2DAA*bwno*C-%`%kk3!gl;*`bU57^MQ>wDbmEiFdbrWQs)Hq{M1u;rA?xw8E-%P;f%7@Sn**$ql2Y&28hxIbB2Ta zmK-d}Ol^2rG{mXNr=y|U#R*U;u!g)bZ4GAkWne$B4zi8hCgfMg_k|Ad(j-+svnfme zr46^#+zl60gbDeu67h!na*{Vck-+ZT`FA~h*u9>LuqrdQhizgm$(*z9YSQgO5@k~Y z4MJUqbL-cIar>>5V?xSXF!qFooexh|4R?dE1%r@$|8kXM-GKC*bK=|!%5=Up*ZIv* zbh*>WWY4osp@aL5>cya>Oe-B2#^s)aY@r!4T>Z15fSj2|jDx~w)YO7qxf@8TcD#|V z+XKFWR5%COp(ZSdjoDCvr<)=j9bK|y*72Fd7xP5hsz~px1fyE(rxI0#4d~iwmtW=5 zwne4RhcGZ1Ahd-I_tv&}W6!dD7*j2yt0P5}s? zZ*nq3(?vT!^ivj3Hvrs8NbpXj?J)KldU5nZTCe{6z7uI#B;|pOY{LCwN=+JbML(X> z=~vmBk2-XpRu3wfo8A*rpIV%;^;EByjOA0_cz_e?)Pk)g@^(%3I1(2vFCVIAppYg# z2^`qBFuIyD-mM&cK_Gzxh>+fzf}C7E!SOhRx~u4H-4vyEvAT|x>tn;+q29f^i&aX& zkr}0DsRJp9ns^Dyw6ksyk{KCovEwID>e3%;`#Rn}I;@y}I$c+%P%>!cEeIBX9ij>( ze^F3mVYHmHZGti(mg)TEVR52p*h>@Ee$UfeGr?11$lA|f7ZF_A!rz&d+w~!C?gbC| zl#0G+@zwNJU*2-F<`-ZSnD3B>%K6@+JBj ie15lj9kehHu~qF3v#cO;S~6OnT^ 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

HDMf(2u#vURcR$rP6dB9pX!@4}u%%Y&z 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

tQ1+Z`8)^F@vNRq|lziM9T@u=+@^ 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

=JAH~-@=Y9V9jX8w-a3>6O0%aj{TF4_d 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

_0-MWZ3@xiJd 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ⅅ$*mfZd-yxZZNB}4i!Y_cgtS`g6?lmicAYT4v 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%0AM0I6>Vl&s7X` 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 Target to benchmark (default: stack)" - echo " -d, --duration Duration in seconds (default: 60)" - echo " -c, --concurrent Number of concurrent users (default: 10)" - echo " -h, --help Show this help message" - echo "" - echo "Examples:" - echo " $0 --target vllm # Benchmark vLLM direct" - echo " $0 --target stack # Benchmark Llama Stack (default)" - echo " $0 -t vllm -d 120 -c 20 # vLLM with 120s duration, 20 users" -} - -while [[ $# -gt 0 ]]; do - case $1 in - -t|--target) - TARGET="$2" - shift 2 - ;; - -d|--duration) - DURATION="$2" - shift 2 - ;; - -c|--concurrent) - CONCURRENT="$2" - shift 2 - ;; - -h|--help) - usage - exit 0 - ;; - *) - echo "Unknown option: $1" - usage - exit 1 - ;; - esac -done - -# Validate target -if [[ "$TARGET" != "stack" && "$TARGET" != "vllm" ]]; then - echo "Error: Target must be 'stack' or 'vllm'" - usage - exit 1 -fi - -# Set configuration based on target -if [[ "$TARGET" == "vllm" ]]; then - BASE_URL="http://vllm-server:8000/v1" - JOB_NAME="vllm-benchmark-job" - echo "Benchmarking vLLM direct..." -else - BASE_URL="http://llama-stack-benchmark-service:8323/v1/openai/v1" - JOB_NAME="stack-benchmark-job" - echo "Benchmarking Llama Stack..." -fi - -echo "Configuration:" -echo " Target: $TARGET" -echo " Base URL: $BASE_URL" -echo " Duration: ${DURATION}s" -echo " Concurrent users: $CONCURRENT" -echo "" - -# Create temporary job yaml -TEMP_YAML="/tmp/benchmark-job-temp-$(date +%s).yaml" -cat > "$TEMP_YAML" << EOF -apiVersion: batch/v1 -kind: Job -metadata: - name: $JOB_NAME - namespace: default -spec: - template: - spec: - containers: - - name: benchmark - image: python:3.11-slim - command: ["/bin/bash"] - args: - - "-c" - - | - pip install aiohttp && - python3 /benchmark/benchmark.py \\ - --base-url $BASE_URL \\ - --model \${INFERENCE_MODEL} \\ - --duration $DURATION \\ - --concurrent $CONCURRENT - env: - - name: INFERENCE_MODEL - value: "meta-llama/Llama-3.2-3B-Instruct" - volumeMounts: - - name: benchmark-script - mountPath: /benchmark - resources: - requests: - memory: "256Mi" - cpu: "250m" - limits: - memory: "512Mi" - cpu: "500m" - volumes: - - name: benchmark-script - configMap: - name: benchmark-script - restartPolicy: Never - backoffLimit: 3 -EOF - -echo "Creating benchmark ConfigMap..." -kubectl create configmap benchmark-script \ - --from-file=benchmark.py=benchmark.py \ - --dry-run=client -o yaml | kubectl apply -f - - -echo "Cleaning up any existing benchmark job..." -kubectl delete job $JOB_NAME 2>/dev/null || true - -echo "Deploying benchmark Job..." -kubectl apply -f "$TEMP_YAML" - -echo "Waiting for job to start..." -kubectl wait --for=condition=Ready pod -l job-name=$JOB_NAME --timeout=60s - -echo "Following benchmark logs..." -kubectl logs -f job/$JOB_NAME - -echo "Job completed. Checking final status..." -kubectl get job $JOB_NAME - -# Clean up temporary file -rm -f "$TEMP_YAML" diff --git a/benchmarking/k8s-benchmark/scripts/generate_charts.py b/benchmarking/k8s-benchmark/scripts/generate_charts.py new file mode 100755 index 000000000..7b920fc04 --- /dev/null +++ b/benchmarking/k8s-benchmark/scripts/generate_charts.py @@ -0,0 +1,294 @@ +#!/usr/bin/env python3 +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. + +# /// script +# dependencies = [ +# "matplotlib", +# ] +# /// +""" +Script to generate benchmark charts from guidellm text results. +Creates 2x2 grid charts with RPS, Request Latency, TTFT, and ITL metrics against concurrent@x values. +Outputs one chart file per vLLM replica group, with each line representing one benchmark run. +""" + +import glob +import os +import re + +import matplotlib.pyplot as plt + + +def extract_setup_name(filename: str) -> str: + """Extract setup name from filename and format legend appropriately.""" + basename = os.path.basename(filename) + + # Try new pattern: guidellm-benchmark-stack-s{stack_replicas}-sw{workers}-v{vllm_replicas}-{timestamp}.txt + match = re.search(r"guidellm-benchmark-stack-s(\d+)-sw(\d+)-v(\d+)-(\d{8})-(\d{6})\.txt", basename) + if match: + stack_replicas = match.group(1) + workers = match.group(2) + vllm_replicas = match.group(3) + date = match.group(4) + time = match.group(5) + return f"stack-s{stack_replicas}-sw{workers}-v{vllm_replicas}" + + # Try new vLLM pattern: guidellm-benchmark-vllm-v{vllm_replicas}-{timestamp}.txt + match = re.search(r"guidellm-benchmark-vllm-v(\d+)-(\d{8})-(\d{6})\.txt", basename) + if match: + vllm_replicas = match.group(1) + date = match.group(2) + time = match.group(3) + return f"vllm-v{vllm_replicas}" + + # Fall back to old pattern: guidellm-benchmark-{target}-{stack_replicas}-w{workers}-{vllm_replicas}-{timestamp}.txt + match = re.search(r"guidellm-benchmark-([^-]+)-(\d+)-w(\d+)-(\d+)-(\d+)-(\d+)\.txt", basename) + if match: + target = match.group(1) + stack_replicas = match.group(2) + workers = match.group(3) + vllm_replicas = match.group(4) + date = match.group(5) + time = match.group(6) + + if target == "vllm": + return f"vllm-{vllm_replicas}-w{workers}-{vllm_replicas}" + else: + return f"stack-replicas{stack_replicas}-w{workers}-vllm-replicas{vllm_replicas}-{date}-{time}" + + # Fall back to older pattern: guidellm-benchmark-{target}-{stack_replicas}-{vllm_replicas}-{timestamp}.txt + match = re.search(r"guidellm-benchmark-([^-]+)-(\d+)-(\d+)-(\d+)-(\d+)\.txt", basename) + if match: + target = match.group(1) + stack_replicas = match.group(2) + vllm_replicas = match.group(3) + date = match.group(4) + time = match.group(5) + + if target == "vllm": + return f"vllm-{vllm_replicas}-w1-{vllm_replicas}" + else: + return f"stack-replicas{stack_replicas}-vllm-replicas{vllm_replicas}-{date}-{time}" + + return basename.replace("guidellm-benchmark-", "").replace(".txt", "") + + +def parse_txt_file(filepath: str) -> list[tuple[float, float, float, float, float, str]]: + """ + Parse a text benchmark file and extract concurrent@x, RPS, TTFT, ITL, and request latency data. + Returns list of (concurrency, rps_mean, ttft_mean, itl_mean, req_latency_mean, setup_name) tuples. + """ + setup_name = extract_setup_name(filepath) + data_points = [] + + try: + with open(filepath) as f: + content = f.read() + + # Find the benchmark stats table + lines = content.split("\n") + in_stats_table = False + header_lines_seen = 0 + + for line in lines: + line_stripped = line.strip() + + # Look for the start of the stats table + if "Benchmarks Stats:" in line: + in_stats_table = True + continue + + if in_stats_table: + # Skip the first few separator/header lines + if line_stripped.startswith("=") or line_stripped.startswith("-"): + header_lines_seen += 1 + if header_lines_seen >= 3: # After seeing multiple header lines, look for concurrent@ data + if line_stripped.startswith("=") and "concurrent@" not in line_stripped: + break + continue + + # Parse concurrent@ lines in the stats table (may have leading spaces) + if in_stats_table and "concurrent@" in line: + parts = [part.strip() for part in line.split("|")] + + if len(parts) >= 12: # Make sure we have enough columns for new format + try: + # Extract concurrency from benchmark name (e.g., concurrent@1 -> 1) + concurrent_match = re.search(r"concurrent@(\d+)", parts[0]) + if not concurrent_match: + continue + concurrency = float(concurrent_match.group(1)) + + # Extract metrics from the new table format + # From your image, the table has these columns with | separators: + # Benchmark | Per Second | Concurrency | Out Tok/sec | Tot Tok/sec | Req Latency (sec) | TTFT (ms) | ITL (ms) | TPOT (ms) + # Looking at the mean/median/p99 structure, need to find the mean columns + # The structure shows: mean | median | p99 for each metric + rps_mean = float(parts[1]) # Per Second (RPS) + req_latency_mean = float(parts[6]) * 1000 # Request latency mean (convert from sec to ms) + ttft_mean = float(parts[9]) # TTFT mean column + itl_mean = float(parts[12]) # ITL mean column + + data_points.append((concurrency, rps_mean, ttft_mean, itl_mean, req_latency_mean, setup_name)) + + except (ValueError, IndexError) as e: + print(f"Warning: Could not parse line '{line}' in {filepath}: {e}") + continue + + except (OSError, FileNotFoundError) as e: + print(f"Error reading {filepath}: {e}") + + return data_points + + +def generate_charts(benchmark_dir: str = "results"): + """Generate 2x2 grid charts (RPS, Request Latency, TTFT, ITL) from benchmark text files.""" + # Find all text result files instead of JSON + txt_pattern = os.path.join(benchmark_dir, "guidellm-benchmark-*.txt") + txt_files = glob.glob(txt_pattern) + + if not txt_files: + print(f"No text files found matching pattern: {txt_pattern}") + return + + print(f"Found {len(txt_files)} text files") + + # Parse all files and collect data + all_data = {} # setup_name -> [(concurrency, rps, ttft, itl, req_latency), ...] + + for txt_file in txt_files: + print(f"Processing {txt_file}") + data_points = parse_txt_file(txt_file) + + for concurrency, rps, ttft, itl, req_latency, setup_name in data_points: + if setup_name not in all_data: + all_data[setup_name] = [] + all_data[setup_name].append((concurrency, rps, ttft, itl, req_latency)) + + if not all_data: + print("No data found to plot") + return + + # Sort data points by concurrency for each setup + for setup_name in all_data: + all_data[setup_name].sort(key=lambda x: x[0]) # Sort by concurrency + + # Group setups by vLLM replica number (original approach) + replica_groups = {} # vllm_replica_count -> {setup_name: points} + + for setup_name, points in all_data.items(): + # Extract vLLM replica number from setup name + # Expected formats: + # - New stack format: "stack-s{X}-sw{W}-v{Y}" + # - New vLLM format: "vllm-v{Y}" + # - Old formats: "stack-replicas{X}-w{W}-vllm-replicas{Y}" or "vllm-{Y}-w{W}-{Y}" + + # Try new formats first + vllm_match = re.search(r"-v(\d+)$", setup_name) # Matches both "stack-s1-sw2-v3" and "vllm-v1" + if not vllm_match: + # Try old stack format + vllm_match = re.search(r"vllm-replicas(\d+)", setup_name) + if not vllm_match: + # Try old vLLM format: "vllm-{Y}-w{W}-{Y}" + vllm_match = re.search(r"vllm-(\d+)-w\d+-\d+", setup_name) + + if vllm_match: + vllm_replica_num = int(vllm_match.group(1)) + if vllm_replica_num not in replica_groups: + replica_groups[vllm_replica_num] = {} + replica_groups[vllm_replica_num][setup_name] = points + else: + print(f"Warning: Could not extract vLLM replica count from setup name: {setup_name}") + + def create_charts(data_dict, prefix, title_prefix): + """Create a 2x2 grid with RPS, Request Latency, TTFT, and ITL charts.""" + if not data_dict: + print(f"No data found for {prefix}") + return + + # Create 2x2 subplot grid + fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(16, 12)) + fig.suptitle(f"{title_prefix} Benchmark Results", fontsize=16, fontweight="bold") + + # Collect all unique concurrency values for tick setting + all_concurrency_values = set() + for points in data_dict.values(): + all_concurrency_values.update([p[0] for p in points]) + all_concurrency_values = sorted(all_concurrency_values) + + # Plot data for each setup in alphabetical order + for setup_name in sorted(data_dict.keys()): + points = data_dict[setup_name] + if not points: + continue + + concurrency_values = [p[0] for p in points] + rps_values = [p[1] for p in points] + ttft_values = [p[2] for p in points] + itl_values = [p[3] for p in points] + req_latency_values = [p[4] for p in points] + + # RPS chart (top-left) + ax1.plot(concurrency_values, rps_values, marker="o", label=setup_name, linewidth=2, markersize=6) + + # Request Latency chart (top-right) + ax2.plot(concurrency_values, req_latency_values, marker="o", label=setup_name, linewidth=2, markersize=6) + + # TTFT chart (bottom-left) + ax3.plot(concurrency_values, ttft_values, marker="o", label=setup_name, linewidth=2, markersize=6) + + # ITL chart (bottom-right) + ax4.plot(concurrency_values, itl_values, marker="o", label=setup_name, linewidth=2, markersize=6) + + # Configure all charts after plotting data + axes = [ax1, ax2, ax3, ax4] + titles = ["RPS", "Request Latency", "TTFT", "ITL"] + ylabels = [ + "Requests Per Second (RPS)", + "Request Latency (ms)", + "Time to First Token (ms)", + "Inter Token Latency (ms)", + ] + + for ax, title, ylabel in zip(axes, titles, ylabels, strict=False): + ax.set_xlabel("Concurrency", fontsize=12) + ax.set_ylabel(ylabel, fontsize=12) + ax.set_title(title, fontsize=14, fontweight="bold") + ax.set_xscale("log", base=2) + ax.set_xticks(all_concurrency_values) + ax.set_xticklabels([str(int(x)) for x in all_concurrency_values]) + ax.grid(True, alpha=0.3) + + # Add legend to the right-most subplot (top-right) + ax2.legend(bbox_to_anchor=(1.05, 1), loc="upper left") + + plt.tight_layout() + + # Save the combined chart + combined_filename = os.path.join(benchmark_dir, f"{prefix}_benchmark_results.png") + plt.savefig(combined_filename, dpi=300, bbox_inches="tight") + plt.close() + print(f"Combined benchmark chart saved to {combined_filename}") + + # Print grouping information + for replica_count, data_dict in replica_groups.items(): + print(f"vLLM Replica {replica_count} setups: {list(data_dict.keys())}") + + # Create separate charts for each replica group + for replica_count, data_dict in replica_groups.items(): + prefix = f"vllm_replica{replica_count}" + title = f"vLLM Replicas={replica_count}" + create_charts(data_dict, prefix, title) + + # Print summary + print("\nSummary:") + for setup_name, points in all_data.items(): + print(f"{setup_name}: {len(points)} data points") + + +if __name__ == "__main__": + generate_charts() diff --git a/benchmarking/k8s-benchmark/scripts/run-all-benchmarks.sh b/benchmarking/k8s-benchmark/scripts/run-all-benchmarks.sh new file mode 100755 index 000000000..0a4a774c7 --- /dev/null +++ b/benchmarking/k8s-benchmark/scripts/run-all-benchmarks.sh @@ -0,0 +1,103 @@ +#!/usr/bin/env bash + +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. + +# Define benchmark configurations: (target, stack_replicas, vllm_replicas, stack_workers) +configs=( + "stack 1 1 1" + "stack 1 1 2" + "stack 1 1 4" + "vllm 1 1 -" +) + +set -euo pipefail + +# Get the directory where this script is located +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +echo "Running comprehensive GuideLL benchmark suite..." +echo "Start time: $(date)" + +# Default deployment names +STACK_DEPLOYMENT="llama-stack-benchmark-server" +VLLM_DEPLOYMENT="vllm-server" + +# Scaling function +scale_deployments() { + local stack_replicas=$1 + local vllm_replicas=$2 + local workers=$3 + + echo "Scaling deployments..." + + if [[ "$vllm_replicas" != "-" ]]; then + echo "Scaling $VLLM_DEPLOYMENT to $vllm_replicas replicas..." + kubectl scale deployment $VLLM_DEPLOYMENT --replicas=$vllm_replicas + kubectl rollout status deployment $VLLM_DEPLOYMENT --timeout=600s + fi + + if [[ "$target" == "stack" ]]; then + if [[ "$stack_replicas" != "-" ]]; then + echo "Scaling $STACK_DEPLOYMENT to $stack_replicas replicas..." + kubectl scale deployment $STACK_DEPLOYMENT --replicas=$stack_replicas + kubectl rollout status deployment $STACK_DEPLOYMENT --timeout=600s + fi + + if [[ "$workers" != "-" ]]; then + echo "Updating $STACK_DEPLOYMENT to use $workers workers..." + kubectl set env deployment/$STACK_DEPLOYMENT LLAMA_STACK_WORKERS=$workers + kubectl rollout status deployment $STACK_DEPLOYMENT --timeout=600s + fi + fi + + echo "All scaling operations completed. Waiting additional 30s for services to stabilize..." + sleep 30 +} + + +for config in "${configs[@]}"; do + read -r target stack_replicas vllm_replicas workers <<< "$config" + + echo "" + echo "==========================================" + if [[ "$workers" != "-" ]]; then + echo "Running benchmark: $target (stack=$stack_replicas, vllm=$vllm_replicas, workers=$workers)" + else + echo "Running benchmark: $target (stack=$stack_replicas, vllm=$vllm_replicas)" + fi + echo "Start: $(date)" + echo "==========================================" + + # Scale deployments before running benchmark + scale_deployments "$stack_replicas" "$vllm_replicas" "$workers" + + # Generate output filename with setup info + TIMESTAMP=$(date +%Y%m%d-%H%M%S) + if [[ "$target" == "stack" ]]; then + OUTPUT_FILE="results/guidellm-benchmark-${target}-s${stack_replicas}-sw${workers}-v${vllm_replicas}-${TIMESTAMP}.txt" + else + OUTPUT_FILE="results/guidellm-benchmark-${target}-v${vllm_replicas}-${TIMESTAMP}.txt" + fi + + # Run the benchmark with the cluster as configured + "$SCRIPT_DIR/run-guidellm-benchmark.sh" \ + --target "$target" \ + --output-file "$OUTPUT_FILE" + + echo "Completed: $(date)" + echo "Waiting 30 seconds before next benchmark..." + sleep 30 +done + +echo "" +echo "==========================================" +echo "All benchmarks completed!" +echo "End time: $(date)" +echo "==========================================" +echo "" +echo "Results files generated:" +ls -la results/guidellm-*.txt results/guidellm-*.json 2>/dev/null || echo "No result files found" diff --git a/benchmarking/k8s-benchmark/scripts/run-guidellm-benchmark.sh b/benchmarking/k8s-benchmark/scripts/run-guidellm-benchmark.sh new file mode 100755 index 000000000..746eff391 --- /dev/null +++ b/benchmarking/k8s-benchmark/scripts/run-guidellm-benchmark.sh @@ -0,0 +1,219 @@ +#!/usr/bin/env bash + +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. + +set -euo pipefail + +# Default values +TARGET="stack" +MAX_SECONDS=60 +PROMPT_TOKENS=512 +OUTPUT_TOKENS=256 +RATE_TYPE="concurrent" +RATE="1,2,4,8,16,32,64,128" +STACK_DEPLOYMENT="llama-stack-benchmark-server" +STACK_URL="http://llama-stack-benchmark-service:8323/v1/openai" +VLLM_DEPLOYMENT="vllm-server" +OUTPUT_FILE="" + +# Parse command line arguments +usage() { + echo "Usage: $0 [options]" + echo "Options:" + echo " -t, --target Target to benchmark (default: stack)" + echo " -s, --max-seconds Maximum duration in seconds (default: 60)" + echo " -p, --prompt-tokens Number of prompt tokens (default: 512)" + echo " -o, --output-tokens Number of output tokens (default: 256)" + echo " -r, --rate-type Rate type (default: concurrent)" + echo " -c, --rate Rate (default: 1,2,4,8,16,32,64,128)" + echo " --output-file Output file path (default: auto-generated)" + echo " --stack-deployment Name of the stack deployment (default: llama-stack-benchmark-server)" + echo " --vllm-deployment Name of the vllm deployment (default: vllm-server)" + echo " --stack-url URL of the stack service (default: http://llama-stack-benchmark-service:8323/v1/openai)" + echo " -h, --help Show this help message" + echo "" + echo "Examples:" + echo " $0 --target vllm # Benchmark vLLM direct" + echo " $0 --target stack # Benchmark Llama Stack (default)" + echo " $0 -t vllm -s 60 -p 512 -o 256 # vLLM with custom parameters" + echo " $0 --output-file results/my-benchmark.txt # Specify custom output file" + echo " $0 --stack-deployment my-stack-server # Use custom stack deployment name" +} + +while [[ $# -gt 0 ]]; do + case $1 in + -t|--target) + TARGET="$2" + shift 2 + ;; + -s|--max-seconds) + MAX_SECONDS="$2" + shift 2 + ;; + -p|--prompt-tokens) + PROMPT_TOKENS="$2" + shift 2 + ;; + -o|--output-tokens) + OUTPUT_TOKENS="$2" + shift 2 + ;; + -r|--rate-type) + RATE_TYPE="$2" + shift 2 + ;; + -c|--rate) + RATE="$2" + shift 2 + ;; + --output-file) + OUTPUT_FILE="$2" + shift 2 + ;; + --stack-deployment) + STACK_DEPLOYMENT="$2" + shift 2 + ;; + --vllm-deployment) + VLLM_DEPLOYMENT="$2" + shift 2 + ;; + --stack-url) + STACK_URL="$2" + shift 2 + ;; + -h|--help) + usage + exit 0 + ;; + *) + echo "Unknown option: $1" + usage + exit 1 + ;; + esac +done + +# Validate target +if [[ "$TARGET" != "stack" && "$TARGET" != "vllm" ]]; then + echo "Error: Target must be 'stack' or 'vllm'" + usage + exit 1 +fi + +# Set configuration based on target +if [[ "$TARGET" == "vllm" ]]; then + BASE_URL="http://${VLLM_DEPLOYMENT}:8000" + JOB_NAME="guidellm-vllm-benchmark-job" + echo "Benchmarking vLLM direct with GuideLLM..." +else + BASE_URL="$STACK_URL" + JOB_NAME="guidellm-stack-benchmark-job" + echo "Benchmarking Llama Stack with GuideLLM..." +fi + + +echo "Configuration:" +echo " Target: $TARGET" +echo " Base URL: $BASE_URL" +echo " Max seconds: ${MAX_SECONDS}s" +echo " Prompt tokens: $PROMPT_TOKENS" +echo " Output tokens: $OUTPUT_TOKENS" +echo " Rate type: $RATE_TYPE" +if [[ "$TARGET" == "vllm" ]]; then + echo " vLLM deployment: $VLLM_DEPLOYMENT" +else + echo " Stack deployment: $STACK_DEPLOYMENT" +fi +echo "" + +# Create temporary job yaml +TEMP_YAML="/tmp/guidellm-benchmark-job-temp-$(date +%s).yaml" +cat > "$TEMP_YAML" << EOF +apiVersion: batch/v1 +kind: Job +metadata: + name: $JOB_NAME + namespace: default +spec: + template: + spec: + containers: + - name: guidellm-benchmark + image: python:3.11-slim + command: ["/bin/bash"] + args: + - "-c" + - | + # Install uv and guidellm + pip install uv && + uv pip install --system guidellm && + + # Login to HuggingFace + uv pip install --system huggingface_hub && + python -c "from huggingface_hub import login; login(token='\$HF_TOKEN')" && + + # Run GuideLLM benchmark and save output + export COLUMNS=200 + GUIDELLM__PREFERRED_ROUTE="chat_completions" uv run guidellm benchmark run \\ + --target "$BASE_URL" \\ + --rate-type "$RATE_TYPE" \\ + --max-seconds $MAX_SECONDS \\ + --data "prompt_tokens=$PROMPT_TOKENS,output_tokens=$OUTPUT_TOKENS" \\ + --model "$INFERENCE_MODEL" \\ + --rate "$RATE" \\ + --warmup-percent 0.05 \\ + 2>&1 + env: + - name: INFERENCE_MODEL + value: "meta-llama/Llama-3.2-3B-Instruct" + - name: HF_TOKEN + valueFrom: + secretKeyRef: + name: hf-token-secret + key: token + resources: + requests: + memory: "4Gi" + cpu: "500m" + limits: + memory: "8Gi" + cpu: "2000m" + restartPolicy: Never + backoffLimit: 3 +EOF + +echo "Cleaning up any existing GuideLLM benchmark job..." +kubectl delete job $JOB_NAME 2>/dev/null || true + +echo "Deploying GuideLLM benchmark Job..." +kubectl apply -f "$TEMP_YAML" + +echo "Waiting for job to start..." +kubectl wait --for=condition=Ready pod -l job-name=$JOB_NAME --timeout=120s + +# Prepare file names and create results directory +mkdir -p results +if [[ -z "$OUTPUT_FILE" ]]; then + TIMESTAMP=$(date +%Y%m%d-%H%M%S) + OUTPUT_FILE="results/guidellm-benchmark-${TARGET}-${TIMESTAMP}.txt" +fi + +echo "Following GuideLLM benchmark logs..." +kubectl logs -f job/$JOB_NAME + +echo "Job completed. Checking final status..." +kubectl get job $JOB_NAME + +# Save benchmark results using kubectl logs +echo "Saving benchmark results..." +kubectl logs job/$JOB_NAME > "$OUTPUT_FILE" + +echo "Benchmark output saved to: $OUTPUT_FILE" + +# Clean up temporary file +rm -f "$TEMP_YAML" diff --git a/benchmarking/k8s-benchmark/stack-k8s.yaml.template b/benchmarking/k8s-benchmark/stack-k8s.yaml.template index 8842c0bea..54eeadcad 100644 --- a/benchmarking/k8s-benchmark/stack-k8s.yaml.template +++ b/benchmarking/k8s-benchmark/stack-k8s.yaml.template @@ -58,14 +58,14 @@ spec: value: "/etc/config/stack_run_config.yaml" - name: LLAMA_STACK_WORKERS value: "${LLAMA_STACK_WORKERS}" - command: ["uvicorn", "llama_stack.core.server.server:create_app", "--host", "0.0.0.0", "--port", "8323", "--workers", "$LLAMA_STACK_WORKERS", "--factory"] + command: ["uvicorn", "llama_stack.core.server.server:create_app", "--host", "0.0.0.0", "--port", "8323", "--workers", "$(LLAMA_STACK_WORKERS)", "--factory"] ports: - containerPort: 8323 resources: requests: - cpu: "${LLAMA_STACK_WORKERS}" + cpu: "4" limits: - cpu: "${LLAMA_STACK_WORKERS}" + cpu: "4" volumeMounts: - name: llama-storage mountPath: /root/.llama diff --git a/pyproject.toml b/pyproject.toml index ecbd8991a..86a32f978 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -177,6 +177,7 @@ exclude = [ ".pre-commit-config.yaml", "*.md", ".flake8", + "benchmarking/k8s-benchmark/results", ] [tool.ruff.lint] From 914c8cb6057153f91e0f45987b453499d216b1d0 Mon Sep 17 00:00:00 2001 From: Alexey Rybak <50731695+reluctantfuturist@users.noreply.github.com> Date: Wed, 24 Sep 2025 13:55:12 -0700 Subject: [PATCH 09/27] fix: fix API docstrings for proper MDX parsing (#3526) # What does this PR do? _[Stack 1/10] Docusaurus documentation migration_ Updates the file upload API documentation to use proper OpenAPI format for integer parameters. Replaces `` with `{integer}` in the description of the `expires_after[seconds]` parameter across the HTML spec, YAML spec, and Python implementation. ## Test Plan - docs/openapi_generator/run_openapi_generator.sh --- docs/_static/llama-stack-spec.html | 2 +- docs/_static/llama-stack-spec.yaml | 2 +- llama_stack/apis/files/files.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/_static/llama-stack-spec.html b/docs/_static/llama-stack-spec.html index 9ddb070d7..2f34e64a4 100644 --- a/docs/_static/llama-stack-spec.html +++ b/docs/_static/llama-stack-spec.html @@ -4451,7 +4451,7 @@ "tags": [ "Files" ], - "description": "Upload a file that can be used across various endpoints.\nThe file upload should be a multipart form request with:\n- file: The File object (not file name) to be uploaded.\n- purpose: The intended purpose of the uploaded file.\n- expires_after: Optional form values describing expiration for the file. Expected expires_after[anchor] = \"created_at\", expires_after[seconds] = . Seconds must be between 3600 and 2592000 (1 hour to 30 days).", + "description": "Upload a file that can be used across various endpoints.\nThe file upload should be a multipart form request with:\n- file: The File object (not file name) to be uploaded.\n- purpose: The intended purpose of the uploaded file.\n- expires_after: Optional form values describing expiration for the file. Expected expires_after[anchor] = \"created_at\", expires_after[seconds] = {integer}. Seconds must be between 3600 and 2592000 (1 hour to 30 days).", "parameters": [], "requestBody": { "content": { diff --git a/docs/_static/llama-stack-spec.yaml b/docs/_static/llama-stack-spec.yaml index 94dc5c0f9..66216e13b 100644 --- a/docs/_static/llama-stack-spec.yaml +++ b/docs/_static/llama-stack-spec.yaml @@ -3164,7 +3164,7 @@ paths: - purpose: The intended purpose of the uploaded file. - expires_after: Optional form values describing expiration for the file. - Expected expires_after[anchor] = "created_at", expires_after[seconds] = . + Expected expires_after[anchor] = "created_at", expires_after[seconds] = {integer}. Seconds must be between 3600 and 2592000 (1 hour to 30 days). parameters: [] requestBody: diff --git a/llama_stack/apis/files/files.py b/llama_stack/apis/files/files.py index d39e96e96..124e4bc8e 100644 --- a/llama_stack/apis/files/files.py +++ b/llama_stack/apis/files/files.py @@ -119,7 +119,7 @@ class Files(Protocol): The file upload should be a multipart form request with: - file: The File object (not file name) to be uploaded. - purpose: The intended purpose of the uploaded file. - - expires_after: Optional form values describing expiration for the file. Expected expires_after[anchor] = "created_at", expires_after[seconds] = . Seconds must be between 3600 and 2592000 (1 hour to 30 days). + - expires_after: Optional form values describing expiration for the file. Expected expires_after[anchor] = "created_at", expires_after[seconds] = {integer}. Seconds must be between 3600 and 2592000 (1 hour to 30 days). :param file: The uploaded file object containing content and metadata (filename, content_type, etc.). :param purpose: The intended purpose of the uploaded file (e.g., "assistants", "fine-tune"). From 0a7d1adfee5cd76fec45fe09b47658e97f374c3a Mon Sep 17 00:00:00 2001 From: Alexey Rybak <50731695+reluctantfuturist@users.noreply.github.com> Date: Wed, 24 Sep 2025 13:57:27 -0700 Subject: [PATCH 10/27] fix: update OpenAPI generator (#3527) # What does this PR do? Updates OpenAPI generator to use summaries and changed the file generation path. ## Test Plan - docs/openapi_generator/run_openapi_generator.sh --- docs/openapi_generator/pyopenapi/generator.py | 37 ++--- .../run_openapi_generator.sh | 2 +- .../{_static => static}/llama-stack-spec.html | 120 ++++++++++++++ .../{_static => static}/llama-stack-spec.yaml | 153 ++++++++++++++++++ 4 files changed, 289 insertions(+), 23 deletions(-) rename docs/{_static => static}/llama-stack-spec.html (98%) rename docs/{_static => static}/llama-stack-spec.yaml (98%) diff --git a/docs/openapi_generator/pyopenapi/generator.py b/docs/openapi_generator/pyopenapi/generator.py index e2c73e33c..5ac712f02 100644 --- a/docs/openapi_generator/pyopenapi/generator.py +++ b/docs/openapi_generator/pyopenapi/generator.py @@ -9,7 +9,9 @@ import ipaddress import types import typing from dataclasses import make_dataclass -from typing import Any, Dict, Set, Union +from typing import Annotated, Any, Dict, get_args, get_origin, Set, Union + +from fastapi import UploadFile from llama_stack.apis.datatypes import Error from llama_stack.strong_typing.core import JsonType @@ -30,9 +32,6 @@ from llama_stack.strong_typing.schema import ( Schema, SchemaOptions, ) -from typing import get_origin, get_args -from typing import Annotated -from fastapi import UploadFile from llama_stack.strong_typing.serialization import json_dump_string, object_to_json from .operations import ( @@ -624,11 +623,11 @@ class Generator: # data passed in request body as multipart/form-data elif op.multipart_params: builder = ContentBuilder(self.schema_builder) - + # Create schema properties for multipart form fields properties = {} required_fields = [] - + for name, param_type in op.multipart_params: if get_origin(param_type) is Annotated: base_type = get_args(param_type)[0] @@ -636,28 +635,21 @@ class Generator: base_type = param_type if base_type is UploadFile: # File upload - properties[name] = { - "type": "string", - "format": "binary" - } + properties[name] = {"type": "string", "format": "binary"} else: # Form field properties[name] = self.schema_builder.classdef_to_ref(base_type) - + required_fields.append(name) - + multipart_schema = { "type": "object", "properties": properties, - "required": required_fields + "required": required_fields, } - + requestBody = RequestBody( - content={ - "multipart/form-data": { - "schema": multipart_schema - } - }, + content={"multipart/form-data": {"schema": multipart_schema}}, required=True, ) # data passed in payload as JSON and mapped to request parameters @@ -801,9 +793,10 @@ class Generator: ) return Operation( - tags=[getattr(op.defining_class, "API_NAMESPACE", op.defining_class.__name__)], - summary=None, - # summary=doc_string.short_description, + tags=[ + getattr(op.defining_class, "API_NAMESPACE", op.defining_class.__name__) + ], + summary=doc_string.short_description, description=description, parameters=parameters, requestBody=requestBody, diff --git a/docs/openapi_generator/run_openapi_generator.sh b/docs/openapi_generator/run_openapi_generator.sh index 22532ffe7..45d00d6e7 100755 --- a/docs/openapi_generator/run_openapi_generator.sh +++ b/docs/openapi_generator/run_openapi_generator.sh @@ -29,4 +29,4 @@ fi stack_dir=$(dirname $(dirname $THIS_DIR)) PYTHONPATH=$PYTHONPATH:$stack_dir \ - python -m docs.openapi_generator.generate $(dirname $THIS_DIR)/_static + python -m docs.openapi_generator.generate $(dirname $THIS_DIR)/static diff --git a/docs/_static/llama-stack-spec.html b/docs/static/llama-stack-spec.html similarity index 98% rename from docs/_static/llama-stack-spec.html rename to docs/static/llama-stack-spec.html index 2f34e64a4..36cb025c4 100644 --- a/docs/_static/llama-stack-spec.html +++ b/docs/static/llama-stack-spec.html @@ -62,6 +62,7 @@ "tags": [ "DatasetIO" ], + "summary": "Append rows to a dataset.", "description": "Append rows to a dataset.", "parameters": [ { @@ -115,6 +116,7 @@ "tags": [ "Inference" ], + "summary": "Generate chat completions for a batch of messages using the specified model.", "description": "Generate chat completions for a batch of messages using the specified model.", "parameters": [], "requestBody": { @@ -158,6 +160,7 @@ "tags": [ "Inference" ], + "summary": "Generate completions for a batch of content using the specified model.", "description": "Generate completions for a batch of content using the specified model.", "parameters": [], "requestBody": { @@ -194,6 +197,7 @@ "tags": [ "PostTraining (Coming Soon)" ], + "summary": "Cancel a training job.", "description": "Cancel a training job.", "parameters": [], "requestBody": { @@ -242,6 +246,7 @@ "tags": [ "BatchInference (Coming Soon)" ], + "summary": "Generate a chat completion for the given messages using the specified model.", "description": "Generate a chat completion for the given messages using the specified model.", "parameters": [], "requestBody": { @@ -290,6 +295,7 @@ "tags": [ "BatchInference (Coming Soon)" ], + "summary": "Generate a completion for the given content using the specified model.", "description": "Generate a completion for the given content using the specified model.", "parameters": [], "requestBody": { @@ -333,6 +339,7 @@ "tags": [ "Agents" ], + "summary": "List all agents.", "description": "List all agents.", "parameters": [ { @@ -383,6 +390,7 @@ "tags": [ "Agents" ], + "summary": "Create an agent with the given configuration.", "description": "Create an agent with the given configuration.", "parameters": [], "requestBody": { @@ -426,6 +434,7 @@ "tags": [ "Agents" ], + "summary": "Create a new session for an agent.", "description": "Create a new session for an agent.", "parameters": [ { @@ -484,6 +493,7 @@ "tags": [ "Agents" ], + "summary": "Create a new turn for an agent.", "description": "Create a new turn for an agent.", "parameters": [ { @@ -546,6 +556,7 @@ "tags": [ "Agents" ], + "summary": "List all OpenAI responses.", "description": "List all OpenAI responses.", "parameters": [ { @@ -619,6 +630,7 @@ "tags": [ "Agents" ], + "summary": "Create a new OpenAI response.", "description": "Create a new OpenAI response.", "parameters": [], "requestBody": { @@ -662,6 +674,7 @@ "tags": [ "Prompts" ], + "summary": "List all prompts.", "description": "List all prompts.", "parameters": [] }, @@ -693,6 +706,7 @@ "tags": [ "Prompts" ], + "summary": "Create a new prompt.", "description": "Create a new prompt.", "parameters": [], "requestBody": { @@ -736,6 +750,7 @@ "tags": [ "Agents" ], + "summary": "Describe an agent by its ID.", "description": "Describe an agent by its ID.", "parameters": [ { @@ -770,6 +785,7 @@ "tags": [ "Agents" ], + "summary": "Delete an agent by its ID and its associated sessions and turns.", "description": "Delete an agent by its ID and its associated sessions and turns.", "parameters": [ { @@ -813,6 +829,7 @@ "tags": [ "Agents" ], + "summary": "Retrieve an agent session by its ID.", "description": "Retrieve an agent session by its ID.", "parameters": [ { @@ -868,6 +885,7 @@ "tags": [ "Agents" ], + "summary": "Delete an agent session by its ID and its associated turns.", "description": "Delete an agent session by its ID and its associated turns.", "parameters": [ { @@ -920,6 +938,7 @@ "tags": [ "Agents" ], + "summary": "Retrieve an OpenAI response by its ID.", "description": "Retrieve an OpenAI response by its ID.", "parameters": [ { @@ -961,6 +980,7 @@ "tags": [ "Agents" ], + "summary": "Delete an OpenAI response by its ID.", "description": "Delete an OpenAI response by its ID.", "parameters": [ { @@ -1004,6 +1024,7 @@ "tags": [ "Prompts" ], + "summary": "Get a prompt by its identifier and optional version.", "description": "Get a prompt by its identifier and optional version.", "parameters": [ { @@ -1054,6 +1075,7 @@ "tags": [ "Prompts" ], + "summary": "Update an existing prompt (increments version).", "description": "Update an existing prompt (increments version).", "parameters": [ { @@ -1098,6 +1120,7 @@ "tags": [ "Prompts" ], + "summary": "Delete a prompt.", "description": "Delete a prompt.", "parameters": [ { @@ -1141,6 +1164,7 @@ "tags": [ "Inference" ], + "summary": "Generate embeddings for content pieces using the specified model.", "description": "Generate embeddings for content pieces using the specified model.", "parameters": [], "requestBody": { @@ -1184,6 +1208,7 @@ "tags": [ "Eval" ], + "summary": "Evaluate a list of rows on a benchmark.", "description": "Evaluate a list of rows on a benchmark.", "parameters": [ { @@ -1237,6 +1262,7 @@ "tags": [ "Agents" ], + "summary": "Retrieve an agent step by its ID.", "description": "Retrieve an agent step by its ID.", "parameters": [ { @@ -1307,6 +1333,7 @@ "tags": [ "Agents" ], + "summary": "Retrieve an agent turn by its ID.", "description": "Retrieve an agent turn by its ID.", "parameters": [ { @@ -1368,6 +1395,7 @@ "tags": [ "Benchmarks" ], + "summary": "Get a benchmark by its ID.", "description": "Get a benchmark by its ID.", "parameters": [ { @@ -1402,6 +1430,7 @@ "tags": [ "Benchmarks" ], + "summary": "Unregister a benchmark.", "description": "Unregister a benchmark.", "parameters": [ { @@ -1445,6 +1474,7 @@ "tags": [ "Inference" ], + "summary": "Describe a chat completion by its ID.", "description": "Describe a chat completion by its ID.", "parameters": [ { @@ -1488,6 +1518,7 @@ "tags": [ "Datasets" ], + "summary": "Get a dataset by its ID.", "description": "Get a dataset by its ID.", "parameters": [ { @@ -1522,6 +1553,7 @@ "tags": [ "Datasets" ], + "summary": "Unregister a dataset by its ID.", "description": "Unregister a dataset by its ID.", "parameters": [ { @@ -1565,6 +1597,7 @@ "tags": [ "Models" ], + "summary": "Get a model by its identifier.", "description": "Get a model by its identifier.", "parameters": [ { @@ -1599,6 +1632,7 @@ "tags": [ "Models" ], + "summary": "Unregister a model.", "description": "Unregister a model.", "parameters": [ { @@ -1642,6 +1676,7 @@ "tags": [ "ScoringFunctions" ], + "summary": "Get a scoring function by its ID.", "description": "Get a scoring function by its ID.", "parameters": [ { @@ -1676,6 +1711,7 @@ "tags": [ "ScoringFunctions" ], + "summary": "Unregister a scoring function.", "description": "Unregister a scoring function.", "parameters": [ { @@ -1719,6 +1755,7 @@ "tags": [ "Shields" ], + "summary": "Get a shield by its identifier.", "description": "Get a shield by its identifier.", "parameters": [ { @@ -1753,6 +1790,7 @@ "tags": [ "Shields" ], + "summary": "Unregister a shield.", "description": "Unregister a shield.", "parameters": [ { @@ -1796,6 +1834,7 @@ "tags": [ "Telemetry" ], + "summary": "Get a span by its ID.", "description": "Get a span by its ID.", "parameters": [ { @@ -1848,6 +1887,7 @@ "tags": [ "Telemetry" ], + "summary": "Get a span tree by its ID.", "description": "Get a span tree by its ID.", "parameters": [ { @@ -1901,6 +1941,7 @@ "tags": [ "ToolGroups" ], + "summary": "Get a tool by its name.", "description": "Get a tool by its name.", "parameters": [ { @@ -1944,6 +1985,7 @@ "tags": [ "ToolGroups" ], + "summary": "Get a tool group by its ID.", "description": "Get a tool group by its ID.", "parameters": [ { @@ -1978,6 +2020,7 @@ "tags": [ "ToolGroups" ], + "summary": "Unregister a tool group.", "description": "Unregister a tool group.", "parameters": [ { @@ -2021,6 +2064,7 @@ "tags": [ "Telemetry" ], + "summary": "Get a trace by its ID.", "description": "Get a trace by its ID.", "parameters": [ { @@ -2064,6 +2108,7 @@ "tags": [ "PostTraining (Coming Soon)" ], + "summary": "Get the artifacts of a training job.", "description": "Get the artifacts of a training job.", "parameters": [ { @@ -2107,6 +2152,7 @@ "tags": [ "PostTraining (Coming Soon)" ], + "summary": "Get the status of a training job.", "description": "Get the status of a training job.", "parameters": [ { @@ -2150,6 +2196,7 @@ "tags": [ "PostTraining (Coming Soon)" ], + "summary": "Get all training jobs.", "description": "Get all training jobs.", "parameters": [] } @@ -2183,6 +2230,7 @@ "tags": [ "VectorDBs" ], + "summary": "Get a vector database by its identifier.", "description": "Get a vector database by its identifier.", "parameters": [ { @@ -2217,6 +2265,7 @@ "tags": [ "VectorDBs" ], + "summary": "Unregister a vector database.", "description": "Unregister a vector database.", "parameters": [ { @@ -2260,6 +2309,7 @@ "tags": [ "Inspect" ], + "summary": "Get the current health status of the service.", "description": "Get the current health status of the service.", "parameters": [] } @@ -2286,6 +2336,7 @@ "tags": [ "ToolRuntime" ], + "summary": "Index documents so they can be used by the RAG system.", "description": "Index documents so they can be used by the RAG system.", "parameters": [], "requestBody": { @@ -2322,6 +2373,7 @@ "tags": [ "VectorIO" ], + "summary": "Insert chunks into a vector database.", "description": "Insert chunks into a vector database.", "parameters": [], "requestBody": { @@ -2365,6 +2417,7 @@ "tags": [ "Providers" ], + "summary": "Get detailed information about a specific provider.", "description": "Get detailed information about a specific provider.", "parameters": [ { @@ -2408,6 +2461,7 @@ "tags": [ "ToolRuntime" ], + "summary": "Run a tool with the given arguments.", "description": "Run a tool with the given arguments.", "parameters": [], "requestBody": { @@ -2451,6 +2505,7 @@ "tags": [ "DatasetIO" ], + "summary": "Get a paginated list of rows from a dataset.", "description": "Get a paginated list of rows from a dataset.\nUses offset-based pagination where:\n- start_index: The starting index (0-based). If None, starts from beginning.\n- limit: Number of items to return. If None or -1, returns all items.\n\nThe response includes:\n- data: List of items for the current page.\n- has_more: Whether there are more items available after this set.", "parameters": [ { @@ -2512,6 +2567,7 @@ "tags": [ "Eval" ], + "summary": "Get the status of a job.", "description": "Get the status of a job.", "parameters": [ { @@ -2555,6 +2611,7 @@ "tags": [ "Eval" ], + "summary": "Cancel a job.", "description": "Cancel a job.", "parameters": [ { @@ -2607,6 +2664,7 @@ "tags": [ "Eval" ], + "summary": "Get the result of a job.", "description": "Get the result of a job.", "parameters": [ { @@ -2659,6 +2717,7 @@ "tags": [ "Agents" ], + "summary": "List all session(s) of a given agent.", "description": "List all session(s) of a given agent.", "parameters": [ { @@ -2720,6 +2779,7 @@ "tags": [ "Benchmarks" ], + "summary": "List all benchmarks.", "description": "List all benchmarks.", "parameters": [] }, @@ -2744,6 +2804,7 @@ "tags": [ "Benchmarks" ], + "summary": "Register a benchmark.", "description": "Register a benchmark.", "parameters": [], "requestBody": { @@ -2787,6 +2848,7 @@ "tags": [ "Inference" ], + "summary": "List all chat completions.", "description": "List all chat completions.", "parameters": [ { @@ -2862,6 +2924,7 @@ "tags": [ "Inference" ], + "summary": "Generate an OpenAI-compatible chat completion for the given messages using the specified model.", "description": "Generate an OpenAI-compatible chat completion for the given messages using the specified model.", "parameters": [], "requestBody": { @@ -2905,6 +2968,7 @@ "tags": [ "Datasets" ], + "summary": "List all datasets.", "description": "List all datasets.", "parameters": [] }, @@ -2936,6 +3000,7 @@ "tags": [ "Datasets" ], + "summary": "Register a new dataset.", "description": "Register a new dataset.", "parameters": [], "requestBody": { @@ -2979,6 +3044,7 @@ "tags": [ "Models" ], + "summary": "List all models.", "description": "List all models.", "parameters": [] }, @@ -3010,6 +3076,7 @@ "tags": [ "Models" ], + "summary": "Register a model.", "description": "Register a model.", "parameters": [], "requestBody": { @@ -3053,6 +3120,7 @@ "tags": [ "Agents" ], + "summary": "List input items for a given OpenAI response.", "description": "List input items for a given OpenAI response.", "parameters": [ { @@ -3144,6 +3212,7 @@ "tags": [ "Prompts" ], + "summary": "List all versions of a specific prompt.", "description": "List all versions of a specific prompt.", "parameters": [ { @@ -3187,6 +3256,7 @@ "tags": [ "Providers" ], + "summary": "List all available providers.", "description": "List all available providers.", "parameters": [] } @@ -3220,6 +3290,7 @@ "tags": [ "Inspect" ], + "summary": "List all available API routes with their methods and implementing providers.", "description": "List all available API routes with their methods and implementing providers.", "parameters": [] } @@ -3253,6 +3324,7 @@ "tags": [ "ToolRuntime" ], + "summary": "List all tools in the runtime.", "description": "List all tools in the runtime.", "parameters": [ { @@ -3305,6 +3377,7 @@ "tags": [ "ScoringFunctions" ], + "summary": "List all scoring functions.", "description": "List all scoring functions.", "parameters": [] }, @@ -3329,6 +3402,7 @@ "tags": [ "ScoringFunctions" ], + "summary": "Register a scoring function.", "description": "Register a scoring function.", "parameters": [], "requestBody": { @@ -3372,6 +3446,7 @@ "tags": [ "Shields" ], + "summary": "List all shields.", "description": "List all shields.", "parameters": [] }, @@ -3403,6 +3478,7 @@ "tags": [ "Shields" ], + "summary": "Register a shield.", "description": "Register a shield.", "parameters": [], "requestBody": { @@ -3446,6 +3522,7 @@ "tags": [ "ToolGroups" ], + "summary": "List tool groups with optional provider.", "description": "List tool groups with optional provider.", "parameters": [] }, @@ -3470,6 +3547,7 @@ "tags": [ "ToolGroups" ], + "summary": "Register a tool group.", "description": "Register a tool group.", "parameters": [], "requestBody": { @@ -3513,6 +3591,7 @@ "tags": [ "ToolGroups" ], + "summary": "List tools with optional tool group.", "description": "List tools with optional tool group.", "parameters": [ { @@ -3556,6 +3635,7 @@ "tags": [ "VectorDBs" ], + "summary": "List all vector databases.", "description": "List all vector databases.", "parameters": [] }, @@ -3587,6 +3667,7 @@ "tags": [ "VectorDBs" ], + "summary": "Register a vector database.", "description": "Register a vector database.", "parameters": [], "requestBody": { @@ -3623,6 +3704,7 @@ "tags": [ "Telemetry" ], + "summary": "Log an event.", "description": "Log an event.", "parameters": [], "requestBody": { @@ -3666,6 +3748,7 @@ "tags": [ "VectorIO" ], + "summary": "List files in a vector store.", "description": "List files in a vector store.", "parameters": [ { @@ -3752,6 +3835,7 @@ "tags": [ "VectorIO" ], + "summary": "Attach a file to a vector store.", "description": "Attach a file to a vector store.", "parameters": [ { @@ -3805,6 +3889,7 @@ "tags": [ "Inference" ], + "summary": "Generate an OpenAI-compatible completion for the given prompt using the specified model.", "description": "Generate an OpenAI-compatible completion for the given prompt using the specified model.", "parameters": [], "requestBody": { @@ -3848,6 +3933,7 @@ "tags": [ "VectorIO" ], + "summary": "Returns a list of vector stores.", "description": "Returns a list of vector stores.", "parameters": [ { @@ -3916,6 +4002,7 @@ "tags": [ "VectorIO" ], + "summary": "Creates a vector store.", "description": "Creates a vector store.", "parameters": [], "requestBody": { @@ -3959,6 +4046,7 @@ "tags": [ "Files" ], + "summary": "Returns information about a specific file.", "description": "Returns information about a specific file.", "parameters": [ { @@ -4000,6 +4088,7 @@ "tags": [ "Files" ], + "summary": "Delete a file.", "description": "Delete a file.", "parameters": [ { @@ -4043,6 +4132,7 @@ "tags": [ "VectorIO" ], + "summary": "Retrieves a vector store.", "description": "Retrieves a vector store.", "parameters": [ { @@ -4084,6 +4174,7 @@ "tags": [ "VectorIO" ], + "summary": "Updates a vector store.", "description": "Updates a vector store.", "parameters": [ { @@ -4135,6 +4226,7 @@ "tags": [ "VectorIO" ], + "summary": "Delete a vector store.", "description": "Delete a vector store.", "parameters": [ { @@ -4178,6 +4270,7 @@ "tags": [ "VectorIO" ], + "summary": "Retrieves a vector store file.", "description": "Retrieves a vector store file.", "parameters": [ { @@ -4228,6 +4321,7 @@ "tags": [ "VectorIO" ], + "summary": "Updates a vector store file.", "description": "Updates a vector store file.", "parameters": [ { @@ -4288,6 +4382,7 @@ "tags": [ "VectorIO" ], + "summary": "Delete a vector store file.", "description": "Delete a vector store file.", "parameters": [ { @@ -4340,6 +4435,7 @@ "tags": [ "Inference" ], + "summary": "Generate OpenAI-compatible embeddings for the given input using the specified model.", "description": "Generate OpenAI-compatible embeddings for the given input using the specified model.", "parameters": [], "requestBody": { @@ -4383,6 +4479,7 @@ "tags": [ "Files" ], + "summary": "Returns a list of files that belong to the user's organization.", "description": "Returns a list of files that belong to the user's organization.", "parameters": [ { @@ -4451,6 +4548,7 @@ "tags": [ "Files" ], + "summary": "Upload a file that can be used across various endpoints.", "description": "Upload a file that can be used across various endpoints.\nThe file upload should be a multipart form request with:\n- file: The File object (not file name) to be uploaded.\n- purpose: The intended purpose of the uploaded file.\n- expires_after: Optional form values describing expiration for the file. Expected expires_after[anchor] = \"created_at\", expires_after[seconds] = {integer}. Seconds must be between 3600 and 2592000 (1 hour to 30 days).", "parameters": [], "requestBody": { @@ -4529,6 +4627,7 @@ "tags": [ "Models" ], + "summary": "List models using the OpenAI API.", "description": "List models using the OpenAI API.", "parameters": [] } @@ -4562,6 +4661,7 @@ "tags": [ "Files" ], + "summary": "Returns the contents of the specified file.", "description": "Returns the contents of the specified file.", "parameters": [ { @@ -4605,6 +4705,7 @@ "tags": [ "VectorIO" ], + "summary": "Retrieves the contents of a vector store file.", "description": "Retrieves the contents of a vector store file.", "parameters": [ { @@ -4657,6 +4758,7 @@ "tags": [ "VectorIO" ], + "summary": "Search for chunks in a vector store.", "description": "Search for chunks in a vector store.\nSearches a vector store for relevant chunks based on a query and optional file attribute filters.", "parameters": [ { @@ -4710,6 +4812,7 @@ "tags": [ "PostTraining (Coming Soon)" ], + "summary": "Run preference optimization of a model.", "description": "Run preference optimization of a model.", "parameters": [], "requestBody": { @@ -4753,6 +4856,7 @@ "tags": [ "ToolRuntime" ], + "summary": "Query the RAG system for context; typically invoked by the agent.", "description": "Query the RAG system for context; typically invoked by the agent.", "parameters": [], "requestBody": { @@ -4796,6 +4900,7 @@ "tags": [ "VectorIO" ], + "summary": "Query chunks from a vector database.", "description": "Query chunks from a vector database.", "parameters": [], "requestBody": { @@ -4839,6 +4944,7 @@ "tags": [ "Telemetry" ], + "summary": "Query metrics.", "description": "Query metrics.", "parameters": [ { @@ -4892,6 +4998,7 @@ "tags": [ "Telemetry" ], + "summary": "Query spans.", "description": "Query spans.", "parameters": [], "requestBody": { @@ -4935,6 +5042,7 @@ "tags": [ "Telemetry" ], + "summary": "Query traces.", "description": "Query traces.", "parameters": [], "requestBody": { @@ -4978,6 +5086,7 @@ "tags": [ "Inference" ], + "summary": "Rerank a list of documents based on their relevance to a query.", "description": "Rerank a list of documents based on their relevance to a query.", "parameters": [], "requestBody": { @@ -5026,6 +5135,7 @@ "tags": [ "Agents" ], + "summary": "Resume an agent turn with executed tool call responses.", "description": "Resume an agent turn with executed tool call responses.\nWhen a Turn has the status `awaiting_input` due to pending input from client side tool calls, this endpoint can be used to submit the outputs from the tool calls once they are ready.", "parameters": [ { @@ -5097,6 +5207,7 @@ "tags": [ "Eval" ], + "summary": "Run an evaluation on a benchmark.", "description": "Run an evaluation on a benchmark.", "parameters": [ { @@ -5150,6 +5261,7 @@ "tags": [ "Safety" ], + "summary": "Classifies if text and/or image inputs are potentially harmful.", "description": "Classifies if text and/or image inputs are potentially harmful.", "parameters": [], "requestBody": { @@ -5193,6 +5305,7 @@ "tags": [ "Safety" ], + "summary": "Run a shield.", "description": "Run a shield.", "parameters": [], "requestBody": { @@ -5229,6 +5342,7 @@ "tags": [ "Telemetry" ], + "summary": "Save spans to a dataset.", "description": "Save spans to a dataset.", "parameters": [], "requestBody": { @@ -5272,6 +5386,7 @@ "tags": [ "Scoring" ], + "summary": "Score a list of rows.", "description": "Score a list of rows.", "parameters": [], "requestBody": { @@ -5315,6 +5430,7 @@ "tags": [ "Scoring" ], + "summary": "Score a batch of rows.", "description": "Score a batch of rows.", "parameters": [], "requestBody": { @@ -5358,6 +5474,7 @@ "tags": [ "Prompts" ], + "summary": "Set which version of a prompt should be the default in get_prompt (latest).", "description": "Set which version of a prompt should be the default in get_prompt (latest).", "parameters": [ { @@ -5411,6 +5528,7 @@ "tags": [ "PostTraining (Coming Soon)" ], + "summary": "Run supervised fine-tuning of a model.", "description": "Run supervised fine-tuning of a model.", "parameters": [], "requestBody": { @@ -5454,6 +5572,7 @@ "tags": [ "SyntheticDataGeneration (Coming Soon)" ], + "summary": "Generate synthetic data based on input dialogs and apply filtering.", "description": "Generate synthetic data based on input dialogs and apply filtering.", "parameters": [], "requestBody": { @@ -5497,6 +5616,7 @@ "tags": [ "Inspect" ], + "summary": "Get the version of the service.", "description": "Get the version of the service.", "parameters": [] } diff --git a/docs/_static/llama-stack-spec.yaml b/docs/static/llama-stack-spec.yaml similarity index 98% rename from docs/_static/llama-stack-spec.yaml rename to docs/static/llama-stack-spec.yaml index 66216e13b..c4b82b630 100644 --- a/docs/_static/llama-stack-spec.yaml +++ b/docs/static/llama-stack-spec.yaml @@ -27,6 +27,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - DatasetIO + summary: Append rows to a dataset. description: Append rows to a dataset. parameters: - name: dataset_id @@ -64,6 +65,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Inference + summary: >- + Generate chat completions for a batch of messages using the specified model. description: >- Generate chat completions for a batch of messages using the specified model. parameters: [] @@ -95,6 +98,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Inference + summary: >- + Generate completions for a batch of content using the specified model. description: >- Generate completions for a batch of content using the specified model. parameters: [] @@ -121,6 +126,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - PostTraining (Coming Soon) + summary: Cancel a training job. description: Cancel a training job. parameters: [] requestBody: @@ -155,6 +161,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - BatchInference (Coming Soon) + summary: >- + Generate a chat completion for the given messages using the specified model. description: >- Generate a chat completion for the given messages using the specified model. parameters: [] @@ -190,6 +198,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - BatchInference (Coming Soon) + summary: >- + Generate a completion for the given content using the specified model. description: >- Generate a completion for the given content using the specified model. parameters: [] @@ -220,6 +230,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: List all agents. description: List all agents. parameters: - name: start_index @@ -255,6 +266,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: >- + Create an agent with the given configuration. description: >- Create an agent with the given configuration. parameters: [] @@ -285,6 +298,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: Create a new session for an agent. description: Create a new session for an agent. parameters: - name: agent_id @@ -326,6 +340,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: Create a new turn for an agent. description: Create a new turn for an agent. parameters: - name: agent_id @@ -369,6 +384,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: List all OpenAI responses. description: List all OpenAI responses. parameters: - name: after @@ -419,6 +435,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: Create a new OpenAI response. description: Create a new OpenAI response. parameters: [] requestBody: @@ -449,6 +466,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Prompts + summary: List all prompts. description: List all prompts. parameters: [] post: @@ -471,6 +489,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Prompts + summary: Create a new prompt. description: Create a new prompt. parameters: [] requestBody: @@ -500,6 +519,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: Describe an agent by its ID. description: Describe an agent by its ID. parameters: - name: agent_id @@ -524,6 +544,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: >- + Delete an agent by its ID and its associated sessions and turns. description: >- Delete an agent by its ID and its associated sessions and turns. parameters: @@ -554,6 +576,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: Retrieve an agent session by its ID. description: Retrieve an agent session by its ID. parameters: - name: session_id @@ -594,6 +617,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: >- + Delete an agent session by its ID and its associated turns. description: >- Delete an agent session by its ID and its associated turns. parameters: @@ -631,6 +656,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: Retrieve an OpenAI response by its ID. description: Retrieve an OpenAI response by its ID. parameters: - name: response_id @@ -660,6 +686,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: Delete an OpenAI response by its ID. description: Delete an OpenAI response by its ID. parameters: - name: response_id @@ -689,6 +716,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Prompts + summary: >- + Get a prompt by its identifier and optional version. description: >- Get a prompt by its identifier and optional version. parameters: @@ -726,6 +755,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Prompts + summary: >- + Update an existing prompt (increments version). description: >- Update an existing prompt (increments version). parameters: @@ -757,6 +788,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Prompts + summary: Delete a prompt. description: Delete a prompt. parameters: - name: prompt_id @@ -789,6 +821,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Inference + summary: >- + Generate embeddings for content pieces using the specified model. description: >- Generate embeddings for content pieces using the specified model. parameters: [] @@ -820,6 +854,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Eval + summary: Evaluate a list of rows on a benchmark. description: Evaluate a list of rows on a benchmark. parameters: - name: benchmark_id @@ -856,6 +891,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: Retrieve an agent step by its ID. description: Retrieve an agent step by its ID. parameters: - name: agent_id @@ -904,6 +940,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: Retrieve an agent turn by its ID. description: Retrieve an agent turn by its ID. parameters: - name: agent_id @@ -946,6 +983,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Benchmarks + summary: Get a benchmark by its ID. description: Get a benchmark by its ID. parameters: - name: benchmark_id @@ -970,6 +1008,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Benchmarks + summary: Unregister a benchmark. description: Unregister a benchmark. parameters: - name: benchmark_id @@ -999,6 +1038,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Inference + summary: Describe a chat completion by its ID. description: Describe a chat completion by its ID. parameters: - name: completion_id @@ -1028,6 +1068,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Datasets + summary: Get a dataset by its ID. description: Get a dataset by its ID. parameters: - name: dataset_id @@ -1052,6 +1093,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Datasets + summary: Unregister a dataset by its ID. description: Unregister a dataset by its ID. parameters: - name: dataset_id @@ -1081,6 +1123,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Models + summary: Get a model by its identifier. description: Get a model by its identifier. parameters: - name: model_id @@ -1105,6 +1148,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Models + summary: Unregister a model. description: Unregister a model. parameters: - name: model_id @@ -1135,6 +1179,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ScoringFunctions + summary: Get a scoring function by its ID. description: Get a scoring function by its ID. parameters: - name: scoring_fn_id @@ -1159,6 +1204,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ScoringFunctions + summary: Unregister a scoring function. description: Unregister a scoring function. parameters: - name: scoring_fn_id @@ -1189,6 +1235,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Shields + summary: Get a shield by its identifier. description: Get a shield by its identifier. parameters: - name: identifier @@ -1213,6 +1260,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Shields + summary: Unregister a shield. description: Unregister a shield. parameters: - name: identifier @@ -1243,6 +1291,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Telemetry + summary: Get a span by its ID. description: Get a span by its ID. parameters: - name: trace_id @@ -1279,6 +1328,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Telemetry + summary: Get a span tree by its ID. description: Get a span tree by its ID. parameters: - name: span_id @@ -1314,6 +1364,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ToolGroups + summary: Get a tool by its name. description: Get a tool by its name. parameters: - name: tool_name @@ -1343,6 +1394,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ToolGroups + summary: Get a tool group by its ID. description: Get a tool group by its ID. parameters: - name: toolgroup_id @@ -1367,6 +1419,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ToolGroups + summary: Unregister a tool group. description: Unregister a tool group. parameters: - name: toolgroup_id @@ -1396,6 +1449,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Telemetry + summary: Get a trace by its ID. description: Get a trace by its ID. parameters: - name: trace_id @@ -1425,6 +1479,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - PostTraining (Coming Soon) + summary: Get the artifacts of a training job. description: Get the artifacts of a training job. parameters: - name: job_uuid @@ -1455,6 +1510,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - PostTraining (Coming Soon) + summary: Get the status of a training job. description: Get the status of a training job. parameters: - name: job_uuid @@ -1485,6 +1541,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - PostTraining (Coming Soon) + summary: Get all training jobs. description: Get all training jobs. parameters: [] /v1/vector-dbs/{vector_db_id}: @@ -1508,6 +1565,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorDBs + summary: Get a vector database by its identifier. description: Get a vector database by its identifier. parameters: - name: vector_db_id @@ -1533,6 +1591,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorDBs + summary: Unregister a vector database. description: Unregister a vector database. parameters: - name: vector_db_id @@ -1564,6 +1623,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Inspect + summary: >- + Get the current health status of the service. description: >- Get the current health status of the service. parameters: [] @@ -1584,6 +1645,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ToolRuntime + summary: >- + Index documents so they can be used by the RAG system. description: >- Index documents so they can be used by the RAG system. parameters: [] @@ -1610,6 +1673,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: Insert chunks into a vector database. description: Insert chunks into a vector database. parameters: [] requestBody: @@ -1640,6 +1704,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Providers + summary: >- + Get detailed information about a specific provider. description: >- Get detailed information about a specific provider. parameters: @@ -1670,6 +1736,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ToolRuntime + summary: Run a tool with the given arguments. description: Run a tool with the given arguments. parameters: [] requestBody: @@ -1699,6 +1766,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - DatasetIO + summary: >- + Get a paginated list of rows from a dataset. description: >- Get a paginated list of rows from a dataset. @@ -1756,6 +1825,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Eval + summary: Get the status of a job. description: Get the status of a job. parameters: - name: benchmark_id @@ -1787,6 +1857,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Eval + summary: Cancel a job. description: Cancel a job. parameters: - name: benchmark_id @@ -1823,6 +1894,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Eval + summary: Get the result of a job. description: Get the result of a job. parameters: - name: benchmark_id @@ -1859,6 +1931,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: List all session(s) of a given agent. description: List all session(s) of a given agent. parameters: - name: agent_id @@ -1901,6 +1974,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Benchmarks + summary: List all benchmarks. description: List all benchmarks. parameters: [] post: @@ -1919,6 +1993,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Benchmarks + summary: Register a benchmark. description: Register a benchmark. parameters: [] requestBody: @@ -1948,6 +2023,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Inference + summary: List all chat completions. description: List all chat completions. parameters: - name: after @@ -2000,6 +2076,9 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Inference + summary: >- + Generate an OpenAI-compatible chat completion for the given messages using + the specified model. description: >- Generate an OpenAI-compatible chat completion for the given messages using the specified model. @@ -2031,6 +2110,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Datasets + summary: List all datasets. description: List all datasets. parameters: [] post: @@ -2053,6 +2133,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Datasets + summary: Register a new dataset. description: Register a new dataset. parameters: [] requestBody: @@ -2082,6 +2163,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Models + summary: List all models. description: List all models. parameters: [] post: @@ -2104,6 +2186,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Models + summary: Register a model. description: Register a model. parameters: [] requestBody: @@ -2133,6 +2216,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: >- + List input items for a given OpenAI response. description: >- List input items for a given OpenAI response. parameters: @@ -2203,6 +2288,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Prompts + summary: List all versions of a specific prompt. description: List all versions of a specific prompt. parameters: - name: prompt_id @@ -2234,6 +2320,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Providers + summary: List all available providers. description: List all available providers. parameters: [] /v1/inspect/routes: @@ -2258,6 +2345,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Inspect + summary: >- + List all available API routes with their methods and implementing providers. description: >- List all available API routes with their methods and implementing providers. parameters: [] @@ -2282,6 +2371,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ToolRuntime + summary: List all tools in the runtime. description: List all tools in the runtime. parameters: - name: tool_group_id @@ -2319,6 +2409,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ScoringFunctions + summary: List all scoring functions. description: List all scoring functions. parameters: [] post: @@ -2337,6 +2428,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ScoringFunctions + summary: Register a scoring function. description: Register a scoring function. parameters: [] requestBody: @@ -2366,6 +2458,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Shields + summary: List all shields. description: List all shields. parameters: [] post: @@ -2388,6 +2481,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Shields + summary: Register a shield. description: Register a shield. parameters: [] requestBody: @@ -2417,6 +2511,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ToolGroups + summary: List tool groups with optional provider. description: List tool groups with optional provider. parameters: [] post: @@ -2435,6 +2530,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ToolGroups + summary: Register a tool group. description: Register a tool group. parameters: [] requestBody: @@ -2464,6 +2560,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ToolGroups + summary: List tools with optional tool group. description: List tools with optional tool group. parameters: - name: toolgroup_id @@ -2494,6 +2591,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorDBs + summary: List all vector databases. description: List all vector databases. parameters: [] post: @@ -2516,6 +2614,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorDBs + summary: Register a vector database. description: Register a vector database. parameters: [] requestBody: @@ -2541,6 +2640,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Telemetry + summary: Log an event. description: Log an event. parameters: [] requestBody: @@ -2571,6 +2671,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: List files in a vector store. description: List files in a vector store. parameters: - name: vector_store_id @@ -2641,6 +2742,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: Attach a file to a vector store. description: Attach a file to a vector store. parameters: - name: vector_store_id @@ -2677,6 +2779,9 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Inference + summary: >- + Generate an OpenAI-compatible completion for the given prompt using the specified + model. description: >- Generate an OpenAI-compatible completion for the given prompt using the specified model. @@ -2709,6 +2814,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: Returns a list of vector stores. description: Returns a list of vector stores. parameters: - name: limit @@ -2764,6 +2870,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: Creates a vector store. description: Creates a vector store. parameters: [] requestBody: @@ -2794,6 +2901,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Files + summary: >- + Returns information about a specific file. description: >- Returns information about a specific file. parameters: @@ -2825,6 +2934,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Files + summary: Delete a file. description: Delete a file. parameters: - name: file_id @@ -2856,6 +2966,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: Retrieves a vector store. description: Retrieves a vector store. parameters: - name: vector_store_id @@ -2885,6 +2996,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: Updates a vector store. description: Updates a vector store. parameters: - name: vector_store_id @@ -2920,6 +3032,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: Delete a vector store. description: Delete a vector store. parameters: - name: vector_store_id @@ -2950,6 +3063,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: Retrieves a vector store file. description: Retrieves a vector store file. parameters: - name: vector_store_id @@ -2986,6 +3100,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: Updates a vector store file. description: Updates a vector store file. parameters: - name: vector_store_id @@ -3028,6 +3143,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: Delete a vector store file. description: Delete a vector store file. parameters: - name: vector_store_id @@ -3065,6 +3181,9 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Inference + summary: >- + Generate OpenAI-compatible embeddings for the given input using the specified + model. description: >- Generate OpenAI-compatible embeddings for the given input using the specified model. @@ -3097,6 +3216,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Files + summary: >- + Returns a list of files that belong to the user's organization. description: >- Returns a list of files that belong to the user's organization. parameters: @@ -3154,6 +3275,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Files + summary: >- + Upload a file that can be used across various endpoints. description: >- Upload a file that can be used across various endpoints. @@ -3213,6 +3336,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Models + summary: List models using the OpenAI API. description: List models using the OpenAI API. parameters: [] /v1/openai/v1/files/{file_id}/content: @@ -3237,6 +3361,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Files + summary: >- + Returns the contents of the specified file. description: >- Returns the contents of the specified file. parameters: @@ -3269,6 +3395,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: >- + Retrieves the contents of a vector store file. description: >- Retrieves the contents of a vector store file. parameters: @@ -3307,6 +3435,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: Search for chunks in a vector store. description: >- Search for chunks in a vector store. @@ -3346,6 +3475,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - PostTraining (Coming Soon) + summary: Run preference optimization of a model. description: Run preference optimization of a model. parameters: [] requestBody: @@ -3376,6 +3506,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ToolRuntime + summary: >- + Query the RAG system for context; typically invoked by the agent. description: >- Query the RAG system for context; typically invoked by the agent. parameters: [] @@ -3406,6 +3538,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: Query chunks from a vector database. description: Query chunks from a vector database. parameters: [] requestBody: @@ -3435,6 +3568,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Telemetry + summary: Query metrics. description: Query metrics. parameters: - name: metric_name @@ -3470,6 +3604,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Telemetry + summary: Query spans. description: Query spans. parameters: [] requestBody: @@ -3499,6 +3634,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Telemetry + summary: Query traces. description: Query traces. parameters: [] requestBody: @@ -3529,6 +3665,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Inference + summary: >- + Rerank a list of documents based on their relevance to a query. description: >- Rerank a list of documents based on their relevance to a query. parameters: [] @@ -3564,6 +3702,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: >- + Resume an agent turn with executed tool call responses. description: >- Resume an agent turn with executed tool call responses. @@ -3617,6 +3757,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Eval + summary: Run an evaluation on a benchmark. description: Run an evaluation on a benchmark. parameters: - name: benchmark_id @@ -3653,6 +3794,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Safety + summary: >- + Classifies if text and/or image inputs are potentially harmful. description: >- Classifies if text and/or image inputs are potentially harmful. parameters: [] @@ -3683,6 +3826,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Safety + summary: Run a shield. description: Run a shield. parameters: [] requestBody: @@ -3708,6 +3852,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Telemetry + summary: Save spans to a dataset. description: Save spans to a dataset. parameters: [] requestBody: @@ -3738,6 +3883,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Scoring + summary: Score a list of rows. description: Score a list of rows. parameters: [] requestBody: @@ -3767,6 +3913,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Scoring + summary: Score a batch of rows. description: Score a batch of rows. parameters: [] requestBody: @@ -3797,6 +3944,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Prompts + summary: >- + Set which version of a prompt should be the default in get_prompt (latest). description: >- Set which version of a prompt should be the default in get_prompt (latest). parameters: @@ -3833,6 +3982,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - PostTraining (Coming Soon) + summary: Run supervised fine-tuning of a model. description: Run supervised fine-tuning of a model. parameters: [] requestBody: @@ -3863,6 +4013,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - SyntheticDataGeneration (Coming Soon) + summary: >- + Generate synthetic data based on input dialogs and apply filtering. description: >- Generate synthetic data based on input dialogs and apply filtering. parameters: [] @@ -3894,6 +4046,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Inspect + summary: Get the version of the service. description: Get the version of the service. parameters: [] jsonSchemaDialect: >- From 45da31801c411ba42dcfd778e1011e1aacc28f44 Mon Sep 17 00:00:00 2001 From: Alexey Rybak <50731695+reluctantfuturist@users.noreply.github.com> Date: Wed, 24 Sep 2025 13:59:31 -0700 Subject: [PATCH 11/27] fix: update API conformance test to point to new schema location (#3528) # What does this PR do? Update file paths in the conformance workflow to reflect the new location of the llama-stack-spec files from `docs/_static/` to `docs/static/`. Also update the `.gitignore` file to exclude Docusaurus-related directories (`docs/.docusaurus/` and `docs/node_modules/`). ## Test Plan - Run the workflow locally --- .github/workflows/conformance.yml | 6 +++--- .gitignore | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/conformance.yml b/.github/workflows/conformance.yml index c7962c93d..9383476f5 100644 --- a/.github/workflows/conformance.yml +++ b/.github/workflows/conformance.yml @@ -13,8 +13,8 @@ on: branches: [ main ] types: [opened, synchronize, reopened] paths: - - 'docs/_static/llama-stack-spec.yaml' - - 'docs/_static/llama-stack-spec.html' + - 'docs/static/llama-stack-spec.yaml' + - 'docs/static/llama-stack-spec.html' - '.github/workflows/conformance.yml' # This workflow itself concurrency: @@ -66,6 +66,6 @@ jobs: # This step will fail if incompatible changes are detected, preventing breaking changes from being merged - name: Run OpenAPI Breaking Change Diff run: | - oasdiff breaking --fail-on ERR base/docs/_static/llama-stack-spec.yaml docs/_static/llama-stack-spec.yaml --match-path '^/v1/openai/v1' \ + oasdiff breaking --fail-on ERR base/docs/static/llama-stack-spec.yaml docs/static/llama-stack-spec.yaml --match-path '^/v1/openai/v1' \ --match-path '^/v1/vector-io' \ --match-path '^/v1/vector-dbs' diff --git a/.gitignore b/.gitignore index 11cc59847..b516d4dd9 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,5 @@ AGENTS.md server.log CLAUDE.md .claude/ +docs/.docusaurus/ +docs/node_modules/ From d23865757f3469da0c9a778bc51cb237880c3590 Mon Sep 17 00:00:00 2001 From: Alexey Rybak <50731695+reluctantfuturist@users.noreply.github.com> Date: Wed, 24 Sep 2025 14:01:29 -0700 Subject: [PATCH 12/27] docs: provider and distro codegen migration (#3531) # What does this PR do? - Updates provider and distro codegen to handle the new format - Migrates provider and distro files to the new format ## Test Plan - Manual testing --- .../self_hosted_distro/meta-reference-gpu.md | 125 +++++++++++ .../self_hosted_distro/nvidia.md | 171 ++++++++++++++ .../providers/agents/index.mdx} | 19 +- .../agents/inline_meta-reference.mdx} | 8 +- .../providers/batches/index.mdx} | 21 +- .../providers/batches/inline_reference.mdx} | 8 +- docs/docs/providers/datasetio/index.md | 16 ++ docs/docs/providers/datasetio/index.mdx | 16 ++ .../providers/datasetio/inline_localfs.mdx} | 8 +- .../datasetio/remote_huggingface.mdx} | 8 +- .../providers/datasetio/remote_nvidia.mdx} | 8 +- docs/docs/providers/eval/index.mdx | 18 ++ .../providers/eval/inline_meta-reference.mdx} | 8 +- .../providers/eval/remote_nvidia.mdx} | 8 +- .../external/external-providers-guide.mdx} | 2 +- .../external/external-providers-list.mdx} | 0 .../providers/external/index.mdx} | 8 +- .../providers/files/index.mdx} | 13 +- .../providers/files/inline_localfs.mdx} | 8 +- .../providers/files/remote_s3.mdx} | 8 +- .../index.md => docs/providers/index.mdx} | 31 +-- docs/docs/providers/inference/index.mdx | 48 ++++ .../inference/inline_meta-reference.mdx} | 8 +- .../inline_sentence-transformers.mdx | 17 ++ .../providers/inference/remote_anthropic.mdx} | 8 +- .../providers/inference/remote_azure.mdx} | 11 +- .../providers/inference/remote_bedrock.mdx} | 8 +- .../providers/inference/remote_cerebras.mdx} | 8 +- .../inference/remote_databricks.mdx} | 8 +- .../providers/inference/remote_fireworks.mdx} | 8 +- .../providers/inference/remote_gemini.mdx} | 8 +- .../providers/inference/remote_groq.mdx} | 8 +- .../inference/remote_hf_endpoint.mdx} | 10 +- .../inference/remote_hf_serverless.mdx} | 8 +- .../inference/remote_llama-openai-compat.mdx} | 8 +- .../providers/inference/remote_nvidia.mdx} | 8 +- .../providers/inference/remote_ollama.mdx} | 8 +- .../providers/inference/remote_openai.mdx} | 8 +- .../inference/remote_passthrough.mdx} | 8 +- .../providers/inference/remote_runpod.mdx} | 8 +- .../remote_sambanova-openai-compat.mdx} | 1 - .../providers/inference/remote_sambanova.mdx} | 8 +- .../providers/inference/remote_tgi.mdx} | 8 +- .../providers/inference/remote_together.mdx} | 8 +- .../providers/inference/remote_vertexai.mdx} | 28 ++- .../providers/inference/remote_vllm.mdx} | 8 +- .../providers/inference/remote_watsonx.mdx} | 8 +- .../openai.md => docs/providers/openai.mdx} | 4 +- docs/docs/providers/post_training/index.mdx | 17 ++ .../post_training/inline_huggingface-cpu.mdx} | 1 - .../post_training/inline_huggingface-gpu.mdx} | 15 +- .../post_training/inline_huggingface.mdx} | 1 - .../post_training/inline_torchtune-cpu.mdx} | 8 +- .../post_training/inline_torchtune-gpu.mdx} | 8 +- .../post_training/inline_torchtune.md | 0 .../post_training/remote_nvidia.mdx} | 8 +- docs/docs/providers/safety/index.mdx | 19 ++ .../providers/safety/inline_code-scanner.mdx} | 8 +- .../providers/safety/inline_llama-guard.mdx} | 8 +- .../providers/safety/inline_prompt-guard.mdx} | 8 +- .../providers/safety/remote_bedrock.mdx} | 8 +- .../providers/safety/remote_nvidia.mdx} | 8 +- .../providers/safety/remote_sambanova.mdx} | 8 +- docs/docs/providers/scoring/index.mdx | 16 ++ .../providers/scoring/inline_basic.mdx} | 8 +- .../providers/scoring/inline_braintrust.mdx} | 8 +- .../scoring/inline_llm-as-judge.mdx} | 8 +- .../providers/telemetry/index.mdx} | 11 +- .../telemetry/inline_meta-reference.mdx} | 10 +- docs/docs/providers/tool_runtime/index.mdx | 19 ++ .../tool_runtime/inline_rag-runtime.mdx} | 8 +- .../tool_runtime/remote_bing-search.mdx} | 8 +- .../tool_runtime/remote_brave-search.mdx} | 8 +- .../remote_model-context-protocol.mdx | 17 ++ .../tool_runtime/remote_tavily-search.mdx} | 8 +- .../tool_runtime/remote_wolfram-alpha.mdx} | 8 +- docs/docs/providers/vector_io/index.mdx | 25 +++ .../providers/vector_io/inline_chromadb.mdx} | 39 +++- .../providers/vector_io/inline_faiss.mdx} | 48 +++- .../vector_io/inline_meta-reference.mdx} | 13 +- .../providers/vector_io/inline_milvus.mdx} | 8 +- .../providers/vector_io/inline_qdrant.mdx} | 49 +++- .../vector_io/inline_sqlite-vec.mdx} | 204 ++++++++++++++++- .../vector_io/inline_sqlite_vec.mdx} | 13 +- .../providers/vector_io/remote_chromadb.mdx} | 39 +++- .../providers/vector_io/remote_milvus.mdx} | 212 +++++++++++++++++- .../providers/vector_io/remote_pgvector.mdx} | 109 ++++++++- .../providers/vector_io/remote_qdrant.mdx} | 8 +- .../providers/vector_io/remote_weaviate.mdx} | 37 ++- docs/source/providers/datasetio/index.md | 15 -- docs/source/providers/eval/index.md | 16 -- docs/source/providers/inference/index.md | 42 ---- .../inference/inline_sentence-transformers.md | 13 -- docs/source/providers/post_training/index.md | 16 -- docs/source/providers/safety/index.md | 18 -- docs/source/providers/scoring/index.md | 15 -- docs/source/providers/tool_runtime/index.md | 18 -- .../remote_model-context-protocol.md | 13 -- docs/source/providers/vector_io/index.md | 24 -- .../distributions/nvidia/doc_template.md | 12 +- llama_stack/providers/registry/vector_io.py | 2 +- scripts/distro_codegen.py | 2 +- scripts/provider_codegen.py | 156 ++++++++++--- 103 files changed, 1796 insertions(+), 423 deletions(-) create mode 100644 docs/docs/distributions/self_hosted_distro/meta-reference-gpu.md create mode 100644 docs/docs/distributions/self_hosted_distro/nvidia.md rename docs/{source/providers/agents/index.md => docs/providers/agents/index.mdx} (50%) rename docs/{source/providers/agents/inline_meta-reference.md => docs/providers/agents/inline_meta-reference.mdx} (80%) rename docs/{source/providers/batches/index.md => docs/providers/batches/index.mdx} (51%) rename docs/{source/providers/batches/inline_reference.md => docs/providers/batches/inline_reference.mdx} (86%) create mode 100644 docs/docs/providers/datasetio/index.md create mode 100644 docs/docs/providers/datasetio/index.mdx rename docs/{source/providers/datasetio/inline_localfs.md => docs/providers/datasetio/inline_localfs.mdx} (78%) rename docs/{source/providers/datasetio/remote_huggingface.md => docs/providers/datasetio/remote_huggingface.mdx} (77%) rename docs/{source/providers/datasetio/remote_nvidia.md => docs/providers/datasetio/remote_nvidia.mdx} (83%) create mode 100644 docs/docs/providers/eval/index.mdx rename docs/{source/providers/eval/inline_meta-reference.md => docs/providers/eval/inline_meta-reference.mdx} (76%) rename docs/{source/providers/eval/remote_nvidia.md => docs/providers/eval/remote_nvidia.mdx} (74%) rename docs/{source/providers/external/external-providers-guide.md => docs/providers/external/external-providers-guide.mdx} (99%) rename docs/{source/providers/external/external-providers-list.md => docs/providers/external/external-providers-list.mdx} (100%) rename docs/{source/providers/external/index.md => docs/providers/external/index.mdx} (68%) rename docs/{source/providers/files/index.md => docs/providers/files/index.mdx} (55%) rename docs/{source/providers/files/inline_localfs.md => docs/providers/files/inline_localfs.mdx} (82%) rename docs/{source/providers/files/remote_s3.md => docs/providers/files/remote_s3.mdx} (89%) rename docs/{source/providers/index.md => docs/providers/index.mdx} (57%) create mode 100644 docs/docs/providers/inference/index.mdx rename docs/{source/providers/inference/inline_meta-reference.md => docs/providers/inference/inline_meta-reference.mdx} (84%) create mode 100644 docs/docs/providers/inference/inline_sentence-transformers.mdx rename docs/{source/providers/inference/remote_anthropic.md => docs/providers/inference/remote_anthropic.mdx} (69%) rename docs/{source/providers/inference/remote_azure.md => docs/providers/inference/remote_azure.mdx} (78%) rename docs/{source/providers/inference/remote_bedrock.md => docs/providers/inference/remote_bedrock.mdx} (91%) rename docs/{source/providers/inference/remote_cerebras.md => docs/providers/inference/remote_cerebras.mdx} (76%) rename docs/{source/providers/inference/remote_databricks.md => docs/providers/inference/remote_databricks.mdx} (75%) rename docs/{source/providers/inference/remote_fireworks.md => docs/providers/inference/remote_fireworks.mdx} (80%) rename docs/{source/providers/inference/remote_gemini.md => docs/providers/inference/remote_gemini.mdx} (70%) rename docs/{source/providers/inference/remote_groq.md => docs/providers/inference/remote_groq.mdx} (76%) rename docs/{source/providers/inference/remote_hf_endpoint.md => docs/providers/inference/remote_hf_endpoint.mdx} (59%) rename docs/{source/providers/inference/remote_hf_serverless.md => docs/providers/inference/remote_hf_serverless.mdx} (79%) rename docs/{source/providers/inference/remote_llama-openai-compat.md => docs/providers/inference/remote_llama-openai-compat.mdx} (75%) rename docs/{source/providers/inference/remote_nvidia.md => docs/providers/inference/remote_nvidia.mdx} (85%) rename docs/{source/providers/inference/remote_ollama.md => docs/providers/inference/remote_ollama.mdx} (75%) rename docs/{source/providers/inference/remote_openai.md => docs/providers/inference/remote_openai.mdx} (77%) rename docs/{source/providers/inference/remote_passthrough.md => docs/providers/inference/remote_passthrough.mdx} (74%) rename docs/{source/providers/inference/remote_runpod.md => docs/providers/inference/remote_runpod.mdx} (75%) rename docs/{source/providers/inference/remote_sambanova-openai-compat.md => docs/providers/inference/remote_sambanova-openai-compat.mdx} (99%) rename docs/{source/providers/inference/remote_sambanova.md => docs/providers/inference/remote_sambanova.mdx} (76%) rename docs/{source/providers/inference/remote_tgi.md => docs/providers/inference/remote_tgi.mdx} (71%) rename docs/{source/providers/inference/remote_together.md => docs/providers/inference/remote_together.mdx} (80%) rename docs/{source/providers/inference/remote_vertexai.md => docs/providers/inference/remote_vertexai.mdx} (56%) rename docs/{source/providers/inference/remote_vllm.md => docs/providers/inference/remote_vllm.mdx} (86%) rename docs/{source/providers/inference/remote_watsonx.md => docs/providers/inference/remote_watsonx.mdx} (82%) rename docs/{source/providers/openai.md => docs/providers/openai.mdx} (90%) create mode 100644 docs/docs/providers/post_training/index.mdx rename docs/{source/providers/post_training/inline_huggingface-cpu.md => docs/providers/post_training/inline_huggingface-cpu.mdx} (99%) rename docs/{source/providers/post_training/inline_huggingface-gpu.md => docs/providers/post_training/inline_huggingface-gpu.mdx} (74%) rename docs/{source/providers/post_training/inline_huggingface.md => docs/providers/post_training/inline_huggingface.mdx} (99%) rename docs/{source/providers/post_training/inline_torchtune-cpu.md => docs/providers/post_training/inline_torchtune-cpu.mdx} (70%) rename docs/{source/providers/post_training/inline_torchtune-gpu.md => docs/providers/post_training/inline_torchtune-gpu.mdx} (70%) rename docs/{source => docs}/providers/post_training/inline_torchtune.md (100%) rename docs/{source/providers/post_training/remote_nvidia.md => docs/providers/post_training/remote_nvidia.mdx} (87%) create mode 100644 docs/docs/providers/safety/index.mdx rename docs/{source/providers/safety/inline_code-scanner.md => docs/providers/safety/inline_code-scanner.mdx} (50%) rename docs/{source/providers/safety/inline_llama-guard.md => docs/providers/safety/inline_llama-guard.mdx} (67%) rename docs/{source/providers/safety/inline_prompt-guard.md => docs/providers/safety/inline_prompt-guard.mdx} (68%) rename docs/{source/providers/safety/remote_bedrock.md => docs/providers/safety/remote_bedrock.mdx} (92%) rename docs/{source/providers/safety/remote_nvidia.md => docs/providers/safety/remote_nvidia.mdx} (81%) rename docs/{source/providers/safety/remote_sambanova.md => docs/providers/safety/remote_sambanova.mdx} (77%) create mode 100644 docs/docs/providers/scoring/index.mdx rename docs/{source/providers/scoring/inline_basic.md => docs/providers/scoring/inline_basic.mdx} (51%) rename docs/{source/providers/scoring/inline_braintrust.md => docs/providers/scoring/inline_braintrust.mdx} (70%) rename docs/{source/providers/scoring/inline_llm-as-judge.md => docs/providers/scoring/inline_llm-as-judge.mdx} (50%) rename docs/{source/providers/telemetry/index.md => docs/providers/telemetry/index.mdx} (58%) rename docs/{source/providers/telemetry/inline_meta-reference.md => docs/providers/telemetry/inline_meta-reference.mdx} (73%) create mode 100644 docs/docs/providers/tool_runtime/index.mdx rename docs/{source/providers/tool_runtime/inline_rag-runtime.md => docs/providers/tool_runtime/inline_rag-runtime.mdx} (50%) rename docs/{source/providers/tool_runtime/remote_bing-search.md => docs/providers/tool_runtime/remote_bing-search.mdx} (70%) rename docs/{source/providers/tool_runtime/remote_brave-search.md => docs/providers/tool_runtime/remote_brave-search.mdx} (74%) create mode 100644 docs/docs/providers/tool_runtime/remote_model-context-protocol.mdx rename docs/{source/providers/tool_runtime/remote_tavily-search.md => docs/providers/tool_runtime/remote_tavily-search.mdx} (74%) rename docs/{source/providers/tool_runtime/remote_wolfram-alpha.md => docs/providers/tool_runtime/remote_wolfram-alpha.mdx} (68%) create mode 100644 docs/docs/providers/vector_io/index.mdx rename docs/{source/providers/vector_io/inline_chromadb.md => docs/providers/vector_io/inline_chromadb.mdx} (60%) rename docs/{source/providers/vector_io/inline_faiss.md => docs/providers/vector_io/inline_faiss.mdx} (55%) rename docs/{source/providers/vector_io/inline_meta-reference.md => docs/providers/vector_io/inline_meta-reference.mdx} (80%) rename docs/{source/providers/vector_io/inline_milvus.md => docs/providers/vector_io/inline_milvus.mdx} (87%) rename docs/{source/providers/vector_io/inline_qdrant.md => docs/providers/vector_io/inline_qdrant.mdx} (56%) rename docs/{source/providers/vector_io/inline_sqlite-vec.md => docs/providers/vector_io/inline_sqlite-vec.mdx} (51%) rename docs/{source/providers/vector_io/inline_sqlite_vec.md => docs/providers/vector_io/inline_sqlite_vec.mdx} (85%) rename docs/{source/providers/vector_io/remote_chromadb.md => docs/providers/vector_io/remote_chromadb.mdx} (59%) rename docs/{source/providers/vector_io/remote_milvus.md => docs/providers/vector_io/remote_milvus.mdx} (50%) rename docs/{source/providers/vector_io/remote_pgvector.md => docs/providers/vector_io/remote_pgvector.mdx} (53%) rename docs/{source/providers/vector_io/remote_qdrant.md => docs/providers/vector_io/remote_qdrant.mdx} (88%) rename docs/{source/providers/vector_io/remote_weaviate.md => docs/providers/vector_io/remote_weaviate.mdx} (63%) delete mode 100644 docs/source/providers/datasetio/index.md delete mode 100644 docs/source/providers/eval/index.md delete mode 100644 docs/source/providers/inference/index.md delete mode 100644 docs/source/providers/inference/inline_sentence-transformers.md delete mode 100644 docs/source/providers/post_training/index.md delete mode 100644 docs/source/providers/safety/index.md delete mode 100644 docs/source/providers/scoring/index.md delete mode 100644 docs/source/providers/tool_runtime/index.md delete mode 100644 docs/source/providers/tool_runtime/remote_model-context-protocol.md delete mode 100644 docs/source/providers/vector_io/index.md diff --git a/docs/docs/distributions/self_hosted_distro/meta-reference-gpu.md b/docs/docs/distributions/self_hosted_distro/meta-reference-gpu.md new file mode 100644 index 000000000..84b85b91c --- /dev/null +++ b/docs/docs/distributions/self_hosted_distro/meta-reference-gpu.md @@ -0,0 +1,125 @@ +--- +orphan: true +--- + +# Meta Reference GPU Distribution + +```{toctree} +:maxdepth: 2 +:hidden: + +self +``` + +The `llamastack/distribution-meta-reference-gpu` distribution consists of the following provider configurations: + +| API | Provider(s) | +|-----|-------------| +| agents | `inline::meta-reference` | +| datasetio | `remote::huggingface`, `inline::localfs` | +| eval | `inline::meta-reference` | +| inference | `inline::meta-reference` | +| safety | `inline::llama-guard` | +| scoring | `inline::basic`, `inline::llm-as-judge`, `inline::braintrust` | +| telemetry | `inline::meta-reference` | +| tool_runtime | `remote::brave-search`, `remote::tavily-search`, `inline::rag-runtime`, `remote::model-context-protocol` | +| vector_io | `inline::faiss`, `remote::chromadb`, `remote::pgvector` | + + +Note that you need access to nvidia GPUs to run this distribution. This distribution is not compatible with CPU-only machines or machines with AMD GPUs. + +### Environment Variables + +The following environment variables can be configured: + +- `LLAMA_STACK_PORT`: Port for the Llama Stack distribution server (default: `8321`) +- `INFERENCE_MODEL`: Inference model loaded into the Meta Reference server (default: `meta-llama/Llama-3.2-3B-Instruct`) +- `INFERENCE_CHECKPOINT_DIR`: Directory containing the Meta Reference model checkpoint (default: `null`) +- `SAFETY_MODEL`: Name of the safety (Llama-Guard) model to use (default: `meta-llama/Llama-Guard-3-1B`) +- `SAFETY_CHECKPOINT_DIR`: Directory containing the Llama-Guard model checkpoint (default: `null`) + + +## Prerequisite: Downloading Models + +Please use `llama model list --downloaded` to check that you have llama model checkpoints downloaded in `~/.llama` before proceeding. See [installation guide](../../references/llama_cli_reference/download_models.md) here to download the models. Run `llama model list` to see the available models to download, and `llama model download` to download the checkpoints. + +``` +$ llama model list --downloaded +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┓ +┃ Model ┃ Size ┃ Modified Time ┃ +┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━┩ +│ Llama3.2-1B-Instruct:int4-qlora-eo8 │ 1.53 GB │ 2025-02-26 11:22:28 │ +├─────────────────────────────────────────┼──────────┼─────────────────────┤ +│ Llama3.2-1B │ 2.31 GB │ 2025-02-18 21:48:52 │ +├─────────────────────────────────────────┼──────────┼─────────────────────┤ +│ Prompt-Guard-86M │ 0.02 GB │ 2025-02-26 11:29:28 │ +├─────────────────────────────────────────┼──────────┼─────────────────────┤ +│ Llama3.2-3B-Instruct:int4-spinquant-eo8 │ 3.69 GB │ 2025-02-26 11:37:41 │ +├─────────────────────────────────────────┼──────────┼─────────────────────┤ +│ Llama3.2-3B │ 5.99 GB │ 2025-02-18 21:51:26 │ +├─────────────────────────────────────────┼──────────┼─────────────────────┤ +│ Llama3.1-8B │ 14.97 GB │ 2025-02-16 10:36:37 │ +├─────────────────────────────────────────┼──────────┼─────────────────────┤ +│ Llama3.2-1B-Instruct:int4-spinquant-eo8 │ 1.51 GB │ 2025-02-26 11:35:02 │ +├─────────────────────────────────────────┼──────────┼─────────────────────┤ +│ Llama-Guard-3-1B │ 2.80 GB │ 2025-02-26 11:20:46 │ +├─────────────────────────────────────────┼──────────┼─────────────────────┤ +│ Llama-Guard-3-1B:int4 │ 0.43 GB │ 2025-02-26 11:33:33 │ +└─────────────────────────────────────────┴──────────┴─────────────────────┘ +``` + +## Running the Distribution + +You can do this via venv or Docker which has a pre-built image. + +### Via Docker + +This method allows you to get started quickly without having to build the distribution code. + +```bash +LLAMA_STACK_PORT=8321 +docker run \ + -it \ + --pull always \ + --gpu all \ + -p $LLAMA_STACK_PORT:$LLAMA_STACK_PORT \ + -v ~/.llama:/root/.llama \ + llamastack/distribution-meta-reference-gpu \ + --port $LLAMA_STACK_PORT \ + --env INFERENCE_MODEL=meta-llama/Llama-3.2-3B-Instruct +``` + +If you are using Llama Stack Safety / Shield APIs, use: + +```bash +docker run \ + -it \ + --pull always \ + --gpu all \ + -p $LLAMA_STACK_PORT:$LLAMA_STACK_PORT \ + -v ~/.llama:/root/.llama \ + llamastack/distribution-meta-reference-gpu \ + --port $LLAMA_STACK_PORT \ + --env INFERENCE_MODEL=meta-llama/Llama-3.2-3B-Instruct \ + --env SAFETY_MODEL=meta-llama/Llama-Guard-3-1B +``` + +### Via venv + +Make sure you have done `uv pip install llama-stack` and have the Llama Stack CLI available. + +```bash +llama stack build --distro meta-reference-gpu --image-type venv +llama stack run distributions/meta-reference-gpu/run.yaml \ + --port 8321 \ + --env INFERENCE_MODEL=meta-llama/Llama-3.2-3B-Instruct +``` + +If you are using Llama Stack Safety / Shield APIs, use: + +```bash +llama stack run distributions/meta-reference-gpu/run-with-safety.yaml \ + --port 8321 \ + --env INFERENCE_MODEL=meta-llama/Llama-3.2-3B-Instruct \ + --env SAFETY_MODEL=meta-llama/Llama-Guard-3-1B +``` diff --git a/docs/docs/distributions/self_hosted_distro/nvidia.md b/docs/docs/distributions/self_hosted_distro/nvidia.md new file mode 100644 index 000000000..fba411640 --- /dev/null +++ b/docs/docs/distributions/self_hosted_distro/nvidia.md @@ -0,0 +1,171 @@ +--- +orphan: true +--- + +# NVIDIA Distribution + +The `llamastack/distribution-nvidia` distribution consists of the following provider configurations. + +| API | Provider(s) | +|-----|-------------| +| agents | `inline::meta-reference` | +| datasetio | `inline::localfs`, `remote::nvidia` | +| eval | `remote::nvidia` | +| files | `inline::localfs` | +| inference | `remote::nvidia` | +| post_training | `remote::nvidia` | +| safety | `remote::nvidia` | +| scoring | `inline::basic` | +| telemetry | `inline::meta-reference` | +| tool_runtime | `inline::rag-runtime` | +| vector_io | `inline::faiss` | + + +### Environment Variables + +The following environment variables can be configured: + +- `NVIDIA_API_KEY`: NVIDIA API Key (default: ``) +- `NVIDIA_APPEND_API_VERSION`: Whether to append the API version to the base_url (default: `True`) +- `NVIDIA_DATASET_NAMESPACE`: NVIDIA Dataset Namespace (default: `default`) +- `NVIDIA_PROJECT_ID`: NVIDIA Project ID (default: `test-project`) +- `NVIDIA_CUSTOMIZER_URL`: NVIDIA Customizer URL (default: `https://customizer.api.nvidia.com`) +- `NVIDIA_OUTPUT_MODEL_DIR`: NVIDIA Output Model Directory (default: `test-example-model@v1`) +- `GUARDRAILS_SERVICE_URL`: URL for the NeMo Guardrails Service (default: `http://0.0.0.0:7331`) +- `NVIDIA_GUARDRAILS_CONFIG_ID`: NVIDIA Guardrail Configuration ID (default: `self-check`) +- `NVIDIA_EVALUATOR_URL`: URL for the NeMo Evaluator Service (default: `http://0.0.0.0:7331`) +- `INFERENCE_MODEL`: Inference model (default: `Llama3.1-8B-Instruct`) +- `SAFETY_MODEL`: Name of the model to use for safety (default: `meta/llama-3.1-8b-instruct`) + +### Models + +The following models are available by default: + +- `meta/llama3-8b-instruct ` +- `meta/llama3-70b-instruct ` +- `meta/llama-3.1-8b-instruct ` +- `meta/llama-3.1-70b-instruct ` +- `meta/llama-3.1-405b-instruct ` +- `meta/llama-3.2-1b-instruct ` +- `meta/llama-3.2-3b-instruct ` +- `meta/llama-3.2-11b-vision-instruct ` +- `meta/llama-3.2-90b-vision-instruct ` +- `meta/llama-3.3-70b-instruct ` +- `nvidia/vila ` +- `nvidia/llama-3.2-nv-embedqa-1b-v2 ` +- `nvidia/nv-embedqa-e5-v5 ` +- `nvidia/nv-embedqa-mistral-7b-v2 ` +- `snowflake/arctic-embed-l ` + + +## Prerequisites +### NVIDIA API Keys + +Make sure you have access to a NVIDIA API Key. You can get one by visiting [https://build.nvidia.com/](https://build.nvidia.com/). Use this key for the `NVIDIA_API_KEY` environment variable. + +### Deploy NeMo Microservices Platform +The NVIDIA NeMo microservices platform supports end-to-end microservice deployment of a complete AI flywheel on your Kubernetes cluster through the NeMo Microservices Helm Chart. Please reference the [NVIDIA NeMo Microservices documentation](https://docs.nvidia.com/nemo/microservices/latest/about/index.html) for platform prerequisites and instructions to install and deploy the platform. + +## Supported Services +Each Llama Stack API corresponds to a specific NeMo microservice. The core microservices (Customizer, Evaluator, Guardrails) are exposed by the same endpoint. The platform components (Data Store) are each exposed by separate endpoints. + +### Inference: NVIDIA NIM +NVIDIA NIM is used for running inference with registered models. There are two ways to access NVIDIA NIMs: + 1. Hosted (default): Preview APIs hosted at https://integrate.api.nvidia.com (Requires an API key) + 2. Self-hosted: NVIDIA NIMs that run on your own infrastructure. + +The deployed platform includes the NIM Proxy microservice, which is the service that provides to access your NIMs (for example, to run inference on a model). Set the `NVIDIA_BASE_URL` environment variable to use your NVIDIA NIM Proxy deployment. + +### Datasetio API: NeMo Data Store +The NeMo Data Store microservice serves as the default file storage solution for the NeMo microservices platform. It exposts APIs compatible with the Hugging Face Hub client (`HfApi`), so you can use the client to interact with Data Store. The `NVIDIA_DATASETS_URL` environment variable should point to your NeMo Data Store endpoint. + +See the [NVIDIA Datasetio docs](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/providers/remote/datasetio/nvidia/README.md) for supported features and example usage. + +### Eval API: NeMo Evaluator +The NeMo Evaluator microservice supports evaluation of LLMs. Launching an Evaluation job with NeMo Evaluator requires an Evaluation Config (an object that contains metadata needed by the job). A Llama Stack Benchmark maps to an Evaluation Config, so registering a Benchmark creates an Evaluation Config in NeMo Evaluator. The `NVIDIA_EVALUATOR_URL` environment variable should point to your NeMo Microservices endpoint. + +See the [NVIDIA Eval docs](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/providers/remote/eval/nvidia/README.md) for supported features and example usage. + +### Post-Training API: NeMo Customizer +The NeMo Customizer microservice supports fine-tuning models. You can reference [this list of supported models](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/providers/remote/post_training/nvidia/models.py) that can be fine-tuned using Llama Stack. The `NVIDIA_CUSTOMIZER_URL` environment variable should point to your NeMo Microservices endpoint. + +See the [NVIDIA Post-Training docs](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/providers/remote/post_training/nvidia/README.md) for supported features and example usage. + +### Safety API: NeMo Guardrails +The NeMo Guardrails microservice sits between your application and the LLM, and adds checks and content moderation to a model. The `GUARDRAILS_SERVICE_URL` environment variable should point to your NeMo Microservices endpoint. + +See the [NVIDIA Safety docs](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/providers/remote/safety/nvidia/README.md) for supported features and example usage. + +## Deploying models +In order to use a registered model with the Llama Stack APIs, ensure the corresponding NIM is deployed to your environment. For example, you can use the NIM Proxy microservice to deploy `meta/llama-3.2-1b-instruct`. + +Note: For improved inference speeds, we need to use NIM with `fast_outlines` guided decoding system (specified in the request body). This is the default if you deployed the platform with the NeMo Microservices Helm Chart. +```sh +# URL to NeMo NIM Proxy service +export NEMO_URL="http://nemo.test" + +curl --location "$NEMO_URL/v1/deployment/model-deployments" \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "name": "llama-3.2-1b-instruct", + "namespace": "meta", + "config": { + "model": "meta/llama-3.2-1b-instruct", + "nim_deployment": { + "image_name": "nvcr.io/nim/meta/llama-3.2-1b-instruct", + "image_tag": "1.8.3", + "pvc_size": "25Gi", + "gpu": 1, + "additional_envs": { + "NIM_GUIDED_DECODING_BACKEND": "fast_outlines" + } + } + } + }' +``` +This NIM deployment should take approximately 10 minutes to go live. [See the docs](https://docs.nvidia.com/nemo/microservices/latest/get-started/tutorials/deploy-nims.html) for more information on how to deploy a NIM and verify it's available for inference. + +You can also remove a deployed NIM to free up GPU resources, if needed. +```sh +export NEMO_URL="http://nemo.test" + +curl -X DELETE "$NEMO_URL/v1/deployment/model-deployments/meta/llama-3.1-8b-instruct" +``` + +## Running Llama Stack with NVIDIA + +You can do this via venv (build code), or Docker which has a pre-built image. + +### Via Docker + +This method allows you to get started quickly without having to build the distribution code. + +```bash +LLAMA_STACK_PORT=8321 +docker run \ + -it \ + --pull always \ + -p $LLAMA_STACK_PORT:$LLAMA_STACK_PORT \ + -v ./run.yaml:/root/my-run.yaml \ + llamastack/distribution-nvidia \ + --config /root/my-run.yaml \ + --port $LLAMA_STACK_PORT \ + --env NVIDIA_API_KEY=$NVIDIA_API_KEY +``` + +### Via venv + +If you've set up your local development environment, you can also build the image using your local virtual environment. + +```bash +INFERENCE_MODEL=meta-llama/Llama-3.1-8B-Instruct +llama stack build --distro nvidia --image-type venv +llama stack run ./run.yaml \ + --port 8321 \ + --env NVIDIA_API_KEY=$NVIDIA_API_KEY \ + --env INFERENCE_MODEL=$INFERENCE_MODEL +``` + +## Example Notebooks +For examples of how to use the NVIDIA Distribution to run inference, fine-tune, evaluate, and run safety checks on your LLMs, you can reference the example notebooks in [docs/notebooks/nvidia](https://github.com/meta-llama/llama-stack/tree/main/docs/notebooks/nvidia). diff --git a/docs/source/providers/agents/index.md b/docs/docs/providers/agents/index.mdx similarity index 50% rename from docs/source/providers/agents/index.md rename to docs/docs/providers/agents/index.mdx index a2c48d4b9..df020f284 100644 --- a/docs/source/providers/agents/index.md +++ b/docs/docs/providers/agents/index.mdx @@ -1,3 +1,16 @@ +--- +description: "Agents API for creating and interacting with agentic systems. + + Main functionalities provided by this API: + - Create agents with specific instructions and ability to use tools. + - Interactions with agents are grouped into sessions (\"threads\"), and each interaction is called a \"turn\". + - Agents can be provided with various tools (see the ToolGroups and ToolRuntime APIs for more details). + - Agents can be provided with various shields (see the Safety API for more details). + - Agents can also use Memory to retrieve information from knowledge bases. See the RAG Tool and Vector IO APIs for more details." +sidebar_label: Agents +title: Agents +--- + # Agents ## Overview @@ -15,8 +28,4 @@ This section contains documentation for all available providers for the **agents ## Providers -```{toctree} -:maxdepth: 1 - -inline_meta-reference -``` +- [Meta-Reference](./inline_meta-reference) diff --git a/docs/source/providers/agents/inline_meta-reference.md b/docs/docs/providers/agents/inline_meta-reference.mdx similarity index 80% rename from docs/source/providers/agents/inline_meta-reference.md rename to docs/docs/providers/agents/inline_meta-reference.mdx index 5f64f79e1..fd961745f 100644 --- a/docs/source/providers/agents/inline_meta-reference.md +++ b/docs/docs/providers/agents/inline_meta-reference.mdx @@ -1,3 +1,9 @@ +--- +description: "Meta's reference implementation of an agent system that can use tools, access vector databases, and perform complex reasoning tasks." +sidebar_label: Meta-Reference +title: inline::meta-reference +--- + # inline::meta-reference ## Description @@ -20,6 +26,4 @@ persistence_store: responses_store: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/responses_store.db - ``` - diff --git a/docs/source/providers/batches/index.md b/docs/docs/providers/batches/index.mdx similarity index 51% rename from docs/source/providers/batches/index.md rename to docs/docs/providers/batches/index.mdx index d6d2fa9a3..a966cc153 100644 --- a/docs/source/providers/batches/index.md +++ b/docs/docs/providers/batches/index.mdx @@ -1,3 +1,18 @@ +--- +description: "The Batches API enables efficient processing of multiple requests in a single operation, + particularly useful for processing large datasets, batch evaluation workflows, and + cost-effective inference at scale. + + The API is designed to allow use of openai client libraries for seamless integration. + + This API provides the following extensions: + - idempotent batch creation + + Note: This API is currently under active development and may undergo changes." +sidebar_label: Batches +title: Batches +--- + # Batches ## Overview @@ -17,8 +32,4 @@ This section contains documentation for all available providers for the **batche ## Providers -```{toctree} -:maxdepth: 1 - -inline_reference -``` +- [Reference](./inline_reference) diff --git a/docs/source/providers/batches/inline_reference.md b/docs/docs/providers/batches/inline_reference.mdx similarity index 86% rename from docs/source/providers/batches/inline_reference.md rename to docs/docs/providers/batches/inline_reference.mdx index a58e5124d..f43800555 100644 --- a/docs/source/providers/batches/inline_reference.md +++ b/docs/docs/providers/batches/inline_reference.mdx @@ -1,3 +1,9 @@ +--- +description: "Reference implementation of batches API with KVStore persistence." +sidebar_label: Reference +title: inline::reference +--- + # inline::reference ## Description @@ -18,6 +24,4 @@ Reference implementation of batches API with KVStore persistence. kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/batches.db - ``` - diff --git a/docs/docs/providers/datasetio/index.md b/docs/docs/providers/datasetio/index.md new file mode 100644 index 000000000..6c02acf6c --- /dev/null +++ b/docs/docs/providers/datasetio/index.md @@ -0,0 +1,16 @@ +--- +sidebar_label: Datasetio +title: Datasetio +--- + +# Datasetio + +## Overview + +This section contains documentation for all available providers for the **datasetio** API. + +## Providers + +- [Localfs](./inline_localfs) +- [Remote - Huggingface](./remote_huggingface) +- [Remote - Nvidia](./remote_nvidia) diff --git a/docs/docs/providers/datasetio/index.mdx b/docs/docs/providers/datasetio/index.mdx new file mode 100644 index 000000000..6c02acf6c --- /dev/null +++ b/docs/docs/providers/datasetio/index.mdx @@ -0,0 +1,16 @@ +--- +sidebar_label: Datasetio +title: Datasetio +--- + +# Datasetio + +## Overview + +This section contains documentation for all available providers for the **datasetio** API. + +## Providers + +- [Localfs](./inline_localfs) +- [Remote - Huggingface](./remote_huggingface) +- [Remote - Nvidia](./remote_nvidia) diff --git a/docs/source/providers/datasetio/inline_localfs.md b/docs/docs/providers/datasetio/inline_localfs.mdx similarity index 78% rename from docs/source/providers/datasetio/inline_localfs.md rename to docs/docs/providers/datasetio/inline_localfs.mdx index 87a0c795c..b02a3a3bd 100644 --- a/docs/source/providers/datasetio/inline_localfs.md +++ b/docs/docs/providers/datasetio/inline_localfs.mdx @@ -1,3 +1,9 @@ +--- +description: "Local filesystem-based dataset I/O provider for reading and writing datasets to local storage." +sidebar_label: Localfs +title: inline::localfs +--- + # inline::localfs ## Description @@ -16,6 +22,4 @@ Local filesystem-based dataset I/O provider for reading and writing datasets to kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/localfs_datasetio.db - ``` - diff --git a/docs/source/providers/datasetio/remote_huggingface.md b/docs/docs/providers/datasetio/remote_huggingface.mdx similarity index 77% rename from docs/source/providers/datasetio/remote_huggingface.md rename to docs/docs/providers/datasetio/remote_huggingface.mdx index 3711f7396..82597d999 100644 --- a/docs/source/providers/datasetio/remote_huggingface.md +++ b/docs/docs/providers/datasetio/remote_huggingface.mdx @@ -1,3 +1,9 @@ +--- +description: "HuggingFace datasets provider for accessing and managing datasets from the HuggingFace Hub." +sidebar_label: Remote - Huggingface +title: remote::huggingface +--- + # remote::huggingface ## Description @@ -16,6 +22,4 @@ HuggingFace datasets provider for accessing and managing datasets from the Huggi kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/huggingface_datasetio.db - ``` - diff --git a/docs/source/providers/datasetio/remote_nvidia.md b/docs/docs/providers/datasetio/remote_nvidia.mdx similarity index 83% rename from docs/source/providers/datasetio/remote_nvidia.md rename to docs/docs/providers/datasetio/remote_nvidia.mdx index 1ad1cdb32..35a7dacee 100644 --- a/docs/source/providers/datasetio/remote_nvidia.md +++ b/docs/docs/providers/datasetio/remote_nvidia.mdx @@ -1,3 +1,9 @@ +--- +description: "NVIDIA's dataset I/O provider for accessing datasets from NVIDIA's data platform." +sidebar_label: Remote - Nvidia +title: remote::nvidia +--- + # remote::nvidia ## Description @@ -20,6 +26,4 @@ api_key: ${env.NVIDIA_API_KEY:=} dataset_namespace: ${env.NVIDIA_DATASET_NAMESPACE:=default} project_id: ${env.NVIDIA_PROJECT_ID:=test-project} datasets_url: ${env.NVIDIA_DATASETS_URL:=http://nemo.test} - ``` - diff --git a/docs/docs/providers/eval/index.mdx b/docs/docs/providers/eval/index.mdx new file mode 100644 index 000000000..e486814de --- /dev/null +++ b/docs/docs/providers/eval/index.mdx @@ -0,0 +1,18 @@ +--- +description: "Llama Stack Evaluation API for running evaluations on model and agent candidates." +sidebar_label: Eval +title: Eval +--- + +# Eval + +## Overview + +Llama Stack Evaluation API for running evaluations on model and agent candidates. + +This section contains documentation for all available providers for the **eval** API. + +## Providers + +- [Meta-Reference](./inline_meta-reference) +- [Remote - Nvidia](./remote_nvidia) diff --git a/docs/source/providers/eval/inline_meta-reference.md b/docs/docs/providers/eval/inline_meta-reference.mdx similarity index 76% rename from docs/source/providers/eval/inline_meta-reference.md rename to docs/docs/providers/eval/inline_meta-reference.mdx index 606883c72..b0eb589e0 100644 --- a/docs/source/providers/eval/inline_meta-reference.md +++ b/docs/docs/providers/eval/inline_meta-reference.mdx @@ -1,3 +1,9 @@ +--- +description: "Meta's reference implementation of evaluation tasks with support for multiple languages and evaluation metrics." +sidebar_label: Meta-Reference +title: inline::meta-reference +--- + # inline::meta-reference ## Description @@ -16,6 +22,4 @@ Meta's reference implementation of evaluation tasks with support for multiple la kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/meta_reference_eval.db - ``` - diff --git a/docs/source/providers/eval/remote_nvidia.md b/docs/docs/providers/eval/remote_nvidia.mdx similarity index 74% rename from docs/source/providers/eval/remote_nvidia.md rename to docs/docs/providers/eval/remote_nvidia.mdx index cb764b511..36bb4726b 100644 --- a/docs/source/providers/eval/remote_nvidia.md +++ b/docs/docs/providers/eval/remote_nvidia.mdx @@ -1,3 +1,9 @@ +--- +description: "NVIDIA's evaluation provider for running evaluation tasks on NVIDIA's platform." +sidebar_label: Remote - Nvidia +title: remote::nvidia +--- + # remote::nvidia ## Description @@ -14,6 +20,4 @@ NVIDIA's evaluation provider for running evaluation tasks on NVIDIA's platform. ```yaml evaluator_url: ${env.NVIDIA_EVALUATOR_URL:=http://localhost:7331} - ``` - diff --git a/docs/source/providers/external/external-providers-guide.md b/docs/docs/providers/external/external-providers-guide.mdx similarity index 99% rename from docs/source/providers/external/external-providers-guide.md rename to docs/docs/providers/external/external-providers-guide.mdx index e2d4ebea9..eb30afd93 100644 --- a/docs/source/providers/external/external-providers-guide.md +++ b/docs/docs/providers/external/external-providers-guide.mdx @@ -283,4 +283,4 @@ additional_pip_packages: No other steps are required other than `llama stack build` and `llama stack run`. The build process will use `module` to install all of the provider dependencies, retrieve the spec, etc. -The provider will now be available in Llama Stack with the type `remote::ramalama`. \ No newline at end of file +The provider will now be available in Llama Stack with the type `remote::ramalama`. diff --git a/docs/source/providers/external/external-providers-list.md b/docs/docs/providers/external/external-providers-list.mdx similarity index 100% rename from docs/source/providers/external/external-providers-list.md rename to docs/docs/providers/external/external-providers-list.mdx diff --git a/docs/source/providers/external/index.md b/docs/docs/providers/external/index.mdx similarity index 68% rename from docs/source/providers/external/index.md rename to docs/docs/providers/external/index.mdx index 989a7f5b8..375a97c82 100644 --- a/docs/source/providers/external/index.md +++ b/docs/docs/providers/external/index.mdx @@ -5,9 +5,7 @@ Llama Stack supports external providers that live outside of the main codebase. - Share providers with others without contributing to the main codebase - Keep provider-specific code separate from the core Llama Stack code -```{toctree} -:maxdepth: 1 +## External Provider Documentation -external-providers-list -external-providers-guide -``` \ No newline at end of file +- [Known External Providers](external-providers-list) +- [Creating External Providers](external-providers-guide) diff --git a/docs/source/providers/files/index.md b/docs/docs/providers/files/index.mdx similarity index 55% rename from docs/source/providers/files/index.md rename to docs/docs/providers/files/index.mdx index 128953223..98bd89633 100644 --- a/docs/source/providers/files/index.md +++ b/docs/docs/providers/files/index.mdx @@ -1,3 +1,8 @@ +--- +sidebar_label: Files +title: Files +--- + # Files ## Overview @@ -6,9 +11,5 @@ This section contains documentation for all available providers for the **files* ## Providers -```{toctree} -:maxdepth: 1 - -inline_localfs -remote_s3 -``` +- [Localfs](./inline_localfs) +- [Remote - S3](./remote_s3) diff --git a/docs/source/providers/files/inline_localfs.md b/docs/docs/providers/files/inline_localfs.mdx similarity index 82% rename from docs/source/providers/files/inline_localfs.md rename to docs/docs/providers/files/inline_localfs.mdx index 09267b7d8..86d141f93 100644 --- a/docs/source/providers/files/inline_localfs.md +++ b/docs/docs/providers/files/inline_localfs.mdx @@ -1,3 +1,9 @@ +--- +description: "Local filesystem-based file storage provider for managing files and documents locally." +sidebar_label: Localfs +title: inline::localfs +--- + # inline::localfs ## Description @@ -19,6 +25,4 @@ storage_dir: ${env.FILES_STORAGE_DIR:=~/.llama/dummy/files} metadata_store: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/files_metadata.db - ``` - diff --git a/docs/source/providers/files/remote_s3.md b/docs/docs/providers/files/remote_s3.mdx similarity index 89% rename from docs/source/providers/files/remote_s3.md rename to docs/docs/providers/files/remote_s3.mdx index 2e3cebabd..353cedbfb 100644 --- a/docs/source/providers/files/remote_s3.md +++ b/docs/docs/providers/files/remote_s3.mdx @@ -1,3 +1,9 @@ +--- +description: "AWS S3-based file storage provider for scalable cloud file management with metadata persistence." +sidebar_label: Remote - S3 +title: remote::s3 +--- + # remote::s3 ## Description @@ -28,6 +34,4 @@ auto_create_bucket: ${env.S3_AUTO_CREATE_BUCKET:=false} metadata_store: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/s3_files_metadata.db - ``` - diff --git a/docs/source/providers/index.md b/docs/docs/providers/index.mdx similarity index 57% rename from docs/source/providers/index.md rename to docs/docs/providers/index.mdx index 3f66ecd0c..d275ac1a3 100644 --- a/docs/source/providers/index.md +++ b/docs/docs/providers/index.mdx @@ -1,3 +1,10 @@ +--- +title: API Providers +description: Ecosystem of providers for swapping implementations across the same API +sidebar_label: Overview +sidebar_position: 1 +--- + # API Providers The goal of Llama Stack is to build an ecosystem where users can easily swap out different implementations for the same API. Examples for these include: @@ -12,17 +19,15 @@ Providers come in two flavors: Importantly, Llama Stack always strives to provide at least one fully inline provider for each API so you can iterate on a fully featured environment locally. -```{toctree} -:maxdepth: 1 +## Provider Categories -external/index -openai -inference/index -agents/index -datasetio/index -safety/index -telemetry/index -vector_io/index -tool_runtime/index -files/index -``` +- **[External Providers](./external/)** - Guide for building and using external providers +- **[OpenAI Compatibility](./openai)** - OpenAI API compatibility layer +- **[Inference](./inference/)** - LLM and embedding model providers +- **[Agents](./agents/)** - Agentic system providers +- **[DatasetIO](./datasetio/)** - Dataset and data loader providers +- **[Safety](./safety/)** - Content moderation and safety providers +- **[Telemetry](./telemetry/)** - Monitoring and observability providers +- **[Vector IO](./vector-io/)** - Vector database providers +- **[Tool Runtime](./tool-runtime/)** - Tool and protocol providers +- **[Files](./files/)** - File system and storage providers diff --git a/docs/docs/providers/inference/index.mdx b/docs/docs/providers/inference/index.mdx new file mode 100644 index 000000000..a9365c5f2 --- /dev/null +++ b/docs/docs/providers/inference/index.mdx @@ -0,0 +1,48 @@ +--- +description: "Llama Stack Inference API for generating completions, chat completions, and embeddings. + + This API provides the raw interface to the underlying models. Two kinds of models are supported: + - LLM models: these models generate \"raw\" and \"chat\" (conversational) completions. + - Embedding models: these models generate embeddings to be used for semantic search." +sidebar_label: Inference +title: Inference +--- + +# Inference + +## Overview + +Llama Stack Inference API for generating completions, chat completions, and embeddings. + + This API provides the raw interface to the underlying models. Two kinds of models are supported: + - LLM models: these models generate "raw" and "chat" (conversational) completions. + - Embedding models: these models generate embeddings to be used for semantic search. + +This section contains documentation for all available providers for the **inference** API. + +## Providers + +- [Meta-Reference](./inline_meta-reference) +- [Sentence-Transformers](./inline_sentence-transformers) +- [Remote - Anthropic](./remote_anthropic) +- [Remote - Azure](./remote_azure) +- [Remote - Bedrock](./remote_bedrock) +- [Remote - Cerebras](./remote_cerebras) +- [Remote - Databricks](./remote_databricks) +- [Remote - Fireworks](./remote_fireworks) +- [Remote - Gemini](./remote_gemini) +- [Remote - Groq](./remote_groq) +- [Remote - Hf - Endpoint](./remote_hf_endpoint) +- [Remote - Hf - Serverless](./remote_hf_serverless) +- [Remote - Llama-Openai-Compat](./remote_llama-openai-compat) +- [Remote - Nvidia](./remote_nvidia) +- [Remote - Ollama](./remote_ollama) +- [Remote - Openai](./remote_openai) +- [Remote - Passthrough](./remote_passthrough) +- [Remote - Runpod](./remote_runpod) +- [Remote - Sambanova](./remote_sambanova) +- [Remote - Tgi](./remote_tgi) +- [Remote - Together](./remote_together) +- [Remote - Vertexai](./remote_vertexai) +- [Remote - Vllm](./remote_vllm) +- [Remote - Watsonx](./remote_watsonx) diff --git a/docs/source/providers/inference/inline_meta-reference.md b/docs/docs/providers/inference/inline_meta-reference.mdx similarity index 84% rename from docs/source/providers/inference/inline_meta-reference.md rename to docs/docs/providers/inference/inline_meta-reference.mdx index eca12a839..328586f9a 100644 --- a/docs/source/providers/inference/inline_meta-reference.md +++ b/docs/docs/providers/inference/inline_meta-reference.mdx @@ -1,3 +1,9 @@ +--- +description: "Meta's reference implementation of inference with support for various model formats and optimization techniques." +sidebar_label: Meta-Reference +title: inline::meta-reference +--- + # inline::meta-reference ## Description @@ -27,6 +33,4 @@ quantization: model_parallel_size: ${env.MODEL_PARALLEL_SIZE:=0} max_batch_size: ${env.MAX_BATCH_SIZE:=1} max_seq_len: ${env.MAX_SEQ_LEN:=4096} - ``` - diff --git a/docs/docs/providers/inference/inline_sentence-transformers.mdx b/docs/docs/providers/inference/inline_sentence-transformers.mdx new file mode 100644 index 000000000..0e207bbdb --- /dev/null +++ b/docs/docs/providers/inference/inline_sentence-transformers.mdx @@ -0,0 +1,17 @@ +--- +description: "Sentence Transformers inference provider for text embeddings and similarity search." +sidebar_label: Sentence-Transformers +title: inline::sentence-transformers +--- + +# inline::sentence-transformers + +## Description + +Sentence Transformers inference provider for text embeddings and similarity search. + +## Sample Configuration + +```yaml +{} +``` diff --git a/docs/source/providers/inference/remote_anthropic.md b/docs/docs/providers/inference/remote_anthropic.mdx similarity index 69% rename from docs/source/providers/inference/remote_anthropic.md rename to docs/docs/providers/inference/remote_anthropic.mdx index 4680608b1..6bd636c92 100644 --- a/docs/source/providers/inference/remote_anthropic.md +++ b/docs/docs/providers/inference/remote_anthropic.mdx @@ -1,3 +1,9 @@ +--- +description: "Anthropic inference provider for accessing Claude models and Anthropic's AI services." +sidebar_label: Remote - Anthropic +title: remote::anthropic +--- + # remote::anthropic ## Description @@ -14,6 +20,4 @@ Anthropic inference provider for accessing Claude models and Anthropic's AI serv ```yaml api_key: ${env.ANTHROPIC_API_KEY:=} - ``` - diff --git a/docs/source/providers/inference/remote_azure.md b/docs/docs/providers/inference/remote_azure.mdx similarity index 78% rename from docs/source/providers/inference/remote_azure.md rename to docs/docs/providers/inference/remote_azure.mdx index 19f8f418b..0eb0ea755 100644 --- a/docs/source/providers/inference/remote_azure.md +++ b/docs/docs/providers/inference/remote_azure.mdx @@ -1,3 +1,12 @@ +--- +description: | + Azure OpenAI inference provider for accessing GPT models and other Azure services. + Provider documentation + https://learn.microsoft.com/en-us/azure/ai-foundry/openai/overview +sidebar_label: Remote - Azure +title: remote::azure +--- + # remote::azure ## Description @@ -24,6 +33,4 @@ api_key: ${env.AZURE_API_KEY:=} api_base: ${env.AZURE_API_BASE:=} api_version: ${env.AZURE_API_VERSION:=} api_type: ${env.AZURE_API_TYPE:=} - ``` - diff --git a/docs/source/providers/inference/remote_bedrock.md b/docs/docs/providers/inference/remote_bedrock.mdx similarity index 91% rename from docs/source/providers/inference/remote_bedrock.md rename to docs/docs/providers/inference/remote_bedrock.mdx index 216dd4adb..04c2154a9 100644 --- a/docs/source/providers/inference/remote_bedrock.md +++ b/docs/docs/providers/inference/remote_bedrock.mdx @@ -1,3 +1,9 @@ +--- +description: "AWS Bedrock inference provider for accessing various AI models through AWS's managed service." +sidebar_label: Remote - Bedrock +title: remote::bedrock +--- + # remote::bedrock ## Description @@ -23,6 +29,4 @@ AWS Bedrock inference provider for accessing various AI models through AWS's man ```yaml {} - ``` - diff --git a/docs/source/providers/inference/remote_cerebras.md b/docs/docs/providers/inference/remote_cerebras.mdx similarity index 76% rename from docs/source/providers/inference/remote_cerebras.md rename to docs/docs/providers/inference/remote_cerebras.mdx index 3bd3dda25..d9cc93aef 100644 --- a/docs/source/providers/inference/remote_cerebras.md +++ b/docs/docs/providers/inference/remote_cerebras.mdx @@ -1,3 +1,9 @@ +--- +description: "Cerebras inference provider for running models on Cerebras Cloud platform." +sidebar_label: Remote - Cerebras +title: remote::cerebras +--- + # remote::cerebras ## Description @@ -16,6 +22,4 @@ Cerebras inference provider for running models on Cerebras Cloud platform. ```yaml base_url: https://api.cerebras.ai api_key: ${env.CEREBRAS_API_KEY:=} - ``` - diff --git a/docs/source/providers/inference/remote_databricks.md b/docs/docs/providers/inference/remote_databricks.mdx similarity index 75% rename from docs/source/providers/inference/remote_databricks.md rename to docs/docs/providers/inference/remote_databricks.mdx index 3b418f7d4..7f736db9d 100644 --- a/docs/source/providers/inference/remote_databricks.md +++ b/docs/docs/providers/inference/remote_databricks.mdx @@ -1,3 +1,9 @@ +--- +description: "Databricks inference provider for running models on Databricks' unified analytics platform." +sidebar_label: Remote - Databricks +title: remote::databricks +--- + # remote::databricks ## Description @@ -16,6 +22,4 @@ Databricks inference provider for running models on Databricks' unified analytic ```yaml url: ${env.DATABRICKS_HOST:=} api_token: ${env.DATABRICKS_TOKEN:=} - ``` - diff --git a/docs/source/providers/inference/remote_fireworks.md b/docs/docs/providers/inference/remote_fireworks.mdx similarity index 80% rename from docs/source/providers/inference/remote_fireworks.md rename to docs/docs/providers/inference/remote_fireworks.mdx index 28dbf1d3f..d2c3a664e 100644 --- a/docs/source/providers/inference/remote_fireworks.md +++ b/docs/docs/providers/inference/remote_fireworks.mdx @@ -1,3 +1,9 @@ +--- +description: "Fireworks AI inference provider for Llama models and other AI models on the Fireworks platform." +sidebar_label: Remote - Fireworks +title: remote::fireworks +--- + # remote::fireworks ## Description @@ -17,6 +23,4 @@ Fireworks AI inference provider for Llama models and other AI models on the Fire ```yaml url: https://api.fireworks.ai/inference/v1 api_key: ${env.FIREWORKS_API_KEY:=} - ``` - diff --git a/docs/source/providers/inference/remote_gemini.md b/docs/docs/providers/inference/remote_gemini.mdx similarity index 70% rename from docs/source/providers/inference/remote_gemini.md rename to docs/docs/providers/inference/remote_gemini.mdx index 14b3223f2..0505c69da 100644 --- a/docs/source/providers/inference/remote_gemini.md +++ b/docs/docs/providers/inference/remote_gemini.mdx @@ -1,3 +1,9 @@ +--- +description: "Google Gemini inference provider for accessing Gemini models and Google's AI services." +sidebar_label: Remote - Gemini +title: remote::gemini +--- + # remote::gemini ## Description @@ -14,6 +20,4 @@ Google Gemini inference provider for accessing Gemini models and Google's AI ser ```yaml api_key: ${env.GEMINI_API_KEY:=} - ``` - diff --git a/docs/source/providers/inference/remote_groq.md b/docs/docs/providers/inference/remote_groq.mdx similarity index 76% rename from docs/source/providers/inference/remote_groq.md rename to docs/docs/providers/inference/remote_groq.mdx index 68bd4d5b3..1797035c1 100644 --- a/docs/source/providers/inference/remote_groq.md +++ b/docs/docs/providers/inference/remote_groq.mdx @@ -1,3 +1,9 @@ +--- +description: "Groq inference provider for ultra-fast inference using Groq's LPU technology." +sidebar_label: Remote - Groq +title: remote::groq +--- + # remote::groq ## Description @@ -16,6 +22,4 @@ Groq inference provider for ultra-fast inference using Groq's LPU technology. ```yaml url: https://api.groq.com api_key: ${env.GROQ_API_KEY:=} - ``` - diff --git a/docs/source/providers/inference/remote_hf_endpoint.md b/docs/docs/providers/inference/remote_hf_endpoint.mdx similarity index 59% rename from docs/source/providers/inference/remote_hf_endpoint.md rename to docs/docs/providers/inference/remote_hf_endpoint.mdx index 8aaf13476..771b24f8d 100644 --- a/docs/source/providers/inference/remote_hf_endpoint.md +++ b/docs/docs/providers/inference/remote_hf_endpoint.mdx @@ -1,3 +1,9 @@ +--- +description: "HuggingFace Inference Endpoints provider for dedicated model serving." +sidebar_label: Remote - Hf - Endpoint +title: remote::hf::endpoint +--- + # remote::hf::endpoint ## Description @@ -8,7 +14,7 @@ HuggingFace Inference Endpoints provider for dedicated model serving. | Field | Type | Required | Default | Description | |-------|------|----------|---------|-------------| -| `endpoint_name` | `` | No | | The name of the Hugging Face Inference Endpoint in the format of '{namespace}/{endpoint_name}' (e.g. 'my-cool-org/meta-llama-3-1-8b-instruct-rce'). Namespace is optional and will default to the user account if not provided. | +| `endpoint_name` | `` | No | | The name of the Hugging Face Inference Endpoint in the format of '{namespace}/{endpoint_name}' (e.g. 'my-cool-org/meta-llama-3-1-8b-instruct-rce'). Namespace is optional and will default to the user account if not provided. | | `api_token` | `pydantic.types.SecretStr \| None` | No | | Your Hugging Face user access token (will default to locally saved token if not provided) | ## Sample Configuration @@ -16,6 +22,4 @@ HuggingFace Inference Endpoints provider for dedicated model serving. ```yaml endpoint_name: ${env.INFERENCE_ENDPOINT_NAME} api_token: ${env.HF_API_TOKEN} - ``` - diff --git a/docs/source/providers/inference/remote_hf_serverless.md b/docs/docs/providers/inference/remote_hf_serverless.mdx similarity index 79% rename from docs/source/providers/inference/remote_hf_serverless.md rename to docs/docs/providers/inference/remote_hf_serverless.mdx index 6764590b8..1a89b8e3e 100644 --- a/docs/source/providers/inference/remote_hf_serverless.md +++ b/docs/docs/providers/inference/remote_hf_serverless.mdx @@ -1,3 +1,9 @@ +--- +description: "HuggingFace Inference API serverless provider for on-demand model inference." +sidebar_label: Remote - Hf - Serverless +title: remote::hf::serverless +--- + # remote::hf::serverless ## Description @@ -16,6 +22,4 @@ HuggingFace Inference API serverless provider for on-demand model inference. ```yaml huggingface_repo: ${env.INFERENCE_MODEL} api_token: ${env.HF_API_TOKEN} - ``` - diff --git a/docs/source/providers/inference/remote_llama-openai-compat.md b/docs/docs/providers/inference/remote_llama-openai-compat.mdx similarity index 75% rename from docs/source/providers/inference/remote_llama-openai-compat.md rename to docs/docs/providers/inference/remote_llama-openai-compat.mdx index 5c97aebc3..cb624ad87 100644 --- a/docs/source/providers/inference/remote_llama-openai-compat.md +++ b/docs/docs/providers/inference/remote_llama-openai-compat.mdx @@ -1,3 +1,9 @@ +--- +description: "Llama OpenAI-compatible provider for using Llama models with OpenAI API format." +sidebar_label: Remote - Llama-Openai-Compat +title: remote::llama-openai-compat +--- + # remote::llama-openai-compat ## Description @@ -16,6 +22,4 @@ Llama OpenAI-compatible provider for using Llama models with OpenAI API format. ```yaml openai_compat_api_base: https://api.llama.com/compat/v1/ api_key: ${env.LLAMA_API_KEY} - ``` - diff --git a/docs/source/providers/inference/remote_nvidia.md b/docs/docs/providers/inference/remote_nvidia.mdx similarity index 85% rename from docs/source/providers/inference/remote_nvidia.md rename to docs/docs/providers/inference/remote_nvidia.mdx index 1b12839df..4a8be5d03 100644 --- a/docs/source/providers/inference/remote_nvidia.md +++ b/docs/docs/providers/inference/remote_nvidia.mdx @@ -1,3 +1,9 @@ +--- +description: "NVIDIA inference provider for accessing NVIDIA NIM models and AI services." +sidebar_label: Remote - Nvidia +title: remote::nvidia +--- + # remote::nvidia ## Description @@ -19,6 +25,4 @@ NVIDIA inference provider for accessing NVIDIA NIM models and AI services. url: ${env.NVIDIA_BASE_URL:=https://integrate.api.nvidia.com} api_key: ${env.NVIDIA_API_KEY:=} append_api_version: ${env.NVIDIA_APPEND_API_VERSION:=True} - ``` - diff --git a/docs/source/providers/inference/remote_ollama.md b/docs/docs/providers/inference/remote_ollama.mdx similarity index 75% rename from docs/source/providers/inference/remote_ollama.md rename to docs/docs/providers/inference/remote_ollama.mdx index f9f0a7622..5d9a4ad6c 100644 --- a/docs/source/providers/inference/remote_ollama.md +++ b/docs/docs/providers/inference/remote_ollama.mdx @@ -1,3 +1,9 @@ +--- +description: "Ollama inference provider for running local models through the Ollama runtime." +sidebar_label: Remote - Ollama +title: remote::ollama +--- + # remote::ollama ## Description @@ -15,6 +21,4 @@ Ollama inference provider for running local models through the Ollama runtime. ```yaml url: ${env.OLLAMA_URL:=http://localhost:11434} - ``` - diff --git a/docs/source/providers/inference/remote_openai.md b/docs/docs/providers/inference/remote_openai.mdx similarity index 77% rename from docs/source/providers/inference/remote_openai.md rename to docs/docs/providers/inference/remote_openai.mdx index 18a74caea..56ca94233 100644 --- a/docs/source/providers/inference/remote_openai.md +++ b/docs/docs/providers/inference/remote_openai.mdx @@ -1,3 +1,9 @@ +--- +description: "OpenAI inference provider for accessing GPT models and other OpenAI services." +sidebar_label: Remote - Openai +title: remote::openai +--- + # remote::openai ## Description @@ -16,6 +22,4 @@ OpenAI inference provider for accessing GPT models and other OpenAI services. ```yaml api_key: ${env.OPENAI_API_KEY:=} base_url: ${env.OPENAI_BASE_URL:=https://api.openai.com/v1} - ``` - diff --git a/docs/source/providers/inference/remote_passthrough.md b/docs/docs/providers/inference/remote_passthrough.mdx similarity index 74% rename from docs/source/providers/inference/remote_passthrough.md rename to docs/docs/providers/inference/remote_passthrough.mdx index 9005e5339..972cc2a08 100644 --- a/docs/source/providers/inference/remote_passthrough.md +++ b/docs/docs/providers/inference/remote_passthrough.mdx @@ -1,3 +1,9 @@ +--- +description: "Passthrough inference provider for connecting to any external inference service not directly supported." +sidebar_label: Remote - Passthrough +title: remote::passthrough +--- + # remote::passthrough ## Description @@ -16,6 +22,4 @@ Passthrough inference provider for connecting to any external inference service ```yaml url: ${env.PASSTHROUGH_URL} api_key: ${env.PASSTHROUGH_API_KEY} - ``` - diff --git a/docs/source/providers/inference/remote_runpod.md b/docs/docs/providers/inference/remote_runpod.mdx similarity index 75% rename from docs/source/providers/inference/remote_runpod.md rename to docs/docs/providers/inference/remote_runpod.mdx index ff1c0bcb6..2e8847dc5 100644 --- a/docs/source/providers/inference/remote_runpod.md +++ b/docs/docs/providers/inference/remote_runpod.mdx @@ -1,3 +1,9 @@ +--- +description: "RunPod inference provider for running models on RunPod's cloud GPU platform." +sidebar_label: Remote - Runpod +title: remote::runpod +--- + # remote::runpod ## Description @@ -16,6 +22,4 @@ RunPod inference provider for running models on RunPod's cloud GPU platform. ```yaml url: ${env.RUNPOD_URL:=} api_token: ${env.RUNPOD_API_TOKEN} - ``` - diff --git a/docs/source/providers/inference/remote_sambanova-openai-compat.md b/docs/docs/providers/inference/remote_sambanova-openai-compat.mdx similarity index 99% rename from docs/source/providers/inference/remote_sambanova-openai-compat.md rename to docs/docs/providers/inference/remote_sambanova-openai-compat.mdx index 3074a5885..9b4716d7e 100644 --- a/docs/source/providers/inference/remote_sambanova-openai-compat.md +++ b/docs/docs/providers/inference/remote_sambanova-openai-compat.mdx @@ -18,4 +18,3 @@ openai_compat_api_base: https://api.sambanova.ai/v1 api_key: ${env.SAMBANOVA_API_KEY:=} ``` - diff --git a/docs/source/providers/inference/remote_sambanova.md b/docs/docs/providers/inference/remote_sambanova.mdx similarity index 76% rename from docs/source/providers/inference/remote_sambanova.md rename to docs/docs/providers/inference/remote_sambanova.mdx index 9d15c97d5..6ee28b400 100644 --- a/docs/source/providers/inference/remote_sambanova.md +++ b/docs/docs/providers/inference/remote_sambanova.mdx @@ -1,3 +1,9 @@ +--- +description: "SambaNova inference provider for running models on SambaNova's dataflow architecture." +sidebar_label: Remote - Sambanova +title: remote::sambanova +--- + # remote::sambanova ## Description @@ -16,6 +22,4 @@ SambaNova inference provider for running models on SambaNova's dataflow architec ```yaml url: https://api.sambanova.ai/v1 api_key: ${env.SAMBANOVA_API_KEY:=} - ``` - diff --git a/docs/source/providers/inference/remote_tgi.md b/docs/docs/providers/inference/remote_tgi.mdx similarity index 71% rename from docs/source/providers/inference/remote_tgi.md rename to docs/docs/providers/inference/remote_tgi.mdx index 104bb4aab..3a348056f 100644 --- a/docs/source/providers/inference/remote_tgi.md +++ b/docs/docs/providers/inference/remote_tgi.mdx @@ -1,3 +1,9 @@ +--- +description: "Text Generation Inference (TGI) provider for HuggingFace model serving." +sidebar_label: Remote - Tgi +title: remote::tgi +--- + # remote::tgi ## Description @@ -14,6 +20,4 @@ Text Generation Inference (TGI) provider for HuggingFace model serving. ```yaml url: ${env.TGI_URL:=} - ``` - diff --git a/docs/source/providers/inference/remote_together.md b/docs/docs/providers/inference/remote_together.mdx similarity index 80% rename from docs/source/providers/inference/remote_together.md rename to docs/docs/providers/inference/remote_together.mdx index be764e635..da232a45b 100644 --- a/docs/source/providers/inference/remote_together.md +++ b/docs/docs/providers/inference/remote_together.mdx @@ -1,3 +1,9 @@ +--- +description: "Together AI inference provider for open-source models and collaborative AI development." +sidebar_label: Remote - Together +title: remote::together +--- + # remote::together ## Description @@ -17,6 +23,4 @@ Together AI inference provider for open-source models and collaborative AI devel ```yaml url: https://api.together.xyz/v1 api_key: ${env.TOGETHER_API_KEY:=} - ``` - diff --git a/docs/source/providers/inference/remote_vertexai.md b/docs/docs/providers/inference/remote_vertexai.mdx similarity index 56% rename from docs/source/providers/inference/remote_vertexai.md rename to docs/docs/providers/inference/remote_vertexai.mdx index 962bbd76f..13a910d43 100644 --- a/docs/source/providers/inference/remote_vertexai.md +++ b/docs/docs/providers/inference/remote_vertexai.mdx @@ -1,3 +1,29 @@ +--- +description: | + Google Vertex AI inference provider enables you to use Google's Gemini models through Google Cloud's Vertex AI platform, providing several advantages: + + • Enterprise-grade security: Uses Google Cloud's security controls and IAM + • Better integration: Seamless integration with other Google Cloud services + • Advanced features: Access to additional Vertex AI features like model tuning and monitoring + • Authentication: Uses Google Cloud Application Default Credentials (ADC) instead of API keys + + Configuration: + - Set VERTEX_AI_PROJECT environment variable (required) + - Set VERTEX_AI_LOCATION environment variable (optional, defaults to us-central1) + - Use Google Cloud Application Default Credentials or service account key + + Authentication Setup: + Option 1 (Recommended): gcloud auth application-default login + Option 2: Set GOOGLE_APPLICATION_CREDENTIALS to service account key path + + Available Models: + - vertex_ai/gemini-2.0-flash + - vertex_ai/gemini-2.5-flash + - vertex_ai/gemini-2.5-pro +sidebar_label: Remote - Vertexai +title: remote::vertexai +--- + # remote::vertexai ## Description @@ -35,6 +61,4 @@ Available Models: ```yaml project: ${env.VERTEX_AI_PROJECT:=} location: ${env.VERTEX_AI_LOCATION:=us-central1} - ``` - diff --git a/docs/source/providers/inference/remote_vllm.md b/docs/docs/providers/inference/remote_vllm.mdx similarity index 86% rename from docs/source/providers/inference/remote_vllm.md rename to docs/docs/providers/inference/remote_vllm.mdx index 172d35873..77b8e1355 100644 --- a/docs/source/providers/inference/remote_vllm.md +++ b/docs/docs/providers/inference/remote_vllm.mdx @@ -1,3 +1,9 @@ +--- +description: "Remote vLLM inference provider for connecting to vLLM servers." +sidebar_label: Remote - Vllm +title: remote::vllm +--- + # remote::vllm ## Description @@ -21,6 +27,4 @@ url: ${env.VLLM_URL:=} max_tokens: ${env.VLLM_MAX_TOKENS:=4096} api_token: ${env.VLLM_API_TOKEN:=fake} tls_verify: ${env.VLLM_TLS_VERIFY:=true} - ``` - diff --git a/docs/source/providers/inference/remote_watsonx.md b/docs/docs/providers/inference/remote_watsonx.mdx similarity index 82% rename from docs/source/providers/inference/remote_watsonx.md rename to docs/docs/providers/inference/remote_watsonx.mdx index e885a07fc..1ceccc3ed 100644 --- a/docs/source/providers/inference/remote_watsonx.md +++ b/docs/docs/providers/inference/remote_watsonx.mdx @@ -1,3 +1,9 @@ +--- +description: "IBM WatsonX inference provider for accessing AI models on IBM's WatsonX platform." +sidebar_label: Remote - Watsonx +title: remote::watsonx +--- + # remote::watsonx ## Description @@ -19,6 +25,4 @@ IBM WatsonX inference provider for accessing AI models on IBM's WatsonX platform url: ${env.WATSONX_BASE_URL:=https://us-south.ml.cloud.ibm.com} api_key: ${env.WATSONX_API_KEY:=} project_id: ${env.WATSONX_PROJECT_ID:=} - ``` - diff --git a/docs/source/providers/openai.md b/docs/docs/providers/openai.mdx similarity index 90% rename from docs/source/providers/openai.md rename to docs/docs/providers/openai.mdx index 44a615456..1a907152f 100644 --- a/docs/source/providers/openai.md +++ b/docs/docs/providers/openai.mdx @@ -42,9 +42,7 @@ models = client.models.list() #### Responses -:::{note} -The Responses API implementation is still in active development. While it is quite usable, there are still unimplemented parts of the API. We'd love feedback on any use-cases you try that do not work to help prioritize the pieces left to implement. Please open issues in the [meta-llama/llama-stack](https://github.com/meta-llama/llama-stack) GitHub repository with details of anything that does not work. -::: +> **Note:** The Responses API implementation is still in active development. While it is quite usable, there are still unimplemented parts of the API. We'd love feedback on any use-cases you try that do not work to help prioritize the pieces left to implement. Please open issues in the [meta-llama/llama-stack](https://github.com/meta-llama/llama-stack) GitHub repository with details of anything that does not work. ##### Simple inference diff --git a/docs/docs/providers/post_training/index.mdx b/docs/docs/providers/post_training/index.mdx new file mode 100644 index 000000000..6faab7a05 --- /dev/null +++ b/docs/docs/providers/post_training/index.mdx @@ -0,0 +1,17 @@ +--- +sidebar_label: Post Training +title: Post_Training +--- + +# Post_Training + +## Overview + +This section contains documentation for all available providers for the **post_training** API. + +## Providers + +- [Huggingface-Gpu](./inline_huggingface-gpu) +- [Torchtune-Cpu](./inline_torchtune-cpu) +- [Torchtune-Gpu](./inline_torchtune-gpu) +- [Remote - Nvidia](./remote_nvidia) diff --git a/docs/source/providers/post_training/inline_huggingface-cpu.md b/docs/docs/providers/post_training/inline_huggingface-cpu.mdx similarity index 99% rename from docs/source/providers/post_training/inline_huggingface-cpu.md rename to docs/docs/providers/post_training/inline_huggingface-cpu.mdx index e663fe8f8..9b5f2a091 100644 --- a/docs/source/providers/post_training/inline_huggingface-cpu.md +++ b/docs/docs/providers/post_training/inline_huggingface-cpu.mdx @@ -38,4 +38,3 @@ device: cpu dpo_output_dir: ~/.llama/dummy/dpo_output ``` - diff --git a/docs/source/providers/post_training/inline_huggingface-gpu.md b/docs/docs/providers/post_training/inline_huggingface-gpu.mdx similarity index 74% rename from docs/source/providers/post_training/inline_huggingface-gpu.md rename to docs/docs/providers/post_training/inline_huggingface-gpu.mdx index 21bf965fe..530ac5c4d 100644 --- a/docs/source/providers/post_training/inline_huggingface-gpu.md +++ b/docs/docs/providers/post_training/inline_huggingface-gpu.mdx @@ -1,3 +1,9 @@ +--- +description: "HuggingFace-based post-training provider for fine-tuning models using the HuggingFace ecosystem." +sidebar_label: Huggingface-Gpu +title: inline::huggingface-gpu +--- + # inline::huggingface-gpu ## Description @@ -11,11 +17,8 @@ HuggingFace-based post-training provider for fine-tuning models using the Huggin | `device` | `` | No | cuda | | | `distributed_backend` | `Literal['fsdp', 'deepspeed'` | No | | | | `checkpoint_format` | `Literal['full_state', 'huggingface'` | No | huggingface | | -| `chat_template` | `` | No | <|user|> -{input} -<|assistant|> -{output} | | -| `model_specific_config` | `` | No | {'trust_remote_code': True, 'attn_implementation': 'sdpa'} | | +| `chat_template` | `` | No | <|user|><br/>{input}<br/><|assistant|><br/>{output} | | +| `model_specific_config` | `` | No | {'trust_remote_code': True, 'attn_implementation': 'sdpa'} | | | `max_seq_length` | `` | No | 2048 | | | `gradient_checkpointing` | `` | No | False | | | `save_total_limit` | `` | No | 3 | | @@ -36,6 +39,4 @@ checkpoint_format: huggingface distributed_backend: null device: cpu dpo_output_dir: ~/.llama/dummy/dpo_output - ``` - diff --git a/docs/source/providers/post_training/inline_huggingface.md b/docs/docs/providers/post_training/inline_huggingface.mdx similarity index 99% rename from docs/source/providers/post_training/inline_huggingface.md rename to docs/docs/providers/post_training/inline_huggingface.mdx index 8b10fe79c..37c113c6f 100644 --- a/docs/source/providers/post_training/inline_huggingface.md +++ b/docs/docs/providers/post_training/inline_huggingface.mdx @@ -38,4 +38,3 @@ device: cpu dpo_output_dir: ~/.llama/dummy/dpo_output ``` - diff --git a/docs/source/providers/post_training/inline_torchtune-cpu.md b/docs/docs/providers/post_training/inline_torchtune-cpu.mdx similarity index 70% rename from docs/source/providers/post_training/inline_torchtune-cpu.md rename to docs/docs/providers/post_training/inline_torchtune-cpu.mdx index 7204e56e8..f789392fc 100644 --- a/docs/source/providers/post_training/inline_torchtune-cpu.md +++ b/docs/docs/providers/post_training/inline_torchtune-cpu.mdx @@ -1,3 +1,9 @@ +--- +description: "TorchTune-based post-training provider for fine-tuning and optimizing models using Meta's TorchTune framework." +sidebar_label: Torchtune-Cpu +title: inline::torchtune-cpu +--- + # inline::torchtune-cpu ## Description @@ -15,6 +21,4 @@ TorchTune-based post-training provider for fine-tuning and optimizing models usi ```yaml checkpoint_format: meta - ``` - diff --git a/docs/source/providers/post_training/inline_torchtune-gpu.md b/docs/docs/providers/post_training/inline_torchtune-gpu.mdx similarity index 70% rename from docs/source/providers/post_training/inline_torchtune-gpu.md rename to docs/docs/providers/post_training/inline_torchtune-gpu.mdx index 98b94f6f6..bd87797af 100644 --- a/docs/source/providers/post_training/inline_torchtune-gpu.md +++ b/docs/docs/providers/post_training/inline_torchtune-gpu.mdx @@ -1,3 +1,9 @@ +--- +description: "TorchTune-based post-training provider for fine-tuning and optimizing models using Meta's TorchTune framework." +sidebar_label: Torchtune-Gpu +title: inline::torchtune-gpu +--- + # inline::torchtune-gpu ## Description @@ -15,6 +21,4 @@ TorchTune-based post-training provider for fine-tuning and optimizing models usi ```yaml checkpoint_format: meta - ``` - diff --git a/docs/source/providers/post_training/inline_torchtune.md b/docs/docs/providers/post_training/inline_torchtune.md similarity index 100% rename from docs/source/providers/post_training/inline_torchtune.md rename to docs/docs/providers/post_training/inline_torchtune.md diff --git a/docs/source/providers/post_training/remote_nvidia.md b/docs/docs/providers/post_training/remote_nvidia.mdx similarity index 87% rename from docs/source/providers/post_training/remote_nvidia.md rename to docs/docs/providers/post_training/remote_nvidia.mdx index 9a381d872..448ac4c75 100644 --- a/docs/source/providers/post_training/remote_nvidia.md +++ b/docs/docs/providers/post_training/remote_nvidia.mdx @@ -1,3 +1,9 @@ +--- +description: "NVIDIA's post-training provider for fine-tuning models on NVIDIA's platform." +sidebar_label: Remote - Nvidia +title: remote::nvidia +--- + # remote::nvidia ## Description @@ -23,6 +29,4 @@ api_key: ${env.NVIDIA_API_KEY:=} dataset_namespace: ${env.NVIDIA_DATASET_NAMESPACE:=default} project_id: ${env.NVIDIA_PROJECT_ID:=test-project} customizer_url: ${env.NVIDIA_CUSTOMIZER_URL:=http://nemo.test} - ``` - diff --git a/docs/docs/providers/safety/index.mdx b/docs/docs/providers/safety/index.mdx new file mode 100644 index 000000000..591b92b8d --- /dev/null +++ b/docs/docs/providers/safety/index.mdx @@ -0,0 +1,19 @@ +--- +sidebar_label: Safety +title: Safety +--- + +# Safety + +## Overview + +This section contains documentation for all available providers for the **safety** API. + +## Providers + +- [Code-Scanner](./inline_code-scanner) +- [Llama-Guard](./inline_llama-guard) +- [Prompt-Guard](./inline_prompt-guard) +- [Remote - Bedrock](./remote_bedrock) +- [Remote - Nvidia](./remote_nvidia) +- [Remote - Sambanova](./remote_sambanova) diff --git a/docs/source/providers/safety/inline_code-scanner.md b/docs/docs/providers/safety/inline_code-scanner.mdx similarity index 50% rename from docs/source/providers/safety/inline_code-scanner.md rename to docs/docs/providers/safety/inline_code-scanner.mdx index 3a3e90b3d..3fc3c38a4 100644 --- a/docs/source/providers/safety/inline_code-scanner.md +++ b/docs/docs/providers/safety/inline_code-scanner.mdx @@ -1,3 +1,9 @@ +--- +description: "Code Scanner safety provider for detecting security vulnerabilities and unsafe code patterns." +sidebar_label: Code-Scanner +title: inline::code-scanner +--- + # inline::code-scanner ## Description @@ -8,6 +14,4 @@ Code Scanner safety provider for detecting security vulnerabilities and unsafe c ```yaml {} - ``` - diff --git a/docs/source/providers/safety/inline_llama-guard.md b/docs/docs/providers/safety/inline_llama-guard.mdx similarity index 67% rename from docs/source/providers/safety/inline_llama-guard.md rename to docs/docs/providers/safety/inline_llama-guard.mdx index 4f57898ec..65866c9b2 100644 --- a/docs/source/providers/safety/inline_llama-guard.md +++ b/docs/docs/providers/safety/inline_llama-guard.mdx @@ -1,3 +1,9 @@ +--- +description: "Llama Guard safety provider for content moderation and safety filtering using Meta's Llama Guard model." +sidebar_label: Llama-Guard +title: inline::llama-guard +--- + # inline::llama-guard ## Description @@ -14,6 +20,4 @@ Llama Guard safety provider for content moderation and safety filtering using Me ```yaml excluded_categories: [] - ``` - diff --git a/docs/source/providers/safety/inline_prompt-guard.md b/docs/docs/providers/safety/inline_prompt-guard.mdx similarity index 68% rename from docs/source/providers/safety/inline_prompt-guard.md rename to docs/docs/providers/safety/inline_prompt-guard.mdx index 10a6b8d3f..c52e03e4b 100644 --- a/docs/source/providers/safety/inline_prompt-guard.md +++ b/docs/docs/providers/safety/inline_prompt-guard.mdx @@ -1,3 +1,9 @@ +--- +description: "Prompt Guard safety provider for detecting and filtering unsafe prompts and content." +sidebar_label: Prompt-Guard +title: inline::prompt-guard +--- + # inline::prompt-guard ## Description @@ -14,6 +20,4 @@ Prompt Guard safety provider for detecting and filtering unsafe prompts and cont ```yaml guard_type: injection - ``` - diff --git a/docs/source/providers/safety/remote_bedrock.md b/docs/docs/providers/safety/remote_bedrock.mdx similarity index 92% rename from docs/source/providers/safety/remote_bedrock.md rename to docs/docs/providers/safety/remote_bedrock.mdx index 99d77dd72..5461d7cdc 100644 --- a/docs/source/providers/safety/remote_bedrock.md +++ b/docs/docs/providers/safety/remote_bedrock.mdx @@ -1,3 +1,9 @@ +--- +description: "AWS Bedrock safety provider for content moderation using AWS's safety services." +sidebar_label: Remote - Bedrock +title: remote::bedrock +--- + # remote::bedrock ## Description @@ -23,6 +29,4 @@ AWS Bedrock safety provider for content moderation using AWS's safety services. ```yaml {} - ``` - diff --git a/docs/source/providers/safety/remote_nvidia.md b/docs/docs/providers/safety/remote_nvidia.mdx similarity index 81% rename from docs/source/providers/safety/remote_nvidia.md rename to docs/docs/providers/safety/remote_nvidia.mdx index 40ae744a4..0f665e60a 100644 --- a/docs/source/providers/safety/remote_nvidia.md +++ b/docs/docs/providers/safety/remote_nvidia.mdx @@ -1,3 +1,9 @@ +--- +description: "NVIDIA's safety provider for content moderation and safety filtering." +sidebar_label: Remote - Nvidia +title: remote::nvidia +--- + # remote::nvidia ## Description @@ -16,6 +22,4 @@ NVIDIA's safety provider for content moderation and safety filtering. ```yaml guardrails_service_url: ${env.GUARDRAILS_SERVICE_URL:=http://localhost:7331} config_id: ${env.NVIDIA_GUARDRAILS_CONFIG_ID:=self-check} - ``` - diff --git a/docs/source/providers/safety/remote_sambanova.md b/docs/docs/providers/safety/remote_sambanova.mdx similarity index 77% rename from docs/source/providers/safety/remote_sambanova.md rename to docs/docs/providers/safety/remote_sambanova.mdx index 7e608f1b7..da70fce6c 100644 --- a/docs/source/providers/safety/remote_sambanova.md +++ b/docs/docs/providers/safety/remote_sambanova.mdx @@ -1,3 +1,9 @@ +--- +description: "SambaNova's safety provider for content moderation and safety filtering." +sidebar_label: Remote - Sambanova +title: remote::sambanova +--- + # remote::sambanova ## Description @@ -16,6 +22,4 @@ SambaNova's safety provider for content moderation and safety filtering. ```yaml url: https://api.sambanova.ai/v1 api_key: ${env.SAMBANOVA_API_KEY:=} - ``` - diff --git a/docs/docs/providers/scoring/index.mdx b/docs/docs/providers/scoring/index.mdx new file mode 100644 index 000000000..cb9bc539b --- /dev/null +++ b/docs/docs/providers/scoring/index.mdx @@ -0,0 +1,16 @@ +--- +sidebar_label: Scoring +title: Scoring +--- + +# Scoring + +## Overview + +This section contains documentation for all available providers for the **scoring** API. + +## Providers + +- [Basic](./inline_basic) +- [Braintrust](./inline_braintrust) +- [Llm-As-Judge](./inline_llm-as-judge) diff --git a/docs/source/providers/scoring/inline_basic.md b/docs/docs/providers/scoring/inline_basic.mdx similarity index 51% rename from docs/source/providers/scoring/inline_basic.md rename to docs/docs/providers/scoring/inline_basic.mdx index e9e50cff4..cbafbc40c 100644 --- a/docs/source/providers/scoring/inline_basic.md +++ b/docs/docs/providers/scoring/inline_basic.mdx @@ -1,3 +1,9 @@ +--- +description: "Basic scoring provider for simple evaluation metrics and scoring functions." +sidebar_label: Basic +title: inline::basic +--- + # inline::basic ## Description @@ -8,6 +14,4 @@ Basic scoring provider for simple evaluation metrics and scoring functions. ```yaml {} - ``` - diff --git a/docs/source/providers/scoring/inline_braintrust.md b/docs/docs/providers/scoring/inline_braintrust.mdx similarity index 70% rename from docs/source/providers/scoring/inline_braintrust.md rename to docs/docs/providers/scoring/inline_braintrust.mdx index 70a6a1e26..d12f9de25 100644 --- a/docs/source/providers/scoring/inline_braintrust.md +++ b/docs/docs/providers/scoring/inline_braintrust.mdx @@ -1,3 +1,9 @@ +--- +description: "Braintrust scoring provider for evaluation and scoring using the Braintrust platform." +sidebar_label: Braintrust +title: inline::braintrust +--- + # inline::braintrust ## Description @@ -14,6 +20,4 @@ Braintrust scoring provider for evaluation and scoring using the Braintrust plat ```yaml openai_api_key: ${env.OPENAI_API_KEY:=} - ``` - diff --git a/docs/source/providers/scoring/inline_llm-as-judge.md b/docs/docs/providers/scoring/inline_llm-as-judge.mdx similarity index 50% rename from docs/source/providers/scoring/inline_llm-as-judge.md rename to docs/docs/providers/scoring/inline_llm-as-judge.mdx index 971e02897..22f326623 100644 --- a/docs/source/providers/scoring/inline_llm-as-judge.md +++ b/docs/docs/providers/scoring/inline_llm-as-judge.mdx @@ -1,3 +1,9 @@ +--- +description: "LLM-as-judge scoring provider that uses language models to evaluate and score responses." +sidebar_label: Llm-As-Judge +title: inline::llm-as-judge +--- + # inline::llm-as-judge ## Description @@ -8,6 +14,4 @@ LLM-as-judge scoring provider that uses language models to evaluate and score re ```yaml {} - ``` - diff --git a/docs/source/providers/telemetry/index.md b/docs/docs/providers/telemetry/index.mdx similarity index 58% rename from docs/source/providers/telemetry/index.md rename to docs/docs/providers/telemetry/index.mdx index c7fbfed73..a13481e13 100644 --- a/docs/source/providers/telemetry/index.md +++ b/docs/docs/providers/telemetry/index.mdx @@ -1,3 +1,8 @@ +--- +sidebar_label: Telemetry +title: Telemetry +--- + # Telemetry ## Overview @@ -6,8 +11,4 @@ This section contains documentation for all available providers for the **teleme ## Providers -```{toctree} -:maxdepth: 1 - -inline_meta-reference -``` +- [Meta-Reference](./inline_meta-reference) diff --git a/docs/source/providers/telemetry/inline_meta-reference.md b/docs/docs/providers/telemetry/inline_meta-reference.mdx similarity index 73% rename from docs/source/providers/telemetry/inline_meta-reference.md rename to docs/docs/providers/telemetry/inline_meta-reference.mdx index 3e5f4b842..13fab87f3 100644 --- a/docs/source/providers/telemetry/inline_meta-reference.md +++ b/docs/docs/providers/telemetry/inline_meta-reference.mdx @@ -1,3 +1,9 @@ +--- +description: "Meta's reference implementation of telemetry and observability using OpenTelemetry." +sidebar_label: Meta-Reference +title: inline::meta-reference +--- + # inline::meta-reference ## Description @@ -10,7 +16,7 @@ Meta's reference implementation of telemetry and observability using OpenTelemet |-------|------|----------|---------|-------------| | `otel_exporter_otlp_endpoint` | `str \| None` | No | | The OpenTelemetry collector endpoint URL (base URL for traces, metrics, and logs). If not set, the SDK will use OTEL_EXPORTER_OTLP_ENDPOINT environment variable. | | `service_name` | `` | No | ​ | The service name to use for telemetry | -| `sinks` | `list[inline.telemetry.meta_reference.config.TelemetrySink` | No | [, ] | List of telemetry sinks to enable (possible values: otel_trace, otel_metric, sqlite, console) | +| `sinks` | `list[inline.telemetry.meta_reference.config.TelemetrySink` | No | [<TelemetrySink.CONSOLE: 'console'>, <TelemetrySink.SQLITE: 'sqlite'>] | List of telemetry sinks to enable (possible values: otel_trace, otel_metric, sqlite, console) | | `sqlite_db_path` | `` | No | ~/.llama/runtime/trace_store.db | The path to the SQLite database to use for storing traces | ## Sample Configuration @@ -20,6 +26,4 @@ service_name: "${env.OTEL_SERVICE_NAME:=\u200B}" sinks: ${env.TELEMETRY_SINKS:=console,sqlite} sqlite_db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/trace_store.db otel_exporter_otlp_endpoint: ${env.OTEL_EXPORTER_OTLP_ENDPOINT:=} - ``` - diff --git a/docs/docs/providers/tool_runtime/index.mdx b/docs/docs/providers/tool_runtime/index.mdx new file mode 100644 index 000000000..051a8c436 --- /dev/null +++ b/docs/docs/providers/tool_runtime/index.mdx @@ -0,0 +1,19 @@ +--- +sidebar_label: Tool Runtime +title: Tool_Runtime +--- + +# Tool_Runtime + +## Overview + +This section contains documentation for all available providers for the **tool_runtime** API. + +## Providers + +- [Rag-Runtime](./inline_rag-runtime) +- [Remote - Bing-Search](./remote_bing-search) +- [Remote - Brave-Search](./remote_brave-search) +- [Remote - Model-Context-Protocol](./remote_model-context-protocol) +- [Remote - Tavily-Search](./remote_tavily-search) +- [Remote - Wolfram-Alpha](./remote_wolfram-alpha) diff --git a/docs/source/providers/tool_runtime/inline_rag-runtime.md b/docs/docs/providers/tool_runtime/inline_rag-runtime.mdx similarity index 50% rename from docs/source/providers/tool_runtime/inline_rag-runtime.md rename to docs/docs/providers/tool_runtime/inline_rag-runtime.mdx index 784b4fdad..97428c2e3 100644 --- a/docs/source/providers/tool_runtime/inline_rag-runtime.md +++ b/docs/docs/providers/tool_runtime/inline_rag-runtime.mdx @@ -1,3 +1,9 @@ +--- +description: "RAG (Retrieval-Augmented Generation) tool runtime for document ingestion, chunking, and semantic search." +sidebar_label: Rag-Runtime +title: inline::rag-runtime +--- + # inline::rag-runtime ## Description @@ -8,6 +14,4 @@ RAG (Retrieval-Augmented Generation) tool runtime for document ingestion, chunki ```yaml {} - ``` - diff --git a/docs/source/providers/tool_runtime/remote_bing-search.md b/docs/docs/providers/tool_runtime/remote_bing-search.mdx similarity index 70% rename from docs/source/providers/tool_runtime/remote_bing-search.md rename to docs/docs/providers/tool_runtime/remote_bing-search.mdx index 0d5df7679..ec06bc20f 100644 --- a/docs/source/providers/tool_runtime/remote_bing-search.md +++ b/docs/docs/providers/tool_runtime/remote_bing-search.mdx @@ -1,3 +1,9 @@ +--- +description: "Bing Search tool for web search capabilities using Microsoft's search engine." +sidebar_label: Remote - Bing-Search +title: remote::bing-search +--- + # remote::bing-search ## Description @@ -15,6 +21,4 @@ Bing Search tool for web search capabilities using Microsoft's search engine. ```yaml api_key: ${env.BING_API_KEY:} - ``` - diff --git a/docs/source/providers/tool_runtime/remote_brave-search.md b/docs/docs/providers/tool_runtime/remote_brave-search.mdx similarity index 74% rename from docs/source/providers/tool_runtime/remote_brave-search.md rename to docs/docs/providers/tool_runtime/remote_brave-search.mdx index 26bc4010d..3aeed67d5 100644 --- a/docs/source/providers/tool_runtime/remote_brave-search.md +++ b/docs/docs/providers/tool_runtime/remote_brave-search.mdx @@ -1,3 +1,9 @@ +--- +description: "Brave Search tool for web search capabilities with privacy-focused results." +sidebar_label: Remote - Brave-Search +title: remote::brave-search +--- + # remote::brave-search ## Description @@ -16,6 +22,4 @@ Brave Search tool for web search capabilities with privacy-focused results. ```yaml api_key: ${env.BRAVE_SEARCH_API_KEY:=} max_results: 3 - ``` - diff --git a/docs/docs/providers/tool_runtime/remote_model-context-protocol.mdx b/docs/docs/providers/tool_runtime/remote_model-context-protocol.mdx new file mode 100644 index 000000000..869ca275a --- /dev/null +++ b/docs/docs/providers/tool_runtime/remote_model-context-protocol.mdx @@ -0,0 +1,17 @@ +--- +description: "Model Context Protocol (MCP) tool for standardized tool calling and context management." +sidebar_label: Remote - Model-Context-Protocol +title: remote::model-context-protocol +--- + +# remote::model-context-protocol + +## Description + +Model Context Protocol (MCP) tool for standardized tool calling and context management. + +## Sample Configuration + +```yaml +{} +``` diff --git a/docs/source/providers/tool_runtime/remote_tavily-search.md b/docs/docs/providers/tool_runtime/remote_tavily-search.mdx similarity index 74% rename from docs/source/providers/tool_runtime/remote_tavily-search.md rename to docs/docs/providers/tool_runtime/remote_tavily-search.mdx index 3dc31534d..fdca31bbe 100644 --- a/docs/source/providers/tool_runtime/remote_tavily-search.md +++ b/docs/docs/providers/tool_runtime/remote_tavily-search.mdx @@ -1,3 +1,9 @@ +--- +description: "Tavily Search tool for AI-optimized web search with structured results." +sidebar_label: Remote - Tavily-Search +title: remote::tavily-search +--- + # remote::tavily-search ## Description @@ -16,6 +22,4 @@ Tavily Search tool for AI-optimized web search with structured results. ```yaml api_key: ${env.TAVILY_SEARCH_API_KEY:=} max_results: 3 - ``` - diff --git a/docs/source/providers/tool_runtime/remote_wolfram-alpha.md b/docs/docs/providers/tool_runtime/remote_wolfram-alpha.mdx similarity index 68% rename from docs/source/providers/tool_runtime/remote_wolfram-alpha.md rename to docs/docs/providers/tool_runtime/remote_wolfram-alpha.mdx index 325c189fd..96bc41789 100644 --- a/docs/source/providers/tool_runtime/remote_wolfram-alpha.md +++ b/docs/docs/providers/tool_runtime/remote_wolfram-alpha.mdx @@ -1,3 +1,9 @@ +--- +description: "Wolfram Alpha tool for computational knowledge and mathematical calculations." +sidebar_label: Remote - Wolfram-Alpha +title: remote::wolfram-alpha +--- + # remote::wolfram-alpha ## Description @@ -14,6 +20,4 @@ Wolfram Alpha tool for computational knowledge and mathematical calculations. ```yaml api_key: ${env.WOLFRAM_ALPHA_API_KEY:=} - ``` - diff --git a/docs/docs/providers/vector_io/index.mdx b/docs/docs/providers/vector_io/index.mdx new file mode 100644 index 000000000..58dca2d13 --- /dev/null +++ b/docs/docs/providers/vector_io/index.mdx @@ -0,0 +1,25 @@ +--- +sidebar_label: Vector Io +title: Vector_Io +--- + +# Vector_Io + +## Overview + +This section contains documentation for all available providers for the **vector_io** API. + +## Providers + +- [Chromadb](./inline_chromadb) +- [Faiss](./inline_faiss) +- [Meta-Reference](./inline_meta-reference) +- [Milvus](./inline_milvus) +- [Qdrant](./inline_qdrant) +- [Sqlite-Vec](./inline_sqlite-vec) +- [Sqlite Vec](./inline_sqlite_vec) +- [Remote - Chromadb](./remote_chromadb) +- [Remote - Milvus](./remote_milvus) +- [Remote - Pgvector](./remote_pgvector) +- [Remote - Qdrant](./remote_qdrant) +- [Remote - Weaviate](./remote_weaviate) diff --git a/docs/source/providers/vector_io/inline_chromadb.md b/docs/docs/providers/vector_io/inline_chromadb.mdx similarity index 60% rename from docs/source/providers/vector_io/inline_chromadb.md rename to docs/docs/providers/vector_io/inline_chromadb.mdx index 518e3f689..a1858eacc 100644 --- a/docs/source/providers/vector_io/inline_chromadb.md +++ b/docs/docs/providers/vector_io/inline_chromadb.mdx @@ -1,3 +1,40 @@ +--- +description: | + [Chroma](https://www.trychroma.com/) is an inline and remote vector + database provider for Llama Stack. It allows you to store and query vectors directly within a Chroma database. + That means you're not limited to storing vectors in memory or in a separate service. + + ## Features + Chroma supports: + - Store embeddings and their metadata + - Vector search + - Full-text search + - Document storage + - Metadata filtering + - Multi-modal retrieval + + ## Usage + + To use Chrome in your Llama Stack project, follow these steps: + + 1. Install the necessary dependencies. + 2. Configure your Llama Stack project to use chroma. + 3. Start storing and querying vectors. + + ## Installation + + You can install chroma using pip: + + ```bash + pip install chromadb + ``` + + ## Documentation + See [Chroma's documentation](https://docs.trychroma.com/docs/overview/introduction) for more details about Chroma in general. +sidebar_label: Chromadb +title: inline::chromadb +--- + # inline::chromadb ## Description @@ -51,6 +88,4 @@ db_path: ${env.CHROMADB_PATH} kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/chroma_inline_registry.db - ``` - diff --git a/docs/source/providers/vector_io/inline_faiss.md b/docs/docs/providers/vector_io/inline_faiss.mdx similarity index 55% rename from docs/source/providers/vector_io/inline_faiss.md rename to docs/docs/providers/vector_io/inline_faiss.mdx index cfa18a839..03bc2a928 100644 --- a/docs/source/providers/vector_io/inline_faiss.md +++ b/docs/docs/providers/vector_io/inline_faiss.mdx @@ -1,3 +1,49 @@ +--- +description: | + [Faiss](https://github.com/facebookresearch/faiss) is an inline vector database provider for Llama Stack. It + allows you to store and query vectors directly in memory. + That means you'll get fast and efficient vector retrieval. + + ## Features + + - Lightweight and easy to use + - Fully integrated with Llama Stack + - GPU support + - **Vector search** - FAISS supports pure vector similarity search using embeddings + + ## Search Modes + + **Supported:** + - **Vector Search** (`mode="vector"`): Performs vector similarity search using embeddings + + **Not Supported:** + - **Keyword Search** (`mode="keyword"`): Not supported by FAISS + - **Hybrid Search** (`mode="hybrid"`): Not supported by FAISS + + > **Note**: FAISS is designed as a pure vector similarity search library. See the [FAISS GitHub repository](https://github.com/facebookresearch/faiss) for more details about FAISS's core functionality. + + ## Usage + + To use Faiss in your Llama Stack project, follow these steps: + + 1. Install the necessary dependencies. + 2. Configure your Llama Stack project to use Faiss. + 3. Start storing and querying vectors. + + ## Installation + + You can install Faiss using pip: + + ```bash + pip install faiss-cpu + ``` + ## Documentation + See [Faiss' documentation](https://faiss.ai/) or the [Faiss Wiki](https://github.com/facebookresearch/faiss/wiki) for + more details about Faiss in general. +sidebar_label: Faiss +title: inline::faiss +--- + # inline::faiss ## Description @@ -57,6 +103,4 @@ more details about Faiss in general. kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/faiss_store.db - ``` - diff --git a/docs/source/providers/vector_io/inline_meta-reference.md b/docs/docs/providers/vector_io/inline_meta-reference.mdx similarity index 80% rename from docs/source/providers/vector_io/inline_meta-reference.md rename to docs/docs/providers/vector_io/inline_meta-reference.mdx index 6f269c441..bcad86750 100644 --- a/docs/source/providers/vector_io/inline_meta-reference.md +++ b/docs/docs/providers/vector_io/inline_meta-reference.mdx @@ -1,3 +1,9 @@ +--- +description: "Meta's reference implementation of a vector database." +sidebar_label: Meta-Reference +title: inline::meta-reference +--- + # inline::meta-reference ## Description @@ -16,12 +22,9 @@ Meta's reference implementation of a vector database. kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/faiss_store.db - ``` - ## Deprecation Notice -```{warning} +:::warning Please use the `inline::faiss` provider instead. -``` - +::: diff --git a/docs/source/providers/vector_io/inline_milvus.md b/docs/docs/providers/vector_io/inline_milvus.mdx similarity index 87% rename from docs/source/providers/vector_io/inline_milvus.md rename to docs/docs/providers/vector_io/inline_milvus.mdx index 33ea4d179..7e6f15c81 100644 --- a/docs/source/providers/vector_io/inline_milvus.md +++ b/docs/docs/providers/vector_io/inline_milvus.mdx @@ -1,3 +1,9 @@ +--- +description: "Please refer to the remote provider documentation." +sidebar_label: Milvus +title: inline::milvus +--- + # inline::milvus ## Description @@ -21,6 +27,4 @@ db_path: ${env.MILVUS_DB_PATH:=~/.llama/dummy}/milvus.db kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/milvus_registry.db - ``` - diff --git a/docs/source/providers/vector_io/inline_qdrant.md b/docs/docs/providers/vector_io/inline_qdrant.mdx similarity index 56% rename from docs/source/providers/vector_io/inline_qdrant.md rename to docs/docs/providers/vector_io/inline_qdrant.mdx index b5072d220..5c9ab10f2 100644 --- a/docs/source/providers/vector_io/inline_qdrant.md +++ b/docs/docs/providers/vector_io/inline_qdrant.mdx @@ -1,3 +1,50 @@ +--- +description: | + [Qdrant](https://qdrant.tech/documentation/) is an inline and remote vector database provider for Llama Stack. It + allows you to store and query vectors directly in memory. + That means you'll get fast and efficient vector retrieval. + + > By default, Qdrant stores vectors in RAM, delivering incredibly fast access for datasets that fit comfortably in + > memory. But when your dataset exceeds RAM capacity, Qdrant offers Memmap as an alternative. + > + > \[[An Introduction to Vector Databases](https://qdrant.tech/articles/what-is-a-vector-database/)\] + + + + ## Features + + - Lightweight and easy to use + - Fully integrated with Llama Stack + - Apache 2.0 license terms + - Store embeddings and their metadata + - Supports search by + [Keyword](https://qdrant.tech/articles/qdrant-introduces-full-text-filters-and-indexes/) + and [Hybrid](https://qdrant.tech/articles/hybrid-search/#building-a-hybrid-search-system-in-qdrant) search + - [Multilingual and Multimodal retrieval](https://qdrant.tech/documentation/multimodal-search/) + - [Medatata filtering](https://qdrant.tech/articles/vector-search-filtering/) + - [GPU support](https://qdrant.tech/documentation/guides/running-with-gpu/) + + ## Usage + + To use Qdrant in your Llama Stack project, follow these steps: + + 1. Install the necessary dependencies. + 2. Configure your Llama Stack project to use Qdrant. + 3. Start storing and querying vectors. + + ## Installation + + You can install Qdrant using docker: + + ```bash + docker pull qdrant/qdrant + ``` + ## Documentation + See the [Qdrant documentation](https://qdrant.tech/documentation/) for more details about Qdrant in general. +sidebar_label: Qdrant +title: inline::qdrant +--- + # inline::qdrant ## Description @@ -60,6 +107,4 @@ path: ${env.QDRANT_PATH:=~/.llama/~/.llama/dummy}/qdrant.db kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/qdrant_registry.db - ``` - diff --git a/docs/source/providers/vector_io/inline_sqlite-vec.md b/docs/docs/providers/vector_io/inline_sqlite-vec.mdx similarity index 51% rename from docs/source/providers/vector_io/inline_sqlite-vec.md rename to docs/docs/providers/vector_io/inline_sqlite-vec.mdx index 854bb9d08..aa6992a56 100644 --- a/docs/source/providers/vector_io/inline_sqlite-vec.md +++ b/docs/docs/providers/vector_io/inline_sqlite-vec.mdx @@ -1,3 +1,205 @@ +--- +description: | + [SQLite-Vec](https://github.com/asg017/sqlite-vec) is an inline vector database provider for Llama Stack. It + allows you to store and query vectors directly within an SQLite database. + That means you're not limited to storing vectors in memory or in a separate service. + + ## Features + + - Lightweight and easy to use + - Fully integrated with Llama Stacks + - Uses disk-based storage for persistence, allowing for larger vector storage + + ### Comparison to Faiss + + The choice between Faiss and sqlite-vec should be made based on the needs of your application, + as they have different strengths. + + #### Choosing the Right Provider + + Scenario | Recommended Tool | Reason + -- |-----------------| -- + Online Analytical Processing (OLAP) | Faiss | Fast, in-memory searches + Online Transaction Processing (OLTP) | sqlite-vec | Frequent writes and reads + Frequent writes | sqlite-vec | Efficient disk-based storage and incremental indexing + Large datasets | sqlite-vec | Disk-based storage for larger vector storage + Datasets that can fit in memory, frequent reads | Faiss | Optimized for speed, indexing, and GPU acceleration + + #### Empirical Example + + Consider the histogram below in which 10,000 randomly generated strings were inserted + in batches of 100 into both Faiss and sqlite-vec using `client.tool_runtime.rag_tool.insert()`. + + ```{image} ../../../../_static/providers/vector_io/write_time_comparison_sqlite-vec-faiss.png + :alt: Comparison of SQLite-Vec and Faiss write times + :width: 400px + ``` + + You will notice that the average write time for `sqlite-vec` was 788ms, compared to + 47,640ms for Faiss. While the number is jarring, if you look at the distribution, you can see that it is rather + uniformly spread across the [1500, 100000] interval. + + Looking at each individual write in the order that the documents are inserted you'll see the increase in + write speed as Faiss reindexes the vectors after each write. + ```{image} ../../../../_static/providers/vector_io/write_time_sequence_sqlite-vec-faiss.png + :alt: Comparison of SQLite-Vec and Faiss write times + :width: 400px + ``` + + In comparison, the read times for Faiss was on average 10% faster than sqlite-vec. + The modes of the two distributions highlight the differences much further where Faiss + will likely yield faster read performance. + + ```{image} ../../../../_static/providers/vector_io/read_time_comparison_sqlite-vec-faiss.png + :alt: Comparison of SQLite-Vec and Faiss read times + :width: 400px + ``` + + ## Usage + + To use sqlite-vec in your Llama Stack project, follow these steps: + + 1. Install the necessary dependencies. + 2. Configure your Llama Stack project to use SQLite-Vec. + 3. Start storing and querying vectors. + + The SQLite-vec provider supports three search modes: + + 1. **Vector Search** (`mode="vector"`): Performs pure vector similarity search using the embeddings. + 2. **Keyword Search** (`mode="keyword"`): Performs full-text search using SQLite's FTS5. + 3. **Hybrid Search** (`mode="hybrid"`): Combines both vector and keyword search for better results. First performs keyword search to get candidate matches, then applies vector similarity search on those candidates. + + Example with hybrid search: + ```python + response = await vector_io.query_chunks( + vector_db_id="my_db", + query="your query here", + params={"mode": "hybrid", "max_chunks": 3, "score_threshold": 0.7}, + ) + + # Using RRF ranker + response = await vector_io.query_chunks( + vector_db_id="my_db", + query="your query here", + params={ + "mode": "hybrid", + "max_chunks": 3, + "score_threshold": 0.7, + "ranker": {"type": "rrf", "impact_factor": 60.0}, + }, + ) + + # Using weighted ranker + response = await vector_io.query_chunks( + vector_db_id="my_db", + query="your query here", + params={ + "mode": "hybrid", + "max_chunks": 3, + "score_threshold": 0.7, + "ranker": {"type": "weighted", "alpha": 0.7}, # 70% vector, 30% keyword + }, + ) + ``` + + Example with explicit vector search: + ```python + response = await vector_io.query_chunks( + vector_db_id="my_db", + query="your query here", + params={"mode": "vector", "max_chunks": 3, "score_threshold": 0.7}, + ) + ``` + + Example with keyword search: + ```python + response = await vector_io.query_chunks( + vector_db_id="my_db", + query="your query here", + params={"mode": "keyword", "max_chunks": 3, "score_threshold": 0.7}, + ) + ``` + + ## Supported Search Modes + + The SQLite vector store supports three search modes: + + 1. **Vector Search** (`mode="vector"`): Uses vector similarity to find relevant chunks + 2. **Keyword Search** (`mode="keyword"`): Uses keyword matching to find relevant chunks + 3. **Hybrid Search** (`mode="hybrid"`): Combines both vector and keyword scores using a ranker + + ### Hybrid Search + + Hybrid search combines the strengths of both vector and keyword search by: + - Computing vector similarity scores + - Computing keyword match scores + - Using a ranker to combine these scores + + Two ranker types are supported: + + 1. **RRF (Reciprocal Rank Fusion)**: + - Combines ranks from both vector and keyword results + - Uses an impact factor (default: 60.0) to control the weight of higher-ranked results + - Good for balancing between vector and keyword results + - The default impact factor of 60.0 comes from the original RRF paper by Cormack et al. (2009) [^1], which found this value to provide optimal performance across various retrieval tasks + + 2. **Weighted**: + - Linearly combines normalized vector and keyword scores + - Uses an alpha parameter (0-1) to control the blend: + - alpha=0: Only use keyword scores + - alpha=1: Only use vector scores + - alpha=0.5: Equal weight to both (default) + + Example using RAGQueryConfig with different search modes: + + ```python + from llama_stack.apis.tools import RAGQueryConfig, RRFRanker, WeightedRanker + + # Vector search + config = RAGQueryConfig(mode="vector", max_chunks=5) + + # Keyword search + config = RAGQueryConfig(mode="keyword", max_chunks=5) + + # Hybrid search with custom RRF ranker + config = RAGQueryConfig( + mode="hybrid", + max_chunks=5, + ranker=RRFRanker(impact_factor=50.0), # Custom impact factor + ) + + # Hybrid search with weighted ranker + config = RAGQueryConfig( + mode="hybrid", + max_chunks=5, + ranker=WeightedRanker(alpha=0.7), # 70% vector, 30% keyword + ) + + # Hybrid search with default RRF ranker + config = RAGQueryConfig( + mode="hybrid", max_chunks=5 + ) # Will use RRF with impact_factor=60.0 + ``` + + Note: The ranker configuration is only used in hybrid mode. For vector or keyword modes, the ranker parameter is ignored. + + ## Installation + + You can install SQLite-Vec using pip: + + ```bash + pip install sqlite-vec + ``` + + ## Documentation + + See [sqlite-vec's GitHub repo](https://github.com/asg017/sqlite-vec/tree/main) for more details about sqlite-vec in general. + + [^1]: Cormack, G. V., Clarke, C. L., & Buettcher, S. (2009). [Reciprocal rank fusion outperforms condorcet and individual rank learning methods](https://dl.acm.org/doi/10.1145/1571941.1572114). In Proceedings of the 32nd international ACM SIGIR conference on Research and development in information retrieval (pp. 758-759). +sidebar_label: Sqlite-Vec +title: inline::sqlite-vec +--- + # inline::sqlite-vec ## Description @@ -215,6 +417,4 @@ db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/sqlite_vec.db kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/sqlite_vec_registry.db - ``` - diff --git a/docs/source/providers/vector_io/inline_sqlite_vec.md b/docs/docs/providers/vector_io/inline_sqlite_vec.mdx similarity index 85% rename from docs/source/providers/vector_io/inline_sqlite_vec.md rename to docs/docs/providers/vector_io/inline_sqlite_vec.mdx index 9e5654a50..7f69f617d 100644 --- a/docs/source/providers/vector_io/inline_sqlite_vec.md +++ b/docs/docs/providers/vector_io/inline_sqlite_vec.mdx @@ -1,3 +1,9 @@ +--- +description: "Please refer to the sqlite-vec provider documentation." +sidebar_label: Sqlite Vec +title: inline::sqlite_vec +--- + # inline::sqlite_vec ## Description @@ -20,12 +26,9 @@ db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/sqlite_vec.db kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/sqlite_vec_registry.db - ``` - ## Deprecation Notice -```{warning} +:::warning Please use the `inline::sqlite-vec` provider (notice the hyphen instead of underscore) instead. -``` - +::: diff --git a/docs/source/providers/vector_io/remote_chromadb.md b/docs/docs/providers/vector_io/remote_chromadb.mdx similarity index 59% rename from docs/source/providers/vector_io/remote_chromadb.md rename to docs/docs/providers/vector_io/remote_chromadb.mdx index badfebe90..807771003 100644 --- a/docs/source/providers/vector_io/remote_chromadb.md +++ b/docs/docs/providers/vector_io/remote_chromadb.mdx @@ -1,3 +1,40 @@ +--- +description: | + [Chroma](https://www.trychroma.com/) is an inline and remote vector + database provider for Llama Stack. It allows you to store and query vectors directly within a Chroma database. + That means you're not limited to storing vectors in memory or in a separate service. + + ## Features + Chroma supports: + - Store embeddings and their metadata + - Vector search + - Full-text search + - Document storage + - Metadata filtering + - Multi-modal retrieval + + ## Usage + + To use Chrome in your Llama Stack project, follow these steps: + + 1. Install the necessary dependencies. + 2. Configure your Llama Stack project to use chroma. + 3. Start storing and querying vectors. + + ## Installation + + You can install chroma using pip: + + ```bash + pip install chromadb + ``` + + ## Documentation + See [Chroma's documentation](https://docs.trychroma.com/docs/overview/introduction) for more details about Chroma in general. +sidebar_label: Remote - Chromadb +title: remote::chromadb +--- + # remote::chromadb ## Description @@ -50,6 +87,4 @@ url: ${env.CHROMADB_URL} kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/chroma_remote_registry.db - ``` - diff --git a/docs/source/providers/vector_io/remote_milvus.md b/docs/docs/providers/vector_io/remote_milvus.mdx similarity index 50% rename from docs/source/providers/vector_io/remote_milvus.md rename to docs/docs/providers/vector_io/remote_milvus.mdx index 8974ada10..ae796837d 100644 --- a/docs/source/providers/vector_io/remote_milvus.md +++ b/docs/docs/providers/vector_io/remote_milvus.mdx @@ -1,3 +1,204 @@ +--- +description: | + [Milvus](https://milvus.io/) is an inline and remote vector database provider for Llama Stack. It + allows you to store and query vectors directly within a Milvus database. + That means you're not limited to storing vectors in memory or in a separate service. + + ## Features + + - Easy to use + - Fully integrated with Llama Stack + - Supports all search modes: vector, keyword, and hybrid search (both inline and remote configurations) + + ## Usage + + To use Milvus in your Llama Stack project, follow these steps: + + 1. Install the necessary dependencies. + 2. Configure your Llama Stack project to use Milvus. + 3. Start storing and querying vectors. + + ## Installation + + If you want to use inline Milvus, you can install: + + ```bash + pip install pymilvus[milvus-lite] + ``` + + If you want to use remote Milvus, you can install: + + ```bash + pip install pymilvus + ``` + + ## Configuration + + In Llama Stack, Milvus can be configured in two ways: + - **Inline (Local) Configuration** - Uses Milvus-Lite for local storage + - **Remote Configuration** - Connects to a remote Milvus server + + ### Inline (Local) Configuration + + The simplest method is local configuration, which requires setting `db_path`, a path for locally storing Milvus-Lite files: + + ```yaml + vector_io: + - provider_id: milvus + provider_type: inline::milvus + config: + db_path: ~/.llama/distributions/together/milvus_store.db + ``` + + ### Remote Configuration + + Remote configuration is suitable for larger data storage requirements: + + #### Standard Remote Connection + + ```yaml + vector_io: + - provider_id: milvus + provider_type: remote::milvus + config: + uri: "http://:" + token: ":" + ``` + + #### TLS-Enabled Remote Connection (One-way TLS) + + For connections to Milvus instances with one-way TLS enabled: + + ```yaml + vector_io: + - provider_id: milvus + provider_type: remote::milvus + config: + uri: "https://:" + token: ":" + secure: True + server_pem_path: "/path/to/server.pem" + ``` + + #### Mutual TLS (mTLS) Remote Connection + + For connections to Milvus instances with mutual TLS (mTLS) enabled: + + ```yaml + vector_io: + - provider_id: milvus + provider_type: remote::milvus + config: + uri: "https://:" + token: ":" + secure: True + ca_pem_path: "/path/to/ca.pem" + client_pem_path: "/path/to/client.pem" + client_key_path: "/path/to/client.key" + ``` + + #### Key Parameters for TLS Configuration + + - **`secure`**: Enables TLS encryption when set to `true`. Defaults to `false`. + - **`server_pem_path`**: Path to the **server certificate** for verifying the server's identity (used in one-way TLS). + - **`ca_pem_path`**: Path to the **Certificate Authority (CA) certificate** for validating the server certificate (required in mTLS). + - **`client_pem_path`**: Path to the **client certificate** file (required for mTLS). + - **`client_key_path`**: Path to the **client private key** file (required for mTLS). + + ## Search Modes + + Milvus supports three different search modes for both inline and remote configurations: + + ### Vector Search + Vector search uses semantic similarity to find the most relevant chunks based on embedding vectors. This is the default search mode and works well for finding conceptually similar content. + + ```python + # Vector search example + search_response = client.vector_stores.search( + vector_store_id=vector_store.id, + query="What is machine learning?", + search_mode="vector", + max_num_results=5, + ) + ``` + + ### Keyword Search + Keyword search uses traditional text-based matching to find chunks containing specific terms or phrases. This is useful when you need exact term matches. + + ```python + # Keyword search example + search_response = client.vector_stores.search( + vector_store_id=vector_store.id, + query="Python programming language", + search_mode="keyword", + max_num_results=5, + ) + ``` + + ### Hybrid Search + Hybrid search combines both vector and keyword search methods to provide more comprehensive results. It leverages the strengths of both semantic similarity and exact term matching. + + #### Basic Hybrid Search + ```python + # Basic hybrid search example (uses RRF ranker with default impact_factor=60.0) + search_response = client.vector_stores.search( + vector_store_id=vector_store.id, + query="neural networks in Python", + search_mode="hybrid", + max_num_results=5, + ) + ``` + + **Note**: The default `impact_factor` value of 60.0 was empirically determined to be optimal in the original RRF research paper: ["Reciprocal Rank Fusion outperforms Condorcet and individual Rank Learning Methods"](https://plg.uwaterloo.ca/~gvcormac/cormacksigir09-rrf.pdf) (Cormack et al., 2009). + + #### Hybrid Search with RRF (Reciprocal Rank Fusion) Ranker + RRF combines rankings from vector and keyword search by using reciprocal ranks. The impact factor controls how much weight is given to higher-ranked results. + + ```python + # Hybrid search with custom RRF parameters + search_response = client.vector_stores.search( + vector_store_id=vector_store.id, + query="neural networks in Python", + search_mode="hybrid", + max_num_results=5, + ranking_options={ + "ranker": { + "type": "rrf", + "impact_factor": 100.0, # Higher values give more weight to top-ranked results + } + }, + ) + ``` + + #### Hybrid Search with Weighted Ranker + Weighted ranker linearly combines normalized scores from vector and keyword search. The alpha parameter controls the balance between the two search methods. + + ```python + # Hybrid search with weighted ranker + search_response = client.vector_stores.search( + vector_store_id=vector_store.id, + query="neural networks in Python", + search_mode="hybrid", + max_num_results=5, + ranking_options={ + "ranker": { + "type": "weighted", + "alpha": 0.7, # 70% vector search, 30% keyword search + } + }, + ) + ``` + + For detailed documentation on RRF and Weighted rankers, please refer to the [Milvus Reranking Guide](https://milvus.io/docs/reranking.md). + + ## Documentation + See the [Milvus documentation](https://milvus.io/docs/install-overview.md) for more details about Milvus in general. + + For more details on TLS configuration, refer to the [TLS setup guide](https://milvus.io/docs/tls.md). +sidebar_label: Remote - Milvus +title: remote::milvus +--- + # remote::milvus ## Description @@ -208,12 +409,11 @@ For more details on TLS configuration, refer to the [TLS setup guide](https://mi | `token` | `str \| None` | No | | The token of the Milvus server | | `consistency_level` | `` | No | Strong | The consistency level of the Milvus server | | `kvstore` | `utils.kvstore.config.RedisKVStoreConfig \| utils.kvstore.config.SqliteKVStoreConfig \| utils.kvstore.config.PostgresKVStoreConfig \| utils.kvstore.config.MongoDBKVStoreConfig` | No | sqlite | Config for KV store backend | -| `config` | `dict` | No | {} | This configuration allows additional fields to be passed through to the underlying Milvus client. See the [Milvus](https://milvus.io/docs/install-overview.md) documentation for more details about Milvus in general. | - -```{note} - This configuration class accepts additional fields beyond those listed above. You can pass any additional configuration options that will be forwarded to the underlying provider. - ``` +| `config` | `dict` | No | {} | This configuration allows additional fields to be passed through to the underlying Milvus client. See the [Milvus](https://milvus.io/docs/install-overview.md) documentation for more details about Milvus in general. | +:::note +This configuration class accepts additional fields beyond those listed above. You can pass any additional configuration options that will be forwarded to the underlying provider. +::: ## Sample Configuration @@ -223,6 +423,4 @@ token: ${env.MILVUS_TOKEN} kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/milvus_remote_registry.db - ``` - diff --git a/docs/source/providers/vector_io/remote_pgvector.md b/docs/docs/providers/vector_io/remote_pgvector.mdx similarity index 53% rename from docs/source/providers/vector_io/remote_pgvector.md rename to docs/docs/providers/vector_io/remote_pgvector.mdx index 6312edabc..d21810c68 100644 --- a/docs/source/providers/vector_io/remote_pgvector.md +++ b/docs/docs/providers/vector_io/remote_pgvector.mdx @@ -1,3 +1,108 @@ +--- +description: | + [PGVector](https://github.com/pgvector/pgvector) is a remote vector database provider for Llama Stack. It + allows you to store and query vectors directly in memory. + That means you'll get fast and efficient vector retrieval. + + ## Features + + - Easy to use + - Fully integrated with Llama Stack + + There are three implementations of search for PGVectoIndex available: + + 1. Vector Search: + - How it works: + - Uses PostgreSQL's vector extension (pgvector) to perform similarity search + - Compares query embeddings against stored embeddings using Cosine distance or other distance metrics + - Eg. SQL query: SELECT document, embedding <=> %s::vector AS distance FROM table ORDER BY distance + + -Characteristics: + - Semantic understanding - finds documents similar in meaning even if they don't share keywords + - Works with high-dimensional vector embeddings (typically 768, 1024, or higher dimensions) + - Best for: Finding conceptually related content, handling synonyms, cross-language search + + 2. Keyword Search + - How it works: + - Uses PostgreSQL's full-text search capabilities with tsvector and ts_rank + - Converts text to searchable tokens using to_tsvector('english', text). Default language is English. + - Eg. SQL query: SELECT document, ts_rank(tokenized_content, plainto_tsquery('english', %s)) AS score + + - Characteristics: + - Lexical matching - finds exact keyword matches and variations + - Uses GIN (Generalized Inverted Index) for fast text search performance + - Scoring: Uses PostgreSQL's ts_rank function for relevance scoring + - Best for: Exact term matching, proper names, technical terms, Boolean-style queries + + 3. Hybrid Search + - How it works: + - Combines both vector and keyword search results + - Runs both searches independently, then merges results using configurable reranking + + - Two reranking strategies available: + - Reciprocal Rank Fusion (RRF) - (default: 60.0) + - Weighted Average - (default: 0.5) + + - Characteristics: + - Best of both worlds: semantic understanding + exact matching + - Documents appearing in both searches get boosted scores + - Configurable balance between semantic and lexical matching + - Best for: General-purpose search where you want both precision and recall + + 4. Database Schema + The PGVector implementation stores data optimized for all three search types: + CREATE TABLE vector_store_xxx ( + id TEXT PRIMARY KEY, + document JSONB, -- Original document + embedding vector(dimension), -- For vector search + content_text TEXT, -- Raw text content + tokenized_content TSVECTOR -- For keyword search + ); + + -- Indexes for performance + CREATE INDEX content_gin_idx ON table USING GIN(tokenized_content); -- Keyword search + -- Vector index created automatically by pgvector + + ## Usage + + To use PGVector in your Llama Stack project, follow these steps: + + 1. Install the necessary dependencies. + 2. Configure your Llama Stack project to use pgvector. (e.g. remote::pgvector). + 3. Start storing and querying vectors. + + ## This is an example how you can set up your environment for using PGVector + + 1. Export env vars: + ```bash + export ENABLE_PGVECTOR=true + export PGVECTOR_HOST=localhost + export PGVECTOR_PORT=5432 + export PGVECTOR_DB=llamastack + export PGVECTOR_USER=llamastack + export PGVECTOR_PASSWORD=llamastack + ``` + + 2. Create DB: + ```bash + psql -h localhost -U postgres -c "CREATE ROLE llamastack LOGIN PASSWORD 'llamastack';" + psql -h localhost -U postgres -c "CREATE DATABASE llamastack OWNER llamastack;" + psql -h localhost -U llamastack -d llamastack -c "CREATE EXTENSION IF NOT EXISTS vector;" + ``` + + ## Installation + + You can install PGVector using docker: + + ```bash + docker pull pgvector/pgvector:pg17 + ``` + ## Documentation + See [PGVector's documentation](https://github.com/pgvector/pgvector) for more details about PGVector in general. +sidebar_label: Remote - Pgvector +title: remote::pgvector +--- + # remote::pgvector ## Description @@ -18,7 +123,7 @@ There are three implementations of search for PGVectoIndex available: - How it works: - Uses PostgreSQL's vector extension (pgvector) to perform similarity search - Compares query embeddings against stored embeddings using Cosine distance or other distance metrics - - Eg. SQL query: SELECT document, embedding <=> %s::vector AS distance FROM table ORDER BY distance + - Eg. SQL query: SELECT document, embedding <=> %s::vector AS distance FROM table ORDER BY distance -Characteristics: - Semantic understanding - finds documents similar in meaning even if they don't share keywords @@ -126,6 +231,4 @@ password: ${env.PGVECTOR_PASSWORD} kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/pgvector_registry.db - ``` - diff --git a/docs/source/providers/vector_io/remote_qdrant.md b/docs/docs/providers/vector_io/remote_qdrant.mdx similarity index 88% rename from docs/source/providers/vector_io/remote_qdrant.md rename to docs/docs/providers/vector_io/remote_qdrant.mdx index 043141007..c44a2b937 100644 --- a/docs/source/providers/vector_io/remote_qdrant.md +++ b/docs/docs/providers/vector_io/remote_qdrant.mdx @@ -1,3 +1,9 @@ +--- +description: "Please refer to the inline provider documentation." +sidebar_label: Remote - Qdrant +title: remote::qdrant +--- + # remote::qdrant ## Description @@ -29,6 +35,4 @@ api_key: ${env.QDRANT_API_KEY:=} kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/qdrant_registry.db - ``` - diff --git a/docs/source/providers/vector_io/remote_weaviate.md b/docs/docs/providers/vector_io/remote_weaviate.mdx similarity index 63% rename from docs/source/providers/vector_io/remote_weaviate.md rename to docs/docs/providers/vector_io/remote_weaviate.mdx index 8fb0f7c11..3f1e36422 100644 --- a/docs/source/providers/vector_io/remote_weaviate.md +++ b/docs/docs/providers/vector_io/remote_weaviate.mdx @@ -1,3 +1,38 @@ +--- +description: | + [Weaviate](https://weaviate.io/) is a vector database provider for Llama Stack. + It allows you to store and query vectors directly within a Weaviate database. + That means you're not limited to storing vectors in memory or in a separate service. + + ## Features + Weaviate supports: + - Store embeddings and their metadata + - Vector search + - Full-text search + - Hybrid search + - Document storage + - Metadata filtering + - Multi-modal retrieval + + + ## Usage + + To use Weaviate in your Llama Stack project, follow these steps: + + 1. Install the necessary dependencies. + 2. Configure your Llama Stack project to use chroma. + 3. Start storing and querying vectors. + + ## Installation + + To install Weaviate see the [Weaviate quickstart documentation](https://weaviate.io/developers/weaviate/quickstart). + + ## Documentation + See [Weaviate's documentation](https://weaviate.io/developers/weaviate) for more details about Weaviate in general. +sidebar_label: Remote - Weaviate +title: remote::weaviate +--- + # remote::weaviate ## Description @@ -50,6 +85,4 @@ weaviate_cluster_url: ${env.WEAVIATE_CLUSTER_URL:=localhost:8080} kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/weaviate_registry.db - ``` - diff --git a/docs/source/providers/datasetio/index.md b/docs/source/providers/datasetio/index.md deleted file mode 100644 index 94a97e2ed..000000000 --- a/docs/source/providers/datasetio/index.md +++ /dev/null @@ -1,15 +0,0 @@ -# Datasetio - -## Overview - -This section contains documentation for all available providers for the **datasetio** API. - -## Providers - -```{toctree} -:maxdepth: 1 - -inline_localfs -remote_huggingface -remote_nvidia -``` diff --git a/docs/source/providers/eval/index.md b/docs/source/providers/eval/index.md deleted file mode 100644 index a14fada1d..000000000 --- a/docs/source/providers/eval/index.md +++ /dev/null @@ -1,16 +0,0 @@ -# Eval - -## Overview - -Llama Stack Evaluation API for running evaluations on model and agent candidates. - -This section contains documentation for all available providers for the **eval** API. - -## Providers - -```{toctree} -:maxdepth: 1 - -inline_meta-reference -remote_nvidia -``` diff --git a/docs/source/providers/inference/index.md b/docs/source/providers/inference/index.md deleted file mode 100644 index c5720daef..000000000 --- a/docs/source/providers/inference/index.md +++ /dev/null @@ -1,42 +0,0 @@ -# Inference - -## Overview - -Llama Stack Inference API for generating completions, chat completions, and embeddings. - - This API provides the raw interface to the underlying models. Two kinds of models are supported: - - LLM models: these models generate "raw" and "chat" (conversational) completions. - - Embedding models: these models generate embeddings to be used for semantic search. - -This section contains documentation for all available providers for the **inference** API. - -## Providers - -```{toctree} -:maxdepth: 1 - -inline_meta-reference -inline_sentence-transformers -remote_anthropic -remote_azure -remote_bedrock -remote_cerebras -remote_databricks -remote_fireworks -remote_gemini -remote_groq -remote_hf_endpoint -remote_hf_serverless -remote_llama-openai-compat -remote_nvidia -remote_ollama -remote_openai -remote_passthrough -remote_runpod -remote_sambanova -remote_tgi -remote_together -remote_vertexai -remote_vllm -remote_watsonx -``` diff --git a/docs/source/providers/inference/inline_sentence-transformers.md b/docs/source/providers/inference/inline_sentence-transformers.md deleted file mode 100644 index 57ec7f7d0..000000000 --- a/docs/source/providers/inference/inline_sentence-transformers.md +++ /dev/null @@ -1,13 +0,0 @@ -# inline::sentence-transformers - -## Description - -Sentence Transformers inference provider for text embeddings and similarity search. - -## Sample Configuration - -```yaml -{} - -``` - diff --git a/docs/source/providers/post_training/index.md b/docs/source/providers/post_training/index.md deleted file mode 100644 index e69f2a45a..000000000 --- a/docs/source/providers/post_training/index.md +++ /dev/null @@ -1,16 +0,0 @@ -# Post_Training - -## Overview - -This section contains documentation for all available providers for the **post_training** API. - -## Providers - -```{toctree} -:maxdepth: 1 - -inline_huggingface-gpu -inline_torchtune-cpu -inline_torchtune-gpu -remote_nvidia -``` diff --git a/docs/source/providers/safety/index.md b/docs/source/providers/safety/index.md deleted file mode 100644 index 5ddda2242..000000000 --- a/docs/source/providers/safety/index.md +++ /dev/null @@ -1,18 +0,0 @@ -# Safety - -## Overview - -This section contains documentation for all available providers for the **safety** API. - -## Providers - -```{toctree} -:maxdepth: 1 - -inline_code-scanner -inline_llama-guard -inline_prompt-guard -remote_bedrock -remote_nvidia -remote_sambanova -``` diff --git a/docs/source/providers/scoring/index.md b/docs/source/providers/scoring/index.md deleted file mode 100644 index f3bd48eb0..000000000 --- a/docs/source/providers/scoring/index.md +++ /dev/null @@ -1,15 +0,0 @@ -# Scoring - -## Overview - -This section contains documentation for all available providers for the **scoring** API. - -## Providers - -```{toctree} -:maxdepth: 1 - -inline_basic -inline_braintrust -inline_llm-as-judge -``` diff --git a/docs/source/providers/tool_runtime/index.md b/docs/source/providers/tool_runtime/index.md deleted file mode 100644 index 8d29aed43..000000000 --- a/docs/source/providers/tool_runtime/index.md +++ /dev/null @@ -1,18 +0,0 @@ -# Tool_Runtime - -## Overview - -This section contains documentation for all available providers for the **tool_runtime** API. - -## Providers - -```{toctree} -:maxdepth: 1 - -inline_rag-runtime -remote_bing-search -remote_brave-search -remote_model-context-protocol -remote_tavily-search -remote_wolfram-alpha -``` diff --git a/docs/source/providers/tool_runtime/remote_model-context-protocol.md b/docs/source/providers/tool_runtime/remote_model-context-protocol.md deleted file mode 100644 index cf9401c2c..000000000 --- a/docs/source/providers/tool_runtime/remote_model-context-protocol.md +++ /dev/null @@ -1,13 +0,0 @@ -# remote::model-context-protocol - -## Description - -Model Context Protocol (MCP) tool for standardized tool calling and context management. - -## Sample Configuration - -```yaml -{} - -``` - diff --git a/docs/source/providers/vector_io/index.md b/docs/source/providers/vector_io/index.md deleted file mode 100644 index 28ae523d7..000000000 --- a/docs/source/providers/vector_io/index.md +++ /dev/null @@ -1,24 +0,0 @@ -# Vector_Io - -## Overview - -This section contains documentation for all available providers for the **vector_io** API. - -## Providers - -```{toctree} -:maxdepth: 1 - -inline_chromadb -inline_faiss -inline_meta-reference -inline_milvus -inline_qdrant -inline_sqlite-vec -inline_sqlite_vec -remote_chromadb -remote_milvus -remote_pgvector -remote_qdrant -remote_weaviate -``` diff --git a/llama_stack/distributions/nvidia/doc_template.md b/llama_stack/distributions/nvidia/doc_template.md index 56e99e523..fbee17ef8 100644 --- a/llama_stack/distributions/nvidia/doc_template.md +++ b/llama_stack/distributions/nvidia/doc_template.md @@ -49,22 +49,22 @@ The deployed platform includes the NIM Proxy microservice, which is the service ### Datasetio API: NeMo Data Store The NeMo Data Store microservice serves as the default file storage solution for the NeMo microservices platform. It exposts APIs compatible with the Hugging Face Hub client (`HfApi`), so you can use the client to interact with Data Store. The `NVIDIA_DATASETS_URL` environment variable should point to your NeMo Data Store endpoint. -See the {repopath}`NVIDIA Datasetio docs::llama_stack/providers/remote/datasetio/nvidia/README.md` for supported features and example usage. +See the [NVIDIA Datasetio docs](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/providers/remote/datasetio/nvidia/README.md) for supported features and example usage. ### Eval API: NeMo Evaluator The NeMo Evaluator microservice supports evaluation of LLMs. Launching an Evaluation job with NeMo Evaluator requires an Evaluation Config (an object that contains metadata needed by the job). A Llama Stack Benchmark maps to an Evaluation Config, so registering a Benchmark creates an Evaluation Config in NeMo Evaluator. The `NVIDIA_EVALUATOR_URL` environment variable should point to your NeMo Microservices endpoint. -See the {repopath}`NVIDIA Eval docs::llama_stack/providers/remote/eval/nvidia/README.md` for supported features and example usage. +See the [NVIDIA Eval docs](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/providers/remote/eval/nvidia/README.md) for supported features and example usage. ### Post-Training API: NeMo Customizer -The NeMo Customizer microservice supports fine-tuning models. You can reference {repopath}`this list of supported models::llama_stack/providers/remote/post_training/nvidia/models.py` that can be fine-tuned using Llama Stack. The `NVIDIA_CUSTOMIZER_URL` environment variable should point to your NeMo Microservices endpoint. +The NeMo Customizer microservice supports fine-tuning models. You can reference [this list of supported models](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/providers/remote/post_training/nvidia/models.py) that can be fine-tuned using Llama Stack. The `NVIDIA_CUSTOMIZER_URL` environment variable should point to your NeMo Microservices endpoint. -See the {repopath}`NVIDIA Post-Training docs::llama_stack/providers/remote/post_training/nvidia/README.md` for supported features and example usage. +See the [NVIDIA Post-Training docs](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/providers/remote/post_training/nvidia/README.md) for supported features and example usage. ### Safety API: NeMo Guardrails The NeMo Guardrails microservice sits between your application and the LLM, and adds checks and content moderation to a model. The `GUARDRAILS_SERVICE_URL` environment variable should point to your NeMo Microservices endpoint. -See the {repopath}`NVIDIA Safety docs::llama_stack/providers/remote/safety/nvidia/README.md` for supported features and example usage. +See the [NVIDIA Safety docs](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/providers/remote/safety/nvidia/README.md) for supported features and example usage. ## Deploying models In order to use a registered model with the Llama Stack APIs, ensure the corresponding NIM is deployed to your environment. For example, you can use the NIM Proxy microservice to deploy `meta/llama-3.2-1b-instruct`. @@ -138,4 +138,4 @@ llama stack run ./run.yaml \ ``` ## Example Notebooks -For examples of how to use the NVIDIA Distribution to run inference, fine-tune, evaluate, and run safety checks on your LLMs, you can reference the example notebooks in {repopath}`docs/notebooks/nvidia`. +For examples of how to use the NVIDIA Distribution to run inference, fine-tune, evaluate, and run safety checks on your LLMs, you can reference the example notebooks in [docs/notebooks/nvidia](https://github.com/meta-llama/llama-stack/tree/main/docs/notebooks/nvidia). diff --git a/llama_stack/providers/registry/vector_io.py b/llama_stack/providers/registry/vector_io.py index e8237bc62..9816838e7 100644 --- a/llama_stack/providers/registry/vector_io.py +++ b/llama_stack/providers/registry/vector_io.py @@ -410,7 +410,7 @@ There are three implementations of search for PGVectoIndex available: - How it works: - Uses PostgreSQL's vector extension (pgvector) to perform similarity search - Compares query embeddings against stored embeddings using Cosine distance or other distance metrics - - Eg. SQL query: SELECT document, embedding <=> %s::vector AS distance FROM table ORDER BY distance + - Eg. SQL query: SELECT document, embedding <=> %s::vector AS distance FROM table ORDER BY distance -Characteristics: - Semantic understanding - finds documents similar in meaning even if they don't share keywords diff --git a/scripts/distro_codegen.py b/scripts/distro_codegen.py index b6698ef9a..ff5025b78 100755 --- a/scripts/distro_codegen.py +++ b/scripts/distro_codegen.py @@ -56,7 +56,7 @@ def process_distro(distro_dir: Path, progress, change_tracker: ChangedPathTracke distro = template_func() yaml_output_dir = REPO_ROOT / "llama_stack" / "distributions" / distro.name - doc_output_dir = REPO_ROOT / "docs/source/distributions" / f"{distro.distro_type}_distro" + doc_output_dir = REPO_ROOT / "docs/docs/distributions" / f"{distro.distro_type}_distro" change_tracker.add_paths(yaml_output_dir, doc_output_dir) distro.save_distribution( yaml_output_dir=yaml_output_dir, diff --git a/scripts/provider_codegen.py b/scripts/provider_codegen.py index 17efa2138..207840d49 100755 --- a/scripts/provider_codegen.py +++ b/scripts/provider_codegen.py @@ -158,7 +158,7 @@ def get_config_class_info(config_class_path: str) -> dict[str, Any]: def generate_provider_docs(progress, provider_spec: Any, api_name: str) -> str: - """Generate markdown documentation for a provider.""" + """Generate MDX documentation for a provider.""" provider_type = provider_spec.provider_type config_class = provider_spec.config_class @@ -166,10 +166,7 @@ def generate_provider_docs(progress, provider_spec: Any, api_name: str) -> str: if "error" in config_info: progress.print(config_info["error"]) - md_lines = [] - md_lines.append(f"# {provider_type}") - md_lines.append("") - + # Extract description for frontmatter description = "" if hasattr(provider_spec, "description") and provider_spec.description: description = provider_spec.description @@ -182,6 +179,37 @@ def generate_provider_docs(progress, provider_spec: Any, api_name: str) -> str: elif config_info.get("docstring"): description = config_info["docstring"] + # Create sidebar label (clean up provider_type for display) + sidebar_label = provider_type.replace("::", " - ").replace("_", " ") + if sidebar_label.startswith("inline - "): + sidebar_label = sidebar_label[9:].title() # Remove "inline - " prefix and title case + else: + sidebar_label = sidebar_label.title() + + md_lines = [] + + # Add YAML frontmatter + md_lines.append("---") + if description: + # Handle multi-line descriptions in YAML - keep it simple for single line + if "\n" in description.strip(): + md_lines.append("description: |") + for line in description.strip().split("\n"): + # Avoid trailing whitespace by only adding spaces to non-empty lines + md_lines.append(f" {line}" if line.strip() else "") + else: + # For single line descriptions, format properly for YAML + clean_desc = description.strip().replace('"', '\\"') + md_lines.append(f'description: "{clean_desc}"') + md_lines.append(f"sidebar_label: {sidebar_label}") + md_lines.append(f"title: {provider_type}") + md_lines.append("---") + md_lines.append("") + + # Add main title + md_lines.append(f"# {provider_type}") + md_lines.append("") + if description: md_lines.append("## Description") md_lines.append("") @@ -198,16 +226,35 @@ def generate_provider_docs(progress, provider_spec: Any, api_name: str) -> str: field_type = field_info["type"].replace("|", "\\|") required = "Yes" if field_info["required"] else "No" default = str(field_info["default"]) if field_info["default"] is not None else "" - description = field_info["description"] or "" - md_lines.append(f"| `{field_name}` | `{field_type}` | {required} | {default} | {description} |") + # Handle multiline default values and escape problematic characters for MDX + if "\n" in default: + default = ( + default.replace("\n", "
") + .replace("<", "<") + .replace(">", ">") + .replace("{", "{") + .replace("}", "}") + ) + else: + default = ( + default.replace("<", "<").replace(">", ">").replace("{", "{").replace("}", "}") + ) + + description_text = field_info["description"] or "" + # Escape curly braces in description text for MDX compatibility + description_text = description_text.replace("{", "{").replace("}", "}") + + md_lines.append(f"| `{field_name}` | `{field_type}` | {required} | {default} | {description_text} |") md_lines.append("") if config_info.get("accepts_extra_config"): + md_lines.append(":::note") md_lines.append( - "```{note}\n This configuration class accepts additional fields beyond those listed above. You can pass any additional configuration options that will be forwarded to the underlying provider.\n ```\n" + "This configuration class accepts additional fields beyond those listed above. You can pass any additional configuration options that will be forwarded to the underlying provider." ) + md_lines.append(":::") md_lines.append("") if config_info.get("sample_config"): @@ -240,24 +287,71 @@ def generate_provider_docs(progress, provider_spec: Any, api_name: str) -> str: return obj sample_config_dict = convert_pydantic_to_dict(sample_config) - md_lines.append(yaml.dump(sample_config_dict, default_flow_style=False, sort_keys=False)) + # Strip trailing newlines from yaml.dump to prevent extra blank lines + yaml_output = yaml.dump(sample_config_dict, default_flow_style=False, sort_keys=False).rstrip() + md_lines.append(yaml_output) else: md_lines.append("# No sample configuration available.") except Exception as e: md_lines.append(f"# Error generating sample config: {str(e)}") md_lines.append("```") - md_lines.append("") if hasattr(provider_spec, "deprecation_warning") and provider_spec.deprecation_warning: md_lines.append("## Deprecation Notice") md_lines.append("") - md_lines.append(f"```{{warning}}\n{provider_spec.deprecation_warning}\n```") - md_lines.append("") + md_lines.append(":::warning") + md_lines.append(provider_spec.deprecation_warning) + md_lines.append(":::") if hasattr(provider_spec, "deprecation_error") and provider_spec.deprecation_error: md_lines.append("## Deprecation Error") md_lines.append("") - md_lines.append(f"❌ **Error**: {provider_spec.deprecation_error}") + md_lines.append(":::danger") + md_lines.append(f"**Error**: {provider_spec.deprecation_error}") + md_lines.append(":::") + + return "\n".join(md_lines) + "\n" + + +def generate_index_docs(api_name: str, api_docstring: str | None, provider_entries: list) -> str: + """Generate MDX documentation for the index file.""" + # Create sidebar label for the API + sidebar_label = api_name.replace("_", " ").title() + + md_lines = [] + + # Add YAML frontmatter for index + md_lines.append("---") + if api_docstring: + clean_desc = api_docstring.strip().replace('"', '\\"') + md_lines.append(f'description: "{clean_desc}"') + md_lines.append(f"sidebar_label: {sidebar_label}") + md_lines.append(f"title: {api_name.title()}") + md_lines.append("---") + md_lines.append("") + + # Add main content + md_lines.append(f"# {api_name.title()}") + md_lines.append("") + md_lines.append("## Overview") + md_lines.append("") + + if api_docstring: + cleaned_docstring = api_docstring.strip() + md_lines.append(f"{cleaned_docstring}") + md_lines.append("") + + md_lines.append(f"This section contains documentation for all available providers for the **{api_name}** API.") + md_lines.append("") + + md_lines.append("## Providers") + md_lines.append("") + + # For Docusaurus, create a simple list of links instead of toctree + for entry in provider_entries: + provider_name = entry["display_name"] + filename = entry["filename"] + md_lines.append(f"- [{provider_name}](./{filename})") return "\n".join(md_lines) + "\n" @@ -272,41 +366,35 @@ def process_provider_registry(progress, change_tracker: ChangedPathTracker) -> N for api, providers in provider_registry.items(): api_name = api.value - doc_output_dir = REPO_ROOT / "docs" / "source" / "providers" / api_name + doc_output_dir = REPO_ROOT / "docs" / "docs" / "providers" / api_name doc_output_dir.mkdir(parents=True, exist_ok=True) change_tracker.add_paths(doc_output_dir) - index_content = [] - index_content.append(f"# {api_name.title()}\n") - index_content.append("## Overview\n") - api_docstring = get_api_docstring(api_name) - if api_docstring: - cleaned_docstring = api_docstring.strip() - index_content.append(f"{cleaned_docstring}\n") - - index_content.append( - f"This section contains documentation for all available providers for the **{api_name}** API.\n" - ) - - index_content.append("## Providers\n") - - toctree_entries = [] + provider_entries = [] for provider_type, provider in sorted(providers.items()): filename = provider_type.replace("::", "_").replace(":", "_") - provider_doc_file = doc_output_dir / f"{filename}.md" + provider_doc_file = doc_output_dir / f"{filename}.mdx" provider_docs = generate_provider_docs(progress, provider, api_name) provider_doc_file.write_text(provider_docs) change_tracker.add_paths(provider_doc_file) - toctree_entries.append(f"{filename}") - index_content.append(f"```{{toctree}}\n:maxdepth: 1\n\n{'\n'.join(toctree_entries)}\n```\n") + # Create display name for the index + display_name = provider_type.replace("::", " - ").replace("_", " ") + if display_name.startswith("inline - "): + display_name = display_name[9:].title() + else: + display_name = display_name.title() - index_file = doc_output_dir / "index.md" - index_file.write_text("\n".join(index_content)) + provider_entries.append({"filename": filename, "display_name": display_name}) + + # Generate index file with frontmatter + index_content = generate_index_docs(api_name, api_docstring, provider_entries) + index_file = doc_output_dir / "index.mdx" + index_file.write_text(index_content) change_tracker.add_paths(index_file) except Exception as e: From 05ff4c4420406853f1123bd6c8603104c44be2dd Mon Sep 17 00:00:00 2001 From: Alexey Rybak <50731695+reluctantfuturist@users.noreply.github.com> Date: Wed, 24 Sep 2025 14:03:41 -0700 Subject: [PATCH 13/27] docs: advanced_apis migration (#3532) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # What does this PR do? - Migrates the `advanced_apis/`​ section of the docs to the new format ## Test Plan - Partial migration --- docs/docs/advanced_apis/evaluation.mdx | 163 ++++++++++ docs/docs/advanced_apis/post_training.mdx | 305 ++++++++++++++++++ docs/docs/advanced_apis/scoring.mdx | 193 +++++++++++ docs/source/advanced_apis/eval/index.md | 6 - .../eval/inline_meta-reference.md | 25 -- .../advanced_apis/eval/remote_nvidia.md | 23 -- .../advanced_apis/evaluation_concepts.md | 77 ----- docs/source/advanced_apis/index.md | 33 -- .../post_training/huggingface.md | 122 ------- .../advanced_apis/post_training/index.md | 7 - .../post_training/inline_huggingface.md | 40 --- .../post_training/inline_torchtune.md | 25 -- .../post_training/nvidia_nemo.md | 163 ---------- .../post_training/remote_nvidia.md | 32 -- .../advanced_apis/post_training/torchtune.md | 125 ------- docs/source/advanced_apis/scoring/index.md | 7 - .../advanced_apis/scoring/inline_basic.md | 17 - .../scoring/inline_braintrust.md | 23 -- .../scoring/inline_llm-as-judge.md | 17 - 19 files changed, 661 insertions(+), 742 deletions(-) create mode 100644 docs/docs/advanced_apis/evaluation.mdx create mode 100644 docs/docs/advanced_apis/post_training.mdx create mode 100644 docs/docs/advanced_apis/scoring.mdx delete mode 100644 docs/source/advanced_apis/eval/index.md delete mode 100644 docs/source/advanced_apis/eval/inline_meta-reference.md delete mode 100644 docs/source/advanced_apis/eval/remote_nvidia.md delete mode 100644 docs/source/advanced_apis/evaluation_concepts.md delete mode 100644 docs/source/advanced_apis/index.md delete mode 100644 docs/source/advanced_apis/post_training/huggingface.md delete mode 100644 docs/source/advanced_apis/post_training/index.md delete mode 100644 docs/source/advanced_apis/post_training/inline_huggingface.md delete mode 100644 docs/source/advanced_apis/post_training/inline_torchtune.md delete mode 100644 docs/source/advanced_apis/post_training/nvidia_nemo.md delete mode 100644 docs/source/advanced_apis/post_training/remote_nvidia.md delete mode 100644 docs/source/advanced_apis/post_training/torchtune.md delete mode 100644 docs/source/advanced_apis/scoring/index.md delete mode 100644 docs/source/advanced_apis/scoring/inline_basic.md delete mode 100644 docs/source/advanced_apis/scoring/inline_braintrust.md delete mode 100644 docs/source/advanced_apis/scoring/inline_llm-as-judge.md diff --git a/docs/docs/advanced_apis/evaluation.mdx b/docs/docs/advanced_apis/evaluation.mdx new file mode 100644 index 000000000..1efaa4c5c --- /dev/null +++ b/docs/docs/advanced_apis/evaluation.mdx @@ -0,0 +1,163 @@ +# Evaluation + +## Evaluation Concepts + +The Llama Stack Evaluation flow allows you to run evaluations on your GenAI application datasets or pre-registered benchmarks. + +We introduce a set of APIs in Llama Stack for supporting running evaluations of LLM applications: +- `/datasetio` + `/datasets` API +- `/scoring` + `/scoring_functions` API +- `/eval` + `/benchmarks` API + +This guide goes over the sets of APIs and developer experience flow of using Llama Stack to run evaluations for different use cases. Checkout our Colab notebook on working examples with evaluations [here](https://colab.research.google.com/drive/10CHyykee9j2OigaIcRv47BKG9mrNm0tJ?usp=sharing). + +The Evaluation APIs are associated with a set of Resources. Please visit the Resources section in our [Core Concepts](../concepts/index.mdx) guide for better high-level understanding. + +- **DatasetIO**: defines interface with datasets and data loaders. + - Associated with `Dataset` resource. +- **Scoring**: evaluate outputs of the system. + - Associated with `ScoringFunction` resource. We provide a suite of out-of-the box scoring functions and also the ability for you to add custom evaluators. These scoring functions are the core part of defining an evaluation task to output evaluation metrics. +- **Eval**: generate outputs (via Inference or Agents) and perform scoring. + - Associated with `Benchmark` resource. + +## Evaluation Providers + +Llama Stack provides multiple evaluation providers: + +- **Meta Reference** (`inline::meta-reference`) - Meta's reference implementation with multi-language support +- **NVIDIA** (`remote::nvidia`) - NVIDIA's evaluation platform integration + +### Meta Reference + +Meta's reference implementation of evaluation tasks with support for multiple languages and evaluation metrics. + +#### Configuration + +| Field | Type | Required | Default | Description | +|-------|------|----------|---------|-------------| +| `kvstore` | `RedisKVStoreConfig \| SqliteKVStoreConfig \| PostgresKVStoreConfig \| MongoDBKVStoreConfig` | No | sqlite | Key-value store configuration | + +#### Sample Configuration + +```yaml +kvstore: + type: sqlite + db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/meta_reference_eval.db +``` + +#### Features + +- Multi-language evaluation support +- Comprehensive evaluation metrics +- Integration with various key-value stores (SQLite, Redis, PostgreSQL, MongoDB) +- Built-in support for popular benchmarks + +### NVIDIA + +NVIDIA's evaluation provider for running evaluation tasks on NVIDIA's platform. + +#### Configuration + +| Field | Type | Required | Default | Description | +|-------|------|----------|---------|-------------| +| `evaluator_url` | `str` | No | http://0.0.0.0:7331 | The url for accessing the evaluator service | + +#### Sample Configuration + +```yaml +evaluator_url: ${env.NVIDIA_EVALUATOR_URL:=http://localhost:7331} +``` + +#### Features + +- Integration with NVIDIA's evaluation platform +- Remote evaluation capabilities +- Scalable evaluation processing + +## Open-benchmark Eval + +### List of open-benchmarks Llama Stack support + +Llama stack pre-registers several popular open-benchmarks to easily evaluate model performance via CLI. + +The list of open-benchmarks we currently support: +- [MMLU-COT](https://arxiv.org/abs/2009.03300) (Measuring Massive Multitask Language Understanding): Benchmark designed to comprehensively evaluate the breadth and depth of a model's academic and professional understanding +- [GPQA-COT](https://arxiv.org/abs/2311.12022) (A Graduate-Level Google-Proof Q&A Benchmark): A challenging benchmark of 448 multiple-choice questions written by domain experts in biology, physics, and chemistry. +- [SimpleQA](https://openai.com/index/introducing-simpleqa/): Benchmark designed to access models to answer short, fact-seeking questions. +- [MMMU](https://arxiv.org/abs/2311.16502) (A Massive Multi-discipline Multimodal Understanding and Reasoning Benchmark for Expert AGI): Benchmark designed to evaluate multimodal models. + +You can follow this [contributing guide](../references/evals_reference/index.mdx#open-benchmark-contributing-guide) to add more open-benchmarks to Llama Stack + +### Run evaluation on open-benchmarks via CLI + +We have built-in functionality to run the supported open-benchmarks using llama-stack-client CLI + +#### Spin up Llama Stack server + +Spin up llama stack server with 'open-benchmark' template +``` +llama stack run llama_stack/distributions/open-benchmark/run.yaml + +``` + +#### Run eval CLI +There are 3 necessary inputs to run a benchmark eval +- `list of benchmark_ids`: The list of benchmark ids to run evaluation on +- `model-id`: The model id to evaluate on +- `output_dir`: Path to store the evaluate results +``` +llama-stack-client eval run-benchmark ... \ +--model_id \ +--output_dir +``` + +You can run +``` +llama-stack-client eval run-benchmark help +``` +to see the description of all the flags that eval run-benchmark has + +In the output log, you can find the file path that has your evaluation results. Open that file and you can see you aggregate evaluation results over there. + +## Usage Example + +Here's a basic example of using the evaluation API: + +```python +from llama_stack_client import LlamaStackClient + +client = LlamaStackClient(base_url="http://localhost:8321") + +# Register a dataset for evaluation +client.datasets.register( + purpose="evaluation", + source={ + "type": "uri", + "uri": "huggingface://datasets/llamastack/evaluation_dataset" + }, + dataset_id="my_eval_dataset" +) + +# Run evaluation +eval_result = client.eval.run_evaluation( + dataset_id="my_eval_dataset", + scoring_functions=["accuracy", "bleu"], + model_id="my_model" +) + +print(f"Evaluation completed: {eval_result}") +``` + +## Best Practices + +- **Choose appropriate providers**: Use Meta Reference for comprehensive evaluation, NVIDIA for platform-specific needs +- **Configure storage properly**: Ensure your key-value store configuration matches your performance requirements +- **Monitor evaluation progress**: Large evaluations can take time - implement proper monitoring +- **Use appropriate scoring functions**: Select scoring metrics that align with your evaluation goals + +## What's Next? + +- Check out our Colab notebook on working examples with running benchmark evaluations [here](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/notebooks/Llama_Stack_Benchmark_Evals.ipynb#scrollTo=mxLCsP4MvFqP). +- Check out our [Building Applications - Evaluation](../building_applications/evals.mdx) guide for more details on how to use the Evaluation APIs to evaluate your applications. +- Check out our [Evaluation Reference](../references/evals_reference/index.mdx) for more details on the APIs. +- Explore the [Scoring](./scoring.mdx) documentation for available scoring functions. diff --git a/docs/docs/advanced_apis/post_training.mdx b/docs/docs/advanced_apis/post_training.mdx new file mode 100644 index 000000000..43359d741 --- /dev/null +++ b/docs/docs/advanced_apis/post_training.mdx @@ -0,0 +1,305 @@ +# Post-Training + +Post-training in Llama Stack allows you to fine-tune models using various providers and frameworks. This section covers all available post-training providers and how to use them effectively. + +## Overview + +Llama Stack provides multiple post-training providers: + +- **HuggingFace SFTTrainer** (`inline::huggingface`) - Fine-tuning using HuggingFace ecosystem +- **TorchTune** (`inline::torchtune`) - Fine-tuning using Meta's TorchTune framework +- **NVIDIA** (`remote::nvidia`) - Fine-tuning using NVIDIA's platform + +## HuggingFace SFTTrainer + +[HuggingFace SFTTrainer](https://huggingface.co/docs/trl/en/sft_trainer) is an inline post training provider for Llama Stack. It allows you to run supervised fine tuning on a variety of models using many datasets. + +### Features + +- Simple access through the post_training API +- Fully integrated with Llama Stack +- GPU support, CPU support, and MPS support (MacOS Metal Performance Shaders) + +### Configuration + +| Field | Type | Required | Default | Description | +|-------|------|----------|---------|-------------| +| `device` | `str` | No | cuda | | +| `distributed_backend` | `Literal['fsdp', 'deepspeed']` | No | | | +| `checkpoint_format` | `Literal['full_state', 'huggingface']` | No | huggingface | | +| `chat_template` | `str` | No | | +| `model_specific_config` | `dict` | No | `{'trust_remote_code': True, 'attn_implementation': 'sdpa'}` | | +| `max_seq_length` | `int` | No | 2048 | | +| `gradient_checkpointing` | `bool` | No | False | | +| `save_total_limit` | `int` | No | 3 | | +| `logging_steps` | `int` | No | 10 | | +| `warmup_ratio` | `float` | No | 0.1 | | +| `weight_decay` | `float` | No | 0.01 | | +| `dataloader_num_workers` | `int` | No | 4 | | +| `dataloader_pin_memory` | `bool` | No | True | | + +### Sample Configuration + +```yaml +checkpoint_format: huggingface +distributed_backend: null +device: cpu +``` + +### Setup + +You can access the HuggingFace trainer via the `starter` distribution: + +```bash +llama stack build --distro starter --image-type venv +llama stack run --image-type venv ~/.llama/distributions/starter/starter-run.yaml +``` + +### Usage Example + +```python +import time +import uuid + +from llama_stack_client.types import ( + post_training_supervised_fine_tune_params, + algorithm_config_param, +) + +def create_http_client(): + from llama_stack_client import LlamaStackClient + return LlamaStackClient(base_url="http://localhost:8321") + +client = create_http_client() + +# Example Dataset +client.datasets.register( + purpose="post-training/messages", + source={ + "type": "uri", + "uri": "huggingface://datasets/llamastack/simpleqa?split=train", + }, + dataset_id="simpleqa", +) + +training_config = post_training_supervised_fine_tune_params.TrainingConfig( + data_config=post_training_supervised_fine_tune_params.TrainingConfigDataConfig( + batch_size=32, + data_format="instruct", + dataset_id="simpleqa", + shuffle=True, + ), + gradient_accumulation_steps=1, + max_steps_per_epoch=0, + max_validation_steps=1, + n_epochs=4, +) + +algorithm_config = algorithm_config_param.LoraFinetuningConfig( + alpha=1, + apply_lora_to_mlp=True, + apply_lora_to_output=False, + lora_attn_modules=["q_proj"], + rank=1, + type="LoRA", +) + +job_uuid = f"test-job{uuid.uuid4()}" + +# Example Model +training_model = "ibm-granite/granite-3.3-8b-instruct" + +start_time = time.time() +response = client.post_training.supervised_fine_tune( + job_uuid=job_uuid, + logger_config={}, + model=training_model, + hyperparam_search_config={}, + training_config=training_config, + algorithm_config=algorithm_config, + checkpoint_dir="output", +) +print("Job: ", job_uuid) + +# Wait for the job to complete! +while True: + status = client.post_training.job.status(job_uuid=job_uuid) + if not status: + print("Job not found") + break + + print(status) + if status.status == "completed": + break + + print("Waiting for job to complete...") + time.sleep(5) + +end_time = time.time() +print("Job completed in", end_time - start_time, "seconds!") + +print("Artifacts:") +print(client.post_training.job.artifacts(job_uuid=job_uuid)) +``` + +## TorchTune + +[TorchTune](https://github.com/pytorch/torchtune) is an inline post training provider for Llama Stack. It provides a simple and efficient way to fine-tune language models using PyTorch. + +### Features + +- Simple access through the post_training API +- Fully integrated with Llama Stack +- GPU support and single device capabilities +- Support for LoRA + +### Configuration + +| Field | Type | Required | Default | Description | +|-------|------|----------|---------|-------------| +| `torch_seed` | `int \| None` | No | | | +| `checkpoint_format` | `Literal['meta', 'huggingface']` | No | meta | | + +### Sample Configuration + +```yaml +checkpoint_format: meta +``` + +### Setup + +You can access the TorchTune trainer by writing your own yaml pointing to the provider: + +```yaml +post_training: + - provider_id: torchtune + provider_type: inline::torchtune + config: {} +``` + +You can then build and run your own stack with this provider. + +### Usage Example + +```python +import time +import uuid + +from llama_stack_client.types import ( + post_training_supervised_fine_tune_params, + algorithm_config_param, +) + +def create_http_client(): + from llama_stack_client import LlamaStackClient + return LlamaStackClient(base_url="http://localhost:8321") + +client = create_http_client() + +# Example Dataset +client.datasets.register( + purpose="post-training/messages", + source={ + "type": "uri", + "uri": "huggingface://datasets/llamastack/simpleqa?split=train", + }, + dataset_id="simpleqa", +) + +training_config = post_training_supervised_fine_tune_params.TrainingConfig( + data_config=post_training_supervised_fine_tune_params.TrainingConfigDataConfig( + batch_size=32, + data_format="instruct", + dataset_id="simpleqa", + shuffle=True, + ), + gradient_accumulation_steps=1, + max_steps_per_epoch=0, + max_validation_steps=1, + n_epochs=4, +) + +algorithm_config = algorithm_config_param.LoraFinetuningConfig( + alpha=1, + apply_lora_to_mlp=True, + apply_lora_to_output=False, + lora_attn_modules=["q_proj"], + rank=1, + type="LoRA", +) + +job_uuid = f"test-job{uuid.uuid4()}" + +# Example Model +training_model = "meta-llama/Llama-2-7b-hf" + +start_time = time.time() +response = client.post_training.supervised_fine_tune( + job_uuid=job_uuid, + logger_config={}, + model=training_model, + hyperparam_search_config={}, + training_config=training_config, + algorithm_config=algorithm_config, + checkpoint_dir="output", +) +print("Job: ", job_uuid) + +# Wait for the job to complete! +while True: + status = client.post_training.job.status(job_uuid=job_uuid) + if not status: + print("Job not found") + break + + print(status) + if status.status == "completed": + break + + print("Waiting for job to complete...") + time.sleep(5) + +end_time = time.time() +print("Job completed in", end_time - start_time, "seconds!") + +print("Artifacts:") +print(client.post_training.job.artifacts(job_uuid=job_uuid)) +``` + +## NVIDIA + +NVIDIA's post-training provider for fine-tuning models on NVIDIA's platform. + +### Configuration + +| Field | Type | Required | Default | Description | +|-------|------|----------|---------|-------------| +| `api_key` | `str \| None` | No | | The NVIDIA API key. | +| `dataset_namespace` | `str \| None` | No | default | The NVIDIA dataset namespace. | +| `project_id` | `str \| None` | No | test-example-model@v1 | The NVIDIA project ID. | +| `customizer_url` | `str \| None` | No | | Base URL for the NeMo Customizer API | +| `timeout` | `int` | No | 300 | Timeout for the NVIDIA Post Training API | +| `max_retries` | `int` | No | 3 | Maximum number of retries for the NVIDIA Post Training API | +| `output_model_dir` | `str` | No | test-example-model@v1 | Directory to save the output model | + +### Sample Configuration + +```yaml +api_key: ${env.NVIDIA_API_KEY:=} +dataset_namespace: ${env.NVIDIA_DATASET_NAMESPACE:=default} +project_id: ${env.NVIDIA_PROJECT_ID:=test-project} +customizer_url: ${env.NVIDIA_CUSTOMIZER_URL:=http://nemo.test} +``` + +## Best Practices + +- **Choose the right provider**: Use HuggingFace for broader compatibility, TorchTune for Meta models, or NVIDIA for their ecosystem +- **Configure hardware appropriately**: Ensure your configuration matches your available hardware (CPU, GPU, MPS) +- **Monitor jobs**: Always monitor job status and handle completion appropriately +- **Use appropriate datasets**: Ensure your dataset format matches the expected input format for your chosen provider + +## Next Steps + +- Check out the [Building Applications - Fine-tuning](../building_applications/index.mdx) guide for application-level examples +- See the [Providers](../providers/post_training/index.mdx) section for detailed provider documentation +- Review the [API Reference](../api_reference/post_training.mdx) for complete API documentation diff --git a/docs/docs/advanced_apis/scoring.mdx b/docs/docs/advanced_apis/scoring.mdx new file mode 100644 index 000000000..15c09fa8a --- /dev/null +++ b/docs/docs/advanced_apis/scoring.mdx @@ -0,0 +1,193 @@ +# Scoring + +The Scoring API in Llama Stack allows you to evaluate outputs of your GenAI system using various scoring functions and metrics. This section covers all available scoring providers and their configuration. + +## Overview + +Llama Stack provides multiple scoring providers: + +- **Basic** (`inline::basic`) - Simple evaluation metrics and scoring functions +- **Braintrust** (`inline::braintrust`) - Advanced evaluation using the Braintrust platform +- **LLM-as-Judge** (`inline::llm-as-judge`) - Uses language models to evaluate responses + +The Scoring API is associated with `ScoringFunction` resources and provides a suite of out-of-the-box scoring functions. You can also add custom evaluators to meet specific evaluation needs. + +## Basic Scoring + +Basic scoring provider for simple evaluation metrics and scoring functions. This provider offers fundamental scoring capabilities without external dependencies. + +### Configuration + +No configuration required - this provider works out of the box. + +```yaml +{} +``` + +### Features + +- Simple evaluation metrics (accuracy, precision, recall, F1-score) +- String matching and similarity metrics +- Basic statistical scoring functions +- No external dependencies required +- Fast execution for standard metrics + +### Use Cases + +- Quick evaluation of basic accuracy metrics +- String similarity comparisons +- Statistical analysis of model outputs +- Development and testing scenarios + +## Braintrust + +Braintrust scoring provider for evaluation and scoring using the [Braintrust platform](https://braintrustdata.com/). Braintrust provides advanced evaluation capabilities and experiment tracking. + +### Configuration + +| Field | Type | Required | Default | Description | +|-------|------|----------|---------|-------------| +| `openai_api_key` | `str \| None` | No | | The OpenAI API Key for LLM-powered evaluations | + +### Sample Configuration + +```yaml +openai_api_key: ${env.OPENAI_API_KEY:=} +``` + +### Features + +- Advanced evaluation metrics +- Experiment tracking and comparison +- LLM-powered evaluation functions +- Integration with Braintrust's evaluation suite +- Detailed scoring analytics and insights + +### Use Cases + +- Production evaluation pipelines +- A/B testing of model versions +- Advanced scoring with custom metrics +- Detailed evaluation reporting and analysis + +## LLM-as-Judge + +LLM-as-judge scoring provider that uses language models to evaluate and score responses. This approach leverages the reasoning capabilities of large language models to assess quality, relevance, and other subjective metrics. + +### Configuration + +No configuration required - this provider works out of the box. + +```yaml +{} +``` + +### Features + +- Subjective quality evaluation using LLMs +- Flexible evaluation criteria definition +- Natural language evaluation explanations +- Support for complex evaluation scenarios +- Contextual understanding of responses + +### Use Cases + +- Evaluating response quality and relevance +- Assessing creativity and coherence +- Subjective metric evaluation +- Human-like judgment for complex tasks + +## Usage Examples + +### Basic Scoring Example + +```python +from llama_stack_client import LlamaStackClient + +client = LlamaStackClient(base_url="http://localhost:8321") + +# Register a basic accuracy scoring function +client.scoring_functions.register( + scoring_function_id="basic_accuracy", + provider_id="basic", + provider_scoring_function_id="accuracy" +) + +# Use the scoring function +result = client.scoring.score( + input_rows=[ + {"expected": "Paris", "actual": "Paris"}, + {"expected": "London", "actual": "Paris"} + ], + scoring_function_id="basic_accuracy" +) +print(f"Accuracy: {result.results[0].score}") +``` + +### LLM-as-Judge Example + +```python +# Register an LLM-as-judge scoring function +client.scoring_functions.register( + scoring_function_id="quality_judge", + provider_id="llm_judge", + provider_scoring_function_id="response_quality", + params={ + "criteria": "Evaluate response quality, relevance, and helpfulness", + "scale": "1-10" + } +) + +# Score responses using LLM judgment +result = client.scoring.score( + input_rows=[{ + "query": "What is machine learning?", + "response": "Machine learning is a subset of AI that enables computers to learn patterns from data..." + }], + scoring_function_id="quality_judge" +) +``` + +### Braintrust Integration Example + +```python +# Register a Braintrust scoring function +client.scoring_functions.register( + scoring_function_id="braintrust_eval", + provider_id="braintrust", + provider_scoring_function_id="semantic_similarity" +) + +# Run evaluation with Braintrust +result = client.scoring.score( + input_rows=[{ + "reference": "The capital of France is Paris", + "candidate": "Paris is the capital city of France" + }], + scoring_function_id="braintrust_eval" +) +``` + +## Best Practices + +- **Choose appropriate providers**: Use Basic for simple metrics, Braintrust for advanced analytics, LLM-as-Judge for subjective evaluation +- **Define clear criteria**: When using LLM-as-Judge, provide specific evaluation criteria and scales +- **Validate scoring functions**: Test your scoring functions with known examples before production use +- **Monitor performance**: Track scoring performance and adjust thresholds based on results +- **Combine multiple metrics**: Use different scoring providers together for comprehensive evaluation + +## Integration with Evaluation + +The Scoring API works closely with the [Evaluation](./evaluation.mdx) API to provide comprehensive evaluation workflows: + +1. **Datasets** are loaded via the DatasetIO API +2. **Evaluation** generates model outputs using the Eval API +3. **Scoring** evaluates the quality of outputs using various scoring functions +4. **Results** are aggregated and reported for analysis + +## Next Steps + +- Check out the [Evaluation](./evaluation.mdx) guide for running complete evaluations +- See the [Building Applications - Evaluation](../building_applications/evals.mdx) guide for application examples +- Review the [Evaluation Reference](../references/evals_reference.mdx) for comprehensive scoring function usage +- Explore the [Evaluation Concepts](../concepts/evaluation_concepts.mdx) for detailed conceptual information diff --git a/docs/source/advanced_apis/eval/index.md b/docs/source/advanced_apis/eval/index.md deleted file mode 100644 index 330380670..000000000 --- a/docs/source/advanced_apis/eval/index.md +++ /dev/null @@ -1,6 +0,0 @@ -# Eval Providers - -This section contains documentation for all available providers for the **eval** API. - -- [inline::meta-reference](inline_meta-reference.md) -- [remote::nvidia](remote_nvidia.md) \ No newline at end of file diff --git a/docs/source/advanced_apis/eval/inline_meta-reference.md b/docs/source/advanced_apis/eval/inline_meta-reference.md deleted file mode 100644 index 5bec89cfc..000000000 --- a/docs/source/advanced_apis/eval/inline_meta-reference.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -orphan: true ---- - -# inline::meta-reference - -## Description - -Meta's reference implementation of evaluation tasks with support for multiple languages and evaluation metrics. - -## Configuration - -| Field | Type | Required | Default | Description | -|-------|------|----------|---------|-------------| -| `kvstore` | `utils.kvstore.config.RedisKVStoreConfig \| utils.kvstore.config.SqliteKVStoreConfig \| utils.kvstore.config.PostgresKVStoreConfig \| utils.kvstore.config.MongoDBKVStoreConfig` | No | sqlite | | - -## Sample Configuration - -```yaml -kvstore: - type: sqlite - db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/meta_reference_eval.db - -``` - diff --git a/docs/source/advanced_apis/eval/remote_nvidia.md b/docs/source/advanced_apis/eval/remote_nvidia.md deleted file mode 100644 index ab91767d6..000000000 --- a/docs/source/advanced_apis/eval/remote_nvidia.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -orphan: true ---- - -# remote::nvidia - -## Description - -NVIDIA's evaluation provider for running evaluation tasks on NVIDIA's platform. - -## Configuration - -| Field | Type | Required | Default | Description | -|-------|------|----------|---------|-------------| -| `evaluator_url` | `` | No | http://0.0.0.0:7331 | The url for accessing the evaluator service | - -## Sample Configuration - -```yaml -evaluator_url: ${env.NVIDIA_EVALUATOR_URL:=http://localhost:7331} - -``` - diff --git a/docs/source/advanced_apis/evaluation_concepts.md b/docs/source/advanced_apis/evaluation_concepts.md deleted file mode 100644 index 52ad53ece..000000000 --- a/docs/source/advanced_apis/evaluation_concepts.md +++ /dev/null @@ -1,77 +0,0 @@ -## Evaluation Concepts - -The Llama Stack Evaluation flow allows you to run evaluations on your GenAI application datasets or pre-registered benchmarks. - -We introduce a set of APIs in Llama Stack for supporting running evaluations of LLM applications. -- `/datasetio` + `/datasets` API -- `/scoring` + `/scoring_functions` API -- `/eval` + `/benchmarks` API - -This guide goes over the sets of APIs and developer experience flow of using Llama Stack to run evaluations for different use cases. Checkout our Colab notebook on working examples with evaluations [here](https://colab.research.google.com/drive/10CHyykee9j2OigaIcRv47BKG9mrNm0tJ?usp=sharing). - - -The Evaluation APIs are associated with a set of Resources. Please visit the Resources section in our [Core Concepts](../concepts/index.md) guide for better high-level understanding. - -- **DatasetIO**: defines interface with datasets and data loaders. - - Associated with `Dataset` resource. -- **Scoring**: evaluate outputs of the system. - - Associated with `ScoringFunction` resource. We provide a suite of out-of-the box scoring functions and also the ability for you to add custom evaluators. These scoring functions are the core part of defining an evaluation task to output evaluation metrics. -- **Eval**: generate outputs (via Inference or Agents) and perform scoring. - - Associated with `Benchmark` resource. - - -### Open-benchmark Eval - -#### List of open-benchmarks Llama Stack support - -Llama stack pre-registers several popular open-benchmarks to easily evaluate model perfomance via CLI. - -The list of open-benchmarks we currently support: -- [MMLU-COT](https://arxiv.org/abs/2009.03300) (Measuring Massive Multitask Language Understanding): Benchmark designed to comprehensively evaluate the breadth and depth of a model's academic and professional understanding -- [GPQA-COT](https://arxiv.org/abs/2311.12022) (A Graduate-Level Google-Proof Q&A Benchmark): A challenging benchmark of 448 multiple-choice questions written by domain experts in biology, physics, and chemistry. -- [SimpleQA](https://openai.com/index/introducing-simpleqa/): Benchmark designed to access models to answer short, fact-seeking questions. -- [MMMU](https://arxiv.org/abs/2311.16502) (A Massive Multi-discipline Multimodal Understanding and Reasoning Benchmark for Expert AGI)]: Benchmark designed to evaluate multimodal models. - - -You can follow this [contributing guide](../references/evals_reference/index.md#open-benchmark-contributing-guide) to add more open-benchmarks to Llama Stack - -#### Run evaluation on open-benchmarks via CLI - -We have built-in functionality to run the supported open-benckmarks using llama-stack-client CLI - -#### Spin up Llama Stack server - -Spin up llama stack server with 'open-benchmark' template -``` -llama stack run llama_stack/distributions/open-benchmark/run.yaml - -``` - -#### Run eval CLI -There are 3 necessary inputs to run a benchmark eval -- `list of benchmark_ids`: The list of benchmark ids to run evaluation on -- `model-id`: The model id to evaluate on -- `output_dir`: Path to store the evaluate results -``` -llama-stack-client eval run-benchmark ... \ ---model_id \ ---output_dir \ -``` - -You can run -``` -llama-stack-client eval run-benchmark help -``` -to see the description of all the flags that eval run-benchmark has - - -In the output log, you can find the file path that has your evaluation results. Open that file and you can see you aggregate -evaluation results over there. - - - -#### What's Next? - -- Check out our Colab notebook on working examples with running benchmark evaluations [here](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/notebooks/Llama_Stack_Benchmark_Evals.ipynb#scrollTo=mxLCsP4MvFqP). -- Check out our [Building Applications - Evaluation](../building_applications/evals.md) guide for more details on how to use the Evaluation APIs to evaluate your applications. -- Check out our [Evaluation Reference](../references/evals_reference/index.md) for more details on the APIs. diff --git a/docs/source/advanced_apis/index.md b/docs/source/advanced_apis/index.md deleted file mode 100644 index b10672c29..000000000 --- a/docs/source/advanced_apis/index.md +++ /dev/null @@ -1,33 +0,0 @@ -# Advanced APIs - -## Post-training -Fine-tunes a model. - -```{toctree} -:maxdepth: 1 - -post_training/index -``` - -## Eval -Generates outputs (via Inference or Agents) and perform scoring. - -```{toctree} -:maxdepth: 1 - -eval/index -``` - -```{include} evaluation_concepts.md -:start-after: ## Evaluation Concepts -``` - -## Scoring -Evaluates the outputs of the system. - -```{toctree} -:maxdepth: 1 - -scoring/index -``` - diff --git a/docs/source/advanced_apis/post_training/huggingface.md b/docs/source/advanced_apis/post_training/huggingface.md deleted file mode 100644 index a7609d6da..000000000 --- a/docs/source/advanced_apis/post_training/huggingface.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -orphan: true ---- -# HuggingFace SFTTrainer - -[HuggingFace SFTTrainer](https://huggingface.co/docs/trl/en/sft_trainer) is an inline post training provider for Llama Stack. It allows you to run supervised fine tuning on a variety of models using many datasets - -## Features - -- Simple access through the post_training API -- Fully integrated with Llama Stack -- GPU support, CPU support, and MPS support (MacOS Metal Performance Shaders) - -## Usage - -To use the HF SFTTrainer in your Llama Stack project, follow these steps: - -1. Configure your Llama Stack project to use this provider. -2. Kick off a SFT job using the Llama Stack post_training API. - -## Setup - -You can access the HuggingFace trainer via the `ollama` distribution: - -```bash -llama stack build --distro starter --image-type venv -llama stack run --image-type venv ~/.llama/distributions/ollama/ollama-run.yaml -``` - -## Run Training - -You can access the provider and the `supervised_fine_tune` method via the post_training API: - -```python -import time -import uuid - - -from llama_stack_client.types import ( - post_training_supervised_fine_tune_params, - algorithm_config_param, -) - - -def create_http_client(): - from llama_stack_client import LlamaStackClient - - return LlamaStackClient(base_url="http://localhost:8321") - - -client = create_http_client() - -# Example Dataset -client.datasets.register( - purpose="post-training/messages", - source={ - "type": "uri", - "uri": "huggingface://datasets/llamastack/simpleqa?split=train", - }, - dataset_id="simpleqa", -) - -training_config = post_training_supervised_fine_tune_params.TrainingConfig( - data_config=post_training_supervised_fine_tune_params.TrainingConfigDataConfig( - batch_size=32, - data_format="instruct", - dataset_id="simpleqa", - shuffle=True, - ), - gradient_accumulation_steps=1, - max_steps_per_epoch=0, - max_validation_steps=1, - n_epochs=4, -) - -algorithm_config = algorithm_config_param.LoraFinetuningConfig( # this config is also currently mandatory but should not be - alpha=1, - apply_lora_to_mlp=True, - apply_lora_to_output=False, - lora_attn_modules=["q_proj"], - rank=1, - type="LoRA", -) - -job_uuid = f"test-job{uuid.uuid4()}" - -# Example Model -training_model = "ibm-granite/granite-3.3-8b-instruct" - -start_time = time.time() -response = client.post_training.supervised_fine_tune( - job_uuid=job_uuid, - logger_config={}, - model=training_model, - hyperparam_search_config={}, - training_config=training_config, - algorithm_config=algorithm_config, - checkpoint_dir="output", -) -print("Job: ", job_uuid) - - -# Wait for the job to complete! -while True: - status = client.post_training.job.status(job_uuid=job_uuid) - if not status: - print("Job not found") - break - - print(status) - if status.status == "completed": - break - - print("Waiting for job to complete...") - time.sleep(5) - -end_time = time.time() -print("Job completed in", end_time - start_time, "seconds!") - -print("Artifacts:") -print(client.post_training.job.artifacts(job_uuid=job_uuid)) -``` diff --git a/docs/source/advanced_apis/post_training/index.md b/docs/source/advanced_apis/post_training/index.md deleted file mode 100644 index 35d10d14b..000000000 --- a/docs/source/advanced_apis/post_training/index.md +++ /dev/null @@ -1,7 +0,0 @@ -# Post_Training Providers - -This section contains documentation for all available providers for the **post_training** API. - -- [inline::huggingface](inline_huggingface.md) -- [inline::torchtune](inline_torchtune.md) -- [remote::nvidia](remote_nvidia.md) \ No newline at end of file diff --git a/docs/source/advanced_apis/post_training/inline_huggingface.md b/docs/source/advanced_apis/post_training/inline_huggingface.md deleted file mode 100644 index 6536b4f8c..000000000 --- a/docs/source/advanced_apis/post_training/inline_huggingface.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -orphan: true ---- - -# inline::huggingface - -## Description - -HuggingFace-based post-training provider for fine-tuning models using the HuggingFace ecosystem. - -## Configuration - -| Field | Type | Required | Default | Description | -|-------|------|----------|---------|-------------| -| `device` | `` | No | cuda | | -| `distributed_backend` | `Literal['fsdp', 'deepspeed'` | No | | | -| `checkpoint_format` | `Literal['full_state', 'huggingface'` | No | huggingface | | -| `chat_template` | `` | No | | -| `model_specific_config` | `` | No | {'trust_remote_code': True, 'attn_implementation': 'sdpa'} | | -| `max_seq_length` | `` | No | 2048 | | -| `gradient_checkpointing` | `` | No | False | | -| `save_total_limit` | `` | No | 3 | | -| `logging_steps` | `` | No | 10 | | -| `warmup_ratio` | `` | No | 0.1 | | -| `weight_decay` | `` | No | 0.01 | | -| `dataloader_num_workers` | `` | No | 4 | | -| `dataloader_pin_memory` | `` | No | True | | - -## Sample Configuration - -```yaml -checkpoint_format: huggingface -distributed_backend: null -device: cpu - -``` - -[Find more detailed information here!](huggingface.md) - - diff --git a/docs/source/advanced_apis/post_training/inline_torchtune.md b/docs/source/advanced_apis/post_training/inline_torchtune.md deleted file mode 100644 index 617975b0d..000000000 --- a/docs/source/advanced_apis/post_training/inline_torchtune.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -orphan: true ---- - -# inline::torchtune - -## Description - -TorchTune-based post-training provider for fine-tuning and optimizing models using Meta's TorchTune framework. - -## Configuration - -| Field | Type | Required | Default | Description | -|-------|------|----------|---------|-------------| -| `torch_seed` | `int \| None` | No | | | -| `checkpoint_format` | `Literal['meta', 'huggingface'` | No | meta | | - -## Sample Configuration - -```yaml -checkpoint_format: meta - -``` - -[Find more detailed information here!](torchtune.md) diff --git a/docs/source/advanced_apis/post_training/nvidia_nemo.md b/docs/source/advanced_apis/post_training/nvidia_nemo.md deleted file mode 100644 index 1a7adbe16..000000000 --- a/docs/source/advanced_apis/post_training/nvidia_nemo.md +++ /dev/null @@ -1,163 +0,0 @@ ---- -orphan: true ---- -# NVIDIA NEMO - -[NVIDIA NEMO](https://developer.nvidia.com/nemo-framework) is a remote post training provider for Llama Stack. It provides enterprise-grade fine-tuning capabilities through NVIDIA's NeMo Customizer service. - -## Features - -- Enterprise-grade fine-tuning capabilities -- Support for LoRA and SFT fine-tuning -- Integration with NVIDIA's NeMo Customizer service -- Support for various NVIDIA-optimized models -- Efficient training with NVIDIA hardware acceleration - -## Usage - -To use NVIDIA NEMO in your Llama Stack project, follow these steps: - -1. Configure your Llama Stack project to use this provider. -2. Set up your NVIDIA API credentials. -3. Kick off a fine-tuning job using the Llama Stack post_training API. - -## Setup - -You'll need to set the following environment variables: - -```bash -export NVIDIA_API_KEY="your-api-key" -export NVIDIA_DATASET_NAMESPACE="default" -export NVIDIA_CUSTOMIZER_URL="your-customizer-url" -export NVIDIA_PROJECT_ID="your-project-id" -export NVIDIA_OUTPUT_MODEL_DIR="your-output-model-dir" -``` - -## Run Training - -You can access the provider and the `supervised_fine_tune` method via the post_training API: - -```python -import time -import uuid - -from llama_stack_client.types import ( - post_training_supervised_fine_tune_params, - algorithm_config_param, -) - - -def create_http_client(): - from llama_stack_client import LlamaStackClient - - return LlamaStackClient(base_url="http://localhost:8321") - - -client = create_http_client() - -# Example Dataset -client.datasets.register( - purpose="post-training/messages", - source={ - "type": "uri", - "uri": "huggingface://datasets/llamastack/simpleqa?split=train", - }, - dataset_id="simpleqa", -) - -training_config = post_training_supervised_fine_tune_params.TrainingConfig( - data_config=post_training_supervised_fine_tune_params.TrainingConfigDataConfig( - batch_size=8, # Default batch size for NEMO - data_format="instruct", - dataset_id="simpleqa", - shuffle=True, - ), - n_epochs=50, # Default epochs for NEMO - optimizer_config=post_training_supervised_fine_tune_params.TrainingConfigOptimizerConfig( - lr=0.0001, # Default learning rate - weight_decay=0.01, # NEMO-specific parameter - ), - # NEMO-specific parameters - log_every_n_steps=None, - val_check_interval=0.25, - sequence_packing_enabled=False, - hidden_dropout=None, - attention_dropout=None, - ffn_dropout=None, -) - -algorithm_config = algorithm_config_param.LoraFinetuningConfig( - alpha=16, # Default alpha for NEMO - type="LoRA", -) - -job_uuid = f"test-job{uuid.uuid4()}" - -# Example Model - must be a supported NEMO model -training_model = "meta/llama-3.1-8b-instruct" - -start_time = time.time() -response = client.post_training.supervised_fine_tune( - job_uuid=job_uuid, - logger_config={}, - model=training_model, - hyperparam_search_config={}, - training_config=training_config, - algorithm_config=algorithm_config, - checkpoint_dir="output", -) -print("Job: ", job_uuid) - -# Wait for the job to complete! -while True: - status = client.post_training.job.status(job_uuid=job_uuid) - if not status: - print("Job not found") - break - - print(status) - if status.status == "completed": - break - - print("Waiting for job to complete...") - time.sleep(5) - -end_time = time.time() -print("Job completed in", end_time - start_time, "seconds!") - -print("Artifacts:") -print(client.post_training.job.artifacts(job_uuid=job_uuid)) -``` - -## Supported Models - -Currently supports the following models: -- meta/llama-3.1-8b-instruct -- meta/llama-3.2-1b-instruct - -## Supported Parameters - -### TrainingConfig -- n_epochs (default: 50) -- data_config -- optimizer_config -- log_every_n_steps -- val_check_interval (default: 0.25) -- sequence_packing_enabled (default: False) -- hidden_dropout (0.0-1.0) -- attention_dropout (0.0-1.0) -- ffn_dropout (0.0-1.0) - -### DataConfig -- dataset_id -- batch_size (default: 8) - -### OptimizerConfig -- lr (default: 0.0001) -- weight_decay (default: 0.01) - -### LoRA Config -- alpha (default: 16) -- type (must be "LoRA") - -Note: Some parameters from the standard Llama Stack API are not supported and will be ignored with a warning. diff --git a/docs/source/advanced_apis/post_training/remote_nvidia.md b/docs/source/advanced_apis/post_training/remote_nvidia.md deleted file mode 100644 index 9840fa3c4..000000000 --- a/docs/source/advanced_apis/post_training/remote_nvidia.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -orphan: true ---- - -# remote::nvidia - -## Description - -NVIDIA's post-training provider for fine-tuning models on NVIDIA's platform. - -## Configuration - -| Field | Type | Required | Default | Description | -|-------|------|----------|---------|-------------| -| `api_key` | `str \| None` | No | | The NVIDIA API key. | -| `dataset_namespace` | `str \| None` | No | default | The NVIDIA dataset namespace. | -| `project_id` | `str \| None` | No | test-example-model@v1 | The NVIDIA project ID. | -| `customizer_url` | `str \| None` | No | | Base URL for the NeMo Customizer API | -| `timeout` | `` | No | 300 | Timeout for the NVIDIA Post Training API | -| `max_retries` | `` | No | 3 | Maximum number of retries for the NVIDIA Post Training API | -| `output_model_dir` | `` | No | test-example-model@v1 | Directory to save the output model | - -## Sample Configuration - -```yaml -api_key: ${env.NVIDIA_API_KEY:=} -dataset_namespace: ${env.NVIDIA_DATASET_NAMESPACE:=default} -project_id: ${env.NVIDIA_PROJECT_ID:=test-project} -customizer_url: ${env.NVIDIA_CUSTOMIZER_URL:=http://nemo.test} - -``` - diff --git a/docs/source/advanced_apis/post_training/torchtune.md b/docs/source/advanced_apis/post_training/torchtune.md deleted file mode 100644 index ef72505b1..000000000 --- a/docs/source/advanced_apis/post_training/torchtune.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -orphan: true ---- -# TorchTune - -[TorchTune](https://github.com/pytorch/torchtune) is an inline post training provider for Llama Stack. It provides a simple and efficient way to fine-tune language models using PyTorch. - -## Features - -- Simple access through the post_training API -- Fully integrated with Llama Stack -- GPU support and single device capabilities. -- Support for LoRA - -## Usage - -To use TorchTune in your Llama Stack project, follow these steps: - -1. Configure your Llama Stack project to use this provider. -2. Kick off a fine-tuning job using the Llama Stack post_training API. - -## Setup - -You can access the TorchTune trainer by writing your own yaml pointing to the provider: - -```yaml -post_training: - - provider_id: torchtune - provider_type: inline::torchtune - config: {} -``` - -you can then build and run your own stack with this provider. - -## Run Training - -You can access the provider and the `supervised_fine_tune` method via the post_training API: - -```python -import time -import uuid - -from llama_stack_client.types import ( - post_training_supervised_fine_tune_params, - algorithm_config_param, -) - - -def create_http_client(): - from llama_stack_client import LlamaStackClient - - return LlamaStackClient(base_url="http://localhost:8321") - - -client = create_http_client() - -# Example Dataset -client.datasets.register( - purpose="post-training/messages", - source={ - "type": "uri", - "uri": "huggingface://datasets/llamastack/simpleqa?split=train", - }, - dataset_id="simpleqa", -) - -training_config = post_training_supervised_fine_tune_params.TrainingConfig( - data_config=post_training_supervised_fine_tune_params.TrainingConfigDataConfig( - batch_size=32, - data_format="instruct", - dataset_id="simpleqa", - shuffle=True, - ), - gradient_accumulation_steps=1, - max_steps_per_epoch=0, - max_validation_steps=1, - n_epochs=4, -) - -algorithm_config = algorithm_config_param.LoraFinetuningConfig( - alpha=1, - apply_lora_to_mlp=True, - apply_lora_to_output=False, - lora_attn_modules=["q_proj"], - rank=1, - type="LoRA", -) - -job_uuid = f"test-job{uuid.uuid4()}" - -# Example Model -training_model = "meta-llama/Llama-2-7b-hf" - -start_time = time.time() -response = client.post_training.supervised_fine_tune( - job_uuid=job_uuid, - logger_config={}, - model=training_model, - hyperparam_search_config={}, - training_config=training_config, - algorithm_config=algorithm_config, - checkpoint_dir="output", -) -print("Job: ", job_uuid) - -# Wait for the job to complete! -while True: - status = client.post_training.job.status(job_uuid=job_uuid) - if not status: - print("Job not found") - break - - print(status) - if status.status == "completed": - break - - print("Waiting for job to complete...") - time.sleep(5) - -end_time = time.time() -print("Job completed in", end_time - start_time, "seconds!") - -print("Artifacts:") -print(client.post_training.job.artifacts(job_uuid=job_uuid)) -``` diff --git a/docs/source/advanced_apis/scoring/index.md b/docs/source/advanced_apis/scoring/index.md deleted file mode 100644 index 3cf7af537..000000000 --- a/docs/source/advanced_apis/scoring/index.md +++ /dev/null @@ -1,7 +0,0 @@ -# Scoring Providers - -This section contains documentation for all available providers for the **scoring** API. - -- [inline::basic](inline_basic.md) -- [inline::braintrust](inline_braintrust.md) -- [inline::llm-as-judge](inline_llm-as-judge.md) \ No newline at end of file diff --git a/docs/source/advanced_apis/scoring/inline_basic.md b/docs/source/advanced_apis/scoring/inline_basic.md deleted file mode 100644 index b56b36013..000000000 --- a/docs/source/advanced_apis/scoring/inline_basic.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -orphan: true ---- - -# inline::basic - -## Description - -Basic scoring provider for simple evaluation metrics and scoring functions. - -## Sample Configuration - -```yaml -{} - -``` - diff --git a/docs/source/advanced_apis/scoring/inline_braintrust.md b/docs/source/advanced_apis/scoring/inline_braintrust.md deleted file mode 100644 index d1278217c..000000000 --- a/docs/source/advanced_apis/scoring/inline_braintrust.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -orphan: true ---- - -# inline::braintrust - -## Description - -Braintrust scoring provider for evaluation and scoring using the Braintrust platform. - -## Configuration - -| Field | Type | Required | Default | Description | -|-------|------|----------|---------|-------------| -| `openai_api_key` | `str \| None` | No | | The OpenAI API Key | - -## Sample Configuration - -```yaml -openai_api_key: ${env.OPENAI_API_KEY:=} - -``` - diff --git a/docs/source/advanced_apis/scoring/inline_llm-as-judge.md b/docs/source/advanced_apis/scoring/inline_llm-as-judge.md deleted file mode 100644 index c7fcddf37..000000000 --- a/docs/source/advanced_apis/scoring/inline_llm-as-judge.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -orphan: true ---- - -# inline::llm-as-judge - -## Description - -LLM-as-judge scoring provider that uses language models to evaluate and score responses. - -## Sample Configuration - -```yaml -{} - -``` - From c71ce8df61ad9b58caf1c623cc93536c82a7ae1b Mon Sep 17 00:00:00 2001 From: Alexey Rybak <50731695+reluctantfuturist@users.noreply.github.com> Date: Wed, 24 Sep 2025 14:05:30 -0700 Subject: [PATCH 14/27] docs: concepts and building_applications migration (#3534) # What does this PR do? - Migrates the remaining documentation sections to the new documentation format ## Test Plan - Partial migration --- .../building_applications/agent.mdx} | 32 +- .../agent_execution_loop.mdx} | 64 ++- docs/docs/building_applications/evals.mdx | 256 ++++++++++++ docs/docs/building_applications/index.mdx | 83 ++++ .../docs/building_applications/playground.mdx | 299 +++++++++++++ .../building_applications/rag.mdx} | 185 +++++--- .../building_applications/rag.png | Bin .../responses_vs_agents.mdx} | 74 +++- docs/docs/building_applications/safety.mdx | 395 ++++++++++++++++++ docs/docs/building_applications/telemetry.mdx | 342 +++++++++++++++ .../building_applications/tools.mdx} | 156 +++++-- .../concepts/apis/api_leveling.mdx} | 9 +- .../concepts/apis/api_providers.mdx} | 9 +- .../concepts/apis/external.mdx} | 6 + .../apis.md => docs/concepts/apis/index.mdx} | 9 +- .../concepts/architecture.mdx} | 24 +- .../concepts/distributions.mdx} | 11 +- docs/docs/concepts/index.mdx | 43 ++ .../concepts/resources.mdx} | 15 +- docs/docs/contributing/index.mdx | 244 +++++++++++ .../contributing/new_api_provider.mdx} | 10 +- .../contributing/new_vector_database.mdx} | 12 +- .../contributing/testing/record-replay.mdx} | 12 +- docs/docs/deploying/aws_eks_deployment.mdx | 30 ++ docs/docs/deploying/index.mdx | 14 + .../deploying/kubernetes_deployment.mdx} | 127 +++--- .../distributions/building_distro.mdx} | 8 +- .../distributions/configuration.mdx} | 6 + .../distributions/customizing_run_yaml.mdx} | 8 +- .../distributions/eks/apply.sh | 0 .../distributions/eks/gp3-topology-aware.yaml | 0 .../distributions/importing_as_library.mdx} | 6 + docs/docs/distributions/index.mdx | 21 + .../distributions/k8s/apply.sh | 0 .../k8s/chroma-k8s.yaml.template | 0 .../k8s/hf-token-secret.yaml.template | 0 .../k8s/ingress-k8s.yaml.template | 0 .../k8s/postgres-k8s.yaml.template | 0 .../distributions/k8s/stack-configmap.yaml | 0 .../distributions/k8s/stack-k8s.yaml.template | 0 .../distributions/k8s/stack_run_config.yaml | 0 .../distributions/k8s/ui-k8s.yaml.template | 0 .../distributions/k8s/vllm-k8s.yaml.template | 0 .../k8s/vllm-safety-k8s.yaml.template | 0 .../distributions/list_of_distributions.mdx} | 7 + .../ondevice_distro/android_sdk.md | 0 .../distributions/ondevice_distro/ios_sdk.md | 0 .../remote_hosted_distro/index.mdx} | 0 .../remote_hosted_distro/watsonx.md | 0 .../self_hosted_distro/dell-tgi.md | 0 .../distributions/self_hosted_distro/dell.md | 0 .../self_hosted_distro/passthrough.md | 0 .../self_hosted_distro/starter.md | 0 .../starting_llama_stack_server.mdx} | 7 + .../getting_started/demo_script.py | 0 .../getting_started/detailed_tutorial.mdx} | 10 + .../getting_started/libraries.mdx} | 8 +- .../getting_started/quickstart.mdx} | 94 ++++- docs/docs/index.mdx | 101 +++++ .../references/evals_reference/index.mdx} | 51 +-- .../resources/eval-concept.png | Bin .../evals_reference/resources/eval-flow.png | Bin docs/docs/references/index.mdx | 12 + .../llama_cli_reference/download_models.md | 0 .../references/llama_cli_reference/index.md | 0 .../llama_stack_client_cli_reference.md | 0 .../references/python_sdk_reference/index.md | 0 docs/source/building_applications/evals.md | 125 ------ docs/source/building_applications/index.md | 33 -- .../building_applications/playground/index.md | 107 ----- docs/source/building_applications/safety.md | 17 - .../source/building_applications/telemetry.md | 143 ------- docs/source/concepts/index.md | 23 - docs/source/contributing/index.md | 39 -- docs/source/deploying/index.md | 4 - docs/source/distributions/index.md | 15 - .../self_hosted_distro/meta-reference-gpu.md | 125 ------ .../self_hosted_distro/nvidia.md | 171 -------- docs/source/getting_started/index.md | 13 - docs/source/index.md | 133 ------ docs/source/references/api_reference/index.md | 6 - docs/source/references/index.md | 18 - 82 files changed, 2535 insertions(+), 1237 deletions(-) rename docs/{source/building_applications/agent.md => docs/building_applications/agent.mdx} (70%) rename docs/{source/building_applications/agent_execution_loop.md => docs/building_applications/agent_execution_loop.mdx} (72%) create mode 100644 docs/docs/building_applications/evals.mdx create mode 100644 docs/docs/building_applications/index.mdx create mode 100644 docs/docs/building_applications/playground.mdx rename docs/{source/building_applications/rag.md => docs/building_applications/rag.mdx} (60%) rename docs/{source => docs}/building_applications/rag.png (100%) rename docs/{source/building_applications/responses_vs_agents.md => docs/building_applications/responses_vs_agents.mdx} (80%) create mode 100644 docs/docs/building_applications/safety.mdx create mode 100644 docs/docs/building_applications/telemetry.mdx rename docs/{source/building_applications/tools.md => docs/building_applications/tools.mdx} (66%) rename docs/{source/apis/api_leveling.md => docs/concepts/apis/api_leveling.mdx} (97%) rename docs/{source/concepts/api_providers.md => docs/concepts/apis/api_providers.mdx} (85%) rename docs/{source/apis/external.md => docs/concepts/apis/external.mdx} (98%) rename docs/{source/concepts/apis.md => docs/concepts/apis/index.mdx} (89%) rename docs/{source/concepts/architecture.md => docs/concepts/architecture.mdx} (85%) rename docs/{source/concepts/distributions.md => docs/concepts/distributions.mdx} (81%) create mode 100644 docs/docs/concepts/index.mdx rename docs/{source/concepts/resources.md => docs/concepts/resources.mdx} (85%) create mode 100644 docs/docs/contributing/index.mdx rename docs/{source/contributing/new_api_provider.md => docs/contributing/new_api_provider.mdx} (95%) rename docs/{source/contributing/new_vector_database.md => docs/contributing/new_vector_database.mdx} (95%) rename docs/{source/contributing/testing/record-replay.md => docs/contributing/testing/record-replay.mdx} (95%) create mode 100644 docs/docs/deploying/aws_eks_deployment.mdx create mode 100644 docs/docs/deploying/index.mdx rename docs/{source/deploying/kubernetes_deployment.md => docs/deploying/kubernetes_deployment.mdx} (51%) rename docs/{source/distributions/building_distro.md => docs/distributions/building_distro.mdx} (99%) rename docs/{source/distributions/configuration.md => docs/distributions/configuration.mdx} (99%) rename docs/{source/distributions/customizing_run_yaml.md => docs/distributions/customizing_run_yaml.mdx} (88%) rename docs/{source => docs}/distributions/eks/apply.sh (100%) rename docs/{source => docs}/distributions/eks/gp3-topology-aware.yaml (100%) rename docs/{source/distributions/importing_as_library.md => docs/distributions/importing_as_library.mdx} (86%) create mode 100644 docs/docs/distributions/index.mdx rename docs/{source => docs}/distributions/k8s/apply.sh (100%) rename docs/{source => docs}/distributions/k8s/chroma-k8s.yaml.template (100%) rename docs/{source => docs}/distributions/k8s/hf-token-secret.yaml.template (100%) rename docs/{source => docs}/distributions/k8s/ingress-k8s.yaml.template (100%) rename docs/{source => docs}/distributions/k8s/postgres-k8s.yaml.template (100%) rename docs/{source => docs}/distributions/k8s/stack-configmap.yaml (100%) rename docs/{source => docs}/distributions/k8s/stack-k8s.yaml.template (100%) rename docs/{source => docs}/distributions/k8s/stack_run_config.yaml (100%) rename docs/{source => docs}/distributions/k8s/ui-k8s.yaml.template (100%) rename docs/{source => docs}/distributions/k8s/vllm-k8s.yaml.template (100%) rename docs/{source => docs}/distributions/k8s/vllm-safety-k8s.yaml.template (100%) rename docs/{source/distributions/list_of_distributions.md => docs/distributions/list_of_distributions.mdx} (95%) rename docs/{source => docs}/distributions/ondevice_distro/android_sdk.md (100%) rename docs/{source => docs}/distributions/ondevice_distro/ios_sdk.md (100%) rename docs/{source/distributions/remote_hosted_distro/index.md => docs/distributions/remote_hosted_distro/index.mdx} (100%) rename docs/{source => docs}/distributions/remote_hosted_distro/watsonx.md (100%) rename docs/{source => docs}/distributions/self_hosted_distro/dell-tgi.md (100%) rename docs/{source => docs}/distributions/self_hosted_distro/dell.md (100%) rename docs/{source => docs}/distributions/self_hosted_distro/passthrough.md (100%) rename docs/{source => docs}/distributions/self_hosted_distro/starter.md (100%) rename docs/{source/distributions/starting_llama_stack_server.md => docs/distributions/starting_llama_stack_server.mdx} (84%) rename docs/{source => docs}/getting_started/demo_script.py (100%) rename docs/{source/getting_started/detailed_tutorial.md => docs/getting_started/detailed_tutorial.mdx} (99%) rename docs/{source/getting_started/libraries.md => docs/getting_started/libraries.mdx} (85%) rename docs/{source/getting_started/quickstart.md => docs/getting_started/quickstart.mdx} (65%) create mode 100644 docs/docs/index.mdx rename docs/{source/references/evals_reference/index.md => docs/references/evals_reference/index.mdx} (92%) rename docs/{source => docs}/references/evals_reference/resources/eval-concept.png (100%) rename docs/{source => docs}/references/evals_reference/resources/eval-flow.png (100%) create mode 100644 docs/docs/references/index.mdx rename docs/{source => docs}/references/llama_cli_reference/download_models.md (100%) rename docs/{source => docs}/references/llama_cli_reference/index.md (100%) rename docs/{source => docs}/references/llama_stack_client_cli_reference.md (100%) rename docs/{source => docs}/references/python_sdk_reference/index.md (100%) delete mode 100644 docs/source/building_applications/evals.md delete mode 100644 docs/source/building_applications/index.md delete mode 100644 docs/source/building_applications/playground/index.md delete mode 100644 docs/source/building_applications/safety.md delete mode 100644 docs/source/building_applications/telemetry.md delete mode 100644 docs/source/concepts/index.md delete mode 100644 docs/source/contributing/index.md delete mode 100644 docs/source/deploying/index.md delete mode 100644 docs/source/distributions/index.md delete mode 100644 docs/source/distributions/self_hosted_distro/meta-reference-gpu.md delete mode 100644 docs/source/distributions/self_hosted_distro/nvidia.md delete mode 100644 docs/source/getting_started/index.md delete mode 100644 docs/source/index.md delete mode 100644 docs/source/references/api_reference/index.md delete mode 100644 docs/source/references/index.md diff --git a/docs/source/building_applications/agent.md b/docs/docs/building_applications/agent.mdx similarity index 70% rename from docs/source/building_applications/agent.md rename to docs/docs/building_applications/agent.mdx index 6fcc46152..33e98ea8d 100644 --- a/docs/source/building_applications/agent.md +++ b/docs/docs/building_applications/agent.mdx @@ -1,9 +1,18 @@ +--- +title: Agents +description: Build powerful AI applications with the Llama Stack agent framework +sidebar_label: Agents +sidebar_position: 3 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + # Agents An Agent in Llama Stack is a powerful abstraction that allows you to build complex AI applications. -The Llama Stack agent framework is built on a modular architecture that allows for flexible and powerful AI -applications. This document explains the key components and how they work together. +The Llama Stack agent framework is built on a modular architecture that allows for flexible and powerful AI applications. This document explains the key components and how they work together. ## Core Concepts @@ -19,7 +28,6 @@ Agents are configured using the `AgentConfig` class, which includes: ```python from llama_stack_client import Agent - # Create the agent agent = Agent( llama_stack_client, @@ -46,6 +54,9 @@ Each interaction with an agent is called a "turn" and consists of: - **Steps**: The agent's internal processing (inference, tool execution, etc.) - **Output Message**: The agent's response + + + ```python from llama_stack_client import AgentEventLogger @@ -57,9 +68,9 @@ turn_response = agent.create_turn( for log in AgentEventLogger().log(turn_response): log.print() ``` -### Non-Streaming - + + ```python from rich.pretty import pprint @@ -78,6 +89,9 @@ print("Steps:") pprint(response.steps) ``` + + + ### 4. Steps Each turn consists of multiple steps that represent the agent's thought process: @@ -88,5 +102,11 @@ Each turn consists of multiple steps that represent the agent's thought process: ## Agent Execution Loop +Refer to the [Agent Execution Loop](./agent_execution_loop) for more details on what happens within an agent turn. -Refer to the [Agent Execution Loop](agent_execution_loop) for more details on what happens within an agent turn. +## Related Resources + +- **[Agent Execution Loop](./agent_execution_loop)** - Understanding the internal processing flow +- **[RAG (Retrieval Augmented Generation)](./rag)** - Building knowledge-enhanced agents +- **[Tools Integration](./tools)** - Extending agent capabilities with external tools +- **[Safety Guardrails](./safety)** - Implementing responsible AI practices diff --git a/docs/source/building_applications/agent_execution_loop.md b/docs/docs/building_applications/agent_execution_loop.mdx similarity index 72% rename from docs/source/building_applications/agent_execution_loop.md rename to docs/docs/building_applications/agent_execution_loop.mdx index d66448449..458e997da 100644 --- a/docs/source/building_applications/agent_execution_loop.md +++ b/docs/docs/building_applications/agent_execution_loop.mdx @@ -1,10 +1,18 @@ -## Agent Execution Loop +--- +title: Agent Execution Loop +description: Understanding the internal processing flow of Llama Stack agents +sidebar_label: Agent Execution Loop +sidebar_position: 4 +--- -Agents are the heart of Llama Stack applications. They combine inference, memory, safety, and tool usage into coherent -workflows. At its core, an agent follows a sophisticated execution loop that enables multi-step reasoning, tool usage, -and safety checks. +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; -### Steps in the Agent Workflow +# Agent Execution Loop + +Agents are the heart of Llama Stack applications. They combine inference, memory, safety, and tool usage into coherent workflows. At its core, an agent follows a sophisticated execution loop that enables multi-step reasoning, tool usage, and safety checks. + +## Steps in the Agent Workflow Each agent turn follows these key steps: @@ -17,7 +25,7 @@ Each agent turn follows these key steps: 3. **Inference Loop**: The agent enters its main execution loop: - The LLM receives a user prompt (with previous tool outputs) - - The LLM generates a response, potentially with [tool calls](tools) + - The LLM generates a response, potentially with [tool calls](./tools) - If tool calls are present: - Tool inputs are safety-checked - Tools are executed (e.g., web search, code execution) @@ -29,7 +37,9 @@ Each agent turn follows these key steps: 4. **Final Safety Check**: The agent's final response is screened through safety shields -```{mermaid} +## Execution Flow Diagram + +```mermaid sequenceDiagram participant U as User participant E as Executor @@ -70,12 +80,15 @@ sequenceDiagram Each step in this process can be monitored and controlled through configurations. -### Agent Execution Loop Example +## Agent Execution Example + Here's an example that demonstrates monitoring the agent's execution: + + + ```python from llama_stack_client import LlamaStackClient, Agent, AgentEventLogger -from rich.pretty import pprint # Replace host and port client = LlamaStackClient(base_url=f"http://{HOST}:{PORT}") @@ -120,6 +133,13 @@ response = agent.create_turn( # Monitor each step of execution for log in AgentEventLogger().log(response): log.print() +``` + + + + +```python +from rich.pretty import pprint # Using non-streaming API, the response contains input, steps, and output. response = agent.create_turn( @@ -131,9 +151,35 @@ response = agent.create_turn( } ], session_id=session_id, + stream=False, ) pprint(f"Input: {response.input_messages}") pprint(f"Output: {response.output_message.content}") pprint(f"Steps: {response.steps}") ``` + + + + +## Key Configuration Options + +### Loop Control +- **max_infer_iters**: Maximum number of inference iterations (default: 5) +- **max_tokens**: Token limit for responses +- **temperature**: Controls response randomness + +### Safety Configuration +- **input_shields**: Safety checks for user input +- **output_shields**: Safety checks for agent responses + +### Tool Integration +- **tools**: List of available tools for the agent +- **tool_choice**: Control over when tools are used + +## Related Resources + +- **[Agents](./agent)** - Understanding agent fundamentals +- **[Tools Integration](./tools)** - Adding capabilities to agents +- **[Safety Guardrails](./safety)** - Implementing safety measures +- **[RAG (Retrieval Augmented Generation)](./rag)** - Building knowledge-enhanced workflows diff --git a/docs/docs/building_applications/evals.mdx b/docs/docs/building_applications/evals.mdx new file mode 100644 index 000000000..899c75dd4 --- /dev/null +++ b/docs/docs/building_applications/evals.mdx @@ -0,0 +1,256 @@ +--- +title: Evaluations +description: Evaluate LLM applications with Llama Stack's comprehensive evaluation framework +sidebar_label: Evaluations +sidebar_position: 7 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +This guide walks you through the process of evaluating an LLM application built using Llama Stack. For detailed API reference, check out the [Evaluation Reference](/docs/references/evals-reference) guide that covers the complete set of APIs and developer experience flow. + +:::tip[Interactive Examples] +Check out our [Colab notebook](https://colab.research.google.com/drive/10CHyykee9j2OigaIcRv47BKG9mrNm0tJ?usp=sharing) for working examples with evaluations, or try the [Getting Started notebook](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb). +::: + +## Application Evaluation Example + +[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb) + +Llama Stack offers a library of scoring functions and the `/scoring` API, allowing you to run evaluations on your pre-annotated AI application datasets. + +In this example, we will show you how to: +1. **Build an Agent** with Llama Stack +2. **Query the agent's sessions, turns, and steps** to analyze execution +3. **Evaluate the results** using scoring functions + +## Step-by-Step Evaluation Process + +### 1. Building a Search Agent + +First, let's create an agent that can search the web to answer questions: + +```python +from llama_stack_client import LlamaStackClient, Agent, AgentEventLogger + +client = LlamaStackClient(base_url=f"http://{HOST}:{PORT}") + +agent = Agent( + client, + model="meta-llama/Llama-3.3-70B-Instruct", + instructions="You are a helpful assistant. Use search tool to answer the questions.", + tools=["builtin::websearch"], +) + +# Test prompts for evaluation +user_prompts = [ + "Which teams played in the NBA Western Conference Finals of 2024. Search the web for the answer.", + "In which episode and season of South Park does Bill Cosby (BSM-471) first appear? Give me the number and title. Search the web for the answer.", + "What is the British-American kickboxer Andrew Tate's kickboxing name? Search the web for the answer.", +] + +session_id = agent.create_session("test-session") + +# Execute all prompts in the session +for prompt in user_prompts: + response = agent.create_turn( + messages=[ + { + "role": "user", + "content": prompt, + } + ], + session_id=session_id, + ) + + for log in AgentEventLogger().log(response): + log.print() +``` + +### 2. Query Agent Execution Steps + +Now, let's analyze the agent's execution steps to understand its performance: + + + + +```python +from rich.pretty import pprint + +# Query the agent's session to get detailed execution data +session_response = client.agents.session.retrieve( + session_id=session_id, + agent_id=agent.agent_id, +) + +pprint(session_response) +``` + + + + +```python +# Sanity check: Verify that all user prompts are followed by tool calls +num_tool_call = 0 +for turn in session_response.turns: + for step in turn.steps: + if ( + step.step_type == "tool_execution" + and step.tool_calls[0].tool_name == "brave_search" + ): + num_tool_call += 1 + +print( + f"{num_tool_call}/{len(session_response.turns)} user prompts are followed by a tool call to `brave_search`" +) +``` + + + + +### 3. Evaluate Agent Responses + +Now we'll evaluate the agent's responses using Llama Stack's scoring API: + + + + +```python +# Process agent execution history into evaluation rows +eval_rows = [] + +# Define expected answers for our test prompts +expected_answers = [ + "Dallas Mavericks and the Minnesota Timberwolves", + "Season 4, Episode 12", + "King Cobra", +] + +# Create evaluation dataset from agent responses +for i, turn in enumerate(session_response.turns): + eval_rows.append( + { + "input_query": turn.input_messages[0].content, + "generated_answer": turn.output_message.content, + "expected_answer": expected_answers[i], + } + ) + +pprint(eval_rows) +``` + + + + +```python +# Configure scoring parameters +scoring_params = { + "basic::subset_of": None, # Check if generated answer contains expected answer +} + +# Run evaluation using Llama Stack's scoring API +scoring_response = client.scoring.score( + input_rows=eval_rows, + scoring_functions=scoring_params +) + +pprint(scoring_response) + +# Analyze results +for i, result in enumerate(scoring_response.results): + print(f"Query {i+1}: {result.score}") + print(f" Generated: {eval_rows[i]['generated_answer'][:100]}...") + print(f" Expected: {expected_answers[i]}") + print(f" Score: {result.score}") + print() +``` + + + + +## Available Scoring Functions + +Llama Stack provides several built-in scoring functions: + +### Basic Scoring Functions +- **`basic::subset_of`**: Checks if the expected answer is contained in the generated response +- **`basic::exact_match`**: Performs exact string matching between expected and generated answers +- **`basic::regex_match`**: Uses regular expressions to match patterns in responses + +### Advanced Scoring Functions +- **`llm_as_judge::accuracy`**: Uses an LLM to judge response accuracy +- **`llm_as_judge::helpfulness`**: Evaluates how helpful the response is +- **`llm_as_judge::safety`**: Assesses response safety and appropriateness + +### Custom Scoring Functions +You can also create custom scoring functions for domain-specific evaluation needs. + +## Evaluation Workflow Best Practices + +### 🎯 **Dataset Preparation** +- Use diverse test cases that cover edge cases and common scenarios +- Include clear expected answers or success criteria +- Balance your dataset across different difficulty levels + +### 📊 **Metrics Selection** +- Choose appropriate scoring functions for your use case +- Combine multiple metrics for comprehensive evaluation +- Consider both automated and human evaluation metrics + +### 🔄 **Iterative Improvement** +- Run evaluations regularly during development +- Use evaluation results to identify areas for improvement +- Track performance changes over time + +### 📈 **Analysis & Reporting** +- Analyze failures to understand model limitations +- Generate comprehensive evaluation reports +- Share results with stakeholders for informed decision-making + +## Advanced Evaluation Scenarios + +### Batch Evaluation +For evaluating large datasets efficiently: + +```python +# Prepare large evaluation dataset +large_eval_dataset = [ + {"input_query": query, "expected_answer": answer} + for query, answer in zip(queries, expected_answers) +] + +# Run batch evaluation +batch_results = client.scoring.score( + input_rows=large_eval_dataset, + scoring_functions={ + "basic::subset_of": None, + "llm_as_judge::accuracy": {"judge_model": "meta-llama/Llama-3.3-70B-Instruct"}, + } +) +``` + +### Multi-Metric Evaluation +Combining different scoring approaches: + +```python +comprehensive_scoring = { + "exact_match": "basic::exact_match", + "subset_match": "basic::subset_of", + "llm_judge": "llm_as_judge::accuracy", + "safety_check": "llm_as_judge::safety", +} + +results = client.scoring.score( + input_rows=eval_rows, + scoring_functions=comprehensive_scoring +) +``` + +## Related Resources + +- **[Agents](./agent)** - Building agents for evaluation +- **[Tools Integration](./tools)** - Using tools in evaluated agents +- **[Evaluation Reference](/docs/references/evals-reference)** - Complete API reference for evaluations +- **[Getting Started Notebook](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb)** - Interactive examples +- **[Evaluation Examples](https://colab.research.google.com/drive/10CHyykee9j2OigaIcRv47BKG9mrNm0tJ?usp=sharing)** - Additional evaluation scenarios diff --git a/docs/docs/building_applications/index.mdx b/docs/docs/building_applications/index.mdx new file mode 100644 index 000000000..0b9cb20fb --- /dev/null +++ b/docs/docs/building_applications/index.mdx @@ -0,0 +1,83 @@ +--- +title: Building Applications +description: Comprehensive guides for building AI applications with Llama Stack +sidebar_label: Overview +sidebar_position: 5 +--- + +# AI Application Examples + +Llama Stack provides all the building blocks needed to create sophisticated AI applications. + +## Getting Started + +The best way to get started is to look at this comprehensive notebook which walks through the various APIs (from basic inference, to RAG agents) and how to use them. + +**📓 [Building AI Applications Notebook](https://github.com/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb)** + +## Core Topics + +Here are the key topics that will help you build effective AI applications: + +### 🤖 **Agent Development** +- **[Agent Framework](./agent)** - Understand the components and design patterns of the Llama Stack agent framework +- **[Agent Execution Loop](./agent_execution_loop)** - How agents process information, make decisions, and execute actions +- **[Agents vs Responses API](./responses_vs_agents)** - Learn when to use each API for different use cases + +### 📚 **Knowledge Integration** +- **[RAG (Retrieval-Augmented Generation)](./rag)** - Enhance your agents with external knowledge through retrieval mechanisms + +### 🛠️ **Capabilities & Extensions** +- **[Tools](./tools)** - Extend your agents' capabilities by integrating with external tools and APIs + +### 📊 **Quality & Monitoring** +- **[Evaluations](./evals)** - Evaluate your agents' effectiveness and identify areas for improvement +- **[Telemetry](./telemetry)** - Monitor and analyze your agents' performance and behavior +- **[Safety](./safety)** - Implement guardrails and safety measures to ensure responsible AI behavior + +### 🎮 **Interactive Development** +- **[Playground](./playground)** - Interactive environment for testing and developing applications + +## Application Patterns + +### 🤖 **Conversational Agents** +Build intelligent chatbots and assistants that can: +- Maintain context across conversations +- Access external knowledge bases +- Execute actions through tool integrations +- Apply safety filters and guardrails + +### 📖 **RAG Applications** +Create knowledge-augmented applications that: +- Retrieve relevant information from documents +- Generate contextually accurate responses +- Handle large knowledge bases efficiently +- Provide source attribution + +### 🔧 **Tool-Enhanced Systems** +Develop applications that can: +- Search the web for real-time information +- Interact with databases and APIs +- Perform calculations and analysis +- Execute complex multi-step workflows + +### 🛡️ **Enterprise Applications** +Build production-ready systems with: +- Comprehensive safety measures +- Performance monitoring and analytics +- Scalable deployment configurations +- Evaluation and quality assurance + +## Next Steps + +1. **📖 Start with the Notebook** - Work through the complete tutorial +2. **🎯 Choose Your Pattern** - Pick the application type that matches your needs +3. **🏗️ Build Your Foundation** - Set up your [providers](/docs/providers/) and [distributions](/docs/distributions/) +4. **🚀 Deploy & Monitor** - Use our [deployment guides](/docs/deploying/) for production + +## Related Resources + +- **[Getting Started](/docs/getting-started/)** - Basic setup and concepts +- **[Providers](/docs/providers/)** - Available AI service providers +- **[Distributions](/docs/distributions/)** - Pre-configured deployment packages +- **[API Reference](/docs/api/)** - Complete API documentation diff --git a/docs/docs/building_applications/playground.mdx b/docs/docs/building_applications/playground.mdx new file mode 100644 index 000000000..d9d3ba275 --- /dev/null +++ b/docs/docs/building_applications/playground.mdx @@ -0,0 +1,299 @@ +--- +title: Llama Stack Playground +description: Interactive interface to explore and experiment with Llama Stack capabilities +sidebar_label: Playground +sidebar_position: 10 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Llama Stack Playground + +:::note[Experimental Feature] +The Llama Stack Playground is currently experimental and subject to change. We welcome feedback and contributions to help improve it. +::: + +The Llama Stack Playground is a simple interface that aims to: +- **Showcase capabilities and concepts** of Llama Stack in an interactive environment +- **Demo end-to-end application code** to help users get started building their own applications +- **Provide a UI** to help users inspect and understand Llama Stack API providers and resources + +## Key Features + +### Interactive Playground Pages + +The playground provides interactive pages for users to explore Llama Stack API capabilities: + +#### Chatbot Interface + + + + + + +**Simple Chat Interface** +- Chat directly with Llama models through an intuitive interface +- Uses the `/inference/chat-completion` streaming API under the hood +- Real-time message streaming for responsive interactions +- Perfect for testing model capabilities and prompt engineering + + + + +**Document-Aware Conversations** +- Upload documents to create memory banks +- Chat with a RAG-enabled agent that can query your documents +- Uses Llama Stack's `/agents` API to create and manage RAG sessions +- Ideal for exploring knowledge-enhanced AI applications + + + + +#### Evaluation Interface + + + + + + +**Custom Dataset Evaluation** +- Upload your own evaluation datasets +- Run evaluations using available scoring functions +- Uses Llama Stack's `/scoring` API for flexible evaluation workflows +- Great for testing application performance on custom metrics + + + + + + +**Pre-registered Evaluation Tasks** +- Evaluate models or agents on pre-defined tasks +- Uses Llama Stack's `/eval` API for comprehensive evaluation +- Combines datasets and scoring functions for standardized testing + +**Setup Requirements:** +Register evaluation datasets and benchmarks first: + +```bash +# Register evaluation dataset +llama-stack-client datasets register \ + --dataset-id "mmlu" \ + --provider-id "huggingface" \ + --url "https://huggingface.co/datasets/llamastack/evals" \ + --metadata '{"path": "llamastack/evals", "name": "evals__mmlu__details", "split": "train"}' \ + --schema '{"input_query": {"type": "string"}, "expected_answer": {"type": "string"}, "chat_completion_input": {"type": "string"}}' + +# Register benchmark task +llama-stack-client benchmarks register \ + --eval-task-id meta-reference-mmlu \ + --provider-id meta-reference \ + --dataset-id mmlu \ + --scoring-functions basic::regex_parser_multiple_choice_answer +``` + + + + +#### Inspection Interface + + + + + + +**Provider Management** +- Inspect available Llama Stack API providers +- View provider configurations and capabilities +- Uses the `/providers` API for real-time provider information +- Essential for understanding your deployment's capabilities + + + + +**Resource Exploration** +- Inspect Llama Stack API resources including: + - **Models**: Available language models + - **Datasets**: Registered evaluation datasets + - **Memory Banks**: Vector databases and knowledge stores + - **Benchmarks**: Evaluation tasks and scoring functions + - **Shields**: Safety and content moderation tools +- Uses `//list` APIs for comprehensive resource visibility +- For detailed information about resources, see [Core Concepts](/docs/concepts) + + + + +## Getting Started + +### Quick Start Guide + + + + +**1. Start the Llama Stack API Server** + +```bash +# Build and run a distribution (example: together) +llama stack build --distro together --image-type venv +llama stack run together +``` + +**2. Start the Streamlit UI** + +```bash +# Launch the playground interface +uv run --with ".[ui]" streamlit run llama_stack.core/ui/app.py +``` + + + + +**Making the Most of the Playground:** + +- **Start with Chat**: Test basic model interactions and prompt engineering +- **Explore RAG**: Upload sample documents to see knowledge-enhanced responses +- **Try Evaluations**: Use the scoring interface to understand evaluation metrics +- **Inspect Resources**: Check what providers and resources are available +- **Experiment with Settings**: Adjust parameters to see how they affect results + + + + +### Available Distributions + +The playground works with any Llama Stack distribution. Popular options include: + + + + +```bash +llama stack build --distro together --image-type venv +llama stack run together +``` + +**Features:** +- Cloud-hosted models +- Fast inference +- Multiple model options + + + + +```bash +llama stack build --distro ollama --image-type venv +llama stack run ollama +``` + +**Features:** +- Local model execution +- Privacy-focused +- No internet required + + + + +```bash +llama stack build --distro meta-reference --image-type venv +llama stack run meta-reference +``` + +**Features:** +- Reference implementation +- All API features available +- Best for development + + + + +## Use Cases & Examples + +### Educational Use Cases +- **Learning Llama Stack**: Hands-on exploration of API capabilities +- **Prompt Engineering**: Interactive testing of different prompting strategies +- **RAG Experimentation**: Understanding how document retrieval affects responses +- **Evaluation Understanding**: See how different metrics evaluate model performance + +### Development Use Cases +- **Prototype Testing**: Quick validation of application concepts +- **API Exploration**: Understanding available endpoints and parameters +- **Integration Planning**: Seeing how different components work together +- **Demo Creation**: Showcasing Llama Stack capabilities to stakeholders + +### Research Use Cases +- **Model Comparison**: Side-by-side testing of different models +- **Evaluation Design**: Understanding how scoring functions work +- **Safety Testing**: Exploring shield effectiveness with different inputs +- **Performance Analysis**: Measuring model behavior across different scenarios + +## Best Practices + +### 🚀 **Getting Started** +- Begin with simple chat interactions to understand basic functionality +- Gradually explore more advanced features like RAG and evaluations +- Use the inspection tools to understand your deployment's capabilities + +### 🔧 **Development Workflow** +- Use the playground to prototype before writing application code +- Test different parameter settings interactively +- Validate evaluation approaches before implementing them programmatically + +### 📊 **Evaluation & Testing** +- Start with simple scoring functions before trying complex evaluations +- Use the playground to understand evaluation results before automation +- Test safety features with various input types + +### 🎯 **Production Preparation** +- Use playground insights to inform your production API usage +- Test edge cases and error conditions interactively +- Validate resource configurations before deployment + +## Related Resources + +- **[Getting Started Guide](/docs/getting-started)** - Complete setup and introduction +- **[Core Concepts](/docs/concepts)** - Understanding Llama Stack fundamentals +- **[Agents](./agent)** - Building intelligent agents +- **[RAG (Retrieval Augmented Generation)](./rag)** - Knowledge-enhanced applications +- **[Evaluations](./evals)** - Comprehensive evaluation framework +- **[API Reference](/docs/api-reference)** - Complete API documentation diff --git a/docs/source/building_applications/rag.md b/docs/docs/building_applications/rag.mdx similarity index 60% rename from docs/source/building_applications/rag.md rename to docs/docs/building_applications/rag.mdx index 9390c0310..5212616d2 100644 --- a/docs/source/building_applications/rag.md +++ b/docs/docs/building_applications/rag.mdx @@ -1,36 +1,49 @@ -## Retrieval Augmented Generation (RAG) +--- +title: Retrieval Augmented Generation (RAG) +description: Build knowledge-enhanced AI applications with external document retrieval +sidebar_label: RAG (Retrieval Augmented Generation) +sidebar_position: 2 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Retrieval Augmented Generation (RAG) RAG enables your applications to reference and recall information from previous interactions or external documents. -Llama Stack organizes the APIs that enable RAG into three layers: -1. The lowermost APIs deal with raw storage and retrieval. These include Vector IO, KeyValue IO (coming soon) and Relational IO (also coming soon.). -2. The next is the "Rag Tool", a first-class tool as part of the [Tools API](tools.md) that allows you to ingest documents (from URLs, files, etc) with various chunking strategies and query them smartly. -3. Finally, it all comes together with the top-level ["Agents" API](agent.md) that allows you to create agents that can use the tools to answer questions, perform tasks, and more. +## Architecture Overview -RAG System +Llama Stack organizes the APIs that enable RAG into three layers: + +1. **Lower-Level APIs**: Deal with raw storage and retrieval. These include Vector IO, KeyValue IO (coming soon) and Relational IO (also coming soon) +2. **RAG Tool**: A first-class tool as part of the [Tools API](./tools) that allows you to ingest documents (from URLs, files, etc) with various chunking strategies and query them smartly +3. **Agents API**: The top-level [Agents API](./agent) that allows you to create agents that can use the tools to answer questions, perform tasks, and more + +![RAG System Architecture](/img/rag.png) The RAG system uses lower-level storage for different types of data: -* **Vector IO**: For semantic search and retrieval -* **Key-Value and Relational IO**: For structured data storage +- **Vector IO**: For semantic search and retrieval +- **Key-Value and Relational IO**: For structured data storage +:::info[Future Storage Types] We may add more storage types like Graph IO in the future. +::: -### Setting up Vector DBs +## Setting up Vector Databases -For this guide, we will use [Ollama](https://ollama.com/) as the inference provider. -Ollama is an LLM runtime that allows you to run Llama models locally. +For this guide, we will use [Ollama](https://ollama.com/) as the inference provider. Ollama is an LLM runtime that allows you to run Llama models locally. Here's how to set up a vector database for RAG: ```python -# Create http client +# Create HTTP client import os from llama_stack_client import LlamaStackClient client = LlamaStackClient(base_url=f"http://localhost:{os.environ['LLAMA_STACK_PORT']}") - -# Register a vector db +# Register a vector database vector_db_id = "my_documents" response = client.vector_dbs.register( vector_db_id=vector_db_id, @@ -40,9 +53,15 @@ response = client.vector_dbs.register( ) ``` -### Ingesting Documents -You can ingest documents into the vector database using two methods: directly inserting pre-chunked -documents or using the RAG Tool. +## Document Ingestion + +You can ingest documents into the vector database using two methods: directly inserting pre-chunked documents or using the RAG Tool. + +### Direct Document Insertion + + + + ```python # You can insert a pre-chunked document directly into the vector db chunks = [ @@ -58,10 +77,11 @@ chunks = [ client.vector_io.insert(vector_db_id=vector_db_id, chunks=chunks) ``` -#### Using Precomputed Embeddings -If you decide to precompute embeddings for your documents, you can insert them directly into the vector database by -including the embedding vectors in the chunk data. This is useful if you have a separate embedding service or if you -want to customize the ingestion process. + + + +If you decide to precompute embeddings for your documents, you can insert them directly into the vector database by including the embedding vectors in the chunk data. This is useful if you have a separate embedding service or if you want to customize the ingestion process. + ```python chunks_with_embeddings = [ { @@ -79,44 +99,53 @@ chunks_with_embeddings = [ ] client.vector_io.insert(vector_db_id=vector_db_id, chunks=chunks_with_embeddings) ``` -When providing precomputed embeddings, ensure the embedding dimension matches the embedding_dimension specified when -registering the vector database. -### Retrieval +:::warning[Embedding Dimensions] +When providing precomputed embeddings, ensure the embedding dimension matches the `embedding_dimension` specified when registering the vector database. +::: + + + + +### Document Retrieval + You can query the vector database to retrieve documents based on their embeddings. + ```python # You can then query for these chunks chunks_response = client.vector_io.query( - vector_db_id=vector_db_id, query="What do you know about..." + vector_db_id=vector_db_id, + query="What do you know about..." ) ``` -### Using the RAG Tool +## Using the RAG Tool -> **⚠️ DEPRECATION NOTICE**: The RAG Tool is being deprecated in favor of directly using the OpenAI-compatible Search -> API. We recommend migrating to the OpenAI APIs for better compatibility and future support. +:::danger[Deprecation Notice] +The RAG Tool is being deprecated in favor of directly using the OpenAI-compatible Search API. We recommend migrating to the OpenAI APIs for better compatibility and future support. +::: -A better way to ingest documents is to use the RAG Tool. This tool allows you to ingest documents from URLs, files, etc. -and automatically chunks them into smaller pieces. More examples for how to format a RAGDocument can be found in the -[appendix](#more-ragdocument-examples). +A better way to ingest documents is to use the RAG Tool. This tool allows you to ingest documents from URLs, files, etc. and automatically chunks them into smaller pieces. More examples for how to format a RAGDocument can be found in the [appendix](#more-ragdocument-examples). -#### OpenAI API Integration & Migration +### OpenAI API Integration & Migration The RAG tool has been updated to use OpenAI-compatible APIs. This provides several benefits: - **Files API Integration**: Documents are now uploaded using OpenAI's file upload endpoints - **Vector Stores API**: Vector storage operations use OpenAI's vector store format with configurable chunking strategies -- **Error Resilience:** When processing multiple documents, individual failures are logged but don't crash the operation. Failed documents are skipped while successful ones continue processing. +- **Error Resilience**: When processing multiple documents, individual failures are logged but don't crash the operation. Failed documents are skipped while successful ones continue processing. + +### Migration Path -**Migration Path:** We recommend migrating to the OpenAI-compatible Search API for: -1. **Better OpenAI Ecosystem Integration**: Direct compatibility with OpenAI tools and workflows including the Responses API -2**Future-Proof**: Continued support and feature development -3**Full OpenAI Compatibility**: Vector Stores, Files, and Search APIs are fully compatible with OpenAI's Responses API -The OpenAI APIs are used under the hood, so you can continue to use your existing RAG Tool code with minimal changes. -However, we recommend updating your code to use the new OpenAI-compatible APIs for better long-term support. If any -documents fail to process, they will be logged in the response but will not cause the entire operation to fail. +1. **Better OpenAI Ecosystem Integration**: Direct compatibility with OpenAI tools and workflows including the Responses API +2. **Future-Proof**: Continued support and feature development +3. **Full OpenAI Compatibility**: Vector Stores, Files, and Search APIs are fully compatible with OpenAI's Responses API + +The OpenAI APIs are used under the hood, so you can continue to use your existing RAG Tool code with minimal changes. However, we recommend updating your code to use the new OpenAI-compatible APIs for better long-term support. If any documents fail to process, they will be logged in the response but will not cause the entire operation to fail. + +### RAG Tool Example ```python from llama_stack_client import RAGDocument @@ -145,9 +174,12 @@ results = client.tool_runtime.rag_tool.query( ) ``` -You can configure how the RAG tool adds metadata to the context if you find it useful for your application. Simply add: +### Custom Context Configuration + +You can configure how the RAG tool adds metadata to the context if you find it useful for your application: + ```python -# Query documents +# Query documents with custom template results = client.tool_runtime.rag_tool.query( vector_db_ids=[vector_db_id], content="What do you know about...", @@ -156,10 +188,13 @@ results = client.tool_runtime.rag_tool.query( }, ) ``` -### Building RAG-Enhanced Agents + +## Building RAG-Enhanced Agents One of the most powerful patterns is combining agents with RAG capabilities. Here's a complete example: +### Agent with Knowledge Search + ```python from llama_stack_client import Agent @@ -185,7 +220,6 @@ agent = Agent( ) session_id = agent.create_session("rag_session") - # Ask questions about documents in the vector db, and the agent will query the db to answer the question. response = agent.create_turn( messages=[{"role": "user", "content": "How to optimize memory in PyTorch?"}], @@ -193,10 +227,14 @@ response = agent.create_turn( ) ``` -> **NOTE:** the `instructions` field in the `AgentConfig` can be used to guide the agent's behavior. It is important to experiment with different instructions to see what works best for your use case. +:::tip[Agent Instructions] +The `instructions` field in the `AgentConfig` can be used to guide the agent's behavior. It is important to experiment with different instructions to see what works best for your use case. +::: +### Document-Aware Conversations + +You can also pass documents along with the user's message and ask questions about them: -You can also pass documents along with the user's message and ask questions about them. ```python # Initial document ingestion response = agent.create_turn( @@ -219,7 +257,10 @@ response = agent.create_turn( ) ``` -You can print the response with below. +### Viewing Agent Responses + +You can print the response with the following: + ```python from llama_stack_client import AgentEventLogger @@ -227,32 +268,74 @@ for log in AgentEventLogger().log(response): log.print() ``` +## Vector Database Management + ### Unregistering Vector DBs If you need to clean up and unregister vector databases, you can do so as follows: + + + ```python # Unregister a specified vector database vector_db_id = "my_vector_db_id" print(f"Unregistering vector database: {vector_db_id}") client.vector_dbs.unregister(vector_db_id=vector_db_id) +``` + + +```python # Unregister all vector databases for vector_db_id in client.vector_dbs.list(): print(f"Unregistering vector database: {vector_db_id.identifier}") client.vector_dbs.unregister(vector_db_id=vector_db_id.identifier) ``` -### Appendix + + + +## Best Practices + +### 🎯 **Document Chunking** +- Use appropriate chunk sizes (512 tokens is often a good starting point) +- Consider overlap between chunks for better context preservation +- Experiment with different chunking strategies for your content type + +### 🔍 **Embedding Strategy** +- Choose embedding models that match your domain +- Consider the trade-off between embedding dimension and performance +- Test different embedding models for your specific use case + +### 📊 **Query Optimization** +- Use specific, well-formed queries for better retrieval +- Experiment with different search strategies +- Consider hybrid approaches (keyword + semantic search) + +### 🛡️ **Error Handling** +- Implement proper error handling for failed document processing +- Monitor ingestion success rates +- Have fallback strategies for retrieval failures + +## Appendix + +### More RAGDocument Examples + +Here are various ways to create RAGDocument objects for different content types: -#### More RAGDocument Examples ```python from llama_stack_client import RAGDocument import base64 +# File URI RAGDocument(document_id="num-0", content={"uri": "file://path/to/file"}) + +# Plain text RAGDocument(document_id="num-1", content="plain text") + +# Explicit text input RAGDocument( document_id="num-2", content={ @@ -260,6 +343,8 @@ RAGDocument( "text": "plain text input", }, # for inputs that should be treated as text explicitly ) + +# Image from URL RAGDocument( document_id="num-3", content={ @@ -267,6 +352,8 @@ RAGDocument( "image": {"url": {"uri": "https://mywebsite.com/image.jpg"}}, }, ) + +# Base64 encoded image B64_ENCODED_IMAGE = base64.b64encode( requests.get( "https://raw.githubusercontent.com/meta-llama/llama-stack/refs/heads/main/docs/_static/llama-stack.png" diff --git a/docs/source/building_applications/rag.png b/docs/docs/building_applications/rag.png similarity index 100% rename from docs/source/building_applications/rag.png rename to docs/docs/building_applications/rag.png diff --git a/docs/source/building_applications/responses_vs_agents.md b/docs/docs/building_applications/responses_vs_agents.mdx similarity index 80% rename from docs/source/building_applications/responses_vs_agents.md rename to docs/docs/building_applications/responses_vs_agents.mdx index 63ff69e4f..c04cd2ce8 100644 --- a/docs/source/building_applications/responses_vs_agents.md +++ b/docs/docs/building_applications/responses_vs_agents.mdx @@ -1,10 +1,20 @@ +--- +title: Agents vs OpenAI Responses API +description: Compare the Agents API and OpenAI Responses API for building AI applications with tool calling capabilities +sidebar_label: Agents vs Responses API +sidebar_position: 5 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + # Agents vs OpenAI Responses API Llama Stack (LLS) provides two different APIs for building AI applications with tool calling capabilities: the **Agents API** and the **OpenAI Responses API**. While both enable AI systems to use tools, and maintain full conversation history, they serve different use cases and have distinct characteristics. -```{note} - **Note:** For simple and basic inferencing, you may want to use the [Chat Completions API](../providers/openai.md#chat-completions) directly, before progressing to Agents or Responses API. -``` +:::note +**Note:** For simple and basic inferencing, you may want to use the [Chat Completions API](/docs/providers/openai-compatibility#chat-completions) directly, before progressing to Agents or Responses API. +::: ## Overview @@ -21,6 +31,8 @@ Additionally, Agents let you specify input/output shields whereas Responses do n Today the Agents and Responses APIs can be used independently depending on the use case. But, it is also productive to treat the APIs as complementary. It is not currently supported, but it is planned for the LLS Agents API to alternatively use the Responses API as its backend instead of the default Chat Completions API, i.e., enabling a combination of the safety features of Agents with the dynamic configuration and branching capabilities of Responses. +## Feature Comparison + | Feature | LLS Agents API | OpenAI Responses API | |---------|------------|---------------------| | **Conversation Management** | Linear persistent sessions | Can branch from any previous response ID | @@ -34,7 +46,10 @@ Let's compare how both APIs handle a research task where we need to: 2. Access different information sources dynamically 3. Continue the conversation based on search results -### Agents API: Session-based configuration with safety shields + + + +### Session-based Configuration with Safety Shields ```python # Create agent with static session configuration @@ -85,7 +100,10 @@ print(f"First result: {response1.output_message.content}") print(f"Optimization: {response2.output_message.content}") ``` -### Responses API: Dynamic per-call configuration with branching + + + +### Dynamic Per-call Configuration with Branching ```python # First response: Use web search for latest algorithms @@ -130,50 +148,74 @@ print(f"File search results: {response2.output_message.content}") print(f"Alternative web search: {response3.output_message.content}") ``` + + + Both APIs demonstrate distinct strengths that make them valuable on their own for different scenarios. The Agents API excels in providing structured, safety-conscious workflows with persistent session management, while the Responses API offers flexibility through dynamic configuration and OpenAI compatible tool patterns. ## Use Case Examples -### 1. **Research and Analysis with Safety Controls** +### 1. Research and Analysis with Safety Controls **Best Choice: Agents API** **Scenario:** You're building a research assistant for a financial institution that needs to analyze market data, execute code to process financial models, and search through internal compliance documents. The system must ensure all interactions are logged for regulatory compliance and protected by safety shields to prevent malicious code execution or data leaks. **Why Agents API?** The Agents API provides persistent session management for iterative research workflows, built-in safety shields to protect against malicious code in financial models, and structured execution logs (session/turn/step) required for regulatory compliance. The static tool configuration ensures consistent access to your knowledge base and code interpreter throughout the entire research session. -### 2. **Dynamic Information Gathering with Branching Exploration** +### 2. Dynamic Information Gathering with Branching Exploration **Best Choice: Responses API** **Scenario:** You're building a competitive intelligence tool that helps businesses research market trends. Users need to dynamically switch between web search for current market data and file search through uploaded industry reports. They also want to branch conversations to explore different market segments simultaneously and experiment with different models for various analysis types. **Why Responses API?** The Responses API's branching capability lets users explore multiple market segments from any research point. Dynamic per-call configuration allows switching between web search and file search as needed, while experimenting with different models (faster models for quick searches, more powerful models for deep analysis). The OpenAI-compatible tool patterns make integration straightforward. -### 3. **OpenAI Migration with Advanced Tool Capabilities** +### 3. OpenAI Migration with Advanced Tool Capabilities **Best Choice: Responses API** **Scenario:** You have an existing application built with OpenAI's Assistants API that uses file search and web search capabilities. You want to migrate to Llama Stack for better performance and cost control while maintaining the same tool calling patterns and adding new capabilities like dynamic vector store selection. **Why Responses API?** The Responses API provides full OpenAI tool compatibility (`web_search`, `file_search`) with identical syntax, making migration seamless. The dynamic per-call configuration enables advanced features like switching vector stores per query or changing models based on query complexity - capabilities that extend beyond basic OpenAI functionality while maintaining compatibility. -### 4. **Educational Programming Tutor** +### 4. Educational Programming Tutor **Best Choice: Agents API** **Scenario:** You're building a programming tutor that maintains student context across multiple sessions, safely executes code exercises, and tracks learning progress with audit trails for educators. **Why Agents API?** Persistent sessions remember student progress across multiple interactions, safety shields prevent malicious code execution while allowing legitimate programming exercises, and structured execution logs help educators track learning patterns. -### 5. **Advanced Software Debugging Assistant** +### 5. Advanced Software Debugging Assistant **Best Choice: Agents API with Responses Backend** **Scenario:** You're building a debugging assistant that helps developers troubleshoot complex issues. It needs to maintain context throughout a debugging session, safely execute diagnostic code, switch between different analysis tools dynamically, and branch conversations to explore multiple potential causes simultaneously. **Why Agents + Responses?** The Agent provides safety shields for code execution and session management for the overall debugging workflow. The underlying Responses API enables dynamic model selection and flexible tool configuration per query, while branching lets you explore different theories (memory leak vs. concurrency issue) from the same debugging point and compare results. -> **Note:** The ability to use Responses API as the backend for Agents is not yet implemented but is planned for a future release. Currently, Agents use Chat Completions API as their backend by default. +:::info[Future Enhancement] +The ability to use Responses API as the backend for Agents is not yet implemented but is planned for a future release. Currently, Agents use Chat Completions API as their backend by default. +::: -## For More Information +## Decision Framework -- **LLS Agents API**: For detailed information on creating and managing agents, see the [Agents documentation](agent.md) -- **OpenAI Responses API**: For information on using the OpenAI-compatible responses API, see the [OpenAI API documentation](https://platform.openai.com/docs/api-reference/responses) -- **Chat Completions API**: For the default backend API used by Agents, see the [Chat Completions providers documentation](../providers/openai.md#chat-completions) -- **Agent Execution Loop**: For understanding how agents process turns and steps in their execution, see the [Agent Execution Loop documentation](agent_execution_loop.md) +Use this framework to choose the right API for your use case: + +### Choose Agents API when: +- ✅ You need **safety shields** for input/output validation +- ✅ Your application requires **linear conversation flow** with persistent context +- ✅ You need **audit trails** and structured execution logs +- ✅ Your tool configuration is **static** throughout the session +- ✅ You're building **educational, financial, or enterprise** applications with compliance requirements + +### Choose Responses API when: +- ✅ You need **conversation branching** to explore multiple paths +- ✅ You want **dynamic per-call configuration** (models, tools, vector stores) +- ✅ You're **migrating from OpenAI** and want familiar tool patterns +- ✅ You need **OpenAI compatibility** for existing workflows +- ✅ Your application benefits from **flexible, experimental** interactions + +## Related Resources + +- **[Agents](./agent)** - Understanding the Agents API fundamentals +- **[Agent Execution Loop](./agent_execution_loop)** - How agents process turns and steps +- **[Tools Integration](./tools)** - Adding capabilities to both APIs +- **[OpenAI Compatibility](/docs/providers/openai-compatibility)** - Using OpenAI-compatible endpoints +- **[Safety Guardrails](./safety)** - Implementing safety measures in agents diff --git a/docs/docs/building_applications/safety.mdx b/docs/docs/building_applications/safety.mdx new file mode 100644 index 000000000..16fe5f6f8 --- /dev/null +++ b/docs/docs/building_applications/safety.mdx @@ -0,0 +1,395 @@ +--- +title: Safety Guardrails +description: Implement safety measures and content moderation in Llama Stack applications +sidebar_label: Safety +sidebar_position: 9 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Safety Guardrails + +Safety is a critical component of any AI application. Llama Stack provides a comprehensive Shield system that can be applied at multiple touchpoints to ensure responsible AI behavior and content moderation. + +## Shield System Overview + +The Shield system in Llama Stack provides: +- **Content filtering** for both input and output messages +- **Multi-touchpoint protection** across your application flow +- **Configurable safety policies** tailored to your use case +- **Integration with agents** for automated safety enforcement + +## Basic Shield Usage + +### Registering a Safety Shield + + + + +```python +# Register a safety shield +shield_id = "content_safety" +client.shields.register( + shield_id=shield_id, + provider_shield_id="llama-guard-basic" +) +``` + + + + +```python +# Run content through shield manually +response = client.safety.run_shield( + shield_id=shield_id, + messages=[{"role": "user", "content": "User message here"}] +) + +if response.violation: + print(f"Safety violation detected: {response.violation.user_message}") + # Handle violation appropriately +else: + print("Content passed safety checks") +``` + + + + +## Agent Integration + +Shields can be automatically applied to agent interactions for seamless safety enforcement: + + + + +```python +from llama_stack_client import Agent + +# Create agent with input safety shields +agent = Agent( + client, + model="meta-llama/Llama-3.2-3B-Instruct", + instructions="You are a helpful assistant", + input_shields=["content_safety"], # Shield user inputs + tools=["builtin::websearch"], +) + +session_id = agent.create_session("safe_session") + +# All user inputs will be automatically screened +response = agent.create_turn( + messages=[{"role": "user", "content": "Tell me about AI safety"}], + session_id=session_id, +) +``` + + + + +```python +# Create agent with output safety shields +agent = Agent( + client, + model="meta-llama/Llama-3.2-3B-Instruct", + instructions="You are a helpful assistant", + output_shields=["content_safety"], # Shield agent outputs + tools=["builtin::websearch"], +) + +session_id = agent.create_session("safe_session") + +# All agent responses will be automatically screened +response = agent.create_turn( + messages=[{"role": "user", "content": "Help me with my research"}], + session_id=session_id, +) +``` + + + + +```python +# Create agent with comprehensive safety coverage +agent = Agent( + client, + model="meta-llama/Llama-3.2-3B-Instruct", + instructions="You are a helpful assistant", + input_shields=["content_safety"], # Screen user inputs + output_shields=["content_safety"], # Screen agent outputs + tools=["builtin::websearch"], +) + +session_id = agent.create_session("fully_protected_session") + +# Both input and output are automatically protected +response = agent.create_turn( + messages=[{"role": "user", "content": "Research question here"}], + session_id=session_id, +) +``` + + + + +## Available Shield Types + +### Llama Guard Shields + +Llama Guard provides state-of-the-art content safety classification: + + + + +```python +# Basic Llama Guard for general content safety +client.shields.register( + shield_id="llama_guard_basic", + provider_shield_id="llama-guard-basic" +) +``` + +**Use Cases:** +- General content moderation +- Harmful content detection +- Basic safety compliance + + + + +```python +# Advanced Llama Guard with custom categories +client.shields.register( + shield_id="llama_guard_advanced", + provider_shield_id="llama-guard-advanced", + config={ + "categories": [ + "violence", "hate_speech", "sexual_content", + "self_harm", "illegal_activity" + ], + "threshold": 0.8 + } +) +``` + +**Use Cases:** +- Fine-tuned safety policies +- Domain-specific content filtering +- Enterprise compliance requirements + + + + +### Custom Safety Shields + +Create domain-specific safety shields for specialized use cases: + +```python +# Register custom safety shield +client.shields.register( + shield_id="financial_compliance", + provider_shield_id="custom-financial-shield", + config={ + "detect_pii": True, + "financial_advice_warning": True, + "regulatory_compliance": "FINRA" + } +) +``` + +## Safety Response Handling + +When safety violations are detected, handle them appropriately: + + + + +```python +response = client.safety.run_shield( + shield_id="content_safety", + messages=[{"role": "user", "content": "Potentially harmful content"}] +) + +if response.violation: + violation = response.violation + print(f"Violation Type: {violation.violation_type}") + print(f"User Message: {violation.user_message}") + print(f"Metadata: {violation.metadata}") + + # Log the violation for audit purposes + logger.warning(f"Safety violation detected: {violation.violation_type}") + + # Provide appropriate user feedback + return "I can't help with that request. Please try asking something else." +``` + + + + +```python +def handle_safety_response(safety_response, user_message): + """Advanced safety response handling with logging and user feedback""" + + if not safety_response.violation: + return {"safe": True, "message": "Content passed safety checks"} + + violation = safety_response.violation + + # Log violation details + audit_log = { + "timestamp": datetime.now().isoformat(), + "violation_type": violation.violation_type, + "original_message": user_message, + "shield_response": violation.user_message, + "metadata": violation.metadata + } + logger.warning(f"Safety violation: {audit_log}") + + # Determine appropriate response based on violation type + if violation.violation_type == "hate_speech": + user_feedback = "I can't engage with content that contains hate speech. Let's keep our conversation respectful." + elif violation.violation_type == "violence": + user_feedback = "I can't provide information that could promote violence. How else can I help you today?" + else: + user_feedback = "I can't help with that request. Please try asking something else." + + return { + "safe": False, + "user_feedback": user_feedback, + "violation_details": audit_log + } + +# Usage +safety_result = handle_safety_response(response, user_input) +if not safety_result["safe"]: + return safety_result["user_feedback"] +``` + + + + +## Safety Configuration Best Practices + +### 🛡️ **Multi-Layer Protection** +- Use both input and output shields for comprehensive coverage +- Combine multiple shield types for different threat categories +- Implement fallback mechanisms when shields fail + +### 📊 **Monitoring & Auditing** +- Log all safety violations for compliance and analysis +- Monitor false positive rates to tune shield sensitivity +- Track safety metrics across different use cases + +### ⚙️ **Configuration Management** +- Use environment-specific safety configurations +- Implement A/B testing for shield effectiveness +- Regularly update shield models and policies + +### 🔧 **Integration Patterns** +- Integrate shields early in the development process +- Test safety measures with adversarial inputs +- Provide clear user feedback for violations + +## Advanced Safety Scenarios + +### Context-Aware Safety + +```python +# Safety shields that consider conversation context +agent = Agent( + client, + model="meta-llama/Llama-3.2-3B-Instruct", + instructions="You are a healthcare assistant", + input_shields=["medical_safety"], + output_shields=["medical_safety"], + # Context helps shields make better decisions + safety_context={ + "domain": "healthcare", + "user_type": "patient", + "compliance_level": "HIPAA" + } +) +``` + +### Dynamic Shield Selection + +```python +def select_shield_for_user(user_profile): + """Select appropriate safety shield based on user context""" + if user_profile.age < 18: + return "child_safety_shield" + elif user_profile.context == "enterprise": + return "enterprise_compliance_shield" + else: + return "general_safety_shield" + +# Use dynamic shield selection +shield_id = select_shield_for_user(current_user) +response = client.safety.run_shield( + shield_id=shield_id, + messages=messages +) +``` + +## Compliance and Regulations + +### Industry-Specific Safety + + + + +```python +# Healthcare-specific safety configuration +client.shields.register( + shield_id="hipaa_compliance", + provider_shield_id="healthcare-safety-shield", + config={ + "detect_phi": True, # Protected Health Information + "medical_advice_warning": True, + "regulatory_framework": "HIPAA" + } +) +``` + + + + +```python +# Financial services safety configuration +client.shields.register( + shield_id="finra_compliance", + provider_shield_id="financial-safety-shield", + config={ + "detect_financial_advice": True, + "investment_disclaimers": True, + "regulatory_framework": "FINRA" + } +) +``` + + + + +```python +# Educational platform safety for minors +client.shields.register( + shield_id="coppa_compliance", + provider_shield_id="educational-safety-shield", + config={ + "child_protection": True, + "educational_content_only": True, + "regulatory_framework": "COPPA" + } +) +``` + + + + +## Related Resources + +- **[Agents](./agent)** - Integrating safety shields with intelligent agents +- **[Agent Execution Loop](./agent_execution_loop)** - Understanding safety in the execution flow +- **[Evaluations](./evals)** - Evaluating safety shield effectiveness +- **[Telemetry](./telemetry)** - Monitoring safety violations and metrics +- **[Llama Guard Documentation](https://github.com/meta-llama/PurpleLlama/tree/main/Llama-Guard3)** - Advanced safety model details diff --git a/docs/docs/building_applications/telemetry.mdx b/docs/docs/building_applications/telemetry.mdx new file mode 100644 index 000000000..6a255e702 --- /dev/null +++ b/docs/docs/building_applications/telemetry.mdx @@ -0,0 +1,342 @@ +--- +title: Telemetry +description: Monitor and observe Llama Stack applications with comprehensive telemetry capabilities +sidebar_label: Telemetry +sidebar_position: 8 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Telemetry + +The Llama Stack telemetry system provides comprehensive tracing, metrics, and logging capabilities. It supports multiple sink types including OpenTelemetry, SQLite, and Console output for complete observability of your AI applications. + +## Event Types + +The telemetry system supports three main types of events: + + + + +Free-form log messages with severity levels for general application logging: + +```python +unstructured_log_event = UnstructuredLogEvent( + message="This is a log message", + severity=LogSeverity.INFO +) +``` + + + + +Numerical measurements with units for tracking performance and usage: + +```python +metric_event = MetricEvent( + metric="my_metric", + value=10, + unit="count" +) +``` + + + + +System events like span start/end that provide structured operation tracking: + +```python +structured_log_event = SpanStartPayload( + name="my_span", + parent_span_id="parent_span_id" +) +``` + + + + +## Spans and Traces + +- **Spans**: Represent individual operations with timing information and hierarchical relationships +- **Traces**: Collections of related spans that form a complete request flow across your application + +This hierarchical structure allows you to understand the complete execution path of requests through your Llama Stack application. + +## Automatic Metrics Generation + +Llama Stack automatically generates metrics during inference operations. These metrics are aggregated at the **inference request level** and provide insights into token usage and model performance. + +### Available Metrics + +The following metrics are automatically generated for each inference request: + +| Metric Name | Type | Unit | Description | Labels | +|-------------|------|------|-------------|--------| +| `llama_stack_prompt_tokens_total` | Counter | `tokens` | Number of tokens in the input prompt | `model_id`, `provider_id` | +| `llama_stack_completion_tokens_total` | Counter | `tokens` | Number of tokens in the generated response | `model_id`, `provider_id` | +| `llama_stack_tokens_total` | Counter | `tokens` | Total tokens used (prompt + completion) | `model_id`, `provider_id` | + +### Metric Generation Flow + +1. **Token Counting**: During inference operations (chat completion, completion, etc.), the system counts tokens in both input prompts and generated responses +2. **Metric Construction**: For each request, `MetricEvent` objects are created with the token counts +3. **Telemetry Logging**: Metrics are sent to the configured telemetry sinks +4. **OpenTelemetry Export**: When OpenTelemetry is enabled, metrics are exposed as standard OpenTelemetry counters + +### Metric Aggregation Level + +All metrics are generated and aggregated at the **inference request level**. This means: + +- Each individual inference request generates its own set of metrics +- Metrics are not pre-aggregated across multiple requests +- Aggregation (sums, averages, etc.) can be performed by your observability tools (Prometheus, Grafana, etc.) +- Each metric includes labels for `model_id` and `provider_id` to enable filtering and grouping + +### Example Metric Event + +```python +MetricEvent( + trace_id="1234567890abcdef", + span_id="abcdef1234567890", + metric="total_tokens", + value=150, + timestamp=1703123456.789, + unit="tokens", + attributes={ + "model_id": "meta-llama/Llama-3.2-3B-Instruct", + "provider_id": "tgi" + }, +) +``` + +## Telemetry Sinks + +Choose from multiple sink types based on your observability needs: + + + + +Send events to an OpenTelemetry Collector for integration with observability platforms: + +**Use Cases:** +- Visualizing traces in tools like Jaeger +- Collecting metrics for Prometheus +- Integration with enterprise observability stacks + +**Features:** +- Standard OpenTelemetry format +- Compatible with all OpenTelemetry collectors +- Supports both traces and metrics + + + + +Store events in a local SQLite database for direct querying: + +**Use Cases:** +- Local development and debugging +- Custom analytics and reporting +- Offline analysis of application behavior + +**Features:** +- Direct SQL querying capabilities +- Persistent local storage +- No external dependencies + + + + +Print events to the console for immediate debugging: + +**Use Cases:** +- Development and testing +- Quick debugging sessions +- Simple logging without external tools + +**Features:** +- Immediate output visibility +- No setup required +- Human-readable format + + + + +## Configuration + +### Meta-Reference Provider + +Currently, only the meta-reference provider is implemented. It can be configured to send events to multiple sink types: + +```yaml +telemetry: + - provider_id: meta-reference + provider_type: inline::meta-reference + config: + service_name: "llama-stack-service" + sinks: ['console', 'sqlite', 'otel_trace', 'otel_metric'] + otel_exporter_otlp_endpoint: "http://localhost:4318" + sqlite_db_path: "/path/to/telemetry.db" +``` + +### Environment Variables + +Configure telemetry behavior using environment variables: + +- **`OTEL_EXPORTER_OTLP_ENDPOINT`**: OpenTelemetry Collector endpoint (default: `http://localhost:4318`) +- **`OTEL_SERVICE_NAME`**: Service name for telemetry (default: empty string) +- **`TELEMETRY_SINKS`**: Comma-separated list of sinks (default: `console,sqlite`) + +## Visualization with Jaeger + +The `otel_trace` sink works with any service compatible with the OpenTelemetry collector. Traces and metrics use separate endpoints but can share the same collector. + +### Starting Jaeger + +Start a Jaeger instance with OTLP HTTP endpoint at 4318 and the Jaeger UI at 16686: + +```bash +docker run --pull always --rm --name jaeger \ + -p 16686:16686 -p 4318:4318 \ + jaegertracing/jaeger:2.1.0 +``` + +Once running, you can visualize traces by navigating to [http://localhost:16686/](http://localhost:16686/). + +## Querying Metrics + +When using the OpenTelemetry sink, metrics are exposed in standard format and can be queried through various tools: + + + + +Example Prometheus queries for analyzing token usage: + +```promql +# Total tokens used across all models +sum(llama_stack_tokens_total) + +# Tokens per model +sum by (model_id) (llama_stack_tokens_total) + +# Average tokens per request over 5 minutes +rate(llama_stack_tokens_total[5m]) + +# Token usage by provider +sum by (provider_id) (llama_stack_tokens_total) +``` + + + + +Create dashboards using Prometheus as a data source: + +- **Token Usage Over Time**: Line charts showing token consumption trends +- **Model Performance**: Comparison of different models by token efficiency +- **Provider Analysis**: Breakdown of usage across different providers +- **Request Patterns**: Understanding peak usage times and patterns + + + + +Forward metrics to other observability systems: + +- Export to multiple backends simultaneously +- Apply transformations and filtering +- Integrate with existing monitoring infrastructure + + + + +## SQLite Querying + +The `sqlite` sink allows you to query traces without an external system. This is particularly useful for development and custom analytics. + +### Example Queries + +```sql +-- Query recent traces +SELECT * FROM traces WHERE timestamp > datetime('now', '-1 hour'); + +-- Analyze span durations +SELECT name, AVG(duration_ms) as avg_duration +FROM spans +GROUP BY name +ORDER BY avg_duration DESC; + +-- Find slow operations +SELECT * FROM spans +WHERE duration_ms > 1000 +ORDER BY duration_ms DESC; +``` + +:::tip[Advanced Analytics] +Refer to the [Getting Started notebook](https://github.com/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb) for more examples on querying traces and spans programmatically. +::: + +## Best Practices + +### 🔍 **Monitoring Strategy** +- Use OpenTelemetry for production environments +- Combine multiple sinks for development (console + SQLite) +- Set up alerts on key metrics like token usage and error rates + +### 📊 **Metrics Analysis** +- Track token usage trends to optimize costs +- Monitor response times across different models +- Analyze usage patterns to improve resource allocation + +### 🚨 **Alerting & Debugging** +- Set up alerts for unusual token consumption spikes +- Use trace data to debug performance issues +- Monitor error rates and failure patterns + +### 🔧 **Configuration Management** +- Use environment variables for flexible deployment +- Configure appropriate retention policies for SQLite +- Ensure proper network access to OpenTelemetry collectors + +## Integration Examples + +### Basic Telemetry Setup + +```python +from llama_stack_client import LlamaStackClient + +# Client with telemetry headers +client = LlamaStackClient( + base_url="http://localhost:8000", + extra_headers={ + "X-Telemetry-Service": "my-ai-app", + "X-Telemetry-Version": "1.0.0" + } +) + +# All API calls will be automatically traced +response = client.inference.chat_completion( + model="meta-llama/Llama-3.2-3B-Instruct", + messages=[{"role": "user", "content": "Hello!"}] +) +``` + +### Custom Telemetry Context + +```python +# Add custom span attributes for better tracking +with tracer.start_as_current_span("custom_operation") as span: + span.set_attribute("user_id", "user123") + span.set_attribute("operation_type", "chat_completion") + + response = client.inference.chat_completion( + model="meta-llama/Llama-3.2-3B-Instruct", + messages=[{"role": "user", "content": "Hello!"}] + ) +``` + +## Related Resources + +- **[Agents](./agent)** - Monitoring agent execution with telemetry +- **[Evaluations](./evals)** - Using telemetry data for performance evaluation +- **[Getting Started Notebook](https://github.com/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb)** - Telemetry examples and queries +- **[OpenTelemetry Documentation](https://opentelemetry.io/)** - Comprehensive observability framework +- **[Jaeger Documentation](https://www.jaegertracing.io/)** - Distributed tracing visualization diff --git a/docs/source/building_applications/tools.md b/docs/docs/building_applications/tools.mdx similarity index 66% rename from docs/source/building_applications/tools.md rename to docs/docs/building_applications/tools.mdx index 8a54290ed..be60a1639 100644 --- a/docs/source/building_applications/tools.md +++ b/docs/docs/building_applications/tools.mdx @@ -1,6 +1,17 @@ +--- +title: Tools +description: Extend agent capabilities with external tools and function calling +sidebar_label: Tools +sidebar_position: 6 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + # Tools Tools are functions that can be invoked by an agent to perform tasks. They are organized into tool groups and registered with specific providers. Each tool group represents a collection of related tools from a single provider. They are organized into groups so that state can be externalized: the collection operates on the same state typically. + An example of this would be a "db_access" tool group that contains tools for interacting with a database. "list_tables", "query_table", "insert_row" could be examples of tools in this group. Tools are treated as any other resource in llama stack like models. You can register them, have providers for them etc. @@ -9,18 +20,15 @@ When instantiating an agent, you can provide it a list of tool groups that it ha Refer to the [Building AI Applications](https://github.com/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb) notebook for more examples on how to use tools. -## Server-side vs. client-side tool execution +## Server-side vs. Client-side Tool Execution -Llama Stack allows you to use both server-side and client-side tools. With server-side tools, `agent.create_turn` can perform execution of the tool calls emitted by the model -transparently giving the user the final answer desired. If client-side tools are provided, the tool call is sent back to the user for execution -and optional continuation using the `agent.resume_turn` method. +Llama Stack allows you to use both server-side and client-side tools. With server-side tools, `agent.create_turn` can perform execution of the tool calls emitted by the model transparently giving the user the final answer desired. If client-side tools are provided, the tool call is sent back to the user for execution and optional continuation using the `agent.resume_turn` method. - -### Server-side tools +## Server-side Tools Llama Stack provides built-in providers for some common tools. These include web search, math, and RAG capabilities. -#### Web Search +### Web Search You have three providers to execute the web search tool calls generated by a model: Brave Search, Bing Search, and Tavily Search. @@ -39,25 +47,26 @@ The tool requires an API key which can be provided either in the configuration o {"_api_key": } ``` - -#### Math +### Math The WolframAlpha tool provides access to computational knowledge through the WolframAlpha API. ```python client.toolgroups.register( - toolgroup_id="builtin::wolfram_alpha", provider_id="wolfram-alpha" + toolgroup_id="builtin::wolfram_alpha", + provider_id="wolfram-alpha" ) ``` Example usage: ```python result = client.tool_runtime.invoke_tool( - tool_name="wolfram_alpha", args={"query": "solve x^2 + 2x + 1 = 0"} + tool_name="wolfram_alpha", + args={"query": "solve x^2 + 2x + 1 = 0"} ) ``` -#### RAG +### RAG The RAG tool enables retrieval of context from various types of memory banks (vector, key-value, keyword, and graph). @@ -75,16 +84,13 @@ Features: - Configurable query generation - Context retrieval with token limits - -```{note} +:::note[Default Configuration] By default, llama stack run.yaml defines toolgroups for web search, wolfram alpha and rag, that are provided by tavily-search, wolfram-alpha and rag providers. -``` +::: ## Model Context Protocol (MCP) -[MCP](https://github.com/modelcontextprotocol) is an upcoming, popular standard for tool discovery and execution. It is a protocol that allows tools to be dynamically discovered -from an MCP endpoint and can be used to extend the agent's capabilities. - +[MCP](https://github.com/modelcontextprotocol) is an upcoming, popular standard for tool discovery and execution. It is a protocol that allows tools to be dynamically discovered from an MCP endpoint and can be used to extend the agent's capabilities. ### Using Remote MCP Servers @@ -98,8 +104,7 @@ client.toolgroups.register( ) ``` -Note that most of the more useful MCP servers need you to authenticate with them. Many of them use OAuth2.0 for authentication. You can provide authorization headers to send to the MCP server -using the "Provider Data" abstraction provided by Llama Stack. When making an agent call, +Note that most of the more useful MCP servers need you to authenticate with them. Many of them use OAuth2.0 for authentication. You can provide authorization headers to send to the MCP server using the "Provider Data" abstraction provided by Llama Stack. When making an agent call, ```python agent = Agent( @@ -120,20 +125,26 @@ agent = Agent( agent.create_turn(...) ``` -### Running your own MCP server +### Running Your Own MCP Server Here's an example of how to run a simple MCP server that exposes a File System as a set of tools to the Llama Stack agent. + + + ```shell -# start your MCP server +# Start your MCP server mkdir /tmp/content touch /tmp/content/foo touch /tmp/content/bar npx -y supergateway --port 8000 --stdio 'npx -y @modelcontextprotocol/server-filesystem /tmp/content' ``` -Then register the MCP server as a tool group, + + + ```python +# Register the MCP server as a tool group client.toolgroups.register( toolgroup_id="mcp::filesystem", provider_id="model-context-protocol", @@ -141,12 +152,12 @@ client.toolgroups.register( ) ``` - + + ## Adding Custom (Client-side) Tools -When you want to use tools other than the built-in tools, you just need to implement a python function with a docstring. The content of the docstring will be used to describe the tool and the parameters and passed -along to the generative model. +When you want to use tools other than the built-in tools, you just need to implement a python function with a docstring. The content of the docstring will be used to describe the tool and the parameters and passed along to the generative model. ```python # Example tool definition @@ -158,9 +169,13 @@ def my_tool(input: int) -> int: """ return input * 2 ``` -> **NOTE:** We employ python docstrings to describe the tool and the parameters. It is important to document the tool and the parameters so that the model can use the tool correctly. It is recommended to experiment with different docstrings to see how they affect the model's behavior. + +:::tip[Documentation Best Practices] +We employ python docstrings to describe the tool and the parameters. It is important to document the tool and the parameters so that the model can use the tool correctly. It is recommended to experiment with different docstrings to see how they affect the model's behavior. +::: Once defined, simply pass the tool to the agent config. `Agent` will take care of the rest (calling the model with the tool definition, executing the tool, and returning the result to the model for the next iteration). + ```python # Example agent config with client provided tools agent = Agent(client, ..., tools=[my_tool]) @@ -168,14 +183,14 @@ agent = Agent(client, ..., tools=[my_tool]) Refer to [llama-stack-apps](https://github.com/meta-llama/llama-stack-apps/blob/main/examples/agents/e2e_loop_with_client_tools.py) for an example of how to use client provided tools. - ## Tool Invocation Tools can be invoked using the `invoke_tool` method: ```python result = client.tool_runtime.invoke_tool( - tool_name="web_search", kwargs={"query": "What is the capital of France?"} + tool_name="web_search", + kwargs={"query": "What is the capital of France?"} ) ``` @@ -196,7 +211,13 @@ all_tools = client.tools.list_tools() group_tools = client.tools.list_tools(toolgroup_id="search_tools") ``` -## Simple Example 2: Using an Agent with the Web Search Tool +## Complete Examples + +### Web Search Agent + + + + 1. Start by registering a Tavily API key at [Tavily](https://tavily.com/). 2. [Optional] Provide the API key directly to the Llama Stack server ```bash @@ -205,7 +226,10 @@ export TAVILY_SEARCH_API_KEY="your key" ```bash --env TAVILY_SEARCH_API_KEY=${TAVILY_SEARCH_API_KEY} ``` -3. Run the following script. + + + + ```python from llama_stack_client.lib.agents.agent import Agent from llama_stack_client.types.agent_create_params import AgentConfig @@ -240,7 +264,14 @@ for log in EventLogger().log(response): log.print() ``` -## Simple Example3: Using an Agent with the WolframAlpha Tool + + + +### WolframAlpha Math Agent + + + + 1. Start by registering for a WolframAlpha API key at [WolframAlpha Developer Portal](https://developer.wolframalpha.com/access). 2. Provide the API key either when starting the Llama Stack server: ```bash @@ -253,12 +284,57 @@ for log in EventLogger().log(response): provider_data={"wolfram_alpha_api_key": wolfram_api_key}, ) ``` -3. Configure the tools in the Agent by setting `tools=["builtin::wolfram_alpha"]`. -4. Example user query: - ```python - response = agent.create_turn( - messages=[{"role": "user", "content": "Solve x^2 + 2x + 1 = 0 using WolframAlpha"}], - session_id=session_id, - ) - ``` + + + + +```python +# Configure the tools in the Agent by setting tools=["builtin::wolfram_alpha"] +agent = Agent( + client, + model="meta-llama/Llama-3.2-3B-Instruct", + instructions="You are a mathematical assistant that can solve complex equations.", + tools=["builtin::wolfram_alpha"], +) + +session_id = agent.create_session("math-session") + +# Example user query +response = agent.create_turn( + messages=[{"role": "user", "content": "Solve x^2 + 2x + 1 = 0 using WolframAlpha"}], + session_id=session_id, +) ``` + + + + +## Best Practices + +### 🛠️ **Tool Selection** +- Use **server-side tools** for production applications requiring reliability and security +- Use **client-side tools** for development, prototyping, or specialized integrations +- Combine multiple tool types for comprehensive functionality + +### 📝 **Documentation** +- Write clear, detailed docstrings for custom tools +- Include parameter descriptions and expected return types +- Test tool descriptions with the model to ensure proper usage + +### 🔐 **Security** +- Store API keys securely using environment variables or secure configuration +- Use the `X-LlamaStack-Provider-Data` header for dynamic authentication +- Validate tool inputs and outputs for security + +### 🔄 **Error Handling** +- Implement proper error handling in custom tools +- Use structured error responses with meaningful messages +- Monitor tool performance and reliability + +## Related Resources + +- **[Agents](./agent)** - Building intelligent agents with tools +- **[RAG (Retrieval Augmented Generation)](./rag)** - Using knowledge retrieval tools +- **[Agent Execution Loop](./agent_execution_loop)** - Understanding tool execution flow +- **[Building AI Applications Notebook](https://github.com/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb)** - Comprehensive examples +- **[Llama Stack Apps Examples](https://github.com/meta-llama/llama-stack-apps)** - Real-world tool implementations diff --git a/docs/source/apis/api_leveling.md b/docs/docs/concepts/apis/api_leveling.mdx similarity index 97% rename from docs/source/apis/api_leveling.md rename to docs/docs/concepts/apis/api_leveling.mdx index bb012030f..e3e118d0f 100644 --- a/docs/source/apis/api_leveling.md +++ b/docs/docs/concepts/apis/api_leveling.mdx @@ -1,3 +1,10 @@ +--- +title: API Stability Leveling +description: Understanding API stability levels and versioning in Llama Stack +sidebar_label: API Stability +sidebar_position: 4 +--- + # Llama Stack API Stability Leveling In order to provide a stable experience in Llama Stack, the various APIs need different stability levels indicating the level of support, backwards compatability, and overall production readiness. @@ -91,4 +98,4 @@ The testing of each stable API is already outlined in [issue #3237](https://gith ### New APIs going forward -Any subsequently introduced APIs should be introduced as `/v1alpha` \ No newline at end of file +Any subsequently introduced APIs should be introduced as `/v1alpha` diff --git a/docs/source/concepts/api_providers.md b/docs/docs/concepts/apis/api_providers.mdx similarity index 85% rename from docs/source/concepts/api_providers.md rename to docs/docs/concepts/apis/api_providers.mdx index 6e6502c0c..5f0fe2ac7 100644 --- a/docs/source/concepts/api_providers.md +++ b/docs/docs/concepts/apis/api_providers.mdx @@ -1,4 +1,11 @@ -## API Providers +--- +title: API Providers +description: Understanding remote vs inline provider implementations +sidebar_label: API Providers +sidebar_position: 2 +--- + +# API Providers The goal of Llama Stack is to build an ecosystem where users can easily swap out different implementations for the same API. Examples for these include: - LLM inference providers (e.g., Fireworks, Together, AWS Bedrock, Groq, Cerebras, SambaNova, vLLM, etc.), diff --git a/docs/source/apis/external.md b/docs/docs/concepts/apis/external.mdx similarity index 98% rename from docs/source/apis/external.md rename to docs/docs/concepts/apis/external.mdx index 5831990b0..722e8226c 100644 --- a/docs/source/apis/external.md +++ b/docs/docs/concepts/apis/external.mdx @@ -1,3 +1,9 @@ +--- +title: External APIs +description: Understanding external APIs in Llama Stack +sidebar_label: External APIs +sidebar_position: 4 +--- # External APIs Llama Stack supports external APIs that live outside of the main codebase. This allows you to: diff --git a/docs/source/concepts/apis.md b/docs/docs/concepts/apis/index.mdx similarity index 89% rename from docs/source/concepts/apis.md rename to docs/docs/concepts/apis/index.mdx index f8f73a928..6e699d137 100644 --- a/docs/source/concepts/apis.md +++ b/docs/docs/concepts/apis/index.mdx @@ -1,4 +1,11 @@ -## APIs +--- +title: APIs +description: Available REST APIs and planned capabilities in Llama Stack +sidebar_label: APIs +sidebar_position: 1 +--- + +# APIs A Llama Stack API is described as a collection of REST endpoints. We currently support the following APIs: diff --git a/docs/source/concepts/architecture.md b/docs/docs/concepts/architecture.mdx similarity index 85% rename from docs/source/concepts/architecture.md rename to docs/docs/concepts/architecture.mdx index 50cc62c7c..8e9738416 100644 --- a/docs/source/concepts/architecture.md +++ b/docs/docs/concepts/architecture.mdx @@ -1,15 +1,19 @@ -## Llama Stack architecture +--- +title: Llama Stack Architecture +description: Understanding Llama Stack's service-oriented design and benefits +sidebar_label: Architecture +sidebar_position: 2 +--- + +# Llama Stack architecture Llama Stack allows you to build different layers of distributions for your AI workloads using various SDKs and API providers. -```{image} ../../_static/llama-stack.png -:alt: Llama Stack -:width: 400px -``` +Llama Stack -### Benefits of Llama stack +## Benefits of Llama stack -#### Current challenges in custom AI applications +### Current challenges in custom AI applications Building production AI applications today requires solving multiple challenges: @@ -32,7 +36,7 @@ Building production AI applications today requires solving multiple challenges: - Different providers have different APIs and abstractions. - Changing providers requires significant code changes. -#### Our Solution: A Universal Stack +### Our Solution: A Universal Stack Llama Stack addresses these challenges through a service-oriented, API-first approach: @@ -59,7 +63,7 @@ Llama Stack addresses these challenges through a service-oriented, API-first app - Ecosystem offers tailored infrastructure, software, and services for deploying a variety of models. -### Our Philosophy +## Our Philosophy - **Service-Oriented**: REST APIs enforce clean interfaces and enable seamless transitions across different environments. - **Composability**: Every component is independent but works together seamlessly @@ -67,4 +71,4 @@ Llama Stack addresses these challenges through a service-oriented, API-first app - **Turnkey Solutions**: Easy to deploy built in solutions for popular deployment scenarios -With Llama Stack, you can focus on building your application while we handle the infrastructure complexity, essential capabilities, and provider integrations. \ No newline at end of file +With Llama Stack, you can focus on building your application while we handle the infrastructure complexity, essential capabilities, and provider integrations. diff --git a/docs/source/concepts/distributions.md b/docs/docs/concepts/distributions.mdx similarity index 81% rename from docs/source/concepts/distributions.md rename to docs/docs/concepts/distributions.mdx index 8c63914d1..3b911ed7c 100644 --- a/docs/source/concepts/distributions.md +++ b/docs/docs/concepts/distributions.mdx @@ -1,4 +1,11 @@ -## Distributions +--- +title: Distributions +description: Pre-packaged provider configurations for different deployment scenarios +sidebar_label: Distributions +sidebar_position: 5 +--- + +# Distributions While there is a lot of flexibility to mix-and-match providers, often users will work with a specific set of providers (hardware support, contractual obligations, etc.) We therefore need to provide a _convenient shorthand_ for such collections. We call this shorthand a **Llama Stack Distribution** or a **Distro**. One can think of it as specific pre-packaged versions of the Llama Stack. Here are some examples: @@ -6,4 +13,4 @@ While there is a lot of flexibility to mix-and-match providers, often users will **Locally Hosted Distro**: You may want to run Llama Stack on your own hardware. Typically though, you still need to use Inference via an external service. You can use providers like HuggingFace TGI, Fireworks, Together, etc. for this purpose. Or you may have access to GPUs and can run a [vLLM](https://github.com/vllm-project/vllm) or [NVIDIA NIM](https://build.nvidia.com/nim?filters=nimType%3Anim_type_run_anywhere&q=llama) instance. If you "just" have a regular desktop machine, you can use [Ollama](https://ollama.com/) for inference. To provide convenient quick access to these options, we provide a number of such pre-configured locally-hosted Distros. -**On-device Distro**: To run Llama Stack directly on an edge device (mobile phone or a tablet), we provide Distros for [iOS](../distributions/ondevice_distro/ios_sdk.md) and [Android](../distributions/ondevice_distro/android_sdk.md) +**On-device Distro**: To run Llama Stack directly on an edge device (mobile phone or a tablet), we provide Distros for [iOS](/docs/distributions/ondevice_distro/ios_sdk) and [Android](/docs/distributions/ondevice_distro/android_sdk) diff --git a/docs/docs/concepts/index.mdx b/docs/docs/concepts/index.mdx new file mode 100644 index 000000000..d76a0c039 --- /dev/null +++ b/docs/docs/concepts/index.mdx @@ -0,0 +1,43 @@ +# Core Concepts + +Given Llama Stack's service-oriented philosophy, a few concepts and workflows arise which may not feel completely natural in the LLM landscape, especially if you are coming with a background in other frameworks. + +## Documentation Structure + +This section covers the fundamental concepts of Llama Stack: + +- **[Architecture](./architecture.md)** - Learn about Llama Stack's architectural design and principles +- **[APIs](./apis/index.mdx)** - Understanding the core APIs and their stability levels + - [API Overview](./apis/index.mdx) - Core APIs available in Llama Stack + - [API Providers](./apis/api_providers.mdx) - How providers implement APIs + - [API Stability Leveling](./apis/api_leveling.mdx) - API stability and versioning +- **[Distributions](./distributions.md)** - Pre-configured deployment packages +- **[Resources](./resources.md)** - Understanding Llama Stack resources and their lifecycle +- **[External Integration](./external.md)** - Integrating with external services and providers + +## Getting Started + +If you're new to Llama Stack, we recommend starting with: + +1. **[Architecture](./architecture.md)** - Understand the overall system design +2. **[APIs](./apis/index.mdx)** - Learn about the available APIs and their purpose +3. **[Distributions](./distributions.md)** - Choose a pre-configured setup for your use case + +Each concept builds upon the previous ones to give you a comprehensive understanding of how Llama Stack works and how to use it effectively.--- +title: Core Concepts +description: Understanding Llama Stack's service-oriented philosophy and key concepts +sidebar_label: Overview +sidebar_position: 1 +--- + +# Core Concepts + +Given Llama Stack's service-oriented philosophy, a few concepts and workflows arise which may not feel completely natural in the LLM landscape, especially if you are coming with a background in other frameworks. + +This section covers the key concepts you need to understand to work effectively with Llama Stack: + +- **[Architecture](./architecture)** - Llama Stack's service-oriented design and benefits +- **[APIs](./apis)** - Available REST APIs and planned capabilities +- **[API Providers](./api_providers)** - Remote vs inline provider implementations +- **[Distributions](./distributions)** - Pre-packaged provider configurations +- **[Resources](./resources)** - Resource federation and registration diff --git a/docs/source/concepts/resources.md b/docs/docs/concepts/resources.mdx similarity index 85% rename from docs/source/concepts/resources.md rename to docs/docs/concepts/resources.mdx index 0cdc9a227..323902a4a 100644 --- a/docs/source/concepts/resources.md +++ b/docs/docs/concepts/resources.mdx @@ -1,4 +1,11 @@ -## Resources +--- +title: Resources +description: Resource federation and registration in Llama Stack +sidebar_label: Resources +sidebar_position: 6 +--- + +# Resources Some of these APIs are associated with a set of **Resources**. Here is the mapping of APIs to resources: @@ -12,8 +19,8 @@ Some of these APIs are associated with a set of **Resources**. Here is the mappi Furthermore, we allow these resources to be **federated** across multiple providers. For example, you may have some Llama models served by Fireworks while others are served by AWS Bedrock. Regardless, they will all work seamlessly with the same uniform Inference API provided by Llama Stack. -```{admonition} Registering Resources -:class: tip +:::tip Registering Resources Given this architecture, it is necessary for the Stack to know which provider to use for a given resource. This means you need to explicitly _register_ resources (including models) before you can use them with the associated APIs. -``` + +::: diff --git a/docs/docs/contributing/index.mdx b/docs/docs/contributing/index.mdx new file mode 100644 index 000000000..8b3f86b03 --- /dev/null +++ b/docs/docs/contributing/index.mdx @@ -0,0 +1,244 @@ +# Contributing to Llama Stack +We want to make contributing to this project as easy and transparent as +possible. + +## Set up your development environment + +We use [uv](https://github.com/astral-sh/uv) to manage python dependencies and virtual environments. +You can install `uv` by following this [guide](https://docs.astral.sh/uv/getting-started/installation/). + +You can install the dependencies by running: + +```bash +cd llama-stack +uv sync --group dev +uv pip install -e . +source .venv/bin/activate +``` + +```{note} +You can use a specific version of Python with `uv` by adding the `--python ` flag (e.g. `--python 3.12`). +Otherwise, `uv` will automatically select a Python version according to the `requires-python` section of the `pyproject.toml`. +For more info, see the [uv docs around Python versions](https://docs.astral.sh/uv/concepts/python-versions/). +``` + +Note that you can create a dotenv file `.env` that includes necessary environment variables: +``` +LLAMA_STACK_BASE_URL=http://localhost:8321 +LLAMA_STACK_CLIENT_LOG=debug +LLAMA_STACK_PORT=8321 +LLAMA_STACK_CONFIG= +TAVILY_SEARCH_API_KEY= +BRAVE_SEARCH_API_KEY= +``` + +And then use this dotenv file when running client SDK tests via the following: +```bash +uv run --env-file .env -- pytest -v tests/integration/inference/test_text_inference.py --text-model=meta-llama/Llama-3.1-8B-Instruct +``` + +### Pre-commit Hooks + +We use [pre-commit](https://pre-commit.com/) to run linting and formatting checks on your code. You can install the pre-commit hooks by running: + +```bash +uv run pre-commit install +``` + +After that, pre-commit hooks will run automatically before each commit. + +Alternatively, if you don't want to install the pre-commit hooks, you can run the checks manually by running: + +```bash +uv run pre-commit run --all-files +``` + +```{caution} +Before pushing your changes, make sure that the pre-commit hooks have passed successfully. +``` + +## Discussions -> Issues -> Pull Requests + +We actively welcome your pull requests. However, please read the following. This is heavily inspired by [Ghostty](https://github.com/ghostty-org/ghostty/blob/main/CONTRIBUTING.md). + +If in doubt, please open a [discussion](https://github.com/meta-llama/llama-stack/discussions); we can always convert that to an issue later. + +### Issues +We use GitHub issues to track public bugs. Please ensure your description is +clear and has sufficient instructions to be able to reproduce the issue. + +Meta has a [bounty program](http://facebook.com/whitehat/info) for the safe +disclosure of security bugs. In those cases, please go through the process +outlined on that page and do not file a public issue. + +### Contributor License Agreement ("CLA") +In order to accept your pull request, we need you to submit a CLA. You only need +to do this once to work on any of Meta's open source projects. + +Complete your CLA here: + +**I'd like to contribute!** + +If you are new to the project, start by looking at the issues tagged with "good first issue". If you're interested +leave a comment on the issue and a triager will assign it to you. + +Please avoid picking up too many issues at once. This helps you stay focused and ensures that others in the community also have opportunities to contribute. +- Try to work on only 1–2 issues at a time, especially if you’re still getting familiar with the codebase. +- Before taking an issue, check if it’s already assigned or being actively discussed. +- If you’re blocked or can’t continue with an issue, feel free to unassign yourself or leave a comment so others can step in. + +**I have a bug!** + +1. Search the issue tracker and discussions for similar issues. +2. If you don't have steps to reproduce, open a discussion. +3. If you have steps to reproduce, open an issue. + +**I have an idea for a feature!** + +1. Open a discussion. + +**I've implemented a feature!** + +1. If there is an issue for the feature, open a pull request. +2. If there is no issue, open a discussion and link to your branch. + +**I have a question!** + +1. Open a discussion or use [Discord](https://discord.gg/llama-stack). + + +**Opening a Pull Request** + +1. Fork the repo and create your branch from `main`. +2. If you've changed APIs, update the documentation. +3. Ensure the test suite passes. +4. Make sure your code lints using `pre-commit`. +5. If you haven't already, complete the Contributor License Agreement ("CLA"). +6. Ensure your pull request follows the [conventional commits format](https://www.conventionalcommits.org/en/v1.0.0/). +7. Ensure your pull request follows the [coding style](#coding-style). + + +Please keep pull requests (PRs) small and focused. If you have a large set of changes, consider splitting them into logically grouped, smaller PRs to facilitate review and testing. + +```{tip} +As a general guideline: +- Experienced contributors should try to keep no more than 5 open PRs at a time. +- New contributors are encouraged to have only one open PR at a time until they’re familiar with the codebase and process. +``` + +## Repository guidelines + +### Coding Style + +* Comments should provide meaningful insights into the code. Avoid filler comments that simply + describe the next step, as they create unnecessary clutter, same goes for docstrings. +* Prefer comments to clarify surprising behavior and/or relationships between parts of the code + rather than explain what the next line of code does. +* Catching exceptions, prefer using a specific exception type rather than a broad catch-all like + `Exception`. +* Error messages should be prefixed with "Failed to ..." +* 4 spaces for indentation rather than tab +* When using `# noqa` to suppress a style or linter warning, include a comment explaining the + justification for bypassing the check. +* When using `# type: ignore` to suppress a mypy warning, include a comment explaining the + justification for bypassing the check. +* Don't use unicode characters in the codebase. ASCII-only is preferred for compatibility or + readability reasons. +* Providers configuration class should be Pydantic Field class. It should have a `description` field + that describes the configuration. These descriptions will be used to generate the provider + documentation. +* When possible, use keyword arguments only when calling functions. +* Llama Stack utilizes [custom Exception classes](llama_stack/apis/common/errors.py) for certain Resources that should be used where applicable. + +### License +By contributing to Llama, you agree that your contributions will be licensed +under the LICENSE file in the root directory of this source tree. + +## Common Tasks + +Some tips about common tasks you work on while contributing to Llama Stack: + +### Using `llama stack build` + +Building a stack image will use the production version of the `llama-stack` and `llama-stack-client` packages. If you are developing with a llama-stack repository checked out and need your code to be reflected in the stack image, set `LLAMA_STACK_DIR` and `LLAMA_STACK_CLIENT_DIR` to the appropriate checked out directories when running any of the `llama` CLI commands. + +Example: +```bash +cd work/ +git clone https://github.com/meta-llama/llama-stack.git +git clone https://github.com/meta-llama/llama-stack-client-python.git +cd llama-stack +LLAMA_STACK_DIR=$(pwd) LLAMA_STACK_CLIENT_DIR=../llama-stack-client-python llama stack build --distro <...> +``` + +### Updating distribution configurations + +If you have made changes to a provider's configuration in any form (introducing a new config key, or +changing models, etc.), you should run `./scripts/distro_codegen.py` to re-generate various YAML +files as well as the documentation. You should not change `docs/source/.../distributions/` files +manually as they are auto-generated. + +### Updating the provider documentation + +If you have made changes to a provider's configuration, you should run `./scripts/provider_codegen.py` +to re-generate the documentation. You should not change `docs/source/.../providers/` files manually +as they are auto-generated. +Note that the provider "description" field will be used to generate the provider documentation. + +### Building the Documentation + +If you are making changes to the documentation at [https://llamastack.github.io/latest/](https://llamastack.github.io/latest/), you can use the following command to build the documentation and preview your changes. You will need [Sphinx](https://www.sphinx-doc.org/en/master/) and the readthedocs theme. + +```bash +# This rebuilds the documentation pages. +uv run --group docs make -C docs/ html + +# This will start a local server (usually at http://127.0.0.1:8000) that automatically rebuilds and refreshes when you make changes to the documentation. +uv run --group docs sphinx-autobuild docs/source docs/build/html --write-all +``` + +### Update API Documentation + +If you modify or add new API endpoints, update the API documentation accordingly. You can do this by running the following command: + +```bash +uv run ./docs/openapi_generator/run_openapi_generator.sh +``` + +The generated API documentation will be available in `docs/_static/`. Make sure to review the changes before committing. + +## Adding a New Provider + +See: +- [Adding a New API Provider Page](new_api_provider.md) which describes how to add new API providers to the Stack. +- [Vector Database Page](new_vector_database.md) which describes how to add a new vector databases with Llama Stack. +- [External Provider Page](../providers/external/index.md) which describes how to add external providers to the Stack. + +```{toctree} +:maxdepth: 1 +:hidden: + +new_api_provider +new_vector_database +``` + +## Testing + + +```{include} ../../../tests/README.md +``` + +## Advanced Topics + +For developers who need deeper understanding of the testing system internals: + +```{toctree} +:maxdepth: 1 + +testing/record-replay +``` + +### Benchmarking + +```{include} ../../../benchmarking/k8s-benchmark/README.md +``` diff --git a/docs/source/contributing/new_api_provider.md b/docs/docs/contributing/new_api_provider.mdx similarity index 95% rename from docs/source/contributing/new_api_provider.md rename to docs/docs/contributing/new_api_provider.mdx index 9a7a62a38..9d9e4653a 100644 --- a/docs/source/contributing/new_api_provider.md +++ b/docs/docs/contributing/new_api_provider.mdx @@ -1,4 +1,12 @@ -# Adding a New API Provider +--- +title: Adding a New API Provider +description: Guide for adding new API providers to Llama Stack +sidebar_label: New API Provider +sidebar_position: 2 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; This guide will walk you through the process of adding a new API provider to Llama Stack. diff --git a/docs/source/contributing/new_vector_database.md b/docs/docs/contributing/new_vector_database.mdx similarity index 95% rename from docs/source/contributing/new_vector_database.md rename to docs/docs/contributing/new_vector_database.mdx index 83c0f55bc..040cee6d3 100644 --- a/docs/source/contributing/new_vector_database.md +++ b/docs/docs/contributing/new_vector_database.mdx @@ -1,4 +1,12 @@ -# Adding a New Vector Database +--- +title: Adding a New Vector Database +description: Guide for adding new vector database providers to Llama Stack +sidebar_label: New Vector Database +sidebar_position: 3 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; This guide will walk you through the process of adding a new vector database to Llama Stack. @@ -72,4 +80,4 @@ InlineProviderSpec( - `uv add new_pip_package --group test` 5. **Update Documentation**: Please update the documentation for end users - Generate the provider documentation by running {repopath}`./scripts/provider_codegen.py`. - - Update the autogenerated content in the registry/vector_io.py file with information about your provider. Please see other providers for examples. \ No newline at end of file + - Update the autogenerated content in the registry/vector_io.py file with information about your provider. Please see other providers for examples. diff --git a/docs/source/contributing/testing/record-replay.md b/docs/docs/contributing/testing/record-replay.mdx similarity index 95% rename from docs/source/contributing/testing/record-replay.md rename to docs/docs/contributing/testing/record-replay.mdx index 7b0f345b0..47803c150 100644 --- a/docs/source/contributing/testing/record-replay.md +++ b/docs/docs/contributing/testing/record-replay.mdx @@ -1,3 +1,13 @@ +--- +title: Record-Replay Testing System +description: Understanding how Llama Stack captures and replays API interactions for testing +sidebar_label: Record-Replay System +sidebar_position: 4 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + # Record-Replay System Understanding how Llama Stack captures and replays API interactions for testing. @@ -228,4 +238,4 @@ Loose hashing (normalizing whitespace, rounding floats) seems convenient but hid - **SQLite** - Fast indexed lookups without loading response bodies - **Hybrid** - Best of both worlds for different use cases -This system provides reliable, fast testing against real AI APIs while maintaining the ability to debug issues when they arise. \ No newline at end of file +This system provides reliable, fast testing against real AI APIs while maintaining the ability to debug issues when they arise. diff --git a/docs/docs/deploying/aws_eks_deployment.mdx b/docs/docs/deploying/aws_eks_deployment.mdx new file mode 100644 index 000000000..fa107ea9c --- /dev/null +++ b/docs/docs/deploying/aws_eks_deployment.mdx @@ -0,0 +1,30 @@ +--- +title: AWS EKS Deployment Guide +description: Deploy Llama Stack on AWS EKS +sidebar_label: AWS EKS Deployment +sidebar_position: 3 +--- + +## AWS EKS Deployment + +### Prerequisites + +- Set up an [EKS cluster](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) +- Create a [GitHub OAuth app](https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app) +- Set authorization callback URL to `http:///api/auth/callback/` + +### Automated Deployment + +```bash +export HF_TOKEN= +export GITHUB_CLIENT_ID= +export GITHUB_CLIENT_SECRET= +export LLAMA_STACK_UI_URL= + +cd docs/source/distributions/eks +./apply.sh +``` + +This script will: +- Set up default storage class for AWS EKS +- Deploy Llama Stack server in Kubernetes pods and services diff --git a/docs/docs/deploying/index.mdx b/docs/docs/deploying/index.mdx new file mode 100644 index 000000000..eaa0e2612 --- /dev/null +++ b/docs/docs/deploying/index.mdx @@ -0,0 +1,14 @@ +--- +title: Deploying Llama Stack +description: Production deployment guides for Llama Stack in various environments +sidebar_label: Overview +sidebar_position: 1 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Deploying Llama Stack + +[**→ Kubernetes Deployment Guide**](./kubernetes_deployment.mdx) +[**→ AWS EKS Deployment Guide**](./aws_eks_deployment.mdx) diff --git a/docs/source/deploying/kubernetes_deployment.md b/docs/docs/deploying/kubernetes_deployment.mdx similarity index 51% rename from docs/source/deploying/kubernetes_deployment.md rename to docs/docs/deploying/kubernetes_deployment.mdx index 4bdd87b24..b50926455 100644 --- a/docs/source/deploying/kubernetes_deployment.md +++ b/docs/docs/deploying/kubernetes_deployment.mdx @@ -1,27 +1,39 @@ -## Kubernetes Deployment Guide +--- +title: Kubernetes Deployment Guide +description: Deploy Llama Stack on Kubernetes clusters with vLLM inference service +sidebar_label: Kubernetes +sidebar_position: 2 +--- -Instead of starting the Llama Stack and vLLM servers locally. We can deploy them in a Kubernetes cluster. +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; -### Prerequisites -In this guide, we'll use a local [Kind](https://kind.sigs.k8s.io/) cluster and a vLLM inference service in the same cluster for demonstration purposes. +# Kubernetes Deployment Guide -Note: You can also deploy the Llama Stack server in an AWS EKS cluster. See [Deploying Llama Stack Server in AWS EKS](#deploying-llama-stack-server-in-aws-eks) for more details. +Deploy Llama Stack and vLLM servers in a Kubernetes cluster instead of running them locally. This guide covers both local development with Kind and production deployment on AWS EKS. -First, create a local Kubernetes cluster via Kind: +## Prerequisites -``` +### Local Kubernetes Setup + +Create a local Kubernetes cluster via Kind: + +```bash kind create cluster --image kindest/node:v1.32.0 --name llama-stack-test ``` -First set your hugging face token as an environment variable. -``` +Set your Hugging Face token: + +```bash export HF_TOKEN=$(echo -n "your-hf-token" | base64) ``` -Now create a Kubernetes PVC and Secret for downloading and storing Hugging Face model: +## Quick Deployment -``` -cat <$tmp_dir/Containerfile.llama-stack-run-k8s </api/auth/callback/` - - -Run the following script to deploy the Llama Stack server: -``` -export HF_TOKEN= -export GITHUB_CLIENT_ID= -export GITHUB_CLIENT_SECRET= -export LLAMA_STACK_UI_URL= - -cd docs/source/distributions/eks -./apply.sh +**Check pod status:** +```bash +kubectl get pods -l app.kubernetes.io/name=vllm +kubectl logs -l app.kubernetes.io/name=vllm ``` -This script will: +**Test service connectivity:** +```bash +kubectl run -it --rm debug --image=curlimages/curl --restart=Never -- curl http://vllm-server:8000/v1/models +``` -- Set up a default storage class for AWS EKS -- Deploy the Llama Stack server in a Kubernetes Pod and Service \ No newline at end of file +## Related Resources + +- **[Deployment Overview](./index)** - Overview of deployment options +- **[Distributions](/docs/distributions)** - Understanding Llama Stack distributions +- **[Configuration](/docs/distributions/configuration)** - Detailed configuration options diff --git a/docs/source/distributions/building_distro.md b/docs/docs/distributions/building_distro.mdx similarity index 99% rename from docs/source/distributions/building_distro.md rename to docs/docs/distributions/building_distro.mdx index 24098708f..90cac7363 100644 --- a/docs/source/distributions/building_distro.md +++ b/docs/docs/distributions/building_distro.mdx @@ -1,5 +1,9 @@ -# Build your own Distribution - +--- +title: Building Custom Distributions +description: Building a Llama Stack distribution from scratch +sidebar_label: Build your own Distribution +sidebar_position: 3 +--- This guide will walk you through the steps to get started with building a Llama Stack distribution from scratch with your choice of API providers. diff --git a/docs/source/distributions/configuration.md b/docs/docs/distributions/configuration.mdx similarity index 99% rename from docs/source/distributions/configuration.md rename to docs/docs/distributions/configuration.mdx index 452c3d95f..73a4837a1 100644 --- a/docs/source/distributions/configuration.md +++ b/docs/docs/distributions/configuration.mdx @@ -1,3 +1,9 @@ +--- +title: Configuring a "Stack" +description: Configuring a "Stack" +sidebar_label: Configuring a "Stack" +sidebar_position: 6 +--- # Configuring a "Stack" The Llama Stack runtime configuration is specified as a YAML file. Here is a simplified version of an example configuration file for the Ollama distribution: diff --git a/docs/source/distributions/customizing_run_yaml.md b/docs/docs/distributions/customizing_run_yaml.mdx similarity index 88% rename from docs/source/distributions/customizing_run_yaml.md rename to docs/docs/distributions/customizing_run_yaml.mdx index 10067bab7..513712f81 100644 --- a/docs/source/distributions/customizing_run_yaml.md +++ b/docs/docs/distributions/customizing_run_yaml.mdx @@ -1,3 +1,9 @@ +--- +title: Customizing run.yaml +description: Customizing run.yaml files for Llama Stack templates +sidebar_label: Customizing run.yaml +sidebar_position: 4 +--- # Customizing run.yaml Files The `run.yaml` files generated by Llama Stack templates are **starting points** designed to be customized for your specific needs. They are not meant to be used as-is in production environments. @@ -37,4 +43,4 @@ your-project/ └── README.md ``` -The goal is to take the generated template and adapt it to your specific infrastructure and operational needs. \ No newline at end of file +The goal is to take the generated template and adapt it to your specific infrastructure and operational needs. diff --git a/docs/source/distributions/eks/apply.sh b/docs/docs/distributions/eks/apply.sh similarity index 100% rename from docs/source/distributions/eks/apply.sh rename to docs/docs/distributions/eks/apply.sh diff --git a/docs/source/distributions/eks/gp3-topology-aware.yaml b/docs/docs/distributions/eks/gp3-topology-aware.yaml similarity index 100% rename from docs/source/distributions/eks/gp3-topology-aware.yaml rename to docs/docs/distributions/eks/gp3-topology-aware.yaml diff --git a/docs/source/distributions/importing_as_library.md b/docs/docs/distributions/importing_as_library.mdx similarity index 86% rename from docs/source/distributions/importing_as_library.md rename to docs/docs/distributions/importing_as_library.mdx index 9993be227..b87bb80a4 100644 --- a/docs/source/distributions/importing_as_library.md +++ b/docs/docs/distributions/importing_as_library.mdx @@ -1,3 +1,9 @@ +--- +title: Using Llama Stack as a Library +description: How to use Llama Stack as a Python library instead of running a server +sidebar_label: Importing as Library +sidebar_position: 5 +--- # Using Llama Stack as a Library ## Setup Llama Stack without a Server diff --git a/docs/docs/distributions/index.mdx b/docs/docs/distributions/index.mdx new file mode 100644 index 000000000..97be14910 --- /dev/null +++ b/docs/docs/distributions/index.mdx @@ -0,0 +1,21 @@ +--- +title: Distributions Overview +description: Pre-packaged sets of Llama Stack components for different deployment scenarios +sidebar_label: Overview +sidebar_position: 1 +--- + +# Distributions Overview + +A distribution is a pre-packaged set of Llama Stack components that can be deployed together. + +This section provides an overview of the distributions available in Llama Stack. + +## Distribution Guides + +- **[Available Distributions](./list_of_distributions)** - Complete list and comparison of all distributions +- **[Building Custom Distributions](./building_distro)** - Create your own distribution from scratch +- **[Customizing Configuration](./customizing_run_yaml)** - Customize run.yaml for your needs +- **[Starting Llama Stack Server](./starting_llama_stack_server)** - How to run distributions +- **[Importing as Library](./importing_as_library)** - Use distributions in your code +- **[Configuration Reference](./configuration)** - Configuration file format details diff --git a/docs/source/distributions/k8s/apply.sh b/docs/docs/distributions/k8s/apply.sh similarity index 100% rename from docs/source/distributions/k8s/apply.sh rename to docs/docs/distributions/k8s/apply.sh diff --git a/docs/source/distributions/k8s/chroma-k8s.yaml.template b/docs/docs/distributions/k8s/chroma-k8s.yaml.template similarity index 100% rename from docs/source/distributions/k8s/chroma-k8s.yaml.template rename to docs/docs/distributions/k8s/chroma-k8s.yaml.template diff --git a/docs/source/distributions/k8s/hf-token-secret.yaml.template b/docs/docs/distributions/k8s/hf-token-secret.yaml.template similarity index 100% rename from docs/source/distributions/k8s/hf-token-secret.yaml.template rename to docs/docs/distributions/k8s/hf-token-secret.yaml.template diff --git a/docs/source/distributions/k8s/ingress-k8s.yaml.template b/docs/docs/distributions/k8s/ingress-k8s.yaml.template similarity index 100% rename from docs/source/distributions/k8s/ingress-k8s.yaml.template rename to docs/docs/distributions/k8s/ingress-k8s.yaml.template diff --git a/docs/source/distributions/k8s/postgres-k8s.yaml.template b/docs/docs/distributions/k8s/postgres-k8s.yaml.template similarity index 100% rename from docs/source/distributions/k8s/postgres-k8s.yaml.template rename to docs/docs/distributions/k8s/postgres-k8s.yaml.template diff --git a/docs/source/distributions/k8s/stack-configmap.yaml b/docs/docs/distributions/k8s/stack-configmap.yaml similarity index 100% rename from docs/source/distributions/k8s/stack-configmap.yaml rename to docs/docs/distributions/k8s/stack-configmap.yaml diff --git a/docs/source/distributions/k8s/stack-k8s.yaml.template b/docs/docs/distributions/k8s/stack-k8s.yaml.template similarity index 100% rename from docs/source/distributions/k8s/stack-k8s.yaml.template rename to docs/docs/distributions/k8s/stack-k8s.yaml.template diff --git a/docs/source/distributions/k8s/stack_run_config.yaml b/docs/docs/distributions/k8s/stack_run_config.yaml similarity index 100% rename from docs/source/distributions/k8s/stack_run_config.yaml rename to docs/docs/distributions/k8s/stack_run_config.yaml diff --git a/docs/source/distributions/k8s/ui-k8s.yaml.template b/docs/docs/distributions/k8s/ui-k8s.yaml.template similarity index 100% rename from docs/source/distributions/k8s/ui-k8s.yaml.template rename to docs/docs/distributions/k8s/ui-k8s.yaml.template diff --git a/docs/source/distributions/k8s/vllm-k8s.yaml.template b/docs/docs/distributions/k8s/vllm-k8s.yaml.template similarity index 100% rename from docs/source/distributions/k8s/vllm-k8s.yaml.template rename to docs/docs/distributions/k8s/vllm-k8s.yaml.template diff --git a/docs/source/distributions/k8s/vllm-safety-k8s.yaml.template b/docs/docs/distributions/k8s/vllm-safety-k8s.yaml.template similarity index 100% rename from docs/source/distributions/k8s/vllm-safety-k8s.yaml.template rename to docs/docs/distributions/k8s/vllm-safety-k8s.yaml.template diff --git a/docs/source/distributions/list_of_distributions.md b/docs/docs/distributions/list_of_distributions.mdx similarity index 95% rename from docs/source/distributions/list_of_distributions.md rename to docs/docs/distributions/list_of_distributions.mdx index ee01c92c4..7e8f56a16 100644 --- a/docs/source/distributions/list_of_distributions.md +++ b/docs/docs/distributions/list_of_distributions.mdx @@ -1,3 +1,10 @@ +--- +title: Available Distributions +description: List of available distributions for Llama Stack +sidebar_label: Available Distributions +sidebar_position: 2 +--- + # Available Distributions Llama Stack provides several pre-configured distributions to help you get started quickly. Choose the distribution that best fits your hardware and use case. diff --git a/docs/source/distributions/ondevice_distro/android_sdk.md b/docs/docs/distributions/ondevice_distro/android_sdk.md similarity index 100% rename from docs/source/distributions/ondevice_distro/android_sdk.md rename to docs/docs/distributions/ondevice_distro/android_sdk.md diff --git a/docs/source/distributions/ondevice_distro/ios_sdk.md b/docs/docs/distributions/ondevice_distro/ios_sdk.md similarity index 100% rename from docs/source/distributions/ondevice_distro/ios_sdk.md rename to docs/docs/distributions/ondevice_distro/ios_sdk.md diff --git a/docs/source/distributions/remote_hosted_distro/index.md b/docs/docs/distributions/remote_hosted_distro/index.mdx similarity index 100% rename from docs/source/distributions/remote_hosted_distro/index.md rename to docs/docs/distributions/remote_hosted_distro/index.mdx diff --git a/docs/source/distributions/remote_hosted_distro/watsonx.md b/docs/docs/distributions/remote_hosted_distro/watsonx.md similarity index 100% rename from docs/source/distributions/remote_hosted_distro/watsonx.md rename to docs/docs/distributions/remote_hosted_distro/watsonx.md diff --git a/docs/source/distributions/self_hosted_distro/dell-tgi.md b/docs/docs/distributions/self_hosted_distro/dell-tgi.md similarity index 100% rename from docs/source/distributions/self_hosted_distro/dell-tgi.md rename to docs/docs/distributions/self_hosted_distro/dell-tgi.md diff --git a/docs/source/distributions/self_hosted_distro/dell.md b/docs/docs/distributions/self_hosted_distro/dell.md similarity index 100% rename from docs/source/distributions/self_hosted_distro/dell.md rename to docs/docs/distributions/self_hosted_distro/dell.md diff --git a/docs/source/distributions/self_hosted_distro/passthrough.md b/docs/docs/distributions/self_hosted_distro/passthrough.md similarity index 100% rename from docs/source/distributions/self_hosted_distro/passthrough.md rename to docs/docs/distributions/self_hosted_distro/passthrough.md diff --git a/docs/source/distributions/self_hosted_distro/starter.md b/docs/docs/distributions/self_hosted_distro/starter.md similarity index 100% rename from docs/source/distributions/self_hosted_distro/starter.md rename to docs/docs/distributions/self_hosted_distro/starter.md diff --git a/docs/source/distributions/starting_llama_stack_server.md b/docs/docs/distributions/starting_llama_stack_server.mdx similarity index 84% rename from docs/source/distributions/starting_llama_stack_server.md rename to docs/docs/distributions/starting_llama_stack_server.mdx index 1a26694a6..8ca1ca3ce 100644 --- a/docs/source/distributions/starting_llama_stack_server.md +++ b/docs/docs/distributions/starting_llama_stack_server.mdx @@ -1,3 +1,10 @@ +--- +title: Starting a Llama Stack Server +description: Different ways to run Llama Stack servers - as library, container, or Kubernetes deployment +sidebar_label: Starting Llama Stack Server +sidebar_position: 7 +--- + # Starting a Llama Stack Server You can run a Llama Stack server in one of the following ways: diff --git a/docs/source/getting_started/demo_script.py b/docs/docs/getting_started/demo_script.py similarity index 100% rename from docs/source/getting_started/demo_script.py rename to docs/docs/getting_started/demo_script.py diff --git a/docs/source/getting_started/detailed_tutorial.md b/docs/docs/getting_started/detailed_tutorial.mdx similarity index 99% rename from docs/source/getting_started/detailed_tutorial.md rename to docs/docs/getting_started/detailed_tutorial.mdx index 77a899c48..5bf009efe 100644 --- a/docs/source/getting_started/detailed_tutorial.md +++ b/docs/docs/getting_started/detailed_tutorial.mdx @@ -1,3 +1,13 @@ +--- +title: Detailed Tutorial +description: Complete guide to using Llama Stack server and client SDK to build AI agents +sidebar_label: Detailed Tutorial +sidebar_position: 3 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + ## Detailed Tutorial In this guide, we'll walk through how you can use the Llama Stack (server and client SDK) to test a simple agent. diff --git a/docs/source/getting_started/libraries.md b/docs/docs/getting_started/libraries.mdx similarity index 85% rename from docs/source/getting_started/libraries.md rename to docs/docs/getting_started/libraries.mdx index a54a9b8d3..7cbb792b4 100644 --- a/docs/source/getting_started/libraries.md +++ b/docs/docs/getting_started/libraries.mdx @@ -1,3 +1,9 @@ +--- +description: We have a number of client-side SDKs available for different languages. +sidebar_label: Libraries +sidebar_position: 2 +title: Libraries (SDKs) +--- ## Libraries (SDKs) We have a number of client-side SDKs available for different languages. @@ -7,4 +13,4 @@ We have a number of client-side SDKs available for different languages. | Python | [llama-stack-client-python](https://github.com/meta-llama/llama-stack-client-python) | [![PyPI version](https://img.shields.io/pypi/v/llama_stack_client.svg)](https://pypi.org/project/llama_stack_client/) | Swift | [llama-stack-client-swift](https://github.com/meta-llama/llama-stack-client-swift/tree/latest-release) | [![Swift Package Index](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fmeta-llama%2Fllama-stack-client-swift%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/meta-llama/llama-stack-client-swift) | Node | [llama-stack-client-node](https://github.com/meta-llama/llama-stack-client-node) | [![NPM version](https://img.shields.io/npm/v/llama-stack-client.svg)](https://npmjs.org/package/llama-stack-client) -| Kotlin | [llama-stack-client-kotlin](https://github.com/meta-llama/llama-stack-client-kotlin/tree/latest-release) | [![Maven version](https://img.shields.io/maven-central/v/com.llama.llamastack/llama-stack-client-kotlin)](https://central.sonatype.com/artifact/com.llama.llamastack/llama-stack-client-kotlin) \ No newline at end of file +| Kotlin | [llama-stack-client-kotlin](https://github.com/meta-llama/llama-stack-client-kotlin/tree/latest-release) | [![Maven version](https://img.shields.io/maven-central/v/com.llama.llamastack/llama-stack-client-kotlin)](https://central.sonatype.com/artifact/com.llama.llamastack/llama-stack-client-kotlin) diff --git a/docs/source/getting_started/quickstart.md b/docs/docs/getting_started/quickstart.mdx similarity index 65% rename from docs/source/getting_started/quickstart.md rename to docs/docs/getting_started/quickstart.mdx index 0136a7fba..fbc86cc2e 100644 --- a/docs/source/getting_started/quickstart.md +++ b/docs/docs/getting_started/quickstart.mdx @@ -1,4 +1,9 @@ -## Quickstart +--- +description: environments. +sidebar_label: Quickstart +sidebar_position: 1 +title: Quickstart +--- Get started with Llama Stack in minutes! @@ -6,7 +11,7 @@ Llama Stack is a stateful service with REST APIs to support the seamless transit environments. You can build and test using a local server first and deploy to a hosted endpoint for production. In this guide, we'll walk through how to build a RAG application locally using Llama Stack with [Ollama](https://ollama.com/) -as the inference [provider](../providers/inference/index) for a Llama Model. +as the inference [provider](/docs/providers/inference) for a Llama Model. **💡 Notebook Version:** You can also follow this quickstart guide in a Jupyter notebook format: [quick_start.ipynb](https://github.com/meta-llama/llama-stack/blob/main/docs/quick_start.ipynb) @@ -27,8 +32,75 @@ OLLAMA_URL=http://localhost:11434 \ #### Step 3: Run the demo Now open up a new terminal and copy the following script into a file named `demo_script.py`. -```{literalinclude} ./demo_script.py -:language: python +```python title="demo_script.py" +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. + +from llama_stack_client import Agent, AgentEventLogger, RAGDocument, LlamaStackClient + +vector_db_id = "my_demo_vector_db" +client = LlamaStackClient(base_url="http://localhost:8321") + +models = client.models.list() + +# Select the first LLM and first embedding models +model_id = next(m for m in models if m.model_type == "llm").identifier +embedding_model_id = ( + em := next(m for m in models if m.model_type == "embedding") +).identifier +embedding_dimension = em.metadata["embedding_dimension"] + +vector_db = client.vector_dbs.register( + vector_db_id=vector_db_id, + embedding_model=embedding_model_id, + embedding_dimension=embedding_dimension, + provider_id="faiss", +) +vector_db_id = vector_db.identifier +source = "https://www.paulgraham.com/greatwork.html" +print("rag_tool> Ingesting document:", source) +document = RAGDocument( + document_id="document_1", + content=source, + mime_type="text/html", + metadata={}, +) +client.tool_runtime.rag_tool.insert( + documents=[document], + vector_db_id=vector_db_id, + chunk_size_in_tokens=100, +) +agent = Agent( + client, + model=model_id, + instructions="You are a helpful assistant", + tools=[ + { + "name": "builtin::rag/knowledge_search", + "args": {"vector_db_ids": [vector_db_id]}, + } + ], +) + +prompt = "How do you do great work?" +print("prompt>", prompt) + +use_stream = True +response = agent.create_turn( + messages=[{"role": "user", "content": prompt}], + session_id=agent.create_session("rag_session"), + stream=use_stream, +) + +# Only call `AgentEventLogger().log(response)` for streaming responses. +if use_stream: + for log in AgentEventLogger().log(response): + log.print() +else: + print(response) ``` We will use `uv` to run the script ``` @@ -59,19 +131,19 @@ Ultimately, great work is about making a meaningful contribution and leaving a l ``` Congratulations! You've successfully built your first RAG application using Llama Stack! 🎉🥳 -```{admonition} HuggingFace access -:class: tip +:::tip HuggingFace access If you are getting a **401 Client Error** from HuggingFace for the **all-MiniLM-L6-v2** model, try setting **HF_TOKEN** to a valid HuggingFace token in your environment -``` + +::: ### Next Steps Now you're ready to dive deeper into Llama Stack! -- Explore the [Detailed Tutorial](./detailed_tutorial.md). +- Explore the [Detailed Tutorial](/docs/detailed_tutorial). - Try the [Getting Started Notebook](https://github.com/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb). - Browse more [Notebooks on GitHub](https://github.com/meta-llama/llama-stack/tree/main/docs/notebooks). -- Learn about Llama Stack [Concepts](../concepts/index.md). -- Discover how to [Build Llama Stacks](../distributions/index.md). -- Refer to our [References](../references/index.md) for details on the Llama CLI and Python SDK. +- Learn about Llama Stack [Concepts](/docs/concepts). +- Discover how to [Build Llama Stacks](/docs/distributions). +- Refer to our [References](/docs/references) for details on the Llama CLI and Python SDK. - Check out the [llama-stack-apps](https://github.com/meta-llama/llama-stack-apps/tree/main/examples) repository for example applications and tutorials. diff --git a/docs/docs/index.mdx b/docs/docs/index.mdx new file mode 100644 index 000000000..21e895d3f --- /dev/null +++ b/docs/docs/index.mdx @@ -0,0 +1,101 @@ +--- +sidebar_position: 1 +title: Welcome to Llama Stack +description: Llama Stack is the open-source framework for building generative AI applications +sidebar_label: Intro +tags: + - getting-started + - overview +--- + +# Welcome to Llama Stack + +Llama Stack is the open-source framework for building generative AI applications. + +:::tip Llama 4 is here! + +Check out [Getting Started with Llama 4](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/getting_started_llama4.ipynb) + +::: + +:::tip News + +Llama Stack is now available! See the [release notes](https://github.com/meta-llama/llama-stack/releases) for more details. + +::: + + +## What is Llama Stack? + +Llama Stack defines and standardizes the core building blocks needed to bring generative AI applications to market. It provides a unified set of APIs with implementations from leading service providers, enabling seamless transitions between development and production environments. More specifically, it provides: + +- **Unified API layer** for Inference, RAG, Agents, Tools, Safety, Evals, and Telemetry. +- **Plugin architecture** to support the rich ecosystem of implementations of the different APIs in different environments like local development, on-premises, cloud, and mobile. +- **Prepackaged verified distributions** which offer a one-stop solution for developers to get started quickly and reliably in any environment +- **Multiple developer interfaces** like CLI and SDKs for Python, Node, iOS, and Android +- **Standalone applications** as examples for how to build production-grade AI applications with Llama Stack + +Llama Stack + +Our goal is to provide pre-packaged implementations (aka "distributions") which can be run in a variety of deployment environments. LlamaStack can assist you in your entire app development lifecycle - start iterating on local, mobile or desktop and seamlessly transition to on-prem or public cloud deployments. At every point in this transition, the same set of APIs and the same developer experience is available. + +## How does Llama Stack work? + +Llama Stack consists of a server (with multiple pluggable API providers) and Client SDKs meant to be used in your applications. The server can be run in a variety of environments, including local (inline) development, on-premises, and cloud. The client SDKs are available for Python, Swift, Node, and Kotlin. + +## Quick Links + +- Ready to build? Check out the [Getting Started Guide](https://llama-stack.readthedocs.io/en/latest/getting_started/index.html) to get started. +- Want to contribute? See the [Contributing Guide](https://github.com/meta-llama/llama-stack/blob/main/CONTRIBUTING.md). +- Explore [Example Applications](https://github.com/meta-llama/llama-stack-apps) built with Llama Stack. + +## Rich Ecosystem Support + +Llama Stack provides adapters for popular providers across all API categories: + +- **Inference**: Meta Reference, Ollama, Fireworks, Together, NVIDIA, vLLM, AWS Bedrock, OpenAI, Anthropic, and more +- **Vector Databases**: FAISS, Chroma, Milvus, Postgres, Weaviate, Qdrant, and others +- **Safety**: Llama Guard, Prompt Guard, Code Scanner, AWS Bedrock +- **Training & Evaluation**: HuggingFace, TorchTune, NVIDIA NEMO + +:::info Provider Details +For complete provider compatibility and setup instructions, see our [Providers Documentation](https://llama-stack.readthedocs.io/en/latest/providers/index.html). +::: + +## Get Started Today + +

diff --git a/docs/source/references/evals_reference/index.md b/docs/docs/references/evals_reference/index.mdx similarity index 92% rename from docs/source/references/evals_reference/index.md rename to docs/docs/references/evals_reference/index.mdx index 9a5ed2f1b..0ec555e66 100644 --- a/docs/source/references/evals_reference/index.md +++ b/docs/docs/references/evals_reference/index.mdx @@ -9,12 +9,11 @@ We introduce a set of APIs in Llama Stack for supporting running evaluations of This guide goes over the sets of APIs and developer experience flow of using Llama Stack to run evaluations for different use cases. Checkout our Colab notebook on working examples with evaluations [here](https://colab.research.google.com/drive/10CHyykee9j2OigaIcRv47BKG9mrNm0tJ?usp=sharing). - ## Evaluation Concepts -The Evaluation APIs are associated with a set of Resources as shown in the following diagram. Please visit the Resources section in our [Core Concepts](../../concepts/index.md) guide for better high-level understanding. +The Evaluation APIs are associated with a set of Resources as shown in the following diagram. Please visit the Resources section in our [Core Concepts](../concepts/) guide for better high-level understanding. -![Eval Concepts](./resources/eval-concept.png) +![Eval Concepts](/img/eval-concept.png) - **DatasetIO**: defines interface with datasets and data loaders. - Associated with `Dataset` resource. @@ -23,7 +22,6 @@ The Evaluation APIs are associated with a set of Resources as shown in the follo - **Eval**: generate outputs (via Inference or Agents) and perform scoring. - Associated with `Benchmark` resource. - ## Evaluation Examples Walkthrough [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/notebooks/Llama_Stack_Benchmark_Evals.ipynb) @@ -156,7 +154,6 @@ response = client.eval.evaluate_rows( pprint(response) ``` - ### 2. Agentic Evaluation - In this example, we will demonstrate how to evaluate a agent candidate served by Llama Stack via `/agent` API. - We will continue to use the SimpleQA dataset we used in previous example. @@ -202,7 +199,7 @@ pprint(response) Llama Stack offers a library of scoring functions and the `/scoring` API, allowing you to run evaluations on your pre-annotated AI application datasets. -In this example, we will work with an example RAG dataset you have built previously, label with an annotation, and use LLM-As-Judge with custom judge prompt for scoring. Please checkout our [Llama Stack Playground](../../building_applications/playground/index.md) for an interactive interface to upload datasets and run scorings. +In this example, we will work with an example RAG dataset you have built previously, label with an annotation, and use LLM-As-Judge with custom judge prompt for scoring. Please checkout our [Llama Stack Playground](../building_applications/playground) for an interactive interface to upload datasets and run scorings. ```python judge_model_id = "meta-llama/Llama-3.1-405B-Instruct-FP8" @@ -268,29 +265,27 @@ response = client.scoring.score( ## Running Evaluations via CLI The following examples give the quick steps to start running evaluations using the llama-stack-client CLI. -#### Benchmark Evaluation CLI +### Benchmark Evaluation CLI There are 3 necessary input for running a benchmark eval - `list of benchmark_ids`: The list of benchmark ids to run evaluation on - `model-id`: The model id to evaluate on -- `utput_dir`: Path to store the evaluate results -``` +- `output_dir`: Path to store the evaluate results + +```bash llama-stack-client eval run-benchmark ... \ --model_id \ --output_dir \ ``` You can run -``` +```bash llama-stack-client eval run-benchmark help ``` -to see the description of all the flags to run benckmark eval +to see the description of all the flags to run benchmark eval +In the output log, you can find the path to the file that has your evaluation results. Open that file and you can see your aggregate evaluation results over there. -In the output log, you can find the path to the file that has your evaluation results. Open that file and you can see you aggrgate -evaluation results over there. - - -#### Application Evaluation CLI +### Application Evaluation CLI Usage: For running application evals, you will already have available datasets in hand from your application. You will need to specify: - `scoring-fn-id`: List of ScoringFunction identifiers you wish to use to run on your application. - `Dataset` used for evaluation: @@ -298,21 +293,19 @@ Usage: For running application evals, you will already have available datasets i - (2) `--dataset-id`: pre-registered dataset in Llama Stack - (Optional) `--scoring-params-config`: optionally parameterize scoring functions with custom params (e.g. `judge_prompt`, `judge_model`, `parsing_regexes`). - -``` +```bash llama-stack-client eval run_scoring ... --dataset-path \ --output-dir ./ ``` -#### Defining BenchmarkConfig +### Defining BenchmarkConfig The `BenchmarkConfig` are user specified config to define: 1. `EvalCandidate` to run generation on: - `ModelCandidate`: The model will be used for generation through LlamaStack /inference API. - `AgentCandidate`: The agentic system specified by AgentConfig will be used for generation through LlamaStack /agents API. 2. Optionally scoring function params to allow customization of scoring function behaviour. This is useful to parameterize generic scoring functions such as LLMAsJudge with custom `judge_model` / `judge_prompt`. - **Example BenchmarkConfig** ```json { @@ -340,29 +333,25 @@ The `BenchmarkConfig` are user specified config to define: } ``` - ## Open-benchmark Contributing Guide ### Create the new dataset for your new benchmark An eval open-benchmark essentially contains 2 parts: - `raw data`: The raw dataset associated with the benchmark. You typically need to search the original paper that introduces the benchmark and find the canonical dataset (usually hosted on huggingface) -- `prompt template`: How to ask the candidate model to generate the answer (prompt template plays a critical role to the evaluation results). Tyically, you can find the reference prompt template associated with the benchmark in benchmarks author's repo ([exmaple](https://github.com/idavidrein/gpqa/blob/main/prompts/chain_of_thought.txt)) or some other popular open source repos ([example](https://github.com/openai/simple-evals/blob/0a6e8f62e52bc5ae915f752466be3af596caf392/common.py#L14)) +- `prompt template`: How to ask the candidate model to generate the answer (prompt template plays a critical role to the evaluation results). Typically, you can find the reference prompt template associated with the benchmark in benchmarks author's repo ([example](https://github.com/idavidrein/gpqa/blob/main/prompts/chain_of_thought.txt)) or some other popular open source repos ([example](https://github.com/openai/simple-evals/blob/0a6e8f62e52bc5ae915f752466be3af596caf392/common.py#L14)) -To create new open-benmark in llama stack, you need to combine the prompt template and the raw data into the `chat_completion_input` column in the evaluation dataset. +To create new open-benchmark in llama stack, you need to combine the prompt template and the raw data into the `chat_completion_input` column in the evaluation dataset. -Llama stack enforeces the evaluate dataset schema to contain at least 3 columns: +Llama stack enforces the evaluate dataset schema to contain at least 3 columns: - `chat_completion_input`: The actual input to the model to run the generation for eval - `input_query`: The raw input from the raw dataset without the prompt template -- `expected_answer`: The ground truth for scoring functions to calcalate the score from. - +- `expected_answer`: The ground truth for scoring functions to calculate the score from. You need to write a script [example convert script](https://gist.github.com/yanxi0830/118e9c560227d27132a7fd10e2c92840) to convert the benchmark raw dataset to llama stack format eval dataset and update the dataset to huggingface [example benchmark dataset](https://huggingface.co/datasets/llamastack/mmmu) - ### Find scoring function for your new benchmark The purpose of scoring function is to calculate the score for each example based on candidate model generation result and expected_answer. It also aggregates the scores from all the examples and generate the final evaluate results. - Firstly, you can see if the existing [llama stack scoring functions](https://github.com/meta-llama/llama-stack/tree/main/llama_stack/providers/inline/scoring) can fulfill your need. If not, you need to write a new scoring function based on what benchmark author / other open source repo describe. ### Add new benchmark into template @@ -373,17 +362,15 @@ Secondly, you need to add the new benchmark you just created under the `benchmar - `dataset_id`: identifier of the dataset associated with your benchmark - `scoring_functions`: scoring function to calculate the score based on generation results and expected_answer - ### Test the new benchmark Spin up llama stack server with 'open-benchmark' templates -``` +```bash llama stack run llama_stack/distributions/open-benchmark/run.yaml - ``` Run eval benchmark CLI with your new benchmark id -``` +```bash llama-stack-client eval run-benchmark \ --model_id \ --output_dir \ diff --git a/docs/source/references/evals_reference/resources/eval-concept.png b/docs/docs/references/evals_reference/resources/eval-concept.png similarity index 100% rename from docs/source/references/evals_reference/resources/eval-concept.png rename to docs/docs/references/evals_reference/resources/eval-concept.png diff --git a/docs/source/references/evals_reference/resources/eval-flow.png b/docs/docs/references/evals_reference/resources/eval-flow.png similarity index 100% rename from docs/source/references/evals_reference/resources/eval-flow.png rename to docs/docs/references/evals_reference/resources/eval-flow.png diff --git a/docs/docs/references/index.mdx b/docs/docs/references/index.mdx new file mode 100644 index 000000000..9bf41b6d5 --- /dev/null +++ b/docs/docs/references/index.mdx @@ -0,0 +1,12 @@ +--- +title: References +description: Reference documentation for Llama Stack +sidebar_label: Overview +sidebar_position: 1 +--- + +# References + +- [Python SDK Reference](python_sdk_reference/index) +- [Llama CLI](llama_cli_reference/index) for building and running your Llama Stack server +- [Llama Stack Client CLI](llama_stack_client_cli_reference) for interacting with your Llama Stack server diff --git a/docs/source/references/llama_cli_reference/download_models.md b/docs/docs/references/llama_cli_reference/download_models.md similarity index 100% rename from docs/source/references/llama_cli_reference/download_models.md rename to docs/docs/references/llama_cli_reference/download_models.md diff --git a/docs/source/references/llama_cli_reference/index.md b/docs/docs/references/llama_cli_reference/index.md similarity index 100% rename from docs/source/references/llama_cli_reference/index.md rename to docs/docs/references/llama_cli_reference/index.md diff --git a/docs/source/references/llama_stack_client_cli_reference.md b/docs/docs/references/llama_stack_client_cli_reference.md similarity index 100% rename from docs/source/references/llama_stack_client_cli_reference.md rename to docs/docs/references/llama_stack_client_cli_reference.md diff --git a/docs/source/references/python_sdk_reference/index.md b/docs/docs/references/python_sdk_reference/index.md similarity index 100% rename from docs/source/references/python_sdk_reference/index.md rename to docs/docs/references/python_sdk_reference/index.md diff --git a/docs/source/building_applications/evals.md b/docs/source/building_applications/evals.md deleted file mode 100644 index ded62cebb..000000000 --- a/docs/source/building_applications/evals.md +++ /dev/null @@ -1,125 +0,0 @@ -# Evaluations - -The Llama Stack provides a set of APIs in Llama Stack for supporting running evaluations of LLM applications. -- `/datasetio` + `/datasets` API -- `/scoring` + `/scoring_functions` API -- `/eval` + `/benchmarks` API - - - -This guides walks you through the process of evaluating an LLM application built using Llama Stack. Checkout the [Evaluation Reference](../references/evals_reference/index.md) guide goes over the sets of APIs and developer experience flow of using Llama Stack to run evaluations for benchmark and application use cases. Checkout our Colab notebook on working examples with evaluations [here](https://colab.research.google.com/drive/10CHyykee9j2OigaIcRv47BKG9mrNm0tJ?usp=sharing). - - -## Application Evaluation - -[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb) - -Llama Stack offers a library of scoring functions and the `/scoring` API, allowing you to run evaluations on your pre-annotated AI application datasets. - -In this example, we will show you how to: -1. Build an Agent with Llama Stack -2. Query the agent's sessions, turns, and steps -3. Evaluate the results. - -##### Building a Search Agent -```python -from llama_stack_client import LlamaStackClient, Agent, AgentEventLogger - -client = LlamaStackClient(base_url=f"http://{HOST}:{PORT}") - -agent = Agent( - client, - model="meta-llama/Llama-3.3-70B-Instruct", - instructions="You are a helpful assistant. Use search tool to answer the questions. ", - tools=["builtin::websearch"], -) -user_prompts = [ - "Which teams played in the NBA Western Conference Finals of 2024. Search the web for the answer.", - "In which episode and season of South Park does Bill Cosby (BSM-471) first appear? Give me the number and title. Search the web for the answer.", - "What is the British-American kickboxer Andrew Tate's kickboxing name? Search the web for the answer.", -] - -session_id = agent.create_session("test-session") - -for prompt in user_prompts: - response = agent.create_turn( - messages=[ - { - "role": "user", - "content": prompt, - } - ], - session_id=session_id, - ) - - for log in AgentEventLogger().log(response): - log.print() -``` - - -##### Query Agent Execution Steps - -Now, let's look deeper into the agent's execution steps and see if how well our agent performs. -```python -# query the agents session -from rich.pretty import pprint - -session_response = client.agents.session.retrieve( - session_id=session_id, - agent_id=agent.agent_id, -) - -pprint(session_response) -``` - -As a sanity check, we will first check if all user prompts is followed by a tool call to `brave_search`. -```python -num_tool_call = 0 -for turn in session_response.turns: - for step in turn.steps: - if ( - step.step_type == "tool_execution" - and step.tool_calls[0].tool_name == "brave_search" - ): - num_tool_call += 1 - -print( - f"{num_tool_call}/{len(session_response.turns)} user prompts are followed by a tool call to `brave_search`" -) -``` - -##### Evaluate Agent Responses -Now, we want to evaluate the agent's responses to the user prompts. - -1. First, we will process the agent's execution history into a list of rows that can be used for evaluation. -2. Next, we will label the rows with the expected answer. -3. Finally, we will use the `/scoring` API to score the agent's responses. - -```python -eval_rows = [] - -expected_answers = [ - "Dallas Mavericks and the Minnesota Timberwolves", - "Season 4, Episode 12", - "King Cobra", -] - -for i, turn in enumerate(session_response.turns): - eval_rows.append( - { - "input_query": turn.input_messages[0].content, - "generated_answer": turn.output_message.content, - "expected_answer": expected_answers[i], - } - ) - -pprint(eval_rows) - -scoring_params = { - "basic::subset_of": None, -} -scoring_response = client.scoring.score( - input_rows=eval_rows, scoring_functions=scoring_params -) -pprint(scoring_response) -``` diff --git a/docs/source/building_applications/index.md b/docs/source/building_applications/index.md deleted file mode 100644 index fddd957ed..000000000 --- a/docs/source/building_applications/index.md +++ /dev/null @@ -1,33 +0,0 @@ -# AI Application Examples - -Llama Stack provides all the building blocks needed to create sophisticated AI applications. - -The best way to get started is to look at this notebook which walks through the various APIs (from basic inference, to RAG agents) and how to use them. - -**Notebook**: [Building AI Applications](https://github.com/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb) - -Here are some key topics that will help you build effective agents: - -- **[RAG (Retrieval-Augmented Generation)](rag)**: Learn how to enhance your agents with external knowledge through retrieval mechanisms. -- **[Agent](agent)**: Understand the components and design patterns of the Llama Stack agent framework. -- **[Agent Execution Loop](agent_execution_loop)**: Understand how agents process information, make decisions, and execute actions in a continuous loop. -- **[Agents vs Responses API](responses_vs_agents)**: Learn the differences between the Agents API and Responses API, and when to use each one. -- **[Tools](tools)**: Extend your agents' capabilities by integrating with external tools and APIs. -- **[Evals](evals)**: Evaluate your agents' effectiveness and identify areas for improvement. -- **[Telemetry](telemetry)**: Monitor and analyze your agents' performance and behavior. -- **[Safety](safety)**: Implement guardrails and safety measures to ensure responsible AI behavior. - -```{toctree} -:hidden: -:maxdepth: 1 - -rag -agent -agent_execution_loop -responses_vs_agents -tools -evals -telemetry -safety -playground/index -``` \ No newline at end of file diff --git a/docs/source/building_applications/playground/index.md b/docs/source/building_applications/playground/index.md deleted file mode 100644 index 2390c422f..000000000 --- a/docs/source/building_applications/playground/index.md +++ /dev/null @@ -1,107 +0,0 @@ -## Llama Stack Playground - -```{note} -The Llama Stack Playground is currently experimental and subject to change. We welcome feedback and contributions to help improve it. -``` - -The Llama Stack Playground is an simple interface which aims to: -- Showcase **capabilities** and **concepts** of Llama Stack in an interactive environment -- Demo **end-to-end** application code to help users get started to build their own applications -- Provide an **UI** to help users inspect and understand Llama Stack API providers and resources - -### Key Features - -#### Playground -Interactive pages for users to play with and explore Llama Stack API capabilities. - -##### Chatbot -```{eval-rst} -.. video:: https://github.com/user-attachments/assets/8d2ef802-5812-4a28-96e1-316038c84cbf - :autoplay: - :playsinline: - :muted: - :loop: - :width: 100% -``` -- **Chat**: Chat with Llama models. - - This page is a simple chatbot that allows you to chat with Llama models. Under the hood, it uses the `/inference/chat-completion` streaming API to send messages to the model and receive responses. -- **RAG**: Uploading documents to memory_banks and chat with RAG agent - - This page allows you to upload documents as a `memory_bank` and then chat with a RAG agent to query information about the uploaded documents. - - Under the hood, it uses Llama Stack's `/agents` API to define and create a RAG agent and chat with it in a session. - -##### Evaluations -```{eval-rst} -.. video:: https://github.com/user-attachments/assets/6cc1659f-eba4-49ca-a0a5-7c243557b4f5 - :autoplay: - :playsinline: - :muted: - :loop: - :width: 100% -``` -- **Evaluations (Scoring)**: Run evaluations on your AI application datasets. - - This page demonstrates the flow evaluation API to run evaluations on your custom AI application datasets. You may upload your own evaluation datasets and run evaluations using available scoring functions. - - Under the hood, it uses Llama Stack's `/scoring` API to run evaluations on selected scoring functions. - -```{eval-rst} -.. video:: https://github.com/user-attachments/assets/345845c7-2a2b-4095-960a-9ae40f6a93cf - :autoplay: - :playsinline: - :muted: - :loop: - :width: 100% -``` -- **Evaluations (Generation + Scoring)**: Use pre-registered evaluation tasks to evaluate an model or agent candidate - - This page demonstrates the flow for evaluation API to evaluate an model or agent candidate on pre-defined evaluation tasks. An evaluation task is a combination of dataset and scoring functions. - - Under the hood, it uses Llama Stack's `/eval` API to run generations and scorings on specified evaluation configs. - - In order to run this page, you may need to register evaluation tasks and datasets as resources first through the following commands. - ```bash - $ llama-stack-client datasets register \ - --dataset-id "mmlu" \ - --provider-id "huggingface" \ - --url "https://huggingface.co/datasets/llamastack/evals" \ - --metadata '{"path": "llamastack/evals", "name": "evals__mmlu__details", "split": "train"}' \ - --schema '{"input_query": {"type": "string"}, "expected_answer": {"type": "string"}, "chat_completion_input": {"type": "string"}}' - ``` - - ```bash - $ llama-stack-client benchmarks register \ - --eval-task-id meta-reference-mmlu \ - --provider-id meta-reference \ - --dataset-id mmlu \ - --scoring-functions basic::regex_parser_multiple_choice_answer - ``` - - -##### Inspect -```{eval-rst} -.. video:: https://github.com/user-attachments/assets/01d52b2d-92af-4e3a-b623-a9b8ba22ba99 - :autoplay: - :playsinline: - :muted: - :loop: - :width: 100% -``` -- **API Providers**: Inspect Llama Stack API providers - - This page allows you to inspect Llama Stack API providers and resources. - - Under the hood, it uses Llama Stack's `/providers` API to get information about the providers. - -- **API Resources**: Inspect Llama Stack API resources - - This page allows you to inspect Llama Stack API resources (`models`, `datasets`, `memory_banks`, `benchmarks`, `shields`). - - Under the hood, it uses Llama Stack's `//list` API to get information about each resources. - - Please visit [Core Concepts](../../concepts/index.md) for more details about the resources. - -### Starting the Llama Stack Playground - -To start the Llama Stack Playground, run the following commands: - -1. Start up the Llama Stack API server - -```bash -llama stack build --distro together --image-type venv -llama stack run together -``` - -2. Start Streamlit UI -```bash -uv run --with ".[ui]" streamlit run llama_stack.core/ui/app.py -``` diff --git a/docs/source/building_applications/safety.md b/docs/source/building_applications/safety.md deleted file mode 100644 index 30afe7ad2..000000000 --- a/docs/source/building_applications/safety.md +++ /dev/null @@ -1,17 +0,0 @@ -## Safety Guardrails - -Safety is a critical component of any AI application. Llama Stack provides a Shield system that can be applied at multiple touchpoints: - -```python -# Register a safety shield -shield_id = "content_safety" -client.shields.register(shield_id=shield_id, provider_shield_id="llama-guard-basic") - -# Run content through shield -response = client.safety.run_shield( - shield_id=shield_id, messages=[{"role": "user", "content": "User message here"}] -) - -if response.violation: - print(f"Safety violation detected: {response.violation.user_message}") -``` diff --git a/docs/source/building_applications/telemetry.md b/docs/source/building_applications/telemetry.md deleted file mode 100644 index d93242f75..000000000 --- a/docs/source/building_applications/telemetry.md +++ /dev/null @@ -1,143 +0,0 @@ -## Telemetry - -The Llama Stack telemetry system provides comprehensive tracing, metrics, and logging capabilities. It supports multiple sink types including OpenTelemetry, SQLite, and Console output. - -### Events -The telemetry system supports three main types of events: - -- **Unstructured Log Events**: Free-form log messages with severity levels -```python -unstructured_log_event = UnstructuredLogEvent( - message="This is a log message", severity=LogSeverity.INFO -) -``` -- **Metric Events**: Numerical measurements with units -```python -metric_event = MetricEvent(metric="my_metric", value=10, unit="count") -``` -- **Structured Log Events**: System events like span start/end. Extensible to add more structured log types. -```python -structured_log_event = SpanStartPayload(name="my_span", parent_span_id="parent_span_id") -``` - -### Spans and Traces -- **Spans**: Represent operations with timing and hierarchical relationships -- **Traces**: Collection of related spans forming a complete request flow - -### Metrics - -Llama Stack automatically generates metrics during inference operations. These metrics are aggregated at the **inference request level** and provide insights into token usage and model performance. - -#### Available Metrics - -The following metrics are automatically generated for each inference request: - -| Metric Name | Type | Unit | Description | Labels | -|-------------|------|------|-------------|--------| -| `llama_stack_prompt_tokens_total` | Counter | `tokens` | Number of tokens in the input prompt | `model_id`, `provider_id` | -| `llama_stack_completion_tokens_total` | Counter | `tokens` | Number of tokens in the generated response | `model_id`, `provider_id` | -| `llama_stack_tokens_total` | Counter | `tokens` | Total tokens used (prompt + completion) | `model_id`, `provider_id` | - -#### Metric Generation Flow - -1. **Token Counting**: During inference operations (chat completion, completion, etc.), the system counts tokens in both input prompts and generated responses -2. **Metric Construction**: For each request, `MetricEvent` objects are created with the token counts -3. **Telemetry Logging**: Metrics are sent to the configured telemetry sinks -4. **OpenTelemetry Export**: When OpenTelemetry is enabled, metrics are exposed as standard OpenTelemetry counters - -#### Metric Aggregation Level - -All metrics are generated and aggregated at the **inference request level**. This means: - -- Each individual inference request generates its own set of metrics -- Metrics are not pre-aggregated across multiple requests -- Aggregation (sums, averages, etc.) can be performed by your observability tools (Prometheus, Grafana, etc.) -- Each metric includes labels for `model_id` and `provider_id` to enable filtering and grouping - -#### Example Metric Event - -```python -MetricEvent( - trace_id="1234567890abcdef", - span_id="abcdef1234567890", - metric="total_tokens", - value=150, - timestamp=1703123456.789, - unit="tokens", - attributes={"model_id": "meta-llama/Llama-3.2-3B-Instruct", "provider_id": "tgi"}, -) -``` - -#### Querying Metrics - -When using the OpenTelemetry sink, metrics are exposed in standard OpenTelemetry format and can be queried through: - -- **Prometheus**: Scrape metrics from the OpenTelemetry Collector's metrics endpoint -- **Grafana**: Create dashboards using Prometheus as a data source -- **OpenTelemetry Collector**: Forward metrics to other observability systems - -Example Prometheus queries: -```promql -# Total tokens used across all models -sum(llama_stack_tokens_total) - -# Tokens per model -sum by (model_id) (llama_stack_tokens_total) - -# Average tokens per request -rate(llama_stack_tokens_total[5m]) -``` - -### Sinks -- **OpenTelemetry**: Send events to an OpenTelemetry Collector. This is useful for visualizing traces in a tool like Jaeger and collecting metrics for Prometheus. -- **SQLite**: Store events in a local SQLite database. This is needed if you want to query the events later through the Llama Stack API. -- **Console**: Print events to the console. - -### Providers - -#### Meta-Reference Provider -Currently, only the meta-reference provider is implemented. It can be configured to send events to multiple sink types: -1) OpenTelemetry Collector (traces and metrics) -2) SQLite (traces only) -3) Console (all events) - -#### Configuration - -Here's an example that sends telemetry signals to all sink types. Your configuration might use only one or a subset. - -```yaml - telemetry: - - provider_id: meta-reference - provider_type: inline::meta-reference - config: - service_name: "llama-stack-service" - sinks: ['console', 'sqlite', 'otel_trace', 'otel_metric'] - otel_exporter_otlp_endpoint: "http://localhost:4318" - sqlite_db_path: "/path/to/telemetry.db" -``` - -**Environment Variables:** -- `OTEL_EXPORTER_OTLP_ENDPOINT`: OpenTelemetry Collector endpoint (default: `http://localhost:4318`) -- `OTEL_SERVICE_NAME`: Service name for telemetry (default: empty string) -- `TELEMETRY_SINKS`: Comma-separated list of sinks (default: `console,sqlite`) - -### Jaeger to visualize traces - -The `otel_trace` sink works with any service compatible with the OpenTelemetry collector. Traces and metrics use separate endpoints but can share the same collector. - -Start a Jaeger instance with the OTLP HTTP endpoint at 4318 and the Jaeger UI at 16686 using the following command: - -```bash -$ docker run --pull always --rm --name jaeger \ - -p 16686:16686 -p 4318:4318 \ - jaegertracing/jaeger:2.1.0 -``` - -Once the Jaeger instance is running, you can visualize traces by navigating to http://localhost:16686/. - -### Querying Traces Stored in SQLite - -The `sqlite` sink allows you to query traces without an external system. Here are some example -queries. Refer to the notebook at [Llama Stack Building AI -Applications](https://github.com/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb) for -more examples on how to query traces and spans. diff --git a/docs/source/concepts/index.md b/docs/source/concepts/index.md deleted file mode 100644 index a483132b8..000000000 --- a/docs/source/concepts/index.md +++ /dev/null @@ -1,23 +0,0 @@ -# Core Concepts - -Given Llama Stack's service-oriented philosophy, a few concepts and workflows arise which may not feel completely natural in the LLM landscape, especially if you are coming with a background in other frameworks. - -```{include} architecture.md -:start-after: ## Llama Stack architecture -``` - -```{include} apis.md -:start-after: ## APIs -``` - -```{include} api_providers.md -:start-after: ## API Providers -``` - -```{include} distributions.md -:start-after: ## Distributions -``` - -```{include} resources.md -:start-after: ## Resources -``` diff --git a/docs/source/contributing/index.md b/docs/source/contributing/index.md deleted file mode 100644 index 71c3bd5a6..000000000 --- a/docs/source/contributing/index.md +++ /dev/null @@ -1,39 +0,0 @@ - -```{include} ../../../CONTRIBUTING.md -``` - -## Adding a New Provider - -See: -- [Adding a New API Provider Page](new_api_provider.md) which describes how to add new API providers to the Stack. -- [Vector Database Page](new_vector_database.md) which describes how to add a new vector databases with Llama Stack. -- [External Provider Page](../providers/external/index.md) which describes how to add external providers to the Stack. - -```{toctree} -:maxdepth: 1 -:hidden: - -new_api_provider -new_vector_database -``` - -## Testing - - -```{include} ../../../tests/README.md -``` - -## Advanced Topics - -For developers who need deeper understanding of the testing system internals: - -```{toctree} -:maxdepth: 1 - -testing/record-replay -``` - -### Benchmarking - -```{include} ../../../benchmarking/k8s-benchmark/README.md -``` diff --git a/docs/source/deploying/index.md b/docs/source/deploying/index.md deleted file mode 100644 index 73b5bf4f5..000000000 --- a/docs/source/deploying/index.md +++ /dev/null @@ -1,4 +0,0 @@ -# Deployment Examples - -```{include} kubernetes_deployment.md -``` \ No newline at end of file diff --git a/docs/source/distributions/index.md b/docs/source/distributions/index.md deleted file mode 100644 index 2a702c282..000000000 --- a/docs/source/distributions/index.md +++ /dev/null @@ -1,15 +0,0 @@ -# Distributions Overview - -A distribution is a pre-packaged set of Llama Stack components that can be deployed together. - -This section provides an overview of the distributions available in Llama Stack. - -```{toctree} -:maxdepth: 3 -list_of_distributions -building_distro -customizing_run_yaml -starting_llama_stack_server -importing_as_library -configuration -``` diff --git a/docs/source/distributions/self_hosted_distro/meta-reference-gpu.md b/docs/source/distributions/self_hosted_distro/meta-reference-gpu.md deleted file mode 100644 index 84b85b91c..000000000 --- a/docs/source/distributions/self_hosted_distro/meta-reference-gpu.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -orphan: true ---- - -# Meta Reference GPU Distribution - -```{toctree} -:maxdepth: 2 -:hidden: - -self -``` - -The `llamastack/distribution-meta-reference-gpu` distribution consists of the following provider configurations: - -| API | Provider(s) | -|-----|-------------| -| agents | `inline::meta-reference` | -| datasetio | `remote::huggingface`, `inline::localfs` | -| eval | `inline::meta-reference` | -| inference | `inline::meta-reference` | -| safety | `inline::llama-guard` | -| scoring | `inline::basic`, `inline::llm-as-judge`, `inline::braintrust` | -| telemetry | `inline::meta-reference` | -| tool_runtime | `remote::brave-search`, `remote::tavily-search`, `inline::rag-runtime`, `remote::model-context-protocol` | -| vector_io | `inline::faiss`, `remote::chromadb`, `remote::pgvector` | - - -Note that you need access to nvidia GPUs to run this distribution. This distribution is not compatible with CPU-only machines or machines with AMD GPUs. - -### Environment Variables - -The following environment variables can be configured: - -- `LLAMA_STACK_PORT`: Port for the Llama Stack distribution server (default: `8321`) -- `INFERENCE_MODEL`: Inference model loaded into the Meta Reference server (default: `meta-llama/Llama-3.2-3B-Instruct`) -- `INFERENCE_CHECKPOINT_DIR`: Directory containing the Meta Reference model checkpoint (default: `null`) -- `SAFETY_MODEL`: Name of the safety (Llama-Guard) model to use (default: `meta-llama/Llama-Guard-3-1B`) -- `SAFETY_CHECKPOINT_DIR`: Directory containing the Llama-Guard model checkpoint (default: `null`) - - -## Prerequisite: Downloading Models - -Please use `llama model list --downloaded` to check that you have llama model checkpoints downloaded in `~/.llama` before proceeding. See [installation guide](../../references/llama_cli_reference/download_models.md) here to download the models. Run `llama model list` to see the available models to download, and `llama model download` to download the checkpoints. - -``` -$ llama model list --downloaded -┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┓ -┃ Model ┃ Size ┃ Modified Time ┃ -┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━┩ -│ Llama3.2-1B-Instruct:int4-qlora-eo8 │ 1.53 GB │ 2025-02-26 11:22:28 │ -├─────────────────────────────────────────┼──────────┼─────────────────────┤ -│ Llama3.2-1B │ 2.31 GB │ 2025-02-18 21:48:52 │ -├─────────────────────────────────────────┼──────────┼─────────────────────┤ -│ Prompt-Guard-86M │ 0.02 GB │ 2025-02-26 11:29:28 │ -├─────────────────────────────────────────┼──────────┼─────────────────────┤ -│ Llama3.2-3B-Instruct:int4-spinquant-eo8 │ 3.69 GB │ 2025-02-26 11:37:41 │ -├─────────────────────────────────────────┼──────────┼─────────────────────┤ -│ Llama3.2-3B │ 5.99 GB │ 2025-02-18 21:51:26 │ -├─────────────────────────────────────────┼──────────┼─────────────────────┤ -│ Llama3.1-8B │ 14.97 GB │ 2025-02-16 10:36:37 │ -├─────────────────────────────────────────┼──────────┼─────────────────────┤ -│ Llama3.2-1B-Instruct:int4-spinquant-eo8 │ 1.51 GB │ 2025-02-26 11:35:02 │ -├─────────────────────────────────────────┼──────────┼─────────────────────┤ -│ Llama-Guard-3-1B │ 2.80 GB │ 2025-02-26 11:20:46 │ -├─────────────────────────────────────────┼──────────┼─────────────────────┤ -│ Llama-Guard-3-1B:int4 │ 0.43 GB │ 2025-02-26 11:33:33 │ -└─────────────────────────────────────────┴──────────┴─────────────────────┘ -``` - -## Running the Distribution - -You can do this via venv or Docker which has a pre-built image. - -### Via Docker - -This method allows you to get started quickly without having to build the distribution code. - -```bash -LLAMA_STACK_PORT=8321 -docker run \ - -it \ - --pull always \ - --gpu all \ - -p $LLAMA_STACK_PORT:$LLAMA_STACK_PORT \ - -v ~/.llama:/root/.llama \ - llamastack/distribution-meta-reference-gpu \ - --port $LLAMA_STACK_PORT \ - --env INFERENCE_MODEL=meta-llama/Llama-3.2-3B-Instruct -``` - -If you are using Llama Stack Safety / Shield APIs, use: - -```bash -docker run \ - -it \ - --pull always \ - --gpu all \ - -p $LLAMA_STACK_PORT:$LLAMA_STACK_PORT \ - -v ~/.llama:/root/.llama \ - llamastack/distribution-meta-reference-gpu \ - --port $LLAMA_STACK_PORT \ - --env INFERENCE_MODEL=meta-llama/Llama-3.2-3B-Instruct \ - --env SAFETY_MODEL=meta-llama/Llama-Guard-3-1B -``` - -### Via venv - -Make sure you have done `uv pip install llama-stack` and have the Llama Stack CLI available. - -```bash -llama stack build --distro meta-reference-gpu --image-type venv -llama stack run distributions/meta-reference-gpu/run.yaml \ - --port 8321 \ - --env INFERENCE_MODEL=meta-llama/Llama-3.2-3B-Instruct -``` - -If you are using Llama Stack Safety / Shield APIs, use: - -```bash -llama stack run distributions/meta-reference-gpu/run-with-safety.yaml \ - --port 8321 \ - --env INFERENCE_MODEL=meta-llama/Llama-3.2-3B-Instruct \ - --env SAFETY_MODEL=meta-llama/Llama-Guard-3-1B -``` diff --git a/docs/source/distributions/self_hosted_distro/nvidia.md b/docs/source/distributions/self_hosted_distro/nvidia.md deleted file mode 100644 index d4f070075..000000000 --- a/docs/source/distributions/self_hosted_distro/nvidia.md +++ /dev/null @@ -1,171 +0,0 @@ ---- -orphan: true ---- - -# NVIDIA Distribution - -The `llamastack/distribution-nvidia` distribution consists of the following provider configurations. - -| API | Provider(s) | -|-----|-------------| -| agents | `inline::meta-reference` | -| datasetio | `inline::localfs`, `remote::nvidia` | -| eval | `remote::nvidia` | -| files | `inline::localfs` | -| inference | `remote::nvidia` | -| post_training | `remote::nvidia` | -| safety | `remote::nvidia` | -| scoring | `inline::basic` | -| telemetry | `inline::meta-reference` | -| tool_runtime | `inline::rag-runtime` | -| vector_io | `inline::faiss` | - - -### Environment Variables - -The following environment variables can be configured: - -- `NVIDIA_API_KEY`: NVIDIA API Key (default: ``) -- `NVIDIA_APPEND_API_VERSION`: Whether to append the API version to the base_url (default: `True`) -- `NVIDIA_DATASET_NAMESPACE`: NVIDIA Dataset Namespace (default: `default`) -- `NVIDIA_PROJECT_ID`: NVIDIA Project ID (default: `test-project`) -- `NVIDIA_CUSTOMIZER_URL`: NVIDIA Customizer URL (default: `https://customizer.api.nvidia.com`) -- `NVIDIA_OUTPUT_MODEL_DIR`: NVIDIA Output Model Directory (default: `test-example-model@v1`) -- `GUARDRAILS_SERVICE_URL`: URL for the NeMo Guardrails Service (default: `http://0.0.0.0:7331`) -- `NVIDIA_GUARDRAILS_CONFIG_ID`: NVIDIA Guardrail Configuration ID (default: `self-check`) -- `NVIDIA_EVALUATOR_URL`: URL for the NeMo Evaluator Service (default: `http://0.0.0.0:7331`) -- `INFERENCE_MODEL`: Inference model (default: `Llama3.1-8B-Instruct`) -- `SAFETY_MODEL`: Name of the model to use for safety (default: `meta/llama-3.1-8b-instruct`) - -### Models - -The following models are available by default: - -- `meta/llama3-8b-instruct ` -- `meta/llama3-70b-instruct ` -- `meta/llama-3.1-8b-instruct ` -- `meta/llama-3.1-70b-instruct ` -- `meta/llama-3.1-405b-instruct ` -- `meta/llama-3.2-1b-instruct ` -- `meta/llama-3.2-3b-instruct ` -- `meta/llama-3.2-11b-vision-instruct ` -- `meta/llama-3.2-90b-vision-instruct ` -- `meta/llama-3.3-70b-instruct ` -- `nvidia/vila ` -- `nvidia/llama-3.2-nv-embedqa-1b-v2 ` -- `nvidia/nv-embedqa-e5-v5 ` -- `nvidia/nv-embedqa-mistral-7b-v2 ` -- `snowflake/arctic-embed-l ` - - -## Prerequisites -### NVIDIA API Keys - -Make sure you have access to a NVIDIA API Key. You can get one by visiting [https://build.nvidia.com/](https://build.nvidia.com/). Use this key for the `NVIDIA_API_KEY` environment variable. - -### Deploy NeMo Microservices Platform -The NVIDIA NeMo microservices platform supports end-to-end microservice deployment of a complete AI flywheel on your Kubernetes cluster through the NeMo Microservices Helm Chart. Please reference the [NVIDIA NeMo Microservices documentation](https://docs.nvidia.com/nemo/microservices/latest/about/index.html) for platform prerequisites and instructions to install and deploy the platform. - -## Supported Services -Each Llama Stack API corresponds to a specific NeMo microservice. The core microservices (Customizer, Evaluator, Guardrails) are exposed by the same endpoint. The platform components (Data Store) are each exposed by separate endpoints. - -### Inference: NVIDIA NIM -NVIDIA NIM is used for running inference with registered models. There are two ways to access NVIDIA NIMs: - 1. Hosted (default): Preview APIs hosted at https://integrate.api.nvidia.com (Requires an API key) - 2. Self-hosted: NVIDIA NIMs that run on your own infrastructure. - -The deployed platform includes the NIM Proxy microservice, which is the service that provides to access your NIMs (for example, to run inference on a model). Set the `NVIDIA_BASE_URL` environment variable to use your NVIDIA NIM Proxy deployment. - -### Datasetio API: NeMo Data Store -The NeMo Data Store microservice serves as the default file storage solution for the NeMo microservices platform. It exposts APIs compatible with the Hugging Face Hub client (`HfApi`), so you can use the client to interact with Data Store. The `NVIDIA_DATASETS_URL` environment variable should point to your NeMo Data Store endpoint. - -See the {repopath}`NVIDIA Datasetio docs::llama_stack/providers/remote/datasetio/nvidia/README.md` for supported features and example usage. - -### Eval API: NeMo Evaluator -The NeMo Evaluator microservice supports evaluation of LLMs. Launching an Evaluation job with NeMo Evaluator requires an Evaluation Config (an object that contains metadata needed by the job). A Llama Stack Benchmark maps to an Evaluation Config, so registering a Benchmark creates an Evaluation Config in NeMo Evaluator. The `NVIDIA_EVALUATOR_URL` environment variable should point to your NeMo Microservices endpoint. - -See the {repopath}`NVIDIA Eval docs::llama_stack/providers/remote/eval/nvidia/README.md` for supported features and example usage. - -### Post-Training API: NeMo Customizer -The NeMo Customizer microservice supports fine-tuning models. You can reference {repopath}`this list of supported models::llama_stack/providers/remote/post_training/nvidia/models.py` that can be fine-tuned using Llama Stack. The `NVIDIA_CUSTOMIZER_URL` environment variable should point to your NeMo Microservices endpoint. - -See the {repopath}`NVIDIA Post-Training docs::llama_stack/providers/remote/post_training/nvidia/README.md` for supported features and example usage. - -### Safety API: NeMo Guardrails -The NeMo Guardrails microservice sits between your application and the LLM, and adds checks and content moderation to a model. The `GUARDRAILS_SERVICE_URL` environment variable should point to your NeMo Microservices endpoint. - -See the {repopath}`NVIDIA Safety docs::llama_stack/providers/remote/safety/nvidia/README.md` for supported features and example usage. - -## Deploying models -In order to use a registered model with the Llama Stack APIs, ensure the corresponding NIM is deployed to your environment. For example, you can use the NIM Proxy microservice to deploy `meta/llama-3.2-1b-instruct`. - -Note: For improved inference speeds, we need to use NIM with `fast_outlines` guided decoding system (specified in the request body). This is the default if you deployed the platform with the NeMo Microservices Helm Chart. -```sh -# URL to NeMo NIM Proxy service -export NEMO_URL="http://nemo.test" - -curl --location "$NEMO_URL/v1/deployment/model-deployments" \ - -H 'accept: application/json' \ - -H 'Content-Type: application/json' \ - -d '{ - "name": "llama-3.2-1b-instruct", - "namespace": "meta", - "config": { - "model": "meta/llama-3.2-1b-instruct", - "nim_deployment": { - "image_name": "nvcr.io/nim/meta/llama-3.2-1b-instruct", - "image_tag": "1.8.3", - "pvc_size": "25Gi", - "gpu": 1, - "additional_envs": { - "NIM_GUIDED_DECODING_BACKEND": "fast_outlines" - } - } - } - }' -``` -This NIM deployment should take approximately 10 minutes to go live. [See the docs](https://docs.nvidia.com/nemo/microservices/latest/get-started/tutorials/deploy-nims.html) for more information on how to deploy a NIM and verify it's available for inference. - -You can also remove a deployed NIM to free up GPU resources, if needed. -```sh -export NEMO_URL="http://nemo.test" - -curl -X DELETE "$NEMO_URL/v1/deployment/model-deployments/meta/llama-3.1-8b-instruct" -``` - -## Running Llama Stack with NVIDIA - -You can do this via venv (build code), or Docker which has a pre-built image. - -### Via Docker - -This method allows you to get started quickly without having to build the distribution code. - -```bash -LLAMA_STACK_PORT=8321 -docker run \ - -it \ - --pull always \ - -p $LLAMA_STACK_PORT:$LLAMA_STACK_PORT \ - -v ./run.yaml:/root/my-run.yaml \ - llamastack/distribution-nvidia \ - --config /root/my-run.yaml \ - --port $LLAMA_STACK_PORT \ - --env NVIDIA_API_KEY=$NVIDIA_API_KEY -``` - -### Via venv - -If you've set up your local development environment, you can also build the image using your local virtual environment. - -```bash -INFERENCE_MODEL=meta-llama/Llama-3.1-8B-Instruct -llama stack build --distro nvidia --image-type venv -llama stack run ./run.yaml \ - --port 8321 \ - --env NVIDIA_API_KEY=$NVIDIA_API_KEY \ - --env INFERENCE_MODEL=$INFERENCE_MODEL -``` - -## Example Notebooks -For examples of how to use the NVIDIA Distribution to run inference, fine-tune, evaluate, and run safety checks on your LLMs, you can reference the example notebooks in {repopath}`docs/notebooks/nvidia`. diff --git a/docs/source/getting_started/index.md b/docs/source/getting_started/index.md deleted file mode 100644 index e941534c2..000000000 --- a/docs/source/getting_started/index.md +++ /dev/null @@ -1,13 +0,0 @@ -# Getting Started - -```{include} quickstart.md -:start-after: ## Quickstart -``` - -```{include} libraries.md -:start-after: ## Libraries (SDKs) -``` - -```{include} detailed_tutorial.md -:start-after: ## Detailed Tutorial -``` diff --git a/docs/source/index.md b/docs/source/index.md deleted file mode 100644 index c824ce94a..000000000 --- a/docs/source/index.md +++ /dev/null @@ -1,133 +0,0 @@ -# Llama Stack -Welcome to Llama Stack, the open-source framework for building generative AI applications. -```{admonition} Llama 4 is here! -:class: tip - -Check out [Getting Started with Llama 4](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/getting_started_llama4.ipynb) -``` -```{admonition} News -:class: tip - -Llama Stack {{ llama_stack_version }} is now available! See the {{ llama_stack_version_link }} for more details. -``` - - -## What is Llama Stack? - -Llama Stack defines and standardizes the core building blocks needed to bring generative AI applications to market. It provides a unified set of APIs with implementations from leading service providers, enabling seamless transitions between development and production environments. More specifically, it provides - -- **Unified API layer** for Inference, RAG, Agents, Tools, Safety, Evals, and Telemetry. -- **Plugin architecture** to support the rich ecosystem of implementations of the different APIs in different environments like local development, on-premises, cloud, and mobile. -- **Prepackaged verified distributions** which offer a one-stop solution for developers to get started quickly and reliably in any environment -- **Multiple developer interfaces** like CLI and SDKs for Python, Node, iOS, and Android -- **Standalone applications** as examples for how to build production-grade AI applications with Llama Stack - -```{image} ../_static/llama-stack.png -:alt: Llama Stack -:width: 400px -``` - -Our goal is to provide pre-packaged implementations (aka "distributions") which can be run in a variety of deployment environments. LlamaStack can assist you in your entire app development lifecycle - start iterating on local, mobile or desktop and seamlessly transition to on-prem or public cloud deployments. At every point in this transition, the same set of APIs and the same developer experience is available. - -## How does Llama Stack work? -Llama Stack consists of a [server](./distributions/index.md) (with multiple pluggable API [providers](./providers/index.md)) and Client SDKs (see below) meant to -be used in your applications. The server can be run in a variety of environments, including local (inline) -development, on-premises, and cloud. The client SDKs are available for Python, Swift, Node, and -Kotlin. - -## Quick Links - -- Ready to build? Check out the [Quick Start](getting_started/index) to get started. -- Want to contribute? See the [Contributing](contributing/index) guide. - -## Supported Llama Stack Implementations - -A number of "adapters" are available for some popular Inference and Vector Store providers. For other APIs (particularly Safety and Agents), we provide *reference implementations* you can use to get started. We expect this list to grow over time. We are slowly onboarding more providers to the ecosystem as we get more confidence in the APIs. - -**Inference API** -| **Provider** | **Environments** | -| :----: | :----: | -| Meta Reference | Single Node | -| Ollama | Single Node | -| Fireworks | Hosted | -| Together | Hosted | -| NVIDIA NIM | Hosted and Single Node | -| vLLM | Hosted and Single Node | -| TGI | Hosted and Single Node | -| AWS Bedrock | Hosted | -| Cerebras | Hosted | -| Groq | Hosted | -| SambaNova | Hosted | -| PyTorch ExecuTorch | On-device iOS, Android | -| OpenAI | Hosted | -| Anthropic | Hosted | -| Gemini | Hosted | -| WatsonX | Hosted | - -**Agents API** -| **Provider** | **Environments** | -| :----: | :----: | -| Meta Reference | Single Node | -| Fireworks | Hosted | -| Together | Hosted | -| PyTorch ExecuTorch | On-device iOS | - -**Vector IO API** -| **Provider** | **Environments** | -| :----: | :----: | -| FAISS | Single Node | -| SQLite-Vec | Single Node | -| Chroma | Hosted and Single Node | -| Milvus | Hosted and Single Node | -| Postgres (PGVector) | Hosted and Single Node | -| Weaviate | Hosted | -| Qdrant | Hosted and Single Node | - -**Safety API** -| **Provider** | **Environments** | -| :----: | :----: | -| Llama Guard | Depends on Inference Provider | -| Prompt Guard | Single Node | -| Code Scanner | Single Node | -| AWS Bedrock | Hosted | - -**Post Training API** -| **Provider** | **Environments** | -| :----: | :----: | -| Meta Reference | Single Node | -| HuggingFace | Single Node | -| TorchTune | Single Node | -| NVIDIA NEMO | Hosted | - -**Eval API** -| **Provider** | **Environments** | -| :----: | :----: | -| Meta Reference | Single Node | -| NVIDIA NEMO | Hosted | - -**Telemetry API** -| **Provider** | **Environments** | -| :----: | :----: | -| Meta Reference | Single Node | - -**Tool Runtime API** -| **Provider** | **Environments** | -| :----: | :----: | -| Brave Search | Hosted | -| RAG Runtime | Single Node | - -```{toctree} -:hidden: -:maxdepth: 3 - -self -getting_started/index -concepts/index -providers/index -distributions/index -advanced_apis/index -building_applications/index -deploying/index -contributing/index -references/index -``` diff --git a/docs/source/references/api_reference/index.md b/docs/source/references/api_reference/index.md deleted file mode 100644 index f93c73ea3..000000000 --- a/docs/source/references/api_reference/index.md +++ /dev/null @@ -1,6 +0,0 @@ -{.hide-title} -# API Reference - -```{raw} html - :file: ../../../_static/llama-stack-spec.html -``` diff --git a/docs/source/references/index.md b/docs/source/references/index.md deleted file mode 100644 index 51e3dd0ba..000000000 --- a/docs/source/references/index.md +++ /dev/null @@ -1,18 +0,0 @@ -# References - -- [API Reference](api_reference/index) for the Llama Stack API specification -- [Python SDK Reference](python_sdk_reference/index) -- [Llama CLI](llama_cli_reference/index) for building and running your Llama Stack server -- [Llama Stack Client CLI](llama_stack_client_cli_reference) for interacting with your Llama Stack server - -```{toctree} -:maxdepth: 1 -:hidden: - -api_reference/index -python_sdk_reference/index -llama_cli_reference/index -llama_stack_client_cli_reference -llama_cli_reference/download_models -evals_reference/index -``` From 610526d6d7e6fe5ed1ae39d8f2f86673c4717b68 Mon Sep 17 00:00:00 2001 From: Alexey Rybak <50731695+reluctantfuturist@users.noreply.github.com> Date: Wed, 24 Sep 2025 14:08:50 -0700 Subject: [PATCH 15/27] docs: static content migration (#3535) # What does this PR do? - Migrates static content from Sphinx to Docusaurus ## Test Plan --- docs/_static/css/my_theme.css | 136 --------- docs/_static/js/detect_theme.js | 32 -- docs/_static/js/horizontal_nav.js | 44 --- docs/_static/js/keyboard_shortcuts.js | 14 - docs/source/conf.py | 156 ---------- .../resources => static/img}/eval-concept.png | Bin .../resources => static/img}/eval-flow.png | Bin .../img}/rag.png | Bin docs/{_static => static}/llama-stack-logo.png | Bin docs/{_static => static}/llama-stack.png | Bin .../read_time_comparison_sqlite-vec-faiss.png | Bin ...write_time_comparison_sqlite-vec-faiss.png | Bin .../write_time_sequence_sqlite-vec-faiss.png | Bin docs/{_static => static}/remote_or_local.gif | Bin docs/{_static => static}/safety_system.webp | Bin .../src/components/HomepageFeatures/index.js | 64 ++++ .../HomepageFeatures/styles.module.css | 11 + docs/static/src/css/custom.css | 191 ++++++++++++ docs/static/src/pages/index.js | 163 ++++++++++ docs/static/src/pages/index.module.css | 283 ++++++++++++++++++ docs/static/src/pages/markdown-page.md | 7 + 21 files changed, 719 insertions(+), 382 deletions(-) delete mode 100644 docs/_static/css/my_theme.css delete mode 100644 docs/_static/js/detect_theme.js delete mode 100644 docs/_static/js/horizontal_nav.js delete mode 100644 docs/_static/js/keyboard_shortcuts.js delete mode 100644 docs/source/conf.py rename docs/{docs/references/evals_reference/resources => static/img}/eval-concept.png (100%) rename docs/{docs/references/evals_reference/resources => static/img}/eval-flow.png (100%) rename docs/{docs/building_applications => static/img}/rag.png (100%) rename docs/{_static => static}/llama-stack-logo.png (100%) rename docs/{_static => static}/llama-stack.png (100%) rename docs/{_static => static}/providers/vector_io/read_time_comparison_sqlite-vec-faiss.png (100%) rename docs/{_static => static}/providers/vector_io/write_time_comparison_sqlite-vec-faiss.png (100%) rename docs/{_static => static}/providers/vector_io/write_time_sequence_sqlite-vec-faiss.png (100%) rename docs/{_static => static}/remote_or_local.gif (100%) rename docs/{_static => static}/safety_system.webp (100%) create mode 100644 docs/static/src/components/HomepageFeatures/index.js create mode 100644 docs/static/src/components/HomepageFeatures/styles.module.css create mode 100644 docs/static/src/css/custom.css create mode 100644 docs/static/src/pages/index.js create mode 100644 docs/static/src/pages/index.module.css create mode 100644 docs/static/src/pages/markdown-page.md diff --git a/docs/_static/css/my_theme.css b/docs/_static/css/my_theme.css deleted file mode 100644 index 7dcd97c9b..000000000 --- a/docs/_static/css/my_theme.css +++ /dev/null @@ -1,136 +0,0 @@ -@import url("theme.css"); - -/* Horizontal Navigation Bar */ -.horizontal-nav { - background-color: #ffffff; - border-bottom: 1px solid #e5e5e5; - padding: 0; - position: fixed; - top: 0; - left: 0; - right: 0; - z-index: 1050; - height: 50px; - box-shadow: 0 2px 4px rgba(0,0,0,0.1); -} - -[data-theme="dark"] .horizontal-nav { - background-color: #1a1a1a; - border-bottom: 1px solid #333; -} - -.horizontal-nav .nav-container { - max-width: 1200px; - margin: 0 auto; - display: flex; - align-items: center; - justify-content: space-between; - padding: 0 20px; - height: 100%; -} - -.horizontal-nav .nav-brand { - font-size: 18px; - font-weight: 600; - color: #333; - text-decoration: none; -} - -[data-theme="dark"] .horizontal-nav .nav-brand { - color: #fff; -} - -.horizontal-nav .nav-links { - display: flex; - align-items: center; - gap: 30px; - list-style: none; - margin: 0; - padding: 0; -} - -.horizontal-nav .nav-links a { - color: #666; - text-decoration: none; - font-size: 14px; - font-weight: 500; - padding: 8px 12px; - border-radius: 6px; - transition: all 0.2s ease; -} - -.horizontal-nav .nav-links a:hover, -.horizontal-nav .nav-links a.active { - color: #333; - background-color: #f5f5f5; -} - -.horizontal-nav .nav-links a.active { - font-weight: 600; -} - -[data-theme="dark"] .horizontal-nav .nav-links a { - color: #ccc; -} - -[data-theme="dark"] .horizontal-nav .nav-links a:hover, -[data-theme="dark"] .horizontal-nav .nav-links a.active { - color: #fff; - background-color: #333; -} - -.horizontal-nav .nav-links .github-link { - display: flex; - align-items: center; - gap: 6px; -} - -.horizontal-nav .nav-links .github-icon { - width: 16px; - height: 16px; - fill: currentColor; -} - -/* Adjust main content to account for fixed nav */ -.wy-nav-side { - top: 50px; - height: calc(100vh - 50px); -} - -.wy-nav-content-wrap { - margin-top: 50px; -} - -.wy-nav-content { - max-width: 90%; -} - -.wy-nav-side { - /* background: linear-gradient(45deg, #2980B9, #16A085); */ - background: linear-gradient(90deg, #332735, #1b263c); -} - -.wy-side-nav-search { - background-color: transparent !important; -} - -.hide-title h1 { - display: none; -} - -h2, h3, h4 { - font-weight: normal; -} -html[data-theme="dark"] .rst-content div[class^="highlight"] { - background-color: #0b0b0b; -} -pre { - white-space: pre-wrap !important; - word-break: break-all; -} - -[data-theme="dark"] .mermaid { - background-color: #f4f4f6 !important; - border-radius: 6px; - padding: 0.5em; - } diff --git a/docs/_static/js/detect_theme.js b/docs/_static/js/detect_theme.js deleted file mode 100644 index 712565ef7..000000000 --- a/docs/_static/js/detect_theme.js +++ /dev/null @@ -1,32 +0,0 @@ -document.addEventListener("DOMContentLoaded", function () { - const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches; - const htmlElement = document.documentElement; - - // Check if theme is saved in localStorage - const savedTheme = localStorage.getItem("sphinx-rtd-theme"); - - if (savedTheme) { - // Use the saved theme preference - htmlElement.setAttribute("data-theme", savedTheme); - document.body.classList.toggle("dark", savedTheme === "dark"); - } else { - // Fall back to system preference - const theme = prefersDark ? "dark" : "light"; - htmlElement.setAttribute("data-theme", theme); - document.body.classList.toggle("dark", theme === "dark"); - // Save initial preference - localStorage.setItem("sphinx-rtd-theme", theme); - } - - // Listen for theme changes from the existing toggle - const observer = new MutationObserver(function(mutations) { - mutations.forEach(function(mutation) { - if (mutation.attributeName === "data-theme") { - const currentTheme = htmlElement.getAttribute("data-theme"); - localStorage.setItem("sphinx-rtd-theme", currentTheme); - } - }); - }); - - observer.observe(htmlElement, { attributes: true }); -}); diff --git a/docs/_static/js/horizontal_nav.js b/docs/_static/js/horizontal_nav.js deleted file mode 100644 index c2384f9d5..000000000 --- a/docs/_static/js/horizontal_nav.js +++ /dev/null @@ -1,44 +0,0 @@ -// Horizontal Navigation Bar for Llama Stack Documentation -document.addEventListener('DOMContentLoaded', function() { - // Create the horizontal navigation HTML - const navHTML = ` - - `; - - // Insert the navigation at the beginning of the body - document.body.insertAdjacentHTML('afterbegin', navHTML); - - // Update navigation links based on current page - updateActiveNav(); -}); - -function updateActiveNav() { - const currentPath = window.location.pathname; - const navLinks = document.querySelectorAll('.horizontal-nav .nav-links a'); - - navLinks.forEach(link => { - // Remove any existing active classes - link.classList.remove('active'); - - // Add active class based on current path - if (currentPath === '/' && link.getAttribute('href') === '/') { - link.classList.add('active'); - } else if (currentPath.includes('/references/api_reference/') && link.getAttribute('href').includes('api_reference')) { - link.classList.add('active'); - } - }); -} diff --git a/docs/_static/js/keyboard_shortcuts.js b/docs/_static/js/keyboard_shortcuts.js deleted file mode 100644 index 81d0b7c65..000000000 --- a/docs/_static/js/keyboard_shortcuts.js +++ /dev/null @@ -1,14 +0,0 @@ -document.addEventListener('keydown', function(event) { - // command+K or ctrl+K - if ((event.metaKey || event.ctrlKey) && event.key === 'k') { - event.preventDefault(); - document.querySelector('.search-input, .search-field, input[name="q"]').focus(); - } - - // forward slash - if (event.key === '/' && - !event.target.matches('input, textarea, select')) { - event.preventDefault(); - document.querySelector('.search-input, .search-field, input[name="q"]').focus(); - } -}); diff --git a/docs/source/conf.py b/docs/source/conf.py deleted file mode 100644 index 0cbddef31..000000000 --- a/docs/source/conf.py +++ /dev/null @@ -1,156 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -# Configuration file for the Sphinx documentation builder. -# -# For the full list of built-in configuration values, see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -# -- Project information ----------------------------------------------------- -# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information - -import json -from datetime import datetime -from pathlib import Path - -import requests -from docutils import nodes - -# Read version from pyproject.toml -with Path(__file__).parent.parent.parent.joinpath("pyproject.toml").open("rb") as f: - pypi_url = "https://pypi.org/pypi/llama-stack/json" - headers = { - 'User-Agent': 'pip/23.0.1 (python 3.11)', # Mimic pip's user agent - 'Accept': 'application/json' - } - version_tag = json.loads(requests.get(pypi_url, headers=headers).text)["info"]["version"] - print(f"{version_tag=}") - - # generate the full link including text and url here - llama_stack_version_url = ( - f"https://github.com/meta-llama/llama-stack/releases/tag/v{version_tag}" - ) - llama_stack_version_link = f"release notes" - -project = "llama-stack" -copyright = f"{datetime.now().year}, Meta" -author = "Meta" - -# -- General configuration --------------------------------------------------- -# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration - -extensions = [ - "myst_parser", - "sphinx_copybutton", - "sphinx_design", - "sphinx_rtd_theme", - "sphinx_rtd_dark_mode", - "sphinx_tabs.tabs", - "sphinxcontrib.redoc", - "sphinxcontrib.mermaid", - "sphinxcontrib.video", - "sphinx_reredirects" -] - -redirects = { - "providers/post_training/index": "../../advanced_apis/post_training/index.html", - "providers/eval/index": "../../advanced_apis/eval/index.html", - "providers/scoring/index": "../../advanced_apis/scoring/index.html", - "playground/index": "../../building_applications/playground/index.html", - "openai/index": "../../providers/index.html#openai-api-compatibility", - "introduction/index": "../concepts/index.html#llama-stack-architecture" -} - -myst_enable_extensions = ["colon_fence"] - -html_theme = "sphinx_rtd_theme" -html_use_relative_paths = True -templates_path = ["_templates"] -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - -myst_enable_extensions = [ - "amsmath", - "attrs_inline", - "attrs_block", - "colon_fence", - "deflist", - "dollarmath", - "fieldlist", - "html_admonition", - "html_image", - # "linkify", - "replacements", - "smartquotes", - "strikethrough", - "substitution", - "tasklist", -] - -myst_substitutions = { - "docker_hub": "https://hub.docker.com/repository/docker/llamastack", - "llama_stack_version": version_tag, - "llama_stack_version_link": llama_stack_version_link, -} - -suppress_warnings = ["myst.header"] - -# Copy button settings -copybutton_prompt_text = "$ " # for bash prompts -copybutton_prompt_is_regexp = True -copybutton_remove_prompts = True -copybutton_line_continuation_character = "\\" - -# Source suffix -source_suffix = { - ".rst": "restructuredtext", - ".md": "markdown", -} - -# -- Options for HTML output ------------------------------------------------- -# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output - -# html_theme = "alabaster" -html_theme_options = { - "canonical_url": "https://github.com/meta-llama/llama-stack", - "collapse_navigation": False, - # "style_nav_header_background": "#c3c9d4", - 'display_version': True, - 'version_selector': True, -} - -default_dark_mode = False - -html_static_path = ["../_static"] -# html_logo = "../_static/llama-stack-logo.png" -# html_style = "../_static/css/my_theme.css" - - -def setup(app): - app.add_css_file("css/my_theme.css") - app.add_js_file("js/detect_theme.js") - app.add_js_file("js/horizontal_nav.js") - app.add_js_file("js/keyboard_shortcuts.js") - - def dockerhub_role(name, rawtext, text, lineno, inliner, options={}, content=[]): - url = f"https://hub.docker.com/r/llamastack/{text}" - node = nodes.reference(rawtext, text, refuri=url, **options) - return [node], [] - - def repopath_role(name, rawtext, text, lineno, inliner, options={}, content=[]): - parts = text.split("::") - if len(parts) == 2: - link_text = parts[0] - url_path = parts[1] - else: - link_text = text - url_path = text - - url = f"https://github.com/meta-llama/llama-stack/tree/main/{url_path}" - node = nodes.reference(rawtext, link_text, refuri=url, **options) - return [node], [] - - app.add_role("dockerhub", dockerhub_role) - app.add_role("repopath", repopath_role) diff --git a/docs/docs/references/evals_reference/resources/eval-concept.png b/docs/static/img/eval-concept.png similarity index 100% rename from docs/docs/references/evals_reference/resources/eval-concept.png rename to docs/static/img/eval-concept.png diff --git a/docs/docs/references/evals_reference/resources/eval-flow.png b/docs/static/img/eval-flow.png similarity index 100% rename from docs/docs/references/evals_reference/resources/eval-flow.png rename to docs/static/img/eval-flow.png diff --git a/docs/docs/building_applications/rag.png b/docs/static/img/rag.png similarity index 100% rename from docs/docs/building_applications/rag.png rename to docs/static/img/rag.png diff --git a/docs/_static/llama-stack-logo.png b/docs/static/llama-stack-logo.png similarity index 100% rename from docs/_static/llama-stack-logo.png rename to docs/static/llama-stack-logo.png diff --git a/docs/_static/llama-stack.png b/docs/static/llama-stack.png similarity index 100% rename from docs/_static/llama-stack.png rename to docs/static/llama-stack.png diff --git a/docs/_static/providers/vector_io/read_time_comparison_sqlite-vec-faiss.png b/docs/static/providers/vector_io/read_time_comparison_sqlite-vec-faiss.png similarity index 100% rename from docs/_static/providers/vector_io/read_time_comparison_sqlite-vec-faiss.png rename to docs/static/providers/vector_io/read_time_comparison_sqlite-vec-faiss.png diff --git a/docs/_static/providers/vector_io/write_time_comparison_sqlite-vec-faiss.png b/docs/static/providers/vector_io/write_time_comparison_sqlite-vec-faiss.png similarity index 100% rename from docs/_static/providers/vector_io/write_time_comparison_sqlite-vec-faiss.png rename to docs/static/providers/vector_io/write_time_comparison_sqlite-vec-faiss.png diff --git a/docs/_static/providers/vector_io/write_time_sequence_sqlite-vec-faiss.png b/docs/static/providers/vector_io/write_time_sequence_sqlite-vec-faiss.png similarity index 100% rename from docs/_static/providers/vector_io/write_time_sequence_sqlite-vec-faiss.png rename to docs/static/providers/vector_io/write_time_sequence_sqlite-vec-faiss.png diff --git a/docs/_static/remote_or_local.gif b/docs/static/remote_or_local.gif similarity index 100% rename from docs/_static/remote_or_local.gif rename to docs/static/remote_or_local.gif diff --git a/docs/_static/safety_system.webp b/docs/static/safety_system.webp similarity index 100% rename from docs/_static/safety_system.webp rename to docs/static/safety_system.webp diff --git a/docs/static/src/components/HomepageFeatures/index.js b/docs/static/src/components/HomepageFeatures/index.js new file mode 100644 index 000000000..78f410ba6 --- /dev/null +++ b/docs/static/src/components/HomepageFeatures/index.js @@ -0,0 +1,64 @@ +import React from 'react'; +import clsx from 'clsx'; +import styles from './styles.module.css'; + +const FeatureList = [ + { + title: 'Easy to Use', + Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, + description: ( + <> + Docusaurus was designed from the ground up to be easily installed and + used to get your website up and running quickly. + + ), + }, + { + title: 'Focus on What Matters', + Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default, + description: ( + <> + Docusaurus lets you focus on your docs, and we'll do the chores. Go + ahead and move your docs into the docs directory. + + ), + }, + { + title: 'Powered by React', + Svg: require('@site/static/img/undraw_docusaurus_react.svg').default, + description: ( + <> + Extend or customize your website layout by reusing React. Docusaurus can + be extended while reusing the same header and footer. + + ), + }, +]; + +function Feature({Svg, title, description}) { + return ( +
+
+ +
+
+

{title}

+

{description}

+
+
+ ); +} + +export default function HomepageFeatures() { + return ( +
+
+
+ {FeatureList.map((props, idx) => ( + + ))} +
+
+
+ ); +} diff --git a/docs/static/src/components/HomepageFeatures/styles.module.css b/docs/static/src/components/HomepageFeatures/styles.module.css new file mode 100644 index 000000000..b248eb2e5 --- /dev/null +++ b/docs/static/src/components/HomepageFeatures/styles.module.css @@ -0,0 +1,11 @@ +.features { + display: flex; + align-items: center; + padding: 2rem 0; + width: 100%; +} + +.featureSvg { + height: 200px; + width: 200px; +} diff --git a/docs/static/src/css/custom.css b/docs/static/src/css/custom.css new file mode 100644 index 000000000..0e4d95b9b --- /dev/null +++ b/docs/static/src/css/custom.css @@ -0,0 +1,191 @@ +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +/* You can override the default Infima variables here. */ +:root { + /* Llama Stack Original Theme - Based on llamastack.github.io */ + --ifm-color-primary: #4a4a68; + --ifm-color-primary-dark: #3a3a52; + --ifm-color-primary-darker: #332735; + --ifm-color-primary-darkest: #2b2129; + --ifm-color-primary-light: #5a5a7e; + --ifm-color-primary-lighter: #6a6a94; + --ifm-color-primary-lightest: #8080aa; + + /* Additional theme colors */ + --ifm-color-secondary: #1b263c; + --ifm-color-info: #2980b9; + --ifm-color-success: #16a085; + --ifm-color-warning: #f39c12; + --ifm-color-danger: #e74c3c; + + /* Background colors */ + --ifm-background-color: #ffffff; + --ifm-background-surface-color: #f8f9fa; + + /* Code and syntax highlighting */ + --ifm-code-font-size: 95%; + --ifm-pre-background: #1b263c; + --ifm-pre-color: #e1e5e9; + --docusaurus-highlighted-code-line-bg: rgba(51, 39, 53, 0.1); + + /* Link colors */ + --ifm-link-color: var(--ifm-color-primary); + --ifm-link-hover-color: var(--ifm-color-primary-darker); + + /* Navbar */ + --ifm-navbar-background-color: rgba(255, 255, 255, 0.95); + --ifm-navbar-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + + /* Hero section gradient - matching original theme */ + --hero-gradient: linear-gradient(90deg, #332735 0%, #1b263c 100%); + + /* OpenAPI method colors */ + --openapi-code-blue: #2980b9; + --openapi-code-green: #16a085; + --openapi-code-orange: #f39c12; + --openapi-code-red: #e74c3c; + --openapi-code-purple: #332735; +} + +/* For readability concerns, you should choose a lighter palette in dark mode. */ +[data-theme='dark'] { + /* Dark theme primary colors - lighter versions of original theme */ + --ifm-color-primary: #8080aa; + --ifm-color-primary-dark: #6a6a94; + --ifm-color-primary-darker: #5a5a7e; + --ifm-color-primary-darkest: #4a4a68; + --ifm-color-primary-light: #9090ba; + --ifm-color-primary-lighter: #a0a0ca; + --ifm-color-primary-lightest: #b0b0da; + + /* Dark theme background colors */ + --ifm-background-color: #1a1a1a; + --ifm-background-surface-color: #2a2a2a; + + /* Dark theme navbar */ + --ifm-navbar-background-color: rgba(26, 26, 26, 0.95); + + /* Dark theme code highlighting */ + --docusaurus-highlighted-code-line-bg: rgba(51, 39, 53, 0.3); + + /* Dark theme text colors */ + --ifm-font-color-base: #e1e5e9; + --ifm-font-color-secondary: #a0a6ac; +} + +/* Sidebar Method labels */ +.api-method>.menu__link { + align-items: center; + justify-content: start; +} + +.api-method>.menu__link::before { + width: 50px; + height: 20px; + font-size: 12px; + line-height: 20px; + text-transform: uppercase; + font-weight: 600; + border-radius: 0.25rem; + border: 1px solid; + margin-right: var(--ifm-spacing-horizontal); + text-align: center; + flex-shrink: 0; + border-color: transparent; + color: white; +} + +.get>.menu__link::before { + content: "get"; + background-color: var(--ifm-color-primary); +} + +.put>.menu__link::before { + content: "put"; + background-color: var(--openapi-code-blue); +} + +.post>.menu__link::before { + content: "post"; + background-color: var(--openapi-code-green); +} + +.delete>.menu__link::before { + content: "del"; + background-color: var(--openapi-code-red); +} + +.patch>.menu__link::before { + content: "patch"; + background-color: var(--openapi-code-orange); +} + +.footer--dark { + --ifm-footer-link-color: #ffffff; + --ifm-footer-title-color: #ffffff; +} + +.footer--dark .footer__link-item { + color: #ffffff; +} + +.footer--dark .footer__title { + color: #ffffff; +} + +/* OpenAPI theme fixes for light mode readability */ +/* Version badge fixes */ +.openapi__version-badge, +.theme-doc-version-badge, +[class*="version-badge"], +[class*="versionBadge"] { + background-color: #ffffff !important; + color: #333333 !important; + border: 1px solid #d1d5db !important; +} + +/* OpenAPI method badges in light mode */ +.openapi__method-badge, +[class*="method-badge"] { + color: #ffffff !important; +} + +/* Button fixes for light mode */ +.openapi__button, +.theme-api-docs-demo-panel button, +[class*="api-docs"] button, +button[class*="button"], +.openapi-explorer__response-schema button, +.openapi-tabs__operation button { + color: #ffffff !important; +} + +.openapi__button:hover, +.theme-api-docs-demo-panel button:hover, +[class*="api-docs"] button:hover, +button[class*="button"]:hover, +.openapi-explorer__response-schema button:hover, +.openapi-tabs__operation button:hover { + color: #ffffff !important; +} + +/* Navigation buttons (Next/Previous) */ +.pagination-nav__link, +.pagination-nav__label { + color: #333333 !important; +} + +.pagination-nav__link--next, +.pagination-nav__link--prev { + background-color: #ffffff !important; + border: 1px solid #d1d5db !important; +} + +.pagination-nav__link--next:hover, +.pagination-nav__link--prev:hover { + background-color: #f3f4f6 !important; +} diff --git a/docs/static/src/pages/index.js b/docs/static/src/pages/index.js new file mode 100644 index 000000000..fe14e920c --- /dev/null +++ b/docs/static/src/pages/index.js @@ -0,0 +1,163 @@ +import React from 'react'; +import clsx from 'clsx'; +import Layout from '@theme/Layout'; +import Link from '@docusaurus/Link'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import styles from './index.module.css'; + +function HomepageHeader() { + const {siteConfig} = useDocusaurusContext(); + return ( +
+
+
+

Build AI Applications with Llama Stack

+

+ Unified APIs for Inference, RAG, Agents, Tools, Safety, and Telemetry +

+
+ + 🚀 Get Started + + + 📚 API Reference + +
+
+
+
+ ); +} + +function QuickStart() { + return ( +
+
+
+
+

Quick Start

+

+ Get up and running with Llama Stack in just a few commands. Build your first RAG application locally. +

+
+
{`# Install uv and start Ollama
+ollama run llama3.2:3b --keepalive 60m
+
+# Run Llama Stack server
+OLLAMA_URL=http://localhost:11434 \\
+  uv run --with llama-stack \\
+  llama stack build --distro starter \\
+  --image-type venv --run
+
+# Try the Python SDK
+from llama_stack_client import LlamaStackClient
+
+client = LlamaStackClient(
+  base_url="http://localhost:8321"
+)
+
+response = client.inference.chat_completion(
+  model="Llama3.2-3B-Instruct",
+  messages=[{
+    "role": "user",
+    "content": "What is machine learning?"
+  }]
+)`}
+
+
+
+

Why Llama Stack?

+
+
+
🔗
+
+

Unified APIs

+

One consistent interface for all your AI needs - inference, safety, agents, and more.

+
+
+
+
🔄
+
+

Provider Flexibility

+

Swap between providers without code changes. Start local, deploy anywhere.

+
+
+
+
🛡️
+
+

Production Ready

+

Built-in safety, monitoring, and evaluation tools for enterprise applications.

+
+
+
+
📱
+
+

Multi-Platform

+

SDKs for Python, Node.js, iOS, Android, and REST APIs for any language.

+
+
+
+
+
+
+
+ ); +} + +function CommunityLinks() { + return ( +
+
+
+

Join the Community

+

+ Connect with developers building the future of AI applications +

+ +
+
+
+ ); +} + +export default function Home() { + const {siteConfig} = useDocusaurusContext(); + return ( + + +
+ + +
+
+ ); +} diff --git a/docs/static/src/pages/index.module.css b/docs/static/src/pages/index.module.css new file mode 100644 index 000000000..c3681653b --- /dev/null +++ b/docs/static/src/pages/index.module.css @@ -0,0 +1,283 @@ +/** + * CSS files with the .module.css suffix will be treated as CSS modules + * and scoped locally. + */ + +.heroBanner { + padding: 4rem 0; + text-align: center; + position: relative; + overflow: hidden; + background: var(--hero-gradient); + color: white; + display: flex; + align-items: center; +} + +.heroBanner::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: radial-gradient(circle at 30% 20%, rgba(255, 255, 255, 0.1) 0%, transparent 50%), + radial-gradient(circle at 70% 80%, rgba(255, 255, 255, 0.05) 0%, transparent 50%); + pointer-events: none; +} + +.heroContent { + max-width: 800px; + margin: 0 auto; +} + +.heroLogo { + height: 48px; + width: auto; + margin-bottom: 1.5rem; +} + +.heroTitle { + font-size: 2.8rem; + font-weight: 700; + margin-bottom: 1rem; + line-height: 1.2; +} + +.heroSubtitle { + font-size: 1.1rem; + font-weight: 400; + margin-bottom: 2rem; + opacity: 0.9; + line-height: 1.5; + max-width: 600px; + margin-left: auto; + margin-right: auto; +} + +.buttons { + display: flex; + align-items: center; + justify-content: center; + gap: 1rem; +} + +.heroBanner .getStartedButton { + background: white; + color: #332735; + border: 2px solid white; + font-weight: 600; + transition: all 0.3s ease; +} + +.heroBanner .getStartedButton:hover { + background: rgba(255, 255, 255, 0.9); + color: #2b2129; + border-color: rgba(255, 255, 255, 0.9); + transform: translateY(-2px); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); +} + +.heroBanner .apiButton { + background: transparent; + color: white; + border: 2px solid white; + font-weight: 600; + transition: all 0.3s ease; +} + +.heroBanner .apiButton:hover { + background: white; + border-color: white; + color: #332735; + transform: translateY(-2px); +} + +/* Quick Start Section */ +.quickStart { + padding: 4rem 0; + background: var(--ifm-background-color); +} + +.sectionTitle { + font-size: 2rem; + font-weight: 600; + margin-bottom: 0.75rem; + color: var(--ifm-color-emphasis-800); +} + +.sectionDescription { + font-size: 1rem; + color: var(--ifm-color-emphasis-600); + margin-bottom: 1.5rem; + line-height: 1.5; +} + +.codeBlock { + background: var(--ifm-color-gray-900); + border-radius: 8px; + padding: 1.5rem; + margin-top: 1.5rem; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); +} + +.codeBlock pre { + margin: 0; + padding: 0; + background: none; + border: none; +} + +.codeBlock code { + color: var(--ifm-color-gray-100); + font-family: 'Fira Code', 'Consolas', 'Monaco', monospace; + font-size: 0.9rem; + line-height: 1.6; +} + +/* Features */ +.features { + display: flex; + flex-direction: column; + gap: 1rem; + margin-top: 1.5rem; +} + +.feature { + display: flex; + align-items: flex-start; + gap: 1rem; + padding: 1rem; + border-radius: 8px; + background: var(--ifm-color-gray-50); + border: 1px solid var(--ifm-color-gray-200); + transition: all 0.2s ease; +} + +.feature:hover { + transform: translateY(-2px); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1); + border-color: var(--ifm-color-primary-lighter); +} + +.featureIcon { + font-size: 2rem; + width: 3rem; + height: 3rem; + display: flex; + align-items: center; + justify-content: center; + background: var(--ifm-color-primary-lightest); + border-radius: 50%; + flex-shrink: 0; +} + +.feature h4 { + margin: 0 0 0.5rem 0; + font-size: 1.1rem; + font-weight: 600; + color: var(--ifm-color-emphasis-800); +} + +.feature p { + margin: 0; + color: var(--ifm-color-emphasis-600); + line-height: 1.5; +} + +/* Community Section */ +.community { + padding: 3rem 0; + background: var(--ifm-color-gray-50); + border-top: 1px solid var(--ifm-color-gray-200); +} + +.communityContent { + text-align: center; + max-width: 600px; + margin: 0 auto; +} + +.communityLinks { + display: flex; + justify-content: center; + gap: 1rem; + margin-top: 2rem; +} + +.communityButton { + display: flex; + align-items: center; + gap: 0.5rem; + font-weight: 600; + transition: all 0.3s ease; +} + +.communityButton:hover { + transform: translateY(-2px); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1); +} + +.communityIcon { + font-size: 1.2rem; +} + +/* Responsive Design */ +@media screen and (max-width: 996px) { + .heroBanner { + padding: 3rem 2rem; + } + + .heroTitle { + font-size: 2.2rem; + } + + .heroSubtitle { + font-size: 1rem; + } + + .buttons { + flex-direction: column; + gap: 1rem; + } + + .quickStart { + padding: 3rem 0; + } + + .sectionTitle { + font-size: 1.75rem; + } + + .communityLinks { + flex-direction: column; + align-items: center; + } + + .communityButton { + width: 200px; + justify-content: center; + } +} + +@media screen and (max-width: 768px) { + .heroLogo { + height: 40px; + } + + .heroTitle { + font-size: 1.8rem; + } + + .codeBlock { + padding: 1rem; + } + + .codeBlock code { + font-size: 0.8rem; + } + + .feature { + padding: 0.75rem; + } +} diff --git a/docs/static/src/pages/markdown-page.md b/docs/static/src/pages/markdown-page.md new file mode 100644 index 000000000..9756c5b66 --- /dev/null +++ b/docs/static/src/pages/markdown-page.md @@ -0,0 +1,7 @@ +--- +title: Markdown page example +--- + +# Markdown page example + +You don't need React to write simple standalone pages. From aebd728c816bf0b452b6c7d7bed8f8e910b1ba24 Mon Sep 17 00:00:00 2001 From: Alexey Rybak <50731695+reluctantfuturist@users.noreply.github.com> Date: Wed, 24 Sep 2025 14:11:30 -0700 Subject: [PATCH 16/27] docs: docusaurus setup (#3541) # What does this PR do? - Docusaurus server setup - Deprecates Sphinx build pipeline - Deprecates remaining references to Readthedocs - MDX compile errors and broken links to be addressed in follow-up PRs ## Test Plan ``` npm install npm gen-api-docs all npm run build ``` --- .github/workflows/README.md | 1 - .github/workflows/update-readthedocs.yml | 70 - .gitignore | 1 - .readthedocs.yaml | 25 - CONTRIBUTING.md | 14 +- docs/Makefile | 20 - docs/README.md | 11 +- docs/conftest.py | 24 - docs/contbuild.sh | 7 - docs/docs/contributing/index.mdx | 14 +- docs/docs/index.mdx | 14 +- docs/docusaurus.config.ts | 230 + docs/getting_started.ipynb | 2 +- docs/make.bat | 35 - .../Alpha_Llama_Stack_Post_Training.ipynb | 2 +- docs/package-lock.json | 22087 ++++++++++++++++ docs/package.json | 44 + docs/sidebars.ts | 342 + docs/src/components/HomepageFeatures/index.js | 64 + .../HomepageFeatures/styles.module.css | 11 + docs/src/css/custom.css | 191 + docs/src/pages/index.js | 163 + docs/src/pages/index.module.css | 283 + docs/src/pages/markdown-page.md | 7 + docs/tsconfig.json | 7 + 25 files changed, 23461 insertions(+), 208 deletions(-) delete mode 100644 .github/workflows/update-readthedocs.yml delete mode 100644 .readthedocs.yaml delete mode 100644 docs/Makefile delete mode 100644 docs/conftest.py delete mode 100644 docs/contbuild.sh create mode 100644 docs/docusaurus.config.ts delete mode 100644 docs/make.bat create mode 100644 docs/package-lock.json create mode 100644 docs/package.json create mode 100644 docs/sidebars.ts create mode 100644 docs/src/components/HomepageFeatures/index.js create mode 100644 docs/src/components/HomepageFeatures/styles.module.css create mode 100644 docs/src/css/custom.css create mode 100644 docs/src/pages/index.js create mode 100644 docs/src/pages/index.module.css create mode 100644 docs/src/pages/markdown-page.md create mode 100644 docs/tsconfig.json diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 059bb873f..7c9d2bffd 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -21,4 +21,3 @@ Llama Stack uses GitHub Actions for Continuous Integration (CI). Below is a tabl | Test External API and Providers | [test-external.yml](test-external.yml) | Test the External API and Provider mechanisms | | UI Tests | [ui-unit-tests.yml](ui-unit-tests.yml) | Run the UI test suite | | Unit Tests | [unit-tests.yml](unit-tests.yml) | Run the unit test suite | -| Update ReadTheDocs | [update-readthedocs.yml](update-readthedocs.yml) | Update the Llama Stack ReadTheDocs site | diff --git a/.github/workflows/update-readthedocs.yml b/.github/workflows/update-readthedocs.yml deleted file mode 100644 index e12f0adf8..000000000 --- a/.github/workflows/update-readthedocs.yml +++ /dev/null @@ -1,70 +0,0 @@ -name: Update ReadTheDocs - -run-name: Update the Llama Stack ReadTheDocs site - -on: - workflow_dispatch: - inputs: - branch: - description: 'RTD version to update' - required: false - default: 'latest' - push: - branches: - - main - paths: - - 'docs/**' - - 'pyproject.toml' - - '.github/workflows/update-readthedocs.yml' - tags: - - '*' - pull_request: - branches: - - main - paths: - - 'docs/**' - - 'pyproject.toml' - - '.github/workflows/update-readthedocs.yml' - -concurrency: - group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/main' && github.run_id || github.ref }} - cancel-in-progress: true - -jobs: - update-readthedocs: - runs-on: ubuntu-latest - env: - TOKEN: ${{ secrets.READTHEDOCS_TOKEN }} - steps: - - name: Checkout repository - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - - - name: Install dependencies - uses: ./.github/actions/setup-runner - - - name: Build HTML - run: | - cd docs - uv run make html - - - name: Trigger ReadTheDocs build - if: github.event_name != 'pull_request' - run: | - if [ -z "$TOKEN" ]; then - echo "READTHEDOCS_TOKEN is not set" - exit 1 - fi - - response=$(curl -X POST \ - -H "Content-Type: application/json" \ - -d "{ - \"token\": \"$TOKEN\", - \"version\": \"$GITHUB_REF_NAME\" - }" \ - https://readthedocs.org/api/v2/webhook/llama-stack/289768/) - - echo "Response: $response" - if [ $(echo $response | jq -r '.build_triggered') != 'true' ]; then - echo "Failed to trigger ReadTheDocs build" - exit 1 - fi diff --git a/.gitignore b/.gitignore index b516d4dd9..ca210db9a 100644 --- a/.gitignore +++ b/.gitignore @@ -18,7 +18,6 @@ Package.resolved .venv/ .vscode _build -docs/src # Sample tool-calling datasets generated by NVIDIA notebooks docs/notebooks/nvidia/tool_calling/sample_data/ pyrightconfig.json diff --git a/.readthedocs.yaml b/.readthedocs.yaml deleted file mode 100644 index 461977a6c..000000000 --- a/.readthedocs.yaml +++ /dev/null @@ -1,25 +0,0 @@ -# .readthedocs.yaml -# Read the Docs configuration file -# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details - -# Required -version: 2 - -# Build documentation in the "docs/" directory with Sphinx -sphinx: - configuration: docs/source/conf.py - -# Set the OS, Python version and other tools you might need -build: - os: ubuntu-22.04 - tools: - python: "3.12" - jobs: - pre_create_environment: - - asdf plugin add uv - - asdf install uv latest - - asdf global uv latest - create_environment: - - uv venv "${READTHEDOCS_VIRTUALENV_PATH}" - install: - - UV_PROJECT_ENVIRONMENT="${READTHEDOCS_VIRTUALENV_PATH}" uv sync --frozen --group docs diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 14690924d..da0ba5717 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -187,14 +187,16 @@ Note that the provider "description" field will be used to generate the provider ### Building the Documentation -If you are making changes to the documentation at [https://llamastack.github.io/latest/](https://llamastack.github.io/latest/), you can use the following command to build the documentation and preview your changes. You will need [Sphinx](https://www.sphinx-doc.org/en/master/) and the readthedocs theme. +If you are making changes to the documentation at [https://llamastack.github.io/](https://llamastack.github.io/), you can use the following command to build the documentation and preview your changes. ```bash -# This rebuilds the documentation pages. -uv run --group docs make -C docs/ html +# This rebuilds the documentation pages and the OpenAPI spec. +npm install +npm run gen-api-docs all +npm run build -# This will start a local server (usually at http://127.0.0.1:8000) that automatically rebuilds and refreshes when you make changes to the documentation. -uv run --group docs sphinx-autobuild docs/source docs/build/html --write-all +# This will start a local server (usually at http://127.0.0.1:3000). +npm run serve ``` ### Update API Documentation @@ -205,4 +207,4 @@ If you modify or add new API endpoints, update the API documentation accordingly uv run ./docs/openapi_generator/run_openapi_generator.sh ``` -The generated API documentation will be available in `docs/_static/`. Make sure to review the changes before committing. +The generated API schema will be available in `docs/static/`. Make sure to review the changes before committing. diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index 92dd33a1a..000000000 --- a/docs/Makefile +++ /dev/null @@ -1,20 +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 = source -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 - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/README.md b/docs/README.md index 2e03dd80b..1847e49d8 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,14 +1,17 @@ # Llama Stack Documentation -Here's a collection of comprehensive guides, examples, and resources for building AI applications with Llama Stack. For the complete documentation, visit our [Github page](https://llamastack.github.io/latest/getting_started/index.html). +Here's a collection of comprehensive guides, examples, and resources for building AI applications with Llama Stack. For the complete documentation, visit our [Github page](https://llamastack.github.io/getting_started/quickstart). ## Render locally -From the llama-stack root directory, run the following command to render the docs locally: +From the llama-stack `docs/` directory, run the following commands to render the docs locally: ```bash -uv run --group docs sphinx-autobuild docs/source docs/build/html --write-all +npm install +npm run gen-api-docs all +npm run build +npm run serve ``` -You can open up the docs in your browser at http://localhost:8000 +You can open up the docs in your browser at http://localhost:3000 ## Content diff --git a/docs/conftest.py b/docs/conftest.py deleted file mode 100644 index ab4d7e998..000000000 --- a/docs/conftest.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -import os -import time - - -def pytest_collection_modifyitems(items): - for item in items: - item.name = item.name.replace(' ', '_') - - -def pytest_runtest_teardown(item): - interval_seconds = os.getenv("LLAMA_STACK_TEST_INTERVAL_SECONDS") - if interval_seconds: - time.sleep(float(interval_seconds)) - - -def pytest_configure(config): - config.option.tbstyle = "short" - config.option.disable_warnings = True diff --git a/docs/contbuild.sh b/docs/contbuild.sh deleted file mode 100644 index c3687a3c8..000000000 --- a/docs/contbuild.sh +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -sphinx-autobuild --write-all source build/html --watch source/ diff --git a/docs/docs/contributing/index.mdx b/docs/docs/contributing/index.mdx index 8b3f86b03..7f50a058e 100644 --- a/docs/docs/contributing/index.mdx +++ b/docs/docs/contributing/index.mdx @@ -187,14 +187,16 @@ Note that the provider "description" field will be used to generate the provider ### Building the Documentation -If you are making changes to the documentation at [https://llamastack.github.io/latest/](https://llamastack.github.io/latest/), you can use the following command to build the documentation and preview your changes. You will need [Sphinx](https://www.sphinx-doc.org/en/master/) and the readthedocs theme. +If you are making changes to the documentation at [https://llamastack.github.io/](https://llamastack.github.io/), you can use the following command to build the documentation and preview your changes. ```bash -# This rebuilds the documentation pages. -uv run --group docs make -C docs/ html +# This rebuilds the documentation pages and the OpenAPI spec. +npm install +npm run gen-api-docs all +npm run build -# This will start a local server (usually at http://127.0.0.1:8000) that automatically rebuilds and refreshes when you make changes to the documentation. -uv run --group docs sphinx-autobuild docs/source docs/build/html --write-all +# This will start a local server (usually at http://127.0.0.1:3000). +npm run serve ``` ### Update API Documentation @@ -205,7 +207,7 @@ If you modify or add new API endpoints, update the API documentation accordingly uv run ./docs/openapi_generator/run_openapi_generator.sh ``` -The generated API documentation will be available in `docs/_static/`. Make sure to review the changes before committing. +The generated API schema will be available in `docs/static/`. Make sure to review the changes before committing. ## Adding a New Provider diff --git a/docs/docs/index.mdx b/docs/docs/index.mdx index 21e895d3f..bed931fe7 100644 --- a/docs/docs/index.mdx +++ b/docs/docs/index.mdx @@ -45,9 +45,9 @@ Llama Stack consists of a server (with multiple pluggable API providers) and Cli ## Quick Links -- Ready to build? Check out the [Getting Started Guide](https://llama-stack.readthedocs.io/en/latest/getting_started/index.html) to get started. -- Want to contribute? See the [Contributing Guide](https://github.com/meta-llama/llama-stack/blob/main/CONTRIBUTING.md). -- Explore [Example Applications](https://github.com/meta-llama/llama-stack-apps) built with Llama Stack. +- Ready to build? Check out the [Getting Started Guide](https://llama-stack.github.io/getting_started/quickstart) to get started. +- Want to contribute? See the [Contributing Guide](https://github.com/llamastack/llama-stack/blob/main/CONTRIBUTING.md). +- Explore [Example Applications](https://github.com/llamastack/llama-stack-apps) built with Llama Stack. ## Rich Ecosystem Support @@ -59,13 +59,13 @@ Llama Stack provides adapters for popular providers across all API categories: - **Training & Evaluation**: HuggingFace, TorchTune, NVIDIA NEMO :::info Provider Details -For complete provider compatibility and setup instructions, see our [Providers Documentation](https://llama-stack.readthedocs.io/en/latest/providers/index.html). +For complete provider compatibility and setup instructions, see our [Providers Documentation](https://llamastack.github.io/providers/). ::: ## Get Started Today
- 🚀 Quick Start Guide - 📚 Example Apps - 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.https://www.sphinx-doc.org/ - exit /b 1 -) - -if "%1" == "" goto help - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd diff --git a/docs/notebooks/Alpha_Llama_Stack_Post_Training.ipynb b/docs/notebooks/Alpha_Llama_Stack_Post_Training.ipynb index 554dc5759..b5fe0d8d9 100644 --- a/docs/notebooks/Alpha_Llama_Stack_Post_Training.ipynb +++ b/docs/notebooks/Alpha_Llama_Stack_Post_Training.ipynb @@ -14,7 +14,7 @@ "We will also showcase how to leverage existing Llama stack [inference APIs](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/apis/inference/inference.py) (ollama as provider) to get the new model's output and the [eval APIs](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/apis/eval/eval.py) to help you better measure the new model performance. We hope the flywheel of post-training -> eval -> inference can greatly empower agentic apps development.\n", "\n", "\n", - "- Read more about Llama Stack: https://llamastack.github.io/latest/index.html\n", + "- Read more about Llama Stack: https://llamastack.github.io/\n", "- Read more about post training APIs definition: https://github.com/meta-llama/llama-stack/blob/main/llama_stack/apis/post_training/post_training.py\n", "\n", "\n", diff --git a/docs/package-lock.json b/docs/package-lock.json new file mode 100644 index 000000000..aa133c935 --- /dev/null +++ b/docs/package-lock.json @@ -0,0 +1,22087 @@ +{ + "name": "docusaurus-template-openapi-docs", + "version": "4.3.7", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "docusaurus-template-openapi-docs", + "version": "4.3.7", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/preset-classic": "3.8.1", + "@easyops-cn/docusaurus-search-local": "^0.52.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "docusaurus-plugin-openapi-docs": "4.3.7", + "docusaurus-theme-openapi-docs": "4.3.7", + "prism-react-renderer": "^2.3.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + } + }, + "node_modules/@algolia/abtesting": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.3.0.tgz", + "integrity": "sha512-KqPVLdVNfoJzX5BKNGM9bsW8saHeyax8kmPFXul5gejrSPN3qss7PgsFH5mMem7oR8tvjvNkia97ljEYPYCN8Q==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0", + "@algolia/requester-browser-xhr": "5.37.0", + "@algolia/requester-fetch": "5.37.0", + "@algolia/requester-node-http": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.9.tgz", + "integrity": "sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.17.9", + "@algolia/autocomplete-shared": "1.17.9" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.9.tgz", + "integrity": "sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.9" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.9.tgz", + "integrity": "sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.9" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.9.tgz", + "integrity": "sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==", + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.37.0.tgz", + "integrity": "sha512-Dp2Zq+x9qQFnuiQhVe91EeaaPxWBhzwQ6QnznZQnH9C1/ei3dvtmAFfFeaTxM6FzfJXDLvVnaQagTYFTQz3R5g==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0", + "@algolia/requester-browser-xhr": "5.37.0", + "@algolia/requester-fetch": "5.37.0", + "@algolia/requester-node-http": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.37.0.tgz", + "integrity": "sha512-wyXODDOluKogTuZxRII6mtqhAq4+qUR3zIUJEKTiHLe8HMZFxfUEI4NO2qSu04noXZHbv/sRVdQQqzKh12SZuQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0", + "@algolia/requester-browser-xhr": "5.37.0", + "@algolia/requester-fetch": "5.37.0", + "@algolia/requester-node-http": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.37.0.tgz", + "integrity": "sha512-GylIFlPvLy9OMgFG8JkonIagv3zF+Dx3H401Uo2KpmfMVBBJiGfAb9oYfXtplpRMZnZPxF5FnkWaI/NpVJMC+g==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.37.0.tgz", + "integrity": "sha512-T63afO2O69XHKw2+F7mfRoIbmXWGzgpZxgOFAdP3fR4laid7pWBt20P4eJ+Zn23wXS5kC9P2K7Bo3+rVjqnYiw==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0", + "@algolia/requester-browser-xhr": "5.37.0", + "@algolia/requester-fetch": "5.37.0", + "@algolia/requester-node-http": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.37.0.tgz", + "integrity": "sha512-1zOIXM98O9zD8bYDCJiUJRC/qNUydGHK/zRK+WbLXrW1SqLFRXECsKZa5KoG166+o5q5upk96qguOtE8FTXDWQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0", + "@algolia/requester-browser-xhr": "5.37.0", + "@algolia/requester-fetch": "5.37.0", + "@algolia/requester-node-http": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.37.0.tgz", + "integrity": "sha512-31Nr2xOLBCYVal+OMZn1rp1H4lPs1914Tfr3a34wU/nsWJ+TB3vWjfkUUuuYhWoWBEArwuRzt3YNLn0F/KRVkg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0", + "@algolia/requester-browser-xhr": "5.37.0", + "@algolia/requester-fetch": "5.37.0", + "@algolia/requester-node-http": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.37.0.tgz", + "integrity": "sha512-DAFVUvEg+u7jUs6BZiVz9zdaUebYULPiQ4LM2R4n8Nujzyj7BZzGr2DCd85ip4p/cx7nAZWKM8pLcGtkTRTdsg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0", + "@algolia/requester-browser-xhr": "5.37.0", + "@algolia/requester-fetch": "5.37.0", + "@algolia/requester-node-http": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/events": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", + "license": "MIT" + }, + "node_modules/@algolia/ingestion": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.37.0.tgz", + "integrity": "sha512-pkCepBRRdcdd7dTLbFddnu886NyyxmhgqiRcHHaDunvX03Ij4WzvouWrQq7B7iYBjkMQrLS8wQqSP0REfA4W8g==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0", + "@algolia/requester-browser-xhr": "5.37.0", + "@algolia/requester-fetch": "5.37.0", + "@algolia/requester-node-http": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.37.0.tgz", + "integrity": "sha512-fNw7pVdyZAAQQCJf1cc/ih4fwrRdQSgKwgor4gchsI/Q/ss9inmC6bl/69jvoRSzgZS9BX4elwHKdo0EfTli3w==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0", + "@algolia/requester-browser-xhr": "5.37.0", + "@algolia/requester-fetch": "5.37.0", + "@algolia/requester-node-http": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.37.0.tgz", + "integrity": "sha512-U+FL5gzN2ldx3TYfQO5OAta2TBuIdabEdFwD5UVfWPsZE5nvOKkc/6BBqP54Z/adW/34c5ZrvvZhlhNTZujJXQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0", + "@algolia/requester-browser-xhr": "5.37.0", + "@algolia/requester-fetch": "5.37.0", + "@algolia/requester-node-http": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.37.0.tgz", + "integrity": "sha512-Ao8GZo8WgWFABrU7iq+JAftXV0t+UcOtCDL4mzHHZ+rQeTTf1TZssr4d0vIuoqkVNnKt9iyZ7T4lQff4ydcTrw==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.37.0.tgz", + "integrity": "sha512-H7OJOXrFg5dLcGJ22uxx8eiFId0aB9b0UBhoOi4SMSuDBe6vjJJ/LeZyY25zPaSvkXNBN3vAM+ad6M0h6ha3AA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.37.0.tgz", + "integrity": "sha512-npZ9aeag4SGTx677eqPL3rkSPlQrnzx/8wNrl1P7GpWq9w/eTmRbOq+wKrJ2r78idlY0MMgmY/mld2tq6dc44g==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "11.9.3", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.9.3.tgz", + "integrity": "sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==", + "license": "MIT", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", + "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.10" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz", + "integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", + "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", + "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.3.tgz", + "integrity": "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", + "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", + "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", + "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.27.1", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", + "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.4.tgz", + "integrity": "sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ==", + "license": "MIT", + "dependencies": { + "core-js-pure": "^3.43.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@csstools/cascade-layer-name-parser": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", + "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-alpha-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz", + "integrity": "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", + "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz", + "integrity": "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-function-display-p3-linear": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz", + "integrity": "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-function": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz", + "integrity": "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz", + "integrity": "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-content-alt-text": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz", + "integrity": "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-contrast-color-function": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz", + "integrity": "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-exponential-functions": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", + "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", + "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gamut-mapping": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz", + "integrity": "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gradients-interpolation-method": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz", + "integrity": "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz", + "integrity": "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz", + "integrity": "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-initial": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", + "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", + "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-light-dark-function": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz", + "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-float-and-clear": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", + "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overflow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", + "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overscroll-behavior": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", + "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-resize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", + "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-viewport-units": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", + "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-minmax": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", + "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", + "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", + "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz", + "integrity": "sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz", + "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", + "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-random-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", + "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz", + "integrity": "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", + "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-sign-functions": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", + "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", + "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz", + "integrity": "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", + "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", + "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/utilities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", + "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.9.0.tgz", + "integrity": "sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA==", + "license": "MIT" + }, + "node_modules/@docsearch/react": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.9.0.tgz", + "integrity": "sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.17.9", + "@algolia/autocomplete-preset-algolia": "1.17.9", + "@docsearch/css": "3.9.0", + "algoliasearch": "^5.14.2" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@docusaurus/babel": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.8.1.tgz", + "integrity": "sha512-3brkJrml8vUbn9aeoZUlJfsI/GqyFcDgQJwQkmBtclJgWDEQBKKeagZfOgx0WfUQhagL1sQLNW0iBdxnI863Uw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.25.9", + "@babel/preset-env": "^7.25.9", + "@babel/preset-react": "^7.25.9", + "@babel/preset-typescript": "^7.25.9", + "@babel/runtime": "^7.25.9", + "@babel/runtime-corejs3": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@docusaurus/logger": "3.8.1", + "@docusaurus/utils": "3.8.1", + "babel-plugin-dynamic-import-node": "^2.3.3", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/bundler": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.8.1.tgz", + "integrity": "sha512-/z4V0FRoQ0GuSLToNjOSGsk6m2lQUG4FRn8goOVoZSRsTrU8YR2aJacX5K3RG18EaX9b+52pN4m1sL3MQZVsQA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@docusaurus/babel": "3.8.1", + "@docusaurus/cssnano-preset": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "babel-loader": "^9.2.1", + "clean-css": "^5.3.3", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.11.0", + "css-minimizer-webpack-plugin": "^5.0.1", + "cssnano": "^6.1.2", + "file-loader": "^6.2.0", + "html-minifier-terser": "^7.2.0", + "mini-css-extract-plugin": "^2.9.2", + "null-loader": "^4.0.1", + "postcss": "^8.5.4", + "postcss-loader": "^7.3.4", + "postcss-preset-env": "^10.2.1", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "webpack": "^5.95.0", + "webpackbar": "^6.0.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/faster": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/faster": { + "optional": true + } + } + }, + "node_modules/@docusaurus/core": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.8.1.tgz", + "integrity": "sha512-ENB01IyQSqI2FLtOzqSI3qxG2B/jP4gQPahl2C3XReiLebcVh5B5cB9KYFvdoOqOWPyr5gXK4sjgTKv7peXCrA==", + "license": "MIT", + "dependencies": { + "@docusaurus/babel": "3.8.1", + "@docusaurus/bundler": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/mdx-loader": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "core-js": "^3.31.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "eval": "^0.1.8", + "execa": "5.1.1", + "fs-extra": "^11.1.1", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.6.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "open": "^8.4.0", + "p-map": "^4.0.0", + "prompts": "^2.4.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.6", + "tinypool": "^1.0.2", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "webpack": "^5.95.0", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-dev-server": "^4.15.2", + "webpack-merge": "^6.0.1" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@mdx-js/react": "^3.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.8.1.tgz", + "integrity": "sha512-G7WyR2N6SpyUotqhGznERBK+x84uyhfMQM2MmDLs88bw4Flom6TY46HzkRkSEzaP9j80MbTN8naiL1fR17WQug==", + "license": "MIT", + "dependencies": { + "cssnano-preset-advanced": "^6.1.2", + "postcss": "^8.5.4", + "postcss-sort-media-queries": "^5.2.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/logger": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.8.1.tgz", + "integrity": "sha512-2wjeGDhKcExEmjX8k1N/MRDiPKXGF2Pg+df/bDDPnnJWHXnVEZxXj80d6jcxp1Gpnksl0hF8t/ZQw9elqj2+ww==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.8.1.tgz", + "integrity": "sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^2.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.8.1.tgz", + "integrity": "sha512-6xhvAJiXzsaq3JdosS7wbRt/PwEPWHr9eM4YNYqVlbgG1hSK3uQDXTVvQktasp3VO6BmfYWPozueLWuj4gB+vg==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.8.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.8.1.tgz", + "integrity": "sha512-vNTpMmlvNP9n3hGEcgPaXyvTljanAKIUkuG9URQ1DeuDup0OR7Ltvoc8yrmH+iMZJbcQGhUJF+WjHLwuk8HSdw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/mdx-loader": "3.8.1", + "@docusaurus/theme-common": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "cheerio": "1.0.0-rc.12", + "feed": "^4.2.2", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "srcset": "^4.0.0", + "tslib": "^2.6.0", + "unist-util-visit": "^5.0.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.8.1.tgz", + "integrity": "sha512-oByRkSZzeGNQByCMaX+kif5Nl2vmtj2IHQI2fWjCfCootsdKZDPFLonhIp5s3IGJO7PLUfe0POyw0Xh/RrGXJA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/mdx-loader": "3.8.1", + "@docusaurus/module-type-aliases": "3.8.1", + "@docusaurus/theme-common": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "@types/react-router-config": "^5.0.7", + "combine-promises": "^1.1.0", + "fs-extra": "^11.1.1", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "tslib": "^2.6.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.8.1.tgz", + "integrity": "sha512-a+V6MS2cIu37E/m7nDJn3dcxpvXb6TvgdNI22vJX8iUTp8eoMoPa0VArEbWvCxMY/xdC26WzNv4wZ6y0iIni/w==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/mdx-loader": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-css-cascade-layers": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.8.1.tgz", + "integrity": "sha512-VQ47xRxfNKjHS5ItzaVXpxeTm7/wJLFMOPo1BkmoMG4Cuz4nuI+Hs62+RMk1OqVog68Swz66xVPK8g9XTrBKRw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.8.1.tgz", + "integrity": "sha512-nT3lN7TV5bi5hKMB7FK8gCffFTBSsBsAfV84/v293qAmnHOyg1nr9okEw8AiwcO3bl9vije5nsUvP0aRl2lpaw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "fs-extra": "^11.1.1", + "react-json-view-lite": "^2.3.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.8.1.tgz", + "integrity": "sha512-Hrb/PurOJsmwHAsfMDH6oVpahkEGsx7F8CWMjyP/dw1qjqmdS9rcV1nYCGlM8nOtD3Wk/eaThzUB5TSZsGz+7Q==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.8.1.tgz", + "integrity": "sha512-tKE8j1cEZCh8KZa4aa80zpSTxsC2/ZYqjx6AAfd8uA8VHZVw79+7OTEP2PoWi0uL5/1Is0LF5Vwxd+1fz5HlKg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "@types/gtag.js": "^0.0.12", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.8.1.tgz", + "integrity": "sha512-iqe3XKITBquZq+6UAXdb1vI0fPY5iIOitVjPQ581R1ZKpHr0qe+V6gVOrrcOHixPDD/BUKdYwkxFjpNiEN+vBw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.8.1.tgz", + "integrity": "sha512-+9YV/7VLbGTq8qNkjiugIelmfUEVkTyLe6X8bWq7K5qPvGXAjno27QAfFq63mYfFFbJc7z+pudL63acprbqGzw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-svgr": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.8.1.tgz", + "integrity": "sha512-rW0LWMDsdlsgowVwqiMb/7tANDodpy1wWPwCcamvhY7OECReN3feoFwLjd/U4tKjNY3encj0AJSTxJA+Fpe+Gw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "@svgr/core": "8.1.0", + "@svgr/webpack": "^8.1.0", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.8.1.tgz", + "integrity": "sha512-yJSjYNHXD8POMGc2mKQuj3ApPrN+eG0rO1UPgSx7jySpYU+n4WjBikbrA2ue5ad9A7aouEtMWUoiSRXTH/g7KQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/plugin-content-blog": "3.8.1", + "@docusaurus/plugin-content-docs": "3.8.1", + "@docusaurus/plugin-content-pages": "3.8.1", + "@docusaurus/plugin-css-cascade-layers": "3.8.1", + "@docusaurus/plugin-debug": "3.8.1", + "@docusaurus/plugin-google-analytics": "3.8.1", + "@docusaurus/plugin-google-gtag": "3.8.1", + "@docusaurus/plugin-google-tag-manager": "3.8.1", + "@docusaurus/plugin-sitemap": "3.8.1", + "@docusaurus/plugin-svgr": "3.8.1", + "@docusaurus/theme-classic": "3.8.1", + "@docusaurus/theme-common": "3.8.1", + "@docusaurus/theme-search-algolia": "3.8.1", + "@docusaurus/types": "3.8.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.8.1.tgz", + "integrity": "sha512-bqDUCNqXeYypMCsE1VcTXSI1QuO4KXfx8Cvl6rYfY0bhhqN6d2WZlRkyLg/p6pm+DzvanqHOyYlqdPyP0iz+iw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/mdx-loader": "3.8.1", + "@docusaurus/module-type-aliases": "3.8.1", + "@docusaurus/plugin-content-blog": "3.8.1", + "@docusaurus/plugin-content-docs": "3.8.1", + "@docusaurus/plugin-content-pages": "3.8.1", + "@docusaurus/theme-common": "3.8.1", + "@docusaurus/theme-translations": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "copy-text-to-clipboard": "^3.2.0", + "infima": "0.2.0-alpha.45", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.5.4", + "prism-react-renderer": "^2.3.0", + "prismjs": "^1.29.0", + "react-router-dom": "^5.3.4", + "rtlcss": "^4.1.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.8.1.tgz", + "integrity": "sha512-UswMOyTnPEVRvN5Qzbo+l8k4xrd5fTFu2VPPfD6FcW/6qUtVLmJTQCktbAL3KJ0BVXGm5aJXz/ZrzqFuZERGPw==", + "license": "MIT", + "dependencies": { + "@docusaurus/mdx-loader": "3.8.1", + "@docusaurus/module-type-aliases": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.8.1.tgz", + "integrity": "sha512-NBFH5rZVQRAQM087aYSRKQ9yGEK9eHd+xOxQjqNpxMiV85OhJDD4ZGz6YJIod26Fbooy54UWVdzNU0TFeUUUzQ==", + "license": "MIT", + "dependencies": { + "@docsearch/react": "^3.9.0", + "@docusaurus/core": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/plugin-content-docs": "3.8.1", + "@docusaurus/theme-common": "3.8.1", + "@docusaurus/theme-translations": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "algoliasearch": "^5.17.1", + "algoliasearch-helper": "^3.22.6", + "clsx": "^2.0.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.8.1.tgz", + "integrity": "sha512-OTp6eebuMcf2rJt4bqnvuwmm3NVXfzfYejL+u/Y1qwKhZPrjPoKWfk1CbOP5xH5ZOPkiAsx4dHdQBRJszK3z2g==", + "license": "MIT", + "dependencies": { + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/types": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.8.1.tgz", + "integrity": "sha512-ZPdW5AB+pBjiVrcLuw3dOS6BFlrG0XkS2lDGsj8TizcnREQg3J8cjsgfDviszOk4CweNfwo1AEELJkYaMUuOPg==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/types/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.8.1.tgz", + "integrity": "sha512-P1ml0nvOmEFdmu0smSXOqTS1sxU5tqvnc0dA4MTKV39kye+bhQnjkIKEE18fNOvxjyB86k8esoCIFM3x4RykOQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "escape-string-regexp": "^4.0.0", + "execa": "5.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "p-queue": "^6.6.2", + "prompts": "^2.4.2", + "resolve-pathname": "^3.0.0", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.8.1.tgz", + "integrity": "sha512-zTZiDlvpvoJIrQEEd71c154DkcriBecm4z94OzEE9kz7ikS3J+iSlABhFXM45mZ0eN5pVqqr7cs60+ZlYLewtg==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.8.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.8.1.tgz", + "integrity": "sha512-gs5bXIccxzEbyVecvxg6upTwaUbfa0KMmTj7HhHzc016AGyxH2o73k1/aOD0IFrdCsfJNt37MqNI47s2MgRZMA==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "fs-extra": "^11.2.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@easyops-cn/autocomplete.js": { + "version": "0.38.1", + "resolved": "https://registry.npmjs.org/@easyops-cn/autocomplete.js/-/autocomplete.js-0.38.1.tgz", + "integrity": "sha512-drg76jS6syilOUmVNkyo1c7ZEBPcPuK+aJA7AksM5ZIIbV57DMHCywiCr+uHyv8BE5jUTU98j/H7gVrkHrWW3Q==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "immediate": "^3.2.3" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.52.1.tgz", + "integrity": "sha512-pwfANjTLOQyAPc2Iz93WbG4OQM5C4COCWARbLAs79FIpIS38gHq3PrbDIX8f7oDhGQp1u6f8fr3K3u3+yZXZTA==", + "license": "MIT", + "dependencies": { + "@docusaurus/plugin-content-docs": "^2 || ^3", + "@docusaurus/theme-translations": "^2 || ^3", + "@docusaurus/utils": "^2 || ^3", + "@docusaurus/utils-common": "^2 || ^3", + "@docusaurus/utils-validation": "^2 || ^3", + "@easyops-cn/autocomplete.js": "^0.38.1", + "@node-rs/jieba": "^1.6.0", + "cheerio": "^1.0.0", + "clsx": "^2.1.1", + "comlink": "^4.4.2", + "debug": "^4.2.0", + "fs-extra": "^10.0.0", + "klaw-sync": "^6.0.0", + "lunr": "^2.3.9", + "lunr-languages": "^1.4.0", + "mark.js": "^8.11.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@docusaurus/theme-common": "^2 || ^3", + "react": "^16.14.0 || ^17 || ^18 || ^19", + "react-dom": "^16.14.0 || 17 || ^18 || ^19" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/cheerio": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", + "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.0.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.12.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=20.18.1" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz", + "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", + "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@exodus/schemasafe": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.3.0.tgz", + "integrity": "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==", + "license": "MIT" + }, + "node_modules/@faker-js/faker": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-5.5.3.tgz", + "integrity": "sha512-R11tGE6yIFwqpaIqcfkcg7AICXzFg14+5h5v0TfF/9+RMDL6jhzCy/pxHVOfbALGdtVYdt6JdR21tuxEgl34dw==", + "deprecated": "Please update to a newer version.", + "license": "MIT" + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@hookform/error-message": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@hookform/error-message/-/error-message-2.0.1.tgz", + "integrity": "sha512-U410sAr92xgxT1idlu9WWOVjndxLdgPUHEB8Schr27C9eh7/xUnITWpCMF93s+lGiG++D4JnbSnrb5A21AdSNg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0", + "react-hook-form": "^7.0.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "license": "MIT" + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", + "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", + "license": "MIT", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@node-rs/jieba": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba/-/jieba-1.10.4.tgz", + "integrity": "sha512-GvDgi8MnBiyWd6tksojej8anIx18244NmIOc1ovEw8WKNUejcccLfyu8vj66LWSuoZuKILVtNsOy4jvg3aoxIw==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@node-rs/jieba-android-arm-eabi": "1.10.4", + "@node-rs/jieba-android-arm64": "1.10.4", + "@node-rs/jieba-darwin-arm64": "1.10.4", + "@node-rs/jieba-darwin-x64": "1.10.4", + "@node-rs/jieba-freebsd-x64": "1.10.4", + "@node-rs/jieba-linux-arm-gnueabihf": "1.10.4", + "@node-rs/jieba-linux-arm64-gnu": "1.10.4", + "@node-rs/jieba-linux-arm64-musl": "1.10.4", + "@node-rs/jieba-linux-x64-gnu": "1.10.4", + "@node-rs/jieba-linux-x64-musl": "1.10.4", + "@node-rs/jieba-wasm32-wasi": "1.10.4", + "@node-rs/jieba-win32-arm64-msvc": "1.10.4", + "@node-rs/jieba-win32-ia32-msvc": "1.10.4", + "@node-rs/jieba-win32-x64-msvc": "1.10.4" + } + }, + "node_modules/@node-rs/jieba-android-arm-eabi": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-android-arm-eabi/-/jieba-android-arm-eabi-1.10.4.tgz", + "integrity": "sha512-MhyvW5N3Fwcp385d0rxbCWH42kqDBatQTyP8XbnYbju2+0BO/eTeCCLYj7Agws4pwxn2LtdldXRSKavT7WdzNA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-android-arm64": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-android-arm64/-/jieba-android-arm64-1.10.4.tgz", + "integrity": "sha512-XyDwq5+rQ+Tk55A+FGi6PtJbzf974oqnpyCcCPzwU3QVXJCa2Rr4Lci+fx8oOpU4plT3GuD+chXMYLsXipMgJA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-darwin-arm64": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-darwin-arm64/-/jieba-darwin-arm64-1.10.4.tgz", + "integrity": "sha512-G++RYEJ2jo0rxF9626KUy90wp06TRUjAsvY/BrIzEOX/ingQYV/HjwQzNPRR1P1o32a6/U8RGo7zEBhfdybL6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-darwin-x64": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-darwin-x64/-/jieba-darwin-x64-1.10.4.tgz", + "integrity": "sha512-MmDNeOb2TXIZCPyWCi2upQnZpPjAxw5ZGEj6R8kNsPXVFALHIKMa6ZZ15LCOkSTsKXVC17j2t4h+hSuyYb6qfQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-freebsd-x64": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-freebsd-x64/-/jieba-freebsd-x64-1.10.4.tgz", + "integrity": "sha512-/x7aVQ8nqUWhpXU92RZqd333cq639i/olNpd9Z5hdlyyV5/B65LLy+Je2B2bfs62PVVm5QXRpeBcZqaHelp/bg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-arm-gnueabihf": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm-gnueabihf/-/jieba-linux-arm-gnueabihf-1.10.4.tgz", + "integrity": "sha512-crd2M35oJBRLkoESs0O6QO3BBbhpv+tqXuKsqhIG94B1d02RVxtRIvSDwO33QurxqSdvN9IeSnVpHbDGkuXm3g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-arm64-gnu": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm64-gnu/-/jieba-linux-arm64-gnu-1.10.4.tgz", + "integrity": "sha512-omIzNX1psUzPcsdnUhGU6oHeOaTCuCjUgOA/v/DGkvWC1jLcnfXe4vdYbtXMh4XOCuIgS1UCcvZEc8vQLXFbXQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-arm64-musl": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm64-musl/-/jieba-linux-arm64-musl-1.10.4.tgz", + "integrity": "sha512-Y/tiJ1+HeS5nnmLbZOE+66LbsPOHZ/PUckAYVeLlQfpygLEpLYdlh0aPpS5uiaWMjAXYZYdFkpZHhxDmSLpwpw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-x64-gnu": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-x64-gnu/-/jieba-linux-x64-gnu-1.10.4.tgz", + "integrity": "sha512-WZO8ykRJpWGE9MHuZpy1lu3nJluPoeB+fIJJn5CWZ9YTVhNDWoCF4i/7nxz1ntulINYGQ8VVuCU9LD86Mek97g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-x64-musl": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-x64-musl/-/jieba-linux-x64-musl-1.10.4.tgz", + "integrity": "sha512-uBBD4S1rGKcgCyAk6VCKatEVQb6EDD5I40v/DxODi5CuZVCANi9m5oee/MQbAoaX7RydA2f0OSCE9/tcwXEwUg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-wasm32-wasi": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-wasm32-wasi/-/jieba-wasm32-wasi-1.10.4.tgz", + "integrity": "sha512-Y2umiKHjuIJy0uulNDz9SDYHdfq5Hmy7jY5nORO99B4pySKkcrMjpeVrmWXJLIsEKLJwcCXHxz8tjwU5/uhz0A==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@node-rs/jieba-win32-arm64-msvc": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-arm64-msvc/-/jieba-win32-arm64-msvc-1.10.4.tgz", + "integrity": "sha512-nwMtViFm4hjqhz1it/juQnxpXgqlGltCuWJ02bw70YUDMDlbyTy3grCJPpQQpueeETcALUnTxda8pZuVrLRcBA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-win32-ia32-msvc": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-ia32-msvc/-/jieba-win32-ia32-msvc-1.10.4.tgz", + "integrity": "sha512-DCAvLx7Z+W4z5oKS+7vUowAJr0uw9JBw8x1Y23Xs/xMA4Em+OOSiaF5/tCJqZUCJ8uC4QeImmgDFiBqGNwxlyA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-win32-x64-msvc": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-x64-msvc/-/jieba-win32-x64-msvc-1.10.4.tgz", + "integrity": "sha512-+sqemSfS1jjb+Tt7InNbNzrRh1Ua3vProVvC4BZRPg010/leCbGFFiQHpzcPRfpxAXZrzG5Y0YBTsPzN/I4yHQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "license": "MIT", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "license": "ISC" + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", + "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", + "license": "MIT", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "license": "MIT" + }, + "node_modules/@redocly/ajv": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.3.tgz", + "integrity": "sha512-4P3iZse91TkBiY+Dx5DUgxQ9GXkVJf++cmI0MOyLDxV9b5MUBI4II6ES8zA5JCbO72nKAJxWrw4PUPW+YP3ZDQ==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js-replace": "^1.0.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@redocly/config": { + "version": "0.22.2", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.22.2.tgz", + "integrity": "sha512-roRDai8/zr2S9YfmzUfNhKjOF0NdcOIqF7bhf4MVC5UxpjIysDjyudvlAiVbpPHp3eDRWbdzUgtkK1a7YiDNyQ==", + "license": "MIT" + }, + "node_modules/@redocly/openapi-core": { + "version": "1.34.5", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.5.tgz", + "integrity": "sha512-0EbE8LRbkogtcCXU7liAyC00n9uNG9hJ+eMyHFdUsy9lB/WGqnEBgwjA9q2cyzAVcdTkQqTBBU1XePNnN3OijA==", + "license": "MIT", + "dependencies": { + "@redocly/ajv": "^8.11.2", + "@redocly/config": "^0.22.0", + "colorette": "^1.2.0", + "https-proxy-agent": "^7.0.5", + "js-levenshtein": "^1.1.6", + "js-yaml": "^4.1.0", + "minimatch": "^5.0.1", + "pluralize": "^8.0.0", + "yaml-ast-parser": "0.0.43" + }, + "engines": { + "node": ">=18.17.0", + "npm": ">=9.5.0" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@slorber/remark-comment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", + "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.1.0", + "micromark-util-symbol": "^1.0.1" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", + "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz", + "integrity": "sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/gtag.js": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", + "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "license": "MIT" + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz", + "integrity": "sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==", + "license": "MIT", + "dependencies": { + "hoist-non-react-statics": "^3.3.0" + }, + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.2.tgz", + "integrity": "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.12.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", + "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/parse5": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", + "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", + "license": "MIT" + }, + "node_modules/@types/prismjs": { + "version": "1.26.5", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", + "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.1.13", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.13.tgz", + "integrity": "sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==", + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-redux": { + "version": "7.1.34", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.34.tgz", + "integrity": "sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==", + "license": "MIT", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-config": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", + "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "^5.1.0" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "license": "MIT" + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/send": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", + "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/algoliasearch": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.37.0.tgz", + "integrity": "sha512-y7gau/ZOQDqoInTQp0IwTOjkrHc4Aq4R8JgpmCleFwiLl+PbN2DMWoDUWZnrK8AhNJwT++dn28Bt4NZYNLAmuA==", + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.3.0", + "@algolia/client-abtesting": "5.37.0", + "@algolia/client-analytics": "5.37.0", + "@algolia/client-common": "5.37.0", + "@algolia/client-insights": "5.37.0", + "@algolia/client-personalization": "5.37.0", + "@algolia/client-query-suggestions": "5.37.0", + "@algolia/client-search": "5.37.0", + "@algolia/ingestion": "1.37.0", + "@algolia/monitoring": "1.37.0", + "@algolia/recommend": "5.37.0", + "@algolia/requester-browser-xhr": "5.37.0", + "@algolia/requester-fetch": "5.37.0", + "@algolia/requester-node-http": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.26.0.tgz", + "integrity": "sha512-Rv2x3GXleQ3ygwhkhJubhhYGsICmShLAiqtUuJTUkr9uOCOXyF2E71LVT4XDnVffbknv8XgScP4U0Oxtgm+hIw==", + "license": "MIT", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/allof-merge": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/allof-merge/-/allof-merge-0.6.7.tgz", + "integrity": "sha512-slvjkM56OdeVkm1tllrnaumtSHwqyHrepXkAe6Am+CW4WdbHkNqdOKPF6cvY3/IouzvXk1BoLICT5LY7sCoFGw==", + "license": "MIT", + "dependencies": { + "json-crawl": "^0.5.3" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.6.tgz", + "integrity": "sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.26.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.2.tgz", + "integrity": "sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.3", + "caniuse-lite": "^1.0.30001741", + "electron-to-chromium": "^1.5.218", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "license": "MIT" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001743", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001743.tgz", + "integrity": "sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/charset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", + "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "license": "MIT" + }, + "node_modules/combine-promises": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", + "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/comlink": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.2.tgz", + "integrity": "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==", + "license": "Apache-2.0" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "license": "ISC" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/compute-gcd": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/compute-gcd/-/compute-gcd-1.2.1.tgz", + "integrity": "sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==", + "dependencies": { + "validate.io-array": "^1.0.3", + "validate.io-function": "^1.0.2", + "validate.io-integer-array": "^1.0.0" + } + }, + "node_modules/compute-lcm": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/compute-lcm/-/compute-lcm-1.1.2.tgz", + "integrity": "sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==", + "dependencies": { + "compute-gcd": "^1.2.1", + "validate.io-array": "^1.0.3", + "validate.io-function": "^1.0.2", + "validate.io-integer-array": "^1.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.1.tgz", + "integrity": "sha512-3am6cw+WOicd0+HyzhC4kYS02wHJUiVQXmAADxfUARKsHBkWl1Vl3QQEiILlSs8YcPS/C0+y/urCNEYQk+byWA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.1.tgz", + "integrity": "sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", + "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.25.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.45.1.tgz", + "integrity": "sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-blank-pseudo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", + "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.0.tgz", + "integrity": "sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==", + "license": "ISC", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-has-pseudo": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz", + "integrity": "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", + "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "cssnano": "^6.0.1", + "jest-worker": "^29.4.3", + "postcss": "^8.4.24", + "schema-utils": "^4.0.1", + "serialize-javascript": "^6.0.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", + "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssdb": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.4.2.tgz", + "integrity": "sha512-PzjkRkRUS+IHDJohtxkIczlxPPZqRo0nXplsYXOMBRPjcVRjj1W4DfvRgshUYTVuUigU7ptVYkFJQ7abUB0nyg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "MIT-0" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", + "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^6.1.2", + "lilconfig": "^3.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", + "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", + "license": "MIT", + "dependencies": { + "autoprefixer": "^10.4.19", + "browserslist": "^4.23.0", + "cssnano-preset-default": "^6.1.2", + "postcss-discard-unused": "^6.0.5", + "postcss-merge-idents": "^6.0.3", + "postcss-reduce-idents": "^6.0.3", + "postcss-zindex": "^6.0.2" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-default": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", + "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^4.0.2", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.1.0", + "postcss-convert-values": "^6.1.0", + "postcss-discard-comments": "^6.0.2", + "postcss-discard-duplicates": "^6.0.3", + "postcss-discard-empty": "^6.0.3", + "postcss-discard-overridden": "^6.0.2", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", + "postcss-minify-gradients": "^6.0.3", + "postcss-minify-params": "^6.1.0", + "postcss-minify-selectors": "^6.0.4", + "postcss-normalize-charset": "^6.0.2", + "postcss-normalize-display-values": "^6.0.2", + "postcss-normalize-positions": "^6.0.2", + "postcss-normalize-repeat-style": "^6.0.2", + "postcss-normalize-string": "^6.0.2", + "postcss-normalize-timing-functions": "^6.0.2", + "postcss-normalize-unicode": "^6.1.0", + "postcss-normalize-url": "^6.0.2", + "postcss-normalize-whitespace": "^6.0.2", + "postcss-ordered-values": "^6.0.2", + "postcss-reduce-initial": "^6.1.0", + "postcss-reduce-transforms": "^6.0.2", + "postcss-svgo": "^6.0.3", + "postcss-unique-selectors": "^6.0.4" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-utils": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", + "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/detect-package-manager": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-3.0.2.tgz", + "integrity": "sha512-8JFjJHutStYrfWwzfretQoyNGoZVW1Fsrp4JO9spa7h/fBfwgTMEIy4/LBzRDGsxwVPHU0q+T9YvwLDJoOApLQ==", + "license": "MIT", + "dependencies": { + "execa": "^5.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/detect-port": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", + "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/docusaurus-plugin-openapi-docs": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/docusaurus-plugin-openapi-docs/-/docusaurus-plugin-openapi-docs-4.3.7.tgz", + "integrity": "sha512-wCXuHniG108OGCj6qKtTOFLgyhnlztMegj63BbEyHC/OgM7PDL2Yj2VFkWsU3eCmJKI+czahanztFMhVLFD67w==", + "license": "MIT", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^11.5.4", + "@redocly/openapi-core": "^1.10.5", + "allof-merge": "^0.6.6", + "chalk": "^4.1.2", + "clsx": "^1.1.1", + "fs-extra": "^9.0.1", + "json-pointer": "^0.6.2", + "json5": "^2.2.3", + "lodash": "^4.17.20", + "mustache": "^4.2.0", + "openapi-to-postmanv2": "^4.21.0", + "postman-collection": "^4.4.0", + "slugify": "^1.6.5", + "swagger2openapi": "^7.0.8", + "xml-formatter": "^2.6.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "^3.5.0", + "@docusaurus/utils": "^3.5.0", + "@docusaurus/utils-validation": "^3.5.0", + "react": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/docusaurus-plugin-openapi-docs/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/docusaurus-plugin-openapi-docs/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/docusaurus-plugin-sass": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/docusaurus-plugin-sass/-/docusaurus-plugin-sass-0.2.6.tgz", + "integrity": "sha512-2hKQQDkrufMong9upKoG/kSHJhuwd+FA3iAe/qzS/BmWpbIpe7XKmq5wlz4J5CJaOPu4x+iDJbgAxZqcoQf0kg==", + "license": "MIT", + "peer": true, + "dependencies": { + "sass-loader": "^16.0.2" + }, + "peerDependencies": { + "@docusaurus/core": "^2.0.0-beta || ^3.0.0-alpha", + "sass": "^1.30.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/docusaurus-theme-openapi-docs/-/docusaurus-theme-openapi-docs-4.3.7.tgz", + "integrity": "sha512-VRKA8gFVIlSBUu7EAYOY3JDF2WetCSVsYx5WeFo8g6/7LJWHhX7/A7Wo2fJ0B61VE/c53BSdbmvVWSJoUqnkoA==", + "license": "MIT", + "dependencies": { + "@hookform/error-message": "^2.0.1", + "@reduxjs/toolkit": "^1.7.1", + "allof-merge": "^0.6.6", + "buffer": "^6.0.3", + "clsx": "^1.1.1", + "copy-text-to-clipboard": "^3.1.0", + "crypto-js": "^4.1.1", + "file-saver": "^2.0.5", + "lodash": "^4.17.20", + "pako": "^2.1.0", + "postman-code-generators": "^1.10.1", + "postman-collection": "^4.4.0", + "prism-react-renderer": "^2.3.0", + "process": "^0.11.10", + "react-hook-form": "^7.43.8", + "react-live": "^4.0.0", + "react-magic-dropzone": "^1.0.1", + "react-markdown": "^8.0.1", + "react-modal": "^3.15.1", + "react-redux": "^7.2.0", + "rehype-raw": "^6.1.1", + "remark-gfm": "3.0.1", + "sass": "^1.80.4", + "sass-loader": "^16.0.2", + "unist-util-visit": "^5.0.0", + "url": "^0.11.1", + "xml-formatter": "^2.6.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@docusaurus/theme-common": "^3.5.0", + "docusaurus-plugin-openapi-docs": "^4.0.0", + "docusaurus-plugin-sass": "^0.2.3", + "react": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/@reduxjs/toolkit": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", + "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==", + "license": "MIT", + "dependencies": { + "immer": "^9.0.21", + "redux": "^4.2.1", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.8" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.0.2" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/@types/hast": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/hast-util-from-parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz", + "integrity": "sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "hastscript": "^7.0.0", + "property-information": "^6.0.0", + "vfile": "^5.0.0", + "vfile-location": "^4.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/hast-util-parse-selector": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz", + "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/hast-util-raw": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz", + "integrity": "sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/parse5": "^6.0.0", + "hast-util-from-parse5": "^7.0.0", + "hast-util-to-parse5": "^7.0.0", + "html-void-elements": "^2.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/hast-util-raw/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/hast-util-to-parse5": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz", + "integrity": "sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/hastscript": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz", + "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^3.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-find-and-replace": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", + "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-from-markdown": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-gfm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", + "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-gfm-autolink-literal": "^1.0.0", + "mdast-util-gfm-footnote": "^1.0.0", + "mdast-util-gfm-strikethrough": "^1.0.0", + "mdast-util-gfm-table": "^1.0.0", + "mdast-util-gfm-task-list-item": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-gfm-autolink-literal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", + "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-find-and-replace": "^2.0.0", + "micromark-util-character": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-gfm-footnote": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", + "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0", + "micromark-util-normalize-identifier": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-gfm-strikethrough": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", + "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", + "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-gfm-task-list-item": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", + "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-to-markdown": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", + "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-to-markdown/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-extension-gfm": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", + "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^1.0.0", + "micromark-extension-gfm-footnote": "^1.0.0", + "micromark-extension-gfm-strikethrough": "^1.0.0", + "micromark-extension-gfm-table": "^1.0.0", + "micromark-extension-gfm-tagfilter": "^1.0.0", + "micromark-extension-gfm-task-list-item": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-extension-gfm-autolink-literal": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", + "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-extension-gfm-footnote": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", + "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", + "license": "MIT", + "dependencies": { + "micromark-core-commonmark": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-extension-gfm-strikethrough": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", + "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-extension-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", + "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-extension-gfm-tagfilter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", + "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-extension-gfm-task-list-item": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", + "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "license": "MIT" + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/react-redux": { + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "peerDependencies": { + "react": "^16.8.3 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/rehype-raw": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-6.1.1.tgz", + "integrity": "sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-raw": "^7.2.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/remark-gfm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", + "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-gfm": "^2.0.0", + "micromark-extension-gfm": "^2.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/unist-util-position": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", + "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/vfile-location": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz", + "integrity": "sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.222", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.222.tgz", + "integrity": "sha512-gA7psSwSwQRE60CEoLz6JBCQPIxNeuzB2nL8vE03GK/OHxlvykbLyeiumQy1iH5C2f3YbRAZpGCMT12a/9ih9w==", + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", + "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "license": "MIT" + }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-value-to-estree": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.4.0.tgz", + "integrity": "sha512-Zlp+gxis+gCfK12d3Srl2PdX2ybsEA8ZYy6vQGVQTNNYLEGRQQ56XB64bjemN8kxIKXP1nC9ip4Z+ILy9LGzvQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", + "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", + "dependencies": { + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==", + "license": "BSD-3-Clause" + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/express/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "license": "MIT", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==", + "license": "MIT" + }, + "node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreach": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", + "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", + "license": "MIT" + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "license": "MIT", + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-monkey": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz", + "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==", + "license": "Unlicense" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "license": "ISC" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", + "license": "ISC" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/got/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5/node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.4.tgz", + "integrity": "sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw==", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/html-webpack-plugin/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http-reasons": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/http-reasons/-/http-reasons-0.1.0.tgz", + "integrity": "sha512-P6kYh0lKZ+y29T2Gqz+RlC9WBLhKe8kDmcJ+A+611jFfxdPsbMRQ5aNmFRM3lENqFkK+HTTL+tlQviAiv0AbLQ==", + "license": "Apache-2.0" + }, + "node_modules/http2-client": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", + "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==", + "license": "MIT" + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", + "license": "MIT" + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/immutable": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", + "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infima": { + "version": "0.2.0-alpha.45", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz", + "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", + "license": "MIT" + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.1.0.tgz", + "integrity": "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/json-crawl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/json-crawl/-/json-crawl-0.5.3.tgz", + "integrity": "sha512-BEjjCw8c7SxzNK4orhlWD5cXQh8vCk2LqDr4WgQq4CV+5dvopeYwt1Tskg67SuSLKvoFH5g0yuYtg7rcfKV6YA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-pointer": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", + "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", + "license": "MIT", + "dependencies": { + "foreach": "^2.0.4" + } + }, + "node_modules/json-schema-compare": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/json-schema-compare/-/json-schema-compare-0.2.2.tgz", + "integrity": "sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.4" + } + }, + "node_modules/json-schema-merge-allof": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/json-schema-merge-allof/-/json-schema-merge-allof-0.8.1.tgz", + "integrity": "sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w==", + "license": "MIT", + "dependencies": { + "compute-lcm": "^1.1.2", + "json-schema-compare": "^0.2.2", + "lodash": "^4.17.20" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "license": "MIT", + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/launch-editor": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz", + "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/liquid-json": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/liquid-json/-/liquid-json-0.3.1.tgz", + "integrity": "sha512-wUayTU8MS827Dam6MxgD72Ui+KOSF+u/eIqpatOtjnvgJ0+mnDq33uC2M7J0tPK+upe/DpUAuK4JUU89iBoNKQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "license": "MIT" + }, + "node_modules/lunr-languages": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/lunr-languages/-/lunr-languages-1.14.0.tgz", + "integrity": "sha512-hWUAb2KqM3L7J5bcrngszzISY4BxrXn/Xhbb9TTCJYEGqlR1nG67/M14sp09+PTIRklobrn57IAxcdcO/ZFyNA==", + "license": "MPL-1.1" + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "license": "MIT" + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-definitions": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", + "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions/node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/mdast-util-definitions/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/mdast-util-definitions/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-space/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-format": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mime-format/-/mime-format-2.0.1.tgz", + "integrity": "sha512-XxU3ngPbEnrYnNbIX+lYSaYg0M01v6p2ntd2YaFksTu0vayaw5OJvbdRyWs07EYRlLED5qadUZ+xo+XhOvFhwg==", + "license": "Apache-2.0", + "dependencies": { + "charset": "^1.0.0" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz", + "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "license": "MIT", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/neotraverse": { + "version": "0.6.15", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.15.tgz", + "integrity": "sha512-HZpdkco+JeXq0G+WWpMJ4NsX3pqb5O7eR9uGz3FfoFt+LYzU8iRWp49nJtud6hsDoywM8tIrDo3gjgmOqJA8LA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT", + "optional": true + }, + "node_modules/node-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch-h2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", + "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==", + "license": "MIT", + "dependencies": { + "http2-client": "^1.2.5" + }, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-readfiles": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", + "integrity": "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==", + "license": "MIT", + "dependencies": { + "es6-promise": "^3.2.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", + "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.0.tgz", + "integrity": "sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", + "license": "MIT" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/null-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/null-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/null-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/null-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/oas-kit-common": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz", + "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==", + "license": "BSD-3-Clause", + "dependencies": { + "fast-safe-stringify": "^2.0.7" + } + }, + "node_modules/oas-linter": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz", + "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@exodus/schemasafe": "^1.0.0-rc.2", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-resolver": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz", + "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==", + "license": "BSD-3-Clause", + "dependencies": { + "node-fetch-h2": "^2.3.0", + "oas-kit-common": "^1.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "resolve": "resolve.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-resolver-browser": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/oas-resolver-browser/-/oas-resolver-browser-2.5.6.tgz", + "integrity": "sha512-Jw5elT/kwUJrnGaVuRWe1D7hmnYWB8rfDDjBnpQ+RYY/dzAewGXeTexXzt4fGEo6PUE4eqKqPWF79MZxxvMppA==", + "license": "BSD-3-Clause", + "dependencies": { + "node-fetch-h2": "^2.3.0", + "oas-kit-common": "^1.0.8", + "path-browserify": "^1.0.1", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "resolve": "resolve.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-schema-walker": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz", + "integrity": "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==", + "license": "BSD-3-Clause", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-validator": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz", + "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==", + "license": "BSD-3-Clause", + "dependencies": { + "call-me-maybe": "^1.0.1", + "oas-kit-common": "^1.0.8", + "oas-linter": "^3.2.2", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "reftools": "^1.1.9", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openapi-to-postmanv2": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/openapi-to-postmanv2/-/openapi-to-postmanv2-4.25.0.tgz", + "integrity": "sha512-sIymbkQby0gzxt2Yez8YKB6hoISEel05XwGwNrAhr6+vxJWXNxkmssQc/8UEtVkuJ9ZfUXLkip9PYACIpfPDWg==", + "license": "Apache-2.0", + "dependencies": { + "ajv": "8.11.0", + "ajv-draft-04": "1.0.0", + "ajv-formats": "2.1.1", + "async": "3.2.4", + "commander": "2.20.3", + "graphlib": "2.1.8", + "js-yaml": "4.1.0", + "json-pointer": "0.6.2", + "json-schema-merge-allof": "0.8.1", + "lodash": "4.17.21", + "neotraverse": "0.6.15", + "oas-resolver-browser": "2.5.6", + "object-hash": "3.0.0", + "path-browserify": "1.0.1", + "postman-collection": "^4.4.0", + "swagger2openapi": "7.0.8", + "yaml": "1.10.2" + }, + "bin": { + "openapi2postmanv2": "bin/openapi2postmanv2.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/openapi-to-postmanv2/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "license": "MIT", + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "license": "(MIT AND Zlib)" + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", + "license": "ISC" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "license": "MIT", + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", + "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-calc": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz", + "integrity": "sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", + "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", + "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-colormin": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", + "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-convert-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", + "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-custom-media": { + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", + "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-properties": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", + "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", + "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", + "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-discard-comments": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", + "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", + "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-empty": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", + "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", + "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-unused": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", + "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz", + "integrity": "sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", + "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-focus-within": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", + "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-image-set-function": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", + "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-lab-function": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz", + "integrity": "sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-loader": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", + "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.3.5", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-logical": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", + "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-merge-idents": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", + "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", + "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^6.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-rules": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", + "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^4.0.2", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", + "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", + "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", + "license": "MIT", + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-params": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", + "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", + "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nesting": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", + "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-resolve-nested": "^3.1.0", + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", + "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", + "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", + "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", + "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", + "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-string": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", + "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", + "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", + "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", + "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", + "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", + "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-ordered-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", + "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", + "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", + "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-preset-env": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.4.0.tgz", + "integrity": "sha512-2kqpOthQ6JhxqQq1FSAAZGe9COQv75Aw8WbsOvQVNJ2nSevc9Yx/IKZGuZ7XJ+iOTtVon7LfO7ELRzg8AZ+sdw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-alpha-function": "^1.0.1", + "@csstools/postcss-cascade-layers": "^5.0.2", + "@csstools/postcss-color-function": "^4.0.12", + "@csstools/postcss-color-function-display-p3-linear": "^1.0.1", + "@csstools/postcss-color-mix-function": "^3.0.12", + "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.2", + "@csstools/postcss-content-alt-text": "^2.0.8", + "@csstools/postcss-contrast-color-function": "^2.0.12", + "@csstools/postcss-exponential-functions": "^2.0.9", + "@csstools/postcss-font-format-keywords": "^4.0.0", + "@csstools/postcss-gamut-mapping": "^2.0.11", + "@csstools/postcss-gradients-interpolation-method": "^5.0.12", + "@csstools/postcss-hwb-function": "^4.0.12", + "@csstools/postcss-ic-unit": "^4.0.4", + "@csstools/postcss-initial": "^2.0.1", + "@csstools/postcss-is-pseudo-class": "^5.0.3", + "@csstools/postcss-light-dark-function": "^2.0.11", + "@csstools/postcss-logical-float-and-clear": "^3.0.0", + "@csstools/postcss-logical-overflow": "^2.0.0", + "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", + "@csstools/postcss-logical-resize": "^3.0.0", + "@csstools/postcss-logical-viewport-units": "^3.0.4", + "@csstools/postcss-media-minmax": "^2.0.9", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", + "@csstools/postcss-nested-calc": "^4.0.0", + "@csstools/postcss-normalize-display-values": "^4.0.0", + "@csstools/postcss-oklab-function": "^4.0.12", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-random-function": "^2.0.1", + "@csstools/postcss-relative-color-syntax": "^3.0.12", + "@csstools/postcss-scope-pseudo-class": "^4.0.1", + "@csstools/postcss-sign-functions": "^1.1.4", + "@csstools/postcss-stepped-value-functions": "^4.0.9", + "@csstools/postcss-text-decoration-shorthand": "^4.0.3", + "@csstools/postcss-trigonometric-functions": "^4.0.9", + "@csstools/postcss-unset-value": "^4.0.0", + "autoprefixer": "^10.4.21", + "browserslist": "^4.26.0", + "css-blank-pseudo": "^7.0.1", + "css-has-pseudo": "^7.0.3", + "css-prefers-color-scheme": "^10.0.0", + "cssdb": "^8.4.2", + "postcss-attribute-case-insensitive": "^7.0.1", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^7.0.12", + "postcss-color-hex-alpha": "^10.0.0", + "postcss-color-rebeccapurple": "^10.0.0", + "postcss-custom-media": "^11.0.6", + "postcss-custom-properties": "^14.0.6", + "postcss-custom-selectors": "^8.0.5", + "postcss-dir-pseudo-class": "^9.0.1", + "postcss-double-position-gradients": "^6.0.4", + "postcss-focus-visible": "^10.0.1", + "postcss-focus-within": "^9.0.1", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^6.0.0", + "postcss-image-set-function": "^7.0.0", + "postcss-lab-function": "^7.0.12", + "postcss-logical": "^8.1.0", + "postcss-nesting": "^13.0.2", + "postcss-opacity-percentage": "^3.0.0", + "postcss-overflow-shorthand": "^6.0.0", + "postcss-page-break": "^3.0.4", + "postcss-place": "^10.0.0", + "postcss-pseudo-class-any-link": "^10.0.1", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^8.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", + "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", + "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", + "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", + "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", + "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", + "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", + "license": "MIT", + "dependencies": { + "sort-css-media-queries": "2.2.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.23" + } + }, + "node_modules/postcss-svgo": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", + "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.2.0" + }, + "engines": { + "node": "^14 || ^16 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", + "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/postcss-zindex": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", + "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postman-code-generators": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/postman-code-generators/-/postman-code-generators-1.14.2.tgz", + "integrity": "sha512-qZAyyowfQAFE4MSCu2KtMGGQE/+oG1JhMZMJNMdZHYCSfQiVVeKxgk3oI4+KJ3d1y5rrm2D6C6x+Z+7iyqm+fA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "async": "3.2.2", + "detect-package-manager": "3.0.2", + "lodash": "4.17.21", + "path": "0.12.7", + "postman-collection": "^4.4.0", + "shelljs": "0.8.5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/postman-code-generators/node_modules/async": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", + "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==", + "license": "MIT" + }, + "node_modules/postman-collection": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.5.0.tgz", + "integrity": "sha512-152JSW9pdbaoJihwjc7Q8lc3nPg/PC9lPTHdMk7SHnHhu/GBJB7b2yb9zG7Qua578+3PxkQ/HYBuXpDSvsf7GQ==", + "license": "Apache-2.0", + "dependencies": { + "@faker-js/faker": "5.5.3", + "file-type": "3.9.0", + "http-reasons": "0.1.0", + "iconv-lite": "0.6.3", + "liquid-json": "0.3.1", + "lodash": "4.17.21", + "mime-format": "2.0.1", + "mime-types": "2.1.35", + "postman-url-encoder": "3.0.5", + "semver": "7.6.3", + "uuid": "8.3.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postman-collection/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postman-url-encoder": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-3.0.5.tgz", + "integrity": "sha512-jOrdVvzUXBC7C+9gkIkpDJ3HIxOHTIqjpQ4C1EMt1ZGeMvSEpbFCKq23DEfgsj46vMnDgyQf+1ZLp2Wm+bKSsA==", + "license": "Apache-2.0", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", + "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", + "license": "MIT", + "dependencies": { + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "license": "ISC" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz", + "integrity": "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==", + "license": "MIT", + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", + "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", + "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.1" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" + }, + "node_modules/react-helmet-async": { + "name": "@slorber/react-helmet-async", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-hook-form": { + "version": "7.63.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.63.0.tgz", + "integrity": "sha512-ZwueDMvUeucovM2VjkCf7zIHcs1aAlDimZu2Hvel5C5907gUzMpm4xCrQXtRzCvsBqFjonB4m3x4LzCFI1ZKWA==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-json-view-lite": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz", + "integrity": "sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", + "license": "MIT" + }, + "node_modules/react-live": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/react-live/-/react-live-4.1.8.tgz", + "integrity": "sha512-B2SgNqwPuS2ekqj4lcxi5TibEcjWkdVyYykBEUBshPAPDQ527x2zPEZg560n8egNtAjUpwXFQm7pcXV65aAYmg==", + "license": "MIT", + "dependencies": { + "prism-react-renderer": "^2.4.0", + "sucrase": "^3.35.0", + "use-editable": "^2.3.3" + }, + "engines": { + "node": ">= 0.12.0", + "npm": ">= 2.0.0" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", + "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", + "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1 || 5.x" + } + }, + "node_modules/react-magic-dropzone": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-magic-dropzone/-/react-magic-dropzone-1.0.1.tgz", + "integrity": "sha512-0BIROPARmXHpk4AS3eWBOsewxoM5ndk2psYP/JmbCq8tz3uR2LIV1XiroZ9PKrmDRMctpW+TvsBCtWasuS8vFA==", + "license": "MIT" + }, + "node_modules/react-markdown": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz", + "integrity": "sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/prop-types": "^15.0.0", + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "prop-types": "^15.0.0", + "property-information": "^6.0.0", + "react-is": "^18.0.0", + "remark-parse": "^10.0.0", + "remark-rehype": "^10.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/react-markdown/node_modules/@types/hast": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/react-markdown/node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/react-markdown/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/react-markdown/node_modules/hast-util-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", + "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/mdast-util-from-markdown": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/mdast-util-to-hast": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", + "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-definitions": "^5.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/react-markdown/node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/react-markdown/node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/react-markdown/node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/react-markdown/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/react-markdown/node_modules/remark-parse": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", + "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/remark-rehype": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", + "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-to-hast": "^12.1.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/unist-util-position": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", + "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-modal": { + "version": "3.16.3", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.3.tgz", + "integrity": "sha512-yCYRJB5YkeQDQlTt17WGAgFJ7jr2QYcWa1SHqZ3PluDmnKJ/7+tVU+E6uKyZ0nODaeEj+xCpK4LcSnKXLMC0Nw==", + "license": "MIT", + "dependencies": { + "exenv": "^1.2.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.0", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19", + "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "license": "MIT", + "peerDependencies": { + "redux": "^4" + } + }, + "node_modules/reftools": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", + "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==", + "license": "BSD-3-Clause", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.0.tgz", + "integrity": "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==", + "license": "MIT", + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "license": "MIT", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-directive": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", + "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", + "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.2", + "emoticon": "^4.0.1", + "mdast-util-find-and-replace": "^3.0.1", + "node-emoji": "^2.1.0", + "unified": "^11.0.4" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", + "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", + "engines": { + "node": "*" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/reselect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", + "license": "MIT" + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rtlcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0", + "postcss": "^8.4.21", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.93.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.0.tgz", + "integrity": "sha512-CQi5/AzCwiubU3dSqRDJ93RfOfg/hhpW1l6wCIvolmehfwgCI35R/0QDs1+R+Ygrl8jFawwwIojE2w47/mf94A==", + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass-loader": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz", + "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==", + "license": "MIT", + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/sass/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "license": "ISC" + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "node_modules/schema-dts": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", + "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", + "license": "Apache-2.0" + }, + "node_modules/schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "license": "MIT", + "peer": true + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", + "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", + "license": "MIT", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "3.3.0", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/serve-handler/node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "license": "MIT", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", + "license": "MIT" + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "license": "BSD-3-Clause", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/should": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", + "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", + "license": "MIT", + "dependencies": { + "should-equal": "^2.0.0", + "should-format": "^3.0.3", + "should-type": "^1.4.0", + "should-type-adaptors": "^1.0.1", + "should-util": "^1.0.0" + } + }, + "node_modules/should-equal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", + "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", + "license": "MIT", + "dependencies": { + "should-type": "^1.4.0" + } + }, + "node_modules/should-format": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", + "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", + "license": "MIT", + "dependencies": { + "should-type": "^1.3.0", + "should-type-adaptors": "^1.0.1" + } + }, + "node_modules/should-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", + "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", + "license": "MIT" + }, + "node_modules/should-type-adaptors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", + "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", + "license": "MIT", + "dependencies": { + "should-type": "^1.3.0", + "should-util": "^1.0.0" + } + }, + "node_modules/should-util": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", + "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", + "license": "MIT" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", + "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", + "license": "MIT", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "license": "MIT" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "license": "MIT", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slugify": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", + "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sort-css-media-queries": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", + "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", + "license": "MIT", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/srcset": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-js": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.17.tgz", + "integrity": "sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.9" + } + }, + "node_modules/style-to-js/node_modules/inline-style-parser": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "license": "MIT" + }, + "node_modules/style-to-js/node_modules/style-to-object": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.9.tgz", + "integrity": "sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.4" + } + }, + "node_modules/style-to-object": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/stylehacks": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", + "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "license": "MIT" + }, + "node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/swagger2openapi": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", + "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==", + "license": "BSD-3-Clause", + "dependencies": { + "call-me-maybe": "^1.0.1", + "node-fetch": "^2.6.1", + "node-fetch-h2": "^2.3.0", + "node-readfiles": "^0.2.0", + "oas-kit-common": "^1.0.8", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "oas-validator": "^5.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "boast": "boast.js", + "oas-validate": "oas-validate.js", + "swagger2openapi": "swagger2openapi.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/tapable": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", + "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", + "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/undici": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz", + "integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.12.0.tgz", + "integrity": "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-util-generated": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", + "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "license": "BSD-2-Clause", + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js-replace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz", + "integrity": "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==", + "license": "MIT" + }, + "node_modules/url": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", + "license": "MIT", + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.12.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/url-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "license": "MIT" + }, + "node_modules/use-editable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/use-editable/-/use-editable-2.3.3.tgz", + "integrity": "sha512-7wVD2JbfAFJ3DK0vITvXBdpd9JAz5BcKAAolsnLBuBn6UDDwBGuCIAGvR3yA2BNKm578vAMVHFCWaOcA+BhhiA==", + "license": "MIT", + "peerDependencies": { + "react": ">= 16.8.0" + } + }, + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "license": "MIT", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "license": "MIT" + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "bin": { + "uvu": "bin.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uvu/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/validate.io-array": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz", + "integrity": "sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==", + "license": "MIT" + }, + "node_modules/validate.io-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/validate.io-function/-/validate.io-function-1.0.2.tgz", + "integrity": "sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ==" + }, + "node_modules/validate.io-integer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz", + "integrity": "sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ==", + "dependencies": { + "validate.io-number": "^1.0.3" + } + }, + "node_modules/validate.io-integer-array": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz", + "integrity": "sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA==", + "dependencies": { + "validate.io-array": "^1.0.3", + "validate.io-integer": "^1.0.4" + } + }, + "node_modules/validate.io-number": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz", + "integrity": "sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==" + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/webpack": { + "version": "5.101.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.3.tgz", + "integrity": "sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.3", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/webpack-dev-middleware/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpackbar": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz", + "integrity": "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "consola": "^3.2.3", + "figures": "^3.2.0", + "markdown-table": "^2.0.0", + "pretty-time": "^1.1.0", + "std-env": "^3.7.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "webpack": "3 || 4 || 5" + } + }, + "node_modules/webpackbar/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/webpackbar/node_modules/markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "license": "MIT", + "dependencies": { + "repeat-string": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpackbar/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpackbar/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "license": "MIT", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-formatter": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/xml-formatter/-/xml-formatter-2.6.1.tgz", + "integrity": "sha512-dOiGwoqm8y22QdTNI7A+N03tyVfBlQ0/oehAzxIZtwnFAHGeSlrfjF73YQvzSsa/Kt6+YZasKsrdu6OIpuBggw==", + "license": "MIT", + "dependencies": { + "xml-parser-xo": "^3.2.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/xml-parser-xo": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/xml-parser-xo/-/xml-parser-xo-3.2.0.tgz", + "integrity": "sha512-8LRU6cq+d7mVsoDaMhnkkt3CTtAs4153p49fRo+HIB3I1FD1o5CeXRjRH29sQevIfVJIcPjKSsPU/+Ujhq09Rg==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yaml-ast-parser": { + "version": "0.0.43", + "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", + "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", + "license": "Apache-2.0" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 000000000..6bbc48eb0 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,44 @@ +{ + "name": "docusaurus-template-openapi-docs", + "version": "4.3.7", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids", + "gen-api-docs": "docusaurus gen-api-docs", + "clean-api-docs": "docusaurus clean-api-docs", + "gen-api-docs:version": "docusaurus gen-api-docs:version", + "clean-api-docs:version": "docusaurus clean-api-docs:version" + }, + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/preset-classic": "3.8.1", + "@easyops-cn/docusaurus-search-local": "^0.52.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "docusaurus-plugin-openapi-docs": "4.3.7", + "docusaurus-theme-openapi-docs": "4.3.7", + "prism-react-renderer": "^2.3.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/docs/sidebars.ts b/docs/sidebars.ts new file mode 100644 index 000000000..01c1390c1 --- /dev/null +++ b/docs/sidebars.ts @@ -0,0 +1,342 @@ +import type {SidebarsConfig} from '@docusaurus/plugin-content-docs'; + +/** + * Creating a sidebar enables you to: + - create an ordered group of docs + - render a sidebar for each doc of that group + - provide next/previous navigation + + The sidebars can be generated from the filesystem, or explicitly defined here. + + Create as many sidebars as you want. + */ +const sidebars: SidebarsConfig = { + tutorialSidebar: [ + 'index', + { + type: 'category', + label: 'Getting Started', + collapsed: false, + items: [ + 'getting_started/quickstart', + 'getting_started/detailed_tutorial', + 'getting_started/libraries', + ], + }, + { + type: 'category', + label: 'Concepts', + collapsed: false, + items: [ + 'concepts/index', + 'concepts/architecture', + { + type: 'category', + label: 'APIs', + collapsed: true, + items: [ + 'concepts/apis/index', + 'concepts/apis/api_providers', + 'concepts/apis/external', + 'concepts/apis/api_leveling', + ], + }, + 'concepts/distributions', + 'concepts/resources', + ], + }, + { + type: 'category', + label: 'Distributions', + collapsed: false, + items: [ + 'distributions/index', + 'distributions/list_of_distributions', + 'distributions/building_distro', + 'distributions/customizing_run_yaml', + 'distributions/importing_as_library', + 'distributions/configuration', + 'distributions/starting_llama_stack_server', + { + type: 'category', + label: 'Self-Hosted Distributions', + collapsed: true, + items: [ + 'distributions/self_hosted_distro/starter', + 'distributions/self_hosted_distro/dell', + 'distributions/self_hosted_distro/dell-tgi', + 'distributions/self_hosted_distro/meta-reference-gpu', + 'distributions/self_hosted_distro/nvidia', + 'distributions/self_hosted_distro/passthrough', + ], + }, + { + type: 'category', + label: 'Remote-Hosted Distributions', + collapsed: true, + items: [ + 'distributions/remote_hosted_distro/index', + 'distributions/remote_hosted_distro/watsonx', + ], + }, + { + type: 'category', + label: 'On-Device Distributions', + collapsed: true, + items: [ + 'distributions/ondevice_distro/ios_sdk', + 'distributions/ondevice_distro/android_sdk', + ], + }, + ], + }, + { + type: 'category', + label: 'Providers', + collapsed: false, + items: [ + 'providers/index', + { + type: 'category', + label: 'Inference', + collapsed: true, + items: [ + 'providers/inference/index', + 'providers/inference/inline_meta-reference', + 'providers/inference/inline_sentence-transformers', + 'providers/inference/remote_anthropic', + 'providers/inference/remote_azure', + 'providers/inference/remote_bedrock', + 'providers/inference/remote_cerebras', + 'providers/inference/remote_databricks', + 'providers/inference/remote_fireworks', + 'providers/inference/remote_gemini', + 'providers/inference/remote_groq', + 'providers/inference/remote_hf_endpoint', + 'providers/inference/remote_hf_serverless', + 'providers/inference/remote_llama-openai-compat', + 'providers/inference/remote_nvidia', + 'providers/inference/remote_ollama', + 'providers/inference/remote_openai', + 'providers/inference/remote_passthrough', + 'providers/inference/remote_runpod', + 'providers/inference/remote_sambanova', + 'providers/inference/remote_sambanova-openai-compat', + 'providers/inference/remote_tgi', + 'providers/inference/remote_together', + 'providers/inference/remote_vertexai', + 'providers/inference/remote_vllm', + 'providers/inference/remote_watsonx' + ], + }, + { + type: 'category', + label: 'Safety', + collapsed: true, + items: [ + 'providers/safety/index', + 'providers/safety/inline_code-scanner', + 'providers/safety/inline_llama-guard', + 'providers/safety/inline_prompt-guard', + 'providers/safety/remote_bedrock', + 'providers/safety/remote_nvidia', + 'providers/safety/remote_sambanova' + ], + }, + { + type: 'category', + label: 'Vector IO', + collapsed: true, + items: [ + 'providers/vector_io/index', + 'providers/vector_io/inline_chromadb', + 'providers/vector_io/inline_faiss', + 'providers/vector_io/inline_meta-reference', + 'providers/vector_io/inline_milvus', + 'providers/vector_io/inline_qdrant', + 'providers/vector_io/inline_sqlite-vec', + 'providers/vector_io/remote_chromadb', + 'providers/vector_io/remote_milvus', + 'providers/vector_io/remote_pgvector', + 'providers/vector_io/remote_qdrant', + 'providers/vector_io/remote_weaviate' + ], + }, + { + type: 'category', + label: 'Tool Runtime', + collapsed: true, + items: [ + 'providers/tool_runtime/index', + 'providers/tool_runtime/inline_rag-runtime', + 'providers/tool_runtime/remote_bing-search', + 'providers/tool_runtime/remote_brave-search', + 'providers/tool_runtime/remote_model-context-protocol', + 'providers/tool_runtime/remote_tavily-search', + 'providers/tool_runtime/remote_wolfram-alpha' + ], + }, + { + type: 'category', + label: 'Agents', + collapsed: true, + items: [ + 'providers/agents/index', + 'providers/agents/inline_meta-reference' + ], + }, + { + type: 'category', + label: 'Post Training', + collapsed: true, + items: [ + 'providers/post_training/index', + 'providers/post_training/inline_huggingface', + 'providers/post_training/inline_huggingface-cpu', + 'providers/post_training/inline_huggingface-gpu', + 'providers/post_training/inline_torchtune', + 'providers/post_training/inline_torchtune-cpu', + 'providers/post_training/inline_torchtune-gpu', + 'providers/post_training/remote_nvidia' + ], + }, + { + type: 'category', + label: 'DatasetIO', + collapsed: true, + items: [ + 'providers/datasetio/index', + 'providers/datasetio/inline_localfs', + 'providers/datasetio/remote_huggingface', + 'providers/datasetio/remote_nvidia' + ], + }, + { + type: 'category', + label: 'Scoring', + collapsed: true, + items: [ + 'providers/scoring/index', + 'providers/scoring/inline_basic', + 'providers/scoring/inline_braintrust', + 'providers/scoring/inline_llm-as-judge' + ], + }, + { + type: 'category', + label: 'Files', + collapsed: true, + items: [ + 'providers/files/index', + 'providers/files/inline_localfs', + 'providers/files/remote_s3' + ], + }, + { + type: 'category', + label: 'Eval', + collapsed: true, + items: [ + 'providers/eval/index', + 'providers/eval/inline_meta-reference', + 'providers/eval/remote_nvidia' + ], + }, + { + type: 'category', + label: 'Telemetry', + collapsed: true, + items: [ + 'providers/telemetry/index', + 'providers/telemetry/inline_meta-reference' + ], + }, + { + type: 'category', + label: 'Batches', + collapsed: true, + items: [ + 'providers/batches/index', + 'providers/batches/inline_reference' + ], + }, + { + type: 'category', + label: 'External Providers', + collapsed: true, + items: [ + 'providers/external/index', + 'providers/external/external-providers-guide', + 'providers/external/external-providers-list' + ], + }, + 'providers/openai' + ], + }, + { + type: 'category', + label: 'Building Applications', + collapsed: false, + items: [ + 'building_applications/index', + 'building_applications/rag', + 'building_applications/agent', + 'building_applications/agent_execution_loop', + 'building_applications/responses_vs_agents', + 'building_applications/tools', + 'building_applications/evals', + 'building_applications/telemetry', + 'building_applications/safety', + 'building_applications/playground', + ], + }, + { + type: 'category', + label: 'Advanced APIs', + collapsed: false, + items: [ + 'advanced_apis/post_training', + 'advanced_apis/evaluation', + 'advanced_apis/scoring', + ], + }, + { + type: 'category', + label: 'Deploying', + collapsed: false, + items: [ + 'deploying/index', + 'deploying/kubernetes_deployment', + 'deploying/aws_eks_deployment', + ], + }, + { + type: 'category', + label: 'Contributing', + collapsed: false, + items: [ + 'contributing/index', + 'contributing/new_api_provider', + 'contributing/new_vector_database', + 'contributing/testing/record-replay', + ], + }, + { + type: 'category', + label: 'References', + collapsed: false, + items: [ + 'references/index', + 'references/llama_cli_reference/index', + 'references/llama_stack_client_cli_reference', + 'references/python_sdk_reference/index', + 'references/evals_reference/index', + ], + }, + ], + + // API Reference sidebar - use plugin-generated sidebar + apiSidebar: require('./docs/api/sidebar.ts').default, +}; + +export default sidebars; diff --git a/docs/src/components/HomepageFeatures/index.js b/docs/src/components/HomepageFeatures/index.js new file mode 100644 index 000000000..78f410ba6 --- /dev/null +++ b/docs/src/components/HomepageFeatures/index.js @@ -0,0 +1,64 @@ +import React from 'react'; +import clsx from 'clsx'; +import styles from './styles.module.css'; + +const FeatureList = [ + { + title: 'Easy to Use', + Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, + description: ( + <> + Docusaurus was designed from the ground up to be easily installed and + used to get your website up and running quickly. + + ), + }, + { + title: 'Focus on What Matters', + Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default, + description: ( + <> + Docusaurus lets you focus on your docs, and we'll do the chores. Go + ahead and move your docs into the docs directory. + + ), + }, + { + title: 'Powered by React', + Svg: require('@site/static/img/undraw_docusaurus_react.svg').default, + description: ( + <> + Extend or customize your website layout by reusing React. Docusaurus can + be extended while reusing the same header and footer. + + ), + }, +]; + +function Feature({Svg, title, description}) { + return ( +
+
+ +
+
+

{title}

+

{description}

+
+
+ ); +} + +export default function HomepageFeatures() { + return ( +
+
+
+ {FeatureList.map((props, idx) => ( + + ))} +
+
+
+ ); +} diff --git a/docs/src/components/HomepageFeatures/styles.module.css b/docs/src/components/HomepageFeatures/styles.module.css new file mode 100644 index 000000000..b248eb2e5 --- /dev/null +++ b/docs/src/components/HomepageFeatures/styles.module.css @@ -0,0 +1,11 @@ +.features { + display: flex; + align-items: center; + padding: 2rem 0; + width: 100%; +} + +.featureSvg { + height: 200px; + width: 200px; +} diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css new file mode 100644 index 000000000..0e4d95b9b --- /dev/null +++ b/docs/src/css/custom.css @@ -0,0 +1,191 @@ +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +/* You can override the default Infima variables here. */ +:root { + /* Llama Stack Original Theme - Based on llamastack.github.io */ + --ifm-color-primary: #4a4a68; + --ifm-color-primary-dark: #3a3a52; + --ifm-color-primary-darker: #332735; + --ifm-color-primary-darkest: #2b2129; + --ifm-color-primary-light: #5a5a7e; + --ifm-color-primary-lighter: #6a6a94; + --ifm-color-primary-lightest: #8080aa; + + /* Additional theme colors */ + --ifm-color-secondary: #1b263c; + --ifm-color-info: #2980b9; + --ifm-color-success: #16a085; + --ifm-color-warning: #f39c12; + --ifm-color-danger: #e74c3c; + + /* Background colors */ + --ifm-background-color: #ffffff; + --ifm-background-surface-color: #f8f9fa; + + /* Code and syntax highlighting */ + --ifm-code-font-size: 95%; + --ifm-pre-background: #1b263c; + --ifm-pre-color: #e1e5e9; + --docusaurus-highlighted-code-line-bg: rgba(51, 39, 53, 0.1); + + /* Link colors */ + --ifm-link-color: var(--ifm-color-primary); + --ifm-link-hover-color: var(--ifm-color-primary-darker); + + /* Navbar */ + --ifm-navbar-background-color: rgba(255, 255, 255, 0.95); + --ifm-navbar-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + + /* Hero section gradient - matching original theme */ + --hero-gradient: linear-gradient(90deg, #332735 0%, #1b263c 100%); + + /* OpenAPI method colors */ + --openapi-code-blue: #2980b9; + --openapi-code-green: #16a085; + --openapi-code-orange: #f39c12; + --openapi-code-red: #e74c3c; + --openapi-code-purple: #332735; +} + +/* For readability concerns, you should choose a lighter palette in dark mode. */ +[data-theme='dark'] { + /* Dark theme primary colors - lighter versions of original theme */ + --ifm-color-primary: #8080aa; + --ifm-color-primary-dark: #6a6a94; + --ifm-color-primary-darker: #5a5a7e; + --ifm-color-primary-darkest: #4a4a68; + --ifm-color-primary-light: #9090ba; + --ifm-color-primary-lighter: #a0a0ca; + --ifm-color-primary-lightest: #b0b0da; + + /* Dark theme background colors */ + --ifm-background-color: #1a1a1a; + --ifm-background-surface-color: #2a2a2a; + + /* Dark theme navbar */ + --ifm-navbar-background-color: rgba(26, 26, 26, 0.95); + + /* Dark theme code highlighting */ + --docusaurus-highlighted-code-line-bg: rgba(51, 39, 53, 0.3); + + /* Dark theme text colors */ + --ifm-font-color-base: #e1e5e9; + --ifm-font-color-secondary: #a0a6ac; +} + +/* Sidebar Method labels */ +.api-method>.menu__link { + align-items: center; + justify-content: start; +} + +.api-method>.menu__link::before { + width: 50px; + height: 20px; + font-size: 12px; + line-height: 20px; + text-transform: uppercase; + font-weight: 600; + border-radius: 0.25rem; + border: 1px solid; + margin-right: var(--ifm-spacing-horizontal); + text-align: center; + flex-shrink: 0; + border-color: transparent; + color: white; +} + +.get>.menu__link::before { + content: "get"; + background-color: var(--ifm-color-primary); +} + +.put>.menu__link::before { + content: "put"; + background-color: var(--openapi-code-blue); +} + +.post>.menu__link::before { + content: "post"; + background-color: var(--openapi-code-green); +} + +.delete>.menu__link::before { + content: "del"; + background-color: var(--openapi-code-red); +} + +.patch>.menu__link::before { + content: "patch"; + background-color: var(--openapi-code-orange); +} + +.footer--dark { + --ifm-footer-link-color: #ffffff; + --ifm-footer-title-color: #ffffff; +} + +.footer--dark .footer__link-item { + color: #ffffff; +} + +.footer--dark .footer__title { + color: #ffffff; +} + +/* OpenAPI theme fixes for light mode readability */ +/* Version badge fixes */ +.openapi__version-badge, +.theme-doc-version-badge, +[class*="version-badge"], +[class*="versionBadge"] { + background-color: #ffffff !important; + color: #333333 !important; + border: 1px solid #d1d5db !important; +} + +/* OpenAPI method badges in light mode */ +.openapi__method-badge, +[class*="method-badge"] { + color: #ffffff !important; +} + +/* Button fixes for light mode */ +.openapi__button, +.theme-api-docs-demo-panel button, +[class*="api-docs"] button, +button[class*="button"], +.openapi-explorer__response-schema button, +.openapi-tabs__operation button { + color: #ffffff !important; +} + +.openapi__button:hover, +.theme-api-docs-demo-panel button:hover, +[class*="api-docs"] button:hover, +button[class*="button"]:hover, +.openapi-explorer__response-schema button:hover, +.openapi-tabs__operation button:hover { + color: #ffffff !important; +} + +/* Navigation buttons (Next/Previous) */ +.pagination-nav__link, +.pagination-nav__label { + color: #333333 !important; +} + +.pagination-nav__link--next, +.pagination-nav__link--prev { + background-color: #ffffff !important; + border: 1px solid #d1d5db !important; +} + +.pagination-nav__link--next:hover, +.pagination-nav__link--prev:hover { + background-color: #f3f4f6 !important; +} diff --git a/docs/src/pages/index.js b/docs/src/pages/index.js new file mode 100644 index 000000000..c97959d77 --- /dev/null +++ b/docs/src/pages/index.js @@ -0,0 +1,163 @@ +import React from 'react'; +import clsx from 'clsx'; +import Layout from '@theme/Layout'; +import Link from '@docusaurus/Link'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import styles from './index.module.css'; + +function HomepageHeader() { + const {siteConfig} = useDocusaurusContext(); + return ( +
+
+
+

Build AI Applications with Llama Stack

+

+ Unified APIs for Inference, RAG, Agents, Tools, Safety, and Telemetry +

+
+ + 🚀 Get Started + + + 📚 API Reference + +
+
+
+
+ ); +} + +function QuickStart() { + return ( +
+
+
+
+

Quick Start

+

+ Get up and running with Llama Stack in just a few commands. Build your first RAG application locally. +

+
+
{`# Install uv and start Ollama
+ollama run llama3.2:3b --keepalive 60m
+
+# Run Llama Stack server
+OLLAMA_URL=http://localhost:11434 \\
+  uv run --with llama-stack \\
+  llama stack build --distro starter \\
+  --image-type venv --run
+
+# Try the Python SDK
+from llama_stack_client import LlamaStackClient
+
+client = LlamaStackClient(
+  base_url="http://localhost:8321"
+)
+
+response = client.inference.chat_completion(
+  model="Llama3.2-3B-Instruct",
+  messages=[{
+    "role": "user",
+    "content": "What is machine learning?"
+  }]
+)`}
+
+
+
+

Why Llama Stack?

+
+
+
🔗
+
+

Unified APIs

+

One consistent interface for all your AI needs - inference, safety, agents, and more.

+
+
+
+
🔄
+
+

Provider Flexibility

+

Swap between providers without code changes. Start local, deploy anywhere.

+
+
+
+
🛡️
+
+

Production Ready

+

Built-in safety, monitoring, and evaluation tools for enterprise applications.

+
+
+
+
📱
+
+

Multi-Platform

+

SDKs for Python, Node.js, iOS, Android, and REST APIs for any language.

+
+
+
+
+
+
+
+ ); +} + +function CommunityLinks() { + return ( +
+ +
+ ); +} + +export default function Home() { + const {siteConfig} = useDocusaurusContext(); + return ( + + +
+ + +
+
+ ); +} diff --git a/docs/src/pages/index.module.css b/docs/src/pages/index.module.css new file mode 100644 index 000000000..c3681653b --- /dev/null +++ b/docs/src/pages/index.module.css @@ -0,0 +1,283 @@ +/** + * CSS files with the .module.css suffix will be treated as CSS modules + * and scoped locally. + */ + +.heroBanner { + padding: 4rem 0; + text-align: center; + position: relative; + overflow: hidden; + background: var(--hero-gradient); + color: white; + display: flex; + align-items: center; +} + +.heroBanner::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: radial-gradient(circle at 30% 20%, rgba(255, 255, 255, 0.1) 0%, transparent 50%), + radial-gradient(circle at 70% 80%, rgba(255, 255, 255, 0.05) 0%, transparent 50%); + pointer-events: none; +} + +.heroContent { + max-width: 800px; + margin: 0 auto; +} + +.heroLogo { + height: 48px; + width: auto; + margin-bottom: 1.5rem; +} + +.heroTitle { + font-size: 2.8rem; + font-weight: 700; + margin-bottom: 1rem; + line-height: 1.2; +} + +.heroSubtitle { + font-size: 1.1rem; + font-weight: 400; + margin-bottom: 2rem; + opacity: 0.9; + line-height: 1.5; + max-width: 600px; + margin-left: auto; + margin-right: auto; +} + +.buttons { + display: flex; + align-items: center; + justify-content: center; + gap: 1rem; +} + +.heroBanner .getStartedButton { + background: white; + color: #332735; + border: 2px solid white; + font-weight: 600; + transition: all 0.3s ease; +} + +.heroBanner .getStartedButton:hover { + background: rgba(255, 255, 255, 0.9); + color: #2b2129; + border-color: rgba(255, 255, 255, 0.9); + transform: translateY(-2px); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); +} + +.heroBanner .apiButton { + background: transparent; + color: white; + border: 2px solid white; + font-weight: 600; + transition: all 0.3s ease; +} + +.heroBanner .apiButton:hover { + background: white; + border-color: white; + color: #332735; + transform: translateY(-2px); +} + +/* Quick Start Section */ +.quickStart { + padding: 4rem 0; + background: var(--ifm-background-color); +} + +.sectionTitle { + font-size: 2rem; + font-weight: 600; + margin-bottom: 0.75rem; + color: var(--ifm-color-emphasis-800); +} + +.sectionDescription { + font-size: 1rem; + color: var(--ifm-color-emphasis-600); + margin-bottom: 1.5rem; + line-height: 1.5; +} + +.codeBlock { + background: var(--ifm-color-gray-900); + border-radius: 8px; + padding: 1.5rem; + margin-top: 1.5rem; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); +} + +.codeBlock pre { + margin: 0; + padding: 0; + background: none; + border: none; +} + +.codeBlock code { + color: var(--ifm-color-gray-100); + font-family: 'Fira Code', 'Consolas', 'Monaco', monospace; + font-size: 0.9rem; + line-height: 1.6; +} + +/* Features */ +.features { + display: flex; + flex-direction: column; + gap: 1rem; + margin-top: 1.5rem; +} + +.feature { + display: flex; + align-items: flex-start; + gap: 1rem; + padding: 1rem; + border-radius: 8px; + background: var(--ifm-color-gray-50); + border: 1px solid var(--ifm-color-gray-200); + transition: all 0.2s ease; +} + +.feature:hover { + transform: translateY(-2px); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1); + border-color: var(--ifm-color-primary-lighter); +} + +.featureIcon { + font-size: 2rem; + width: 3rem; + height: 3rem; + display: flex; + align-items: center; + justify-content: center; + background: var(--ifm-color-primary-lightest); + border-radius: 50%; + flex-shrink: 0; +} + +.feature h4 { + margin: 0 0 0.5rem 0; + font-size: 1.1rem; + font-weight: 600; + color: var(--ifm-color-emphasis-800); +} + +.feature p { + margin: 0; + color: var(--ifm-color-emphasis-600); + line-height: 1.5; +} + +/* Community Section */ +.community { + padding: 3rem 0; + background: var(--ifm-color-gray-50); + border-top: 1px solid var(--ifm-color-gray-200); +} + +.communityContent { + text-align: center; + max-width: 600px; + margin: 0 auto; +} + +.communityLinks { + display: flex; + justify-content: center; + gap: 1rem; + margin-top: 2rem; +} + +.communityButton { + display: flex; + align-items: center; + gap: 0.5rem; + font-weight: 600; + transition: all 0.3s ease; +} + +.communityButton:hover { + transform: translateY(-2px); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1); +} + +.communityIcon { + font-size: 1.2rem; +} + +/* Responsive Design */ +@media screen and (max-width: 996px) { + .heroBanner { + padding: 3rem 2rem; + } + + .heroTitle { + font-size: 2.2rem; + } + + .heroSubtitle { + font-size: 1rem; + } + + .buttons { + flex-direction: column; + gap: 1rem; + } + + .quickStart { + padding: 3rem 0; + } + + .sectionTitle { + font-size: 1.75rem; + } + + .communityLinks { + flex-direction: column; + align-items: center; + } + + .communityButton { + width: 200px; + justify-content: center; + } +} + +@media screen and (max-width: 768px) { + .heroLogo { + height: 40px; + } + + .heroTitle { + font-size: 1.8rem; + } + + .codeBlock { + padding: 1rem; + } + + .codeBlock code { + font-size: 0.8rem; + } + + .feature { + padding: 0.75rem; + } +} diff --git a/docs/src/pages/markdown-page.md b/docs/src/pages/markdown-page.md new file mode 100644 index 000000000..9756c5b66 --- /dev/null +++ b/docs/src/pages/markdown-page.md @@ -0,0 +1,7 @@ +--- +title: Markdown page example +--- + +# Markdown page example + +You don't need React to write simple standalone pages. diff --git a/docs/tsconfig.json b/docs/tsconfig.json new file mode 100644 index 000000000..6f3b11cdb --- /dev/null +++ b/docs/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "@docusaurus/tsconfig", + "compilerOptions": { + "baseUrl": "." + }, + "exclude": [".docusaurus", "build"] +} From 8537ada11ba223dc7318e59f3b55b358c61d800c Mon Sep 17 00:00:00 2001 From: Alexey Rybak <50731695+reluctantfuturist@users.noreply.github.com> Date: Wed, 24 Sep 2025 14:14:32 -0700 Subject: [PATCH 17/27] docs: MDX leftover fixes (#3536) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # What does this PR do? - Fixes Docusaurus build errors ## Test Plan - `npm run build`​ compiles the build properly - Broken links expected and will be fixed in a follow-on PR --- docs/docs/contributing/index.mdx | 2 +- docs/docs/contributing/new_api_provider.mdx | 14 ++-- .../docs/contributing/new_vector_database.mdx | 8 +- docs/docs/distributions/building_distro.mdx | 40 +++++----- docs/docs/distributions/configuration.mdx | 8 +- .../getting_started/detailed_tutorial.mdx | 78 +++++++------------ .../post_training/inline_huggingface-cpu.mdx | 7 +- .../post_training/inline_huggingface-gpu.mdx | 4 +- .../post_training/inline_huggingface.mdx | 7 +- .../providers/vector_io/remote_milvus.mdx | 2 +- scripts/provider_codegen.py | 36 ++++++--- 11 files changed, 96 insertions(+), 110 deletions(-) diff --git a/docs/docs/contributing/index.mdx b/docs/docs/contributing/index.mdx index 7f50a058e..03aeebc23 100644 --- a/docs/docs/contributing/index.mdx +++ b/docs/docs/contributing/index.mdx @@ -75,7 +75,7 @@ outlined on that page and do not file a public issue. In order to accept your pull request, we need you to submit a CLA. You only need to do this once to work on any of Meta's open source projects. -Complete your CLA here: +Complete your CLA here: [https://code.facebook.com/cla](https://code.facebook.com/cla) **I'd like to contribute!** diff --git a/docs/docs/contributing/new_api_provider.mdx b/docs/docs/contributing/new_api_provider.mdx index 9d9e4653a..95ef0c4f6 100644 --- a/docs/docs/contributing/new_api_provider.mdx +++ b/docs/docs/contributing/new_api_provider.mdx @@ -12,9 +12,9 @@ This guide will walk you through the process of adding a new API provider to Lla - Begin by reviewing the [core concepts](../concepts/index.md) of Llama Stack and choose the API your provider belongs to (Inference, Safety, VectorIO, etc.) -- Determine the provider type ({repopath}`Remote::llama_stack/providers/remote` or {repopath}`Inline::llama_stack/providers/inline`). Remote providers make requests to external services, while inline providers execute implementation locally. -- Add your provider to the appropriate {repopath}`Registry::llama_stack/providers/registry/`. Specify pip dependencies necessary. -- Update any distribution {repopath}`Templates::llama_stack/distributions/` `build.yaml` and `run.yaml` files if they should include your provider by default. Run {repopath}`./scripts/distro_codegen.py` if necessary. Note that `distro_codegen.py` will fail if the new provider causes any distribution template to attempt to import provider-specific dependencies. This usually means the distribution's `get_distribution_template()` code path should only import any necessary Config or model alias definitions from each provider and not the provider's actual implementation. +- Determine the provider type ([Remote](https://github.com/meta-llama/llama-stack/tree/main/llama_stack/providers/remote) or [Inline](https://github.com/meta-llama/llama-stack/tree/main/llama_stack/providers/inline)). Remote providers make requests to external services, while inline providers execute implementation locally. +- Add your provider to the appropriate [Registry](https://github.com/meta-llama/llama-stack/tree/main/llama_stack/providers/registry/). Specify pip dependencies necessary. +- Update any distribution [Templates](https://github.com/meta-llama/llama-stack/tree/main/llama_stack/distributions/) `build.yaml` and `run.yaml` files if they should include your provider by default. Run [./scripts/distro_codegen.py](https://github.com/meta-llama/llama-stack/blob/main/scripts/distro_codegen.py) if necessary. Note that `distro_codegen.py` will fail if the new provider causes any distribution template to attempt to import provider-specific dependencies. This usually means the distribution's `get_distribution_template()` code path should only import any necessary Config or model alias definitions from each provider and not the provider's actual implementation. Here are some example PRs to help you get started: @@ -71,9 +71,9 @@ Before running tests, you must have required dependencies installed. This depend ### 1. Integration Testing -Integration tests are located in {repopath}`tests/integration`. These tests use the python client-SDK APIs (from the `llama_stack_client` package) to test functionality. Since these tests use client APIs, they can be run either by pointing to an instance of the Llama Stack server or "inline" by using `LlamaStackAsLibraryClient`. +Integration tests are located in [tests/integration](https://github.com/meta-llama/llama-stack/tree/main/tests/integration). These tests use the python client-SDK APIs (from the `llama_stack_client` package) to test functionality. Since these tests use client APIs, they can be run either by pointing to an instance of the Llama Stack server or "inline" by using `LlamaStackAsLibraryClient`. -Consult {repopath}`tests/integration/README.md` for more details on how to run the tests. +Consult [tests/integration/README.md](https://github.com/meta-llama/llama-stack/blob/main/tests/integration/README.md) for more details on how to run the tests. Note that each provider's `sample_run_config()` method (in the configuration class for that provider) typically references some environment variables for specifying API keys and the like. You can set these in the environment or pass these via the `--env` flag to the test command. @@ -81,9 +81,9 @@ Note that each provider's `sample_run_config()` method (in the configuration cla ### 2. Unit Testing -Unit tests are located in {repopath}`tests/unit`. Provider-specific unit tests are located in {repopath}`tests/unit/providers`. These tests are all run automatically as part of the CI process. +Unit tests are located in [tests/unit](https://github.com/meta-llama/llama-stack/tree/main/tests/unit). Provider-specific unit tests are located in [tests/unit/providers](https://github.com/meta-llama/llama-stack/tree/main/tests/unit/providers). These tests are all run automatically as part of the CI process. -Consult {repopath}`tests/unit/README.md` for more details on how to run the tests manually. +Consult [tests/unit/README.md](https://github.com/meta-llama/llama-stack/blob/main/tests/unit/README.md) for more details on how to run the tests manually. ### 3. Additional end-to-end testing diff --git a/docs/docs/contributing/new_vector_database.mdx b/docs/docs/contributing/new_vector_database.mdx index 040cee6d3..044e2f672 100644 --- a/docs/docs/contributing/new_vector_database.mdx +++ b/docs/docs/contributing/new_vector_database.mdx @@ -39,7 +39,7 @@ filtering, sorting, and aggregating vectors. - `YourVectorIOAdapter.query_chunks()` - `YourVectorIOAdapter.delete_chunks()` 3. **Add to Registry**: Register your provider in the appropriate registry file. - - Update {repopath}`llama_stack/providers/registry/vector_io.py` to include your new provider. + - Update [llama_stack/providers/registry/vector_io.py](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/providers/registry/vector_io.py) to include your new provider. ```python from llama_stack.providers.registry.specs import InlineProviderSpec from llama_stack.providers.registry.api import Api @@ -65,7 +65,7 @@ InlineProviderSpec( 5. Add your provider to the `vector_io_providers` fixture dictionary. - Please follow the naming convention of `your_vectorprovider_index` and `your_vectorprovider_adapter` as the tests require this to execute properly. - Integration Tests - - Integration tests are located in {repopath}`tests/integration`. These tests use the python client-SDK APIs (from the `llama_stack_client` package) to test functionality. + - Integration tests are located in [tests/integration](https://github.com/meta-llama/llama-stack/tree/main/tests/integration). These tests use the python client-SDK APIs (from the `llama_stack_client` package) to test functionality. - The two set of integration tests are: - `tests/integration/vector_io/test_vector_io.py`: This file tests registration, insertion, and retrieval. - `tests/integration/vector_io/test_openai_vector_stores.py`: These tests are for OpenAI-compatible vector stores and test the OpenAI API compatibility. @@ -79,5 +79,5 @@ InlineProviderSpec( - If you are adding tests for the `remote` provider you will have to update the `test` group, which is used in the GitHub CI for integration tests. - `uv add new_pip_package --group test` 5. **Update Documentation**: Please update the documentation for end users - - Generate the provider documentation by running {repopath}`./scripts/provider_codegen.py`. - - Update the autogenerated content in the registry/vector_io.py file with information about your provider. Please see other providers for examples. + - Generate the provider documentation by running [./scripts/provider_codegen.py](https://github.com/meta-llama/llama-stack/blob/main/scripts/provider_codegen.py). + - Update the autogenerated content in the registry/vector_io.py file with information about your provider. Please see other providers for examples. diff --git a/docs/docs/distributions/building_distro.mdx b/docs/docs/distributions/building_distro.mdx index 90cac7363..d9a8048fc 100644 --- a/docs/docs/distributions/building_distro.mdx +++ b/docs/docs/distributions/building_distro.mdx @@ -86,8 +86,11 @@ options: After this step is complete, a file named `-build.yaml` and template file `-run.yaml` will be generated and saved at the output file path specified at the end of the command. -::::{tab-set} -:::{tab-item} Building from a template +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + + + To build from alternative API providers, we provide distribution templates for users to get started building a distribution backed by different providers. The following command will allow you to see the available templates and their corresponding providers. @@ -160,8 +163,8 @@ You can now edit ~/.llama/distributions/llamastack-starter/starter-run.yaml and ```{tip} The generated `run.yaml` file is a starting point for your configuration. For comprehensive guidance on customizing it for your specific needs, infrastructure, and deployment scenarios, see [Customizing Your run.yaml Configuration](customizing_run_yaml.md). ``` -::: -:::{tab-item} Building from Scratch + + If the provided templates do not fit your use case, you could start off with running `llama stack build` which will allow you to a interactively enter wizard where you will be prompted to enter build configurations. @@ -190,9 +193,8 @@ Tip: use to see options for the providers. You can now edit ~/.llama/distributions/llamastack-my-local-stack/my-local-stack-run.yaml and run `llama stack run ~/.llama/distributions/llamastack-my-local-stack/my-local-stack-run.yaml` ``` -::: - -:::{tab-item} Building from a pre-existing build config file + + - In addition to templates, you may customize the build to your liking through editing config files and build from config files with the following command. - The config file will be of contents like the ones in `llama_stack/distributions/*build.yaml`. @@ -200,9 +202,8 @@ You can now edit ~/.llama/distributions/llamastack-my-local-stack/my-local-stack ``` llama stack build --config llama_stack/distributions/starter/build.yaml ``` -::: - -:::{tab-item} Building with External Providers + + Llama Stack supports external providers that live outside of the main codebase. This allows you to create and maintain your own providers independently or use community-provided providers. @@ -251,15 +252,12 @@ llama stack build --config my-external-stack.yaml ``` For more information on external providers, including directory structure, provider types, and implementation requirements, see the [External Providers documentation](../providers/external.md). -::: - -:::{tab-item} Building Container - -```{admonition} Podman Alternative -:class: tip + + +:::tip Podman Alternative Podman is supported as an alternative to Docker. Set `CONTAINER_BINARY` to `podman` in your environment to use Podman. -``` +::: To build a container image, you may start off from a template and use the `--image-type container` flag to specify `container` as the build image type. @@ -278,7 +276,8 @@ You can now edit ~/meta-llama/llama-stack/tmp/configs/ollama-run.yaml and run `l ``` Now set some environment variables for the inference model ID and Llama Stack Port and create a local directory to mount into the container's file system. -``` + +```bash export INFERENCE_MODEL="llama3.2:3b" export LLAMA_STACK_PORT=8321 mkdir -p ~/.llama @@ -312,9 +311,8 @@ Here are the docker flags and their uses: * `--env OLLAMA_URL=http://host.docker.internal:11434`: Configures the URL for the Ollama service -::: - -:::: + + ### Running your Stack server diff --git a/docs/docs/distributions/configuration.mdx b/docs/docs/distributions/configuration.mdx index 73a4837a1..4cd093ef0 100644 --- a/docs/docs/distributions/configuration.mdx +++ b/docs/docs/distributions/configuration.mdx @@ -478,12 +478,12 @@ A rule may also specify a condition, either a 'when' or an 'unless', with additional constraints as to where the rule applies. The constraints supported at present are: - - 'user with in ' - - 'user with not in ' + - 'user with `` in ``' + - 'user with `` not in ``' - 'user is owner' - 'user is not owner' - - 'user in owners ' - - 'user not in owners ' + - 'user in owners ``' + - 'user not in owners ``' The attributes defined for a user will depend on how the auth configuration is defined. diff --git a/docs/docs/getting_started/detailed_tutorial.mdx b/docs/docs/getting_started/detailed_tutorial.mdx index 5bf009efe..3db63176c 100644 --- a/docs/docs/getting_started/detailed_tutorial.mdx +++ b/docs/docs/getting_started/detailed_tutorial.mdx @@ -31,23 +31,21 @@ ollama run llama3.2:3b --keepalive 60m Install [uv](https://docs.astral.sh/uv/) to setup your virtual environment -::::{tab-set} - -:::{tab-item} macOS and Linux + + Use `curl` to download the script and execute it with `sh`: ```console curl -LsSf https://astral.sh/uv/install.sh | sh ``` -::: - -:::{tab-item} Windows + + Use `irm` to download the script and execute it with `iex`: ```console powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" ``` -::: -:::: + + Setup your virtual environment. @@ -58,9 +56,8 @@ source .venv/bin/activate ### Step 2: Run Llama Stack Llama Stack is a server that exposes multiple APIs, you connect with it using the Llama Stack client SDK. -::::{tab-set} - -:::{tab-item} Using `venv` + + You can use Python to build and run the Llama Stack server, which is useful for testing and development. Llama Stack uses a [YAML configuration file](../distributions/configuration.md) to specify the stack setup, @@ -71,19 +68,8 @@ We use `starter` as template. By default all providers are disabled, this requir ```bash llama stack build --distro starter --image-type venv --run ``` -::: -:::{tab-item} Using `venv` -You can use Python to build and run the Llama Stack server, which is useful for testing and development. - -Llama Stack uses a [YAML configuration file](../distributions/configuration.md) to specify the stack setup, -which defines the providers and their settings. -Now let's build and run the Llama Stack config for Ollama. - -```bash -llama stack build --distro starter --image-type venv --run -``` -::: -:::{tab-item} Using a Container + + You can use a container image to run the Llama Stack server. We provide several container images for the server component that works with different inference providers out of the box. For this guide, we will use `llamastack/distribution-starter` as the container image. If you'd like to build your own image or customize the @@ -110,9 +96,8 @@ with `host.containers.internal`. The configuration YAML for the Ollama distribution is available at `distributions/ollama/run.yaml`. -```{tip} - -Docker containers run in their own isolated network namespaces on Linux. To allow the container to communicate with services running on the host via `localhost`, you need `--network=host`. This makes the container use the host’s network directly so it can connect to Ollama running on `localhost:11434`. +:::tip +Docker containers run in their own isolated network namespaces on Linux. To allow the container to communicate with services running on the host via `localhost`, you need `--network=host`. This makes the container use the host's network directly so it can connect to Ollama running on `localhost:11434`. Linux users having issues running the above command should instead try the following: ```bash @@ -126,7 +111,6 @@ docker run -it \ --env OLLAMA_URL=http://localhost:11434 ``` ::: -:::: You will see output like below: ``` INFO: Application startup complete. @@ -137,31 +121,29 @@ Now you can use the Llama Stack client to run inference and build agents! You can reuse the server setup or use the [Llama Stack Client](https://github.com/meta-llama/llama-stack-client-python/). Note that the client package is already included in the `llama-stack` package. + + ### Step 3: Run Client CLI Open a new terminal and navigate to the same directory you started the server from. Then set up a new or activate your existing server virtual environment. -::::{tab-set} - -:::{tab-item} Reuse Server `venv` + + ```bash # The client is included in the llama-stack package so we just activate the server venv source .venv/bin/activate ``` -::: - -:::{tab-item} Install with `venv` + + ```bash uv venv client --python 3.12 source client/bin/activate pip install llama-stack-client ``` -::: - - -:::: + + Now let's use the `llama-stack-client` [CLI](../references/llama_stack_client_cli_reference.md) to check the connectivity to the server. @@ -237,9 +219,8 @@ OpenAIChatCompletion( Note that these demos show the [Python Client SDK](../references/python_sdk_reference/index.md). Other SDKs are also available, please refer to the [Client SDK](../index.md#client-sdks) list for the complete options. -::::{tab-set} - -:::{tab-item} Basic Inference + + Now you can run inference using the Llama Stack client SDK. #### i. Create the Script @@ -279,9 +260,8 @@ Which will output: Model: ollama/llama3.2:3b OpenAIChatCompletion(id='chatcmpl-30cd0f28-a2ad-4b6d-934b-13707fc60ebf', choices=[OpenAIChatCompletionChoice(finish_reason='stop', index=0, message=OpenAIChatCompletionChoiceMessageOpenAIAssistantMessageParam(role='assistant', content="Lines of code unfold\nAlgorithms dance with ease\nLogic's gentle kiss", name=None, tool_calls=None, refusal=None, annotations=None, audio=None, function_call=None), logprobs=None)], created=1751732480, model='llama3.2:3b', object='chat.completion', service_tier=None, system_fingerprint='fp_ollama', usage={'completion_tokens': 16, 'prompt_tokens': 37, 'total_tokens': 53, 'completion_tokens_details': None, 'prompt_tokens_details': None}) ``` -::: - -:::{tab-item} Build a Simple Agent + + Next we can move beyond simple inference and build an agent that can perform tasks using the Llama Stack server. #### i. Create the Script Create a file `agent.py` and add the following code: @@ -449,9 +429,8 @@ uv run python agent.py So, that's me in a nutshell! ``` -::: - -:::{tab-item} Build a RAG Agent + + For our last demo, we can build a RAG agent that can answer questions about the Torchtune project using the documents in a vector database. @@ -554,9 +533,8 @@ uv run python rag_agent.py ... Overall, DORA is a powerful reinforcement learning algorithm that can learn complex tasks from human demonstrations. However, it requires careful consideration of the challenges and limitations to achieve optimal results. ``` -::: - -:::: + + **You're Ready to Build Your Own Apps!** diff --git a/docs/docs/providers/post_training/inline_huggingface-cpu.mdx b/docs/docs/providers/post_training/inline_huggingface-cpu.mdx index 9b5f2a091..4e64d571a 100644 --- a/docs/docs/providers/post_training/inline_huggingface-cpu.mdx +++ b/docs/docs/providers/post_training/inline_huggingface-cpu.mdx @@ -11,11 +11,8 @@ HuggingFace-based post-training provider for fine-tuning models using the Huggin | `device` | `` | No | cuda | | | `distributed_backend` | `Literal['fsdp', 'deepspeed'` | No | | | | `checkpoint_format` | `Literal['full_state', 'huggingface'` | No | huggingface | | -| `chat_template` | `` | No | <|user|> -{input} -<|assistant|> -{output} | | -| `model_specific_config` | `` | No | {'trust_remote_code': True, 'attn_implementation': 'sdpa'} | | +| `chat_template` | `` | No | `<|user|>`
`{input}`
`<|assistant|>`
`{output}` | | +| `model_specific_config` | `` | No | `{'trust_remote_code': True, 'attn_implementation': 'sdpa'}` | | | `max_seq_length` | `` | No | 2048 | | | `gradient_checkpointing` | `` | No | False | | | `save_total_limit` | `` | No | 3 | | diff --git a/docs/docs/providers/post_training/inline_huggingface-gpu.mdx b/docs/docs/providers/post_training/inline_huggingface-gpu.mdx index 530ac5c4d..ac7644de7 100644 --- a/docs/docs/providers/post_training/inline_huggingface-gpu.mdx +++ b/docs/docs/providers/post_training/inline_huggingface-gpu.mdx @@ -17,8 +17,8 @@ HuggingFace-based post-training provider for fine-tuning models using the Huggin | `device` | `` | No | cuda | | | `distributed_backend` | `Literal['fsdp', 'deepspeed'` | No | | | | `checkpoint_format` | `Literal['full_state', 'huggingface'` | No | huggingface | | -| `chat_template` | `` | No | <|user|><br/>{input}<br/><|assistant|><br/>{output} | | -| `model_specific_config` | `` | No | {'trust_remote_code': True, 'attn_implementation': 'sdpa'} | | +| `chat_template` | `` | No | `<|user|>`
`{input}`
`<|assistant|>`
`{output}` | | +| `model_specific_config` | `` | No | `{'trust_remote_code': True, 'attn_implementation': 'sdpa'}` | | | `max_seq_length` | `` | No | 2048 | | | `gradient_checkpointing` | `` | No | False | | | `save_total_limit` | `` | No | 3 | | diff --git a/docs/docs/providers/post_training/inline_huggingface.mdx b/docs/docs/providers/post_training/inline_huggingface.mdx index 37c113c6f..870ff6ec5 100644 --- a/docs/docs/providers/post_training/inline_huggingface.mdx +++ b/docs/docs/providers/post_training/inline_huggingface.mdx @@ -11,11 +11,8 @@ HuggingFace-based post-training provider for fine-tuning models using the Huggin | `device` | `` | No | cuda | | | `distributed_backend` | `Literal['fsdp', 'deepspeed'` | No | | | | `checkpoint_format` | `Literal['full_state', 'huggingface'` | No | huggingface | | -| `chat_template` | `` | No | <|user|> -{input} -<|assistant|> -{output} | | -| `model_specific_config` | `` | No | {'trust_remote_code': True, 'attn_implementation': 'sdpa'} | | +| `chat_template` | `` | No | `<|user|>`
`{input}`
`<|assistant|>`
`{output}` | | +| `model_specific_config` | `` | No | `{'trust_remote_code': True, 'attn_implementation': 'sdpa'}` | | | `max_seq_length` | `` | No | 2048 | | | `gradient_checkpointing` | `` | No | False | | | `save_total_limit` | `` | No | 3 | | diff --git a/docs/docs/providers/vector_io/remote_milvus.mdx b/docs/docs/providers/vector_io/remote_milvus.mdx index ae796837d..7f7c08122 100644 --- a/docs/docs/providers/vector_io/remote_milvus.mdx +++ b/docs/docs/providers/vector_io/remote_milvus.mdx @@ -409,7 +409,7 @@ For more details on TLS configuration, refer to the [TLS setup guide](https://mi | `token` | `str \| None` | No | | The token of the Milvus server | | `consistency_level` | `` | No | Strong | The consistency level of the Milvus server | | `kvstore` | `utils.kvstore.config.RedisKVStoreConfig \| utils.kvstore.config.SqliteKVStoreConfig \| utils.kvstore.config.PostgresKVStoreConfig \| utils.kvstore.config.MongoDBKVStoreConfig` | No | sqlite | Config for KV store backend | -| `config` | `dict` | No | {} | This configuration allows additional fields to be passed through to the underlying Milvus client. See the [Milvus](https://milvus.io/docs/install-overview.md) documentation for more details about Milvus in general. | +| `config` | `dict` | No | `{}` | This configuration allows additional fields to be passed through to the underlying Milvus client. See the [Milvus](https://milvus.io/docs/install-overview.md) documentation for more details about Milvus in general. | :::note This configuration class accepts additional fields beyond those listed above. You can pass any additional configuration options that will be forwarded to the underlying provider. diff --git a/scripts/provider_codegen.py b/scripts/provider_codegen.py index 207840d49..531d53eb3 100755 --- a/scripts/provider_codegen.py +++ b/scripts/provider_codegen.py @@ -229,17 +229,33 @@ def generate_provider_docs(progress, provider_spec: Any, api_name: str) -> str: # Handle multiline default values and escape problematic characters for MDX if "\n" in default: - default = ( - default.replace("\n", "
") - .replace("<", "<") - .replace(">", ">") - .replace("{", "{") - .replace("}", "}") - ) + # For multiline defaults, escape angle brackets and use
for line breaks + lines = default.split("\n") + escaped_lines = [] + for line in lines: + if line.strip(): + # Escape angle brackets and wrap template tokens in backticks + escaped_line = line.strip().replace("<", "<").replace(">", ">") + if ("{" in escaped_line and "}" in escaped_line) or ( + "<|" in escaped_line and "|>" in escaped_line + ): + escaped_lines.append(f"`{escaped_line}`") + else: + escaped_lines.append(escaped_line) + else: + escaped_lines.append("") + default = "
".join(escaped_lines) else: - default = ( - default.replace("<", "<").replace(">", ">").replace("{", "{").replace("}", "}") - ) + # For single line defaults, escape angle brackets first + escaped_default = default.replace("<", "<").replace(">", ">") + # Then wrap template tokens in backticks + if ("{" in escaped_default and "}" in escaped_default) or ( + "<|" in escaped_default and "|>" in escaped_default + ): + default = f"`{escaped_default}`" + else: + # Apply additional escaping for curly braces + default = escaped_default.replace("{", "{").replace("}", "}") description_text = field_info["description"] or "" # Escape curly braces in description text for MDX compatibility From 6101c8e01585b4cda7ab648d163b711a27865bc3 Mon Sep 17 00:00:00 2001 From: Alexey Rybak <50731695+reluctantfuturist@users.noreply.github.com> Date: Wed, 24 Sep 2025 14:16:31 -0700 Subject: [PATCH 18/27] docs: fix broken links (#3540) # What does this PR do? - Fixes broken links and Docusaurus search Closes #3518 ## Test Plan The following should produce a clean build with no warnings and search enabled: ``` npm install npm run gen-api-docs all npm run build npm run serve ``` --- docs/docs/advanced_apis/post_training.mdx | 2 +- docs/docs/advanced_apis/scoring.mdx | 4 +- docs/docs/building_applications/evals.mdx | 4 +- docs/docs/building_applications/index.mdx | 22 +- .../docs/building_applications/playground.mdx | 4 +- .../responses_vs_agents.mdx | 4 +- docs/docs/concepts/apis/external.mdx | 2 +- docs/docs/concepts/distributions.mdx | 2 +- docs/docs/concepts/evaluation_concepts.mdx | 78 +++++ docs/docs/concepts/index.mdx | 48 ++- docs/docs/concepts/resources.mdx | 2 +- docs/docs/contributing/index.mdx | 27 +- docs/docs/contributing/new_api_provider.mdx | 2 +- docs/docs/deploying/kubernetes_deployment.mdx | 2 +- docs/docs/distributions/building_distro.mdx | 2 +- docs/docs/distributions/configuration.mdx | 2 +- .../distributions/importing_as_library.mdx | 2 +- docs/docs/distributions/index.mdx | 12 +- .../distributions/list_of_distributions.mdx | 6 +- .../ondevice_distro/android_sdk.md | 2 +- .../self_hosted_distro/starter.md | 30 +- .../starting_llama_stack_server.mdx | 4 +- .../getting_started/detailed_tutorial.mdx | 16 +- docs/docs/getting_started/quickstart.mdx | 2 +- docs/docs/providers/agents/index.mdx | 4 - docs/docs/providers/batches/index.mdx | 4 - docs/docs/providers/datasetio/index.md | 16 - docs/docs/providers/datasetio/index.mdx | 6 - docs/docs/providers/eval/index.mdx | 5 - docs/docs/providers/external/index.mdx | 4 +- docs/docs/providers/files/index.mdx | 5 - docs/docs/providers/index.mdx | 20 +- docs/docs/providers/inference/index.mdx | 27 -- docs/docs/providers/openai.mdx | 5 + docs/docs/providers/post_training/index.mdx | 7 - docs/docs/providers/safety/index.mdx | 9 - docs/docs/providers/scoring/index.mdx | 6 - docs/docs/providers/telemetry/index.mdx | 4 - docs/docs/providers/tool_runtime/index.mdx | 9 - docs/docs/providers/vector_io/index.mdx | 15 - docs/docs/references/index.mdx | 6 +- .../references/llama_cli_reference/index.md | 2 +- docs/docusaurus.config.ts | 5 - docs/static/img/llama-stack-logo.png | Bin 0 -> 18601 bytes docs/static/llama-stack-logo.png | Bin 71620 -> 0 bytes .../src/components/HomepageFeatures/index.js | 64 ---- .../HomepageFeatures/styles.module.css | 11 - docs/static/src/css/custom.css | 191 ------------ docs/static/src/pages/index.js | 163 ---------- docs/static/src/pages/index.module.css | 283 ------------------ docs/static/src/pages/markdown-page.md | 7 - scripts/provider_codegen.py | 10 - 52 files changed, 188 insertions(+), 981 deletions(-) create mode 100644 docs/docs/concepts/evaluation_concepts.mdx delete mode 100644 docs/docs/providers/datasetio/index.md create mode 100644 docs/static/img/llama-stack-logo.png delete mode 100644 docs/static/llama-stack-logo.png delete mode 100644 docs/static/src/components/HomepageFeatures/index.js delete mode 100644 docs/static/src/components/HomepageFeatures/styles.module.css delete mode 100644 docs/static/src/css/custom.css delete mode 100644 docs/static/src/pages/index.js delete mode 100644 docs/static/src/pages/index.module.css delete mode 100644 docs/static/src/pages/markdown-page.md diff --git a/docs/docs/advanced_apis/post_training.mdx b/docs/docs/advanced_apis/post_training.mdx index 43359d741..516ac07e1 100644 --- a/docs/docs/advanced_apis/post_training.mdx +++ b/docs/docs/advanced_apis/post_training.mdx @@ -302,4 +302,4 @@ customizer_url: ${env.NVIDIA_CUSTOMIZER_URL:=http://nemo.test} - Check out the [Building Applications - Fine-tuning](../building_applications/index.mdx) guide for application-level examples - See the [Providers](../providers/post_training/index.mdx) section for detailed provider documentation -- Review the [API Reference](../api_reference/post_training.mdx) for complete API documentation +- Review the [API Reference](../advanced_apis/post_training.mdx) for complete API documentation diff --git a/docs/docs/advanced_apis/scoring.mdx b/docs/docs/advanced_apis/scoring.mdx index 15c09fa8a..0ce787e80 100644 --- a/docs/docs/advanced_apis/scoring.mdx +++ b/docs/docs/advanced_apis/scoring.mdx @@ -189,5 +189,5 @@ The Scoring API works closely with the [Evaluation](./evaluation.mdx) API to pro - Check out the [Evaluation](./evaluation.mdx) guide for running complete evaluations - See the [Building Applications - Evaluation](../building_applications/evals.mdx) guide for application examples -- Review the [Evaluation Reference](../references/evals_reference.mdx) for comprehensive scoring function usage -- Explore the [Evaluation Concepts](../concepts/evaluation_concepts.mdx) for detailed conceptual information +- Review the [Evaluation Reference](../references/evals_reference/) for comprehensive scoring function usage +- Explore the [Evaluation Concepts](../concepts/evaluation_concepts) for detailed conceptual information diff --git a/docs/docs/building_applications/evals.mdx b/docs/docs/building_applications/evals.mdx index 899c75dd4..d2eb0bd31 100644 --- a/docs/docs/building_applications/evals.mdx +++ b/docs/docs/building_applications/evals.mdx @@ -8,7 +8,7 @@ sidebar_position: 7 import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -This guide walks you through the process of evaluating an LLM application built using Llama Stack. For detailed API reference, check out the [Evaluation Reference](/docs/references/evals-reference) guide that covers the complete set of APIs and developer experience flow. +This guide walks you through the process of evaluating an LLM application built using Llama Stack. For detailed API reference, check out the [Evaluation Reference](../references/evals_reference/) guide that covers the complete set of APIs and developer experience flow. :::tip[Interactive Examples] Check out our [Colab notebook](https://colab.research.google.com/drive/10CHyykee9j2OigaIcRv47BKG9mrNm0tJ?usp=sharing) for working examples with evaluations, or try the [Getting Started notebook](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb). @@ -251,6 +251,6 @@ results = client.scoring.score( - **[Agents](./agent)** - Building agents for evaluation - **[Tools Integration](./tools)** - Using tools in evaluated agents -- **[Evaluation Reference](/docs/references/evals-reference)** - Complete API reference for evaluations +- **[Evaluation Reference](../references/evals_reference/)** - Complete API reference for evaluations - **[Getting Started Notebook](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb)** - Interactive examples - **[Evaluation Examples](https://colab.research.google.com/drive/10CHyykee9j2OigaIcRv47BKG9mrNm0tJ?usp=sharing)** - Additional evaluation scenarios diff --git a/docs/docs/building_applications/index.mdx b/docs/docs/building_applications/index.mdx index 0b9cb20fb..a4b71efd7 100644 --- a/docs/docs/building_applications/index.mdx +++ b/docs/docs/building_applications/index.mdx @@ -20,23 +20,23 @@ The best way to get started is to look at this comprehensive notebook which walk Here are the key topics that will help you build effective AI applications: ### 🤖 **Agent Development** -- **[Agent Framework](./agent)** - Understand the components and design patterns of the Llama Stack agent framework -- **[Agent Execution Loop](./agent_execution_loop)** - How agents process information, make decisions, and execute actions -- **[Agents vs Responses API](./responses_vs_agents)** - Learn when to use each API for different use cases +- **[Agent Framework](./agent.mdx)** - Understand the components and design patterns of the Llama Stack agent framework +- **[Agent Execution Loop](./agent_execution_loop.mdx)** - How agents process information, make decisions, and execute actions +- **[Agents vs Responses API](./responses_vs_agents.mdx)** - Learn when to use each API for different use cases ### 📚 **Knowledge Integration** -- **[RAG (Retrieval-Augmented Generation)](./rag)** - Enhance your agents with external knowledge through retrieval mechanisms +- **[RAG (Retrieval-Augmented Generation)](./rag.mdx)** - Enhance your agents with external knowledge through retrieval mechanisms ### 🛠️ **Capabilities & Extensions** -- **[Tools](./tools)** - Extend your agents' capabilities by integrating with external tools and APIs +- **[Tools](./tools.mdx)** - Extend your agents' capabilities by integrating with external tools and APIs ### 📊 **Quality & Monitoring** -- **[Evaluations](./evals)** - Evaluate your agents' effectiveness and identify areas for improvement -- **[Telemetry](./telemetry)** - Monitor and analyze your agents' performance and behavior -- **[Safety](./safety)** - Implement guardrails and safety measures to ensure responsible AI behavior +- **[Evaluations](./evals.mdx)** - Evaluate your agents' effectiveness and identify areas for improvement +- **[Telemetry](./telemetry.mdx)** - Monitor and analyze your agents' performance and behavior +- **[Safety](./safety.mdx)** - Implement guardrails and safety measures to ensure responsible AI behavior ### 🎮 **Interactive Development** -- **[Playground](./playground)** - Interactive environment for testing and developing applications +- **[Playground](./playground.mdx)** - Interactive environment for testing and developing applications ## Application Patterns @@ -77,7 +77,7 @@ Build production-ready systems with: ## Related Resources -- **[Getting Started](/docs/getting-started/)** - Basic setup and concepts +- **[Getting Started](/docs/getting_started/quickstart)** - Basic setup and concepts - **[Providers](/docs/providers/)** - Available AI service providers - **[Distributions](/docs/distributions/)** - Pre-configured deployment packages -- **[API Reference](/docs/api/)** - Complete API documentation +- **[API Reference](/docs/api/llama-stack-specification)** - Complete API documentation diff --git a/docs/docs/building_applications/playground.mdx b/docs/docs/building_applications/playground.mdx index d9d3ba275..b2aa1b4a5 100644 --- a/docs/docs/building_applications/playground.mdx +++ b/docs/docs/building_applications/playground.mdx @@ -291,9 +291,9 @@ llama stack run meta-reference ## Related Resources -- **[Getting Started Guide](/docs/getting-started)** - Complete setup and introduction +- **[Getting Started Guide](../getting_started/quickstart)** - Complete setup and introduction - **[Core Concepts](/docs/concepts)** - Understanding Llama Stack fundamentals - **[Agents](./agent)** - Building intelligent agents - **[RAG (Retrieval Augmented Generation)](./rag)** - Knowledge-enhanced applications - **[Evaluations](./evals)** - Comprehensive evaluation framework -- **[API Reference](/docs/api-reference)** - Complete API documentation +- **[API Reference](/docs/api/llama-stack-specification)** - Complete API documentation diff --git a/docs/docs/building_applications/responses_vs_agents.mdx b/docs/docs/building_applications/responses_vs_agents.mdx index c04cd2ce8..4cf7620e7 100644 --- a/docs/docs/building_applications/responses_vs_agents.mdx +++ b/docs/docs/building_applications/responses_vs_agents.mdx @@ -13,7 +13,7 @@ import TabItem from '@theme/TabItem'; Llama Stack (LLS) provides two different APIs for building AI applications with tool calling capabilities: the **Agents API** and the **OpenAI Responses API**. While both enable AI systems to use tools, and maintain full conversation history, they serve different use cases and have distinct characteristics. :::note -**Note:** For simple and basic inferencing, you may want to use the [Chat Completions API](/docs/providers/openai-compatibility#chat-completions) directly, before progressing to Agents or Responses API. +**Note:** For simple and basic inferencing, you may want to use the [Chat Completions API](../providers/openai#chat-completions) directly, before progressing to Agents or Responses API. ::: ## Overview @@ -217,5 +217,5 @@ Use this framework to choose the right API for your use case: - **[Agents](./agent)** - Understanding the Agents API fundamentals - **[Agent Execution Loop](./agent_execution_loop)** - How agents process turns and steps - **[Tools Integration](./tools)** - Adding capabilities to both APIs -- **[OpenAI Compatibility](/docs/providers/openai-compatibility)** - Using OpenAI-compatible endpoints +- **[OpenAI Compatibility](../providers/openai)** - Using OpenAI-compatible endpoints - **[Safety Guardrails](./safety)** - Implementing safety measures in agents diff --git a/docs/docs/concepts/apis/external.mdx b/docs/docs/concepts/apis/external.mdx index 722e8226c..7b4a3e8d5 100644 --- a/docs/docs/concepts/apis/external.mdx +++ b/docs/docs/concepts/apis/external.mdx @@ -2,7 +2,7 @@ title: External APIs description: Understanding external APIs in Llama Stack sidebar_label: External APIs -sidebar_position: 4 +sidebar_position: 3 --- # External APIs diff --git a/docs/docs/concepts/distributions.mdx b/docs/docs/concepts/distributions.mdx index 3b911ed7c..568099664 100644 --- a/docs/docs/concepts/distributions.mdx +++ b/docs/docs/concepts/distributions.mdx @@ -2,7 +2,7 @@ title: Distributions description: Pre-packaged provider configurations for different deployment scenarios sidebar_label: Distributions -sidebar_position: 5 +sidebar_position: 3 --- # Distributions diff --git a/docs/docs/concepts/evaluation_concepts.mdx b/docs/docs/concepts/evaluation_concepts.mdx new file mode 100644 index 000000000..c7a13fd70 --- /dev/null +++ b/docs/docs/concepts/evaluation_concepts.mdx @@ -0,0 +1,78 @@ +--- +title: Evaluation Concepts +description: Running evaluations on Llama Stack +sidebar_label: Evaluation Concepts +sidebar_position: 5 +--- + +# Evaluation Concepts + +The Llama Stack Evaluation flow allows you to run evaluations on your GenAI application datasets or pre-registered benchmarks. + +We introduce a set of APIs in Llama Stack for supporting running evaluations of LLM applications: +- `/datasetio` + `/datasets` API +- `/scoring` + `/scoring_functions` API +- `/eval` + `/benchmarks` API + +This guide goes over the sets of APIs and developer experience flow of using Llama Stack to run evaluations for different use cases. Checkout our Colab notebook on working examples with evaluations [here](https://colab.research.google.com/drive/10CHyykee9j2OigaIcRv47BKG9mrNm0tJ?usp=sharing). + +The Evaluation APIs are associated with a set of Resources. Please visit the Resources section in our [Core Concepts](./index.mdx) guide for better high-level understanding. + +- **DatasetIO**: defines interface with datasets and data loaders. + - Associated with `Dataset` resource. +- **Scoring**: evaluate outputs of the system. + - Associated with `ScoringFunction` resource. We provide a suite of out-of-the box scoring functions and also the ability for you to add custom evaluators. These scoring functions are the core part of defining an evaluation task to output evaluation metrics. +- **Eval**: generate outputs (via Inference or Agents) and perform scoring. + - Associated with `Benchmark` resource. + +## Open-benchmark Eval + +### List of open-benchmarks Llama Stack support + +Llama stack pre-registers several popular open-benchmarks to easily evaluate model perfomance via CLI. + +The list of open-benchmarks we currently support: +- [MMLU-COT](https://arxiv.org/abs/2009.03300) (Measuring Massive Multitask Language Understanding): Benchmark designed to comprehensively evaluate the breadth and depth of a model's academic and professional understanding +- [GPQA-COT](https://arxiv.org/abs/2311.12022) (A Graduate-Level Google-Proof Q&A Benchmark): A challenging benchmark of 448 multiple-choice questions written by domain experts in biology, physics, and chemistry. +- [SimpleQA](https://openai.com/index/introducing-simpleqa/): Benchmark designed to access models to answer short, fact-seeking questions. +- [MMMU](https://arxiv.org/abs/2311.16502) (A Massive Multi-discipline Multimodal Understanding and Reasoning Benchmark for Expert AGI)]: Benchmark designed to evaluate multimodal models. + +You can follow this [contributing guide](../references/evals_reference/#open-benchmark-contributing-guide) to add more open-benchmarks to Llama Stack + +### Run evaluation on open-benchmarks via CLI + +We have built-in functionality to run the supported open-benckmarks using llama-stack-client CLI + +#### Spin up Llama Stack server + +Spin up llama stack server with 'open-benchmark' template +```bash +llama stack run llama_stack/distributions/open-benchmark/run.yaml +``` + +#### Run eval CLI +There are 3 necessary inputs to run a benchmark eval +- `list of benchmark_ids`: The list of benchmark ids to run evaluation on +- `model-id`: The model id to evaluate on +- `output_dir`: Path to store the evaluate results + +```bash +llama-stack-client eval run-benchmark ... \ +--model_id \ +--output_dir +``` + +You can run +```bash +llama-stack-client eval run-benchmark help +``` +to see the description of all the flags that eval run-benchmark has + +In the output log, you can find the file path that has your evaluation results. Open that file and you can see you aggregate +evaluation results over there. + +## What's Next? + +- Check out our Colab notebook on working examples with running benchmark evaluations [here](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/notebooks/Llama_Stack_Benchmark_Evals.ipynb#scrollTo=mxLCsP4MvFqP). +- Check out our [Building Applications - Evaluation](../building_applications/evals.mdx) guide for more details on how to use the Evaluation APIs to evaluate your applications. +- Check out our [Evaluation Reference](../references/evals_reference/) for more details on the APIs. diff --git a/docs/docs/concepts/index.mdx b/docs/docs/concepts/index.mdx index d76a0c039..1278ef98e 100644 --- a/docs/docs/concepts/index.mdx +++ b/docs/docs/concepts/index.mdx @@ -1,4 +1,9 @@ -# Core Concepts +--- +title: Core Concepts +description: Understanding Llama Stack's service-oriented philosophy and key concepts +sidebar_label: Overview +sidebar_position: 1 +--- Given Llama Stack's service-oriented philosophy, a few concepts and workflows arise which may not feel completely natural in the LLM landscape, especially if you are coming with a background in other frameworks. @@ -6,38 +11,21 @@ Given Llama Stack's service-oriented philosophy, a few concepts and workflows ar This section covers the fundamental concepts of Llama Stack: -- **[Architecture](./architecture.md)** - Learn about Llama Stack's architectural design and principles -- **[APIs](./apis/index.mdx)** - Understanding the core APIs and their stability levels - - [API Overview](./apis/index.mdx) - Core APIs available in Llama Stack - - [API Providers](./apis/api_providers.mdx) - How providers implement APIs - - [API Stability Leveling](./apis/api_leveling.mdx) - API stability and versioning -- **[Distributions](./distributions.md)** - Pre-configured deployment packages -- **[Resources](./resources.md)** - Understanding Llama Stack resources and their lifecycle -- **[External Integration](./external.md)** - Integrating with external services and providers +- **[Architecture](architecture.mdx)** - Learn about Llama Stack's architectural design and principles +- **[APIs](/docs/concepts/apis/)** - Understanding the core APIs and their stability levels + - [API Overview](apis/index.mdx) - Core APIs available in Llama Stack + - [API Providers](apis/api_providers.mdx) - How providers implement APIs + - [External APIs](apis/external.mdx) - External APIs available in Llama Stack + - [API Stability Leveling](apis/api_leveling.mdx) - API stability and versioning +- **[Distributions](distributions.mdx)** - Pre-configured deployment packages +- **[Resources](resources.mdx)** - Understanding Llama Stack resources and their lifecycle ## Getting Started If you're new to Llama Stack, we recommend starting with: -1. **[Architecture](./architecture.md)** - Understand the overall system design -2. **[APIs](./apis/index.mdx)** - Learn about the available APIs and their purpose -3. **[Distributions](./distributions.md)** - Choose a pre-configured setup for your use case +1. **[Architecture](architecture.mdx)** - Understand the overall system design +2. **[APIs](apis/index.mdx)** - Learn about the available APIs and their purpose +3. **[Distributions](distributions.mdx)** - Choose a pre-configured setup for your use case -Each concept builds upon the previous ones to give you a comprehensive understanding of how Llama Stack works and how to use it effectively.--- -title: Core Concepts -description: Understanding Llama Stack's service-oriented philosophy and key concepts -sidebar_label: Overview -sidebar_position: 1 ---- - -# Core Concepts - -Given Llama Stack's service-oriented philosophy, a few concepts and workflows arise which may not feel completely natural in the LLM landscape, especially if you are coming with a background in other frameworks. - -This section covers the key concepts you need to understand to work effectively with Llama Stack: - -- **[Architecture](./architecture)** - Llama Stack's service-oriented design and benefits -- **[APIs](./apis)** - Available REST APIs and planned capabilities -- **[API Providers](./api_providers)** - Remote vs inline provider implementations -- **[Distributions](./distributions)** - Pre-packaged provider configurations -- **[Resources](./resources)** - Resource federation and registration +Each concept builds upon the previous ones to give you a comprehensive understanding of how Llama Stack works and how to use it effectively. diff --git a/docs/docs/concepts/resources.mdx b/docs/docs/concepts/resources.mdx index 323902a4a..8d1bd221b 100644 --- a/docs/docs/concepts/resources.mdx +++ b/docs/docs/concepts/resources.mdx @@ -2,7 +2,7 @@ title: Resources description: Resource federation and registration in Llama Stack sidebar_label: Resources -sidebar_position: 6 +sidebar_position: 4 --- # Resources diff --git a/docs/docs/contributing/index.mdx b/docs/docs/contributing/index.mdx index 03aeebc23..263900ecc 100644 --- a/docs/docs/contributing/index.mdx +++ b/docs/docs/contributing/index.mdx @@ -148,7 +148,7 @@ As a general guideline: that describes the configuration. These descriptions will be used to generate the provider documentation. * When possible, use keyword arguments only when calling functions. -* Llama Stack utilizes [custom Exception classes](llama_stack/apis/common/errors.py) for certain Resources that should be used where applicable. +* Llama Stack utilizes custom Exception classes for certain Resources that should be used where applicable. ### License By contributing to Llama, you agree that your contributions will be licensed @@ -212,35 +212,22 @@ The generated API schema will be available in `docs/static/`. Make sure to revie ## Adding a New Provider See: -- [Adding a New API Provider Page](new_api_provider.md) which describes how to add new API providers to the Stack. -- [Vector Database Page](new_vector_database.md) which describes how to add a new vector databases with Llama Stack. -- [External Provider Page](../providers/external/index.md) which describes how to add external providers to the Stack. +- [Adding a New API Provider Page](./new_api_provider.mdx) which describes how to add new API providers to the Stack. +- [Vector Database Page](./new_vector_database.mdx) which describes how to add a new vector databases with Llama Stack. +- [External Provider Page](/docs/providers/external/) which describes how to add external providers to the Stack. -```{toctree} -:maxdepth: 1 -:hidden: - -new_api_provider -new_vector_database -``` ## Testing -```{include} ../../../tests/README.md -``` +See the [Testing README](https://github.com/meta-llama/llama-stack/blob/main/tests/README.md) for detailed testing information. ## Advanced Topics For developers who need deeper understanding of the testing system internals: -```{toctree} -:maxdepth: 1 - -testing/record-replay -``` +- [Record-Replay Testing](./testing/record-replay.mdx) ### Benchmarking -```{include} ../../../benchmarking/k8s-benchmark/README.md -``` +See the [Benchmarking README](https://github.com/meta-llama/llama-stack/blob/main/benchmarking/k8s-benchmark/README.md) for benchmarking information. diff --git a/docs/docs/contributing/new_api_provider.mdx b/docs/docs/contributing/new_api_provider.mdx index 95ef0c4f6..4ae6d5e72 100644 --- a/docs/docs/contributing/new_api_provider.mdx +++ b/docs/docs/contributing/new_api_provider.mdx @@ -11,7 +11,7 @@ import TabItem from '@theme/TabItem'; This guide will walk you through the process of adding a new API provider to Llama Stack. -- Begin by reviewing the [core concepts](../concepts/index.md) of Llama Stack and choose the API your provider belongs to (Inference, Safety, VectorIO, etc.) +- Begin by reviewing the [core concepts](../concepts/) of Llama Stack and choose the API your provider belongs to (Inference, Safety, VectorIO, etc.) - Determine the provider type ([Remote](https://github.com/meta-llama/llama-stack/tree/main/llama_stack/providers/remote) or [Inline](https://github.com/meta-llama/llama-stack/tree/main/llama_stack/providers/inline)). Remote providers make requests to external services, while inline providers execute implementation locally. - Add your provider to the appropriate [Registry](https://github.com/meta-llama/llama-stack/tree/main/llama_stack/providers/registry/). Specify pip dependencies necessary. - Update any distribution [Templates](https://github.com/meta-llama/llama-stack/tree/main/llama_stack/distributions/) `build.yaml` and `run.yaml` files if they should include your provider by default. Run [./scripts/distro_codegen.py](https://github.com/meta-llama/llama-stack/blob/main/scripts/distro_codegen.py) if necessary. Note that `distro_codegen.py` will fail if the new provider causes any distribution template to attempt to import provider-specific dependencies. This usually means the distribution's `get_distribution_template()` code path should only import any necessary Config or model alias definitions from each provider and not the provider's actual implementation. diff --git a/docs/docs/deploying/kubernetes_deployment.mdx b/docs/docs/deploying/kubernetes_deployment.mdx index b50926455..a937ce355 100644 --- a/docs/docs/deploying/kubernetes_deployment.mdx +++ b/docs/docs/deploying/kubernetes_deployment.mdx @@ -219,6 +219,6 @@ kubectl run -it --rm debug --image=curlimages/curl --restart=Never -- curl http: ## Related Resources -- **[Deployment Overview](./index)** - Overview of deployment options +- **[Deployment Overview](/docs/deploying/)** - Overview of deployment options - **[Distributions](/docs/distributions)** - Understanding Llama Stack distributions - **[Configuration](/docs/distributions/configuration)** - Detailed configuration options diff --git a/docs/docs/distributions/building_distro.mdx b/docs/docs/distributions/building_distro.mdx index d9a8048fc..5b65b7f16 100644 --- a/docs/docs/distributions/building_distro.mdx +++ b/docs/docs/distributions/building_distro.mdx @@ -251,7 +251,7 @@ directory or a git repository (git must be installed on the build environment). llama stack build --config my-external-stack.yaml ``` -For more information on external providers, including directory structure, provider types, and implementation requirements, see the [External Providers documentation](../providers/external.md). +For more information on external providers, including directory structure, provider types, and implementation requirements, see the [External Providers documentation](../providers/external/). diff --git a/docs/docs/distributions/configuration.mdx b/docs/docs/distributions/configuration.mdx index 4cd093ef0..d87c7f64b 100644 --- a/docs/docs/distributions/configuration.mdx +++ b/docs/docs/distributions/configuration.mdx @@ -206,7 +206,7 @@ models: provider_model_id: null model_type: llm ``` -A Model is an instance of a "Resource" (see [Concepts](../concepts/index)) and is associated with a specific inference provider (in this case, the provider with identifier `ollama`). This is an instance of a "pre-registered" model. While we always encourage the clients to register models before using them, some Stack servers may come up a list of "already known and available" models. +A Model is an instance of a "Resource" (see [Concepts](../concepts/)) and is associated with a specific inference provider (in this case, the provider with identifier `ollama`). This is an instance of a "pre-registered" model. While we always encourage the clients to register models before using them, some Stack servers may come up a list of "already known and available" models. What's with the `provider_model_id` field? This is an identifier for the model inside the provider's model catalog. Contrast it with `model_id` which is the identifier for the same model for Llama Stack's purposes. For example, you may want to name "llama3.2:vision-11b" as "image_captioning_model" when you use it in your Stack interactions. When omitted, the server will set `provider_model_id` to be the same as `model_id`. diff --git a/docs/docs/distributions/importing_as_library.mdx b/docs/docs/distributions/importing_as_library.mdx index b87bb80a4..122e5220f 100644 --- a/docs/docs/distributions/importing_as_library.mdx +++ b/docs/docs/distributions/importing_as_library.mdx @@ -33,7 +33,7 @@ Then, you can access the APIs like `models` and `inference` on the client and ca response = client.models.list() ``` -If you've created a [custom distribution](building_distro.md), you can also use the run.yaml configuration file directly: +If you've created a [custom distribution](./building_distro), you can also use the run.yaml configuration file directly: ```python client = LlamaStackAsLibraryClient(config_path) diff --git a/docs/docs/distributions/index.mdx b/docs/docs/distributions/index.mdx index 97be14910..0149f143f 100644 --- a/docs/docs/distributions/index.mdx +++ b/docs/docs/distributions/index.mdx @@ -13,9 +13,9 @@ This section provides an overview of the distributions available in Llama Stack. ## Distribution Guides -- **[Available Distributions](./list_of_distributions)** - Complete list and comparison of all distributions -- **[Building Custom Distributions](./building_distro)** - Create your own distribution from scratch -- **[Customizing Configuration](./customizing_run_yaml)** - Customize run.yaml for your needs -- **[Starting Llama Stack Server](./starting_llama_stack_server)** - How to run distributions -- **[Importing as Library](./importing_as_library)** - Use distributions in your code -- **[Configuration Reference](./configuration)** - Configuration file format details +- **[Available Distributions](./list_of_distributions.mdx)** - Complete list and comparison of all distributions +- **[Building Custom Distributions](./building_distro.mdx)** - Create your own distribution from scratch +- **[Customizing Configuration](./customizing_run_yaml.mdx)** - Customize run.yaml for your needs +- **[Starting Llama Stack Server](./starting_llama_stack_server.mdx)** - How to run distributions +- **[Importing as Library](./importing_as_library.mdx)** - Use distributions in your code +- **[Configuration Reference](./configuration.mdx)** - Configuration file format details diff --git a/docs/docs/distributions/list_of_distributions.mdx b/docs/docs/distributions/list_of_distributions.mdx index 7e8f56a16..813d3c721 100644 --- a/docs/docs/distributions/list_of_distributions.mdx +++ b/docs/docs/distributions/list_of_distributions.mdx @@ -62,7 +62,7 @@ docker pull llama-stack/distribution-meta-reference-gpu **Partners:** [Fireworks.ai](https://fireworks.ai) and [Together.xyz](https://together.xyz) -**Guides:** [Remote-Hosted Endpoints](remote_hosted_distro/index) +**Guides:** [Remote-Hosted Endpoints](./remote_hosted_distro/) ### 📱 Mobile Development @@ -81,7 +81,7 @@ docker pull llama-stack/distribution-meta-reference-gpu - You need custom configurations - You want to optimize for your specific use case -**Guides:** [Building Custom Distributions](building_distro.md) +**Guides:** [Building Custom Distributions](./building_distro) ## Detailed Documentation @@ -131,4 +131,4 @@ graph TD 3. **Configure your providers** with API keys or local models 4. **Start building** with Llama Stack! -For help choosing or troubleshooting, check our [Getting Started Guide](../getting_started/index.md) or [Community Support](https://github.com/llama-stack/llama-stack/discussions). +For help choosing or troubleshooting, check our [Getting Started Guide](/docs/getting_started/quickstart) or [Community Support](https://github.com/llama-stack/llama-stack/discussions). diff --git a/docs/docs/distributions/ondevice_distro/android_sdk.md b/docs/docs/distributions/ondevice_distro/android_sdk.md index ad86fa5f3..bfa294e45 100644 --- a/docs/docs/distributions/ondevice_distro/android_sdk.md +++ b/docs/docs/distributions/ondevice_distro/android_sdk.md @@ -66,7 +66,7 @@ llama stack run starter --port 5050 Ensure the Llama Stack server version is the same as the Kotlin SDK Library for maximum compatibility. -Other inference providers: [Table](../../index.md#supported-llama-stack-implementations) +Other inference providers: [Table](/docs/) How to set remote localhost in Demo App: [Settings](https://github.com/meta-llama/llama-stack-client-kotlin/tree/latest-release/examples/android_app#settings) diff --git a/docs/docs/distributions/self_hosted_distro/starter.md b/docs/docs/distributions/self_hosted_distro/starter.md index 9218f7f81..faa82bcfa 100644 --- a/docs/docs/distributions/self_hosted_distro/starter.md +++ b/docs/docs/distributions/self_hosted_distro/starter.md @@ -36,25 +36,25 @@ The starter distribution includes a comprehensive set of inference providers: ### Hosted Providers - **[OpenAI](https://openai.com/api/)**: GPT-4, GPT-3.5, O1, O3, O4 models and text embeddings - - provider ID: `openai` - reference documentation: [openai](../../providers/inference/remote_openai.md) + provider ID: `openai` - reference documentation: [openai](../../providers/inference/remote_openai) - **[Fireworks](https://fireworks.ai/)**: Llama 3.1, 3.2, 3.3, 4 Scout, 4 Maverick models and - embeddings - provider ID: `fireworks` - reference documentation: [fireworks](../../providers/inference/remote_fireworks.md) + embeddings - provider ID: `fireworks` - reference documentation: [fireworks](../../providers/inference/remote_fireworks) - **[Together](https://together.ai/)**: Llama 3.1, 3.2, 3.3, 4 Scout, 4 Maverick models and - embeddings - provider ID: `together` - reference documentation: [together](../../providers/inference/remote_together.md) -- **[Anthropic](https://www.anthropic.com/)**: Claude 3.5 Sonnet, Claude 3.7 Sonnet, Claude 3.5 Haiku, and Voyage embeddings - provider ID: `anthropic` - reference documentation: [anthropic](../../providers/inference/remote_anthropic.md) -- **[Gemini](https://gemini.google.com/)**: Gemini 1.5, 2.0, 2.5 models and text embeddings - provider ID: `gemini` - reference documentation: [gemini](../../providers/inference/remote_gemini.md) -- **[Groq](https://groq.com/)**: Fast Llama models (3.1, 3.2, 3.3, 4 Scout, 4 Maverick) - provider ID: `groq` - reference documentation: [groq](../../providers/inference/remote_groq.md) -- **[SambaNova](https://www.sambanova.ai/)**: Llama 3.1, 3.2, 3.3, 4 Scout, 4 Maverick models - provider ID: `sambanova` - reference documentation: [sambanova](../../providers/inference/remote_sambanova.md) -- **[Cerebras](https://www.cerebras.ai/)**: Cerebras AI models - provider ID: `cerebras` - reference documentation: [cerebras](../../providers/inference/remote_cerebras.md) -- **[NVIDIA](https://www.nvidia.com/)**: NVIDIA NIM - provider ID: `nvidia` - reference documentation: [nvidia](../../providers/inference/remote_nvidia.md) -- **[HuggingFace](https://huggingface.co/)**: Serverless and endpoint models - provider ID: `hf::serverless` and `hf::endpoint` - reference documentation: [huggingface-serverless](../../providers/inference/remote_hf_serverless.md) and [huggingface-endpoint](../../providers/inference/remote_hf_endpoint.md) -- **[Bedrock](https://aws.amazon.com/bedrock/)**: AWS Bedrock models - provider ID: `bedrock` - reference documentation: [bedrock](../../providers/inference/remote_bedrock.md) + embeddings - provider ID: `together` - reference documentation: [together](../../providers/inference/remote_together) +- **[Anthropic](https://www.anthropic.com/)**: Claude 3.5 Sonnet, Claude 3.7 Sonnet, Claude 3.5 Haiku, and Voyage embeddings - provider ID: `anthropic` - reference documentation: [anthropic](../../providers/inference/remote_anthropic) +- **[Gemini](https://gemini.google.com/)**: Gemini 1.5, 2.0, 2.5 models and text embeddings - provider ID: `gemini` - reference documentation: [gemini](../../providers/inference/remote_gemini) +- **[Groq](https://groq.com/)**: Fast Llama models (3.1, 3.2, 3.3, 4 Scout, 4 Maverick) - provider ID: `groq` - reference documentation: [groq](../../providers/inference/remote_groq) +- **[SambaNova](https://www.sambanova.ai/)**: Llama 3.1, 3.2, 3.3, 4 Scout, 4 Maverick models - provider ID: `sambanova` - reference documentation: [sambanova](../../providers/inference/remote_sambanova) +- **[Cerebras](https://www.cerebras.ai/)**: Cerebras AI models - provider ID: `cerebras` - reference documentation: [cerebras](../../providers/inference/remote_cerebras) +- **[NVIDIA](https://www.nvidia.com/)**: NVIDIA NIM - provider ID: `nvidia` - reference documentation: [nvidia](../../providers/inference/remote_nvidia) +- **[HuggingFace](https://huggingface.co/)**: Serverless and endpoint models - provider ID: `hf::serverless` and `hf::endpoint` - reference documentation: [huggingface-serverless](../../providers/inference/remote_hf_serverless) and [huggingface-endpoint](../../providers/inference/remote_hf_endpoint) +- **[Bedrock](https://aws.amazon.com/bedrock/)**: AWS Bedrock models - provider ID: `bedrock` - reference documentation: [bedrock](../../providers/inference/remote_bedrock) ### Local/Remote Providers -- **[Ollama](https://ollama.ai/)**: Local Ollama models - provider ID: `ollama` - reference documentation: [ollama](../../providers/inference/remote_ollama.md) -- **[vLLM](https://docs.vllm.ai/en/latest/)**: Local or remote vLLM server - provider ID: `vllm` - reference documentation: [vllm](../../providers/inference/remote_vllm.md) -- **[TGI](https://github.com/huggingface/text-generation-inference)**: Text Generation Inference server - Dell Enterprise Hub's custom TGI container too (use `DEH_URL`) - provider ID: `tgi` - reference documentation: [tgi](../../providers/inference/remote_tgi.md) -- **[Sentence Transformers](https://www.sbert.net/)**: Local embedding models - provider ID: `sentence-transformers` - reference documentation: [sentence-transformers](../../providers/inference/inline_sentence-transformers.md) +- **[Ollama](https://ollama.ai/)**: Local Ollama models - provider ID: `ollama` - reference documentation: [ollama](../../providers/inference/remote_ollama) +- **[vLLM](https://docs.vllm.ai/en/latest/)**: Local or remote vLLM server - provider ID: `vllm` - reference documentation: [vllm](../../providers/inference/remote_vllm) +- **[TGI](https://github.com/huggingface/text-generation-inference)**: Text Generation Inference server - Dell Enterprise Hub's custom TGI container too (use `DEH_URL`) - provider ID: `tgi` - reference documentation: [tgi](../../providers/inference/remote_tgi) +- **[Sentence Transformers](https://www.sbert.net/)**: Local embedding models - provider ID: `sentence-transformers` - reference documentation: [sentence-transformers](../../providers/inference/inline_sentence-transformers) All providers are disabled by default. So you need to enable them by setting the environment variables. diff --git a/docs/docs/distributions/starting_llama_stack_server.mdx b/docs/docs/distributions/starting_llama_stack_server.mdx index 8ca1ca3ce..0260692b3 100644 --- a/docs/docs/distributions/starting_llama_stack_server.mdx +++ b/docs/docs/distributions/starting_llama_stack_server.mdx @@ -16,11 +16,11 @@ This is the simplest way to get started. Using Llama Stack as a library means yo ## Container: -Another simple way to start interacting with Llama Stack is to just spin up a container (via Docker or Podman) which is pre-built with all the providers you need. We provide a number of pre-built images so you can start a Llama Stack server instantly. You can also build your own custom container. Which distribution to choose depends on the hardware you have. See [Selection of a Distribution](selection) for more details. +Another simple way to start interacting with Llama Stack is to just spin up a container (via Docker or Podman) which is pre-built with all the providers you need. We provide a number of pre-built images so you can start a Llama Stack server instantly. You can also build your own custom container. Which distribution to choose depends on the hardware you have. See [Selection of a Distribution](./list_of_distributions) for more details. ## Kubernetes: -If you have built a container image and want to deploy it in a Kubernetes cluster instead of starting the Llama Stack server locally. See [Kubernetes Deployment Guide](kubernetes_deployment) for more details. +If you have built a container image and want to deploy it in a Kubernetes cluster instead of starting the Llama Stack server locally. See [Kubernetes Deployment Guide](../deploying/kubernetes_deployment) for more details. ```{toctree} diff --git a/docs/docs/getting_started/detailed_tutorial.mdx b/docs/docs/getting_started/detailed_tutorial.mdx index 3db63176c..33786ac0e 100644 --- a/docs/docs/getting_started/detailed_tutorial.mdx +++ b/docs/docs/getting_started/detailed_tutorial.mdx @@ -18,7 +18,7 @@ In Llama Stack, we provide a server exposing multiple APIs. These APIs are backe Llama Stack is a stateful service with REST APIs to support seamless transition of AI applications across different environments. The server can be run in a variety of ways, including as a standalone binary, Docker container, or hosted service. You can build and test using a local server first and deploy to a hosted endpoint for production. In this guide, we'll walk through how to build a RAG agent locally using Llama Stack with [Ollama](https://ollama.com/) -as the inference [provider](../providers/index.md#inference) for a Llama Model. +as the inference [provider](/docs/providers/inference/) for a Llama Model. ### Step 1: Installation and Setup @@ -60,8 +60,8 @@ Llama Stack is a server that exposes multiple APIs, you connect with it using th You can use Python to build and run the Llama Stack server, which is useful for testing and development. -Llama Stack uses a [YAML configuration file](../distributions/configuration.md) to specify the stack setup, -which defines the providers and their settings. The generated configuration serves as a starting point that you can [customize for your specific needs](../distributions/customizing_run_yaml.md). +Llama Stack uses a [YAML configuration file](../distributions/configuration) to specify the stack setup, +which defines the providers and their settings. The generated configuration serves as a starting point that you can [customize for your specific needs](../distributions/customizing_run_yaml). Now let's build and run the Llama Stack config for Ollama. We use `starter` as template. By default all providers are disabled, this requires enable ollama by passing environment variables. @@ -73,7 +73,7 @@ llama stack build --distro starter --image-type venv --run You can use a container image to run the Llama Stack server. We provide several container images for the server component that works with different inference providers out of the box. For this guide, we will use `llamastack/distribution-starter` as the container image. If you'd like to build your own image or customize the -configurations, please check out [this guide](../distributions/building_distro.md). +configurations, please check out [this guide](../distributions/building_distro). First lets setup some environment variables and create a local directory to mount into the container’s file system. ```bash export LLAMA_STACK_PORT=8321 @@ -145,7 +145,7 @@ pip install llama-stack-client -Now let's use the `llama-stack-client` [CLI](../references/llama_stack_client_cli_reference.md) to check the +Now let's use the `llama-stack-client` [CLI](../references/llama_stack_client_cli_reference) to check the connectivity to the server. ```bash @@ -216,8 +216,8 @@ OpenAIChatCompletion( ### Step 4: Run the Demos -Note that these demos show the [Python Client SDK](../references/python_sdk_reference/index.md). -Other SDKs are also available, please refer to the [Client SDK](../index.md#client-sdks) list for the complete options. +Note that these demos show the [Python Client SDK](../references/python_sdk_reference/). +Other SDKs are also available, please refer to the [Client SDK](/docs/) list for the complete options. @@ -538,4 +538,4 @@ uv run python rag_agent.py **You're Ready to Build Your Own Apps!** -Congrats! 🥳 Now you're ready to [build your own Llama Stack applications](../building_applications/index)! 🚀 +Congrats! 🥳 Now you're ready to [build your own Llama Stack applications](../building_applications/)! 🚀 diff --git a/docs/docs/getting_started/quickstart.mdx b/docs/docs/getting_started/quickstart.mdx index fbc86cc2e..b885f3c66 100644 --- a/docs/docs/getting_started/quickstart.mdx +++ b/docs/docs/getting_started/quickstart.mdx @@ -140,7 +140,7 @@ If you are getting a **401 Client Error** from HuggingFace for the **all-MiniLM- ### Next Steps Now you're ready to dive deeper into Llama Stack! -- Explore the [Detailed Tutorial](/docs/detailed_tutorial). +- Explore the [Detailed Tutorial](./detailed_tutorial). - Try the [Getting Started Notebook](https://github.com/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb). - Browse more [Notebooks on GitHub](https://github.com/meta-llama/llama-stack/tree/main/docs/notebooks). - Learn about Llama Stack [Concepts](/docs/concepts). diff --git a/docs/docs/providers/agents/index.mdx b/docs/docs/providers/agents/index.mdx index df020f284..5cd37776d 100644 --- a/docs/docs/providers/agents/index.mdx +++ b/docs/docs/providers/agents/index.mdx @@ -25,7 +25,3 @@ Agents API for creating and interacting with agentic systems. - Agents can also use Memory to retrieve information from knowledge bases. See the RAG Tool and Vector IO APIs for more details. This section contains documentation for all available providers for the **agents** API. - -## Providers - -- [Meta-Reference](./inline_meta-reference) diff --git a/docs/docs/providers/batches/index.mdx b/docs/docs/providers/batches/index.mdx index a966cc153..2c64b277f 100644 --- a/docs/docs/providers/batches/index.mdx +++ b/docs/docs/providers/batches/index.mdx @@ -29,7 +29,3 @@ The Batches API enables efficient processing of multiple requests in a single op Note: This API is currently under active development and may undergo changes. This section contains documentation for all available providers for the **batches** API. - -## Providers - -- [Reference](./inline_reference) diff --git a/docs/docs/providers/datasetio/index.md b/docs/docs/providers/datasetio/index.md deleted file mode 100644 index 6c02acf6c..000000000 --- a/docs/docs/providers/datasetio/index.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -sidebar_label: Datasetio -title: Datasetio ---- - -# Datasetio - -## Overview - -This section contains documentation for all available providers for the **datasetio** API. - -## Providers - -- [Localfs](./inline_localfs) -- [Remote - Huggingface](./remote_huggingface) -- [Remote - Nvidia](./remote_nvidia) diff --git a/docs/docs/providers/datasetio/index.mdx b/docs/docs/providers/datasetio/index.mdx index 6c02acf6c..aeeb01980 100644 --- a/docs/docs/providers/datasetio/index.mdx +++ b/docs/docs/providers/datasetio/index.mdx @@ -8,9 +8,3 @@ title: Datasetio ## Overview This section contains documentation for all available providers for the **datasetio** API. - -## Providers - -- [Localfs](./inline_localfs) -- [Remote - Huggingface](./remote_huggingface) -- [Remote - Nvidia](./remote_nvidia) diff --git a/docs/docs/providers/eval/index.mdx b/docs/docs/providers/eval/index.mdx index e486814de..73b0b89aa 100644 --- a/docs/docs/providers/eval/index.mdx +++ b/docs/docs/providers/eval/index.mdx @@ -11,8 +11,3 @@ title: Eval Llama Stack Evaluation API for running evaluations on model and agent candidates. This section contains documentation for all available providers for the **eval** API. - -## Providers - -- [Meta-Reference](./inline_meta-reference) -- [Remote - Nvidia](./remote_nvidia) diff --git a/docs/docs/providers/external/index.mdx b/docs/docs/providers/external/index.mdx index 375a97c82..28a9a1147 100644 --- a/docs/docs/providers/external/index.mdx +++ b/docs/docs/providers/external/index.mdx @@ -7,5 +7,5 @@ Llama Stack supports external providers that live outside of the main codebase. ## External Provider Documentation -- [Known External Providers](external-providers-list) -- [Creating External Providers](external-providers-guide) +- [Known External Providers](./external-providers-list.mdx) +- [Creating External Providers](./external-providers-guide.mdx) diff --git a/docs/docs/providers/files/index.mdx b/docs/docs/providers/files/index.mdx index 98bd89633..7d729d90f 100644 --- a/docs/docs/providers/files/index.mdx +++ b/docs/docs/providers/files/index.mdx @@ -8,8 +8,3 @@ title: Files ## Overview This section contains documentation for all available providers for the **files** API. - -## Providers - -- [Localfs](./inline_localfs) -- [Remote - S3](./remote_s3) diff --git a/docs/docs/providers/index.mdx b/docs/docs/providers/index.mdx index d275ac1a3..9c560fe32 100644 --- a/docs/docs/providers/index.mdx +++ b/docs/docs/providers/index.mdx @@ -21,13 +21,13 @@ Importantly, Llama Stack always strives to provide at least one fully inline pro ## Provider Categories -- **[External Providers](./external/)** - Guide for building and using external providers -- **[OpenAI Compatibility](./openai)** - OpenAI API compatibility layer -- **[Inference](./inference/)** - LLM and embedding model providers -- **[Agents](./agents/)** - Agentic system providers -- **[DatasetIO](./datasetio/)** - Dataset and data loader providers -- **[Safety](./safety/)** - Content moderation and safety providers -- **[Telemetry](./telemetry/)** - Monitoring and observability providers -- **[Vector IO](./vector-io/)** - Vector database providers -- **[Tool Runtime](./tool-runtime/)** - Tool and protocol providers -- **[Files](./files/)** - File system and storage providers +- **[External Providers](external/index.mdx)** - Guide for building and using external providers +- **[OpenAI Compatibility](./openai.mdx)** - OpenAI API compatibility layer +- **[Inference](inference/index.mdx)** - LLM and embedding model providers +- **[Agents](agents/index.mdx)** - Agentic system providers +- **[DatasetIO](datasetio/index.mdx)** - Dataset and data loader providers +- **[Safety](safety/index.mdx)** - Content moderation and safety providers +- **[Telemetry](telemetry/index.mdx)** - Monitoring and observability providers +- **[Vector IO](vector_io/index.mdx)** - Vector database providers +- **[Tool Runtime](tool_runtime/index.mdx)** - Tool and protocol providers +- **[Files](files/index.mdx)** - File system and storage providers diff --git a/docs/docs/providers/inference/index.mdx b/docs/docs/providers/inference/index.mdx index a9365c5f2..ebbaf1be1 100644 --- a/docs/docs/providers/inference/index.mdx +++ b/docs/docs/providers/inference/index.mdx @@ -19,30 +19,3 @@ Llama Stack Inference API for generating completions, chat completions, and embe - Embedding models: these models generate embeddings to be used for semantic search. This section contains documentation for all available providers for the **inference** API. - -## Providers - -- [Meta-Reference](./inline_meta-reference) -- [Sentence-Transformers](./inline_sentence-transformers) -- [Remote - Anthropic](./remote_anthropic) -- [Remote - Azure](./remote_azure) -- [Remote - Bedrock](./remote_bedrock) -- [Remote - Cerebras](./remote_cerebras) -- [Remote - Databricks](./remote_databricks) -- [Remote - Fireworks](./remote_fireworks) -- [Remote - Gemini](./remote_gemini) -- [Remote - Groq](./remote_groq) -- [Remote - Hf - Endpoint](./remote_hf_endpoint) -- [Remote - Hf - Serverless](./remote_hf_serverless) -- [Remote - Llama-Openai-Compat](./remote_llama-openai-compat) -- [Remote - Nvidia](./remote_nvidia) -- [Remote - Ollama](./remote_ollama) -- [Remote - Openai](./remote_openai) -- [Remote - Passthrough](./remote_passthrough) -- [Remote - Runpod](./remote_runpod) -- [Remote - Sambanova](./remote_sambanova) -- [Remote - Tgi](./remote_tgi) -- [Remote - Together](./remote_together) -- [Remote - Vertexai](./remote_vertexai) -- [Remote - Vllm](./remote_vllm) -- [Remote - Watsonx](./remote_watsonx) diff --git a/docs/docs/providers/openai.mdx b/docs/docs/providers/openai.mdx index 1a907152f..bcff5873c 100644 --- a/docs/docs/providers/openai.mdx +++ b/docs/docs/providers/openai.mdx @@ -1,3 +1,8 @@ +title: OpenAI Compatibility +description: OpenAI API Compatibility +sidebar_label: OpenAI Compatibility +sidebar_position: 1 +--- ## OpenAI API Compatibility ### Server path diff --git a/docs/docs/providers/post_training/index.mdx b/docs/docs/providers/post_training/index.mdx index 6faab7a05..e3c8ba0e8 100644 --- a/docs/docs/providers/post_training/index.mdx +++ b/docs/docs/providers/post_training/index.mdx @@ -8,10 +8,3 @@ title: Post_Training ## Overview This section contains documentation for all available providers for the **post_training** API. - -## Providers - -- [Huggingface-Gpu](./inline_huggingface-gpu) -- [Torchtune-Cpu](./inline_torchtune-cpu) -- [Torchtune-Gpu](./inline_torchtune-gpu) -- [Remote - Nvidia](./remote_nvidia) diff --git a/docs/docs/providers/safety/index.mdx b/docs/docs/providers/safety/index.mdx index 591b92b8d..3445b17e6 100644 --- a/docs/docs/providers/safety/index.mdx +++ b/docs/docs/providers/safety/index.mdx @@ -8,12 +8,3 @@ title: Safety ## Overview This section contains documentation for all available providers for the **safety** API. - -## Providers - -- [Code-Scanner](./inline_code-scanner) -- [Llama-Guard](./inline_llama-guard) -- [Prompt-Guard](./inline_prompt-guard) -- [Remote - Bedrock](./remote_bedrock) -- [Remote - Nvidia](./remote_nvidia) -- [Remote - Sambanova](./remote_sambanova) diff --git a/docs/docs/providers/scoring/index.mdx b/docs/docs/providers/scoring/index.mdx index cb9bc539b..41d63b4ad 100644 --- a/docs/docs/providers/scoring/index.mdx +++ b/docs/docs/providers/scoring/index.mdx @@ -8,9 +8,3 @@ title: Scoring ## Overview This section contains documentation for all available providers for the **scoring** API. - -## Providers - -- [Basic](./inline_basic) -- [Braintrust](./inline_braintrust) -- [Llm-As-Judge](./inline_llm-as-judge) diff --git a/docs/docs/providers/telemetry/index.mdx b/docs/docs/providers/telemetry/index.mdx index a13481e13..07190d625 100644 --- a/docs/docs/providers/telemetry/index.mdx +++ b/docs/docs/providers/telemetry/index.mdx @@ -8,7 +8,3 @@ title: Telemetry ## Overview This section contains documentation for all available providers for the **telemetry** API. - -## Providers - -- [Meta-Reference](./inline_meta-reference) diff --git a/docs/docs/providers/tool_runtime/index.mdx b/docs/docs/providers/tool_runtime/index.mdx index 051a8c436..ab5050952 100644 --- a/docs/docs/providers/tool_runtime/index.mdx +++ b/docs/docs/providers/tool_runtime/index.mdx @@ -8,12 +8,3 @@ title: Tool_Runtime ## Overview This section contains documentation for all available providers for the **tool_runtime** API. - -## Providers - -- [Rag-Runtime](./inline_rag-runtime) -- [Remote - Bing-Search](./remote_bing-search) -- [Remote - Brave-Search](./remote_brave-search) -- [Remote - Model-Context-Protocol](./remote_model-context-protocol) -- [Remote - Tavily-Search](./remote_tavily-search) -- [Remote - Wolfram-Alpha](./remote_wolfram-alpha) diff --git a/docs/docs/providers/vector_io/index.mdx b/docs/docs/providers/vector_io/index.mdx index 58dca2d13..4c4c81ef8 100644 --- a/docs/docs/providers/vector_io/index.mdx +++ b/docs/docs/providers/vector_io/index.mdx @@ -8,18 +8,3 @@ title: Vector_Io ## Overview This section contains documentation for all available providers for the **vector_io** API. - -## Providers - -- [Chromadb](./inline_chromadb) -- [Faiss](./inline_faiss) -- [Meta-Reference](./inline_meta-reference) -- [Milvus](./inline_milvus) -- [Qdrant](./inline_qdrant) -- [Sqlite-Vec](./inline_sqlite-vec) -- [Sqlite Vec](./inline_sqlite_vec) -- [Remote - Chromadb](./remote_chromadb) -- [Remote - Milvus](./remote_milvus) -- [Remote - Pgvector](./remote_pgvector) -- [Remote - Qdrant](./remote_qdrant) -- [Remote - Weaviate](./remote_weaviate) diff --git a/docs/docs/references/index.mdx b/docs/docs/references/index.mdx index 9bf41b6d5..dd6ab21cf 100644 --- a/docs/docs/references/index.mdx +++ b/docs/docs/references/index.mdx @@ -7,6 +7,6 @@ sidebar_position: 1 # References -- [Python SDK Reference](python_sdk_reference/index) -- [Llama CLI](llama_cli_reference/index) for building and running your Llama Stack server -- [Llama Stack Client CLI](llama_stack_client_cli_reference) for interacting with your Llama Stack server +- [Python SDK Reference](/docs/references/python_sdk_reference/) +- [Llama CLI](/docs/references/llama_cli_reference/) for building and running your Llama Stack server +- [Llama Stack Client CLI](./llama_stack_client_cli_reference.md) for interacting with your Llama Stack server diff --git a/docs/docs/references/llama_cli_reference/index.md b/docs/docs/references/llama_cli_reference/index.md index 09a8b7177..fe3aa51ab 100644 --- a/docs/docs/references/llama_cli_reference/index.md +++ b/docs/docs/references/llama_cli_reference/index.md @@ -29,7 +29,7 @@ You have two ways to install Llama Stack: ## `llama` subcommands 1. `download`: Supports downloading models from Meta or Hugging Face. [Downloading models](#downloading-models) 2. `model`: Lists available models and their properties. [Understanding models](#understand-the-models) -3. `stack`: Allows you to build a stack using the `llama stack` distribution and run a Llama Stack server. You can read more about how to build a Llama Stack distribution in the [Build your own Distribution](../../distributions/building_distro) documentation. +3. `stack`: Allows you to build a stack using the `llama stack` distribution and run a Llama Stack server. You can read more about how to build a Llama Stack distribution in the [Build your own Distribution](../distributions/building_distro) documentation. ### Sample Usage diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts index 42498fa9f..f4420df87 100644 --- a/docs/docusaurus.config.ts +++ b/docs/docusaurus.config.ts @@ -217,11 +217,6 @@ const config: Config = { ignoreFiles: [ "node_modules/**/*", ], - - // Exclude OpenAPI generated docs from search to avoid duplicates - searchContextByPaths: [ - "docs", - ], }, ], ], diff --git a/docs/static/img/llama-stack-logo.png b/docs/static/img/llama-stack-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d08f13ae16320866956dd38e11dc715227b30336 GIT binary patch literal 18601 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 AuK)l5 literal 0 HcmV?d00001 diff --git a/docs/static/llama-stack-logo.png b/docs/static/llama-stack-logo.png deleted file mode 100644 index 1899a0fc7f4a814f358e54ed3539fc29c681216b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71620 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

#9!>tOniSDP*0sPwR~6a@p&@1 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 diff --git a/docs/static/src/components/HomepageFeatures/index.js b/docs/static/src/components/HomepageFeatures/index.js deleted file mode 100644 index 78f410ba6..000000000 --- a/docs/static/src/components/HomepageFeatures/index.js +++ /dev/null @@ -1,64 +0,0 @@ -import React from 'react'; -import clsx from 'clsx'; -import styles from './styles.module.css'; - -const FeatureList = [ - { - title: 'Easy to Use', - Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, - description: ( - <> - Docusaurus was designed from the ground up to be easily installed and - used to get your website up and running quickly. - - ), - }, - { - title: 'Focus on What Matters', - Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default, - description: ( - <> - Docusaurus lets you focus on your docs, and we'll do the chores. Go - ahead and move your docs into the docs directory. - - ), - }, - { - title: 'Powered by React', - Svg: require('@site/static/img/undraw_docusaurus_react.svg').default, - description: ( - <> - Extend or customize your website layout by reusing React. Docusaurus can - be extended while reusing the same header and footer. - - ), - }, -]; - -function Feature({Svg, title, description}) { - return ( -
-
- -
-
-

{title}

-

{description}

-
-
- ); -} - -export default function HomepageFeatures() { - return ( -
-
-
- {FeatureList.map((props, idx) => ( - - ))} -
-
-
- ); -} diff --git a/docs/static/src/components/HomepageFeatures/styles.module.css b/docs/static/src/components/HomepageFeatures/styles.module.css deleted file mode 100644 index b248eb2e5..000000000 --- a/docs/static/src/components/HomepageFeatures/styles.module.css +++ /dev/null @@ -1,11 +0,0 @@ -.features { - display: flex; - align-items: center; - padding: 2rem 0; - width: 100%; -} - -.featureSvg { - height: 200px; - width: 200px; -} diff --git a/docs/static/src/css/custom.css b/docs/static/src/css/custom.css deleted file mode 100644 index 0e4d95b9b..000000000 --- a/docs/static/src/css/custom.css +++ /dev/null @@ -1,191 +0,0 @@ -/** - * Any CSS included here will be global. The classic template - * bundles Infima by default. Infima is a CSS framework designed to - * work well for content-centric websites. - */ - -/* You can override the default Infima variables here. */ -:root { - /* Llama Stack Original Theme - Based on llamastack.github.io */ - --ifm-color-primary: #4a4a68; - --ifm-color-primary-dark: #3a3a52; - --ifm-color-primary-darker: #332735; - --ifm-color-primary-darkest: #2b2129; - --ifm-color-primary-light: #5a5a7e; - --ifm-color-primary-lighter: #6a6a94; - --ifm-color-primary-lightest: #8080aa; - - /* Additional theme colors */ - --ifm-color-secondary: #1b263c; - --ifm-color-info: #2980b9; - --ifm-color-success: #16a085; - --ifm-color-warning: #f39c12; - --ifm-color-danger: #e74c3c; - - /* Background colors */ - --ifm-background-color: #ffffff; - --ifm-background-surface-color: #f8f9fa; - - /* Code and syntax highlighting */ - --ifm-code-font-size: 95%; - --ifm-pre-background: #1b263c; - --ifm-pre-color: #e1e5e9; - --docusaurus-highlighted-code-line-bg: rgba(51, 39, 53, 0.1); - - /* Link colors */ - --ifm-link-color: var(--ifm-color-primary); - --ifm-link-hover-color: var(--ifm-color-primary-darker); - - /* Navbar */ - --ifm-navbar-background-color: rgba(255, 255, 255, 0.95); - --ifm-navbar-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); - - /* Hero section gradient - matching original theme */ - --hero-gradient: linear-gradient(90deg, #332735 0%, #1b263c 100%); - - /* OpenAPI method colors */ - --openapi-code-blue: #2980b9; - --openapi-code-green: #16a085; - --openapi-code-orange: #f39c12; - --openapi-code-red: #e74c3c; - --openapi-code-purple: #332735; -} - -/* For readability concerns, you should choose a lighter palette in dark mode. */ -[data-theme='dark'] { - /* Dark theme primary colors - lighter versions of original theme */ - --ifm-color-primary: #8080aa; - --ifm-color-primary-dark: #6a6a94; - --ifm-color-primary-darker: #5a5a7e; - --ifm-color-primary-darkest: #4a4a68; - --ifm-color-primary-light: #9090ba; - --ifm-color-primary-lighter: #a0a0ca; - --ifm-color-primary-lightest: #b0b0da; - - /* Dark theme background colors */ - --ifm-background-color: #1a1a1a; - --ifm-background-surface-color: #2a2a2a; - - /* Dark theme navbar */ - --ifm-navbar-background-color: rgba(26, 26, 26, 0.95); - - /* Dark theme code highlighting */ - --docusaurus-highlighted-code-line-bg: rgba(51, 39, 53, 0.3); - - /* Dark theme text colors */ - --ifm-font-color-base: #e1e5e9; - --ifm-font-color-secondary: #a0a6ac; -} - -/* Sidebar Method labels */ -.api-method>.menu__link { - align-items: center; - justify-content: start; -} - -.api-method>.menu__link::before { - width: 50px; - height: 20px; - font-size: 12px; - line-height: 20px; - text-transform: uppercase; - font-weight: 600; - border-radius: 0.25rem; - border: 1px solid; - margin-right: var(--ifm-spacing-horizontal); - text-align: center; - flex-shrink: 0; - border-color: transparent; - color: white; -} - -.get>.menu__link::before { - content: "get"; - background-color: var(--ifm-color-primary); -} - -.put>.menu__link::before { - content: "put"; - background-color: var(--openapi-code-blue); -} - -.post>.menu__link::before { - content: "post"; - background-color: var(--openapi-code-green); -} - -.delete>.menu__link::before { - content: "del"; - background-color: var(--openapi-code-red); -} - -.patch>.menu__link::before { - content: "patch"; - background-color: var(--openapi-code-orange); -} - -.footer--dark { - --ifm-footer-link-color: #ffffff; - --ifm-footer-title-color: #ffffff; -} - -.footer--dark .footer__link-item { - color: #ffffff; -} - -.footer--dark .footer__title { - color: #ffffff; -} - -/* OpenAPI theme fixes for light mode readability */ -/* Version badge fixes */ -.openapi__version-badge, -.theme-doc-version-badge, -[class*="version-badge"], -[class*="versionBadge"] { - background-color: #ffffff !important; - color: #333333 !important; - border: 1px solid #d1d5db !important; -} - -/* OpenAPI method badges in light mode */ -.openapi__method-badge, -[class*="method-badge"] { - color: #ffffff !important; -} - -/* Button fixes for light mode */ -.openapi__button, -.theme-api-docs-demo-panel button, -[class*="api-docs"] button, -button[class*="button"], -.openapi-explorer__response-schema button, -.openapi-tabs__operation button { - color: #ffffff !important; -} - -.openapi__button:hover, -.theme-api-docs-demo-panel button:hover, -[class*="api-docs"] button:hover, -button[class*="button"]:hover, -.openapi-explorer__response-schema button:hover, -.openapi-tabs__operation button:hover { - color: #ffffff !important; -} - -/* Navigation buttons (Next/Previous) */ -.pagination-nav__link, -.pagination-nav__label { - color: #333333 !important; -} - -.pagination-nav__link--next, -.pagination-nav__link--prev { - background-color: #ffffff !important; - border: 1px solid #d1d5db !important; -} - -.pagination-nav__link--next:hover, -.pagination-nav__link--prev:hover { - background-color: #f3f4f6 !important; -} diff --git a/docs/static/src/pages/index.js b/docs/static/src/pages/index.js deleted file mode 100644 index fe14e920c..000000000 --- a/docs/static/src/pages/index.js +++ /dev/null @@ -1,163 +0,0 @@ -import React from 'react'; -import clsx from 'clsx'; -import Layout from '@theme/Layout'; -import Link from '@docusaurus/Link'; -import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; -import styles from './index.module.css'; - -function HomepageHeader() { - const {siteConfig} = useDocusaurusContext(); - return ( -
-
-
-

Build AI Applications with Llama Stack

-

- Unified APIs for Inference, RAG, Agents, Tools, Safety, and Telemetry -

-
- - 🚀 Get Started - - - 📚 API Reference - -
-
-
-
- ); -} - -function QuickStart() { - return ( -
-
-
-
-

Quick Start

-

- Get up and running with Llama Stack in just a few commands. Build your first RAG application locally. -

-
-
{`# Install uv and start Ollama
-ollama run llama3.2:3b --keepalive 60m
-
-# Run Llama Stack server
-OLLAMA_URL=http://localhost:11434 \\
-  uv run --with llama-stack \\
-  llama stack build --distro starter \\
-  --image-type venv --run
-
-# Try the Python SDK
-from llama_stack_client import LlamaStackClient
-
-client = LlamaStackClient(
-  base_url="http://localhost:8321"
-)
-
-response = client.inference.chat_completion(
-  model="Llama3.2-3B-Instruct",
-  messages=[{
-    "role": "user",
-    "content": "What is machine learning?"
-  }]
-)`}
-
-
-
-

Why Llama Stack?

-
-
-
🔗
-
-

Unified APIs

-

One consistent interface for all your AI needs - inference, safety, agents, and more.

-
-
-
-
🔄
-
-

Provider Flexibility

-

Swap between providers without code changes. Start local, deploy anywhere.

-
-
-
-
🛡️
-
-

Production Ready

-

Built-in safety, monitoring, and evaluation tools for enterprise applications.

-
-
-
-
📱
-
-

Multi-Platform

-

SDKs for Python, Node.js, iOS, Android, and REST APIs for any language.

-
-
-
-
-
-
-
- ); -} - -function CommunityLinks() { - return ( -
- ); -} - -export default function Home() { - const {siteConfig} = useDocusaurusContext(); - return ( - - -
- - -
-
- ); -} diff --git a/docs/static/src/pages/index.module.css b/docs/static/src/pages/index.module.css deleted file mode 100644 index c3681653b..000000000 --- a/docs/static/src/pages/index.module.css +++ /dev/null @@ -1,283 +0,0 @@ -/** - * CSS files with the .module.css suffix will be treated as CSS modules - * and scoped locally. - */ - -.heroBanner { - padding: 4rem 0; - text-align: center; - position: relative; - overflow: hidden; - background: var(--hero-gradient); - color: white; - display: flex; - align-items: center; -} - -.heroBanner::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: radial-gradient(circle at 30% 20%, rgba(255, 255, 255, 0.1) 0%, transparent 50%), - radial-gradient(circle at 70% 80%, rgba(255, 255, 255, 0.05) 0%, transparent 50%); - pointer-events: none; -} - -.heroContent { - max-width: 800px; - margin: 0 auto; -} - -.heroLogo { - height: 48px; - width: auto; - margin-bottom: 1.5rem; -} - -.heroTitle { - font-size: 2.8rem; - font-weight: 700; - margin-bottom: 1rem; - line-height: 1.2; -} - -.heroSubtitle { - font-size: 1.1rem; - font-weight: 400; - margin-bottom: 2rem; - opacity: 0.9; - line-height: 1.5; - max-width: 600px; - margin-left: auto; - margin-right: auto; -} - -.buttons { - display: flex; - align-items: center; - justify-content: center; - gap: 1rem; -} - -.heroBanner .getStartedButton { - background: white; - color: #332735; - border: 2px solid white; - font-weight: 600; - transition: all 0.3s ease; -} - -.heroBanner .getStartedButton:hover { - background: rgba(255, 255, 255, 0.9); - color: #2b2129; - border-color: rgba(255, 255, 255, 0.9); - transform: translateY(-2px); - box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); -} - -.heroBanner .apiButton { - background: transparent; - color: white; - border: 2px solid white; - font-weight: 600; - transition: all 0.3s ease; -} - -.heroBanner .apiButton:hover { - background: white; - border-color: white; - color: #332735; - transform: translateY(-2px); -} - -/* Quick Start Section */ -.quickStart { - padding: 4rem 0; - background: var(--ifm-background-color); -} - -.sectionTitle { - font-size: 2rem; - font-weight: 600; - margin-bottom: 0.75rem; - color: var(--ifm-color-emphasis-800); -} - -.sectionDescription { - font-size: 1rem; - color: var(--ifm-color-emphasis-600); - margin-bottom: 1.5rem; - line-height: 1.5; -} - -.codeBlock { - background: var(--ifm-color-gray-900); - border-radius: 8px; - padding: 1.5rem; - margin-top: 1.5rem; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); -} - -.codeBlock pre { - margin: 0; - padding: 0; - background: none; - border: none; -} - -.codeBlock code { - color: var(--ifm-color-gray-100); - font-family: 'Fira Code', 'Consolas', 'Monaco', monospace; - font-size: 0.9rem; - line-height: 1.6; -} - -/* Features */ -.features { - display: flex; - flex-direction: column; - gap: 1rem; - margin-top: 1.5rem; -} - -.feature { - display: flex; - align-items: flex-start; - gap: 1rem; - padding: 1rem; - border-radius: 8px; - background: var(--ifm-color-gray-50); - border: 1px solid var(--ifm-color-gray-200); - transition: all 0.2s ease; -} - -.feature:hover { - transform: translateY(-2px); - box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1); - border-color: var(--ifm-color-primary-lighter); -} - -.featureIcon { - font-size: 2rem; - width: 3rem; - height: 3rem; - display: flex; - align-items: center; - justify-content: center; - background: var(--ifm-color-primary-lightest); - border-radius: 50%; - flex-shrink: 0; -} - -.feature h4 { - margin: 0 0 0.5rem 0; - font-size: 1.1rem; - font-weight: 600; - color: var(--ifm-color-emphasis-800); -} - -.feature p { - margin: 0; - color: var(--ifm-color-emphasis-600); - line-height: 1.5; -} - -/* Community Section */ -.community { - padding: 3rem 0; - background: var(--ifm-color-gray-50); - border-top: 1px solid var(--ifm-color-gray-200); -} - -.communityContent { - text-align: center; - max-width: 600px; - margin: 0 auto; -} - -.communityLinks { - display: flex; - justify-content: center; - gap: 1rem; - margin-top: 2rem; -} - -.communityButton { - display: flex; - align-items: center; - gap: 0.5rem; - font-weight: 600; - transition: all 0.3s ease; -} - -.communityButton:hover { - transform: translateY(-2px); - box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1); -} - -.communityIcon { - font-size: 1.2rem; -} - -/* Responsive Design */ -@media screen and (max-width: 996px) { - .heroBanner { - padding: 3rem 2rem; - } - - .heroTitle { - font-size: 2.2rem; - } - - .heroSubtitle { - font-size: 1rem; - } - - .buttons { - flex-direction: column; - gap: 1rem; - } - - .quickStart { - padding: 3rem 0; - } - - .sectionTitle { - font-size: 1.75rem; - } - - .communityLinks { - flex-direction: column; - align-items: center; - } - - .communityButton { - width: 200px; - justify-content: center; - } -} - -@media screen and (max-width: 768px) { - .heroLogo { - height: 40px; - } - - .heroTitle { - font-size: 1.8rem; - } - - .codeBlock { - padding: 1rem; - } - - .codeBlock code { - font-size: 0.8rem; - } - - .feature { - padding: 0.75rem; - } -} diff --git a/docs/static/src/pages/markdown-page.md b/docs/static/src/pages/markdown-page.md deleted file mode 100644 index 9756c5b66..000000000 --- a/docs/static/src/pages/markdown-page.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Markdown page example ---- - -# Markdown page example - -You don't need React to write simple standalone pages. diff --git a/scripts/provider_codegen.py b/scripts/provider_codegen.py index 531d53eb3..34e4c0687 100755 --- a/scripts/provider_codegen.py +++ b/scripts/provider_codegen.py @@ -358,16 +358,6 @@ def generate_index_docs(api_name: str, api_docstring: str | None, provider_entri md_lines.append("") md_lines.append(f"This section contains documentation for all available providers for the **{api_name}** API.") - md_lines.append("") - - md_lines.append("## Providers") - md_lines.append("") - - # For Docusaurus, create a simple list of links instead of toctree - for entry in provider_entries: - provider_name = entry["display_name"] - filename = entry["filename"] - md_lines.append(f"- [{provider_name}](./{filename})") return "\n".join(md_lines) + "\n" From a50b63906cd3392cd2ffdf18e52afa2aafffc999 Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Wed, 24 Sep 2025 19:33:02 -0400 Subject: [PATCH 19/27] chore: use ollama/all-minilm:l6-v2 for ollama tests (#3537) # What does this PR do? use ollama embedding models for ollama test, previously using sentence-transformer recordings: - ./scripts/integration-tests.sh --stack-config server:ci-tests --suite base --setup ollama --inference-mode record - ./scripts/integration-tests.sh --stack-config server:ci-tests --suite vision --setup ollama-vision --inference-mode record ## Test Plan ci w/ added skip base64 embedding test --- .../inference/test_openai_embeddings.py | 1 + .../recordings/responses/4d438c6bbaed.json | 422 ++++++ .../recordings/responses/4ebcaf6c2aee.json | 53 + .../recordings/responses/4f00cf740aba.json | 420 ++++++ .../recordings/responses/517505777888.json | 420 ++++++ .../recordings/responses/58c8091104ff.json | 56 + .../recordings/responses/590d43ed64b8.json | 420 ++++++ .../recordings/responses/63aa4590a38a.json | 421 ++++++ .../recordings/responses/72dc126ecb92.json | 422 ++++++ .../recordings/responses/80311f244b55.json | 1204 +++++++++++++++++ .../recordings/responses/8ce928ad0b85.json | 421 ++++++ .../recordings/responses/9e9665e16597.json | 422 ++++++ .../recordings/responses/a1ea41fbf9a2.json | 422 ++++++ .../recordings/responses/c13d7510774c.json | 420 ++++++ .../recordings/responses/c48eb1cb6e1c.json | 422 ++++++ .../recordings/responses/dc978ebb7159.json | 422 ++++++ .../recordings/responses/dee1518c6628.json | 422 ++++++ .../recordings/responses/f23defea82ec.json | 53 + .../recordings/responses/fbc7b626714d.json | 422 ++++++ tests/integration/suites.py | 4 +- 20 files changed, 7267 insertions(+), 2 deletions(-) create mode 100644 tests/integration/recordings/responses/4d438c6bbaed.json create mode 100644 tests/integration/recordings/responses/4ebcaf6c2aee.json create mode 100644 tests/integration/recordings/responses/4f00cf740aba.json create mode 100644 tests/integration/recordings/responses/517505777888.json create mode 100644 tests/integration/recordings/responses/58c8091104ff.json create mode 100644 tests/integration/recordings/responses/590d43ed64b8.json create mode 100644 tests/integration/recordings/responses/63aa4590a38a.json create mode 100644 tests/integration/recordings/responses/72dc126ecb92.json create mode 100644 tests/integration/recordings/responses/80311f244b55.json create mode 100644 tests/integration/recordings/responses/8ce928ad0b85.json create mode 100644 tests/integration/recordings/responses/9e9665e16597.json create mode 100644 tests/integration/recordings/responses/a1ea41fbf9a2.json create mode 100644 tests/integration/recordings/responses/c13d7510774c.json create mode 100644 tests/integration/recordings/responses/c48eb1cb6e1c.json create mode 100644 tests/integration/recordings/responses/dc978ebb7159.json create mode 100644 tests/integration/recordings/responses/dee1518c6628.json create mode 100644 tests/integration/recordings/responses/f23defea82ec.json create mode 100644 tests/integration/recordings/responses/fbc7b626714d.json diff --git a/tests/integration/inference/test_openai_embeddings.py b/tests/integration/inference/test_openai_embeddings.py index ff18c0418..0598919a1 100644 --- a/tests/integration/inference/test_openai_embeddings.py +++ b/tests/integration/inference/test_openai_embeddings.py @@ -44,6 +44,7 @@ def skip_if_model_doesnt_support_encoding_format_base64(client, model_id): "remote::together", # param silently ignored, always returns floats "remote::databricks", # param silently ignored, always returns floats "remote::fireworks", # param silently ignored, always returns list of floats + "remote::ollama", # param silently ignored, always returns list of floats ): pytest.skip(f"Model {model_id} hosted by {provider.provider_type} does not support encoding_format='base64'.") diff --git a/tests/integration/recordings/responses/4d438c6bbaed.json b/tests/integration/recordings/responses/4d438c6bbaed.json new file mode 100644 index 000000000..f5e4809dd --- /dev/null +++ b/tests/integration/recordings/responses/4d438c6bbaed.json @@ -0,0 +1,422 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": [ + "What makes Python different from C++ and Java?" + ], + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.10118824, + 0.03903895, + -0.013634503, + -0.007292888, + -0.029636545, + -0.084174395, + -0.09112228, + 0.04528188, + -0.014384496, + -0.0319548, + -0.05629092, + 0.007849695, + 0.04510336, + 0.016430292, + 0.03918052, + -0.117774546, + -0.03887417, + -0.001986278, + 0.024091367, + -0.065562785, + -0.017041149, + -0.019297333, + -0.021055115, + -0.05226532, + 0.091480814, + 0.015253761, + -0.001796204, + -0.040122062, + 0.009265925, + 0.0020377012, + -0.010954453, + 0.04418117, + 0.021545967, + -0.013009354, + -0.06874439, + 0.021751178, + -0.0032608712, + -0.08501772, + -0.053137373, + -0.015450434, + -0.085525215, + 0.07160664, + -0.05478504, + 0.0016480179, + -0.07703412, + 0.034932982, + -0.013334636, + 0.0048056873, + -0.017465629, + -0.023633484, + -0.06934235, + 0.039600387, + -0.06340865, + -0.08479012, + -0.008927469, + -0.009415297, + 0.021252826, + 0.028662452, + -0.0071771694, + -0.10053554, + -0.08403626, + 0.0006694508, + 0.049527504, + 0.091747105, + -0.040061295, + -0.08370871, + 0.0113953585, + 0.02787908, + 0.08032625, + -0.08153772, + -0.1382779, + 0.0020262296, + -0.013319839, + 0.06469724, + 0.011705844, + -0.06847945, + -0.008103585, + -0.007311759, + -0.049259696, + -0.01681834, + -0.0023633156, + 0.04625241, + -0.09155687, + 0.070435375, + 0.047461532, + -0.033975255, + 0.030877052, + 0.06223708, + -0.075257495, + 0.022192439, + 0.072569355, + -0.05940421, + -0.016665697, + 0.027913835, + -0.03033027, + 0.026433375, + -0.024091143, + 0.027967717, + 0.0018184112, + 0.005459501, + 0.01782243, + -0.05497604, + 0.10015024, + 0.060212452, + 0.095859, + 0.0045665796, + 0.022342399, + -0.0730747, + 0.07155068, + -0.005780182, + -0.027565235, + -0.07226932, + 0.0022492912, + -0.056467265, + 0.056729913, + 0.04964385, + -0.0359193, + 0.073877, + 0.01857968, + -0.020147907, + 0.025378013, + -0.03853255, + 0.0004536945, + -0.0197987, + -0.052165885, + 0.08353086, + -0.0831229, + -3.4495407e-33, + -7.5219294e-05, + -0.10703243, + 0.00059167214, + 0.022338398, + 0.0678739, + -0.009247927, + 0.010432039, + 0.06904043, + 0.008255852, + -0.027097296, + -0.020995656, + 0.051348615, + 0.021222726, + 0.103795454, + 0.051715724, + -0.016371982, + -0.005419388, + 0.018027242, + -0.012436884, + -0.016733842, + 0.02889153, + 0.030293668, + 0.052271575, + 0.07004435, + 0.03884479, + -0.012782247, + 0.010923908, + 0.009464883, + -0.031190552, + 0.012386214, + -0.04372491, + -0.06606855, + -0.048366148, + 0.061396204, + 0.04782467, + 0.03706411, + -0.0107052075, + -0.11111459, + 0.010835082, + -0.056167886, + -0.06988011, + -0.0075372676, + 0.017734634, + -0.05035381, + -0.001275386, + 0.014617504, + -0.02860837, + -0.037023265, + -0.12981883, + 0.011362826, + 0.016434444, + 0.024155455, + 0.06692448, + 0.11011648, + 0.00242381, + 0.029336166, + 0.06456758, + 0.025459351, + -0.06523983, + -0.003042015, + -0.014494944, + 0.17165202, + 0.09502477, + 0.004603603, + 0.03468188, + 0.08069984, + 0.028353227, + 0.078386195, + 0.0052070855, + 0.10746326, + 0.0007272075, + 0.048997436, + -0.026183812, + 0.024859238, + 0.019962046, + 0.0024938937, + -0.0088306535, + -0.12398559, + 0.013511732, + 0.01252341, + -0.06526936, + 0.0025227254, + 0.012404745, + -0.052903768, + -0.060306206, + -0.06609536, + 0.02255224, + 0.034741614, + 0.07141327, + -0.042214733, + -0.046732914, + -0.013089334, + 0.050667133, + 0.009732704, + -0.065844536, + -7.632026e-34, + -0.04897036, + 0.0010008155, + -0.027726196, + -0.0041715573, + -0.0784953, + -0.014502005, + -0.0032161039, + -0.0036510653, + 0.0063989596, + -0.0049795345, + -0.025816346, + -0.057969686, + 0.089522816, + 0.03228869, + 0.09730419, + 0.014945059, + -0.09055132, + 0.048780665, + 0.017307585, + 0.001894757, + -0.018043697, + 0.076129794, + -0.03805571, + -0.033610735, + 0.024954053, + -0.021428565, + -0.089604266, + -0.017775265, + -0.0053226994, + 0.0390506, + 0.03933108, + 0.09031938, + -0.08847496, + 0.018907558, + 0.044635687, + -0.022590302, + -0.032498624, + -0.025523473, + 0.025916386, + -0.0015925332, + 0.12204004, + 0.0071080993, + 0.091284856, + 0.088366255, + 0.02900987, + 0.053944837, + -0.025523532, + 0.07882233, + 0.021127652, + -0.10109029, + 0.017844606, + 0.036310278, + 0.05826466, + -0.039195944, + -0.009919533, + -0.034366168, + 0.049801596, + 0.053652726, + -0.06546624, + -0.009100376, + -0.045472123, + -0.076298825, + 0.049355358, + 0.004085976, + -0.049639836, + 0.036183506, + -0.04978166, + -0.01432043, + -0.048737127, + -0.13183917, + 0.09263645, + 0.023257703, + -0.015932027, + 0.012102949, + -0.067271985, + 0.024819551, + -0.00095338933, + 0.005278276, + -0.034407213, + 0.048385736, + 0.015527778, + 0.03753987, + -0.029208956, + 0.035676524, + -0.08918091, + 0.03421899, + -0.0790197, + -0.029945001, + -0.0045615, + -0.0059501184, + 0.02928693, + 0.09815437, + -0.033618566, + 0.015624564, + -0.018528337, + -1.6825586e-08, + 0.055643573, + 0.00905882, + 0.0065201567, + 0.012434381, + 0.044175223, + 0.0383832, + -0.040846422, + -0.010427501, + -0.0080066, + 0.01712656, + -0.036492564, + -0.00024521624, + -0.07382413, + -0.059322976, + 0.01264377, + 0.086423, + -0.06100275, + -0.059789356, + 0.009266419, + 0.07025341, + 0.050013755, + -0.018513031, + -0.07250875, + 0.11642345, + -0.09448821, + -0.044915877, + 0.0534502, + 0.01637104, + 0.036045168, + -0.037487727, + 0.0030642638, + 0.0030473603, + -0.050864283, + 0.030525306, + -0.0034795292, + -0.006219593, + 0.029881494, + -0.0397122, + -0.041857515, + 0.022612296, + -0.037165, + -0.009100636, + -0.008052333, + 0.006499901, + 0.04141586, + 0.03798403, + -0.044131294, + -0.01770224, + -0.07094963, + -0.02103003, + -0.012339185, + 0.011356932, + 0.07049362, + -0.058278922, + 0.034775678, + 0.018039506, + -0.12438333, + -0.05090711, + 0.006098656, + 0.05028239, + -0.0049530324, + -0.015935287, + 0.18108557, + 0.023910096 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 11, + "total_tokens": 11 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/4ebcaf6c2aee.json b/tests/integration/recordings/responses/4ebcaf6c2aee.json new file mode 100644 index 000000000..41dc9ab1a --- /dev/null +++ b/tests/integration/recordings/responses/4ebcaf6c2aee.json @@ -0,0 +1,53 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": "Test dimensions parameter", + "encoding_format": "base64", + "dimensions": 16 + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.253706, + 0.016367152, + -0.29664654, + 0.31654558, + -0.18624601, + 0.07602756, + -0.031531323, + 0.2986085, + -0.49672848, + -0.36617878, + 0.25328273, + -0.33349335, + 0.0060151755, + 0.14081024, + -0.13757885, + -0.14679416 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 3, + "total_tokens": 3 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/4f00cf740aba.json b/tests/integration/recordings/responses/4f00cf740aba.json new file mode 100644 index 000000000..85a5e18fb --- /dev/null +++ b/tests/integration/recordings/responses/4f00cf740aba.json @@ -0,0 +1,420 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": "Hello, world!", + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.038157914, + 0.03290493, + -0.0055371798, + 0.014353213, + -0.040209096, + -0.11667767, + 0.03170551, + 0.0019347348, + -0.04254092, + 0.029190615, + 0.042559944, + 0.032130145, + 0.02983921, + 0.010979105, + -0.053759154, + -0.05030495, + -0.023470305, + 0.010730486, + -0.1377361, + 0.0039985846, + 0.029267203, + 0.066698566, + -0.015405643, + 0.04843479, + -0.0881545, + -0.012694429, + 0.041265942, + 0.04089442, + -0.05000745, + -0.05805947, + 0.048748765, + 0.06891688, + 0.058812816, + 0.008785837, + -0.016080279, + 0.08517403, + -0.07814158, + -0.077435054, + 0.020808736, + 0.016186161, + 0.032549612, + -0.05344129, + -0.062166847, + -0.0242584, + 0.007393759, + 0.024064584, + 0.0064619263, + 0.051204458, + 0.072843835, + 0.034658417, + -0.05477693, + -0.05941287, + -0.007262739, + 0.020149412, + 0.035835978, + 0.0056162532, + 0.010803632, + -0.052724347, + 0.010110615, + -0.0087345, + -0.06285489, + 0.038390912, + -0.013975588, + 0.0734118, + 0.090072334, + -0.07995426, + -0.016420014, + 0.044813525, + -0.06888206, + -0.033037275, + -0.015467736, + 0.01130628, + 0.036483694, + 0.0663459, + -0.054344203, + 0.008723171, + 0.012078509, + -0.038129516, + 0.006938081, + 0.051155496, + 0.07745829, + -0.122897476, + 0.01635594, + 0.04956378, + 0.031677794, + -0.03963372, + 0.0016560612, + 0.0095810415, + -0.032620687, + -0.03396473, + -0.13327733, + 0.0072318353, + -0.010225149, + 0.038535405, + -0.09343492, + -0.04173385, + 0.06996305, + -0.026312327, + -0.14973918, + 0.13443227, + 0.03750676, + 0.052842483, + 0.045053005, + 0.018721534, + 0.05443072, + 0.017290117, + -0.03255681, + 0.046160772, + -0.046711024, + -0.030576464, + -0.018258592, + -0.048711784, + 0.033041865, + -0.003856249, + 0.05003307, + -0.05821012, + -0.00994153, + 0.0106995255, + -0.04008794, + -0.0015539092, + 0.060838487, + -0.04559896, + 0.04924722, + 0.026119638, + 0.019796783, + -0.0016312932, + 0.05955464, + -6.527786e-33, + 0.063555494, + 0.003072545, + 0.0290068, + 0.17338625, + 0.0029474646, + 0.027745575, + -0.095103905, + -0.031165987, + 0.026719859, + -0.010799976, + 0.023851028, + 0.02375357, + -0.031152952, + 0.049497593, + -0.025005657, + 0.10176666, + -0.079190366, + -0.0032479328, + 0.042849813, + 0.09489888, + -0.066508934, + 0.00632239, + 0.022188535, + 0.06996212, + -0.007491268, + -0.001777037, + 0.027047161, + -0.07536194, + 0.11401931, + 0.008564227, + -0.02371391, + -0.046974454, + 0.0144310715, + 0.019899534, + -0.0046927175, + 0.0013119543, + -0.03432107, + -0.054212432, + -0.09418897, + -0.028963951, + -0.018907014, + 0.045735538, + 0.04757043, + -0.003132595, + -0.033231355, + -0.013520351, + 0.051010653, + 0.03111525, + 0.015257217, + 0.054166727, + -0.085080594, + 0.013355202, + -0.04763934, + 0.07099156, + -0.01309272, + -0.0023823304, + 0.050339438, + -0.041624993, + -0.014171974, + 0.032421313, + 0.005414455, + 0.09128853, + 0.0045168963, + -0.018196244, + -0.015225792, + -0.04635148, + 0.038764603, + 0.014739169, + 0.052030377, + 0.0017809072, + -0.014930553, + 0.027100598, + 0.031190928, + 0.02379928, + -0.0045879, + 0.03622444, + 0.066800386, + -0.0018508516, + 0.021243243, + -0.0575494, + 0.019077979, + 0.031474162, + -0.018456634, + -0.04083116, + 0.10387791, + 0.011981423, + -0.014923204, + -0.10519511, + -0.012293124, + -0.00042049217, + -0.09506704, + 0.058275525, + 0.042611193, + -0.025061507, + -0.094545335, + 4.010606e-33, + 0.13226718, + 0.0053517097, + -0.03314567, + -0.09099676, + -0.031551942, + -0.033939674, + -0.071981214, + 0.12595285, + -0.08333936, + 0.052855294, + 0.001036374, + 0.021973396, + 0.104020424, + 0.013031712, + 0.040921222, + 0.018695012, + 0.114233166, + 0.024822846, + 0.014595918, + 0.00621894, + -0.011220824, + -0.035742316, + -0.03801776, + 0.011226576, + -0.051305167, + 0.007892534, + 0.06734842, + 0.0033567564, + -0.09286571, + 0.03701943, + -0.022331072, + 0.040051647, + -0.030764744, + -0.011390678, + -0.014426033, + 0.024999708, + -0.09751172, + -0.03538673, + -0.03757043, + -0.010174254, + -0.06396341, + 0.025548752, + 0.020661479, + 0.03752242, + -0.10438308, + -0.028266912, + -0.052153755, + 0.012830027, + -0.05125152, + -0.029009243, + -0.09633578, + -0.042322997, + 0.06716196, + -0.030903742, + -0.010314011, + 0.027343867, + -0.028119028, + 0.010296558, + 0.043072425, + 0.022286164, + 0.007943, + 0.056093868, + 0.040728126, + 0.09295372, + 0.016456816, + -0.053744446, + 0.00047035623, + 0.050744157, + 0.04246857, + -0.029237023, + 0.009294763, + -0.010624897, + -0.037202932, + 0.00220195, + -0.030278567, + 0.07457478, + 0.0026277148, + -0.017591486, + 0.0028708735, + 0.03840644, + 0.0072204536, + 0.045653794, + 0.039947055, + 0.014161398, + -0.014247232, + 0.058465447, + 0.036360227, + 0.055268615, + -0.02004829, + -0.08043532, + -0.030213723, + -0.0148566915, + 0.022293866, + 0.011908896, + -0.06907556, + -1.8805048e-08, + -0.078408636, + 0.046699222, + -0.023894435, + 0.06347232, + 0.02395583, + 0.0014103559, + -0.090737104, + -0.06684135, + -0.080118775, + 0.0054891296, + 0.05368204, + 0.10478211, + -0.066875115, + 0.015525915, + 0.06710851, + 0.07083251, + -0.03199485, + 0.020825442, + -0.021920865, + -0.0072890157, + -0.01058703, + 0.004174248, + 0.033155944, + -0.07901077, + 0.038750935, + -0.07521113, + -0.015731987, + 0.005987591, + 0.0051212795, + -0.061557226, + 0.04203319, + 0.09544439, + -0.04317485, + 0.014446859, + -0.10614051, + -0.028011814, + 0.01101727, + 0.069552526, + 0.0669063, + -0.0747214, + -0.078444764, + 0.042728573, + -0.034634914, + -0.106056124, + -0.0357495, + 0.05155015, + 0.068699375, + -0.049968246, + 0.015420614, + -0.06460179, + -0.07601102, + 0.026022797, + 0.07440251, + -0.0124161495, + 0.1332999, + 0.07480527, + 0.051343314, + 0.02094546, + -0.026808253, + 0.08892536, + 0.03996125, + -0.041000355, + 0.03187991, + 0.018108707 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 4, + "total_tokens": 4 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/517505777888.json b/tests/integration/recordings/responses/517505777888.json new file mode 100644 index 000000000..f556ba743 --- /dev/null +++ b/tests/integration/recordings/responses/517505777888.json @@ -0,0 +1,420 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": "Test encoding format", + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.019099757, + -0.020513054, + -0.07147724, + -0.02305817, + -0.06570441, + -0.0057285326, + -0.029366547, + -0.031833924, + -0.015779832, + -0.03914512, + 0.02689602, + -0.064181775, + 0.013521624, + 0.050362427, + -0.031129995, + -0.08321027, + -0.031968866, + 0.074996136, + -0.016394366, + -0.0013953616, + 0.038505327, + -0.03440395, + -0.004868513, + -0.03093635, + 0.051909875, + 0.0091652395, + 0.0072081746, + 0.066338904, + 0.024595087, + -0.047721148, + 0.0376462, + -0.04257363, + 0.078928985, + 0.048257265, + 0.1338569, + 0.013975464, + 0.03242688, + -0.08888101, + -0.0141724255, + 0.035531398, + -0.024727112, + -0.028608425, + 0.047635823, + 0.026230432, + 0.048455644, + 0.066589415, + -0.013602744, + 0.07181793, + -0.073052436, + -0.05030391, + 0.0039422787, + 0.033050794, + -0.047844775, + -0.017648827, + 0.010261714, + -0.105268046, + -0.010029887, + 0.014589762, + -0.05330117, + 0.0603304, + -0.10082026, + 0.0113420375, + -0.007233272, + 0.053468946, + -0.006834623, + 0.036973044, + 0.024037901, + 0.02391513, + -0.011360713, + -0.119559266, + -0.115714155, + -0.06674816, + -0.042340416, + 0.09301382, + 0.024868665, + 0.08405043, + 0.0030069647, + -0.06605422, + 0.027435942, + -0.03239928, + -0.025572078, + -0.06587331, + 0.0678087, + 0.09763614, + 0.07363481, + 0.034110706, + 0.056513038, + 0.07671608, + -0.05176071, + 0.05367774, + 0.00541266, + 0.015987717, + 0.0035527307, + 0.063338846, + -0.015986515, + 0.052941773, + 0.11543519, + 0.05519716, + 0.037675396, + 0.08086703, + 0.035557747, + -0.07983684, + -0.012073549, + -0.076086745, + -0.06961062, + -0.017908957, + 0.1699312, + -0.0047792625, + 0.090708405, + -0.071956836, + 0.020046378, + -0.05956393, + -0.06314912, + -0.07718947, + 0.015107324, + -0.05031658, + -0.05448986, + -0.023088248, + -0.035414543, + -0.030637579, + -0.053294946, + -0.06745031, + -0.08055133, + 0.0028445483, + -0.011376515, + -0.029895633, + 0.024240365, + -1.5095563e-33, + -0.029858422, + -0.00030224613, + 0.0030705915, + 0.023098653, + -0.04807201, + -0.0027389736, + -0.03748221, + 0.016176483, + -0.029994667, + 0.015707478, + 0.0096614035, + -0.039872784, + -0.029488137, + 0.03840971, + -0.0052404203, + 0.06854292, + -0.007897781, + -0.0018805856, + -0.0352267, + 0.036267247, + 0.05868197, + 0.023763478, + 0.044439625, + -0.02601301, + -0.025314424, + -0.02679121, + -0.023682553, + -0.09437374, + 0.0016686164, + 0.0065181926, + -0.097118795, + -0.053507585, + -0.08239408, + 0.023490923, + -0.02402227, + 0.015966628, + 0.0050696856, + 0.030458245, + -0.08839895, + 0.11425429, + 0.028386213, + 0.0298561, + 0.02285531, + 0.01873392, + 0.05632994, + -0.020208938, + -0.0006685065, + -0.08638551, + 0.020276291, + -0.0039841584, + 0.0009751431, + 0.06544227, + -0.03650517, + 0.032318577, + 0.023104826, + 0.04446683, + 0.09645086, + -0.072731785, + 0.033722512, + 0.042799864, + -0.05276349, + 0.00033437353, + 0.061005846, + -0.019637244, + -0.02327577, + -0.1160437, + 0.007917702, + -0.12529376, + 0.017027825, + 0.013484424, + -0.030528279, + -0.024288423, + 0.006258758, + -0.015579525, + -0.07281456, + 0.012983996, + 0.01599799, + 0.0051952074, + -0.002588768, + -0.059567206, + 0.063699834, + -0.0019145603, + 0.018687418, + -0.009282711, + -0.05884746, + -0.03251431, + -0.0095772855, + -0.047396615, + 0.020575106, + -0.0071638324, + 0.050119117, + 0.016082546, + -0.0058797863, + -0.07660506, + 0.082072616, + 1.6049304e-33, + -0.0056975842, + 0.06717823, + -0.01155973, + 0.055897184, + -0.08883816, + -0.03651865, + 0.12133234, + 0.028983265, + 0.022465894, + 0.047318526, + 0.07625107, + -0.07938655, + 0.0020323857, + -0.023503296, + -0.029780442, + -0.048816763, + -0.034901213, + 0.06463424, + 0.05149456, + 0.008271398, + -0.031762894, + 0.097970895, + 0.008115042, + 0.010324485, + 0.059439637, + 0.051759075, + 0.04295602, + 0.006951762, + 0.027330121, + 0.039248228, + 0.062386345, + 0.05181691, + 0.0053548445, + 0.059656292, + -0.008941856, + -0.013595369, + 0.08731477, + 0.028409526, + -0.0068070823, + 0.052146304, + 0.04951788, + 0.055161525, + -0.016772978, + 0.07788952, + 0.02612108, + 0.031371117, + 0.011792192, + -0.034147624, + 0.052822903, + 0.0035044928, + 0.098160714, + 0.029717103, + -0.031353023, + -0.012088347, + 0.018629983, + -0.03261934, + -0.09641058, + 0.033934057, + -0.078907624, + -0.008301054, + -0.04919879, + 0.0200944, + 0.061727397, + -0.018450737, + -0.033557754, + -0.09088319, + 0.021116594, + -0.022466624, + -0.011860241, + -0.04879352, + 0.04824181, + -0.0729504, + -0.021986347, + 0.062490568, + 0.02329735, + -0.052139174, + -0.05413272, + 0.062326364, + 0.052311692, + 0.051399846, + -0.024238104, + -0.018776463, + -0.01662191, + 0.093347155, + 0.00853553, + 0.06343568, + 0.0193722, + 0.047052696, + -0.0058736033, + -0.0034484447, + 0.079545766, + 0.102156945, + 0.015278317, + 0.040921766, + 0.038883872, + -1.2710007e-08, + -0.019322075, + -0.12182595, + -0.04798032, + -0.05338353, + -0.113173604, + 0.05179994, + -0.104975395, + -0.08526829, + 0.0062153414, + -0.029902961, + 0.064573385, + -0.028757203, + -0.06474069, + -0.024915313, + 0.002619679, + -0.008791377, + 0.03023946, + 0.009847454, + 0.004436367, + 0.085081235, + -0.026139142, + 0.11358947, + -0.004590704, + -0.03662597, + -0.09077296, + 0.081458576, + 0.012074041, + 0.07286008, + 0.004093267, + -0.050678167, + 0.06875128, + 0.029115168, + 0.014813955, + -0.11862927, + -0.0504244, + 0.053776395, + 0.04568957, + 0.07408053, + 0.02851353, + 0.039401993, + 0.029147856, + -0.035721682, + -0.091308504, + -0.047723882, + -0.00082008925, + -0.073683135, + 0.010977384, + 0.015688991, + -0.035924956, + -0.0811892, + 0.020371897, + -0.045275442, + -0.024963016, + 0.0011709725, + 0.00041111733, + -0.026408581, + -0.03244672, + 0.0034135028, + -0.0070261946, + 0.024263272, + 0.07635933, + 0.03955913, + 0.036027964, + -0.07081866 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 3, + "total_tokens": 3 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/58c8091104ff.json b/tests/integration/recordings/responses/58c8091104ff.json new file mode 100644 index 000000000..a0625b0c3 --- /dev/null +++ b/tests/integration/recordings/responses/58c8091104ff.json @@ -0,0 +1,56 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "llama3.2:3b-instruct-fp16", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "max_tokens": 10 + }, + "endpoint": "/v1/chat/completions", + "model": "llama3.2:3b-instruct-fp16" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "chatcmpl-981", + "choices": [ + { + "finish_reason": "length", + "index": 0, + "logprobs": null, + "message": { + "content": "Hello! It's nice to meet you. Is", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": null + } + } + ], + "created": 1758712191, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": { + "completion_tokens": 10, + "prompt_tokens": 26, + "total_tokens": 36, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/590d43ed64b8.json b/tests/integration/recordings/responses/590d43ed64b8.json new file mode 100644 index 000000000..136f240d3 --- /dev/null +++ b/tests/integration/recordings/responses/590d43ed64b8.json @@ -0,0 +1,420 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": "This is completely different content", + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.050928835, + 0.03843035, + -0.055596404, + -0.1059845, + 0.06945118, + -0.08052125, + -0.025887776, + -0.045172054, + 0.06875915, + 0.01652947, + -0.0011730668, + 0.023417989, + -0.0033977597, + 0.06804529, + -0.022007054, + -0.014133858, + 0.12357166, + -0.06538498, + -0.08264784, + 0.042988714, + -0.039530188, + 0.05546846, + -0.008847637, + 0.020928107, + 0.016257003, + 0.0963241, + -0.022833107, + 0.09176138, + 0.06406277, + -0.062280413, + 0.010846775, + 0.07830326, + 0.08847168, + -0.008453102, + -0.075440355, + 0.048030853, + 0.0042642253, + 0.037893716, + 0.0023323877, + 0.032253597, + 0.0047477684, + -0.07042877, + -0.0651552, + 0.061071083, + 0.021506561, + 0.10113442, + -0.07538611, + -0.0407162, + -0.0055698017, + -0.003700082, + -0.021267522, + -0.018197505, + -0.033238053, + -0.015680185, + 0.0032980912, + 0.037441716, + -0.02103593, + 0.052548602, + 0.10207184, + -0.018667448, + 0.036124475, + 0.08958934, + 0.050691247, + 0.019807478, + 0.102209404, + -0.0590646, + -0.045566943, + -0.024122052, + -0.059902284, + -0.097920865, + -0.0020646898, + 0.032239985, + 0.048603263, + 0.080615476, + 0.022587052, + 0.0005647973, + -0.0015346111, + 0.009996407, + -0.08974319, + 0.023848958, + -0.0152271725, + -0.020556787, + 0.085268654, + -0.080245204, + -0.0021987888, + 0.064997524, + -0.023079548, + -0.061999504, + -0.06548528, + -0.029944805, + 0.004539428, + 0.09720334, + 0.09151462, + -0.0059590363, + -0.04822175, + -0.011798011, + -0.031697348, + -0.010327684, + 0.02968527, + 0.103371136, + -0.029089179, + 0.0055756853, + -0.030742139, + -0.011057862, + -0.03863044, + -0.015891504, + 0.00083265523, + 0.03479572, + 0.0039244313, + -0.020057123, + -0.048189417, + 0.026513426, + -0.061180107, + -0.04695217, + 0.021450046, + -0.04841946, + 0.022005452, + 0.015729656, + 0.056378406, + 0.055330493, + 0.037143476, + -0.088711694, + 0.011780864, + 0.0064585637, + -0.020630004, + -0.05936413, + 0.012287869, + -2.4293852e-33, + 0.06838332, + -0.053025596, + 0.011507658, + 0.06950136, + 0.01331995, + 0.0020193695, + -0.02080692, + 0.028949803, + 0.034665402, + -0.0327198, + 0.000949148, + 0.008664251, + 0.0076103383, + -0.024554089, + 0.030275982, + -0.034142904, + -0.031511948, + 0.11051145, + 0.034964334, + 0.045093905, + 0.0004536878, + 0.0514407, + 0.015040795, + -0.008992289, + 0.023123777, + 0.051383648, + -0.004154813, + 0.0047568153, + -0.016239677, + -0.025685828, + -0.02406427, + -0.009563573, + 0.050677244, + -0.058350526, + 0.049024463, + 0.079643525, + 0.036008406, + -0.06540527, + -0.035393585, + -0.07027483, + -0.009768918, + -0.0318898, + -0.04104297, + -0.041093245, + -0.036317065, + 0.06686649, + 0.016687784, + -0.048496265, + -0.015432587, + -0.0004885036, + 0.032693844, + -0.0108784195, + 0.016624164, + -0.057286467, + 0.008053993, + 0.008824837, + -0.061545905, + -0.0108399745, + 0.07171203, + 0.08609233, + 0.014049224, + 0.014907912, + -0.09828269, + -0.046647478, + 0.03361861, + 0.064744, + -0.007506857, + 0.025442023, + 0.04172483, + -0.033108808, + -0.01457406, + 0.024897074, + 0.04562778, + -0.042942565, + -0.040469114, + -0.06307098, + -0.02242408, + 0.010597915, + -0.03252762, + -0.03145859, + 0.00820347, + 0.021108724, + 0.009504359, + -0.08292171, + -0.02136818, + 0.008753057, + 0.06017692, + -0.062192526, + 0.0045083114, + 0.056810796, + -0.012999816, + 0.01868933, + -0.008973792, + -0.076788835, + 0.051616713, + 1.6926322e-33, + -0.12587416, + 0.011702123, + -0.07986232, + 0.023053063, + 0.029265704, + 0.08719514, + 0.06907015, + 0.03254812, + 0.047793373, + 0.13217501, + 0.031299006, + -0.012535935, + 0.0035618816, + -0.0163916, + -0.03853783, + 0.01597904, + 0.09169072, + 0.04756113, + -0.054968182, + 0.067977056, + 0.017965809, + 0.11863936, + -0.0693313, + 0.043811284, + 0.041538227, + -0.017813183, + 0.051730298, + 0.067949936, + 0.080519445, + 0.0053662807, + 0.088820346, + -0.036024984, + -0.077107176, + -0.09097472, + -0.09598897, + -0.09376241, + -0.06202675, + 0.06723746, + -0.00064578716, + 0.029109621, + 0.08179942, + -0.06487821, + -0.050387383, + -0.0023782111, + -0.026097134, + -0.0076310094, + 0.011977006, + -0.08573459, + 0.041102324, + 0.024716543, + -0.022249049, + -0.11560483, + 0.0067691505, + -0.045894623, + -0.0637051, + 0.05357708, + 0.00577345, + 0.06321221, + 0.004861166, + -0.05710446, + 0.04190449, + 0.022335436, + -0.1471083, + 0.026351552, + 0.10623104, + -0.005882123, + 0.019992633, + 0.034953646, + -0.03338853, + -0.038839623, + -0.076065235, + -0.11174125, + -0.038965553, + -0.102677576, + 0.04711777, + -0.049392425, + 0.07477134, + 0.04174287, + -0.031087497, + 0.0033754015, + 0.055780858, + -0.03184862, + -0.02541985, + 0.05011349, + 0.03596857, + 0.091428444, + -0.07583281, + -0.050592963, + 0.0074175335, + -0.0013578966, + -0.050366234, + -0.0015045146, + 0.0054275827, + 0.07685381, + 0.014169269, + -1.8297998e-08, + 0.029916301, + -0.057940822, + -0.06847671, + 0.026218578, + -0.0034848938, + 0.113768935, + 0.056854554, + -0.093155205, + 0.0028038986, + 0.10895503, + -0.033018846, + 0.0050494163, + -0.043625794, + -0.048996136, + 0.0118943965, + 0.059736334, + -0.08662527, + -0.052732464, + 0.026333557, + 0.042200398, + -0.0035924676, + 0.037994288, + 0.022570506, + -0.061503205, + 0.012634007, + 0.040854853, + -0.084876895, + 0.041194208, + -0.038179893, + 0.008360482, + 0.010148832, + 0.024984034, + -0.012506054, + -0.045101274, + 0.010266152, + -0.046285193, + 0.061415587, + 0.016212178, + -0.0011856663, + 0.0074200486, + -0.019432405, + -0.068008475, + 0.05477893, + 0.0964552, + -0.04710964, + 0.060082186, + 0.003054353, + -0.08875195, + 0.03727946, + -0.0099389665, + 0.003561616, + -0.07834196, + 0.021697106, + -0.013061282, + 0.0725091, + -0.06500139, + -0.029938946, + -0.017758802, + 0.033857197, + 0.029207738, + 0.08792652, + 0.00846041, + 0.06444677, + -0.016519535 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 5, + "total_tokens": 5 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/63aa4590a38a.json b/tests/integration/recordings/responses/63aa4590a38a.json new file mode 100644 index 000000000..9e3b275db --- /dev/null +++ b/tests/integration/recordings/responses/63aa4590a38a.json @@ -0,0 +1,421 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": "Test user parameter", + "encoding_format": "base64", + "user": "test-user-123" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.043770123, + 0.021501394, + -0.081300564, + 0.010615138, + -0.07908651, + -0.03219175, + 0.13090447, + 0.042329222, + -0.11600146, + -0.07588096, + 0.041826088, + -0.080617175, + 0.038125783, + -0.01069657, + 0.01577377, + -0.04196888, + 0.043099895, + -0.033355612, + 0.013571747, + -0.0103924, + 0.015561896, + -0.03786113, + -0.050319925, + -0.02566629, + -0.047868017, + -0.08717805, + 0.01685358, + -0.03676223, + 0.0063788705, + 0.020863743, + 0.11264443, + -0.0021451844, + -0.07911777, + 0.038758967, + 0.115321144, + -0.019753717, + 0.0067159277, + -0.02115779, + -0.0144774495, + -0.0027154125, + -0.034384295, + -0.052576542, + -0.030578543, + 0.04745372, + -0.024294367, + 0.01091144, + -0.03947583, + 0.07183755, + -0.020715859, + 0.018965777, + 0.04292474, + -0.007755194, + 0.0025708016, + -0.058263537, + 0.0117485095, + -0.022703577, + 0.001755438, + -0.012628832, + 0.030728007, + 0.017719304, + -0.061525322, + -0.036568273, + 0.025831668, + 0.025376469, + 0.012137967, + 0.009102949, + -0.027313529, + -0.093379095, + 0.0052120173, + 0.0074658697, + -0.07538, + 0.010161349, + -0.028439516, + 0.03026334, + 0.0036700817, + -0.022599109, + -0.037862476, + -0.08384314, + -0.0124443015, + -0.048889726, + 0.029131662, + -0.044443335, + -0.07518736, + -0.020938978, + 0.063386515, + 0.16294138, + 0.060580015, + -0.01281573, + -0.031040885, + 0.018372353, + 0.11225789, + 0.072922915, + -0.06272038, + -0.031792488, + -0.017476005, + 0.04846264, + -0.04116229, + -0.041834168, + -0.059919056, + 0.15907861, + -0.027786179, + -0.012492541, + 0.05599519, + -0.019895995, + 0.022076221, + 0.006363836, + 0.046413723, + -0.0731325, + 0.03326452, + 0.059475966, + -0.033314705, + 0.030761855, + 0.00819013, + -0.020254606, + 0.05658313, + -0.08153619, + 0.023402533, + 0.0060753864, + -0.07993489, + 0.013990512, + 0.052254565, + 0.027170746, + -0.049271967, + 0.02814688, + 0.019500777, + 0.054206643, + 0.082691684, + -1.8817448e-33, + 0.013630832, + -0.010863344, + 0.015899567, + 0.06938339, + -0.05113185, + 0.08995833, + 0.04450505, + 0.08101549, + 0.018903807, + -0.020960161, + -0.017933648, + -0.02174221, + 0.010988686, + 0.015100026, + 0.017031211, + 0.09433042, + 0.003454907, + 0.010199729, + -0.0446973, + 0.0018167854, + 0.015817188, + -0.06576281, + -0.004943305, + 0.004393494, + -0.019598262, + -0.092797264, + -0.025917865, + 0.04409669, + 0.054165967, + -0.007365383, + -0.021470547, + -0.03683317, + -0.091507494, + 0.08402351, + -0.01809901, + 0.0038072586, + 0.020236026, + 0.0439697, + -0.077322714, + 0.0057473024, + -0.054513566, + -0.024854423, + 0.075270385, + 0.034554463, + -0.08118007, + -0.12208905, + -0.0052893, + 0.0078005046, + 0.05028763, + 0.015558154, + -0.056349996, + 0.0398076, + 0.012997719, + -0.040145177, + 0.014409028, + -0.033200737, + -0.008437484, + -0.037582297, + -0.019651853, + 0.017285295, + -0.008976723, + -0.0018494898, + -0.0030671947, + 0.03046138, + -0.051143825, + -0.08688155, + -0.018344227, + -0.113307714, + 0.073259674, + 0.04602224, + 0.012651309, + -0.063435435, + -0.028471926, + 0.020155901, + -0.078830436, + -0.00069818215, + -0.03156303, + 0.123062745, + 0.0042949035, + -0.026413191, + 0.07838535, + -0.07747411, + -0.02126005, + 0.048919026, + 0.02919413, + -0.009296978, + -0.030687347, + -0.041037664, + -0.038565576, + -0.08043238, + 0.023225678, + 0.041928973, + -0.05812511, + 0.058555346, + 0.07633673, + 4.4510456e-34, + -0.019582625, + 0.040237214, + 0.01455587, + 0.034353998, + 0.043911777, + -0.023234777, + 0.0677493, + -0.030089214, + -0.09076478, + -0.019257858, + -0.02767876, + -0.00065146026, + 0.0043030144, + 0.05363546, + 0.04073387, + 0.03255476, + -0.10712685, + -0.050083157, + -0.016644027, + -0.0077649173, + -0.11153465, + 0.07478277, + -0.015999233, + -0.050547555, + -0.113217294, + -0.006174145, + 0.050873067, + -0.030284155, + 0.04314861, + 0.033020362, + 0.023671353, + 0.04654029, + -0.03415647, + 0.03614603, + 0.023047049, + -0.02677317, + 0.063607745, + 0.09978129, + 0.03527302, + 0.15538219, + 0.08349002, + 0.10931568, + 0.04684532, + -0.010147538, + -0.03256112, + 0.12924333, + 0.031221064, + -0.099673584, + 0.010860566, + 0.02326085, + -0.011916549, + 0.010135849, + 0.06884636, + 0.009350001, + -0.0226591, + -0.04280281, + -0.04821317, + -0.08508304, + 0.051028382, + 0.045148462, + -0.03566162, + 0.06547104, + 0.048883036, + 0.03793435, + -0.1407055, + -0.06711337, + 0.009881868, + -0.0049659596, + -0.044289522, + 0.0039236215, + -0.02692826, + -0.066134326, + 0.04076233, + -0.05222117, + 0.060488354, + -0.04113724, + -0.04314174, + -0.025147837, + 0.085597694, + -0.044939328, + 0.06395307, + -0.024218159, + -0.050523587, + -0.0020718095, + -0.07894165, + 0.0026805927, + 0.020709056, + 0.1026727, + -0.012374822, + 0.056179732, + 0.06552235, + 0.030915475, + -0.077197015, + -0.061245024, + -0.016111895, + -1.3512232e-08, + -0.05040501, + -0.033646606, + 0.04670903, + 0.047397695, + -0.044165645, + 0.046301767, + -0.006073457, + -0.053902794, + 0.013089125, + 0.050438043, + -0.009894958, + -0.0041677835, + 0.0723306, + 0.021069802, + 0.02670403, + -0.074845195, + -0.026750853, + 0.052738186, + -0.03469103, + 0.039813705, + -0.01640883, + 0.045899663, + -0.0224731, + 0.02387658, + 0.049145795, + 0.09110705, + -0.0025007618, + 0.04937552, + -0.03864697, + 0.020868128, + 0.07605537, + 0.08488945, + -0.05197299, + -0.06879239, + -0.06136516, + 0.077237174, + -0.06451729, + 0.04453416, + 0.008209786, + 0.015886698, + -0.04280691, + 0.005315579, + 0.0034463098, + 0.0031776188, + -0.013040836, + -0.091359615, + 0.0642767, + -0.054965723, + 0.0007161393, + -0.06260912, + -0.03496602, + -0.029944083, + 0.04422821, + 0.017855663, + -0.027972128, + -0.03656317, + 0.02111413, + 0.060607255, + -0.031320468, + -0.014338154, + 0.034649797, + 0.052279983, + -0.036579564, + 0.028179456 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 3, + "total_tokens": 3 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/72dc126ecb92.json b/tests/integration/recordings/responses/72dc126ecb92.json new file mode 100644 index 000000000..1132283bb --- /dev/null +++ b/tests/integration/recordings/responses/72dc126ecb92.json @@ -0,0 +1,422 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": [ + "What is the capital of France?" + ], + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.08202976, + 0.036049414, + -0.0038694388, + -0.004861482, + 0.025693247, + -0.057166435, + 0.012161705, + 0.00467127, + 0.03505895, + -0.022435311, + -0.008085767, + -0.10931756, + 0.022722982, + -0.029302586, + -0.04346896, + -0.12028496, + -0.0008543458, + -0.018142797, + 0.056229446, + 0.0030836044, + 0.0022986692, + -0.016883435, + 0.063618116, + -0.023674846, + 0.03150837, + -0.03492346, + -0.02059899, + -0.0028085383, + -0.011096673, + -0.036125362, + 0.05411302, + -0.03660111, + -0.025032759, + -0.03826603, + -0.04968481, + -0.015202328, + 0.021395631, + -0.012792473, + 0.07668721, + 0.044378605, + -0.010861103, + -0.02969732, + -0.01693457, + -0.02468242, + 0.008050823, + 0.043557983, + 0.00716306, + 0.07550757, + 0.032823652, + -0.062019415, + 0.06670169, + 0.02702069, + -0.045678847, + -0.031471908, + -0.031157935, + 0.09160007, + -0.0017839444, + -0.011266827, + 0.036512397, + 0.056955945, + 0.0023172228, + -0.037797417, + -0.015496572, + 0.05239146, + 0.060355853, + -0.016556436, + 0.008859441, + -0.006693228, + -0.10623182, + 0.0016843195, + -0.048475303, + -0.029751357, + 0.0043055434, + -0.085694805, + 0.06622337, + -0.055170245, + -0.113299794, + 0.050824273, + -0.0093362145, + 0.005925067, + 0.020988274, + -0.022545837, + 0.0005047343, + 0.056380495, + 0.045526545, + -0.0052237497, + 0.093625955, + 0.027504839, + 0.029391509, + -0.045657262, + -0.04896369, + 0.0014494687, + -0.012873971, + 0.07979804, + -0.119054265, + 0.06877414, + -0.02276175, + 0.04496259, + -0.08137766, + 0.04399991, + 0.0029155004, + 0.017608844, + 0.08313841, + -0.018102929, + -0.047927402, + 0.058765113, + 0.006293192, + -0.014731239, + -0.0073064007, + -0.0781359, + -0.10074126, + -0.033533756, + -0.00088698306, + -0.051110234, + 0.027163483, + 0.070813894, + 0.0473974, + -0.10459239, + 0.004466598, + -0.02877272, + -0.018381905, + -0.05058398, + -0.03153154, + -0.009511212, + -0.060586177, + 0.021100093, + -0.046674214, + -7.7591076e-33, + -0.031355448, + 0.056446515, + 0.07743158, + 0.063853666, + -0.046656296, + -0.0076402966, + -0.055335216, + 0.040273033, + -0.031546857, + -0.0070960633, + 0.03947221, + -0.13172576, + -0.066130824, + 0.021737415, + 0.09697953, + 0.011744081, + 0.08902659, + 0.034691017, + -0.043833185, + -0.00030143902, + 0.014647222, + -0.0027022636, + -0.0033283983, + 0.017359877, + 0.060070343, + 0.039406266, + -0.0016976525, + 0.07733255, + 0.014587377, + -0.0022474623, + -0.0018583275, + 0.015027343, + 0.021683114, + 0.007410058, + 0.018048959, + 0.04978414, + 0.012675927, + -0.0025086475, + 0.043455686, + 0.06298341, + 0.06654817, + -0.03632864, + -0.038746156, + 0.04404243, + 0.0055982894, + 0.0056101615, + -0.034923486, + -0.07149955, + 0.100819185, + -0.024829678, + 0.014776356, + -0.025867768, + -0.07273216, + -0.017346835, + 0.0260487, + 0.11415772, + -0.07090699, + 0.017925302, + -0.0033817997, + 0.008448176, + -0.003143632, + 0.0058723576, + -0.022942929, + 0.077535555, + 0.034722377, + 0.08747513, + 0.046323698, + 0.018648349, + 0.0110834995, + -0.04582314, + -0.04647318, + 0.026527299, + 0.07395089, + 0.06561257, + 0.062683366, + 0.072362706, + -0.008941885, + -0.03541281, + -0.0053030164, + -0.0031686015, + -0.037939887, + -0.041367147, + -0.09659676, + 0.044178847, + -0.033438113, + -0.071386814, + -0.011716445, + -0.0071186274, + 0.00061640673, + -0.08835511, + -0.113242365, + -0.12120535, + -0.0013521842, + -0.044262983, + -0.08664051, + 3.99678e-33, + 0.02535338, + -0.0026378247, + -0.08111579, + 0.02547826, + 0.0013276006, + 0.016020937, + 0.09552779, + 0.033251505, + -0.011988348, + 0.017077431, + -0.08302871, + -0.12451176, + 0.04389814, + 0.012018027, + 0.0658185, + 0.10058191, + 0.072872765, + -0.026890267, + -0.032213055, + -0.053589094, + -0.12635043, + 0.0054604914, + -0.035322428, + -0.0042595062, + -0.025021179, + 0.04156106, + -0.099938765, + -0.04764939, + -0.023992214, + 0.0026479033, + -0.055134412, + 0.0135903545, + 0.048992496, + 0.08496887, + -0.042019308, + 0.076698534, + 0.033193503, + 0.0013002069, + 0.040013336, + 0.06456136, + -0.043408506, + -0.04966869, + 0.057963107, + 0.112575926, + 0.07073235, + 0.008212935, + 0.04400269, + -0.02254505, + -0.0072481814, + 0.0499455, + 0.03863049, + 0.067862414, + -0.040987622, + 0.0057318085, + 0.017909586, + 0.049269967, + -0.051384907, + 0.051039662, + -0.09386297, + -0.068170875, + 0.06535989, + 0.075474136, + -0.01684931, + 0.066068135, + -0.002895765, + -0.020654289, + -0.12704009, + 0.06156587, + -0.009830676, + -0.01469639, + 0.13543925, + 0.03414061, + -0.06482569, + 0.050997727, + -0.06645151, + 0.02918515, + 0.07946983, + 0.0144163035, + -0.027290653, + 0.0053189695, + -0.06757613, + -0.020426784, + -0.02716044, + -0.026120126, + -0.07056778, + 0.034710903, + 0.0075686374, + -0.1021992, + 0.058452472, + -0.07478862, + -0.022035357, + -0.006788853, + -0.051244825, + -0.036997046, + 0.025655027, + -1.7503632e-08, + 0.068089955, + 0.045014948, + -0.04406171, + 0.012893553, + -0.057842314, + -0.09545587, + 0.062147193, + -0.0042322013, + -0.008608291, + 0.00019173615, + -0.073625155, + 0.0560322, + -0.069646716, + -0.051114324, + -0.041078486, + -0.0047770296, + -0.032476347, + 0.043077406, + 0.00868246, + 0.022775955, + -0.0048412583, + 0.023340825, + -0.045659505, + -0.0580905, + 0.012541833, + -0.0990428, + 0.040609814, + 0.04566485, + 0.002689006, + -0.005311531, + 0.06633719, + -0.027349183, + -0.050051387, + -0.09029445, + -0.03615204, + 0.012671408, + -0.005864395, + -0.0049427897, + 0.009419004, + -0.029023463, + 0.095057935, + 0.06193272, + 0.0124788815, + -0.011969339, + 0.024483038, + 0.045374334, + 0.05381008, + -0.035192177, + 0.11459818, + -0.0890104, + -0.11138818, + 0.099403016, + 0.0039248187, + 0.0044726846, + 0.003338095, + 0.07087381, + -0.0513449, + -0.012656336, + 0.021826852, + -0.0200563, + -0.014921589, + 0.049172193, + 0.08935325, + -0.011052536 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 7, + "total_tokens": 7 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/80311f244b55.json b/tests/integration/recordings/responses/80311f244b55.json new file mode 100644 index 000000000..707befc07 --- /dev/null +++ b/tests/integration/recordings/responses/80311f244b55.json @@ -0,0 +1,1204 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": [ + "Hello, world!", + "How are you today?", + "This is a test." + ], + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.038157914, + 0.03290493, + -0.0055371798, + 0.014353213, + -0.040209096, + -0.11667767, + 0.03170551, + 0.0019347348, + -0.04254092, + 0.029190615, + 0.042559944, + 0.032130145, + 0.02983921, + 0.010979105, + -0.053759154, + -0.05030495, + -0.023470305, + 0.010730486, + -0.1377361, + 0.0039985846, + 0.029267203, + 0.066698566, + -0.015405643, + 0.04843479, + -0.0881545, + -0.012694429, + 0.041265942, + 0.04089442, + -0.05000745, + -0.05805947, + 0.048748765, + 0.06891688, + 0.058812816, + 0.008785837, + -0.016080279, + 0.08517403, + -0.07814158, + -0.077435054, + 0.020808736, + 0.016186161, + 0.032549612, + -0.05344129, + -0.062166847, + -0.0242584, + 0.007393759, + 0.024064584, + 0.0064619263, + 0.051204458, + 0.072843835, + 0.034658417, + -0.05477693, + -0.05941287, + -0.007262739, + 0.020149412, + 0.035835978, + 0.0056162532, + 0.010803632, + -0.052724347, + 0.010110615, + -0.0087345, + -0.06285489, + 0.038390912, + -0.013975588, + 0.0734118, + 0.090072334, + -0.07995426, + -0.016420014, + 0.044813525, + -0.06888206, + -0.033037275, + -0.015467736, + 0.01130628, + 0.036483694, + 0.0663459, + -0.054344203, + 0.008723171, + 0.012078509, + -0.038129516, + 0.006938081, + 0.051155496, + 0.07745829, + -0.122897476, + 0.01635594, + 0.04956378, + 0.031677794, + -0.03963372, + 0.0016560612, + 0.0095810415, + -0.032620687, + -0.03396473, + -0.13327733, + 0.0072318353, + -0.010225149, + 0.038535405, + -0.09343492, + -0.04173385, + 0.06996305, + -0.026312327, + -0.14973918, + 0.13443227, + 0.03750676, + 0.052842483, + 0.045053005, + 0.018721534, + 0.05443072, + 0.017290117, + -0.03255681, + 0.046160772, + -0.046711024, + -0.030576464, + -0.018258592, + -0.048711784, + 0.033041865, + -0.003856249, + 0.05003307, + -0.05821012, + -0.00994153, + 0.0106995255, + -0.04008794, + -0.0015539092, + 0.060838487, + -0.04559896, + 0.04924722, + 0.026119638, + 0.019796783, + -0.0016312932, + 0.05955464, + -6.527786e-33, + 0.063555494, + 0.003072545, + 0.0290068, + 0.17338625, + 0.0029474646, + 0.027745575, + -0.095103905, + -0.031165987, + 0.026719859, + -0.010799976, + 0.023851028, + 0.02375357, + -0.031152952, + 0.049497593, + -0.025005657, + 0.10176666, + -0.079190366, + -0.0032479328, + 0.042849813, + 0.09489888, + -0.066508934, + 0.00632239, + 0.022188535, + 0.06996212, + -0.007491268, + -0.001777037, + 0.027047161, + -0.07536194, + 0.11401931, + 0.008564227, + -0.02371391, + -0.046974454, + 0.0144310715, + 0.019899534, + -0.0046927175, + 0.0013119543, + -0.03432107, + -0.054212432, + -0.09418897, + -0.028963951, + -0.018907014, + 0.045735538, + 0.04757043, + -0.003132595, + -0.033231355, + -0.013520351, + 0.051010653, + 0.03111525, + 0.015257217, + 0.054166727, + -0.085080594, + 0.013355202, + -0.04763934, + 0.07099156, + -0.01309272, + -0.0023823304, + 0.050339438, + -0.041624993, + -0.014171974, + 0.032421313, + 0.005414455, + 0.09128853, + 0.0045168963, + -0.018196244, + -0.015225792, + -0.04635148, + 0.038764603, + 0.014739169, + 0.052030377, + 0.0017809072, + -0.014930553, + 0.027100598, + 0.031190928, + 0.02379928, + -0.0045879, + 0.03622444, + 0.066800386, + -0.0018508516, + 0.021243243, + -0.0575494, + 0.019077979, + 0.031474162, + -0.018456634, + -0.04083116, + 0.10387791, + 0.011981423, + -0.014923204, + -0.10519511, + -0.012293124, + -0.00042049217, + -0.09506704, + 0.058275525, + 0.042611193, + -0.025061507, + -0.094545335, + 4.010606e-33, + 0.13226718, + 0.0053517097, + -0.03314567, + -0.09099676, + -0.031551942, + -0.033939674, + -0.071981214, + 0.12595285, + -0.08333936, + 0.052855294, + 0.001036374, + 0.021973396, + 0.104020424, + 0.013031712, + 0.040921222, + 0.018695012, + 0.114233166, + 0.024822846, + 0.014595918, + 0.00621894, + -0.011220824, + -0.035742316, + -0.03801776, + 0.011226576, + -0.051305167, + 0.007892534, + 0.06734842, + 0.0033567564, + -0.09286571, + 0.03701943, + -0.022331072, + 0.040051647, + -0.030764744, + -0.011390678, + -0.014426033, + 0.024999708, + -0.09751172, + -0.03538673, + -0.03757043, + -0.010174254, + -0.06396341, + 0.025548752, + 0.020661479, + 0.03752242, + -0.10438308, + -0.028266912, + -0.052153755, + 0.012830027, + -0.05125152, + -0.029009243, + -0.09633578, + -0.042322997, + 0.06716196, + -0.030903742, + -0.010314011, + 0.027343867, + -0.028119028, + 0.010296558, + 0.043072425, + 0.022286164, + 0.007943, + 0.056093868, + 0.040728126, + 0.09295372, + 0.016456816, + -0.053744446, + 0.00047035623, + 0.050744157, + 0.04246857, + -0.029237023, + 0.009294763, + -0.010624897, + -0.037202932, + 0.00220195, + -0.030278567, + 0.07457478, + 0.0026277148, + -0.017591486, + 0.0028708735, + 0.03840644, + 0.0072204536, + 0.045653794, + 0.039947055, + 0.014161398, + -0.014247232, + 0.058465447, + 0.036360227, + 0.055268615, + -0.02004829, + -0.08043532, + -0.030213723, + -0.0148566915, + 0.022293866, + 0.011908896, + -0.06907556, + -1.8805048e-08, + -0.078408636, + 0.046699222, + -0.023894435, + 0.06347232, + 0.02395583, + 0.0014103559, + -0.090737104, + -0.06684135, + -0.080118775, + 0.0054891296, + 0.05368204, + 0.10478211, + -0.066875115, + 0.015525915, + 0.06710851, + 0.07083251, + -0.03199485, + 0.020825442, + -0.021920865, + -0.0072890157, + -0.01058703, + 0.004174248, + 0.033155944, + -0.07901077, + 0.038750935, + -0.07521113, + -0.015731987, + 0.005987591, + 0.0051212795, + -0.061557226, + 0.04203319, + 0.09544439, + -0.04317485, + 0.014446859, + -0.10614051, + -0.028011814, + 0.01101727, + 0.069552526, + 0.0669063, + -0.0747214, + -0.078444764, + 0.042728573, + -0.034634914, + -0.106056124, + -0.0357495, + 0.05155015, + 0.068699375, + -0.049968246, + 0.015420614, + -0.06460179, + -0.07601102, + 0.026022797, + 0.07440251, + -0.0124161495, + 0.1332999, + 0.07480527, + 0.051343314, + 0.02094546, + -0.026808253, + 0.08892536, + 0.03996125, + -0.041000355, + 0.03187991, + 0.018108707 + ], + "index": 0, + "object": "embedding" + }, + { + "embedding": [ + -0.009823841, + 0.06685394, + 0.08489411, + 0.03813849, + 0.032225974, + -0.034307797, + 0.107310556, + -0.046902046, + -0.102643676, + -0.003702005, + -0.0023676767, + 0.012173647, + -0.046961293, + 0.08201565, + 0.04295503, + -0.027037757, + 0.0070437216, + -0.104356326, + -0.12175826, + 0.07269557, + -0.079771765, + -0.003676955, + -0.0044014333, + 0.06784145, + -0.020959238, + 0.05777534, + -0.008483368, + -0.013391308, + 0.0052807773, + -0.09834358, + -0.13073047, + 0.008964234, + -0.057907283, + -0.05804121, + -0.05626149, + -0.042638198, + 3.184936e-05, + -0.14460282, + 0.007979306, + 0.022538451, + 0.048148528, + -0.039077234, + -0.012783144, + 0.007688736, + 0.05792521, + -0.027782526, + -0.019818667, + 0.09386619, + 0.14314687, + -0.023420751, + -0.10621568, + 0.026846798, + -0.05543366, + 0.017867815, + 0.021250507, + 0.041602414, + 0.0033089865, + 0.016080648, + 0.083043434, + -0.014604297, + 0.027198244, + 0.014271484, + -0.0062427525, + 0.06058171, + 0.03864093, + 0.0060196337, + -0.10089876, + -0.05285287, + -0.0797282, + 0.01671729, + -0.054698065, + -0.073024616, + 0.04547561, + -0.009560945, + -0.010386015, + -0.064177126, + 0.0011365172, + -0.036887243, + 0.06302413, + -0.0016032788, + 0.057869848, + -0.026043506, + -0.000536635, + 0.021403369, + -0.05001242, + -0.011384805, + -0.008799393, + 0.09338713, + 0.010654576, + -0.0006147975, + -0.056140404, + 0.043459535, + 0.0037720772, + 0.027983129, + 0.020964785, + -0.038642954, + 0.019421708, + 0.023177834, + -0.051029585, + 0.13815063, + 0.022802453, + 0.13100733, + 0.042305406, + 0.012445653, + 0.022351589, + 0.014143133, + -0.09037672, + 0.07454903, + -0.062642604, + -0.08922512, + 0.005484734, + 0.03850994, + -0.03628572, + -0.009195987, + 0.09181748, + -0.012547894, + 0.026162561, + 0.08752062, + -0.010926715, + 0.09250321, + 0.02097545, + 0.052515954, + 0.028899532, + 0.039395254, + -0.010501714, + 0.077294946, + 0.0715375, + -7.66496e-33, + 0.100804806, + 0.00073826336, + 0.057312902, + 0.117006026, + -0.060187068, + -0.02796235, + -0.041741833, + -0.018912861, + 0.050848745, + -0.06301131, + 0.036858555, + -0.045183055, + -0.005223951, + 0.0064753974, + -0.03198189, + 0.028979877, + -0.09603434, + 0.057345662, + 0.008110953, + 0.12529288, + -0.021994175, + -0.047584984, + -0.04379391, + 0.021993084, + 0.051113907, + -0.014501653, + -0.021036316, + -0.0667254, + -0.026064333, + -0.008694687, + -0.036617454, + -0.008719971, + 0.115688674, + -0.00289865, + 0.025261829, + -0.0076816385, + -0.008632856, + -0.0036519386, + -0.04257167, + -0.037688565, + 0.03307097, + -0.024961809, + 0.05859159, + -0.06178797, + -0.04673158, + -0.027886666, + -0.035025608, + 0.055327583, + -0.002065147, + -0.022386257, + -0.10152246, + 0.029717246, + -0.06324088, + -0.0055829133, + -0.048448645, + -0.04066708, + -0.07524254, + 0.03743904, + 0.016060878, + 0.084327556, + 0.012047858, + 0.055406, + 0.009235782, + -0.07829579, + -0.105074205, + -0.023971796, + -0.017086953, + -0.018263351, + 0.041692156, + -0.00606311, + 0.012483653, + -0.035019528, + 0.024491172, + 0.06318314, + 0.065662295, + 0.052476574, + 0.038394902, + -0.07514326, + -0.012202919, + -0.0064696297, + 0.049809776, + 0.05707129, + -0.0019637872, + -0.049091708, + 0.054853234, + 0.052796733, + 0.007638584, + -0.009890581, + 0.0022318119, + 0.022781821, + -0.06865972, + 0.06054869, + 0.070527636, + -0.04190614, + -0.024943016, + 5.210683e-33, + 0.09748425, + 0.015037715, + -0.0950651, + 0.05163348, + -0.09946082, + -0.046801973, + -0.045799557, + 0.04598005, + -0.021040877, + 0.048971444, + 0.085892275, + 0.031846974, + 0.010494827, + -0.011657944, + 0.023827314, + -0.0036091327, + 0.05379242, + 0.0051917112, + -0.020764181, + 0.011931169, + -0.09782392, + 0.06021868, + -0.027618488, + 0.06742346, + 4.5418237e-05, + 0.06255733, + 0.024763351, + 0.05360233, + -0.037187718, + -0.015447758, + -0.015347547, + -0.021288762, + -0.03981676, + 0.04994158, + 0.019988623, + 0.058448106, + 0.0017628162, + -0.074512705, + -0.015785523, + -0.10013551, + -0.10497206, + 0.030029353, + 0.00386666, + 0.065692, + 0.053144414, + 0.009848025, + -0.023745444, + -0.02572956, + -0.0091416575, + 0.06447014, + 0.008398887, + -0.03277235, + -0.0017416656, + 0.017433915, + 0.02735147, + -0.003945162, + -0.07797209, + -0.061111048, + -0.018393502, + 0.019164208, + -0.10231785, + 0.0048785545, + -0.039205246, + -0.00983978, + 0.024287809, + -0.02257733, + -0.016971176, + -0.03401973, + -0.052132465, + -0.031842116, + -0.034754753, + 0.0082540605, + 0.0013724067, + -0.06360571, + -0.028295932, + 0.050363123, + 0.023888446, + 0.005894443, + -0.0116009535, + -0.0004876411, + -0.07163071, + 0.041449234, + 0.05440186, + -0.10820097, + -0.081358775, + -0.069281794, + 0.08610945, + -0.0035109764, + 0.031017194, + 0.08359787, + -0.028458066, + 0.008852798, + -0.027919184, + 0.04985712, + 0.011562651, + -1.5342355e-08, + 0.054318756, + 0.045345105, + -0.07638805, + 0.052091047, + -0.01236827, + 0.060296044, + -0.004145201, + -0.017390434, + -0.014107871, + -0.01709858, + 0.075827934, + 0.007903074, + -0.06532883, + -0.04752482, + 0.038101584, + -0.050273094, + 0.02193425, + 0.068476826, + -0.037231524, + -0.049334478, + 0.057314597, + 0.008028915, + -0.042897243, + 0.09775371, + 0.05817249, + 0.052902617, + 0.024731442, + 0.03277874, + -0.0062142154, + 0.082389385, + 0.037153333, + 0.108709686, + -0.05776975, + 0.036667187, + -0.018986559, + -0.08550582, + 0.059112605, + -0.045709446, + 0.025215724, + 0.022489667, + -0.007955196, + 0.0031373778, + -0.047831737, + -0.01862743, + 0.048644323, + -0.032836094, + 0.054563984, + -0.037403505, + -0.07471283, + -0.019280152, + 0.0060565346, + 0.04239159, + 0.06738598, + 0.04457912, + 0.03311975, + 0.033673216, + 0.0012720197, + 0.033221062, + -0.04845177, + -0.0056105815, + -0.008513508, + -0.016865257, + -0.07558049, + 0.0035253412 + ], + "index": 1, + "object": "embedding" + }, + { + "embedding": [ + 0.033612337, + 0.010374505, + -0.01756061, + 0.029361853, + -0.009454598, + -0.037026335, + -0.02555746, + 0.0086515825, + 0.019154208, + 0.03955405, + -0.02469497, + -0.0126976445, + -0.0065836124, + 0.043807767, + -0.036032367, + -0.056751598, + 0.005685301, + -0.048611272, + -0.01940104, + 0.051023778, + 0.06368657, + 0.04569995, + -0.025642192, + 0.02090835, + 0.023841413, + -0.011006624, + -0.06968253, + 0.008696027, + -0.0100323185, + -0.004299733, + -0.013709692, + 0.060795236, + 0.054181676, + 0.030621745, + 0.032446172, + 0.023919526, + 0.09566865, + 0.041953687, + 0.00087092275, + 0.04335, + 0.03367777, + -0.09001533, + 0.021590438, + 0.04053571, + -0.002674088, + 0.031825043, + -0.045521177, + 0.047551177, + -0.07043583, + -0.013617987, + -0.0102603305, + -0.016518736, + -0.07214938, + -0.055422474, + 0.03316378, + -0.0076137385, + 0.050792947, + -0.04655027, + 0.064705744, + 0.08078938, + -0.053805117, + -0.013050277, + -0.023942292, + 0.0726168, + 0.07433478, + 0.050372824, + -0.03490959, + -0.101285346, + -0.016964512, + -0.054189693, + 0.005499785, + 0.006458164, + 0.055815514, + 0.048383262, + 0.040276967, + 0.0056121964, + -0.024112493, + -0.10037388, + 0.07864023, + 0.04749725, + -0.083059065, + -0.05695486, + -0.007121432, + 0.03499301, + 0.0130494, + 0.047826655, + 0.07769031, + -0.0050768964, + -0.088448934, + 0.0034568575, + -0.023282519, + 0.045576394, + -0.042316645, + -0.024240615, + 0.017663328, + -0.024584634, + -0.032086663, + -0.009175009, + -0.060619276, + 0.0788936, + -0.007151155, + -0.0018835695, + -0.024150992, + 0.035605535, + -0.097886965, + -0.07463594, + 0.036441684, + -0.061645452, + 0.06754617, + 0.0037501638, + -0.050999243, + -0.023512185, + 0.04400348, + 0.042692684, + 0.020495275, + -0.0098657925, + -0.10782902, + 0.041300014, + 0.029186765, + 0.045622177, + 0.0951987, + -0.020906197, + 0.00027652894, + -0.05796104, + 0.022876726, + -0.043638688, + 0.021679614, + -8.721427e-33, + -0.0012232207, + -0.038046468, + 0.04248091, + 0.08773161, + -0.0042147394, + 0.00010909877, + -0.06459573, + 0.061631102, + -0.0035571777, + -0.0057670954, + -0.010751822, + -0.06539647, + 0.0026381642, + 0.006108226, + 0.07177802, + 0.099656485, + -0.028420987, + 0.0886893, + -0.06579721, + 0.0577445, + -0.057205524, + 0.036075067, + -0.02090538, + -0.09164578, + -0.07255028, + -0.075212136, + -0.006453883, + 0.010381722, + -0.0037261078, + 0.020341685, + -0.039610952, + 0.048633367, + -0.057997692, + 0.04580804, + -0.002834594, + -0.026399026, + 0.011338722, + -0.008768234, + -0.012484398, + 0.0030163776, + -0.050530374, + -0.043636482, + -0.024315875, + 0.065459326, + 0.050444957, + -0.031544425, + -0.00075475493, + -0.04531901, + 0.058805995, + 0.0012770096, + -0.019136755, + 0.012550491, + 0.040011447, + -0.022380024, + -0.030805111, + 0.04761777, + 0.036087062, + -0.00771528, + -0.042050246, + 0.09727571, + 0.011417657, + 0.027789006, + -0.08352716, + 0.019375375, + -0.05415718, + 0.014092975, + -0.04270275, + -0.007896535, + 0.029720219, + 0.07610263, + 0.031358883, + -0.04178186, + 0.0016060148, + 0.03870257, + -0.059810083, + -0.07050183, + -0.051603932, + 0.06843783, + -0.0037906233, + -0.012867741, + 0.035064667, + -0.112596914, + 0.053979058, + -0.11403874, + -0.033291597, + -0.011375664, + -0.022975085, + -0.0874419, + 0.0009676586, + -0.07040301, + -0.034353334, + 0.028341567, + -0.003938582, + -0.065418504, + 0.05670526, + 4.4032913e-33, + -0.06758047, + 0.07452212, + -0.04625966, + 0.110544346, + 0.08249691, + -0.035985246, + 0.112199076, + -0.010368401, + -0.09361668, + 0.15915231, + 0.005810317, + 0.041577023, + 0.041846495, + -0.0221648, + 0.0180787, + 0.01732049, + 0.031424496, + -0.07654498, + 0.011575445, + -0.04279533, + -0.077900656, + 0.12441581, + 0.036161043, + 0.09728094, + -0.06544197, + 0.051177975, + 0.030517569, + -0.06477891, + 0.0033884735, + -0.0065040532, + 0.002094866, + 0.0057612373, + -0.07176532, + 0.01457261, + 0.0111329, + -0.012400559, + 0.09850194, + -0.05333344, + -0.059571583, + 0.027873877, + 0.013967755, + 0.0973726, + 0.14173166, + 0.09823832, + -0.00076127227, + 0.036324706, + 0.013391566, + -0.11345763, + 0.015459011, + 0.04547403, + -0.05844395, + -0.011545099, + 0.026310358, + 0.055226807, + -0.05014672, + 0.014071454, + -0.04505251, + 0.0055593317, + 0.017989416, + 0.01946363, + -0.08633586, + 0.08156571, + -0.012573777, + 0.03409684, + -0.017857939, + -0.031390663, + -0.08447243, + 0.07359053, + 0.03050787, + 0.014397102, + 0.085515074, + -0.0014615763, + -0.117197014, + -0.071065396, + 0.08322675, + -0.077766545, + -0.04483503, + -0.009105399, + 0.031649765, + -0.03719005, + -0.05655446, + -0.07973028, + 0.0033281972, + 0.039855074, + -0.05885036, + 0.09728466, + -0.016143035, + 0.02778064, + -0.06544481, + 0.040895227, + 0.009707747, + -0.012031996, + -0.0087121, + -0.050623253, + -0.024199592, + -1.8976149e-08, + -0.024199035, + -0.05503201, + -0.014488159, + 0.017767312, + -0.014441727, + 0.06777053, + 0.032016836, + -0.04272461, + -0.056400675, + 0.00891021, + 0.09656018, + 0.06953362, + -0.09056004, + 0.018509604, + 0.0636711, + -0.07154264, + -0.004792113, + -0.008434159, + -0.016066523, + 0.08377477, + -0.08183436, + 0.050272364, + 0.020495478, + 0.027959472, + -0.023466159, + 0.074599385, + 0.03680873, + 0.08727076, + 0.0132746175, + 0.027399603, + 0.06736775, + 0.039569516, + -0.044155512, + -0.051341295, + -0.013279262, + 0.06611269, + 0.0431739, + -0.036882088, + 0.02478827, + 0.0406888, + -0.1132855, + 0.027976915, + 0.0070727277, + 0.039784174, + -0.027419532, + -0.05590226, + -0.08574367, + -0.02544574, + -0.021121135, + -0.05820989, + -0.025676778, + 0.017944483, + 0.04889649, + -0.036834445, + 0.012973257, + -0.06298454, + -0.03954017, + -0.0035980341, + -0.06945554, + 0.042370543, + 0.1125106, + -0.0015144089, + 0.08769291, + -0.041732 + ], + "index": 2, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 14, + "total_tokens": 14 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/8ce928ad0b85.json b/tests/integration/recordings/responses/8ce928ad0b85.json new file mode 100644 index 000000000..e15dad63e --- /dev/null +++ b/tests/integration/recordings/responses/8ce928ad0b85.json @@ -0,0 +1,421 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": "Test user parameter", + "encoding_format": "float", + "user": "test-user-123" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.043770123, + 0.021501394, + -0.081300564, + 0.010615138, + -0.07908651, + -0.03219175, + 0.13090447, + 0.042329222, + -0.11600146, + -0.07588096, + 0.041826088, + -0.080617175, + 0.038125783, + -0.01069657, + 0.01577377, + -0.04196888, + 0.043099895, + -0.033355612, + 0.013571747, + -0.0103924, + 0.015561896, + -0.03786113, + -0.050319925, + -0.02566629, + -0.047868017, + -0.08717805, + 0.01685358, + -0.03676223, + 0.0063788705, + 0.020863743, + 0.11264443, + -0.0021451844, + -0.07911777, + 0.038758967, + 0.115321144, + -0.019753717, + 0.0067159277, + -0.02115779, + -0.0144774495, + -0.0027154125, + -0.034384295, + -0.052576542, + -0.030578543, + 0.04745372, + -0.024294367, + 0.01091144, + -0.03947583, + 0.07183755, + -0.020715859, + 0.018965777, + 0.04292474, + -0.007755194, + 0.0025708016, + -0.058263537, + 0.0117485095, + -0.022703577, + 0.001755438, + -0.012628832, + 0.030728007, + 0.017719304, + -0.061525322, + -0.036568273, + 0.025831668, + 0.025376469, + 0.012137967, + 0.009102949, + -0.027313529, + -0.093379095, + 0.0052120173, + 0.0074658697, + -0.07538, + 0.010161349, + -0.028439516, + 0.03026334, + 0.0036700817, + -0.022599109, + -0.037862476, + -0.08384314, + -0.0124443015, + -0.048889726, + 0.029131662, + -0.044443335, + -0.07518736, + -0.020938978, + 0.063386515, + 0.16294138, + 0.060580015, + -0.01281573, + -0.031040885, + 0.018372353, + 0.11225789, + 0.072922915, + -0.06272038, + -0.031792488, + -0.017476005, + 0.04846264, + -0.04116229, + -0.041834168, + -0.059919056, + 0.15907861, + -0.027786179, + -0.012492541, + 0.05599519, + -0.019895995, + 0.022076221, + 0.006363836, + 0.046413723, + -0.0731325, + 0.03326452, + 0.059475966, + -0.033314705, + 0.030761855, + 0.00819013, + -0.020254606, + 0.05658313, + -0.08153619, + 0.023402533, + 0.0060753864, + -0.07993489, + 0.013990512, + 0.052254565, + 0.027170746, + -0.049271967, + 0.02814688, + 0.019500777, + 0.054206643, + 0.082691684, + -1.8817448e-33, + 0.013630832, + -0.010863344, + 0.015899567, + 0.06938339, + -0.05113185, + 0.08995833, + 0.04450505, + 0.08101549, + 0.018903807, + -0.020960161, + -0.017933648, + -0.02174221, + 0.010988686, + 0.015100026, + 0.017031211, + 0.09433042, + 0.003454907, + 0.010199729, + -0.0446973, + 0.0018167854, + 0.015817188, + -0.06576281, + -0.004943305, + 0.004393494, + -0.019598262, + -0.092797264, + -0.025917865, + 0.04409669, + 0.054165967, + -0.007365383, + -0.021470547, + -0.03683317, + -0.091507494, + 0.08402351, + -0.01809901, + 0.0038072586, + 0.020236026, + 0.0439697, + -0.077322714, + 0.0057473024, + -0.054513566, + -0.024854423, + 0.075270385, + 0.034554463, + -0.08118007, + -0.12208905, + -0.0052893, + 0.0078005046, + 0.05028763, + 0.015558154, + -0.056349996, + 0.0398076, + 0.012997719, + -0.040145177, + 0.014409028, + -0.033200737, + -0.008437484, + -0.037582297, + -0.019651853, + 0.017285295, + -0.008976723, + -0.0018494898, + -0.0030671947, + 0.03046138, + -0.051143825, + -0.08688155, + -0.018344227, + -0.113307714, + 0.073259674, + 0.04602224, + 0.012651309, + -0.063435435, + -0.028471926, + 0.020155901, + -0.078830436, + -0.00069818215, + -0.03156303, + 0.123062745, + 0.0042949035, + -0.026413191, + 0.07838535, + -0.07747411, + -0.02126005, + 0.048919026, + 0.02919413, + -0.009296978, + -0.030687347, + -0.041037664, + -0.038565576, + -0.08043238, + 0.023225678, + 0.041928973, + -0.05812511, + 0.058555346, + 0.07633673, + 4.4510456e-34, + -0.019582625, + 0.040237214, + 0.01455587, + 0.034353998, + 0.043911777, + -0.023234777, + 0.0677493, + -0.030089214, + -0.09076478, + -0.019257858, + -0.02767876, + -0.00065146026, + 0.0043030144, + 0.05363546, + 0.04073387, + 0.03255476, + -0.10712685, + -0.050083157, + -0.016644027, + -0.0077649173, + -0.11153465, + 0.07478277, + -0.015999233, + -0.050547555, + -0.113217294, + -0.006174145, + 0.050873067, + -0.030284155, + 0.04314861, + 0.033020362, + 0.023671353, + 0.04654029, + -0.03415647, + 0.03614603, + 0.023047049, + -0.02677317, + 0.063607745, + 0.09978129, + 0.03527302, + 0.15538219, + 0.08349002, + 0.10931568, + 0.04684532, + -0.010147538, + -0.03256112, + 0.12924333, + 0.031221064, + -0.099673584, + 0.010860566, + 0.02326085, + -0.011916549, + 0.010135849, + 0.06884636, + 0.009350001, + -0.0226591, + -0.04280281, + -0.04821317, + -0.08508304, + 0.051028382, + 0.045148462, + -0.03566162, + 0.06547104, + 0.048883036, + 0.03793435, + -0.1407055, + -0.06711337, + 0.009881868, + -0.0049659596, + -0.044289522, + 0.0039236215, + -0.02692826, + -0.066134326, + 0.04076233, + -0.05222117, + 0.060488354, + -0.04113724, + -0.04314174, + -0.025147837, + 0.085597694, + -0.044939328, + 0.06395307, + -0.024218159, + -0.050523587, + -0.0020718095, + -0.07894165, + 0.0026805927, + 0.020709056, + 0.1026727, + -0.012374822, + 0.056179732, + 0.06552235, + 0.030915475, + -0.077197015, + -0.061245024, + -0.016111895, + -1.3512232e-08, + -0.05040501, + -0.033646606, + 0.04670903, + 0.047397695, + -0.044165645, + 0.046301767, + -0.006073457, + -0.053902794, + 0.013089125, + 0.050438043, + -0.009894958, + -0.0041677835, + 0.0723306, + 0.021069802, + 0.02670403, + -0.074845195, + -0.026750853, + 0.052738186, + -0.03469103, + 0.039813705, + -0.01640883, + 0.045899663, + -0.0224731, + 0.02387658, + 0.049145795, + 0.09110705, + -0.0025007618, + 0.04937552, + -0.03864697, + 0.020868128, + 0.07605537, + 0.08488945, + -0.05197299, + -0.06879239, + -0.06136516, + 0.077237174, + -0.06451729, + 0.04453416, + 0.008209786, + 0.015886698, + -0.04280691, + 0.005315579, + 0.0034463098, + 0.0031776188, + -0.013040836, + -0.091359615, + 0.0642767, + -0.054965723, + 0.0007161393, + -0.06260912, + -0.03496602, + -0.029944083, + 0.04422821, + 0.017855663, + -0.027972128, + -0.03656317, + 0.02111413, + 0.060607255, + -0.031320468, + -0.014338154, + 0.034649797, + 0.052279983, + -0.036579564, + 0.028179456 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 3, + "total_tokens": 3 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/9e9665e16597.json b/tests/integration/recordings/responses/9e9665e16597.json new file mode 100644 index 000000000..a3e34d1bd --- /dev/null +++ b/tests/integration/recordings/responses/9e9665e16597.json @@ -0,0 +1,422 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": [ + "Why are data structures important in computer science?" + ], + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.012128477, + 0.06527823, + -0.031809483, + -0.050526526, + -0.0005586695, + -0.117261976, + -0.043081608, + 0.024609145, + 0.08321573, + 0.033838283, + -0.023870444, + 0.020454653, + 0.032279976, + 0.012203663, + 0.028937394, + 0.029961895, + -0.09961831, + 0.0141193895, + -0.021553658, + -0.07066728, + -0.02873006, + -0.029528745, + -0.068298884, + 0.0031958553, + -0.022202335, + 0.13836044, + -0.034372807, + -0.03989439, + -0.016163597, + -0.042044215, + -0.0016031979, + 0.03265711, + 0.12287486, + 0.053505898, + -0.08694122, + 0.042619474, + 0.10286983, + -0.021920446, + -0.06450256, + 0.025313437, + -0.0964511, + 0.035419725, + 0.021049967, + 0.062087003, + 0.032521646, + 0.017943505, + -0.006459364, + -0.06203872, + -0.013574074, + 0.024539992, + -0.13688074, + 0.034410667, + -0.027617542, + 0.03409185, + 0.020446204, + 0.077928044, + 0.09399848, + 0.003975386, + -0.043136317, + 0.0031040143, + -0.017540144, + -0.03424077, + -0.068318866, + 0.005061085, + 0.08829544, + -0.012408556, + -0.0016823813, + 0.007591063, + 0.034699216, + 0.010171645, + 0.018427595, + -0.007851212, + -0.023401242, + 0.07745935, + 0.039882705, + -0.010903346, + -0.053599168, + -0.029966023, + 0.033182297, + 0.0051609245, + 0.013949411, + 0.017829804, + -0.029286042, + 0.07984294, + 0.042010676, + -0.0025307727, + 0.027901225, + -0.03822856, + -0.080078274, + -0.030328913, + 0.09236672, + -0.033835273, + -0.00033364468, + 0.029182306, + -0.04279952, + -0.0029906866, + 0.03665573, + -0.056330174, + 0.07478027, + 0.007321523, + 0.046409536, + 0.023820953, + 0.06267657, + 0.071830586, + -0.06049986, + -0.10113381, + 0.04797238, + -0.010384649, + 0.0008945393, + -0.06017545, + -0.033510443, + 0.047712646, + -0.055030894, + -0.047685586, + -0.03805009, + -0.12862371, + -0.08072417, + 0.0048694503, + -0.021217689, + -0.027110996, + 0.002140792, + -0.03098654, + -0.039278872, + 0.0143353, + -0.0035598644, + -0.071865514, + -0.14747895, + -3.6233633e-33, + -0.017464003, + -0.029053442, + -0.025221748, + 0.06710367, + 0.022286726, + -0.030096456, + -0.004590723, + -0.04471534, + -0.0029244933, + 0.040142074, + -0.026988953, + 0.052587368, + 0.041354593, + 0.039806347, + 0.12857036, + 0.024866242, + -0.010497711, + 0.0713523, + -0.03402195, + -0.03354482, + 0.07337487, + -0.02804671, + 0.07398319, + -0.029162133, + 0.030897863, + 0.026442021, + -0.012924316, + -0.004779478, + -0.0066290544, + 0.0010669982, + 0.02442126, + -0.019298507, + -0.0010162054, + 0.026722405, + 0.123015314, + 0.066879444, + -0.004604402, + -0.11145285, + 0.06524651, + -0.06938033, + 0.03159686, + 0.0365362, + 0.027604872, + 0.03813194, + -0.044194933, + -0.026800867, + 0.022335347, + -0.030788116, + -0.0070202574, + -0.09740058, + 0.028278269, + 0.015338586, + 0.047182743, + 0.04034929, + 0.044180423, + 0.044752665, + -0.028346116, + -0.09805642, + -0.03536096, + 0.06581017, + -0.069448434, + 0.052013367, + 0.056201097, + 0.033995215, + 0.00519787, + 0.07888512, + -0.019000722, + 8.0344194e-05, + 0.110052355, + 0.005598096, + -0.019291203, + 0.0260335, + -0.061335884, + -0.011191793, + -0.032474954, + 0.026703535, + -0.038857695, + -0.07600434, + -0.0060966127, + 0.049430415, + -0.05585763, + -0.024964364, + 0.03721157, + 0.013983276, + -0.021332601, + -0.02459227, + 0.050077077, + -0.031562295, + -0.048190966, + -0.022175686, + -0.02291134, + -0.012059778, + 0.01774164, + -0.019271614, + -0.018707262, + 5.8759317e-34, + -0.027778838, + -0.01629238, + -0.030639471, + 0.0030956517, + -0.013600445, + 0.013610428, + 0.012467948, + -0.12637076, + 0.003133677, + 0.020737566, + 0.0032866234, + 0.009551662, + 0.040670644, + -0.06273018, + 0.043455947, + 0.05110034, + -0.027151333, + -0.07152962, + -0.04858435, + -0.039853398, + -0.021122044, + 0.08141459, + -0.080552705, + -0.035274338, + 0.028709702, + -0.017908616, + -0.1056214, + -0.14565709, + 0.05107322, + 0.037748225, + -0.018399585, + -0.04667668, + -0.010029709, + 0.0070766853, + 0.017215423, + -0.015265576, + 0.06257449, + -0.010665833, + 0.055490427, + 0.0076262103, + -0.0129058715, + 0.11340158, + 0.0062427726, + -0.023597918, + 0.04516201, + 0.040879074, + -0.012557521, + 0.1070603, + -0.040827584, + -0.039590783, + 0.08694622, + 0.024637919, + 0.029732363, + -0.07417592, + 0.08613935, + 0.012553578, + -0.04852132, + 0.021330798, + 0.015399935, + 0.05207805, + -0.059071112, + -0.04029849, + 0.045327052, + 0.05088802, + -0.025812214, + -0.020503126, + -0.066600144, + -0.058700442, + -0.04682153, + -0.12240272, + 0.039613813, + 0.06064703, + -0.02098424, + 0.056387424, + -0.12134772, + -0.029882085, + -0.025266815, + 0.013461971, + -0.0036088703, + 0.08080393, + -0.004056028, + 0.0043978477, + 0.0064231018, + 0.034481037, + 0.0026119966, + 0.036488745, + 0.06241491, + -0.06867501, + -0.021493748, + -0.08815687, + -0.06678143, + -0.02508211, + -0.043641888, + 0.07306818, + -0.050304804, + -1.624133e-08, + -0.048611593, + -0.056216497, + 0.017130926, + -0.058177624, + 0.023788815, + -0.012684911, + -0.010927002, + 0.12155309, + -0.008483258, + 0.013140599, + 0.05642416, + 0.001749309, + -0.06338417, + 0.0011953749, + 0.07965269, + 0.03217091, + 0.093799464, + -0.08279611, + -0.03880581, + 0.055997517, + 0.050195538, + -0.00020960325, + -0.089916974, + 0.0820357, + 0.0659547, + -0.03231384, + 0.049111042, + 0.055394094, + -0.03215183, + 0.019463245, + 0.0094351815, + -0.04652837, + 0.048488617, + 0.068895265, + 0.10356095, + 0.018122325, + 0.06454431, + 0.029776301, + -0.046313405, + -0.11385151, + -0.011925911, + 0.020713827, + -0.03263382, + 0.091360845, + 0.0919104, + 0.02281533, + -0.0705449, + 0.08715759, + -0.03233197, + 0.025567707, + -0.04827432, + 0.031276073, + 0.002320722, + -0.0062292, + -0.020309383, + 0.012879511, + 0.01099674, + -0.04382443, + -0.016720371, + 0.041349057, + 0.0059064166, + 0.015646098, + 0.038090054, + -0.073881686 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 9, + "total_tokens": 9 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/a1ea41fbf9a2.json b/tests/integration/recordings/responses/a1ea41fbf9a2.json new file mode 100644 index 000000000..666180964 --- /dev/null +++ b/tests/integration/recordings/responses/a1ea41fbf9a2.json @@ -0,0 +1,422 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": [ + "How does machine learning improve over time?" + ], + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.0144412955, + -0.009650282, + 0.10598198, + 0.033821642, + 0.08256133, + -0.016125076, + -0.105696015, + -0.04119764, + -0.037104737, + -0.04235663, + -0.09278584, + 0.14735937, + 0.020735627, + -0.045876633, + -0.018912466, + 0.005711242, + -0.009913563, + 0.024871927, + -0.06426609, + -0.15703933, + -0.041478276, + -0.025513092, + 0.004146446, + 0.0027369705, + 0.0152090555, + 0.004832916, + -0.008007824, + 0.013515605, + 0.020614728, + -0.02136369, + -0.008227903, + 0.016406456, + 0.024098337, + 0.046697818, + -0.120193906, + 0.027101057, + 0.009577714, + 0.07102963, + -0.007563173, + 0.0075349766, + -0.046593536, + -0.06467278, + -0.017010622, + -0.033196267, + 0.097371556, + 0.023502331, + 0.033317775, + -0.07454437, + -0.014935438, + -0.0039703106, + -0.14381815, + -0.049301352, + 0.03187916, + -0.037372917, + -0.01412705, + 0.06712808, + 0.032425713, + 0.10737386, + 0.00763008, + -0.034527462, + -0.013202629, + -0.080443025, + -0.08540038, + 0.020914724, + 0.058374967, + -0.06886805, + -0.011377637, + 0.03356643, + -0.0036231182, + 0.0322898, + -0.0031708612, + 0.10451793, + -0.035254233, + -0.004960671, + 0.030832782, + 0.033010393, + 0.0014911285, + -0.016038226, + 0.09518363, + -0.012361809, + 0.056895707, + 0.0018552992, + -0.014633688, + 0.053164434, + 0.05655298, + -0.0752723, + 0.00476245, + -0.04156457, + -0.07343076, + -0.06410675, + 0.08829294, + -0.03837702, + -0.045774795, + -0.0535434, + -0.009111199, + 0.017617762, + -0.0067038187, + -0.032136917, + 0.03719991, + 0.11071319, + -0.057429407, + 0.08084802, + 0.009762534, + -0.031580847, + 0.05513017, + 0.0073544895, + 0.08761669, + 0.051413193, + 0.053174715, + -0.04282332, + -0.002029271, + 0.045968805, + -0.03927135, + -0.014048125, + 0.0013097908, + -0.031032057, + -0.044477988, + 0.027116014, + -0.036825214, + 0.10271662, + -0.0018023226, + -0.0014636678, + -0.006019342, + 0.0044439677, + -0.033970047, + 0.016475804, + -0.029752878, + -2.942642e-33, + -0.030636843, + -0.06274741, + -0.020331798, + 0.03409229, + -0.020994574, + -0.088351555, + -0.0338517, + -0.0656598, + 0.05194619, + -0.0248902, + -0.0019359031, + 0.03725905, + 0.0057854285, + 0.042536482, + 0.065458804, + 0.0020972108, + -0.07831122, + 0.040395204, + 0.048486684, + 0.00687325, + 0.04522804, + -0.08206775, + 0.015138996, + -0.032257374, + -0.0019286879, + 0.026958553, + 0.060303353, + 0.050539102, + -0.038990505, + 0.00901784, + 0.04728673, + 0.027277624, + -0.116268836, + 0.03641615, + 0.06792425, + 0.044476334, + 0.04822962, + -0.01417434, + 0.07136797, + 0.009212642, + -0.03981787, + -0.03105692, + 0.043964684, + -0.0550663, + 0.004194295, + 0.011075167, + 0.024179665, + -0.104039185, + -0.094535016, + -0.01598998, + -0.00955013, + -0.035388414, + -0.095118746, + -0.00013354272, + -0.02610455, + 0.08766882, + -0.012012526, + -0.058645394, + -0.013742904, + 0.01895158, + 0.10382739, + -0.0028419443, + 0.005811753, + 0.017534103, + 0.04102487, + 0.11672246, + 0.09343793, + 0.028574567, + 0.043363564, + 0.049141977, + 0.024069116, + -0.010946938, + -0.06667827, + -0.08498697, + 0.06469552, + -0.052791074, + 0.045889318, + -0.044994276, + 0.015019975, + 0.010133334, + 0.0097814165, + -0.051068403, + 0.0036321485, + -0.061966382, + 0.036911227, + -0.0015979146, + 0.01169187, + -0.08576613, + 0.018774707, + -0.007562373, + -0.091671936, + -0.038212627, + 0.020174108, + 0.018156078, + -0.04092911, + 1.0051959e-33, + -0.08226659, + 0.0099736005, + -0.0074784867, + 0.13932815, + -0.063385926, + -0.022954706, + -0.12405802, + 0.047431163, + -0.041625854, + -0.013952695, + 0.0074911104, + -0.00723795, + 0.059791762, + 0.038565084, + -0.0055844127, + 0.05114055, + -0.017901178, + 0.009323372, + -0.04395451, + -0.024585819, + -1.2245854e-06, + 0.09352475, + 0.0047693932, + -0.0018991354, + 0.008013757, + 0.011220997, + -0.091332994, + 0.068223536, + 0.007186999, + -0.03087612, + -0.051925, + -0.027689163, + -0.03313748, + 0.055571433, + 0.023570623, + 0.037202746, + 0.004727846, + -0.080162, + 0.025005471, + 0.06744095, + 0.0331283, + 0.0002482217, + -0.045369137, + -0.06479025, + 0.02353955, + -0.007544223, + -0.04817079, + 0.021955613, + 0.07905839, + -0.03857465, + 0.10292412, + 0.03352054, + -0.016577441, + -0.07671339, + -0.03904085, + 0.008326937, + 0.014512891, + -0.02780937, + -0.02199285, + 0.11556582, + -0.11817719, + -0.02172188, + 0.01028131, + 0.027112944, + 0.017912412, + 0.022188837, + 0.00472762, + 0.030003453, + -0.024873868, + -0.016057493, + 0.05167464, + 0.022278845, + -0.093714975, + 0.027581427, + -0.08995269, + 0.01922919, + 0.011267925, + -0.019333998, + -0.107179746, + -0.007825687, + -0.06112819, + -0.07851147, + -0.012788895, + 0.015774399, + -0.023736876, + 0.06481075, + 0.0530216, + -0.040838096, + -0.009374445, + -0.015252525, + -0.03356652, + 0.0034916159, + -0.106078364, + -0.0037814653, + -0.057664383, + -1.4659457e-08, + -0.013685479, + 0.038693503, + 0.055525444, + 0.01427137, + 0.106904596, + -0.024592703, + -0.05212622, + 0.14767331, + -0.04477857, + -0.06558989, + 0.09031646, + 0.0032307915, + 0.021561448, + 0.01542169, + 0.0686726, + 0.07787745, + 0.018880507, + 0.0329181, + -0.030444186, + 0.028748954, + 0.07327947, + -0.00473439, + 0.099678375, + -0.02951805, + 0.0157886, + -0.062414743, + -0.009774238, + 0.057640694, + 0.008111299, + 0.047539655, + -0.03485159, + 0.0672076, + -0.0011908566, + 0.0096628135, + 0.064021304, + -0.0030786463, + 0.020940661, + -0.05225545, + -0.06604623, + 0.025438625, + -0.037236795, + 0.10400888, + -0.045393974, + 0.010468508, + 0.042776387, + 0.0060471105, + 0.030909447, + 0.008940785, + -0.046136875, + -0.012257952, + 0.07956265, + 0.09894607, + 0.043950185, + 0.033127937, + 0.054626264, + 0.013538762, + 0.032767043, + -0.055712108, + -0.011724154, + 0.07334705, + -0.019697897, + -0.03568817, + -0.038236745, + -0.025074048 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 8, + "total_tokens": 8 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/c13d7510774c.json b/tests/integration/recordings/responses/c13d7510774c.json new file mode 100644 index 000000000..00e9659e9 --- /dev/null +++ b/tests/integration/recordings/responses/c13d7510774c.json @@ -0,0 +1,420 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": "This is the first text", + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.0011296043, + 0.06740522, + 0.015186453, + 0.037259158, + 0.02935556, + 0.015181291, + 0.07432997, + -0.0033194474, + 0.0658106, + -0.021833794, + 0.034404922, + 0.05099269, + -0.011411872, + -0.025082853, + -0.051754408, + 0.027195254, + 0.07849019, + -0.06000248, + 0.010478361, + -0.003392346, + 0.043441977, + 0.12292443, + 9.388175e-05, + 0.0021187037, + 0.018079525, + 0.045084555, + -0.097606525, + 0.11185215, + 0.049650617, + -0.0348426, + -0.039580915, + 0.0035499185, + 0.15893514, + 0.063421525, + 0.047970187, + 0.011613767, + 0.009793674, + 0.01536712, + 0.009413064, + 0.07999014, + 0.01915802, + -0.13722447, + 0.017290922, + 0.013689777, + 0.014259784, + -0.00021621982, + -0.017730612, + 0.022902183, + 0.035927463, + -0.015361024, + -0.00975885, + -0.040180918, + -0.011500755, + 0.00012558368, + 0.08540788, + 0.08731169, + 0.004690206, + 0.006160604, + 0.003023499, + 0.008887178, + -0.006278653, + 0.050593477, + 0.00053471717, + 0.04677382, + 0.09365536, + -0.012813678, + 0.0177166, + -0.06271032, + -0.11535796, + 0.04110661, + -0.014942371, + 0.044813167, + -0.020877626, + 0.04299617, + -0.06107898, + 0.01997848, + -0.0687263, + -0.035494387, + 0.04186985, + 0.012177578, + -0.029081868, + -0.066437304, + 0.030620316, + 0.05150629, + -0.12813967, + 0.06819209, + -0.047090717, + -0.032926783, + 0.007485966, + -0.017814271, + 0.038294822, + -0.015788501, + 0.07054281, + 0.03807343, + -0.114283286, + 0.042118594, + -0.111601785, + -0.04573834, + -0.02895515, + 0.12735783, + -0.013941619, + -0.027150463, + 0.072897464, + 0.024098374, + -0.054044593, + -0.13128933, + 0.030136578, + -0.023237763, + -0.019079136, + -0.0078745885, + -0.021944366, + -0.053324133, + -0.070892006, + -0.011552823, + -0.023377078, + -0.01562657, + 0.051452935, + 0.029251281, + 0.06480842, + 0.06403676, + 0.014424153, + -0.057994097, + -0.06993807, + -0.023921017, + -0.08493092, + -0.087801315, + 0.048142783, + -6.124397e-33, + 0.0103092175, + 0.038688924, + 0.003180582, + 0.03575604, + 0.005059993, + -0.0041896994, + -0.05389261, + -0.029881287, + -0.075520456, + -0.07879111, + -0.012291425, + -0.05053033, + 0.020719253, + -0.05190443, + -0.05927485, + -0.05987536, + -0.05572788, + 0.03220933, + -0.006331632, + -0.021651596, + -0.059913907, + 0.051977657, + 0.05122985, + -0.06350782, + -0.04872765, + -0.014282773, + 0.0025304393, + -0.024342295, + -0.0055265254, + 0.020074077, + -0.10194665, + 0.010741537, + -0.02318619, + -0.08105595, + -0.014973416, + 0.0017918752, + 0.045083463, + -0.05282281, + -0.053680934, + -0.013229242, + -0.019794637, + 0.020036008, + -0.00081875344, + -0.10115686, + -0.0006884125, + 0.09664284, + -0.03943104, + 0.04955554, + 0.042241447, + 0.007962193, + -0.052323878, + 0.05189162, + 0.037112337, + 0.034818016, + 0.063431285, + -0.02657652, + -0.009212341, + -0.0025556423, + -0.05609933, + 0.0020433308, + -0.020113751, + 0.0012227942, + -0.0017669081, + 0.019119242, + 0.016553605, + -0.011386767, + 0.010368127, + -0.00788346, + 0.046651863, + -0.046871297, + -0.085224025, + -0.008958986, + 0.012052177, + 0.013311017, + 0.015157192, + 0.03708167, + 0.026588887, + 0.014486772, + -0.013955214, + 0.019986698, + -0.06885552, + -0.07106239, + 0.012334861, + 0.03284816, + -0.03151976, + 0.045773514, + 0.067994975, + -0.077492714, + 0.018440822, + 0.06622958, + -0.08641996, + 0.008967366, + 0.04134085, + 0.009518882, + 0.006565088, + 4.711897e-33, + -0.02617601, + 0.0013207985, + -0.014141556, + -0.024331013, + 0.06929469, + 0.03143924, + 0.03726272, + 0.064707026, + 0.049426436, + 0.11073603, + 0.0498569, + 0.066796474, + 0.04154851, + -0.034098588, + 0.07028382, + 0.034863915, + 0.12904617, + -0.021078404, + 0.008925486, + 0.03016334, + -0.02286831, + 0.03649071, + -0.13193603, + 0.045608096, + -0.012805477, + 0.041747537, + 0.12321406, + -0.013507891, + -0.007307474, + -0.02975696, + 0.025006123, + -0.009506256, + 0.024761083, + 0.023204166, + -0.019123148, + 0.02259915, + 0.013744109, + -0.03847919, + -0.014476444, + 0.07522499, + 0.13586833, + 0.009872778, + -0.03752485, + -0.0273059, + -0.016470777, + -0.048831154, + -0.03521732, + -0.054363117, + -0.0017890002, + 0.035665076, + -0.010268516, + -0.018602924, + -0.036469962, + -0.055976517, + -0.007821111, + 0.00907826, + -0.0073335953, + 0.050373644, + -0.00025981313, + -0.036349144, + -0.024950698, + 0.058883175, + -0.07245624, + 0.07399545, + 0.053919416, + -0.051881794, + -0.0063462397, + 0.07852022, + -0.016959544, + -0.0066832895, + 0.01265072, + -0.014152041, + -0.13643119, + -0.085250236, + -0.017519519, + -0.00466121, + 0.0136799645, + 0.0009118405, + -0.071966685, + -0.06886893, + 0.14207116, + 0.03186518, + -0.05592076, + 0.030404905, + 0.061872244, + 0.029894035, + -0.00096155383, + -0.06500391, + -0.020616096, + 0.039591115, + -0.12383165, + 0.0028830946, + 0.051231142, + 0.13391772, + -0.08845233, + -1.7589368e-08, + -0.025769057, + -0.080324695, + -0.09164953, + 0.032005485, + 0.005889216, + 0.114638664, + 0.0233727, + -0.069048144, + -0.05594302, + -0.05788277, + 0.014665582, + 0.080326974, + 0.0036707798, + -0.030798541, + 0.024442635, + 0.008542568, + -0.05288123, + -0.06640491, + 0.00074039627, + -0.023801958, + 0.030778948, + 0.054075025, + -0.0027453878, + -0.09929041, + -0.0150463935, + 0.01624328, + -0.0015419688, + 0.011909824, + 0.007890519, + 0.0489657, + 0.004866092, + 0.08265809, + -0.0145542445, + -0.04386104, + 0.004611713, + 0.024626419, + 0.023854014, + 0.0236921, + 0.05076065, + -0.051832993, + 0.021252805, + -0.0033932943, + -0.021158189, + 0.020595197, + -0.06475187, + 0.054174356, + 0.027812954, + -0.05294382, + 0.015094968, + -0.119794324, + -0.034157146, + -0.012219483, + 0.047453884, + 0.020896995, + -0.026357891, + 0.015037571, + 0.033969007, + 0.05981613, + -0.052542053, + 0.033553857, + 0.06119396, + 0.09635468, + 0.11632743, + -0.016134953 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 5, + "total_tokens": 5 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/c48eb1cb6e1c.json b/tests/integration/recordings/responses/c48eb1cb6e1c.json new file mode 100644 index 000000000..b0a85a9c0 --- /dev/null +++ b/tests/integration/recordings/responses/c48eb1cb6e1c.json @@ -0,0 +1,422 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": [ + "What is the biological inspiration for neural networks?" + ], + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.10230838, + -0.08224274, + 0.02386987, + -0.03541601, + -0.01849779, + 0.05787613, + -0.031342823, + 0.030891433, + 0.07037451, + -0.027736247, + -0.047175303, + -0.0047223344, + -0.016741188, + 0.017356846, + -0.100889295, + 0.026418544, + -0.0675857, + 0.09431865, + -0.020842675, + -0.022413163, + -0.009295194, + 0.043116357, + 0.011911383, + 0.008668753, + -0.047908504, + 0.06344468, + -0.029300436, + 0.004667068, + 0.0005209494, + -0.03084027, + 0.096635215, + -0.009580088, + 0.010731579, + 0.020481875, + -0.08412081, + 0.059937492, + -0.088260904, + -0.0016671015, + 0.021768492, + -0.003979325, + -0.021763379, + -0.014259657, + 0.048000462, + 0.015427136, + 0.09755958, + 0.010355332, + 0.02050438, + -0.041266255, + 0.033273138, + -0.013968384, + -0.08825624, + -0.033225473, + -0.02127378, + 0.024471933, + 0.06127936, + 0.06119299, + -0.026490718, + 0.0151210865, + -0.06972876, + -0.010437868, + 0.040213317, + -0.011723281, + -0.06904643, + 0.020810815, + 0.037842188, + 0.022579413, + -0.055453606, + 0.023251032, + 0.08011199, + -0.044877384, + 0.088408746, + 0.02067646, + -0.051436704, + 0.025897857, + 0.018288882, + 0.065622754, + 0.065107845, + 0.03978978, + 0.019740887, + -0.072253615, + 5.9544687e-05, + -0.008543701, + 0.021967534, + 0.046294566, + 0.06427795, + 0.035292417, + 0.0147250565, + 0.03066073, + -0.07762946, + 0.00029099756, + -0.034139138, + -0.024901435, + -0.029611107, + -0.10678479, + -0.060683943, + -0.0017934343, + -0.023385558, + -0.078432895, + 0.002060721, + 0.028867336, + -0.02819569, + 0.009272651, + -0.017985396, + 0.014983593, + 0.07562587, + -0.017170474, + 0.064670265, + 0.002128402, + 0.1310938, + -0.06151175, + -0.06497303, + 0.051440425, + -0.05313471, + 0.016812937, + 0.04933477, + -0.023115465, + 0.0087483935, + -0.015650563, + 0.08556065, + 0.07376518, + -0.04275521, + -0.023489155, + -0.10277512, + -0.04004294, + -0.037418038, + 0.0035999252, + -0.15967175, + -5.147516e-33, + -0.0137625635, + 0.008369806, + 0.050065957, + 0.009015812, + 0.077434964, + -0.07842769, + 0.033915173, + -0.07100398, + 0.07608262, + -0.02990977, + -0.12365782, + 0.057408407, + -0.017269323, + 0.12205155, + 0.070205435, + -0.07705926, + -0.103943996, + -0.018815603, + 0.03340639, + -0.07087323, + -0.009640286, + 0.009892021, + 0.042712446, + -0.012349303, + -0.045281444, + -0.02289145, + -0.045452908, + 0.012000943, + 0.00091420225, + 0.008680777, + -0.0048628636, + 0.04511048, + -0.06120187, + -0.01901521, + 0.029624766, + 0.016965946, + 0.022491941, + -0.05770287, + 0.039217677, + 0.05591199, + 0.022302346, + -0.021667656, + 0.044868935, + -0.038508117, + 0.05678148, + 0.024347577, + -0.038980145, + 0.007459784, + -0.0036730687, + -0.028568147, + -0.008362538, + 0.012113232, + 0.03273877, + -0.107404694, + 0.027158631, + 0.00079790066, + -0.034335967, + 0.0028799083, + 0.004109312, + 0.06683407, + -0.021135451, + 0.03233578, + -0.0019597805, + 0.046820994, + 0.09051345, + 0.034042653, + -0.03681609, + -0.08244526, + 0.03867095, + 0.039461687, + 0.0073160445, + 0.052984253, + -0.07250948, + -0.115641944, + -0.06545622, + -0.0007324139, + -0.049901687, + -0.059578393, + -0.0645108, + 0.036021687, + -0.024459476, + -0.013289271, + -0.065466486, + 0.06002278, + -0.04428054, + 0.07694785, + 0.048521705, + -0.054440495, + -0.018412473, + -0.0016149838, + -0.06097182, + -0.038716663, + 0.06802589, + -0.05799783, + -0.08039679, + 3.611379e-33, + -0.08262067, + -0.03204657, + -0.028822388, + 0.048980672, + 0.030796362, + 0.07780006, + -0.021972818, + -0.002271387, + -0.03426234, + 0.080625765, + 0.031121854, + 0.047162402, + 0.07163762, + -0.0013501514, + 0.02559714, + -0.041637477, + -0.054521292, + -0.009806028, + 0.08774922, + -0.07525572, + 0.012750029, + 0.17170253, + -0.07512768, + -0.022949748, + 0.033555392, + 0.035889816, + -0.08415535, + 0.12036529, + -0.033030294, + 0.034908433, + -0.062138494, + 0.00796357, + -0.043817557, + 0.015032237, + 0.054430354, + 0.14010938, + 0.045014434, + -0.0058209584, + 0.01732776, + -0.039730564, + 0.028245388, + 0.01422878, + 0.012688427, + 0.03063463, + 0.039065775, + -0.044635378, + -0.052242752, + 0.040875368, + -0.040194053, + 0.061812058, + 0.05500572, + 0.019187871, + -0.045823988, + -0.06838901, + -0.024126342, + -0.0009639306, + 0.061077226, + -0.018251002, + 0.07766169, + -0.00567422, + -0.061061647, + -0.08588942, + 0.032846175, + -0.024012743, + -0.049680676, + 0.05839058, + -0.014167444, + 0.097144075, + 0.010775226, + -0.052071147, + 0.04610895, + 0.07335612, + 0.07120399, + 0.1028226, + -0.07930675, + -0.03850769, + -0.03020882, + -0.0041234274, + -0.04933009, + -0.036251605, + -0.0590083, + -0.07667668, + 0.004786309, + 0.004954009, + 0.0908305, + 0.0596148, + -0.039207857, + 0.011206131, + 0.030405426, + 0.018793559, + -0.0015877335, + 0.041109823, + -0.031416893, + 0.0556611, + -0.02737557, + -1.6181557e-08, + 0.007685041, + 0.01949905, + 0.07300238, + 0.020899568, + 0.052970223, + -0.03996715, + 0.04867212, + 0.0088583315, + -0.04270171, + -0.037400525, + 0.050844476, + 0.04526676, + -0.0035515544, + 0.034569085, + 0.08018272, + 0.0038954662, + 0.024755714, + 0.01738288, + -0.01202052, + 0.00085969194, + 0.036901433, + 0.031121632, + -0.052757226, + 0.030107595, + 0.09174762, + -0.09346625, + -0.03547636, + 0.03205761, + -0.004919257, + 0.048456274, + 0.009815509, + 0.071357235, + 0.038992055, + -0.033071395, + 0.00020657796, + 0.060076863, + -0.0016239597, + -0.0673076, + -0.10155186, + -0.06703537, + -0.06509405, + 0.031468824, + 0.012775417, + 0.0046917466, + 0.016282141, + -0.04024359, + 0.05850968, + -0.05423275, + 0.046367962, + 0.0020157802, + -0.038429447, + 0.040971108, + 0.011054457, + -0.0250188, + -0.041018736, + -0.015747897, + -0.03137312, + -0.08782612, + -0.06839822, + 0.051101774, + 0.0068214918, + 0.121207915, + 0.04955481, + -0.05083888 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 9, + "total_tokens": 9 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/dc978ebb7159.json b/tests/integration/recordings/responses/dc978ebb7159.json new file mode 100644 index 000000000..bd394a843 --- /dev/null +++ b/tests/integration/recordings/responses/dc978ebb7159.json @@ -0,0 +1,422 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": [ + "How do systems learn without explicit programming?" + ], + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.04984423, + -0.0065021752, + -0.07637173, + 0.03917369, + 0.00031861305, + -0.04042923, + 0.0011150879, + 0.003936656, + -0.019640122, + 0.06384856, + -0.023051452, + 0.037558515, + 0.047722198, + -0.03396131, + 0.0019017205, + -0.05376357, + -0.08049833, + 0.029636204, + 0.03433438, + -0.10370592, + -0.012407874, + -0.036972973, + -0.03961349, + -0.010151935, + 0.014429107, + 0.08523679, + -0.00839657, + 0.020103412, + 0.01863058, + -0.004850945, + 0.052703105, + 0.03198295, + 0.09851406, + -0.021857157, + -0.030757615, + 0.029216181, + 0.007728418, + -0.023179187, + -0.024685089, + -0.00815707, + -0.13637935, + 0.043761857, + -0.02209246, + 0.039698977, + 0.09477744, + 0.019010609, + -0.04610655, + -0.043215692, + -0.045460463, + -0.06836739, + -0.1530461, + -0.034367662, + 0.013275635, + -0.03926102, + -0.019648515, + 0.028101413, + 0.025540326, + 0.089463815, + -0.06327886, + -0.02595456, + -0.11979868, + -0.12334712, + -0.087600626, + -0.013221264, + 0.013799792, + 0.015545913, + 0.00064019626, + 0.040825542, + 0.07697552, + -0.030981697, + -0.06173165, + 0.0036019792, + -0.022016058, + 0.0018515446, + 0.05704056, + -0.06933254, + 0.020957416, + 0.064757325, + -0.0020772594, + -0.0064814533, + -0.06261177, + -0.015868051, + -0.037469238, + 0.07497992, + 0.065091245, + 0.039346796, + 0.012607916, + 0.08583316, + 0.06540376, + 0.0011848691, + -0.00564589, + -0.08397946, + -0.059715644, + -0.031260643, + 0.056604136, + 0.029362248, + 0.087739736, + -0.08420318, + -0.04931336, + 0.09726916, + -0.0017463911, + 0.019265981, + 0.057564486, + -0.008517195, + -0.040554836, + 0.02923812, + 0.061266143, + 0.02060355, + 0.076881945, + -0.12177566, + -0.024966033, + 0.00019745702, + 0.005747222, + 0.014114126, + -0.03401446, + -0.0013969344, + 0.01964643, + -0.047716763, + 0.031978507, + 0.028447492, + -0.009964347, + -0.017102454, + -4.63913e-07, + 0.08103938, + -0.0346138, + -0.009416571, + -0.066550575, + -3.9539905e-33, + -0.007294673, + 0.0067699, + 0.06725818, + 0.03072976, + -0.0117797265, + -0.041026328, + 0.06852793, + -0.037222322, + 0.027420986, + 0.066954724, + 0.043863658, + 0.0061272033, + 0.061314374, + 0.10138567, + 0.08718787, + 0.037215915, + -0.06740457, + 0.023863165, + 0.014470287, + -0.02899169, + 0.0893073, + 0.035965327, + 0.005637208, + -0.10819648, + 0.023759954, + 0.051624484, + -0.011389106, + -0.016350063, + 0.035536684, + 0.0097545255, + -0.030856358, + 0.04067114, + -0.02971763, + 0.0697159, + 0.061810073, + 0.025801104, + 0.03703326, + -0.0021732633, + 0.08720141, + -0.053768326, + 0.06975253, + -0.044379126, + 0.05350251, + -0.014546655, + 0.0019427998, + 0.022796933, + 0.02047684, + -0.02788562, + -0.11744917, + -0.008886625, + -0.030535355, + 0.0013790294, + -0.016426755, + -0.07323933, + 0.010640432, + 0.08230106, + -0.012989938, + -0.015557066, + -0.044253703, + 0.06853842, + 0.0044834577, + 0.027410327, + 0.07402351, + 0.04888233, + -0.0063870386, + 0.046451516, + -0.057963096, + 0.059795424, + 0.086261205, + 0.025499415, + -0.057358176, + 0.045224484, + -0.07970627, + -0.036587525, + 0.02942726, + -0.038539898, + 0.06695297, + -0.08024641, + 0.03596079, + 0.04907759, + 0.029716326, + -0.03762173, + 0.03575466, + 0.001120044, + -0.031716947, + 0.0017757203, + -0.017645523, + 0.00049374095, + -0.036480494, + -0.07056745, + -0.04874728, + -0.05242818, + -0.06110843, + 0.037233498, + 0.04336727, + 1.5320788e-33, + -3.120197e-05, + 0.034649298, + -0.06958097, + -0.036047626, + -0.06801936, + 0.025326911, + -0.026467822, + -0.048150625, + -0.0030122146, + -0.02290719, + -0.03227551, + 0.0039322567, + -0.011214182, + 0.0614351, + -0.0037066569, + 0.039574537, + -0.09324765, + 0.067733236, + 0.013552073, + 0.04235003, + -0.04189811, + 0.049444646, + -0.065833166, + -0.01233075, + 0.026274677, + 0.036287695, + -0.0334494, + 0.10760298, + -0.030157905, + 0.05457912, + 0.030266814, + -0.048794933, + -0.025447104, + 0.020995017, + 0.016946187, + 0.031217054, + -0.014045975, + 0.054221038, + -0.07935839, + 0.033861484, + 0.040884778, + -0.014036171, + -0.048716463, + 0.006645244, + 0.027014922, + -0.01226374, + -0.05664712, + 0.012521781, + 0.012314198, + 0.010800098, + 0.05154809, + -0.03332023, + -0.038100664, + -0.09299292, + -0.038066074, + -0.028879175, + 0.052126266, + 0.040313665, + 0.050321303, + -0.008574894, + -0.051285632, + -0.08658571, + 0.0047743064, + 0.0066671823, + -0.037727214, + -0.024325253, + -0.04543155, + 0.0031582855, + 0.02749873, + -0.038236838, + 0.0398463, + 0.077743076, + -0.06533558, + -0.043217026, + 0.03869133, + 0.053244475, + -0.08044849, + -0.040810138, + -0.09834583, + -0.0861473, + 0.0520938, + 0.024795571, + 0.047273915, + 0.040170223, + -0.04087483, + 0.065172985, + 0.012024152, + -0.007874287, + -0.008081423, + -0.055300366, + 0.0023381007, + 0.028444031, + 0.02559316, + 0.011821741, + -0.1240692, + -1.5521888e-08, + -0.006481896, + -0.03777657, + 0.059614006, + -0.028193146, + 0.08015819, + 0.08605758, + -0.031213695, + 0.024660977, + -0.0601782, + -0.020654697, + -0.011957175, + 0.017313287, + 0.037322048, + 0.018506147, + 0.06202185, + 0.14393596, + 0.08757671, + 0.046496816, + -0.07269094, + 0.015122184, + 0.08358854, + -0.033304404, + -0.017314732, + 0.07350395, + 0.0056664916, + -0.08582263, + -0.045254916, + 0.062497266, + 0.09928107, + 0.08590313, + 0.033792242, + -0.008237271, + 0.0032627704, + -0.012479878, + 0.02377827, + 0.04318741, + 0.03469096, + -0.06260408, + -0.042039912, + -0.12014508, + -0.14268656, + 0.068984255, + 0.0037130509, + -0.01937347, + -0.03493163, + 0.01472315, + -0.063192435, + -0.09795864, + -0.033808086, + -0.010213174, + 0.033770446, + 0.07557054, + -0.041042008, + 0.022023367, + 0.05567624, + 0.02822099, + -0.025627017, + -0.043879252, + -0.044397317, + 0.119338974, + -0.08721394, + 0.07055854, + 0.04949986, + -0.039747704 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 8, + "total_tokens": 8 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/dee1518c6628.json b/tests/integration/recordings/responses/dee1518c6628.json new file mode 100644 index 000000000..9457a291b --- /dev/null +++ b/tests/integration/recordings/responses/dee1518c6628.json @@ -0,0 +1,422 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": [ + "precomputed embedding test" + ], + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.018036319, + -0.012765047, + 0.03125965, + -0.02375151, + 0.025379343, + 0.060499735, + -0.02026708, + -0.012985666, + -0.043284714, + -0.024622917, + 0.02486436, + -0.03497649, + 0.027742712, + 0.032537967, + -0.07889987, + 0.009495538, + 0.108338796, + 0.07935357, + -0.05853841, + -0.017992375, + -0.06673812, + -0.0032593964, + 0.0132823065, + -0.0308506, + 0.044666506, + -0.06442589, + -0.041590516, + 0.057770588, + 0.111606374, + -0.051381156, + 0.12421504, + -0.018106857, + -0.0020854468, + 0.08215056, + -0.015330762, + 0.0479669, + 0.020125136, + -0.048337292, + -0.018317815, + 0.059444938, + 0.00047365576, + -0.012958252, + 0.028859986, + 0.040130712, + 0.029784055, + -0.015360712, + 0.008897483, + 0.008520841, + -0.101540424, + -0.039096564, + -0.0021748266, + 0.0013204592, + -0.05096974, + -0.055848837, + -0.057836458, + -0.0626853, + 0.021702537, + -0.050089337, + 0.04033438, + 0.03354133, + -0.010003805, + -0.08682413, + 0.07376202, + 0.008009445, + 0.022172567, + 0.023164645, + 0.027895318, + 0.035225768, + 0.017997501, + 0.09853605, + -0.020658517, + 0.027008843, + -0.050064307, + 0.04682815, + 0.00912333, + 0.07885718, + -0.018593438, + -0.07773581, + 0.109442696, + -0.11206324, + 0.010433095, + -0.073395275, + -0.006636955, + -0.042505022, + 0.12505825, + 0.097990945, + 0.06610694, + -0.0039949734, + -0.0817807, + -0.009407832, + 0.043290764, + -0.017194442, + -0.079182185, + 0.08731865, + -0.0055716676, + -0.024277646, + -0.026291223, + -0.021169199, + 0.027703164, + 0.11184553, + 0.008138305, + 0.00927679, + 0.060843308, + 0.031740803, + -0.027763257, + -0.067542285, + 0.083235115, + -0.010722409, + -0.003596879, + -0.03731031, + 0.0005883539, + -0.063687496, + 0.008766459, + 0.032250904, + -0.03564036, + -0.07344927, + 0.04179759, + 0.02855851, + -0.024623597, + -0.023432637, + 0.028878128, + 0.041853584, + 0.0432781, + 0.007851593, + 0.022038134, + -0.05595884, + 0.016461687, + 2.7094954e-33, + 0.006504033, + -0.051044505, + 0.021099899, + 0.07969017, + -0.04368391, + 0.014904434, + -0.032851998, + 0.13599935, + -0.05613122, + 0.06516371, + -0.020240407, + 0.05305463, + -0.044792183, + 0.08281265, + -0.01823444, + 0.033745598, + -0.016067084, + -0.039737612, + -0.05091073, + -0.003835655, + 0.015519713, + -0.030288516, + -0.050942086, + -0.11592442, + -0.07665286, + -0.06567756, + 0.019765161, + -0.06823771, + -0.07424318, + 0.025792379, + -0.14317486, + -0.07891553, + -0.021228878, + 0.039634928, + -0.016802909, + -0.044120707, + 0.006634243, + 0.0058715795, + -0.07995874, + 0.002443334, + -0.026899977, + -0.0013412291, + 0.002038266, + -0.03384139, + 0.005931528, + -0.046065018, + -0.034714635, + 0.025317542, + 0.01906024, + -0.024228983, + 0.019573852, + 0.03944586, + -0.03334646, + -0.0768601, + 0.005452342, + -0.003161199, + 0.000542002, + 0.018255332, + 0.074605905, + 0.025135716, + -0.10989631, + 0.011247026, + -0.050927915, + 0.07583658, + -0.12486867, + -0.05912801, + -0.0036061911, + -0.085416466, + 0.03914342, + 0.072747745, + 0.011503597, + 0.027539955, + -0.08109587, + -0.03039898, + -0.034653284, + 0.03224371, + -0.035028238, + 0.010218407, + -0.021780575, + 0.0010573319, + 0.013816383, + -0.028883183, + 0.017164033, + -0.052959263, + -0.012570558, + -0.16902319, + 0.030648956, + -0.10055485, + 0.026650762, + -0.071228996, + 0.00929425, + 0.017895814, + -0.035329636, + -0.038097598, + 0.116071835, + -2.2713515e-33, + 0.04127089, + 0.0837146, + 0.00899163, + 0.1357995, + -0.009237686, + 0.0038942713, + 0.061383113, + 0.014725109, + -0.08240016, + 0.05106149, + 0.052162398, + -0.0912485, + 0.01875351, + -0.050305407, + -0.0038576927, + 0.008774803, + -0.081945315, + -0.060020786, + 0.0164221, + 0.043100134, + -0.04116915, + 0.045944594, + 0.03755043, + 0.03274042, + -0.0074182185, + 0.08625352, + 0.037703313, + -0.00028144967, + -0.03562357, + 0.020237584, + -0.0062212464, + -0.019175837, + -0.05541716, + 0.034526624, + -0.02858707, + 0.0044915355, + 0.07259016, + 0.041983698, + 0.011109383, + 0.01880668, + 0.097080804, + 0.09413544, + -0.12913938, + 0.035041332, + -0.004425682, + -0.012205947, + -0.0016557154, + -0.05068707, + 0.15884145, + -0.012549114, + -0.021348534, + 0.03251363, + 0.04628448, + 0.054376245, + 0.006818182, + -0.027170561, + -0.061862, + -0.04534394, + -0.008363168, + 0.04019932, + -0.016715363, + -0.040953267, + 0.039559525, + -0.021472331, + 0.0055409903, + -0.08493741, + -0.03832763, + 0.1039703, + -0.020331193, + 0.02971218, + -0.0398032, + 0.03509529, + -0.0034297209, + -0.0068248124, + 0.053155076, + 0.011865219, + 0.04659949, + 0.02414787, + 0.068505645, + -0.00950228, + -0.006530904, + -0.03784911, + -0.013784687, + 0.021332197, + 0.030621022, + 0.10304789, + 0.0277674, + 0.007172984, + 0.0043231216, + 0.009159756, + 0.069140956, + 0.087634236, + -0.04637307, + 0.01820922, + 0.065394066, + -1.7640973e-08, + -0.06085519, + -0.07559385, + 0.044326548, + -0.02475008, + -0.061372478, + -0.045398142, + 0.020677099, + -0.034321737, + -0.03518944, + -0.023759514, + 0.027770184, + -0.0021794396, + -0.053482134, + -0.01962642, + -0.041778073, + -0.00094788696, + -0.043084495, + -0.011593622, + -0.0050855135, + 0.065776914, + -0.057164006, + 0.09555621, + 0.088908434, + -0.022197992, + -0.06730014, + -0.022787703, + 0.018815845, + 0.029995734, + 0.055323604, + 0.050712243, + 0.02092121, + 0.06544876, + -0.037383437, + -0.078021176, + -0.039648075, + 0.095848694, + 0.06603057, + -0.010790092, + -0.047517296, + 0.034212835, + -0.059543293, + -0.020928971, + 0.0043123127, + -0.09709055, + 0.06944257, + -0.046936724, + 0.0026605395, + 0.014065412, + 0.0018252941, + -0.014995255, + 0.018496186, + -0.02638827, + -0.06663817, + 0.03671545, + -0.006582465, + 0.015744653, + 0.024058202, + 0.038391512, + -0.06430364, + 0.013741025, + 0.0057411646, + -0.025728337, + 0.07752631, + -0.014778744 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 7, + "total_tokens": 7 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/f23defea82ec.json b/tests/integration/recordings/responses/f23defea82ec.json new file mode 100644 index 000000000..1e964af04 --- /dev/null +++ b/tests/integration/recordings/responses/f23defea82ec.json @@ -0,0 +1,53 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": "Test dimensions parameter", + "encoding_format": "float", + "dimensions": 16 + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.253706, + 0.016367152, + -0.29664654, + 0.31654558, + -0.18624601, + 0.07602756, + -0.031531323, + 0.2986085, + -0.49672848, + -0.36617878, + 0.25328273, + -0.33349335, + 0.0060151755, + 0.14081024, + -0.13757885, + -0.14679416 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 3, + "total_tokens": 3 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/fbc7b626714d.json b/tests/integration/recordings/responses/fbc7b626714d.json new file mode 100644 index 000000000..5a19f77e5 --- /dev/null +++ b/tests/integration/recordings/responses/fbc7b626714d.json @@ -0,0 +1,422 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": [ + "duplicate" + ], + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.07723481, + -0.052392416, + -0.018403785, + 0.018809898, + -0.06850049, + -0.08415798, + 0.08627596, + 0.057042625, + 0.1137151, + -0.035988595, + 0.008720381, + -0.014372572, + 0.003901994, + 0.004317388, + -0.03761112, + -0.010990604, + -0.030473465, + -0.056204744, + -0.08675482, + -0.0040784916, + 0.005927903, + 0.015254265, + -0.056596924, + 0.047575373, + -0.016673235, + 0.02939919, + -0.022867588, + 0.07794844, + -0.021308443, + -0.104720965, + -0.0044066194, + 0.020771164, + 0.041487455, + -0.002801806, + 0.026976122, + 0.031067945, + -0.015480108, + 0.015977077, + 0.048875555, + -0.049825303, + -0.026281167, + -0.094117, + -0.025465509, + 0.014173141, + -0.010752944, + 0.066996746, + -0.018940678, + 0.03369072, + 0.040881984, + 0.02594592, + -0.012495756, + -0.02398617, + -0.026922934, + -0.0543868, + 0.12576863, + 0.014073914, + -0.076657854, + 0.042456653, + 0.019858882, + -0.014813843, + 0.04136103, + 0.070308894, + -0.0505636, + 0.08274185, + 0.049387515, + 0.01242514, + -0.004342139, + 0.0060508037, + -0.06873101, + -0.044221923, + 0.0111296205, + 0.099277854, + 0.002195328, + 0.08264344, + 0.026029712, + -0.031148281, + -0.0066806604, + -0.02216516, + 0.017202012, + 0.039319362, + -0.08426506, + -0.070138715, + -0.04162779, + -0.030229673, + 0.04802304, + 0.008936529, + 0.059146732, + -0.005168819, + -0.063863754, + -0.047433022, + -0.076941736, + 0.10710207, + 0.028398348, + -0.045075897, + -0.09501521, + 0.0014021338, + 0.018752577, + 0.053793173, + -0.058218755, + 0.23251592, + 0.014802284, + 0.04777388, + 0.015468174, + 0.011517924, + 0.0057089743, + -0.06294971, + -0.029086681, + 0.047267407, + 0.0013279485, + -0.043141574, + -0.030762771, + 0.006162875, + -0.016028566, + 0.034785092, + 0.06278112, + 0.0028944365, + 0.010565067, + 0.027719874, + 0.050682083, + -0.051462214, + 0.007760078, + 0.0027973612, + 0.035400815, + -0.002197845, + -0.053151082, + -0.10212597, + 0.037041765, + -2.672083e-33, + 0.0018480063, + -0.06453657, + 0.083521925, + 0.0075648427, + 0.037389643, + -0.050077397, + 0.0140220765, + 0.020539388, + -0.07190968, + 0.011489869, + 0.02256463, + 0.031297375, + -0.01618283, + 0.01542062, + 0.008930395, + -0.021195678, + 0.03439526, + 0.07886608, + -0.071329735, + 0.03709414, + -0.0140279215, + 0.114675336, + 0.0277295, + 0.10310165, + 0.0020623626, + -0.011630357, + 0.023930384, + -0.11260563, + 0.044674613, + 0.02574306, + 0.014368915, + 0.010857506, + -0.0005184862, + 0.12752494, + -0.004782285, + 0.009942966, + 0.083977275, + -0.071016215, + -0.019095415, + -0.040561743, + -0.05932095, + -0.010432282, + -0.071015865, + -0.040670767, + 0.085865766, + -0.018423026, + -0.015194733, + -0.052006386, + 0.043850828, + 0.014281553, + 0.020744322, + -0.0415732, + -0.050111413, + -0.014709909, + -0.08761856, + -0.043001, + 0.043047283, + -0.05384068, + -0.015601679, + 0.11197424, + 0.06798796, + 0.10911268, + -0.06948746, + 0.008946114, + 0.015466258, + -0.03691151, + 0.085061856, + -0.05947063, + 0.015293544, + -0.060189657, + -0.0060416507, + -0.09115727, + -0.013619676, + -0.037012577, + 0.04787018, + -0.10025333, + -0.019801194, + 0.07995546, + -0.012938982, + -0.018830338, + -0.05902157, + 0.0025186618, + -0.014529196, + -0.021240592, + -0.0017719648, + 0.07715808, + -0.050996855, + -0.10497942, + -0.0074073984, + 0.052044842, + 0.016423032, + -0.00921913, + 0.05524721, + 0.0038194568, + -0.020100316, + 2.5461884e-33, + -0.03895339, + -0.043895483, + 0.037901826, + 0.07469894, + 0.014612607, + -0.031076996, + 0.03934075, + 0.008711932, + -0.079657085, + 0.009069497, + 0.018917, + -0.04523579, + 0.08417748, + -0.032511797, + -0.014312169, + 0.031856265, + 0.055124972, + 0.008299075, + -0.086495705, + 0.03355531, + -0.038741786, + 0.011819997, + 0.008630874, + 0.040437095, + -0.029615412, + 0.015536198, + 0.017026586, + 0.008211814, + 0.055457912, + -0.047788087, + 0.12585849, + 0.001235511, + -0.056634903, + -0.049676068, + 0.019741468, + 0.10201284, + 0.05258106, + 0.0051925797, + -0.007739067, + 0.031301394, + 0.1017691, + -0.0090217255, + 0.012812148, + 0.11790627, + 0.020575516, + -0.042215355, + -0.006931973, + 0.022653406, + 0.047333714, + -0.022842428, + -0.05133142, + -0.0052753934, + -0.07623422, + -0.042385325, + 0.019540586, + -0.06629356, + 0.021332396, + 0.030484285, + 0.050311048, + -0.09921724, + 0.047778424, + 0.023995804, + -0.09240823, + 0.05245915, + -0.027156133, + -0.0349422, + -0.035126984, + 0.07986612, + 0.012397284, + -0.016370183, + -0.114555776, + -0.011922229, + -0.048613384, + -0.009849635, + 0.008354489, + -0.040733486, + 0.012452433, + 0.117823996, + -0.083515376, + 0.021853834, + 0.016437136, + -0.067386985, + -0.057326417, + 0.022280162, + -0.09073611, + -0.012396659, + 0.08770095, + 0.037985563, + -0.008248762, + -0.033765234, + -0.06454174, + 0.075496756, + -0.06106373, + 0.03420569, + -0.03459085, + -1.4668667e-08, + 0.01014663, + 0.094229266, + -0.0064371885, + 0.044077396, + 0.07245818, + -0.022373974, + -0.023869356, + -0.022925967, + -0.008693665, + 0.05403153, + 0.01552644, + -0.008120085, + -0.023631452, + 0.05658223, + 0.04775426, + -0.07261641, + -0.08463776, + -0.028445715, + 0.038068987, + 0.05120579, + 0.008737017, + 0.020222854, + 0.032309767, + -0.029347662, + -0.00843886, + -0.030422177, + -0.0018208751, + 0.04668449, + -0.014278727, + -0.011475838, + -0.012052811, + 0.039978012, + -0.048512205, + -0.05465097, + -0.037458897, + -0.025823507, + 0.008056201, + 0.0097499145, + -0.011502389, + 0.017063541, + 0.0016953654, + -0.0576531, + 0.09602806, + 0.0087568015, + 0.012305608, + -0.015205382, + 0.066060565, + -0.09770103, + 0.0019023182, + 0.011779348, + -0.032897696, + 0.018646581, + 0.097607486, + 0.030113736, + 0.07676848, + 0.016403947, + 0.022269176, + -0.009697165, + -0.031065438, + 0.05420531, + 0.14508335, + -0.049234875, + 0.05420719, + 0.054204132 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 1, + "total_tokens": 1 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/suites.py b/tests/integration/suites.py index 649cd1c2e..860b8c6ba 100644 --- a/tests/integration/suites.py +++ b/tests/integration/suites.py @@ -55,7 +55,7 @@ SETUP_DEFINITIONS: dict[str, Setup] = { }, defaults={ "text_model": "ollama/llama3.2:3b-instruct-fp16", - "embedding_model": "sentence-transformers/all-MiniLM-L6-v2", + "embedding_model": "ollama/all-minilm:l6-v2", "safety_model": "ollama/llama-guard3:1b", "safety_shield": "llama-guard", }, @@ -68,7 +68,7 @@ SETUP_DEFINITIONS: dict[str, Setup] = { }, defaults={ "vision_model": "ollama/llama3.2-vision:11b", - "embedding_model": "sentence-transformers/all-MiniLM-L6-v2", + "embedding_model": "ollama/all-minilm:l6-v2", }, ), "vllm": Setup( From b67aef2fc42b4f8cbddf0bec2c846234c869e04c Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Thu, 25 Sep 2025 17:17:00 -0400 Subject: [PATCH 20/27] feat: add static embedding metadata to dynamic model listings for providers using OpenAIMixin (#3547) # What does this PR do? - remove auto-download of ollama embedding models - add embedding model metadata to dynamic listing w/ unit test - add support and tests for allowed_models - removed inference provider models.py files where dynamic listing is enabled - store embedding metadata in embedding_model_metadata field on inference providers - make model_entries optional on ModelRegistryHelper and LiteLLMOpenAIMixin - make OpenAIMixin a ModelRegistryHelper - skip base64 embedding test for remote::ollama, always returns floats - only use OpenAI client for ollama model listing - remove unused build_model_entry function - remove unused get_huggingface_repo function ## Test Plan ci w/ new tests --- .../self_hosted_distro/nvidia.md | 19 --- llama_stack/distributions/nvidia/nvidia.py | 9 +- llama_stack/distributions/nvidia/run.yaml | 85 +---------- .../providers/remote/eval/nvidia/eval.py | 3 +- .../remote/inference/anthropic/anthropic.py | 14 +- .../remote/inference/anthropic/models.py | 40 ----- .../providers/remote/inference/azure/azure.py | 2 - .../remote/inference/azure/models.py | 28 ---- .../remote/inference/bedrock/bedrock.py | 2 +- .../remote/inference/cerebras/cerebras.py | 5 - .../remote/inference/cerebras/models.py | 28 ---- .../remote/inference/databricks/databricks.py | 43 ++---- .../remote/inference/fireworks/fireworks.py | 7 +- .../remote/inference/fireworks/models.py | 70 --------- .../remote/inference/gemini/gemini.py | 6 +- .../remote/inference/gemini/models.py | 34 ----- .../providers/remote/inference/groq/groq.py | 3 - .../providers/remote/inference/groq/models.py | 48 ------ .../inference/llama_openai_compat/llama.py | 3 - .../inference/llama_openai_compat/models.py | 25 ---- .../remote/inference/nvidia/models.py | 109 -------------- .../remote/inference/nvidia/nvidia.py | 17 ++- .../remote/inference/ollama/models.py | 106 -------------- .../remote/inference/ollama/ollama.py | 138 +++++++----------- .../remote/inference/openai/models.py | 60 -------- .../remote/inference/openai/openai.py | 7 +- .../inference/passthrough/passthrough.py | 2 +- .../remote/inference/sambanova/models.py | 28 ---- .../remote/inference/sambanova/sambanova.py | 2 - .../remote/inference/together/models.py | 103 ------------- .../remote/inference/together/together.py | 18 ++- .../remote/inference/vertexai/models.py | 20 --- .../remote/inference/vertexai/vertexai.py | 2 - .../providers/remote/inference/vllm/vllm.py | 2 +- .../remote/inference/watsonx/watsonx.py | 2 +- .../utils/inference/litellm_openai_mixin.py | 6 +- .../utils/inference/model_registry.py | 27 +--- .../providers/utils/inference/openai_mixin.py | 47 ++++-- .../models-bd032f995f2a-3255f444.json | 96 ++++++++++++ .../inference/test_litellm_openai_mixin.py | 1 - tests/unit/providers/nvidia/test_eval.py | 2 +- .../utils/inference/test_openai_mixin.py | 110 +++++++++++++- .../providers/utils/test_model_registry.py | 4 +- 43 files changed, 368 insertions(+), 1015 deletions(-) delete mode 100644 llama_stack/providers/remote/inference/anthropic/models.py delete mode 100644 llama_stack/providers/remote/inference/azure/models.py delete mode 100644 llama_stack/providers/remote/inference/cerebras/models.py delete mode 100644 llama_stack/providers/remote/inference/fireworks/models.py delete mode 100644 llama_stack/providers/remote/inference/gemini/models.py delete mode 100644 llama_stack/providers/remote/inference/groq/models.py delete mode 100644 llama_stack/providers/remote/inference/llama_openai_compat/models.py delete mode 100644 llama_stack/providers/remote/inference/nvidia/models.py delete mode 100644 llama_stack/providers/remote/inference/ollama/models.py delete mode 100644 llama_stack/providers/remote/inference/openai/models.py delete mode 100644 llama_stack/providers/remote/inference/sambanova/models.py delete mode 100644 llama_stack/providers/remote/inference/together/models.py delete mode 100644 llama_stack/providers/remote/inference/vertexai/models.py create mode 100644 tests/integration/recordings/responses/models-bd032f995f2a-3255f444.json diff --git a/docs/docs/distributions/self_hosted_distro/nvidia.md b/docs/docs/distributions/self_hosted_distro/nvidia.md index fba411640..1e52797db 100644 --- a/docs/docs/distributions/self_hosted_distro/nvidia.md +++ b/docs/docs/distributions/self_hosted_distro/nvidia.md @@ -37,25 +37,6 @@ The following environment variables can be configured: - `INFERENCE_MODEL`: Inference model (default: `Llama3.1-8B-Instruct`) - `SAFETY_MODEL`: Name of the model to use for safety (default: `meta/llama-3.1-8b-instruct`) -### Models - -The following models are available by default: - -- `meta/llama3-8b-instruct ` -- `meta/llama3-70b-instruct ` -- `meta/llama-3.1-8b-instruct ` -- `meta/llama-3.1-70b-instruct ` -- `meta/llama-3.1-405b-instruct ` -- `meta/llama-3.2-1b-instruct ` -- `meta/llama-3.2-3b-instruct ` -- `meta/llama-3.2-11b-vision-instruct ` -- `meta/llama-3.2-90b-vision-instruct ` -- `meta/llama-3.3-70b-instruct ` -- `nvidia/vila ` -- `nvidia/llama-3.2-nv-embedqa-1b-v2 ` -- `nvidia/nv-embedqa-e5-v5 ` -- `nvidia/nv-embedqa-mistral-7b-v2 ` -- `snowflake/arctic-embed-l ` ## Prerequisites diff --git a/llama_stack/distributions/nvidia/nvidia.py b/llama_stack/distributions/nvidia/nvidia.py index 779fabf2c..b41eea130 100644 --- a/llama_stack/distributions/nvidia/nvidia.py +++ b/llama_stack/distributions/nvidia/nvidia.py @@ -7,12 +7,11 @@ from pathlib import Path from llama_stack.core.datatypes import BuildProvider, ModelInput, Provider, ShieldInput, ToolGroupInput -from llama_stack.distributions.template import DistributionTemplate, RunConfigSettings, get_model_registry +from llama_stack.distributions.template import DistributionTemplate, RunConfigSettings from llama_stack.providers.inline.files.localfs.config import LocalfsFilesImplConfig from llama_stack.providers.remote.datasetio.nvidia import NvidiaDatasetIOConfig from llama_stack.providers.remote.eval.nvidia import NVIDIAEvalConfig from llama_stack.providers.remote.inference.nvidia import NVIDIAConfig -from llama_stack.providers.remote.inference.nvidia.models import MODEL_ENTRIES from llama_stack.providers.remote.safety.nvidia import NVIDIASafetyConfig @@ -68,9 +67,6 @@ def get_distribution_template(name: str = "nvidia") -> DistributionTemplate: provider_id="nvidia", ) - available_models = { - "nvidia": MODEL_ENTRIES, - } default_tool_groups = [ ToolGroupInput( toolgroup_id="builtin::rag", @@ -78,7 +74,6 @@ def get_distribution_template(name: str = "nvidia") -> DistributionTemplate: ), ] - default_models, _ = get_model_registry(available_models) return DistributionTemplate( name=name, distro_type="self_hosted", @@ -86,7 +81,6 @@ def get_distribution_template(name: str = "nvidia") -> DistributionTemplate: container_image=None, template_path=Path(__file__).parent / "doc_template.md", providers=providers, - available_models_by_provider=available_models, run_configs={ "run.yaml": RunConfigSettings( provider_overrides={ @@ -95,7 +89,6 @@ def get_distribution_template(name: str = "nvidia") -> DistributionTemplate: "eval": [eval_provider], "files": [files_provider], }, - default_models=default_models, default_tool_groups=default_tool_groups, ), "run-with-safety.yaml": RunConfigSettings( diff --git a/llama_stack/distributions/nvidia/run.yaml b/llama_stack/distributions/nvidia/run.yaml index 362970d2e..3f3cfc514 100644 --- a/llama_stack/distributions/nvidia/run.yaml +++ b/llama_stack/distributions/nvidia/run.yaml @@ -92,90 +92,7 @@ metadata_store: inference_store: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/nvidia}/inference_store.db -models: -- metadata: {} - model_id: meta/llama3-8b-instruct - provider_id: nvidia - provider_model_id: meta/llama3-8b-instruct - model_type: llm -- metadata: {} - model_id: meta/llama3-70b-instruct - provider_id: nvidia - provider_model_id: meta/llama3-70b-instruct - model_type: llm -- metadata: {} - model_id: meta/llama-3.1-8b-instruct - provider_id: nvidia - provider_model_id: meta/llama-3.1-8b-instruct - model_type: llm -- metadata: {} - model_id: meta/llama-3.1-70b-instruct - provider_id: nvidia - provider_model_id: meta/llama-3.1-70b-instruct - model_type: llm -- metadata: {} - model_id: meta/llama-3.1-405b-instruct - provider_id: nvidia - provider_model_id: meta/llama-3.1-405b-instruct - model_type: llm -- metadata: {} - model_id: meta/llama-3.2-1b-instruct - provider_id: nvidia - provider_model_id: meta/llama-3.2-1b-instruct - model_type: llm -- metadata: {} - model_id: meta/llama-3.2-3b-instruct - provider_id: nvidia - provider_model_id: meta/llama-3.2-3b-instruct - model_type: llm -- metadata: {} - model_id: meta/llama-3.2-11b-vision-instruct - provider_id: nvidia - provider_model_id: meta/llama-3.2-11b-vision-instruct - model_type: llm -- metadata: {} - model_id: meta/llama-3.2-90b-vision-instruct - provider_id: nvidia - provider_model_id: meta/llama-3.2-90b-vision-instruct - model_type: llm -- metadata: {} - model_id: meta/llama-3.3-70b-instruct - provider_id: nvidia - provider_model_id: meta/llama-3.3-70b-instruct - model_type: llm -- metadata: {} - model_id: nvidia/vila - provider_id: nvidia - provider_model_id: nvidia/vila - model_type: llm -- metadata: - embedding_dimension: 2048 - context_length: 8192 - model_id: nvidia/llama-3.2-nv-embedqa-1b-v2 - provider_id: nvidia - provider_model_id: nvidia/llama-3.2-nv-embedqa-1b-v2 - model_type: embedding -- metadata: - embedding_dimension: 1024 - context_length: 512 - model_id: nvidia/nv-embedqa-e5-v5 - provider_id: nvidia - provider_model_id: nvidia/nv-embedqa-e5-v5 - model_type: embedding -- metadata: - embedding_dimension: 4096 - context_length: 512 - model_id: nvidia/nv-embedqa-mistral-7b-v2 - provider_id: nvidia - provider_model_id: nvidia/nv-embedqa-mistral-7b-v2 - model_type: embedding -- metadata: - embedding_dimension: 1024 - context_length: 512 - model_id: snowflake/arctic-embed-l - provider_id: nvidia - provider_model_id: snowflake/arctic-embed-l - model_type: embedding +models: [] shields: [] vector_dbs: [] datasets: [] diff --git a/llama_stack/providers/remote/eval/nvidia/eval.py b/llama_stack/providers/remote/eval/nvidia/eval.py index a474e78e3..8fc7ffdd3 100644 --- a/llama_stack/providers/remote/eval/nvidia/eval.py +++ b/llama_stack/providers/remote/eval/nvidia/eval.py @@ -14,7 +14,6 @@ from llama_stack.apis.datasets import Datasets from llama_stack.apis.inference import Inference from llama_stack.apis.scoring import Scoring, ScoringResult from llama_stack.providers.datatypes import BenchmarksProtocolPrivate -from llama_stack.providers.remote.inference.nvidia.models import MODEL_ENTRIES from llama_stack.providers.utils.inference.model_registry import ModelRegistryHelper from .....apis.common.job_types import Job, JobStatus @@ -45,7 +44,7 @@ class NVIDIAEvalImpl( self.inference_api = inference_api self.agents_api = agents_api - ModelRegistryHelper.__init__(self, model_entries=MODEL_ENTRIES) + ModelRegistryHelper.__init__(self) async def initialize(self) -> None: ... diff --git a/llama_stack/providers/remote/inference/anthropic/anthropic.py b/llama_stack/providers/remote/inference/anthropic/anthropic.py index 0f247218d..cdde4a411 100644 --- a/llama_stack/providers/remote/inference/anthropic/anthropic.py +++ b/llama_stack/providers/remote/inference/anthropic/anthropic.py @@ -8,14 +8,24 @@ from llama_stack.providers.utils.inference.litellm_openai_mixin import LiteLLMOp from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from .config import AnthropicConfig -from .models import MODEL_ENTRIES class AnthropicInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): + # source: https://docs.claude.com/en/docs/build-with-claude/embeddings + # TODO: add support for voyageai, which is where these models are hosted + # embedding_model_metadata = { + # "voyage-3-large": {"embedding_dimension": 1024, "context_length": 32000}, # supports dimensions 256, 512, 1024, 2048 + # "voyage-3.5": {"embedding_dimension": 1024, "context_length": 32000}, # supports dimensions 256, 512, 1024, 2048 + # "voyage-3.5-lite": {"embedding_dimension": 1024, "context_length": 32000}, # supports dimensions 256, 512, 1024, 2048 + # "voyage-code-3": {"embedding_dimension": 1024, "context_length": 32000}, # supports dimensions 256, 512, 1024, 2048 + # "voyage-finance-2": {"embedding_dimension": 1024, "context_length": 32000}, + # "voyage-law-2": {"embedding_dimension": 1024, "context_length": 16000}, + # "voyage-multimodal-3": {"embedding_dimension": 1024, "context_length": 32000}, + # } + def __init__(self, config: AnthropicConfig) -> None: LiteLLMOpenAIMixin.__init__( self, - MODEL_ENTRIES, litellm_provider_name="anthropic", api_key_from_config=config.api_key, provider_data_api_key_field="anthropic_api_key", diff --git a/llama_stack/providers/remote/inference/anthropic/models.py b/llama_stack/providers/remote/inference/anthropic/models.py deleted file mode 100644 index 4cbe44b02..000000000 --- a/llama_stack/providers/remote/inference/anthropic/models.py +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from llama_stack.apis.models import ModelType -from llama_stack.providers.utils.inference.model_registry import ( - ProviderModelEntry, -) - -LLM_MODEL_IDS = [ - "claude-3-5-sonnet-latest", - "claude-3-7-sonnet-latest", - "claude-3-5-haiku-latest", -] - -SAFETY_MODELS_ENTRIES = [] - -MODEL_ENTRIES = ( - [ProviderModelEntry(provider_model_id=m) for m in LLM_MODEL_IDS] - + [ - ProviderModelEntry( - provider_model_id="voyage-3", - model_type=ModelType.embedding, - metadata={"embedding_dimension": 1024, "context_length": 32000}, - ), - ProviderModelEntry( - provider_model_id="voyage-3-lite", - model_type=ModelType.embedding, - metadata={"embedding_dimension": 512, "context_length": 32000}, - ), - ProviderModelEntry( - provider_model_id="voyage-code-3", - model_type=ModelType.embedding, - metadata={"embedding_dimension": 1024, "context_length": 32000}, - ), - ] - + SAFETY_MODELS_ENTRIES -) diff --git a/llama_stack/providers/remote/inference/azure/azure.py b/llama_stack/providers/remote/inference/azure/azure.py index 449bbbb1c..a2c69b69c 100644 --- a/llama_stack/providers/remote/inference/azure/azure.py +++ b/llama_stack/providers/remote/inference/azure/azure.py @@ -14,14 +14,12 @@ from llama_stack.providers.utils.inference.litellm_openai_mixin import ( from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from .config import AzureConfig -from .models import MODEL_ENTRIES class AzureInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): def __init__(self, config: AzureConfig) -> None: LiteLLMOpenAIMixin.__init__( self, - MODEL_ENTRIES, litellm_provider_name="azure", api_key_from_config=config.api_key.get_secret_value(), provider_data_api_key_field="azure_api_key", diff --git a/llama_stack/providers/remote/inference/azure/models.py b/llama_stack/providers/remote/inference/azure/models.py deleted file mode 100644 index 64c87969b..000000000 --- a/llama_stack/providers/remote/inference/azure/models.py +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from llama_stack.providers.utils.inference.model_registry import ( - ProviderModelEntry, -) - -# https://learn.microsoft.com/en-us/azure/ai-foundry/openai/concepts/models?tabs=global-standard%2Cstandard-chat-completions -LLM_MODEL_IDS = [ - "gpt-5", - "gpt-5-mini", - "gpt-5-nano", - "gpt-5-chat", - "o1", - "o1-mini", - "o3-mini", - "o4-mini", - "gpt-4.1", - "gpt-4.1-mini", - "gpt-4.1-nano", -] - -SAFETY_MODELS_ENTRIES = list[ProviderModelEntry]() - -MODEL_ENTRIES = [ProviderModelEntry(provider_model_id=m) for m in LLM_MODEL_IDS] + SAFETY_MODELS_ENTRIES diff --git a/llama_stack/providers/remote/inference/bedrock/bedrock.py b/llama_stack/providers/remote/inference/bedrock/bedrock.py index 106caed9b..29b935bbd 100644 --- a/llama_stack/providers/remote/inference/bedrock/bedrock.py +++ b/llama_stack/providers/remote/inference/bedrock/bedrock.py @@ -98,7 +98,7 @@ class BedrockInferenceAdapter( OpenAICompletionToLlamaStackMixin, ): def __init__(self, config: BedrockConfig) -> None: - ModelRegistryHelper.__init__(self, MODEL_ENTRIES) + ModelRegistryHelper.__init__(self, model_entries=MODEL_ENTRIES) self._config = config self._client = None diff --git a/llama_stack/providers/remote/inference/cerebras/cerebras.py b/llama_stack/providers/remote/inference/cerebras/cerebras.py index 6947dbc87..6662f004d 100644 --- a/llama_stack/providers/remote/inference/cerebras/cerebras.py +++ b/llama_stack/providers/remote/inference/cerebras/cerebras.py @@ -49,7 +49,6 @@ from llama_stack.providers.utils.inference.prompt_adapter import ( ) from .config import CerebrasImplConfig -from .models import MODEL_ENTRIES class CerebrasInferenceAdapter( @@ -58,10 +57,6 @@ class CerebrasInferenceAdapter( Inference, ): def __init__(self, config: CerebrasImplConfig) -> None: - ModelRegistryHelper.__init__( - self, - model_entries=MODEL_ENTRIES, - ) self.config = config # TODO: make this use provider data, etc. like other providers diff --git a/llama_stack/providers/remote/inference/cerebras/models.py b/llama_stack/providers/remote/inference/cerebras/models.py deleted file mode 100644 index 4de2e62c9..000000000 --- a/llama_stack/providers/remote/inference/cerebras/models.py +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from llama_stack.models.llama.sku_types import CoreModelId -from llama_stack.providers.utils.inference.model_registry import ( - build_hf_repo_model_entry, -) - -SAFETY_MODELS_ENTRIES = [] - -# https://inference-docs.cerebras.ai/models -MODEL_ENTRIES = [ - build_hf_repo_model_entry( - "llama3.1-8b", - CoreModelId.llama3_1_8b_instruct.value, - ), - build_hf_repo_model_entry( - "llama-3.3-70b", - CoreModelId.llama3_3_70b_instruct.value, - ), - build_hf_repo_model_entry( - "llama-4-scout-17b-16e-instruct", - CoreModelId.llama4_scout_17b_16e_instruct.value, - ), -] + SAFETY_MODELS_ENTRIES diff --git a/llama_stack/providers/remote/inference/databricks/databricks.py b/llama_stack/providers/remote/inference/databricks/databricks.py index f2dc302e0..25fd9f3b7 100644 --- a/llama_stack/providers/remote/inference/databricks/databricks.py +++ b/llama_stack/providers/remote/inference/databricks/databricks.py @@ -23,6 +23,8 @@ from llama_stack.apis.inference import ( Inference, LogProbConfig, Message, + Model, + ModelType, OpenAICompletion, ResponseFormat, SamplingParams, @@ -32,11 +34,7 @@ from llama_stack.apis.inference import ( ToolDefinition, ToolPromptFormat, ) -from llama_stack.apis.models import Model, ModelType from llama_stack.log import get_logger -from llama_stack.providers.utils.inference.model_registry import ( - ProviderModelEntry, -) from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from .config import DatabricksImplConfig @@ -44,29 +42,16 @@ from .config import DatabricksImplConfig logger = get_logger(name=__name__, category="inference::databricks") -# source: https://docs.databricks.com/aws/en/machine-learning/foundation-model-apis/supported-models -EMBEDDING_MODEL_ENTRIES = { - "databricks-gte-large-en": ProviderModelEntry( - provider_model_id="databricks-gte-large-en", - metadata={ - "embedding_dimension": 1024, - "context_length": 8192, - }, - ), - "databricks-bge-large-en": ProviderModelEntry( - provider_model_id="databricks-bge-large-en", - metadata={ - "embedding_dimension": 1024, - "context_length": 512, - }, - ), -} - - class DatabricksInferenceAdapter( OpenAIMixin, Inference, ): + # source: https://docs.databricks.com/aws/en/machine-learning/foundation-model-apis/supported-models + embedding_model_metadata = { + "databricks-gte-large-en": {"embedding_dimension": 1024, "context_length": 8192}, + "databricks-bge-large-en": {"embedding_dimension": 1024, "context_length": 512}, + } + def __init__(self, config: DatabricksImplConfig) -> None: self.config = config @@ -156,11 +141,11 @@ class DatabricksInferenceAdapter( if endpoint.task == "llm/v1/chat": model.model_type = ModelType.llm # this is redundant, but informative elif endpoint.task == "llm/v1/embeddings": - if endpoint.name not in EMBEDDING_MODEL_ENTRIES: + if endpoint.name not in self.embedding_model_metadata: logger.warning(f"No metadata information available for embedding model {endpoint.name}, skipping.") continue model.model_type = ModelType.embedding - model.metadata = EMBEDDING_MODEL_ENTRIES[endpoint.name].metadata + model.metadata = self.embedding_model_metadata[endpoint.name] else: logger.warning(f"Unknown model type, skipping: {endpoint}") continue @@ -169,13 +154,5 @@ class DatabricksInferenceAdapter( return list(self._model_cache.values()) - async def register_model(self, model: Model) -> Model: - if not await self.check_model_availability(model.provider_resource_id): - raise ValueError(f"Model {model.provider_resource_id} is not available in Databricks workspace.") - return model - - async def unregister_model(self, model_id: str) -> None: - pass - async def should_refresh_models(self) -> bool: return False diff --git a/llama_stack/providers/remote/inference/fireworks/fireworks.py b/llama_stack/providers/remote/inference/fireworks/fireworks.py index 2fcf1be2e..cf7e93974 100644 --- a/llama_stack/providers/remote/inference/fireworks/fireworks.py +++ b/llama_stack/providers/remote/inference/fireworks/fireworks.py @@ -54,15 +54,18 @@ from llama_stack.providers.utils.inference.prompt_adapter import ( ) from .config import FireworksImplConfig -from .models import MODEL_ENTRIES logger = get_logger(name=__name__, category="inference::fireworks") class FireworksInferenceAdapter(OpenAIMixin, ModelRegistryHelper, Inference, NeedsRequestProviderData): + embedding_model_metadata = { + "nomic-ai/nomic-embed-text-v1.5": {"embedding_dimension": 768, "context_length": 8192}, + } + def __init__(self, config: FireworksImplConfig) -> None: - ModelRegistryHelper.__init__(self, MODEL_ENTRIES, config.allowed_models) self.config = config + self.allowed_models = config.allowed_models async def initialize(self) -> None: pass diff --git a/llama_stack/providers/remote/inference/fireworks/models.py b/llama_stack/providers/remote/inference/fireworks/models.py deleted file mode 100644 index 30807a0d4..000000000 --- a/llama_stack/providers/remote/inference/fireworks/models.py +++ /dev/null @@ -1,70 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from llama_stack.apis.models import ModelType -from llama_stack.models.llama.sku_types import CoreModelId -from llama_stack.providers.utils.inference.model_registry import ( - ProviderModelEntry, - build_hf_repo_model_entry, -) - -SAFETY_MODELS_ENTRIES = [ - build_hf_repo_model_entry( - "accounts/fireworks/models/llama-guard-3-8b", - CoreModelId.llama_guard_3_8b.value, - ), - build_hf_repo_model_entry( - "accounts/fireworks/models/llama-guard-3-11b-vision", - CoreModelId.llama_guard_3_11b_vision.value, - ), -] - -MODEL_ENTRIES = [ - build_hf_repo_model_entry( - "accounts/fireworks/models/llama-v3p1-8b-instruct", - CoreModelId.llama3_1_8b_instruct.value, - ), - build_hf_repo_model_entry( - "accounts/fireworks/models/llama-v3p1-70b-instruct", - CoreModelId.llama3_1_70b_instruct.value, - ), - build_hf_repo_model_entry( - "accounts/fireworks/models/llama-v3p1-405b-instruct", - CoreModelId.llama3_1_405b_instruct.value, - ), - build_hf_repo_model_entry( - "accounts/fireworks/models/llama-v3p2-3b-instruct", - CoreModelId.llama3_2_3b_instruct.value, - ), - build_hf_repo_model_entry( - "accounts/fireworks/models/llama-v3p2-11b-vision-instruct", - CoreModelId.llama3_2_11b_vision_instruct.value, - ), - build_hf_repo_model_entry( - "accounts/fireworks/models/llama-v3p2-90b-vision-instruct", - CoreModelId.llama3_2_90b_vision_instruct.value, - ), - build_hf_repo_model_entry( - "accounts/fireworks/models/llama-v3p3-70b-instruct", - CoreModelId.llama3_3_70b_instruct.value, - ), - build_hf_repo_model_entry( - "accounts/fireworks/models/llama4-scout-instruct-basic", - CoreModelId.llama4_scout_17b_16e_instruct.value, - ), - build_hf_repo_model_entry( - "accounts/fireworks/models/llama4-maverick-instruct-basic", - CoreModelId.llama4_maverick_17b_128e_instruct.value, - ), - ProviderModelEntry( - provider_model_id="nomic-ai/nomic-embed-text-v1.5", - model_type=ModelType.embedding, - metadata={ - "embedding_dimension": 768, - "context_length": 8192, - }, - ), -] + SAFETY_MODELS_ENTRIES diff --git a/llama_stack/providers/remote/inference/gemini/gemini.py b/llama_stack/providers/remote/inference/gemini/gemini.py index 569227fdd..30ceedff0 100644 --- a/llama_stack/providers/remote/inference/gemini/gemini.py +++ b/llama_stack/providers/remote/inference/gemini/gemini.py @@ -8,14 +8,16 @@ from llama_stack.providers.utils.inference.litellm_openai_mixin import LiteLLMOp from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from .config import GeminiConfig -from .models import MODEL_ENTRIES class GeminiInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): + embedding_model_metadata = { + "text-embedding-004": {"embedding_dimension": 768, "context_length": 2048}, + } + def __init__(self, config: GeminiConfig) -> None: LiteLLMOpenAIMixin.__init__( self, - MODEL_ENTRIES, litellm_provider_name="gemini", api_key_from_config=config.api_key, provider_data_api_key_field="gemini_api_key", diff --git a/llama_stack/providers/remote/inference/gemini/models.py b/llama_stack/providers/remote/inference/gemini/models.py deleted file mode 100644 index bd696b0ac..000000000 --- a/llama_stack/providers/remote/inference/gemini/models.py +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from llama_stack.apis.models import ModelType -from llama_stack.providers.utils.inference.model_registry import ( - ProviderModelEntry, -) - -LLM_MODEL_IDS = [ - "gemini-1.5-flash", - "gemini-1.5-pro", - "gemini-2.0-flash", - "gemini-2.0-flash-lite", - "gemini-2.5-flash", - "gemini-2.5-flash-lite", - "gemini-2.5-pro", -] - -SAFETY_MODELS_ENTRIES = [] - -MODEL_ENTRIES = ( - [ProviderModelEntry(provider_model_id=m) for m in LLM_MODEL_IDS] - + [ - ProviderModelEntry( - provider_model_id="text-embedding-004", - model_type=ModelType.embedding, - metadata={"embedding_dimension": 768, "context_length": 2048}, - ), - ] - + SAFETY_MODELS_ENTRIES -) diff --git a/llama_stack/providers/remote/inference/groq/groq.py b/llama_stack/providers/remote/inference/groq/groq.py index 888953af0..e449f2005 100644 --- a/llama_stack/providers/remote/inference/groq/groq.py +++ b/llama_stack/providers/remote/inference/groq/groq.py @@ -9,8 +9,6 @@ from llama_stack.providers.remote.inference.groq.config import GroqConfig from llama_stack.providers.utils.inference.litellm_openai_mixin import LiteLLMOpenAIMixin from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin -from .models import MODEL_ENTRIES - class GroqInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): _config: GroqConfig @@ -18,7 +16,6 @@ class GroqInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): def __init__(self, config: GroqConfig): LiteLLMOpenAIMixin.__init__( self, - model_entries=MODEL_ENTRIES, litellm_provider_name="groq", api_key_from_config=config.api_key, provider_data_api_key_field="groq_api_key", diff --git a/llama_stack/providers/remote/inference/groq/models.py b/llama_stack/providers/remote/inference/groq/models.py deleted file mode 100644 index fac66db72..000000000 --- a/llama_stack/providers/remote/inference/groq/models.py +++ /dev/null @@ -1,48 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from llama_stack.models.llama.sku_list import CoreModelId -from llama_stack.providers.utils.inference.model_registry import ( - build_hf_repo_model_entry, - build_model_entry, -) - -SAFETY_MODELS_ENTRIES = [] - -MODEL_ENTRIES = [ - build_hf_repo_model_entry( - "llama3-8b-8192", - CoreModelId.llama3_1_8b_instruct.value, - ), - build_model_entry( - "llama-3.1-8b-instant", - CoreModelId.llama3_1_8b_instruct.value, - ), - build_hf_repo_model_entry( - "llama3-70b-8192", - CoreModelId.llama3_70b_instruct.value, - ), - build_hf_repo_model_entry( - "llama-3.3-70b-versatile", - CoreModelId.llama3_3_70b_instruct.value, - ), - # Groq only contains a preview version for llama-3.2-3b - # Preview models aren't recommended for production use, but we include this one - # to pass the test fixture - # TODO(aidand): Replace this with a stable model once Groq supports it - build_hf_repo_model_entry( - "llama-3.2-3b-preview", - CoreModelId.llama3_2_3b_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/llama-4-scout-17b-16e-instruct", - CoreModelId.llama4_scout_17b_16e_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/llama-4-maverick-17b-128e-instruct", - CoreModelId.llama4_maverick_17b_128e_instruct.value, - ), -] + SAFETY_MODELS_ENTRIES diff --git a/llama_stack/providers/remote/inference/llama_openai_compat/llama.py b/llama_stack/providers/remote/inference/llama_openai_compat/llama.py index f2069b5e5..489b12a68 100644 --- a/llama_stack/providers/remote/inference/llama_openai_compat/llama.py +++ b/llama_stack/providers/remote/inference/llama_openai_compat/llama.py @@ -8,8 +8,6 @@ from llama_stack.providers.remote.inference.llama_openai_compat.config import Ll from llama_stack.providers.utils.inference.litellm_openai_mixin import LiteLLMOpenAIMixin from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin -from .models import MODEL_ENTRIES - logger = get_logger(name=__name__, category="inference::llama_openai_compat") @@ -30,7 +28,6 @@ class LlamaCompatInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): def __init__(self, config: LlamaCompatConfig): LiteLLMOpenAIMixin.__init__( self, - model_entries=MODEL_ENTRIES, litellm_provider_name="meta_llama", api_key_from_config=config.api_key, provider_data_api_key_field="llama_api_key", diff --git a/llama_stack/providers/remote/inference/llama_openai_compat/models.py b/llama_stack/providers/remote/inference/llama_openai_compat/models.py deleted file mode 100644 index 6285e98e1..000000000 --- a/llama_stack/providers/remote/inference/llama_openai_compat/models.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from llama_stack.models.llama.sku_types import CoreModelId -from llama_stack.providers.utils.inference.model_registry import ( - build_hf_repo_model_entry, -) - -MODEL_ENTRIES = [ - build_hf_repo_model_entry( - "Llama-3.3-70B-Instruct", - CoreModelId.llama3_3_70b_instruct.value, - ), - build_hf_repo_model_entry( - "Llama-4-Scout-17B-16E-Instruct-FP8", - CoreModelId.llama4_scout_17b_16e_instruct.value, - ), - build_hf_repo_model_entry( - "Llama-4-Maverick-17B-128E-Instruct-FP8", - CoreModelId.llama4_maverick_17b_128e_instruct.value, - ), -] diff --git a/llama_stack/providers/remote/inference/nvidia/models.py b/llama_stack/providers/remote/inference/nvidia/models.py deleted file mode 100644 index df07f46b6..000000000 --- a/llama_stack/providers/remote/inference/nvidia/models.py +++ /dev/null @@ -1,109 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from llama_stack.apis.models import ModelType -from llama_stack.models.llama.sku_types import CoreModelId -from llama_stack.providers.utils.inference.model_registry import ( - ProviderModelEntry, - build_hf_repo_model_entry, -) - -SAFETY_MODELS_ENTRIES = [] - -# https://docs.nvidia.com/nim/large-language-models/latest/supported-llm-agnostic-architectures.html -MODEL_ENTRIES = [ - build_hf_repo_model_entry( - "meta/llama3-8b-instruct", - CoreModelId.llama3_8b_instruct.value, - ), - build_hf_repo_model_entry( - "meta/llama3-70b-instruct", - CoreModelId.llama3_70b_instruct.value, - ), - build_hf_repo_model_entry( - "meta/llama-3.1-8b-instruct", - CoreModelId.llama3_1_8b_instruct.value, - ), - build_hf_repo_model_entry( - "meta/llama-3.1-70b-instruct", - CoreModelId.llama3_1_70b_instruct.value, - ), - build_hf_repo_model_entry( - "meta/llama-3.1-405b-instruct", - CoreModelId.llama3_1_405b_instruct.value, - ), - build_hf_repo_model_entry( - "meta/llama-3.2-1b-instruct", - CoreModelId.llama3_2_1b_instruct.value, - ), - build_hf_repo_model_entry( - "meta/llama-3.2-3b-instruct", - CoreModelId.llama3_2_3b_instruct.value, - ), - build_hf_repo_model_entry( - "meta/llama-3.2-11b-vision-instruct", - CoreModelId.llama3_2_11b_vision_instruct.value, - ), - build_hf_repo_model_entry( - "meta/llama-3.2-90b-vision-instruct", - CoreModelId.llama3_2_90b_vision_instruct.value, - ), - build_hf_repo_model_entry( - "meta/llama-3.3-70b-instruct", - CoreModelId.llama3_3_70b_instruct.value, - ), - ProviderModelEntry( - provider_model_id="nvidia/vila", - model_type=ModelType.llm, - ), - # NeMo Retriever Text Embedding models - - # - # https://docs.nvidia.com/nim/nemo-retriever/text-embedding/latest/support-matrix.html - # - # +-----------------------------------+--------+-----------+-----------+------------+ - # | Model ID | Max | Publisher | Embedding | Dynamic | - # | | Tokens | | Dimension | Embeddings | - # +-----------------------------------+--------+-----------+-----------+------------+ - # | nvidia/llama-3.2-nv-embedqa-1b-v2 | 8192 | NVIDIA | 2048 | Yes | - # | nvidia/nv-embedqa-e5-v5 | 512 | NVIDIA | 1024 | No | - # | nvidia/nv-embedqa-mistral-7b-v2 | 512 | NVIDIA | 4096 | No | - # | snowflake/arctic-embed-l | 512 | Snowflake | 1024 | No | - # +-----------------------------------+--------+-----------+-----------+------------+ - ProviderModelEntry( - provider_model_id="nvidia/llama-3.2-nv-embedqa-1b-v2", - model_type=ModelType.embedding, - metadata={ - "embedding_dimension": 2048, - "context_length": 8192, - }, - ), - ProviderModelEntry( - provider_model_id="nvidia/nv-embedqa-e5-v5", - model_type=ModelType.embedding, - metadata={ - "embedding_dimension": 1024, - "context_length": 512, - }, - ), - ProviderModelEntry( - provider_model_id="nvidia/nv-embedqa-mistral-7b-v2", - model_type=ModelType.embedding, - metadata={ - "embedding_dimension": 4096, - "context_length": 512, - }, - ), - ProviderModelEntry( - provider_model_id="snowflake/arctic-embed-l", - model_type=ModelType.embedding, - metadata={ - "embedding_dimension": 1024, - "context_length": 512, - }, - ), - # TODO(mf): how do we handle Nemotron models? - # "Llama3.1-Nemotron-51B-Instruct" -> "meta/llama-3.1-nemotron-51b-instruct", -] + SAFETY_MODELS_ENTRIES diff --git a/llama_stack/providers/remote/inference/nvidia/nvidia.py b/llama_stack/providers/remote/inference/nvidia/nvidia.py index a5475bc92..92094a0f3 100644 --- a/llama_stack/providers/remote/inference/nvidia/nvidia.py +++ b/llama_stack/providers/remote/inference/nvidia/nvidia.py @@ -37,9 +37,6 @@ from llama_stack.apis.inference import ( ) from llama_stack.log import get_logger from llama_stack.models.llama.datatypes import ToolDefinition, ToolPromptFormat -from llama_stack.providers.utils.inference.model_registry import ( - ModelRegistryHelper, -) from llama_stack.providers.utils.inference.openai_compat import ( convert_openai_chat_completion_choice, convert_openai_chat_completion_stream, @@ -48,7 +45,6 @@ from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from llama_stack.providers.utils.inference.prompt_adapter import content_has_media from . import NVIDIAConfig -from .models import MODEL_ENTRIES from .openai_utils import ( convert_chat_completion_request, convert_completion_request, @@ -60,7 +56,7 @@ from .utils import _is_nvidia_hosted logger = get_logger(name=__name__, category="inference::nvidia") -class NVIDIAInferenceAdapter(OpenAIMixin, Inference, ModelRegistryHelper): +class NVIDIAInferenceAdapter(OpenAIMixin, Inference): """ NVIDIA Inference Adapter for Llama Stack. @@ -74,10 +70,15 @@ class NVIDIAInferenceAdapter(OpenAIMixin, Inference, ModelRegistryHelper): - ModelRegistryHelper.check_model_availability() just returns False and shows a warning """ - def __init__(self, config: NVIDIAConfig) -> None: - # TODO(mf): filter by available models - ModelRegistryHelper.__init__(self, model_entries=MODEL_ENTRIES) + # source: https://docs.nvidia.com/nim/nemo-retriever/text-embedding/latest/support-matrix.html + embedding_model_metadata = { + "nvidia/llama-3.2-nv-embedqa-1b-v2": {"embedding_dimension": 2048, "context_length": 8192}, + "nvidia/nv-embedqa-e5-v5": {"embedding_dimension": 512, "context_length": 1024}, + "nvidia/nv-embedqa-mistral-7b-v2": {"embedding_dimension": 512, "context_length": 4096}, + "snowflake/arctic-embed-l": {"embedding_dimension": 512, "context_length": 1024}, + } + def __init__(self, config: NVIDIAConfig) -> None: logger.info(f"Initializing NVIDIAInferenceAdapter({config.url})...") if _is_nvidia_hosted(config): diff --git a/llama_stack/providers/remote/inference/ollama/models.py b/llama_stack/providers/remote/inference/ollama/models.py deleted file mode 100644 index 7c0a19a1a..000000000 --- a/llama_stack/providers/remote/inference/ollama/models.py +++ /dev/null @@ -1,106 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from llama_stack.apis.models import ModelType -from llama_stack.models.llama.sku_types import CoreModelId -from llama_stack.providers.utils.inference.model_registry import ( - ProviderModelEntry, - build_hf_repo_model_entry, - build_model_entry, -) - -SAFETY_MODELS_ENTRIES = [ - # The Llama Guard models don't have their full fp16 versions - # so we are going to alias their default version to the canonical SKU - build_hf_repo_model_entry( - "llama-guard3:8b", - CoreModelId.llama_guard_3_8b.value, - ), - build_hf_repo_model_entry( - "llama-guard3:1b", - CoreModelId.llama_guard_3_1b.value, - ), -] - -MODEL_ENTRIES = [ - build_hf_repo_model_entry( - "llama3.1:8b-instruct-fp16", - CoreModelId.llama3_1_8b_instruct.value, - ), - build_model_entry( - "llama3.1:8b", - CoreModelId.llama3_1_8b_instruct.value, - ), - build_hf_repo_model_entry( - "llama3.1:70b-instruct-fp16", - CoreModelId.llama3_1_70b_instruct.value, - ), - build_model_entry( - "llama3.1:70b", - CoreModelId.llama3_1_70b_instruct.value, - ), - build_hf_repo_model_entry( - "llama3.1:405b-instruct-fp16", - CoreModelId.llama3_1_405b_instruct.value, - ), - build_model_entry( - "llama3.1:405b", - CoreModelId.llama3_1_405b_instruct.value, - ), - build_hf_repo_model_entry( - "llama3.2:1b-instruct-fp16", - CoreModelId.llama3_2_1b_instruct.value, - ), - build_model_entry( - "llama3.2:1b", - CoreModelId.llama3_2_1b_instruct.value, - ), - build_hf_repo_model_entry( - "llama3.2:3b-instruct-fp16", - CoreModelId.llama3_2_3b_instruct.value, - ), - build_model_entry( - "llama3.2:3b", - CoreModelId.llama3_2_3b_instruct.value, - ), - build_hf_repo_model_entry( - "llama3.2-vision:11b-instruct-fp16", - CoreModelId.llama3_2_11b_vision_instruct.value, - ), - build_model_entry( - "llama3.2-vision:latest", - CoreModelId.llama3_2_11b_vision_instruct.value, - ), - build_hf_repo_model_entry( - "llama3.2-vision:90b-instruct-fp16", - CoreModelId.llama3_2_90b_vision_instruct.value, - ), - build_model_entry( - "llama3.2-vision:90b", - CoreModelId.llama3_2_90b_vision_instruct.value, - ), - build_hf_repo_model_entry( - "llama3.3:70b", - CoreModelId.llama3_3_70b_instruct.value, - ), - ProviderModelEntry( - provider_model_id="all-minilm:l6-v2", - aliases=["all-minilm"], - model_type=ModelType.embedding, - metadata={ - "embedding_dimension": 384, - "context_length": 512, - }, - ), - ProviderModelEntry( - provider_model_id="nomic-embed-text", - model_type=ModelType.embedding, - metadata={ - "embedding_dimension": 768, - "context_length": 8192, - }, - ), -] + SAFETY_MODELS_ENTRIES diff --git a/llama_stack/providers/remote/inference/ollama/ollama.py b/llama_stack/providers/remote/inference/ollama/ollama.py index 67a22cbe3..81a5fb9ad 100644 --- a/llama_stack/providers/remote/inference/ollama/ollama.py +++ b/llama_stack/providers/remote/inference/ollama/ollama.py @@ -45,8 +45,9 @@ from llama_stack.apis.inference import ( ToolDefinition, ToolPromptFormat, ) -from llama_stack.apis.models import Model, ModelType +from llama_stack.apis.models import Model from llama_stack.log import get_logger +from llama_stack.models.llama.sku_types import CoreModelId from llama_stack.providers.datatypes import ( HealthResponse, HealthStatus, @@ -55,6 +56,7 @@ from llama_stack.providers.datatypes import ( from llama_stack.providers.remote.inference.ollama.config import OllamaImplConfig from llama_stack.providers.utils.inference.model_registry import ( ModelRegistryHelper, + build_hf_repo_model_entry, ) from llama_stack.providers.utils.inference.openai_compat import ( OpenAICompatCompletionChoice, @@ -77,8 +79,6 @@ from llama_stack.providers.utils.inference.prompt_adapter import ( request_has_media, ) -from .models import MODEL_ENTRIES - logger = get_logger(name=__name__, category="inference::ollama") @@ -90,8 +90,44 @@ class OllamaInferenceAdapter( # automatically set by the resolver when instantiating the provider __provider_id__: str + embedding_model_metadata = { + "all-minilm:l6-v2": { + "embedding_dimension": 384, + "context_length": 512, + }, + "nomic-embed-text:latest": { + "embedding_dimension": 768, + "context_length": 8192, + }, + "nomic-embed-text:v1.5": { + "embedding_dimension": 768, + "context_length": 8192, + }, + "nomic-embed-text:137m-v1.5-fp16": { + "embedding_dimension": 768, + "context_length": 8192, + }, + } + def __init__(self, config: OllamaImplConfig) -> None: - self.register_helper = ModelRegistryHelper(MODEL_ENTRIES) + # TODO: remove ModelRegistryHelper.__init__ when completion and + # chat_completion are. this exists to satisfy the input / + # output processing for llama models. specifically, + # tool_calling is handled by raw template processing, + # instead of using the /api/chat endpoint w/ tools=... + ModelRegistryHelper.__init__( + self, + model_entries=[ + build_hf_repo_model_entry( + "llama3.2:3b-instruct-fp16", + CoreModelId.llama3_2_3b_instruct.value, + ), + build_hf_repo_model_entry( + "llama-guard3:1b", + CoreModelId.llama_guard_3_1b.value, + ), + ], + ) self.config = config self._clients: dict[asyncio.AbstractEventLoop, AsyncOllamaClient] = {} @@ -120,59 +156,6 @@ class OllamaInferenceAdapter( async def should_refresh_models(self) -> bool: return self.config.refresh_models - async def list_models(self) -> list[Model] | None: - provider_id = self.__provider_id__ - response = await self.ollama_client.list() - - # always add the two embedding models which can be pulled on demand - models = [ - Model( - identifier="all-minilm:l6-v2", - provider_resource_id="all-minilm:l6-v2", - provider_id=provider_id, - metadata={ - "embedding_dimension": 384, - "context_length": 512, - }, - model_type=ModelType.embedding, - ), - # add all-minilm alias - Model( - identifier="all-minilm", - provider_resource_id="all-minilm:l6-v2", - provider_id=provider_id, - metadata={ - "embedding_dimension": 384, - "context_length": 512, - }, - model_type=ModelType.embedding, - ), - Model( - identifier="nomic-embed-text", - provider_resource_id="nomic-embed-text:latest", - provider_id=provider_id, - metadata={ - "embedding_dimension": 768, - "context_length": 8192, - }, - model_type=ModelType.embedding, - ), - ] - for m in response.models: - # kill embedding models since we don't know dimensions for them - if "bert" in m.details.family: - continue - models.append( - Model( - identifier=m.model, - provider_resource_id=m.model, - provider_id=provider_id, - metadata={}, - model_type=ModelType.llm, - ) - ) - return models - async def health(self) -> HealthResponse: """ Performs a health check by verifying connectivity to the Ollama server. @@ -301,7 +284,7 @@ class OllamaInferenceAdapter( input_dict: dict[str, Any] = {} media_present = request_has_media(request) - llama_model = self.register_helper.get_llama_model(request.model) + llama_model = self.get_llama_model(request.model) if isinstance(request, ChatCompletionRequest): if media_present or not llama_model: contents = [await convert_message_to_openai_dict_for_ollama(m) for m in request.messages] @@ -409,37 +392,16 @@ class OllamaInferenceAdapter( return EmbeddingsResponse(embeddings=embeddings) async def register_model(self, model: Model) -> Model: - try: - model = await self.register_helper.register_model(model) - except ValueError: - pass # Ignore statically unknown model, will check live listing + if await self.check_model_availability(model.provider_model_id): + return model + elif await self.check_model_availability(f"{model.provider_model_id}:latest"): + model.provider_resource_id = f"{model.provider_model_id}:latest" + logger.warning( + f"Imprecise provider resource id was used but 'latest' is available in Ollama - using '{model.provider_model_id}'" + ) + return model - if model.model_type == ModelType.embedding: - response = await self.ollama_client.list() - if model.provider_resource_id not in [m.model for m in response.models]: - await self.ollama_client.pull(model.provider_resource_id) - - # we use list() here instead of ps() - - # - ps() only lists running models, not available models - # - models not currently running are run by the ollama server as needed - response = await self.ollama_client.list() - available_models = [m.model for m in response.models] - - provider_resource_id = model.provider_resource_id - assert provider_resource_id is not None # mypy - if provider_resource_id not in available_models: - available_models_latest = [m.model.split(":latest")[0] for m in response.models] - if provider_resource_id in available_models_latest: - logger.warning( - f"Imprecise provider resource id was used but 'latest' is available in Ollama - using '{model.provider_resource_id}:latest'" - ) - return model - raise UnsupportedModelError(provider_resource_id, available_models) - - # mutating this should be considered an anti-pattern - model.provider_resource_id = provider_resource_id - - return model + raise UnsupportedModelError(model.provider_model_id, list(self._model_cache.keys())) async def openai_chat_completion( self, diff --git a/llama_stack/providers/remote/inference/openai/models.py b/llama_stack/providers/remote/inference/openai/models.py deleted file mode 100644 index 28d0c4b41..000000000 --- a/llama_stack/providers/remote/inference/openai/models.py +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from dataclasses import dataclass - -from llama_stack.apis.models import ModelType -from llama_stack.providers.utils.inference.model_registry import ( - ProviderModelEntry, -) - -LLM_MODEL_IDS = [ - "gpt-3.5-turbo-0125", - "gpt-3.5-turbo", - "gpt-3.5-turbo-instruct", - "gpt-4", - "gpt-4-turbo", - "gpt-4o", - "gpt-4o-2024-08-06", - "gpt-4o-mini", - "gpt-4o-audio-preview", - "chatgpt-4o-latest", - "o1", - "o1-mini", - "o3-mini", - "o4-mini", -] - - -@dataclass -class EmbeddingModelInfo: - """Structured representation of embedding model information.""" - - embedding_dimension: int - context_length: int - - -EMBEDDING_MODEL_IDS: dict[str, EmbeddingModelInfo] = { - "text-embedding-3-small": EmbeddingModelInfo(1536, 8192), - "text-embedding-3-large": EmbeddingModelInfo(3072, 8192), -} -SAFETY_MODELS_ENTRIES = [] - -MODEL_ENTRIES = ( - [ProviderModelEntry(provider_model_id=m) for m in LLM_MODEL_IDS] - + [ - ProviderModelEntry( - provider_model_id=model_id, - model_type=ModelType.embedding, - metadata={ - "embedding_dimension": model_info.embedding_dimension, - "context_length": model_info.context_length, - }, - ) - for model_id, model_info in EMBEDDING_MODEL_IDS.items() - ] - + SAFETY_MODELS_ENTRIES -) diff --git a/llama_stack/providers/remote/inference/openai/openai.py b/llama_stack/providers/remote/inference/openai/openai.py index 0f73c9321..18530f20b 100644 --- a/llama_stack/providers/remote/inference/openai/openai.py +++ b/llama_stack/providers/remote/inference/openai/openai.py @@ -9,7 +9,6 @@ from llama_stack.providers.utils.inference.litellm_openai_mixin import LiteLLMOp from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from .config import OpenAIConfig -from .models import MODEL_ENTRIES logger = get_logger(name=__name__, category="inference::openai") @@ -40,10 +39,14 @@ class OpenAIInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): - ModelRegistryHelper.check_model_availability() (inherited by LiteLLMOpenAIMixin) just returns False and shows a warning """ + embedding_model_metadata = { + "text-embedding-3-small": {"embedding_dimension": 1536, "context_length": 8192}, + "text-embedding-3-large": {"embedding_dimension": 3072, "context_length": 8192}, + } + def __init__(self, config: OpenAIConfig) -> None: LiteLLMOpenAIMixin.__init__( self, - MODEL_ENTRIES, litellm_provider_name="openai", api_key_from_config=config.api_key, provider_data_api_key_field="openai_api_key", diff --git a/llama_stack/providers/remote/inference/passthrough/passthrough.py b/llama_stack/providers/remote/inference/passthrough/passthrough.py index 2f1cd40f2..a2bdf0369 100644 --- a/llama_stack/providers/remote/inference/passthrough/passthrough.py +++ b/llama_stack/providers/remote/inference/passthrough/passthrough.py @@ -43,7 +43,7 @@ from .config import PassthroughImplConfig class PassthroughInferenceAdapter(Inference): def __init__(self, config: PassthroughImplConfig) -> None: - ModelRegistryHelper.__init__(self, []) + ModelRegistryHelper.__init__(self) self.config = config async def initialize(self) -> None: diff --git a/llama_stack/providers/remote/inference/sambanova/models.py b/llama_stack/providers/remote/inference/sambanova/models.py deleted file mode 100644 index db781eb86..000000000 --- a/llama_stack/providers/remote/inference/sambanova/models.py +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from llama_stack.models.llama.sku_types import CoreModelId -from llama_stack.providers.utils.inference.model_registry import ( - build_hf_repo_model_entry, -) - -SAFETY_MODELS_ENTRIES = [] - - -MODEL_ENTRIES = [ - build_hf_repo_model_entry( - "Meta-Llama-3.1-8B-Instruct", - CoreModelId.llama3_1_8b_instruct.value, - ), - build_hf_repo_model_entry( - "Meta-Llama-3.3-70B-Instruct", - CoreModelId.llama3_3_70b_instruct.value, - ), - build_hf_repo_model_entry( - "Llama-4-Maverick-17B-128E-Instruct", - CoreModelId.llama4_maverick_17b_128e_instruct.value, - ), -] + SAFETY_MODELS_ENTRIES diff --git a/llama_stack/providers/remote/inference/sambanova/sambanova.py b/llama_stack/providers/remote/inference/sambanova/sambanova.py index ee3b0f648..6121e81f7 100644 --- a/llama_stack/providers/remote/inference/sambanova/sambanova.py +++ b/llama_stack/providers/remote/inference/sambanova/sambanova.py @@ -9,7 +9,6 @@ from llama_stack.providers.utils.inference.litellm_openai_mixin import LiteLLMOp from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from .config import SambaNovaImplConfig -from .models import MODEL_ENTRIES class SambaNovaInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): @@ -29,7 +28,6 @@ class SambaNovaInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): self.environment_available_models = [] LiteLLMOpenAIMixin.__init__( self, - model_entries=MODEL_ENTRIES, litellm_provider_name="sambanova", api_key_from_config=self.config.api_key.get_secret_value() if self.config.api_key else None, provider_data_api_key_field="sambanova_api_key", diff --git a/llama_stack/providers/remote/inference/together/models.py b/llama_stack/providers/remote/inference/together/models.py deleted file mode 100644 index 2aba614cb..000000000 --- a/llama_stack/providers/remote/inference/together/models.py +++ /dev/null @@ -1,103 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from llama_stack.models.llama.sku_types import CoreModelId -from llama_stack.providers.utils.inference.model_registry import ( - ProviderModelEntry, - build_hf_repo_model_entry, -) - -SAFETY_MODELS_ENTRIES = [ - build_hf_repo_model_entry( - "meta-llama/Llama-Guard-3-8B", - CoreModelId.llama_guard_3_8b.value, - ), - build_hf_repo_model_entry( - "meta-llama/Llama-Guard-3-11B-Vision-Turbo", - CoreModelId.llama_guard_3_11b_vision.value, - ), -] - -# source: https://docs.together.ai/docs/serverless-models#embedding-models -EMBEDDING_MODEL_ENTRIES = { - "togethercomputer/m2-bert-80M-32k-retrieval": ProviderModelEntry( - provider_model_id="togethercomputer/m2-bert-80M-32k-retrieval", - metadata={ - "embedding_dimension": 768, - "context_length": 32768, - }, - ), - "BAAI/bge-large-en-v1.5": ProviderModelEntry( - provider_model_id="BAAI/bge-large-en-v1.5", - metadata={ - "embedding_dimension": 1024, - "context_length": 512, - }, - ), - "BAAI/bge-base-en-v1.5": ProviderModelEntry( - provider_model_id="BAAI/bge-base-en-v1.5", - metadata={ - "embedding_dimension": 768, - "context_length": 512, - }, - ), - "Alibaba-NLP/gte-modernbert-base": ProviderModelEntry( - provider_model_id="Alibaba-NLP/gte-modernbert-base", - metadata={ - "embedding_dimension": 768, - "context_length": 8192, - }, - ), - "intfloat/multilingual-e5-large-instruct": ProviderModelEntry( - provider_model_id="intfloat/multilingual-e5-large-instruct", - metadata={ - "embedding_dimension": 1024, - "context_length": 512, - }, - ), -} -MODEL_ENTRIES = ( - [ - build_hf_repo_model_entry( - "meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo", - CoreModelId.llama3_1_8b_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo", - CoreModelId.llama3_1_70b_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo", - CoreModelId.llama3_1_405b_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/Llama-3.2-3B-Instruct-Turbo", - CoreModelId.llama3_2_3b_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/Llama-3.2-11B-Vision-Instruct-Turbo", - CoreModelId.llama3_2_11b_vision_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/Llama-3.2-90B-Vision-Instruct-Turbo", - CoreModelId.llama3_2_90b_vision_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/Llama-3.3-70B-Instruct-Turbo", - CoreModelId.llama3_3_70b_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/Llama-4-Scout-17B-16E-Instruct", - CoreModelId.llama4_scout_17b_16e_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", - CoreModelId.llama4_maverick_17b_128e_instruct.value, - ), - ] - + SAFETY_MODELS_ENTRIES - + list(EMBEDDING_MODEL_ENTRIES.values()) -) diff --git a/llama_stack/providers/remote/inference/together/together.py b/llama_stack/providers/remote/inference/together/together.py index d45bd489f..653f84610 100644 --- a/llama_stack/providers/remote/inference/together/together.py +++ b/llama_stack/providers/remote/inference/together/together.py @@ -56,15 +56,22 @@ from llama_stack.providers.utils.inference.prompt_adapter import ( ) from .config import TogetherImplConfig -from .models import EMBEDDING_MODEL_ENTRIES, MODEL_ENTRIES logger = get_logger(name=__name__, category="inference::together") class TogetherInferenceAdapter(OpenAIMixin, ModelRegistryHelper, Inference, NeedsRequestProviderData): + embedding_model_metadata = { + "togethercomputer/m2-bert-80M-32k-retrieval": {"embedding_dimension": 768, "context_length": 32768}, + "BAAI/bge-large-en-v1.5": {"embedding_dimension": 1024, "context_length": 512}, + "BAAI/bge-base-en-v1.5": {"embedding_dimension": 768, "context_length": 512}, + "Alibaba-NLP/gte-modernbert-base": {"embedding_dimension": 768, "context_length": 8192}, + "intfloat/multilingual-e5-large-instruct": {"embedding_dimension": 1024, "context_length": 512}, + } + def __init__(self, config: TogetherImplConfig) -> None: - ModelRegistryHelper.__init__(self, MODEL_ENTRIES, config.allowed_models) self.config = config + self.allowed_models = config.allowed_models self._model_cache: dict[str, Model] = {} def get_api_key(self): @@ -264,15 +271,16 @@ class TogetherInferenceAdapter(OpenAIMixin, ModelRegistryHelper, Inference, Need # Together's /v1/models is not compatible with OpenAI's /v1/models. Together support ticket #13355 -> will not fix, use Together's own client for m in await self._get_client().models.list(): if m.type == "embedding": - if m.id not in EMBEDDING_MODEL_ENTRIES: + if m.id not in self.embedding_model_metadata: logger.warning(f"Unknown embedding dimension for model {m.id}, skipping.") continue + metadata = self.embedding_model_metadata[m.id] self._model_cache[m.id] = Model( provider_id=self.__provider_id__, - provider_resource_id=EMBEDDING_MODEL_ENTRIES[m.id].provider_model_id, + provider_resource_id=m.id, identifier=m.id, model_type=ModelType.embedding, - metadata=EMBEDDING_MODEL_ENTRIES[m.id].metadata, + metadata=metadata, ) else: self._model_cache[m.id] = Model( diff --git a/llama_stack/providers/remote/inference/vertexai/models.py b/llama_stack/providers/remote/inference/vertexai/models.py deleted file mode 100644 index e72db533d..000000000 --- a/llama_stack/providers/remote/inference/vertexai/models.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from llama_stack.providers.utils.inference.model_registry import ( - ProviderModelEntry, -) - -# Vertex AI model IDs with vertex_ai/ prefix as required by litellm -LLM_MODEL_IDS = [ - "vertex_ai/gemini-2.0-flash", - "vertex_ai/gemini-2.5-flash", - "vertex_ai/gemini-2.5-pro", -] - -SAFETY_MODELS_ENTRIES = list[ProviderModelEntry]() - -MODEL_ENTRIES = [ProviderModelEntry(provider_model_id=m) for m in LLM_MODEL_IDS] + SAFETY_MODELS_ENTRIES diff --git a/llama_stack/providers/remote/inference/vertexai/vertexai.py b/llama_stack/providers/remote/inference/vertexai/vertexai.py index 8996543e7..770d21a2a 100644 --- a/llama_stack/providers/remote/inference/vertexai/vertexai.py +++ b/llama_stack/providers/remote/inference/vertexai/vertexai.py @@ -16,14 +16,12 @@ from llama_stack.providers.utils.inference.litellm_openai_mixin import ( from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from .config import VertexAIConfig -from .models import MODEL_ENTRIES class VertexAIInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): def __init__(self, config: VertexAIConfig) -> None: LiteLLMOpenAIMixin.__init__( self, - MODEL_ENTRIES, litellm_provider_name="vertex_ai", api_key_from_config=None, # Vertex AI uses ADC, not API keys provider_data_api_key_field="vertex_project", # Use project for validation diff --git a/llama_stack/providers/remote/inference/vllm/vllm.py b/llama_stack/providers/remote/inference/vllm/vllm.py index 15f807846..8fbb4b815 100644 --- a/llama_stack/providers/remote/inference/vllm/vllm.py +++ b/llama_stack/providers/remote/inference/vllm/vllm.py @@ -292,7 +292,7 @@ class VLLMInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin, Inference, ModelsPro def __init__(self, config: VLLMInferenceAdapterConfig) -> None: LiteLLMOpenAIMixin.__init__( self, - build_hf_repo_model_entries(), + model_entries=build_hf_repo_model_entries(), litellm_provider_name="vllm", api_key_from_config=config.api_token, provider_data_api_key_field="vllm_api_token", diff --git a/llama_stack/providers/remote/inference/watsonx/watsonx.py b/llama_stack/providers/remote/inference/watsonx/watsonx.py index ab5ca76db..cb8b45565 100644 --- a/llama_stack/providers/remote/inference/watsonx/watsonx.py +++ b/llama_stack/providers/remote/inference/watsonx/watsonx.py @@ -76,7 +76,7 @@ logger = get_logger(name=__name__, category="inference::watsonx") class WatsonXInferenceAdapter(Inference, ModelRegistryHelper): def __init__(self, config: WatsonXConfig) -> None: - ModelRegistryHelper.__init__(self, MODEL_ENTRIES) + ModelRegistryHelper.__init__(self, model_entries=MODEL_ENTRIES) logger.info(f"Initializing watsonx InferenceAdapter({config.url})...") self._config = config diff --git a/llama_stack/providers/utils/inference/litellm_openai_mixin.py b/llama_stack/providers/utils/inference/litellm_openai_mixin.py index 9bd43e4c9..b1e38f323 100644 --- a/llama_stack/providers/utils/inference/litellm_openai_mixin.py +++ b/llama_stack/providers/utils/inference/litellm_openai_mixin.py @@ -40,7 +40,7 @@ from llama_stack.apis.inference import ( ) from llama_stack.core.request_headers import NeedsRequestProviderData from llama_stack.log import get_logger -from llama_stack.providers.utils.inference.model_registry import ModelRegistryHelper +from llama_stack.providers.utils.inference.model_registry import ModelRegistryHelper, ProviderModelEntry from llama_stack.providers.utils.inference.openai_compat import ( b64_encode_openai_embeddings_response, convert_message_to_openai_dict_new, @@ -67,10 +67,10 @@ class LiteLLMOpenAIMixin( # when calling litellm. def __init__( self, - model_entries, litellm_provider_name: str, api_key_from_config: str | None, provider_data_api_key_field: str, + model_entries: list[ProviderModelEntry] | None = None, openai_compat_api_base: str | None = None, download_images: bool = False, json_schema_strict: bool = True, @@ -86,7 +86,7 @@ class LiteLLMOpenAIMixin( :param download_images: Whether to download images and convert to base64 for message conversion. :param json_schema_strict: Whether to use strict mode for JSON schema validation. """ - ModelRegistryHelper.__init__(self, model_entries) + ModelRegistryHelper.__init__(self, model_entries=model_entries) self.litellm_provider_name = litellm_provider_name self.api_key_from_config = api_key_from_config diff --git a/llama_stack/providers/utils/inference/model_registry.py b/llama_stack/providers/utils/inference/model_registry.py index b6b06c0b6..ff15b2d43 100644 --- a/llama_stack/providers/utils/inference/model_registry.py +++ b/llama_stack/providers/utils/inference/model_registry.py @@ -11,7 +11,6 @@ from pydantic import BaseModel, Field from llama_stack.apis.common.errors import UnsupportedModelError from llama_stack.apis.models import ModelType from llama_stack.log import get_logger -from llama_stack.models.llama.sku_list import all_registered_models from llama_stack.providers.datatypes import Model, ModelsProtocolPrivate from llama_stack.providers.utils.inference import ( ALL_HUGGINGFACE_REPOS_TO_MODEL_DESCRIPTOR, @@ -37,13 +36,6 @@ class ProviderModelEntry(BaseModel): metadata: dict[str, Any] = Field(default_factory=dict) -def get_huggingface_repo(model_descriptor: str) -> str | None: - for model in all_registered_models(): - if model.descriptor() == model_descriptor: - return model.huggingface_repo - return None - - def build_hf_repo_model_entry( provider_model_id: str, model_descriptor: str, @@ -63,25 +55,20 @@ def build_hf_repo_model_entry( ) -def build_model_entry(provider_model_id: str, model_descriptor: str) -> ProviderModelEntry: - return ProviderModelEntry( - provider_model_id=provider_model_id, - aliases=[], - llama_model=model_descriptor, - model_type=ModelType.llm, - ) - - class ModelRegistryHelper(ModelsProtocolPrivate): __provider_id__: str - def __init__(self, model_entries: list[ProviderModelEntry], allowed_models: list[str] | None = None): - self.model_entries = model_entries + def __init__( + self, + model_entries: list[ProviderModelEntry] | None = None, + allowed_models: list[str] | None = None, + ): self.allowed_models = allowed_models self.alias_to_provider_id_map = {} self.provider_id_to_llama_model_map = {} - for entry in model_entries: + self.model_entries = model_entries or [] + for entry in self.model_entries: for alias in entry.aliases: self.alias_to_provider_id_map[alias] = entry.provider_model_id diff --git a/llama_stack/providers/utils/inference/openai_mixin.py b/llama_stack/providers/utils/inference/openai_mixin.py index 2fe343f63..84211dc96 100644 --- a/llama_stack/providers/utils/inference/openai_mixin.py +++ b/llama_stack/providers/utils/inference/openai_mixin.py @@ -24,12 +24,13 @@ from llama_stack.apis.inference import ( ) from llama_stack.apis.models import ModelType from llama_stack.log import get_logger +from llama_stack.providers.utils.inference.model_registry import ModelRegistryHelper from llama_stack.providers.utils.inference.openai_compat import prepare_openai_completion_params logger = get_logger(name=__name__, category="providers::utils") -class OpenAIMixin(ABC): +class OpenAIMixin(ModelRegistryHelper, ABC): """ Mixin class that provides OpenAI-specific functionality for inference providers. This class handles direct OpenAI API calls using the AsyncOpenAI client. @@ -50,10 +51,18 @@ class OpenAIMixin(ABC): # This is useful for providers that do not return a unique id in the response. overwrite_completion_id: bool = False + # Embedding model metadata for this provider + # Can be set by subclasses or instances to provide embedding models + # Format: {"model_id": {"embedding_dimension": 1536, "context_length": 8192}} + embedding_model_metadata: dict[str, dict[str, int]] = {} + # Cache of available models keyed by model ID # This is set in list_models() and used in check_model_availability() _model_cache: dict[str, Model] = {} + # List of allowed models for this provider, if empty all models allowed + allowed_models: list[str] = [] + @abstractmethod def get_api_key(self) -> str: """ @@ -302,22 +311,36 @@ class OpenAIMixin(ABC): async def list_models(self) -> list[Model] | None: """ - List available models from the provider's /v1/models endpoint. + List available models from the provider's /v1/models endpoint augmented with static embedding model metadata. Also, caches the models in self._model_cache for use in check_model_availability(). :return: A list of Model instances representing available models. """ - self._model_cache = { - m.id: Model( - # __provider_id__ is dynamically added by instantiate_provider in resolver.py - provider_id=self.__provider_id__, # type: ignore[attr-defined] - provider_resource_id=m.id, - identifier=m.id, - model_type=ModelType.llm, - ) - async for m in self.client.models.list() - } + self._model_cache = {} + + async for m in self.client.models.list(): + if self.allowed_models and m.id not in self.allowed_models: + logger.info(f"Skipping model {m.id} as it is not in the allowed models list") + continue + if metadata := self.embedding_model_metadata.get(m.id): + # This is an embedding model - augment with metadata + model = Model( + provider_id=self.__provider_id__, # type: ignore[attr-defined] + provider_resource_id=m.id, + identifier=m.id, + model_type=ModelType.embedding, + metadata=metadata, + ) + else: + # This is an LLM + model = Model( + provider_id=self.__provider_id__, # type: ignore[attr-defined] + provider_resource_id=m.id, + identifier=m.id, + model_type=ModelType.llm, + ) + self._model_cache[m.id] = model return list(self._model_cache.values()) diff --git a/tests/integration/recordings/responses/models-bd032f995f2a-3255f444.json b/tests/integration/recordings/responses/models-bd032f995f2a-3255f444.json new file mode 100644 index 000000000..0909cfcac --- /dev/null +++ b/tests/integration/recordings/responses/models-bd032f995f2a-3255f444.json @@ -0,0 +1,96 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/models", + "headers": {}, + "body": {}, + "endpoint": "/v1/models", + "model": "" + }, + "response": { + "body": [ + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "qwen3:8b", + "created": 1758707188, + "object": "model", + "owned_by": "library" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "nomic-embed-text:137m-v1.5-fp16", + "created": 1758640855, + "object": "model", + "owned_by": "library" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "nomic-embed-text:latest", + "created": 1756727155, + "object": "model", + "owned_by": "library" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "llama3.2-vision:11b", + "created": 1756722893, + "object": "model", + "owned_by": "library" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "llama-guard3:1b", + "created": 1756671473, + "object": "model", + "owned_by": "library" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "all-minilm:l6-v2", + "created": 1756655274, + "object": "model", + "owned_by": "library" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "all-minilm:latest", + "created": 1747317111, + "object": "model", + "owned_by": "library" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "llama3.2:3b-instruct-fp16", + "created": 1744974677, + "object": "model", + "owned_by": "library" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "llama3.2:3b", + "created": 1743536220, + "object": "model", + "owned_by": "library" + } + } + ], + "is_streaming": false + } +} diff --git a/tests/unit/providers/inference/test_litellm_openai_mixin.py b/tests/unit/providers/inference/test_litellm_openai_mixin.py index bbc437edf..dc17e6abf 100644 --- a/tests/unit/providers/inference/test_litellm_openai_mixin.py +++ b/tests/unit/providers/inference/test_litellm_openai_mixin.py @@ -26,7 +26,6 @@ class TestProviderDataValidator(BaseModel): class TestLiteLLMAdapter(LiteLLMOpenAIMixin): def __init__(self, config: TestConfig): super().__init__( - model_entries=[], litellm_provider_name="test", api_key_from_config=config.api_key, provider_data_api_key_field="test_api_key", diff --git a/tests/unit/providers/nvidia/test_eval.py b/tests/unit/providers/nvidia/test_eval.py index 2bdcbbeba..55dfd7bee 100644 --- a/tests/unit/providers/nvidia/test_eval.py +++ b/tests/unit/providers/nvidia/test_eval.py @@ -150,7 +150,7 @@ class TestNVIDIAEvalImpl(unittest.TestCase): self._assert_request_body( { "config": f"nvidia/{MOCK_BENCHMARK_ID}", - "target": {"type": "model", "model": "meta/llama-3.1-8b-instruct"}, + "target": {"type": "model", "model": "Llama3.1-8B-Instruct"}, } ) diff --git a/tests/unit/providers/utils/inference/test_openai_mixin.py b/tests/unit/providers/utils/inference/test_openai_mixin.py index 93f82da19..d62292542 100644 --- a/tests/unit/providers/utils/inference/test_openai_mixin.py +++ b/tests/unit/providers/utils/inference/test_openai_mixin.py @@ -13,7 +13,6 @@ from llama_stack.apis.models import ModelType from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin -# Test implementation of OpenAIMixin for testing purposes class OpenAIMixinImpl(OpenAIMixin): def __init__(self): self.__provider_id__ = "test-provider" @@ -25,12 +24,35 @@ class OpenAIMixinImpl(OpenAIMixin): raise NotImplementedError("This method should be mocked in tests") +class OpenAIMixinWithEmbeddingsImpl(OpenAIMixin): + """Test implementation with embedding model metadata""" + + embedding_model_metadata = { + "text-embedding-3-small": {"embedding_dimension": 1536, "context_length": 8192}, + "text-embedding-ada-002": {"embedding_dimension": 1536, "context_length": 8192}, + } + + __provider_id__ = "test-provider" + + def get_api_key(self) -> str: + raise NotImplementedError("This method should be mocked in tests") + + def get_base_url(self) -> str: + raise NotImplementedError("This method should be mocked in tests") + + @pytest.fixture def mixin(): """Create a test instance of OpenAIMixin""" return OpenAIMixinImpl() +@pytest.fixture +def mixin_with_embeddings(): + """Create a test instance of OpenAIMixin with embedding model metadata""" + return OpenAIMixinWithEmbeddingsImpl() + + @pytest.fixture def mock_models(): """Create multiple mock OpenAI model objects""" @@ -181,3 +203,89 @@ class TestOpenAIMixinCacheBehavior: assert "some-mock-model-id" in mixin._model_cache assert "another-mock-model-id" in mixin._model_cache assert "final-mock-model-id" in mixin._model_cache + + +class TestOpenAIMixinEmbeddingModelMetadata: + """Test cases for embedding_model_metadata attribute functionality""" + + async def test_embedding_model_identified_and_augmented(self, mixin_with_embeddings, mock_client_context): + """Test that models in embedding_model_metadata are correctly identified as embeddings with metadata""" + # Create mock models: 1 embedding model and 1 LLM, while there are 2 known embedding models + mock_embedding_model = MagicMock(id="text-embedding-3-small") + mock_llm_model = MagicMock(id="gpt-4") + mock_models = [mock_embedding_model, mock_llm_model] + + mock_client = MagicMock() + + async def mock_models_list(): + for model in mock_models: + yield model + + mock_client.models.list.return_value = mock_models_list() + + with mock_client_context(mixin_with_embeddings, mock_client): + result = await mixin_with_embeddings.list_models() + + assert result is not None + assert len(result) == 2 + + # Find the models in the result + embedding_model = next(m for m in result if m.identifier == "text-embedding-3-small") + llm_model = next(m for m in result if m.identifier == "gpt-4") + + # Check embedding model + assert embedding_model.model_type == ModelType.embedding + assert embedding_model.metadata == {"embedding_dimension": 1536, "context_length": 8192} + assert embedding_model.provider_id == "test-provider" + assert embedding_model.provider_resource_id == "text-embedding-3-small" + + # Check LLM model + assert llm_model.model_type == ModelType.llm + assert llm_model.metadata == {} # No metadata for LLMs + assert llm_model.provider_id == "test-provider" + assert llm_model.provider_resource_id == "gpt-4" + + +class TestOpenAIMixinAllowedModels: + """Test cases for allowed_models filtering functionality""" + + async def test_list_models_with_allowed_models_filter(self, mixin, mock_client_with_models, mock_client_context): + """Test that list_models filters models based on allowed_models set""" + mixin.allowed_models = {"some-mock-model-id", "another-mock-model-id"} + + with mock_client_context(mixin, mock_client_with_models): + result = await mixin.list_models() + + assert result is not None + assert len(result) == 2 + + model_ids = [model.identifier for model in result] + assert "some-mock-model-id" in model_ids + assert "another-mock-model-id" in model_ids + assert "final-mock-model-id" not in model_ids + + async def test_list_models_with_empty_allowed_models(self, mixin, mock_client_with_models, mock_client_context): + """Test that empty allowed_models set allows all models""" + assert len(mixin.allowed_models) == 0 + + with mock_client_context(mixin, mock_client_with_models): + result = await mixin.list_models() + + assert result is not None + assert len(result) == 3 # All models should be included + + model_ids = [model.identifier for model in result] + assert "some-mock-model-id" in model_ids + assert "another-mock-model-id" in model_ids + assert "final-mock-model-id" in model_ids + + async def test_check_model_availability_with_allowed_models( + self, mixin, mock_client_with_models, mock_client_context + ): + """Test that check_model_availability respects allowed_models""" + mixin.allowed_models = {"final-mock-model-id"} + + with mock_client_context(mixin, mock_client_with_models): + assert await mixin.check_model_availability("final-mock-model-id") + assert not await mixin.check_model_availability("some-mock-model-id") + assert not await mixin.check_model_availability("another-mock-model-id") diff --git a/tests/unit/providers/utils/test_model_registry.py b/tests/unit/providers/utils/test_model_registry.py index db1630000..04e75aa82 100644 --- a/tests/unit/providers/utils/test_model_registry.py +++ b/tests/unit/providers/utils/test_model_registry.py @@ -84,14 +84,14 @@ def unknown_model() -> Model: @pytest.fixture def helper(known_provider_model: ProviderModelEntry, known_provider_model2: ProviderModelEntry) -> ModelRegistryHelper: - return ModelRegistryHelper([known_provider_model, known_provider_model2]) + return ModelRegistryHelper(model_entries=[known_provider_model, known_provider_model2]) class MockModelRegistryHelperWithDynamicModels(ModelRegistryHelper): """Test helper that simulates a provider with dynamically available models.""" def __init__(self, model_entries: list[ProviderModelEntry], available_models: list[str]): - super().__init__(model_entries) + super().__init__(model_entries=model_entries) self._available_models = available_models async def check_model_availability(self, model: str) -> bool: From 28d83faf8af5d1eedaae1f6d75ab5a63519d0774 Mon Sep 17 00:00:00 2001 From: Alexey Rybak <50731695+reluctantfuturist@users.noreply.github.com> Date: Thu, 25 Sep 2025 15:41:12 -0700 Subject: [PATCH 21/27] fix: docs deployment URL (#3556) # What does this PR do? Fixes Llama Stack docs deployment URL ## Test Plan ``` npm run gen-api-docs all npm run build ``` successfully builds the documentation --- docs/docusaurus.config.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts index f4420df87..937aa4ddf 100644 --- a/docs/docusaurus.config.ts +++ b/docs/docusaurus.config.ts @@ -9,8 +9,8 @@ import type * as OpenApiPlugin from "docusaurus-plugin-openapi-docs"; const config: Config = { title: 'Llama Stack', tagline: 'The open-source framework for building generative AI applications', - url: 'https://reluctantfuturist.github.io', - baseUrl: '/llama-stack/', + url: 'https://llamastack.github.io', + baseUrl: '/', onBrokenLinks: "warn", onBrokenMarkdownLinks: "warn", favicon: "img/favicon.ico", From 9c751b6789b70e39b535610d6d69a891ed9e1415 Mon Sep 17 00:00:00 2001 From: Doug Edgar Date: Fri, 26 Sep 2025 02:17:25 -0700 Subject: [PATCH 22/27] feat: use FIPS validated CSPRNG for telemetry (#3554) # What does this PR do? Switches from `random.getrandbits` to `secrets.randbits` in the telemetry module. Closes #3553 ## Test Plan Unit tests from scripts/unit-tests.sh were ran to verify the tests still pass. Signed-off-by: Doug Edgar --- llama_stack/providers/utils/telemetry/tracing.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/llama_stack/providers/utils/telemetry/tracing.py b/llama_stack/providers/utils/telemetry/tracing.py index 9969b1055..62cceb13e 100644 --- a/llama_stack/providers/utils/telemetry/tracing.py +++ b/llama_stack/providers/utils/telemetry/tracing.py @@ -8,7 +8,7 @@ import asyncio import contextvars import logging # allow-direct-logging import queue -import random +import secrets import sys import threading import time @@ -76,16 +76,16 @@ def span_id_to_str(span_id: int) -> str: def generate_span_id() -> str: - span_id = random.getrandbits(64) + span_id = secrets.randbits(64) while span_id == INVALID_SPAN_ID: - span_id = random.getrandbits(64) + span_id = secrets.randbits(64) return span_id_to_str(span_id) def generate_trace_id() -> str: - trace_id = random.getrandbits(128) + trace_id = secrets.randbits(128) while trace_id == INVALID_TRACE_ID: - trace_id = random.getrandbits(128) + trace_id = secrets.randbits(128) return trace_id_to_str(trace_id) From 65e01b56842ef5c31b4d1f9a15508cce07521300 Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Fri, 26 Sep 2025 10:05:52 -0400 Subject: [PATCH 23/27] feat: together now supports base64 embedding encoding (#3559) # What does this PR do? use together's new base64 support ## Test Plan recordings for: ./scripts/integration-tests.sh --stack-config server:ci-tests --suite base --setup together --subdirs inference --pattern openai --- .../remote/inference/together/together.py | 9 +- .../inference/test_openai_embeddings.py | 1 - .../recordings/responses/1d54570bbe4b.json | 2353 +++++++++++++ .../recordings/responses/225b4d2263a7.json | 802 +++++ .../recordings/responses/2c55f483cea8.json | 59 + .../recordings/responses/33b71fb85bfb.json | 730 ++++ .../recordings/responses/3d89a56a76b1.json | 46 + .../recordings/responses/41ace09e5dba.json | 59 + .../recordings/responses/52b4e16b7289.json | 181 + .../recordings/responses/53365c6ae29c.json | 59 + .../recordings/responses/546dc9533c84.json | 801 +++++ .../recordings/responses/5c0552be2793.json | 3127 +++++++++++++++++ .../recordings/responses/6841bb14fa8d.json | 61 + .../recordings/responses/68e59155a09f.json | 802 +++++ .../recordings/responses/69464dfd3a06.json | 59 + .../recordings/responses/7550dd0d24bc.json | 166 + .../recordings/responses/8e5b53b9d493.json | 801 +++++ .../recordings/responses/a0ec01643fa2.json | 59 + .../recordings/responses/ae82d694f34c.json | 802 +++++ .../recordings/responses/b734171a0872.json | 801 +++++ .../recordings/responses/c8a59b661fd5.json | 46 + .../recordings/responses/d2e057a81717.json | 61 + .../recordings/responses/d5971b8fdb94.json | 801 +++++ .../recordings/responses/dcbe6260d0a1.json | 2352 +++++++++++++ .../recordings/responses/e8b427b3d631.json | 802 +++++ .../recordings/responses/ef4d211b38bf.json | 59 + .../recordings/responses/f4c5ae637cd1.json | 59 + 27 files changed, 15951 insertions(+), 7 deletions(-) create mode 100644 tests/integration/recordings/responses/1d54570bbe4b.json create mode 100644 tests/integration/recordings/responses/225b4d2263a7.json create mode 100644 tests/integration/recordings/responses/2c55f483cea8.json create mode 100644 tests/integration/recordings/responses/33b71fb85bfb.json create mode 100644 tests/integration/recordings/responses/3d89a56a76b1.json create mode 100644 tests/integration/recordings/responses/41ace09e5dba.json create mode 100644 tests/integration/recordings/responses/52b4e16b7289.json create mode 100644 tests/integration/recordings/responses/53365c6ae29c.json create mode 100644 tests/integration/recordings/responses/546dc9533c84.json create mode 100644 tests/integration/recordings/responses/5c0552be2793.json create mode 100644 tests/integration/recordings/responses/6841bb14fa8d.json create mode 100644 tests/integration/recordings/responses/68e59155a09f.json create mode 100644 tests/integration/recordings/responses/69464dfd3a06.json create mode 100644 tests/integration/recordings/responses/7550dd0d24bc.json create mode 100644 tests/integration/recordings/responses/8e5b53b9d493.json create mode 100644 tests/integration/recordings/responses/a0ec01643fa2.json create mode 100644 tests/integration/recordings/responses/ae82d694f34c.json create mode 100644 tests/integration/recordings/responses/b734171a0872.json create mode 100644 tests/integration/recordings/responses/c8a59b661fd5.json create mode 100644 tests/integration/recordings/responses/d2e057a81717.json create mode 100644 tests/integration/recordings/responses/d5971b8fdb94.json create mode 100644 tests/integration/recordings/responses/dcbe6260d0a1.json create mode 100644 tests/integration/recordings/responses/e8b427b3d631.json create mode 100644 tests/integration/recordings/responses/ef4d211b38bf.json create mode 100644 tests/integration/recordings/responses/f4c5ae637cd1.json diff --git a/llama_stack/providers/remote/inference/together/together.py b/llama_stack/providers/remote/inference/together/together.py index 653f84610..37973d635 100644 --- a/llama_stack/providers/remote/inference/together/together.py +++ b/llama_stack/providers/remote/inference/together/together.py @@ -6,7 +6,7 @@ from collections.abc import AsyncGenerator -from openai import NOT_GIVEN, AsyncOpenAI +from openai import AsyncOpenAI from together import AsyncTogether from together.constants import BASE_URL @@ -311,10 +311,9 @@ class TogetherInferenceAdapter(OpenAIMixin, ModelRegistryHelper, Inference, Need the standard OpenAI embeddings endpoint. The endpoint - - - does not return usage information + - not all models return usage information - does not support user param, returns 400 Unrecognized request arguments supplied: user - does not support dimensions param, returns 400 Unrecognized request arguments supplied: dimensions - - does not support encoding_format param, always returns floats, never base64 """ # Together support ticket #13332 -> will not fix if user is not None: @@ -322,13 +321,11 @@ class TogetherInferenceAdapter(OpenAIMixin, ModelRegistryHelper, Inference, Need # Together support ticket #13333 -> escalated if dimensions is not None: raise ValueError("Together's embeddings endpoint does not support dimensions param.") - # Together support ticket #13331 -> will not fix, compute client side - if encoding_format not in (None, NOT_GIVEN, "float"): - raise ValueError("Together's embeddings endpoint only supports encoding_format='float'.") response = await self.client.embeddings.create( model=await self._get_provider_model_id(model), input=input, + encoding_format=encoding_format, ) response.model = model # return the user the same model id they provided, avoid exposing the provider model id diff --git a/tests/integration/inference/test_openai_embeddings.py b/tests/integration/inference/test_openai_embeddings.py index 0598919a1..92064b651 100644 --- a/tests/integration/inference/test_openai_embeddings.py +++ b/tests/integration/inference/test_openai_embeddings.py @@ -41,7 +41,6 @@ def skip_if_model_doesnt_support_user_param(client, model_id): def skip_if_model_doesnt_support_encoding_format_base64(client, model_id): provider = provider_from_model(client, model_id) if provider.provider_type in ( - "remote::together", # param silently ignored, always returns floats "remote::databricks", # param silently ignored, always returns floats "remote::fireworks", # param silently ignored, always returns list of floats "remote::ollama", # param silently ignored, always returns list of floats diff --git a/tests/integration/recordings/responses/1d54570bbe4b.json b/tests/integration/recordings/responses/1d54570bbe4b.json new file mode 100644 index 000000000..8fc686895 --- /dev/null +++ b/tests/integration/recordings/responses/1d54570bbe4b.json @@ -0,0 +1,2353 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": [ + "Hello, world!", + "How are you today?", + "This is a test." + ], + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.017041557, + -0.07436493, + 0.02897635, + -0.032216743, + 0.0056444216, + -0.029015187, + 0.06512343, + -0.040310342, + 0.05263593, + 0.0068842396, + 0.019191971, + -0.0064884443, + -0.01664521, + 0.014244285, + 0.036390014, + -0.040292, + 0.031780273, + 0.0039553884, + -0.055303488, + -0.028992416, + -0.02059435, + 0.05677091, + -0.043668333, + -0.014273451, + 0.15328151, + -0.023603301, + -0.049825363, + 0.007869072, + -0.010882995, + -0.033912696, + 0.053697765, + -0.00093928695, + 0.0017799847, + 0.038871024, + -0.069678165, + -0.067093275, + 0.025772842, + -0.057590123, + -0.015825877, + 0.020131286, + 0.020742312, + 0.003915491, + -0.018451879, + 0.020440312, + -0.023613403, + -0.039568678, + -0.013152008, + -0.01871725, + 0.021348018, + -0.019964654, + 0.038607903, + 0.018397795, + -0.0063561443, + -0.018936336, + -0.060981557, + -0.02152846, + 0.027057847, + 0.0014626224, + -0.018241309, + -0.07473041, + -0.02377323, + -0.033910733, + 0.02569418, + -0.024951216, + -0.0076659806, + -0.015425462, + 0.006604636, + 0.09833969, + -0.005054596, + 0.008841989, + -0.01836461, + -0.018554095, + 0.011605144, + -0.016599955, + -0.062196333, + -0.0037542647, + -0.025220644, + -0.027834827, + -0.020460974, + -0.050503097, + 0.032119684, + -0.023387104, + 0.050067227, + -0.05834235, + 0.023189448, + -0.021862485, + 0.023831544, + -0.016663097, + -0.041609522, + 0.025361128, + 0.002924296, + 0.01852158, + 0.08960255, + -0.003265466, + -0.058762494, + -0.06428431, + -0.014671485, + -0.046800107, + 0.02691456, + -0.0059303525, + -0.015431455, + 0.022179665, + 0.014044907, + 0.012218545, + 0.0053836405, + -0.025096457, + 0.009438382, + 0.032498095, + 0.06879721, + 0.056900814, + 0.019497631, + -0.122159146, + -0.106994465, + -0.017456975, + 0.047223866, + 0.06569824, + 0.04780035, + 0.018039258, + -0.0011028647, + -0.05067006, + 0.0106863845, + 0.027489506, + -0.014593985, + -0.039851535, + -0.09175489, + 0.037555773, + -0.060439512, + 0.008525801, + 0.0071557434, + -0.057973035, + -0.054225244, + 0.051505033, + -0.0008626373, + 0.069083415, + 0.064380065, + 0.09843996, + 0.0062191207, + -0.041505292, + -0.05381256, + -0.0073601264, + -0.03288613, + 0.011711341, + -0.09244605, + 0.0069717136, + -0.05722877, + 0.041075893, + 0.06521969, + -0.0018537377, + 0.016272636, + 0.008761483, + -0.029342752, + 0.020412564, + -0.07015791, + 0.033616304, + 0.039998446, + 0.01602917, + 0.044467725, + -0.08176377, + -0.036885373, + 0.03468746, + 0.0024068495, + 0.00056306267, + 0.02546511, + -0.053339135, + -0.027220095, + -0.021510394, + 0.054806393, + -0.005447777, + -0.05690438, + -0.028497366, + 0.01873974, + -0.035461064, + -0.00019089226, + -0.04914238, + 0.030303763, + 0.013396073, + 0.015789565, + -0.07714792, + -0.062155712, + -0.00677417, + 0.02850476, + 0.031491462, + 0.014566345, + 0.012163924, + 0.11814501, + -0.0043511004, + -0.017920421, + 0.004205825, + -0.0015928322, + -0.012145554, + 0.01663168, + -0.071173735, + 0.0029570858, + 0.12899451, + 0.004157568, + 0.010501232, + 0.07710632, + 0.062119417, + 0.021002673, + -0.023212241, + -0.04327007, + -0.0567023, + 0.04590105, + 0.0019161925, + 0.02637205, + 0.029331107, + -0.029769177, + -0.050466795, + -0.08057371, + 0.007419741, + -0.008777471, + 0.02217743, + 0.013535721, + 0.03426775, + 0.04592361, + 0.009423588, + -0.023030678, + -0.024462381, + 0.054334357, + 0.06710402, + 0.077300854, + 0.0300022, + -0.0035417816, + -0.0046773576, + -0.0927158, + -0.0218652, + -0.043468982, + -0.035734102, + -0.038873542, + -0.0412869, + -0.016015923, + 0.0038303286, + 0.08523618, + -0.05200533, + -0.014904317, + -0.016793448, + 0.04478206, + -0.017161047, + 0.02638292, + 0.007849463, + -0.040533304, + -0.017599737, + 0.047704253, + 0.034988616, + -0.013908102, + 0.044121094, + 0.040395457, + -0.010402818, + 0.0063570403, + -0.014962749, + 0.025776524, + 0.023681043, + 0.006042675, + 0.017647373, + 0.016301101, + -0.07793374, + -0.004771094, + 0.012728924, + -0.00047885205, + -0.051591527, + 0.03612118, + -0.02209703, + 0.052075963, + -0.021613466, + -0.026258182, + 0.008102769, + -0.04963262, + 0.00062747014, + -0.012579783, + 0.076374784, + -0.047350414, + -0.007680664, + 0.062471915, + -0.0061351187, + -0.043617643, + 0.023878522, + -0.09653609, + 0.018392054, + -0.039719462, + 0.065271765, + 0.034548305, + 0.004219043, + -0.003628092, + 0.0047836183, + 0.0132732885, + -0.028140727, + -0.015683327, + -0.052812085, + -0.019410037, + 0.06812139, + -0.041178964, + 0.014646207, + -0.0037439142, + 0.0003088275, + -0.04985693, + 0.0223661, + 0.008887433, + 0.0049061268, + 0.042707395, + -0.021471359, + -0.06471383, + 0.0022036259, + 0.030178884, + -0.002764245, + -0.0063233464, + -0.04146522, + -0.008236624, + 0.0037351896, + -0.027550086, + -0.0137326885, + 0.0055276263, + 0.0016785853, + 0.050191414, + 0.02629574, + -0.009129228, + 0.06351977, + -0.037435655, + 0.0467174, + -0.012987377, + -0.007550927, + -0.004503205, + 0.010520655, + 0.064984836, + 0.009879768, + 0.055787366, + -0.042653065, + 0.024189176, + 0.0378726, + -0.032453574, + 0.043519154, + 0.020133087, + -0.055212636, + -0.016188117, + 0.03764466, + -0.022142444, + 0.11164031, + 0.019020407, + -0.008950892, + 0.0517199, + 0.0014494535, + 0.041113462, + -0.0912906, + -0.04723132, + 0.008548748, + 0.028231544, + 0.023689618, + -0.039103802, + -0.034011997, + -0.04731894, + 0.03309799, + -0.044572156, + -0.116778485, + -0.028786778, + 0.05798776, + 0.05287191, + -0.0039562676, + -0.08213019, + -0.01224603, + -0.012757768, + 0.035721667, + 0.012440343, + 0.0053813523, + -0.072770126, + 0.0066190604, + 0.038976185, + -0.037760906, + -0.0031381482, + -0.052277293, + -0.016870236, + -0.053451907, + -0.05629483, + -0.034493946, + -0.0048654405, + 0.022051724, + 0.028501945, + 0.025858566, + -0.023936177, + -0.098391004, + -0.030646492, + -0.049461726, + -0.00086931954, + 0.03593346, + 0.015843417, + -0.03276966, + 0.008957432, + -0.022735167, + -0.012159252, + 0.07607085, + -0.059834506, + 0.004478244, + 0.03439635, + 0.03683821, + 0.062883355, + 0.054430448, + -0.029807799, + 0.0032295138, + 0.08891875, + -0.026941199, + -0.00618463, + -0.022683868, + -0.024138795, + -0.036633875, + 0.02097464, + -0.003001584, + 0.020455033, + 0.043717608, + 0.06566654, + -0.029039463, + -0.0066977167, + -0.04504434, + 0.022257777, + 0.054422457, + 0.029796708, + 0.009008146, + 0.028205348, + 0.06255052, + -0.004475601, + 0.059329458, + -0.038065027, + -0.027933009, + -0.07060949, + 0.013978787, + -0.051300917, + 0.02945564, + -0.008552103, + -0.009436655, + 0.039747514, + -0.016741823, + 0.04740887, + 0.03521937, + -0.012574282, + -0.089222826, + -0.043515395, + -0.04158566, + 0.0016020355, + 0.02684753, + -0.019394692, + -0.02156877, + 0.06316388, + 0.01663444, + 0.015482924, + 0.047349654, + -0.028341234, + 0.013805591, + -0.010708488, + -0.07627738, + 0.08611209, + 0.0089956885, + 0.034438204, + 0.016312746, + -0.03412846, + 0.0770598, + -0.06790466, + 0.036359854, + 0.08038976, + 0.023465984, + -0.019832904, + -0.0011524013, + -0.03804293, + 0.04106918, + -0.028220456, + 0.032340813, + -0.030669356, + -0.004353358, + -0.019439798, + 0.0020563425, + 0.03015629, + -0.06430176, + 0.0034439075, + -0.045720384, + -0.06526568, + -0.0004192516, + -0.016580455, + -0.012596616, + 0.039126, + -0.04699455, + -0.008973794, + 0.015056125, + 0.018929023, + -0.07840811, + -0.014792519, + -0.0044317124, + 0.019588342, + 0.035912346, + -0.035739247, + 0.058755044, + -0.01856197, + 0.021155646, + -0.073580906, + -0.04310776, + -0.023147091, + -0.010232029, + 0.06352039, + 0.039570276, + 0.020424508, + 0.051613245, + 0.013395984, + -0.003908009, + -0.04643392, + 0.019592889, + -0.008484923, + 0.0031434586, + -0.046069775, + -0.01765311, + -0.041277196, + -0.070297986, + 0.012561737, + -0.003500738, + -0.01729488, + -0.0033254062, + 0.053035453, + -0.054218896, + -0.029708259, + -0.0047281524, + 0.019236762, + -0.12249525, + 0.03018237, + -0.028753102, + -0.031858314, + 0.0811298, + -0.005711499, + -0.057587985, + 0.014153141, + 0.0006705577, + -0.024263157, + 0.016729265, + -0.03195949, + -0.007259763, + -0.0035231581, + -0.03890975, + 0.011460382, + -0.06591321, + -0.023756726, + -0.023958001, + 0.030074941, + -0.0040949634, + -0.048368257, + -0.029692868, + 0.027246583, + -0.024747347, + 0.014442731, + -0.00832639, + -0.0002390868, + -0.013635633, + 0.0035843733, + 0.02354072, + -0.012829061, + -0.0060750768, + -0.044952527, + -0.05725624, + 0.031746052, + -0.024419094, + 0.032444403, + -0.029308707, + 0.034302235, + -0.022495607, + 0.015296428, + -0.0057196384, + -7.8588724e-05, + 0.060303975, + 0.06299601, + 0.028222265, + -0.0071411408, + 0.015196491, + 0.02031155, + 0.039635558, + 0.079736926, + 0.008736669, + -0.023079613, + -0.04490686, + -0.021764707, + -0.015199573, + 0.036019534, + -0.0046079857, + 0.04429082, + -0.04291344, + -0.05991891, + -0.006501417, + 0.010603077, + 0.03435066, + -0.065568395, + -0.04424192, + 0.035055783, + 0.019717937, + 0.032764338, + 0.021240309, + -0.01646063, + 0.007835414, + 0.06857148, + -0.013750999, + 0.028333688, + -0.078255735, + -0.047899257, + -0.0006370693, + 0.012606231, + 0.012178417, + -0.013057751, + -0.008095854, + -0.013466724, + 0.019036459, + -0.025450038, + 0.021131655, + -0.02505666, + 0.012961284, + 0.0004236046, + -0.023920864, + -0.055114083, + 0.082351916, + 0.028973032, + 0.025259241, + 0.098259576, + -0.007385416, + 0.003546012, + -0.05316339, + -0.04186183, + 0.043638214, + -0.069299474, + -0.013284585, + -0.010019175, + 0.012883975, + 0.014200739, + -0.013508286, + 0.0086570075, + -0.020393575, + 0.10617594, + 0.028786503, + -0.018674662, + 0.026763268, + -0.0062548965, + -0.07215284, + 0.055464335, + 0.0029595464, + -0.009364344, + -0.096402094, + 0.02823341, + -0.022853011, + 0.04750492, + 0.008378555, + 0.016491622, + 0.01860681, + 0.048116222, + 0.106049344, + -0.028929656, + -0.008896546, + 0.033615295, + -0.0070807124, + -0.05684197, + -0.061439563, + 0.0060220268, + 0.046171866, + -0.01574131, + -0.07562956, + 0.0024098414, + 0.0006304895, + -0.07831614, + 0.060869616, + 0.00076000375, + -0.008209363, + -0.04139266, + -0.085268535, + -0.028194478, + -0.024567788, + -0.04218179, + 0.023546752, + 0.036236234, + 0.017199656, + -0.03315456, + -0.023814544, + 0.038755447, + -0.023165299, + -0.049283065, + -0.006907019, + 0.040826146, + 0.017533792, + -0.036849793, + -0.015506943, + -0.010768763, + -0.08758806, + -0.0295733, + 0.055843282, + -0.012555046, + 0.0076235603, + 0.008802991, + 0.026661193, + -0.023899797, + 0.043548774, + -0.034339137, + -0.027354732, + -0.07583677, + 0.020500224, + 0.036802996, + 0.031019075, + 0.04605757, + -0.004433706, + 0.0108612785, + 0.050121468, + -0.07816735, + -0.014776514, + -0.04565195, + -0.0036854912, + 0.0075577567, + -0.017044865, + 0.030597543, + -0.013623054, + -0.0648466, + -0.0318741, + -0.059455115, + -0.024783187, + -0.0088010235, + 0.11127796, + 0.03429834, + -0.010424589, + -0.06355135, + 0.034265812, + 0.02680333, + -0.007930513, + 0.030092249, + 0.008321974, + 0.03125566, + -0.06832331, + -0.0076806936, + 0.034010306, + -0.087202646, + -0.047684345, + 0.06384632, + -0.026591811, + -0.0016003181, + 0.05721666, + -0.0024700803, + -0.029714238, + 0.07761957, + -0.04561395, + -0.053199258, + 0.030417573, + -0.01958724, + 0.0012449475, + -0.04003076, + 0.08825553, + -0.023196172, + -0.08629044, + -0.049815316, + 0.027229005, + 0.0021765123, + 0.03438692, + -0.09314263, + -0.019655729, + 0.018762926, + 0.025670087, + -0.017116003, + 0.031716976, + -0.05509443, + 0.032953184, + -0.02264915, + 0.04861606, + -0.050201602, + 0.033154316, + 0.009971947, + -0.037610047, + 0.016600395, + -0.031037569, + -0.015495428, + 0.026365642, + -0.043527953, + 0.055781424, + 0.06780075, + -0.015966192, + 0.03201043, + 0.028026119 + ], + "index": 0, + "object": "embedding" + }, + { + "embedding": [ + -0.050693978, + -0.010858309, + 0.020310253, + -0.01049692, + 0.029866666, + -0.025998075, + 0.07918496, + -0.042496245, + -0.028718667, + -0.027305981, + -0.02330032, + -0.021886542, + -0.027306426, + 0.061016064, + 0.012688038, + 0.022281228, + -0.054594085, + 0.07765493, + 0.05386447, + 0.03140333, + -9.44268e-06, + -0.0011356915, + 0.022630688, + -0.014110621, + 0.030000638, + 0.007599051, + -0.06352133, + 0.053137243, + -0.056568034, + 0.057547573, + 0.0030512416, + 0.03837667, + 0.04789846, + 0.038161233, + -0.02627195, + -0.050061185, + 0.10019976, + 0.038518198, + 0.010254856, + 0.10148112, + 0.04869421, + -0.0073997034, + 0.05293147, + -0.034767445, + 0.07249512, + 0.05695461, + -0.03786103, + 0.007449489, + 0.020537589, + 0.000312089, + 0.016584814, + 0.001918721, + 0.05273067, + 0.027494889, + 0.0637688, + -0.06113676, + 0.041710924, + 0.039151315, + 0.045457218, + -0.042557742, + -0.03437774, + -0.03965357, + 0.035107236, + -0.030944545, + 0.018480912, + 0.016318278, + 0.010664849, + 0.06706701, + 0.028976813, + 0.04934793, + 0.01920518, + -0.022590633, + 0.05794299, + -0.014218797, + -0.10727855, + -0.04222983, + 0.014688315, + -0.009868972, + -0.030892346, + 0.024784064, + -0.01335315, + -0.030918332, + -0.022723109, + 0.018553259, + -0.030180262, + -0.0072358795, + 0.04466348, + 0.0028644707, + -0.08218491, + -0.035578046, + 0.034649692, + 0.014995248, + -0.034041993, + -0.01754551, + 0.012509432, + -0.12817404, + 0.022282014, + 0.038324747, + -0.007946491, + -0.10563139, + -0.0018780051, + -0.010040646, + 0.051342048, + -0.031782173, + 0.026881691, + -0.0070015015, + 0.1403214, + -0.0383665, + 0.13297008, + 0.01473871, + 0.0035459534, + -0.05397022, + 0.0027416502, + -0.008002018, + -0.05214072, + 0.046578355, + -0.06554441, + -0.01918899, + -0.044716686, + 0.016660467, + 0.0074168034, + 0.043397274, + 0.041952852, + -0.020719659, + 0.044949867, + 0.08868983, + -0.06033043, + -0.06299611, + -0.0299354, + -0.06335069, + -0.041603137, + 0.063161835, + 0.0053624725, + 0.04566859, + 0.01997067, + -0.08615492, + -0.00461124, + 0.039520558, + 0.040905517, + -0.035469536, + -0.04317211, + 0.011673073, + -0.06018417, + 0.0028443343, + -0.09747001, + -0.087689236, + 0.0004175659, + 0.07349427, + -0.002189792, + -0.023225918, + 0.031347603, + 0.003863699, + 0.03039125, + 0.0026322505, + -0.0044767857, + 0.037814893, + 0.013607858, + -0.04524581, + 0.006180776, + -0.025796989, + -0.0018575953, + 0.056745563, + -0.056899827, + -0.13912162, + 0.01923313, + -0.0072119716, + 0.03653831, + -0.03553157, + 0.008960138, + 0.01913016, + 0.041605312, + -0.030891325, + -0.050350275, + 0.017834349, + -0.06821085, + 0.024607243, + 0.016700145, + 0.06613456, + 0.048102804, + 0.06076021, + 0.006365906, + 0.009644411, + 0.044110093, + 0.04351857, + 0.06734216, + -0.0017035177, + -0.00439251, + -0.06284958, + -0.012278929, + -0.12074305, + -0.010177493, + -0.04965999, + 0.023366336, + -0.04580006, + 0.019479955, + -0.006699217, + 0.03502374, + 0.1611132, + -0.026563711, + 0.0025155211, + 0.018676694, + 0.0009814353, + -0.036826, + 0.017627593, + 0.07587332, + 0.006969805, + -0.051941425, + -0.06698752, + -0.006748652, + 0.026837183, + -0.0744657, + 0.011689156, + -0.01411786, + -0.031564586, + -0.07331578, + 0.001811603, + -0.017448701, + -0.0654881, + 0.00889219, + 0.056011263, + 0.054930564, + 0.027538713, + 0.010776839, + -0.009119489, + -0.034182906, + -0.07947322, + 0.010956856, + 0.0067299716, + -0.038189813, + -0.0017738482, + 0.0026462704, + -0.0539034, + -0.0066219224, + 0.00018278696, + 0.06491363, + 0.050116353, + 0.03692079, + 0.08176937, + 0.049276054, + -0.038431957, + 0.0041264175, + 0.0016263039, + 0.04835715, + 0.05372281, + -0.039015856, + -0.0035196007, + 0.022530695, + 0.055513002, + 0.030869612, + -0.008039368, + -0.013746457, + -0.045808554, + 0.021556988, + 0.0014481185, + 0.03700321, + 0.03712917, + 0.10185659, + -0.08633657, + 0.03425641, + 0.045996998, + -0.051326204, + -0.02598336, + 0.037188865, + 0.047904, + -0.016023936, + 0.051980697, + -0.036479976, + 0.10651916, + -0.008438165, + 0.04487357, + -0.0035620069, + -0.018047113, + 0.06171551, + 0.014961666, + -0.012419838, + -0.04932983, + -0.03162733, + 0.04412971, + 0.010965971, + 0.0099312, + -0.06457594, + -0.0020091454, + -0.012179282, + 0.011060499, + 0.013348316, + 0.0040744096, + -0.053495333, + -0.055626135, + -0.024634268, + 0.041642897, + -0.020521278, + 0.0077626, + -0.02442528, + 0.02345328, + -0.07039642, + 0.011572023, + -0.03946985, + -0.017554415, + -0.018510753, + -0.02628016, + 0.003842782, + -0.013968606, + 0.009930984, + -0.0019439043, + -0.001055162, + -0.024441715, + 0.002748, + 0.03797272, + -0.01796759, + 0.016857954, + -0.054101113, + 0.029492574, + 0.009648833, + 0.06267544, + 0.025378056, + 0.008614674, + 0.03406931, + 0.04041812, + 0.050837472, + 0.016481942, + -0.010224863, + -0.020784473, + -0.039759353, + 0.04798226, + 0.026257176, + -0.111021474, + 0.0015075838, + 0.07929549, + 0.029072981, + 0.03136461, + -0.09024568, + 0.03706794, + 0.00069653604, + 0.028990004, + 0.00158074, + -0.058231257, + -0.012032319, + -0.11285045, + 0.03993099, + 0.022554532, + 0.038430568, + -0.036563788, + -0.036297306, + 0.07201281, + 0.05026459, + -0.03646699, + -0.06714899, + -0.036391288, + 0.07507739, + 0.039017055, + 0.056063708, + -0.061854262, + 0.0077921483, + 0.026512198, + 0.0035518222, + -0.021420741, + -0.000929089, + 0.0051694694, + -0.054385625, + 0.015488236, + 0.0018151755, + 0.023275228, + -0.051910095, + 0.046563655, + -0.027084865, + -0.019521073, + 0.07038185, + -0.005629437, + 0.0104171075, + -0.025500813, + 0.012515233, + -0.018450025, + 0.0064471816, + -0.0822687, + 0.0514733, + -0.0007634487, + 0.041627247, + -0.016323347, + -0.0053568603, + 0.085863255, + 0.033773705, + -0.0048070354, + -0.0004412159, + -0.023257103, + 0.05561736, + 0.05207766, + 0.019670658, + 0.037812483, + -0.013077478, + -0.014929977, + 0.04772904, + 0.033561055, + -0.05835228, + 0.09368593, + -0.013790776, + 0.024843333, + 0.052117642, + 0.016168434, + -0.03309694, + -0.0332709, + 0.037880875, + -0.029704971, + 0.0103478255, + 0.0621371, + -0.00020507257, + 0.012393343, + -0.011916155, + 0.08173812, + -0.039204735, + -0.024686804, + 0.024316456, + 0.031949792, + 0.012687219, + 0.017169757, + -0.0016561806, + 0.017296743, + -0.005550947, + -0.04265122, + -0.0684987, + 0.06895011, + 0.016198147, + 0.12301288, + -0.027970051, + 0.07270332, + -0.0781321, + -0.023150189, + 0.019209703, + 0.050384432, + 0.063102365, + -0.1052462, + 0.013622426, + 0.024222417, + 0.07932484, + -0.044099297, + 0.05000115, + 0.01611413, + -0.066668235, + 0.03482801, + -0.03827191, + -0.016675064, + -0.008992525, + 0.01809865, + -0.0016681388, + 0.008033063, + -0.018875819, + 0.0005663335, + 0.044920616, + 0.076877005, + 0.06927666, + -0.05225116, + -0.032670625, + 0.067736275, + -0.027458396, + 0.04716389, + -0.02720322, + 0.013453853, + -0.038000166, + 0.04254829, + 0.02056911, + 0.07206648, + -0.032540064, + -0.0067454036, + -0.07023072, + 0.034042906, + -0.007585006, + -0.0068458025, + -0.019583486, + -0.079872504, + -0.04205456, + -0.09317277, + 0.008631627, + 0.029064497, + 0.055591475, + 0.049023792, + 0.017245598, + -0.027409904, + -0.008231064, + 0.05183169, + 0.088575125, + -0.00014200807, + -0.028889684, + 0.0103782285, + 0.031932928, + -0.0010171203, + 0.00889097, + 0.03915642, + -0.014465671, + 0.025092429, + -0.051718716, + -0.005562561, + 0.009389093, + -0.012151888, + 0.035728022, + -0.07083709, + 0.048586708, + -0.020331206, + 0.03032039, + -0.022218483, + -0.01604572, + -0.019281179, + -0.047274433, + 0.08225039, + -0.009769263, + -0.022123044, + -0.025783258, + 0.015255551, + 0.03588135, + 0.04413771, + -0.014886365, + -0.015528786, + -0.027134163, + -0.03344223, + -0.03906999, + -0.030708836, + 0.027987922, + -0.02679848, + -0.025790287, + 0.034544602, + -0.0015380334, + -0.011152637, + -0.033290375, + -0.06581815, + 0.06209049, + -0.012149317, + -0.06770575, + -0.029887203, + -0.021404674, + -0.048510525, + 0.020026335, + 0.021071516, + 0.01682142, + -0.12870917, + -0.012587804, + -0.04055468, + 0.047302578, + -0.037762202, + -0.046112824, + 0.010776369, + -0.014212859, + 0.02349173, + 0.09041585, + 1.565367e-05, + 0.07245511, + -0.033793304, + 0.035921212, + -0.02783346, + 0.0806998, + -0.010611987, + 0.041489985, + -0.017004602, + 0.024825959, + 0.0017323868, + 0.06234449, + 0.04331931, + 0.008339923, + 0.043990854, + 0.0060589914, + -0.022705998, + -0.020941943, + -0.00049144955, + 0.08638997, + 0.012002845, + 0.090267256, + 0.028547058, + -0.006239364, + 0.06821692, + 0.045356773, + 0.0515711, + -0.0023774423, + -0.0055029676, + -0.039530966, + -0.06231984, + 0.07199615, + -0.0736272, + 0.06531544, + 0.015005152, + 0.018980997, + 0.0010049999, + -0.01213177, + 0.05067269, + -0.026431412, + -0.039080206, + 0.051915344, + -0.018134514, + 0.008343715, + -0.038160358, + -0.033324458, + 0.0029796292, + -0.09010633, + -0.007604104, + -0.08881641, + -0.04259058, + -0.09903379, + -0.012423294, + 0.019745879, + -0.02834356, + 0.020667437, + -0.025804685, + 0.052014343, + 0.016800258, + -0.014739471, + -0.043742716, + 0.049421653, + 0.021032294, + -0.061259594, + -0.050550286, + 0.04592372, + 0.050988674, + 0.0491073, + -0.00096262776, + 0.08990844, + 0.037509143, + 0.028742973, + -0.118190385, + 0.010533227, + -0.03514427, + -0.08367883, + -0.013493585, + 0.02654289, + 0.014374991, + -0.039481364, + 0.1674116, + 0.07490431, + 0.058380052, + 0.027852368, + -0.061896965, + -0.022872766, + 0.047993485, + -0.065123655, + -0.07428092, + -0.041723747, + 0.080762535, + 0.010601916, + -0.035257086, + -0.047732975, + 6.712973e-05, + 0.05134923, + 0.050521225, + 0.025271116, + -0.0072390456, + 0.04151577, + 0.02572708, + -0.057142563, + -0.028259942, + 0.018771905, + -0.033247933, + -0.06304049, + 0.03697809, + -0.037529476, + 0.03391705, + 0.023996636, + -0.063727565, + -0.049316347, + -0.021822812, + -0.051387135, + 0.016310921, + 0.0016229213, + 0.006816926, + -0.028204253, + 0.027451735, + 0.024213102, + 0.07196294, + 0.00041893774, + -0.0096297115, + 0.049549352, + -0.06110793, + 0.0061441287, + -0.050353367, + -0.015283087, + -0.01888433, + -0.05886002, + 0.012889236, + 0.02860981, + 0.04765169, + -0.035136737, + 0.0049838605, + -0.064163454, + 0.051824152, + -0.01143845, + 0.007576831, + -0.018313015, + 0.012159296, + 0.034033798, + 0.020029843, + 0.019590652, + -0.010082555, + -0.022751726, + -0.0355381, + -0.038172133, + 0.12067669, + -0.075687334, + 0.01861976, + -0.031330068, + 0.026860299, + 0.006408792, + -0.0145417405, + 0.015177668, + -0.03025762, + 0.07643991, + 0.016266705, + -0.013141844, + -0.07231639, + 0.055646416, + -0.021509636, + -0.025625022, + -0.047063146, + -0.070508875, + -0.08632433, + -0.011631201, + -0.019939274, + -0.06350421, + -0.019870907, + 0.03216671, + 0.058062643, + 0.055208843, + -0.07156028, + 0.007989774, + 0.049972944, + 0.037406262, + -0.06293042, + -0.027840614, + -0.041593563, + -0.054527696, + 0.021761741, + 0.017650325, + -0.055453133, + -0.024841229, + 0.029395606, + -0.058559354, + 0.010116847, + -0.029088652, + 0.022447364, + 0.0079206675, + -0.015874255, + -0.0039944267, + -0.08912434, + -0.04124756, + 0.021253418, + -0.027858313, + -0.06234424, + -0.028922025, + -0.006749017, + -0.00204751, + 0.020167105, + -0.008826207, + -0.008012587, + -0.02876077, + 0.04325802, + -0.006442264, + 0.03814887, + -0.03429738, + 0.0058901254, + 0.02109685, + 0.01542989, + -0.06856703, + 0.037813462, + -0.007801844, + 0.038300894, + 0.03818303, + -0.06064273, + -0.03106093, + 0.017438883, + 0.0030734143, + 0.0013211939, + 0.017740646, + -0.030678462, + 0.02107452, + 0.061798688 + ], + "index": 1, + "object": "embedding" + }, + { + "embedding": [ + -0.02779177, + -0.007752902, + 0.00666607, + 0.007333073, + 0.027681155, + -0.04680753, + 0.034528963, + -0.050833542, + -0.055877283, + -0.075369135, + 0.018063514, + -0.0045533236, + -0.011292311, + 0.032624524, + -0.013017948, + -0.048883513, + -0.013815144, + 0.022201993, + -0.0025201102, + 0.03166489, + 0.06015168, + -0.0018540767, + 0.043800958, + 0.014623904, + 0.038353812, + -0.021314984, + 0.010522611, + -0.024581844, + 0.031366486, + 0.012493078, + -0.0007007419, + 0.009890471, + 0.05789071, + -0.05520709, + -0.02783322, + 0.018479174, + 0.0009625551, + -0.024165243, + 0.01635198, + 0.04199145, + 0.053655755, + -0.04307552, + 0.025551995, + -0.018680023, + 0.020759536, + 0.059369273, + -0.006988708, + -0.026320163, + -0.0025934891, + 0.026870603, + -0.009730706, + 0.018218627, + 0.005037782, + -0.0132323345, + -0.039169345, + -0.033258922, + -0.002247369, + 0.09466787, + 0.0056981854, + -0.022665996, + 0.06024469, + -0.016116608, + -0.003789675, + -0.025225416, + 0.019347968, + 0.024802739, + -0.049069185, + -0.012823434, + 0.000846098, + 0.018634543, + -0.060731795, + -0.03504043, + 0.085316636, + 0.013361458, + -0.012425992, + 0.0057458133, + -0.014212679, + 0.042268865, + -0.029114101, + -0.0011103856, + -0.044912685, + -0.028397746, + 0.021935457, + -0.027663197, + -0.11580737, + -0.055029213, + 0.05578334, + 0.0071452004, + -0.014473731, + -0.06328084, + 0.0140667, + -0.024593478, + 0.0046616863, + -0.007522579, + 0.025511945, + -0.07863747, + -0.0085762385, + 0.05148283, + -0.039227873, + -0.0816022, + -0.018585978, + -0.03510035, + 0.02342686, + -0.0042144833, + 0.029105023, + 0.00817719, + 0.10530593, + 0.056663927, + 0.051986016, + 0.0027708863, + -0.027644029, + -0.026126249, + 0.04316672, + 0.008625363, + -0.026928555, + 0.09236891, + -0.10665132, + 0.0022109712, + -0.04672772, + -0.0010714191, + 0.017687786, + 0.025763303, + 0.02738723, + -0.019653322, + -0.06636015, + 0.038601268, + -0.026597418, + -0.032743942, + -0.007986222, + -0.0077568023, + -0.021615017, + 0.014973637, + 0.036659174, + -0.002434029, + 0.056992944, + -0.0802926, + -0.034491055, + 0.057339218, + -0.031598423, + 0.01815245, + -0.05142944, + 0.09277832, + -0.023692241, + -0.02133611, + -0.024636442, + -0.06723946, + 0.026400885, + 0.08087762, + 0.0036785558, + 0.02101903, + -0.029615631, + -0.038861174, + 0.04874963, + 0.02979751, + 0.0060734656, + 0.05423366, + -0.030063542, + -0.004280309, + 0.05995971, + -0.042565927, + 0.0030267043, + 0.1041919, + 0.03300429, + -0.0050015924, + -0.01911076, + -0.026665272, + 0.016458593, + -0.050006777, + 0.05080731, + -0.065816425, + 0.026471464, + -0.027813306, + -0.036025744, + 0.03723687, + 0.018098509, + -0.044298846, + 0.024373472, + -0.016016398, + 0.03582579, + -0.026484434, + -0.0038789911, + 0.10619606, + 0.0022864433, + -0.014563999, + 0.004348137, + -0.013476688, + -0.0331399, + -0.07461764, + 0.032642554, + -0.014079754, + -0.007546746, + -0.04735429, + 0.028523289, + -0.025188936, + 0.0059138797, + 0.023881987, + 0.05757653, + 0.0380678, + 0.0012175398, + -0.02047756, + 0.0718534, + -0.04708265, + 0.023029216, + -0.027009143, + 0.087099396, + 0.0017206921, + 0.025318645, + -0.03911548, + -0.038268212, + 0.04721421, + -0.09048235, + 0.0018269889, + 0.03689738, + -0.0500337, + -0.0806958, + 0.015961647, + -0.0117793055, + -0.043277707, + 0.011102296, + 0.024736766, + 0.07859274, + -0.0010727937, + 0.014366967, + -0.07669862, + -0.007824215, + -0.07287751, + -0.016301835, + -0.003434503, + 0.019447176, + -0.051193517, + 0.08773244, + 0.006728499, + 0.052058756, + -0.039105475, + 0.052423023, + 0.015097122, + 0.009336027, + 0.022993218, + 0.031443782, + -0.0622707, + 0.03517323, + -0.033169843, + 0.097570434, + 0.010101814, + -0.062746756, + -0.032313753, + 0.039362427, + 0.12776423, + 0.019260308, + -0.050483607, + 0.036213342, + 0.0028129816, + 0.058977667, + -0.024792053, + -0.005835713, + 0.016384302, + 0.013303189, + -0.04755607, + -0.012990615, + 0.032058302, + -0.015489647, + -0.04008588, + 0.011562045, + 0.013523483, + -0.008329744, + 0.067591324, + -0.09078176, + 0.050933324, + -0.0001931563, + -0.01570064, + 0.0077628815, + -0.021175632, + 0.08191918, + 0.0042020655, + -0.057577576, + -0.024850775, + -0.016462047, + -0.01608794, + -0.0095810965, + 0.03440579, + -0.016924929, + -0.051613178, + -0.038862303, + -0.002591376, + -0.01687491, + -0.038348936, + -0.016345026, + -0.03499395, + -0.023711955, + -0.038983267, + 0.02909387, + 0.052785136, + -0.03956735, + 0.048813544, + -0.07408873, + -0.047479205, + -0.037384547, + 3.6122277e-05, + -0.00323103, + 0.014085068, + 0.02166948, + -0.025022797, + 0.00548469, + -0.00043267754, + 0.013587588, + -0.075237095, + -0.046044935, + 0.0037340645, + 0.015775705, + 0.0044056266, + -0.033436574, + 0.07790523, + 0.017369641, + 0.03162654, + 0.06311004, + 0.00030665845, + 0.02039911, + 0.030216057, + -0.0022921541, + -0.02669933, + -0.04271925, + -0.021516768, + -0.04860288, + 0.0037491426, + 0.044397604, + 0.013711982, + -0.0019044406, + 0.041717444, + 0.07527258, + 0.004396075, + -0.05697599, + 0.062371805, + 0.0122556435, + 0.018541628, + 0.013916607, + -0.001407872, + -0.074479096, + -0.0074305376, + 0.06843066, + -0.027167812, + 0.0020887114, + -0.03339334, + -0.069467865, + 0.027772086, + -0.029680463, + 0.0023603945, + -0.034341622, + -0.007946808, + 0.014316168, + 0.040272575, + -0.029381637, + -0.012669895, + -0.040007718, + -0.007849514, + 0.0037267352, + 0.025559353, + 0.01908747, + 0.010199893, + 0.02811712, + -0.015757034, + 0.023825217, + -0.050415065, + -0.028737074, + 0.03919414, + -0.0024481888, + -0.022511285, + 0.027958939, + 0.046735343, + 0.077127144, + 0.022440491, + 0.035965107, + -0.01409118, + 0.022490244, + -0.007463417, + 0.05943725, + 0.0740578, + -0.020744171, + -0.019496184, + -0.052855786, + -0.00028804876, + -0.05126455, + 0.015544, + 0.053731557, + -0.014565541, + 0.04822947, + -0.024476951, + 0.036131904, + -0.008535516, + 0.029941507, + 0.027597597, + 0.05004942, + -0.0634054, + -0.00058592664, + 0.075618185, + -0.06424452, + 0.0551141, + 0.07195737, + 0.0059559983, + -0.06548788, + 0.021463854, + 0.013003529, + -0.012621075, + 0.022944402, + 0.08323847, + 0.07705397, + 0.012239931, + -0.042122364, + 0.037349377, + -0.0023981212, + -0.018399907, + 0.047214046, + 0.0003528697, + 0.013069748, + 0.009889366, + -0.015569374, + 0.097634934, + -0.051274985, + -0.0035838345, + -0.081493884, + -0.034804776, + -0.068767905, + 0.06497728, + -0.04292809, + 0.009441323, + -0.050664015, + -0.026311554, + 0.043648314, + 0.05953572, + 0.02149848, + -0.070732236, + 0.032498803, + -0.01525829, + 0.025482485, + -0.07821578, + -0.0031100207, + 0.013336255, + 0.012977619, + 0.10831072, + -0.012108079, + 0.05215784, + -0.0014752754, + 0.04672664, + -0.006357827, + 0.03887902, + 0.0110858865, + 0.03910481, + 0.044483896, + 0.027306804, + 0.0304683, + -0.035071675, + 0.049174044, + -0.005893214, + -0.03226845, + 0.012989943, + -0.024567459, + 0.012174184, + -0.029126454, + 0.027247919, + 0.080386184, + 0.03994174, + -0.06301434, + -0.07710563, + -0.02356785, + -0.015658041, + -0.040340938, + 0.02344931, + -0.005036427, + -0.03987439, + 0.052536115, + -0.042034335, + -0.052926026, + 0.024309393, + -0.011847247, + -0.011882506, + -0.07358051, + -0.012023142, + 0.019672018, + 0.09082111, + 0.073102705, + -0.04581442, + -0.042871106, + -0.0347567, + 0.051297594, + 0.028319057, + -0.019270716, + -0.022108674, + 0.034829013, + -0.05005505, + -0.07417835, + 0.045196395, + 0.0032714135, + -0.07566778, + 0.048085734, + -0.005009543, + -0.0011667939, + -0.040728357, + -0.020352578, + -0.0021036982, + -0.037561715, + 0.018334854, + -0.048219055, + -0.005598004, + 0.052623373, + -0.046602413, + 0.00022030994, + 0.059313178, + 0.09316803, + 0.035902113, + -0.03455553, + -0.06944326, + 0.014147145, + -0.060626503, + -0.036259595, + -0.020195402, + 0.043234885, + -0.007683996, + 0.043373056, + 0.022036567, + 0.0020106016, + -0.035812076, + 0.063685834, + -0.03424115, + 0.06406924, + -0.0073639182, + -0.015726037, + -0.036662076, + -0.011314391, + -0.061053474, + -0.02398348, + -0.05477042, + -0.02349147, + -0.06840239, + -0.04402523, + 0.022536961, + 0.025341304, + -0.09786782, + 0.0008502628, + -0.054442905, + -0.023104902, + -0.0454393, + 0.05547487, + 0.02941837, + 0.042048343, + -0.06071158, + -0.011033424, + 0.0029785563, + 0.01214972, + 0.014557061, + 0.016386319, + -0.043748617, + -0.021092765, + -0.004604394, + 0.075954765, + 0.027810903, + -0.019764582, + -0.015932038, + 0.013924321, + -0.014167113, + -0.04632259, + -0.028052354, + 0.021453502, + -0.02792163, + 0.07461302, + 0.10187651, + 0.010440466, + 0.08697039, + 0.05600476, + -0.055770714, + -0.062498394, + -0.058112442, + -0.044180583, + -0.05975845, + 0.056162726, + -0.010600922, + 0.077493295, + -0.025435269, + 0.0923372, + 0.043819454, + -0.016430752, + -0.0015095237, + -0.0341286, + -0.002565857, + 0.005184101, + -0.071053594, + -0.010112436, + -0.045120917, + -0.0348495, + -0.006502529, + 0.03641696, + -0.027302794, + -0.02890681, + -0.033199534, + -0.07256904, + -0.03758855, + 0.070195265, + -0.0038111259, + 0.011434567, + -0.044890616, + 0.023136368, + 0.09412049, + 0.0091492105, + -0.0066012493, + -0.019036641, + 0.059483536, + -0.018774608, + -0.052236408, + -0.026530499, + -0.040146265, + 0.0271693, + 0.01088683, + 0.117901385, + -0.011070082, + 0.023090107, + -0.11041944, + -0.0023761739, + 0.052857988, + -0.027439566, + -0.009057878, + -0.0021141092, + -0.031223183, + -0.032892667, + 0.10651295, + 0.018553382, + -0.018379116, + 0.014873018, + -0.040512417, + -0.09556882, + -0.03374361, + -0.07808277, + 0.05681848, + -0.046243265, + -0.07731494, + -0.032985333, + -0.02485327, + 0.017732931, + -0.020051923, + 0.019893952, + 0.06432696, + 0.08048177, + 0.0135258045, + 0.024358852, + 0.009759977, + -0.04197342, + 0.032504115, + 0.056780778, + -0.015715199, + -0.044023775, + 0.078800865, + 0.018545117, + 0.016267061, + 0.021082798, + -0.051552717, + 3.997702e-05, + -0.03628584, + -0.021589098, + 0.008213196, + 0.0047702063, + -0.023508605, + -0.044364233, + 0.067961864, + 0.041272104, + -0.014481658, + -0.010015822, + 0.0012155318, + -0.0011898371, + -0.08544548, + -0.015493928, + -0.0961194, + -0.03561227, + -0.047253173, + -0.08211245, + 0.018751975, + 0.018324235, + 0.014308755, + 0.0015786501, + 0.038473077, + -0.038047757, + 0.0052879406, + -0.017839737, + 0.05342696, + -0.0057547847, + 0.013748893, + 0.019040905, + -0.008233868, + -0.02624656, + 0.023323942, + 0.015264979, + 0.01448448, + -0.008367796, + 0.01959026, + -0.063270934, + 0.017139366, + 0.045523375, + -0.026564969, + 0.017915701, + -0.006382077, + 0.023788478, + 0.04140121, + 0.026335489, + -0.010871567, + 0.04780582, + -0.04176159, + 0.07836516, + -0.0018306614, + 0.025779009, + -0.009535478, + -0.10667496, + -0.01856794, + -0.025107326, + -0.035873048, + -0.05994878, + 0.0076866797, + -0.0008296443, + 0.018000983, + 0.039555117, + -0.051457543, + -0.014178609, + 0.03977316, + -0.04112076, + -0.0056524235, + -0.03817852, + -0.009010357, + -0.049929984, + 0.02815696, + 0.07178824, + -0.0891005, + 0.029434266, + -0.024762046, + -0.039339434, + 0.02766893, + -0.06167313, + 0.040054474, + 0.040781498, + -0.012865714, + 0.022845585, + -0.061530273, + 0.0055303588, + 0.0707426, + -0.039974045, + -0.021843985, + 0.03287734, + 0.0024584641, + 0.008380913, + 0.027124694, + -0.00067393284, + 0.024518743, + -0.04561021, + 0.0014067562, + -0.0015057714, + -0.0045690965, + -0.05774384, + 0.030880308, + 0.0383094, + -0.035241883, + -0.041534826, + 0.00013213791, + -0.05538147, + 0.07076548, + 0.028332852, + -0.020840552, + 0.0026513778, + -0.040424034, + 0.02619544, + -0.053306147, + 0.02648879, + 0.013661143, + 0.012982066, + 0.07114231 + ], + "index": 2, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/225b4d2263a7.json b/tests/integration/recordings/responses/225b4d2263a7.json new file mode 100644 index 000000000..66124cabd --- /dev/null +++ b/tests/integration/recordings/responses/225b4d2263a7.json @@ -0,0 +1,802 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": [ + "What is the capital of France?" + ] + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.01970832422375679, + 0.06973592191934586, + 0.06339020282030106, + -0.0476469062268734, + 0.02473558485507965, + 0.036016080528497696, + -0.030854633077979088, + -0.05661148950457573, + -0.03762897476553917, + -0.022825224325060844, + 0.07212689518928528, + -0.03594600036740303, + 0.028144309297204018, + -0.0572437047958374, + -0.01636800728738308, + 0.05597497895359993, + -0.0615837387740612, + -0.0772617980837822, + 0.07462957501411438, + -0.014081664383411407, + -0.046484049409627914, + 0.007972045801579952, + 0.05659373477101326, + 0.005015407223254442, + -0.021550362929701805, + 0.007466076873242855, + -0.01818244718015194, + 0.012974875047802925, + 0.12098025530576706, + 0.004642108455300331, + -0.03853101655840874, + -0.038064178079366684, + -0.00252514542080462, + -0.007285259198397398, + 0.0010585911804810166, + 0.0906301811337471, + 0.041732583194971085, + 0.0012193279108032584, + -0.022201454266905785, + 0.04487229138612747, + 0.05817768722772598, + 0.03595009818673134, + 0.003200811566784978, + -0.059940092265605927, + -0.03945835679769516, + -0.05063691735267639, + -0.0010590233141556382, + -0.013847910799086094, + -0.010883520357310772, + 0.05425434187054634, + 0.048579007387161255, + 0.05931898206472397, + 0.03469032421708107, + 0.040213894098997116, + 0.017600275576114655, + 0.030363716185092926, + 0.006166841834783554, + -0.031214607879519463, + -0.09986788034439087, + -0.08849328756332397, + -0.04174111783504486, + -0.06822851300239563, + 0.037840817123651505, + -0.011262879706919193, + 0.02725878357887268, + -0.03785941004753113, + 0.02948189154267311, + 0.052330728620290756, + -0.006199777591973543, + 0.015686513856053352, + 0.02012643963098526, + 0.03715239465236664, + 0.015146151185035706, + 0.0118742436170578, + 0.01236711349338293, + 0.08493024855852127, + 0.006574893835932016, + 0.012279890477657318, + 0.0497514046728611, + -0.03023892641067505, + 0.024616962298750877, + -0.002334396820515394, + -0.06940878927707672, + -0.09034860879182816, + -0.030876951292157173, + -0.05628745257854462, + 0.15566386282444, + 0.04915332421660423, + -0.05976790562272072, + -0.0651850774884224, + -0.01671917550265789, + 0.005158144049346447, + 0.03231115639209747, + -0.12673619389533997, + 0.01491079106926918, + -0.10013868659734726, + 0.0593881830573082, + 0.04409949108958244, + 0.02496299520134926, + -0.09309431165456772, + 0.016884522512555122, + 0.08458107709884644, + 0.001436055637896061, + -0.023505622521042824, + -0.1091550886631012, + 0.009409628808498383, + -0.06841670721769333, + 0.006294394377619028, + 0.011773636564612389, + -0.006649228744208813, + -0.025980884209275246, + 0.028650643303990364, + -0.004796619061380625, + -0.15275581181049347, + 0.07362587004899979, + 0.023234043270349503, + -0.07766558974981308, + 0.11400321125984192, + -0.0761248916387558, + 0.10137518495321274, + 0.04917748644948006, + -0.05897725000977516, + 0.028588805347681046, + -0.016921594738960266, + 0.020847199484705925, + 0.02583436481654644, + 0.0100707383826375, + -0.10680415481328964, + -0.039595309644937515, + -0.02198234759271145, + 0.04287746921181679, + 0.0770343467593193, + 0.12591315805912018, + 0.05319112911820412, + 0.06336589902639389, + -0.004751566331833601, + -0.027462828904390335, + 0.025833114981651306, + 0.031229868531227112, + 0.03495239466428757, + -0.03417152911424637, + 0.01695503294467926, + 0.008892396464943886, + -0.022700343281030655, + -0.010422530584037304, + -0.011403913609683514, + 0.06934408098459244, + -0.018299903720617294, + 0.05521678924560547, + 0.0448828861117363, + -0.035779181867837906, + 0.1004837155342102, + -0.052232082933187485, + -0.1069478765130043, + 0.010958191938698292, + -0.037957314401865005, + 0.012439441867172718, + -0.016643444076180458, + -0.003614538349211216, + 0.02663247659802437, + 0.011455153115093708, + -0.06175852194428444, + 0.024681027978658676, + 0.02250850759446621, + 0.05536889657378197, + 0.06054207682609558, + -0.0278964564204216, + -0.014830108731985092, + 0.0026953965425491333, + 0.01350411120802164, + 0.12171561270952225, + -0.08564072847366333, + -0.034310709685087204, + 0.08295650035142899, + 0.00242776982486248, + 0.04291205108165741, + 0.07752981036901474, + 0.059791646897792816, + -0.17697358131408691, + -0.05253177508711815, + -0.056304335594177246, + -0.08669780939817429, + 0.08720479905605316, + 0.09867717325687408, + 0.042815010994672775, + 0.056739237159490585, + -0.08280040323734283, + 0.022493114694952965, + -0.02084849216043949, + -0.02938813529908657, + -0.0007219210965558887, + 0.06848610937595367, + -0.04856500029563904, + -0.17225198447704315, + 0.05346125736832619, + 0.012011714279651642, + 0.0025602886453270912, + 0.0857025608420372, + 0.02747567743062973, + -0.049506328999996185, + 0.07006517052650452, + 0.04238149896264076, + -0.15906751155853271, + 0.03605888783931732, + 0.10328453034162521, + -0.07136455923318863, + 0.036719564348459244, + 0.08598599582910538, + 0.0641678124666214, + 0.016239356249570847, + -0.026155924424529076, + 0.05666787922382355, + 0.016006596386432648, + 0.011990846134722233, + -0.14744064211845398, + -0.026924695819616318, + 0.07851225882768631, + -0.015755966305732727, + -0.01938048005104065, + 0.01009741984307766, + 0.037861280143260956, + -0.018061142414808273, + -0.01375116128474474, + 0.06686730682849884, + -0.011987685225903988, + -0.09704967588186264, + 0.06962467730045319, + -0.041706811636686325, + -0.0633535385131836, + 0.040516119450330734, + 0.07941865921020508, + -0.05590837448835373, + 0.012286134995520115, + -0.0320778526365757, + 0.024782376363873482, + 0.023459354415535927, + 0.05950900912284851, + -0.06305302679538727, + -0.03517928719520569, + -0.0714961439371109, + -0.002884534653276205, + -0.040440525859594345, + 0.014511113986372948, + 0.0064672185108065605, + 0.04428369551897049, + -0.057187750935554504, + -0.020834827795624733, + 0.04081743583083153, + 0.014744394458830357, + -0.0902390256524086, + -0.020159481093287468, + 0.02022283524274826, + -0.023768901824951172, + 0.09302803874015808, + 0.0001490376889705658, + -0.03495747223496437, + 0.055485714226961136, + 0.08195064216852188, + -0.00781647115945816, + -0.041974276304244995, + -0.024822648614645004, + -0.03270355984568596, + 0.07572082430124283, + 0.07882461696863174, + -0.1703532338142395, + 0.007348283194005489, + 0.017360031604766846, + -0.04545089602470398, + 0.00336546846665442, + -0.03401961550116539, + -0.010519049130380154, + 0.0031063177157193422, + -0.05100075155496597, + -0.0038971842732280493, + 0.04990682750940323, + -0.005734169390052557, + -0.008000397123396397, + 0.011249272152781487, + 0.08259451389312744, + -0.009997809305787086, + -0.03317711129784584, + 0.08035999536514282, + -0.030665725469589233, + -0.013539387844502926, + 0.06129683554172516, + 0.005680982489138842, + -0.030879436060786247, + -0.015947014093399048, + -0.04250485822558403, + 0.036226458847522736, + 0.0077215759083628654, + -0.01335059106349945, + -0.017429955303668976, + 0.02677704021334648, + 0.05891023576259613, + -0.033094074577093124, + -0.009611436165869236, + 0.029392564669251442, + -0.019255351275205612, + 0.0028371994849294424, + -0.06841883808374405, + 0.09074953198432922, + -0.007491895463317633, + -0.05885957553982735, + -0.054593320935964584, + 0.03154400363564491, + -0.018664345145225525, + 0.0014028018340468407, + -0.007962699048221111, + -0.0073072719387710094, + 0.07813835889101028, + -0.009949258528649807, + -0.042123954743146896, + 0.0330609530210495, + -0.09078606963157654, + -0.0661826878786087, + -0.008728893473744392, + 0.0261079091578722, + 0.020198725163936615, + -0.001164281158708036, + 0.030456693843007088, + 0.013369766063988209, + 0.0473308339715004, + -0.1095656007528305, + -0.0035175648517906666, + 0.0019665348809212446, + 0.038703836500644684, + 0.004033247474581003, + -0.07139096409082413, + -0.025092288851737976, + 0.026497622951865196, + 0.010865016840398312, + -0.007291565183550119, + -0.008395146578550339, + 0.09979000687599182, + 0.014964831992983818, + 0.006895039696246386, + -0.05342651531100273, + 0.028149953112006187, + 0.02636386640369892, + -0.07864879816770554, + 0.07730228453874588, + -0.015716969966888428, + 0.09981396049261093, + 0.10495205223560333, + 0.1379401981830597, + 0.039402298629283905, + -0.06488822400569916, + 0.06241980195045471, + 0.01095480564981699, + -0.038665588945150375, + 0.13688994944095612, + -0.020979976281523705, + 0.006442971993237734, + -0.04762554541230202, + -0.050086282193660736, + -0.01811848394572735, + 0.03287108987569809, + -0.023971999064087868, + 0.07773148268461227, + -0.034932006150484085, + 0.07602691650390625, + -0.017853112891316414, + -0.005400413181632757, + -0.053703248500823975, + 0.06815090030431747, + -0.02043701708316803, + 0.04952498897910118, + 0.05423223227262497, + -0.01902719773352146, + -0.03968493640422821, + -0.06244910880923271, + -0.02818591706454754, + -0.0901985615491867, + 0.0008713805582374334, + 0.0062495567835867405, + -0.025452183559536934, + -0.031959064304828644, + 0.12171333283185959, + -0.06405504792928696, + -0.020061912015080452, + 0.0356234535574913, + -0.007606834638863802, + 0.005293095018714666, + 0.036428119987249374, + 0.06186530366539955, + -0.0005228556110523641, + 0.047188978642225266, + -0.05147498473525047, + -0.026932740584015846, + 0.03888168931007385, + -0.09699693322181702, + 0.023630235344171524, + 0.005371326580643654, + 0.015998994931578636, + 0.0003666430420707911, + 0.04907926544547081, + 0.008110874332487583, + 0.047511179000139236, + -0.06465531885623932, + -0.0073038008995354176, + -0.04283558949828148, + 0.04818195849657059, + 0.047115594148635864, + 0.005004839971661568, + 0.01839282736182213, + -0.11655856668949127, + -0.048311498016119, + -0.11851174384355545, + 0.027857793495059013, + -0.017113903537392616, + 0.09556174278259277, + 0.03273570165038109, + -0.07939599454402924, + -0.008300776593387127, + 0.012330071069300175, + -0.03996765613555908, + 0.06578177213668823, + -0.12040718644857407, + 0.017966903746128082, + 0.009441595524549484, + 0.019408095628023148, + 0.0386037640273571, + 0.020615454763174057, + 0.07171255350112915, + -0.02859123796224594, + 0.05328092724084854, + 0.02087463065981865, + -0.04982484132051468, + -0.03510921075940132, + 0.025723610073328018, + -0.021969307214021683, + -0.038896411657333374, + -0.0030326545238494873, + -0.011459474451839924, + -0.05368846282362938, + -0.01735803298652172, + -0.10430730879306793, + -0.0481608547270298, + 0.07020232826471329, + 0.09553399682044983, + -0.05687297135591507, + 0.09741470217704773, + 0.023591971024870872, + 0.08581022173166275, + -0.048408862203359604, + 0.013134839944541454, + 0.05038471519947052, + 0.04907285422086716, + 0.006127485539764166, + 0.03915533423423767, + -0.05594480037689209, + -0.08703725785017014, + -0.08769574016332626, + 0.010736892931163311, + 0.06320276111364365, + -0.007989616133272648, + 0.08732284605503082, + -0.02034064009785652, + 0.015313192270696163, + 0.03629201650619507, + 0.034474775195121765, + 0.06430205702781677, + 0.0020889199804514647, + -0.05312385782599449, + 0.01831977441906929, + -0.012571982108056545, + 0.020523348823189735, + 0.02271760255098343, + 0.0199508648365736, + 0.0419381819665432, + -0.01719197817146778, + 0.03996086120605469, + -0.05291396379470825, + 0.05518871545791626, + -0.04077994078397751, + -0.018808426335453987, + -0.00802540685981512, + -0.016489434987306595, + -0.05184184014797211, + 0.007551070302724838, + -0.03549691662192345, + 0.049017034471035004, + -0.061343707144260406, + 0.08948376029729843, + -0.010120436549186707, + -0.06860023736953735, + -0.003899200586602092, + -0.10330148786306381, + -0.08999688923358917, + 0.030074885115027428, + -0.039791032671928406, + 0.11411391198635101, + -0.03553398698568344, + 0.03152026981115341, + 0.011465642601251602, + 0.059032928198575974, + -0.0031185627449303865, + 0.03391928970813751, + 0.013379181735217571, + 0.016364645212888718, + 0.06576719135046005, + 0.09512922912836075, + 0.14299455285072327, + -0.009059438481926918, + -0.06343400478363037, + 0.041009820997714996, + 0.08385325968265533, + -0.11938642710447311, + 0.056769926100969315, + 0.012045303359627724, + -0.11157312244176865, + -0.017104897648096085, + -0.0487101674079895, + 0.1471950113773346, + 0.010011108592152596, + 0.13776572048664093, + -0.004685565363615751, + -0.012601284310221672, + 0.08867102116346359, + -0.08892746269702911, + -0.09875845909118652, + -0.06571769714355469, + 0.07505372911691666, + 0.011863797903060913, + 0.05538568273186684, + 0.01753435842692852, + -0.07213204354047775, + -0.05682818964123726, + 0.00998744834214449, + 0.02545950934290886, + 0.01886233128607273, + -0.039678677916526794, + 0.05204062908887863, + -0.06929492950439453, + -0.001108978409320116, + -0.02570975571870804, + -0.001650663441978395, + -0.01176548097282648, + 0.045692771673202515, + 0.056068118661642075, + 0.0661809891462326, + -0.02520962432026863, + -0.10593820363283157, + -0.10804887861013412, + -0.020683452486991882, + -0.005477438680827618, + 0.024770764634013176, + 0.07821083813905716, + 0.012553723528981209, + 0.007506367284804583, + 2.3520085960626602e-05, + -0.029135674238204956, + -0.076198510825634, + 0.08536317944526672, + -0.01657869853079319, + 0.04385578632354736, + -0.0772562026977539, + 0.005188582465052605, + 0.049979791045188904, + -0.06056411564350128, + -0.08391109853982925, + -0.06077081710100174, + -0.008781449869275093, + -0.011842862702906132, + -0.07997778803110123, + -0.01606394723057747, + 0.04154130443930626, + -0.05641850084066391, + -0.006831947714090347, + 0.06409531831741333, + 0.028369562700390816, + 0.052074600011110306, + 0.0348689928650856, + -0.0008872381877154112, + 0.006672622170299292, + 0.04850737750530243, + 0.005414317362010479, + -0.048521313816308975, + -0.026075325906276703, + 0.07934144884347916, + 0.005803801119327545, + -0.028049731627106667, + -0.03317294642329216, + -0.10424027591943741, + -0.05862601473927498, + -0.054002031683921814, + -0.03496117889881134, + -0.005786501336842775, + 0.01869465596973896, + -0.0716874748468399, + 0.03654158487915993, + 0.03871994838118553, + -0.0014013899490237236, + 0.00667097931727767, + 0.005493564996868372, + -0.0037677220534533262, + 0.028866715729236603, + 0.008601633831858635, + -0.011309036985039711, + 0.006561725400388241, + 0.003093352075666189, + -0.05333438143134117, + 0.11794350296258926, + 0.05515727028250694, + -0.045878659933805466, + -0.007742924615740776, + 0.05761441960930824, + 0.04962746798992157, + -0.05010354891419411, + -0.029717203229665756, + -0.030527284368872643, + 0.03150942549109459, + -0.02865293063223362, + 0.05704553425312042, + -0.04078275337815285, + 0.0030061027500778437, + -0.03728826716542244, + -0.0038562272675335407, + 0.046621695160865784, + -0.0399412102997303, + -0.06038284674286842, + -0.01777978055179119, + -0.05188119783997536, + 0.02835647016763687, + -0.029642196372151375, + -0.016305141150951385, + -0.031576007604599, + 0.017664453014731407, + -0.041909970343112946, + -0.012923586182296276, + -0.021099943667650223, + -0.017399169504642487, + 0.056286755949258804, + -0.05219496041536331, + -0.11236775666475296, + 0.00020210817456245422, + 0.034043293446302414, + 0.037877317517995834, + 0.07059024274349213, + 0.01576846092939377, + 0.00600209878757596, + 0.03498513251543045, + -0.07349121570587158, + 0.010249773971736431, + 0.0006832143990322948, + 0.007001726888120174, + -0.007545476779341698, + -0.0071549611166119576, + 0.013768760487437248, + -0.07035242766141891, + 0.0011084708385169506, + 0.04469631239771843, + 0.03711879998445511, + 0.09525424242019653, + 0.088236004114151, + -0.010062330402433872, + 0.04878973588347435, + 0.018639028072357178, + -0.07545189559459686, + 0.012827134691178799, + 0.011818451806902885, + -0.00043396090040914714, + 0.023057980462908745, + 0.018296075984835625, + 0.05173768103122711, + 0.04826314374804497, + -0.06903506070375443, + -0.013263779692351818, + 0.046295709908008575, + 0.0382310189306736, + 0.006243202835321426, + 0.03561382368206978, + 0.05397462099790573, + 0.011734798550605774, + 0.04356921464204788, + -0.12166430056095123, + -0.06433001905679703, + 0.023853130638599396, + -0.0015384622383862734, + -0.12167169153690338, + 0.014306800439953804, + 0.0328274741768837, + 0.043768156319856644, + -0.005291013978421688, + -0.08029299229383469, + -0.051037609577178955, + -0.01827603206038475, + 0.06053758040070534, + -0.059887759387493134, + -0.032715871930122375, + 0.05102593079209328, + -0.08917390555143356, + -0.03805398568511009, + 0.00810143630951643, + 0.021369729191064835, + -6.789527833461761e-05, + -0.04995651915669441, + 0.015594455413520336, + 0.0017202553572133183, + -0.036478441208601, + -0.023708082735538483, + -0.10896393656730652, + -0.006573833059519529, + -0.05991625040769577, + -0.0019618964288383722, + 0.11073953658342361, + -0.01818089187145233, + -0.03572739660739899, + 0.09510193765163422, + 0.023465821519494057, + -0.02191684953868389, + 0.08381339907646179, + 0.09135788679122925, + 0.027638541534543037, + -0.0589328408241272, + -0.06251821666955948, + 0.016308434307575226, + 0.0911746472120285, + -0.0646301731467247, + -0.09164340794086456, + 0.032364875078201294, + -0.06892918050289154, + -0.020094409584999084, + -0.040389593690633774, + 0.020000949501991272, + 0.08940748870372772, + 0.041878264397382736, + -0.011807584203779697, + 0.021119650453329086, + 0.04327758401632309, + 0.008469630964100361, + 0.032335314899683, + -0.02453739382326603, + -0.04345237836241722, + -0.04026284068822861, + -0.047669146209955215, + 0.03758959099650383, + 0.011994728818535805, + 0.01332483347505331, + -0.044041428714990616, + -0.0013196832733228803, + -0.060047995299100876, + 0.011327322572469711, + 0.08492118865251541, + 0.028005098924040794, + -0.009107382968068123, + 0.05239562690258026, + 0.03746683895587921, + 0.04791608080267906, + -0.013966036029160023, + -0.005161612294614315, + -0.11603696644306183, + 0.038569845259189606, + 0.005635268986225128, + -0.07037810236215591, + 0.030191345140337944, + -0.01739041693508625, + 0.07960490137338638, + -0.018345264717936516, + 0.006483801174908876, + 0.1404862403869629, + -0.02148035168647766, + -0.05914505571126938, + -0.010929574258625507, + -0.03669396787881851, + 0.04541589319705963, + 0.03889324888586998 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/2c55f483cea8.json b/tests/integration/recordings/responses/2c55f483cea8.json new file mode 100644 index 000000000..938f3e203 --- /dev/null +++ b/tests/integration/recordings/responses/2c55f483cea8.json @@ -0,0 +1,59 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "Quick test" + } + ], + "max_tokens": 5 + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "oCfwhT4-4Yz4kd-984c28c09bb58fab", + "choices": [ + { + "finish_reason": "length", + "index": 0, + "logprobs": null, + "message": { + "content": "Quick test, indeed.", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [] + }, + "seed": 7090417062976472000 + } + ], + "created": 1758820480, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 5, + "prompt_tokens": 37, + "total_tokens": 42, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + }, + "prompt": [] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/33b71fb85bfb.json b/tests/integration/recordings/responses/33b71fb85bfb.json new file mode 100644 index 000000000..763388a6d --- /dev/null +++ b/tests/integration/recordings/responses/33b71fb85bfb.json @@ -0,0 +1,730 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "What's the weather in Tokyo?" + } + ], + "response_format": { + "type": "text" + }, + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "{\"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 5018 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "{\"", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "type", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 1337 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "type", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "\":", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 794 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "\":", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 330 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " \"", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "function", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 1723 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "function", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "\",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 498 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "\",", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 330 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " \"", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "name", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 609 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "name", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "\":", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 794 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "\":", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 330 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " \"", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "get", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 456 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "get", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "_weather", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 70464 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "_weather", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "\",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 498 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "\",", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 330 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " \"", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "parameters", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 14105 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "parameters", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "\":", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 794 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "\":", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": " {\"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 5324 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " {\"", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "city", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 9103 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "city", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "\":", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 794 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "\":", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 330 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " \"", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "Tok", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 53954 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "Tok", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "yo", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 16417 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "yo", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "\"}}", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 32075 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "\"}}", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 128009 + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "text": "", + "seed": 4111464499205743000 + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 24, + "prompt_tokens": 42, + "total_tokens": 66, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/3d89a56a76b1.json b/tests/integration/recordings/responses/3d89a56a76b1.json new file mode 100644 index 000000000..ba6a107af --- /dev/null +++ b/tests/integration/recordings/responses/3d89a56a76b1.json @@ -0,0 +1,46 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": [ + "First text for base64", + "Second text for base64", + "Third text for base64" + ], + "encoding_format": "base64" + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": "yQeuvPCEDj0u7gY9wB3mvCSQGz3eFUU6mF/9PFIMm70RVBK8Z3oEvqZ8Dr3svHC86k2mPLtjF71BzfA8a7aLvaKPHrxf7hc6OLn1PDcXLz32+cS6bycRvJVFKD0AuB2421hcPBAyTzwlliw8RCzXvJ/8YT2b2qA639nXvKRBBz1Waqs89C9Nu39Llr1rHVk9m6WPPGlLUjwIMDU9XV/aPSA5gD2gUUg93GQ3vexhj7w+jww9ImXNPY7odLwMose8kBp6PSKxmz0vCgA6oICYPTOD8D3iZv08cpuhO0umtL1dtJe8Ccq8Pfk6SD1FxQG9IgjZPH9h7TqlJt28Fr9zvTbYOTxy4KE9/2PMvC+rxTx4Owk9mCmOPLmoEj20XPi9JJdQPQlGpzzTWMc7spOlPCMWM73prOA8EZsVvfyIYLpIzVy9HKjmPH+c5TyfTYG9p/7gvNaM173Q/LY9LbdhPOaFZ7xwjBm9R7pfPTtQVD3xiyq8FNK9PKEJTjyRpb29Ap9qvakJjT0oKEe9KoaGvQIcmL2uYDy9vyejPXchpzw3ZwA9tvuFPZG0Nj2ZPKY9lwCFPaNSBDzQsK685mh2PLF7rrtZyWK9NPs1vFiBdz1gIuK9/q5BujtyMLwEz8A8KTbIvElRbD0/6hG6GQu2vEG2qryaKmw9+gkHvQ6zDr2OXC69Uzf3vA9+mr25M8g8dP3hPIH9rTyQAcU9kEbVvRYl+js6Vfo8yzyFvSbiYz2WgUm93C2UPQb1Sb3tVbW8aPw6OwtGLb1/SQ+6yFoHPMQfJ72/tso7472/vBMvnzx2k4084JfUPMJ6AL1Z1Uw8+jgnPY3bTD0vfSQ9xmsrPMYGzLxFbaM9OQEJPL6JBj10gd88rrndvOtoYL01quO8LGabPPN62TrnshM9oksfvS6ICztErBM9ABdbPZ11o706sKs6wTDnO0ouEz3D37O8/worPQ8pxzzX87Q8lSH8vLPBwbztQPG8Y7B/vYQbxr3+gbW8Zw4qu0zLFr3Oh+y8/ukgPWS9YLz5JCA9hU2BvCILmT3dVJs9bOVDPd1Dhbxui5o9SfDdvBpOMj0Po+S5vCAsPVg6Jj1+VDs970HOO4V7pLzCcVk9S8+YvabZurxDT8c7tucovDvXhL2VMRU9xmo7vT5+Db3FvBk9HXF/PK8WED5iFho9HZ25PfRhdL1qerS9uEgZvYDetr1P1Ji7MRCyvPjbQ70+sJk9ebjJOyTWwz38UTw8WGIWPeWFbj3Hs567I2chPXuXqDuv6x69lYLlPBiMm7ywH1i85n8qvRQIGbx+uum8cvpdvEuTmT3Wz+08LGgGvkRp7DwAS4g8/F2RPQQgazybB808k0q1PRc8QTxst4E7JOyYvcOBVL3H4oU8n3t/vDSCmbxsysM84qnxvM/j8DwJvc29YOgmPX4hq73H8aY8idWovMoK4buEwyo9ZIWsvBy+/rzgzLc8s5QPvKgSd716BQu9R453PTX5Pr2mhKm8wNCAvPFr5DpgaSS9oje7vcNBRz2SxTq8S21BvP+oPTtEEjw96KYAPT5GrTyUCzk8DWY2vZwvDL2D0TG9S9JPva0CO70DDxE9vyHjObfugrz4HEq9EzSKvICDz7xXfla9iTtrvUiAajw5CPU8b9/rO9NLZ70Wr2A9NdNBvT47yDrYg6w98HBkvQbIBL1YXcM7W3YzPVysgDyGxJ299nTJO8KAlLycoIy6HEe+PMGWpDvwBQg9lXfBu5SmMz2VZrU8luD3vDsZwjvpIRY9KfUJPZfnHb3swFw98dgEvbL9azxNEJc8xZ84vcG/EL2fjfQ8dLgAvicOOz38fo46JkdBPNQFLLxvptO7VbqePKxyJL3QRve8vl4yOv1WxbyMHFS9NHgcPZUOPD3MxYE8mvKrOsJ0Xj0ZXii92nw0veABtr3nbz29zdaYPDGuT7wCNBa8PRs+PQQr87yyZgs9dg9Svc/5+jm2oSW8sauGPAOgMb19TiA8JptxvGi9uLyBrgi9hJVYvHRAUjyy0F+9ibaxPOW2MrxPN4a8LaqXu55d3bxIoss8deDPOqmpcjwPzm0889BJPUgkOLxOskQ8cxIrPX5iir18Obw9ZQbxPGhhj73JSuC8cse2PN3y3jvpMgq93ttyPOOOjz2uWE88Fx5jvJCWDb4ll4k9TFggPGspSr1kfuW7sbqsO4sIgDtnnn29bSmsvSJpdD3y6Ay9HJKYu/c6cr1LvZY9c65VvU/3VTyGByW9cVFkvA8ZDrxnrTi9I5c+PLNDSz3s6QG8EVaCvIUb6D2MAMu9Vt+GuwQdQL0zVDQ8v+JpPMxacLq3GV09GoKDOzfoVzy+ydg8sZ1CPclBbT14Hxu9sQCrPZzuTz21LBE9Yrf1PJ5OAT0f2xS7NSoivQO9mLrwNCe8251hve1Ngzp15U+8cM3TPExIoTxDqvM937aZvLGlwb2/4Pe5aJSGvMMrXz3XVb+8d6SAPb36UjoxjSw8E+6aPcNul71mOf+75kDmPMYCPjwwAGa9QtNlvbF3nztfnmG9bnvzPYeqXzzQ1RG79pkNvfgIoL2ut3896T6BPMqacD2sJMq8GMe1PVtRxLyj9ki87fo0Pc2XiL2oZ3W9l6eIPfDp/byXh628/nzCvNQvjDwyn1C7HppePCJhhjwMlg29y9WdvdLvjz1UjJW7t4dxPZUKCj1aGLA9qjLovACMBLn6bKe89ounPGZGl726Gry8XcEcvJ+Xaj1wlRE8etdJPbuSEr37MMu8cJEHvQWpgD0nIRu9YIqUPGuaab3o8xa9YWFnvHP/FDywLl69cYwCPKozVr3+cB489iEivMxakjyh7mU96nhgvLZmwL1EPIa9QyHlO4oSubz4NMa8CXNnPQHhbLwek8M8wGQCuWfkujuIYEo81OuqvGIxlD3oA5Y8gjIaPMgMXL2yHdO80x2Tu/mKWj1uGM68UnSBuy9BlD3rP1q7L4KivK8Ig7yNPla65+pfvRPyCj2JiZs9igcZvBN9jD1mhB49OPGnvAr7kL2k/R47WakSPXVdID2M4kK9632evKe2uD1tasO8x23FPSvv0jz6HEq9wUebvN2KJj3xb3+7xNjzvE5Cv72s1YE82niJvdR8PL37qlY8hb+CPJ1qOTz9cci9SwjLvEcsdb2htpa8fAVEPU0I6Dx4+7O8o+zPvZsfFj1cut89Vf0dPZRmmjyiaZu8tG6qvAQD/rzm6f+8nVp9vb9dF7rAuls93VEPPeB6ejwpfa694vSuvChl6b0v4wS9/wMFPTB5vb0uZt683PyOukKzBD0404c88ylFPek8qLy9yNi71nY+PRiITr2LVg6+yOjtPDassr0Iels9qb6evY3Ar71P+wy9Ua0qvIguYT0/XRW6OGqTvOTqDz2wWDE+Fg/fOzS6pzwBbbS6Yu6OvVUapztAKTM9lb9MPJLCSL0Pjok90H68u5TQ1bpRWxw8khb/vQg4Db3yYG0913oEvaX9DLyQGh+8BaTFvGz0gb0ALFk5q7wBvB27SDw6XpW9Pr/Au3GncDynTE+92DyRvDWO273p6Mg827QLvfyg9Lwy0zc8fhX7PG5Mjj0ddMY8jnorPdIKxrv5aiS9L/davUhQrT0ZT7O8wiDiPHtNfr03zS48dR8iPJdUJD2T/DG7T5AHPUiZgDzK5KM6r36JvQJ3jDzSzC49QzDNvcuFsjxbIFq9HxIkPT5OcT3wmXo9zKnIPJqjtLv1tGu9mhQuPbm+5bxWjG096VBSPVgKmL1PiVe9uVA3PbY9TL1wi8e8hO6RPJh2TD2nj369x9PqPLeWOL2lXtw8RVBQPZwWir1Mx5U7bxAROndbOzwHeMg8bWoPPZvCCTw6gbq90lxrvYc9oDyeHZS9iR84PQqRmb3lcMA8QHAFPMuJCr0+KEM6Q/VTvb4okL1V1EI9ZL44PfV8y7q/P9o8N8PTPBzpKz1pwFA9h6gVvdN2LbxlifG8qnJNPadOJz31d+08MxYsvfeOmz1lsa28iZ0MvUoNszyMa7k8PBltuz//kD2+X587dZZWPbf+BL09aek7DPs4vccrdL0175A9FEXGPe/c37yD/IE9", + "index": 0, + "object": "embedding" + }, + { + "embedding": "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", + "index": 1, + "object": "embedding" + }, + { + "embedding": "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", + "index": 2, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/41ace09e5dba.json b/tests/integration/recordings/responses/41ace09e5dba.json new file mode 100644 index 000000000..d1831b521 --- /dev/null +++ b/tests/integration/recordings/responses/41ace09e5dba.json @@ -0,0 +1,59 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "Test trace openai 2" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "oCfxBri-4Yz4kd-984c2b177fb74ce3", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "This conversation has just begun. What would you like to talk about? I can summarize our conversation at the end, if you like.", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [] + }, + "seed": 7149743687991911000 + } + ], + "created": 1758820576, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 28, + "prompt_tokens": 41, + "total_tokens": 69, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + }, + "prompt": [] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/52b4e16b7289.json b/tests/integration/recordings/responses/52b4e16b7289.json new file mode 100644 index 000000000..ff868952f --- /dev/null +++ b/tests/integration/recordings/responses/52b4e16b7289.json @@ -0,0 +1,181 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "What's the weather in Tokyo? YOU MUST USE THE get_weather function to get the weather." + } + ], + "response_format": { + "type": "text" + }, + "stream": true, + "tools": [ + { + "type": "function", + "function": { + "type": "function", + "name": "get_weather", + "description": "Get the weather in a given city", + "parameters": { + "type": "object", + "properties": { + "city": { + "type": "string", + "description": "The city to get the weather for" + } + } + }, + "strict": null + } + } + ] + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfzfVP-4Yz4kd-984c36e368b59059", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758821066, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfzfVP-4Yz4kd-984c36e368b59059", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": [ + { + "index": 0, + "id": "call_025hjpfgbv2kf9adhboe6hd4", + "function": { + "arguments": "", + "name": "get_weather" + }, + "type": "function" + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758821066, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfzfVP-4Yz4kd-984c36e368b59059", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": [ + { + "index": 0, + "id": null, + "function": { + "arguments": "{\"city\":\"Tokyo\"}", + "name": null + }, + "type": null + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758821066, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfzfVP-4Yz4kd-984c36e368b59059", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 128009 + }, + "finish_reason": "tool_calls", + "index": 0, + "logprobs": null, + "text": "", + "seed": 3184440617167083500 + } + ], + "created": 1758821059, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 24, + "prompt_tokens": 201, + "total_tokens": 225, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/53365c6ae29c.json b/tests/integration/recordings/responses/53365c6ae29c.json new file mode 100644 index 000000000..7895ae60d --- /dev/null +++ b/tests/integration/recordings/responses/53365c6ae29c.json @@ -0,0 +1,59 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "Test OpenAI telemetry creation" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "oCfxQwj-4Yz4kd-984c2bd8ba58901d", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "To test OpenAI telemetry creation, let's break down the process into steps that can help ensure telemetry data is correctly created and utilized. Telemetry in the context of AI, such as OpenAI, typically refers to the automated process of collecting, transmitting, and analyzing data from remote sources, in this case, user interactions with AI models. Here\u2019s how you might approach testing telemetry creation:\n\n### 1. **Define Telemetry Requirements**\n- **Identify Data Points:** Determine what data points are crucial for your analysis. This could include user input, model responses, interaction timestamps, user IDs, etc.\n- **Purpose of Telemetry:** Understand why you are collecting this data. Is it for model improvement, user experience enhancement, or security monitoring?\n\n### 2. **Implement Data Collection**\n- **API Integration:** If you're using OpenAI's API, ensure you have the necessary permissions and access to collect the required data. OpenAI provides APIs for interacting with their models, and you can collect telemetry data through these interactions.\n- **Logging Mechanisms:** Implement logging mechanisms in your application to capture relevant data. This could involve server-side logging for API calls or client-side logging for user interactions.\n\n### 3. **Data Transmission**\n- **Secure Data Transfer:** Ensure that the data collected is transmitted securely to your analytics or storage system. HTTPS is a standard for secure data transmission over the internet.\n- **Data Format:** Decide on a data format for transmission. JSON is commonly used due to its readability and ease of parsing.\n\n### 4. **Data Analysis**\n- **Analytics Tools:** Utilize appropriate analytics tools or platforms to process and analyze the collected data. This could range from simple statistical analysis to complex machine learning models.\n- **Visualization:** Use data visualization techniques to represent the insights gained from the telemetry data. This helps in understanding trends, patterns, and areas for improvement.\n\n### 5. **Testing the Telemetry System**\n- **Mock Data:** Test your telemetry system with mock data to ensure it can collect, transmit, and analyze data correctly without affecting real users.\n- **Real-World Testing:** Once the system seems to work with mock data, gradually introduce it to real-world scenarios, starting with a small user base to identify and fix any issues that arise.\n- **Feedback Loop:** Implement a feedback loop to continuously monitor the telemetry system's performance and the insights it provides, making adjustments as necessary.\n\n### Example of Testing with Mock Data\nIf you're testing an OpenAI model's interaction telemetry, you might simulate user queries and model responses, then verify that this data is correctly logged, transmitted, and analyzed. For instance, in Python, you might use a mock library to simulate API calls and then assert that the expected data is collected and processed.\n\n```python\nimport unittest\nfrom unittest.mock import Mock\nimport json\n\nclass TestTelemetry(unittest.TestCase):\n\n def test_telemetry_data_collection(self):\n # Mock user interaction\n user_input = \"Hello, how are you?\"\n model_response = \"I'm doing well, thanks.\"\n\n # Mock the API call\n api_call_mock = Mock(return_value=model_response)\n\n # Simulate the interaction\n response = api_call_mock(user_input)\n\n # Verify telemetry data is collected correctly\n expected_data = {\n 'user_input': user_input,\n 'model_response': model_response,\n # Other relevant data points\n }\n\n # Assuming `collect_telemetry_data` is your function to collect telemetry\n collected_data = collect_telemetry_data(user_input, response)\n\n self.assertEqual(collected_data, expected_data)\n\nif __name__ == '__main__':\n unittest.main()\n```\n\nThis example simplifies the process and focuses on the concept. Actual implementation details may vary based on your specific requirements, the technologies you're using, and the OpenAI APIs or models you're interacting with.", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [] + }, + "seed": 3434953141173799400 + } + ], + "created": 1758820620, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 791, + "prompt_tokens": 40, + "total_tokens": 831, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + }, + "prompt": [] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/546dc9533c84.json b/tests/integration/recordings/responses/546dc9533c84.json new file mode 100644 index 000000000..720839e84 --- /dev/null +++ b/tests/integration/recordings/responses/546dc9533c84.json @@ -0,0 +1,801 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": "This is the first text", + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.039021637, + 0.022414008, + 0.060316082, + 0.010932758, + 0.018470073, + -0.038455445, + 0.013484707, + -0.038724504, + -0.025575833, + -0.07131675, + 0.03463345, + -0.025232196, + 0.020823235, + 0.03832292, + -0.006293115, + -0.088807434, + 0.0063370736, + -0.002888027, + 0.02621656, + 0.055453233, + 0.102450415, + 0.03387425, + -0.005548249, + 0.06926162, + 0.036552645, + -0.027929714, + 0.05147974, + -0.084861636, + -0.05467612, + 0.0061274734, + 0.01355064, + -0.027067322, + 0.099598646, + -0.05280082, + -0.03848137, + -0.0138273295, + 0.00055626774, + -0.062084854, + -0.026424624, + -0.004740091, + 0.06750933, + -0.05090067, + 0.06227124, + -0.01807564, + 0.0048294156, + 0.013328212, + 0.004276883, + -0.034934912, + -0.036818415, + 0.0185289, + 0.0048565175, + 0.016870664, + -0.040981345, + -0.035420854, + -0.091292314, + -0.08983982, + -0.048739515, + 0.12078825, + 0.04027495, + 0.088196404, + 0.082896, + -0.08266004, + -0.00082181377, + -0.050194185, + 0.024180485, + -0.027468672, + -0.08769602, + 0.047489725, + -0.03834715, + 0.07631481, + -0.06501303, + -0.03695376, + 0.067694835, + 0.027814003, + -0.051688053, + -0.032236356, + 0.039202936, + 0.03445711, + 0.009532945, + -0.034482885, + -0.08042295, + 0.008322418, + 0.05848545, + -0.064453684, + -0.17329726, + -0.047616575, + 0.045936666, + 0.023837132, + -0.015925486, + -0.0857517, + -0.0001586331, + -0.044116773, + -0.029393503, + 0.009738323, + 0.03763726, + -0.11253048, + 0.019114532, + 0.07549436, + -0.1030746, + -0.038988255, + 0.011407976, + -0.037570667, + 0.05159809, + 0.007962588, + 0.01113923, + 0.003076782, + 0.15470116, + 0.0043370854, + 0.030429134, + -0.027383734, + -0.030138142, + -0.079299994, + 0.12148583, + 0.034556936, + -0.0064313645, + 0.048751578, + -0.05864567, + 0.026685659, + -0.09871483, + -0.046130598, + 0.019625148, + -0.072314, + 0.03352563, + 0.01364348, + -0.085728094, + 0.06642468, + -0.094013095, + -0.037293892, + 0.0076811705, + 0.0052874135, + 0.018115167, + -0.055315576, + -0.052764144, + -0.034311842, + 0.015955461, + -0.07966574, + -0.028749859, + 0.03149985, + -0.047564246, + 0.008608991, + -0.021272784, + 0.030198015, + -0.0107804965, + 0.017173572, + -0.011607755, + -0.050619457, + 0.030204969, + 0.10163846, + -0.0056075957, + 0.06950345, + 0.04063133, + -0.03608383, + 0.023170248, + -0.014745303, + -0.014478895, + 0.10499135, + -0.038678814, + -0.0075368164, + 0.08199838, + -0.09530577, + 0.020091686, + 0.10653022, + 0.08388272, + -0.0045513124, + -0.04053859, + -0.0025074913, + 0.017358577, + -0.03037232, + 0.04310344, + -0.04824635, + 0.055064622, + -0.019335788, + -0.0674805, + 0.024816237, + 0.019295547, + 0.0007229409, + 0.04357454, + 0.021688526, + 0.08630486, + -0.011211191, + -0.039039955, + 0.17257652, + -0.007145191, + 0.006575071, + -0.0139306225, + -0.014735097, + -0.044341516, + -0.11539079, + 0.033123154, + -0.011538915, + -0.024190484, + -0.018813878, + 0.03229297, + -0.04379363, + 0.03185381, + -0.035783295, + 0.06494934, + 0.05133508, + 0.00010083616, + 0.007334995, + 0.06611978, + -0.062722, + 0.045553267, + -0.011721417, + 0.020822436, + -0.04873414, + 0.03926427, + 0.007051802, + -0.05594363, + 0.03565722, + -0.12122127, + 0.027855415, + -0.016186016, + -0.041470908, + -0.08864265, + -0.0036498592, + 0.010997135, + -0.012785444, + -0.06519897, + 0.027590077, + 0.067321666, + -0.05896251, + 0.008983399, + -0.095143765, + 0.011621533, + -0.06121848, + 0.050336383, + 0.0019902636, + 0.053377967, + -0.045287643, + 0.09474427, + -0.053598337, + 0.08048404, + -0.08297755, + 0.08607313, + 0.004596277, + 0.0204861, + 0.0132703995, + 0.0492952, + 0.003006371, + 0.024936337, + -0.021873668, + 0.11727927, + -0.043151148, + -0.0846394, + -0.048050277, + 0.0012273242, + 0.16534594, + 0.07620599, + 0.0144042745, + 0.09004986, + 0.06599925, + 0.050307803, + -0.014542778, + -0.06923349, + 0.08603958, + -0.003079753, + -0.08008583, + -0.04276064, + 0.07779741, + -0.04970902, + 0.024014566, + 0.026120175, + -0.007566401, + -0.06362058, + 0.0075124875, + -0.025173014, + 0.06797637, + 0.064056545, + -0.12027379, + -0.030917957, + 0.009303285, + 0.1108725, + 0.048372857, + -0.025575588, + -0.0063446634, + 0.011040862, + -0.03459656, + -0.0144168, + 0.048665646, + -0.009920939, + -0.0061537125, + -0.10304914, + 0.014452626, + 0.016036827, + 0.012599703, + 0.016684191, + -0.039659906, + 0.010836161, + -0.029463075, + 0.0011919601, + 0.06632273, + -0.05316992, + 0.039452244, + -0.021640282, + -0.05948179, + -0.015061293, + -0.015513855, + 0.04358236, + -0.0029279767, + 0.0860453, + -0.012484551, + -0.013506936, + 0.016622225, + 0.03162366, + -0.09996153, + -0.05663382, + -0.015155038, + 0.00578972, + 0.025347538, + -0.06958232, + 0.10877864, + -0.036945637, + 0.03478135, + 0.13662694, + -0.020611005, + 0.07592442, + 0.0036063113, + -0.09048903, + 0.016554832, + -0.04288513, + -0.027900286, + -0.07563455, + 0.030791664, + -0.033230122, + 0.018658046, + -0.043807156, + 0.029736735, + 0.10202865, + 0.009116146, + -0.09378922, + 0.099590845, + 0.0642359, + 0.0589953, + 0.05296719, + -0.07642986, + -0.11738337, + -0.05376279, + 0.09199399, + -0.0627918, + 0.03704901, + -0.037008967, + -0.05638905, + 0.009441371, + 0.04416073, + -0.03527975, + -0.03531018, + 0.07021692, + 0.05659684, + 0.099865966, + 0.076215744, + 0.043112382, + 0.007842607, + -0.039226923, + 0.006264895, + -0.03105526, + 0.060152344, + 0.040446483, + 0.10218391, + -0.07178106, + 0.015407178, + -0.06229486, + 0.0043686125, + 0.09733845, + -0.09527866, + 0.041407365, + 0.06550996, + 0.08803008, + 0.09149921, + 0.04229226, + 0.052133556, + 0.047242433, + 0.014378367, + 0.03682277, + 0.06764445, + 0.066040926, + 0.021740213, + 0.04180941, + -0.00519632, + -0.0111550195, + 0.017352529, + -0.00943155, + 0.11390086, + 0.05582122, + 0.035394136, + 0.0024461604, + 0.04081662, + -0.0007266066, + 0.06292638, + 0.0052844593, + 0.05790997, + -0.09407522, + -0.05039574, + 0.07852171, + -0.08000922, + 0.13302545, + 0.10419625, + 0.039512042, + -0.09167407, + 0.010040825, + 0.013924355, + 0.027515184, + 0.079743214, + 0.09399837, + 0.0151610905, + 0.004694856, + -0.0536953, + 0.06531984, + 0.027906924, + -0.0012715638, + 0.09168681, + -0.00026439782, + -0.0041136686, + 0.033571295, + -0.01907176, + 0.11883433, + -0.0065728375, + -0.0062215794, + -0.1049895, + -0.03321981, + -0.026450735, + 0.072518945, + -0.11240429, + -0.022515744, + -0.048495665, + -0.037087325, + 0.00032197312, + 0.051534563, + 0.046150282, + -0.08213623, + 0.09886837, + 0.041117694, + 0.05323094, + -0.05427183, + -0.022201112, + -0.024121372, + 0.012735752, + 0.1397762, + -0.007587272, + 0.05582085, + 0.06499377, + -0.018458825, + -0.021883465, + 0.032667745, + 0.02018645, + 0.040008776, + 0.07482824, + -0.024819402, + 0.045242358, + -0.06036402, + 0.025522556, + -0.025958247, + 0.018367121, + 0.029390294, + -0.031080022, + -0.010285386, + -0.007700369, + 0.045184247, + 0.044544965, + 0.029447366, + 0.014604208, + -0.09001254, + -0.09150779, + 0.048845917, + -0.005016622, + -0.030419605, + -0.021073101, + -0.028362123, + 0.04180255, + 0.011223455, + 0.026317155, + 0.07052029, + 0.04195792, + -0.010761702, + -0.054835323, + 0.047067013, + 0.04737349, + 0.09244638, + 0.096748084, + -0.03332587, + -0.009952178, + -0.0030183739, + 0.07009167, + 0.05392541, + 0.024944762, + 0.0061005787, + 0.028459419, + -0.05767917, + -0.051464006, + 0.08488547, + -0.016385203, + -0.04579279, + -0.084523976, + -0.032011546, + -0.007594041, + -0.06051386, + -0.046265714, + -0.027389096, + -0.044890895, + -0.0022862924, + -0.1268961, + -0.037864592, + 0.024412185, + -0.07392371, + -0.014362709, + 0.07425692, + 0.022583768, + 0.011156761, + -0.057216533, + -0.039548866, + -0.018076254, + -0.05556914, + -0.057198036, + -0.03188685, + 0.090208404, + 0.10571588, + 0.01070536, + 0.08128956, + 0.017667988, + -0.10340015, + 0.07804198, + -0.019781966, + 0.06535109, + -0.07777538, + -0.025819557, + -0.08128869, + -0.034394037, + 0.019422948, + -0.039221227, + -0.08033355, + -0.02329798, + -0.0962552, + -0.016624983, + 0.038193095, + -0.06870783, + -0.033954047, + -0.0025311739, + -0.114151455, + -0.00511124, + -0.06920173, + 0.044555113, + 0.10051683, + 0.04055453, + -0.06167893, + -0.01584111, + 0.0030792183, + 4.6655536e-05, + -0.026384909, + -0.012856535, + -0.06174471, + 0.0024448705, + -0.022707395, + 0.066114195, + -0.010608763, + -0.01576041, + -0.0010933182, + 0.03396316, + 0.008329627, + -0.060327142, + -0.05505636, + -0.028406821, + -0.025708841, + 0.016102789, + 0.03405433, + 0.007868113, + 0.13327968, + 0.072789304, + -0.08000951, + -0.050192088, + -0.05803803, + -0.050078847, + -0.01996999, + 0.043255676, + -0.04441973, + 0.08783117, + 0.002935635, + 0.040976398, + -0.01976899, + 0.018852778, + -0.03215457, + -0.04958742, + 0.015443288, + 0.010633601, + -0.074571095, + 0.053966194, + -0.01581196, + -0.04183213, + -0.04719714, + 0.033312585, + 0.011825424, + -0.029853545, + -0.050666492, + -0.08864941, + -0.022672195, + 0.0724055, + 0.0037794008, + 0.055587664, + -0.13644798, + 0.022921626, + 0.1152114, + 0.07047247, + 0.030930748, + -0.0052061337, + 0.044788003, + -0.08634308, + -0.10505402, + -0.025340958, + -0.08207144, + 0.059532717, + -0.0062416205, + 0.1022889, + 0.010608143, + 0.041661825, + -0.097806565, + 0.0038305484, + 0.05404457, + 0.032105837, + 0.06415997, + -0.049071103, + -0.03720757, + -0.023321476, + 0.12579422, + 0.043440778, + -0.011532883, + -0.05620173, + 0.005197981, + -0.12449035, + 0.008241525, + -0.10594952, + 0.102292866, + -0.0699, + -0.11592147, + 0.06966665, + -0.027437769, + -0.014774349, + 0.018875254, + -0.017957961, + 0.091627896, + 0.04989476, + 0.0798358, + 0.04239699, + -0.007844917, + -0.06630319, + 0.052326147, + 0.02648383, + 0.044119354, + -0.06851671, + 0.15443392, + -0.020682698, + -0.03766801, + 0.0155308945, + -0.063717306, + 0.0006521008, + -0.05569479, + -0.043325484, + -0.014842672, + -0.025855135, + 0.017403143, + -0.011325402, + 0.054577086, + 0.02011184, + -0.09925977, + -0.0069759586, + -0.03428202, + 0.0034359726, + -0.15824135, + 0.000930797, + -0.113140985, + -0.044972613, + -0.02884488, + -0.06731342, + 0.04106218, + 0.028871017, + -0.011909599, + 0.03274342, + 0.018106263, + -0.020201381, + 0.1281747, + 0.020703837, + 0.024401633, + 0.042717557, + 0.014739593, + 0.07050051, + 0.038078446, + -0.022462513, + -0.004700358, + -0.014908828, + 0.037429586, + 0.021075286, + -0.047952563, + -0.010115325, + 0.011719644, + 0.052587837, + -0.026325963, + 0.06416419, + 0.04302814, + -0.032076415, + 0.03226265, + 0.047885012, + -0.08571586, + 0.13789223, + -0.039638847, + 0.08949073, + 0.0019859069, + 0.054476757, + -0.04336167, + -0.12529649, + 0.013598417, + -0.046129137, + 0.0031463325, + -0.10019061, + 0.02212261, + -0.024540763, + -0.020073807, + -0.015366339, + -0.04205672, + -0.004573892, + 0.04018059, + -0.06835582, + 0.0762453, + -0.07784769, + -0.03393797, + -0.084803775, + 0.028064115, + 0.06559264, + -0.10455632, + 0.039434727, + -0.038992915, + -0.09218861, + 0.013562555, + -0.06523423, + 0.10188195, + 0.05163541, + 0.02234651, + 0.01926983, + 0.0017454309, + 0.030410308, + 0.025801515, + -0.0333776, + 0.0030322578, + 0.055338234, + -0.017410548, + 0.07205084, + 0.04127999, + 0.0026357244, + 0.00054674776, + -0.018812224, + 0.051227525, + 2.2485852e-05, + -0.04581609, + -0.106634825, + 0.018237107, + 0.048612136, + -0.018699843, + -0.035245672, + -0.0367398, + -0.09525288, + 0.05530859, + 0.023024498, + -0.05791263, + -0.011325011, + -0.055147734, + 0.02724777, + -0.10974393, + 0.015870394, + 0.053438365, + 0.032307543, + 0.055390432 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/5c0552be2793.json b/tests/integration/recordings/responses/5c0552be2793.json new file mode 100644 index 000000000..6372e930c --- /dev/null +++ b/tests/integration/recordings/responses/5c0552be2793.json @@ -0,0 +1,3127 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": [ + "Python is a high-level programming language that emphasizes code readability and allows programmers to express concepts in fewer lines of code than would be possible in languages such as C++ or Java.", + "Machine learning is a subset of artificial intelligence that enables systems to automatically learn and improve from experience without being explicitly programmed, using statistical techniques to give computer systems the ability to progressively improve performance on a specific task.", + "Data structures are fundamental to computer science because they provide organized ways to store and access data efficiently, enable faster processing of data through optimized algorithms, and form the building blocks for more complex software systems.", + "Neural networks are inspired by biological neural networks found in animal brains, using interconnected nodes called artificial neurons to process information through weighted connections that can be trained to recognize patterns and solve complex problems through iterative learning." + ] + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.03554640710353851, + -0.007096407935023308, + 0.03447485715150833, + -0.017988182604312897, + 0.04746536165475845, + 0.002823449671268463, + 0.018451310694217682, + -0.055378228425979614, + -0.04928762838244438, + -0.020526282489299774, + 0.01511127594858408, + -0.029369531199336052, + 0.029876960441470146, + 0.038107991218566895, + 0.037690650671720505, + -0.03575237840414047, + 0.030052166432142258, + 0.010156095959246159, + 0.023729082196950912, + 0.022262724116444588, + 0.05377553030848503, + 0.015983840450644493, + 0.012193809263408184, + 0.0363505519926548, + 0.03717820346355438, + -0.0132398447021842, + 0.005464593414217234, + -0.04128178581595421, + 0.009104952216148376, + 0.02491668239235878, + -0.0015784600982442498, + -0.03032855875790119, + 0.05317708104848862, + -0.035418543964624405, + -0.0403718501329422, + -0.031031614169478416, + 0.0066244155168533325, + -0.020375743508338928, + 0.016089564189314842, + 0.04707200825214386, + 0.045463643968105316, + -0.03221960738301277, + 0.012529425323009491, + -0.04036363214254379, + 0.002571037970483303, + 0.029752220958471298, + -0.009468672797083855, + 0.003708574688062072, + -0.03314213454723358, + -0.01323634572327137, + -0.012179017998278141, + 0.02393718995153904, + -0.008176485076546669, + 0.004878294188529253, + -0.0633009523153305, + -0.009240301325917244, + -0.0204729363322258, + 0.08824464678764343, + 0.0551028810441494, + -0.025194218382239342, + 0.015531675890088081, + -0.0328342467546463, + 0.020082000643014908, + -0.02244427241384983, + 0.025918079540133476, + 0.007830075919628143, + -0.03271260857582092, + 0.004204218741506338, + -0.00690473522990942, + 0.057740241289138794, + -0.0583774633705616, + -0.05268712714314461, + 0.04913575202226639, + 0.011438315734267235, + -0.05547183007001877, + 0.018471337854862213, + 0.022338125854730606, + 0.036328114569187164, + 0.011987737379968166, + 0.016123993322253227, + -0.023944057524204254, + -0.010756840929389, + 0.0054707913659513, + -0.03772115334868431, + -0.10223563015460968, + -0.030133256688714027, + 0.06909658759832382, + 0.03793053328990936, + -0.028042854741215706, + -0.05860919505357742, + 0.027706949040293694, + -0.013812185265123844, + -0.011283869855105877, + -0.0025857349392026663, + -0.004806371871381998, + -0.0966075137257576, + 0.03193771466612816, + 0.0727173238992691, + -0.038796763867139816, + -0.06174341216683388, + -0.0032117462251335382, + -0.06063411384820938, + 0.0606837123632431, + 0.02011265978217125, + 0.011877722106873989, + -0.004632994998246431, + 0.157028466463089, + -0.010776677168905735, + 0.04906792193651199, + 0.017969049513339996, + -0.023766208440065384, + -0.035593319684267044, + 0.06603281944990158, + 0.004095954354852438, + -0.003013259032741189, + 0.09234334528446198, + -0.06996338069438934, + -0.0012650408316403627, + -0.051047634333372116, + -0.023429956287145615, + 0.0506940558552742, + -0.000989840948022902, + 0.005756124388426542, + -0.01844569854438305, + -0.05294405296444893, + 0.10093262046575546, + -0.05163591727614403, + -0.046391189098358154, + 0.03682076185941696, + -0.013953039422631264, + -0.00829730648547411, + 0.016348037868738174, + 0.029590878635644913, + -0.010724885389208794, + 0.03132936730980873, + -0.09037119150161743, + -0.02446158416569233, + 0.01799129694700241, + -0.004724904894828796, + -0.0179754626005888, + -0.017058907076716423, + 0.06549952179193497, + -0.03879868611693382, + 0.03201507031917572, + -0.05263605713844299, + -0.07560855150222778, + 0.023038333281874657, + 0.08131105452775955, + -0.007891630753874779, + 0.010212005116045475, + -0.022032614797353745, + -0.037194348871707916, + 0.04312831163406372, + -0.021400118246674538, + -0.0055341594852507114, + 0.0505189374089241, + -0.015061940997838974, + 0.008572549559175968, + 0.06600383669137955, + -0.06507135927677155, + 0.025505272671580315, + 0.1239512488245964, + 0.0029331184923648834, + -0.05543820187449455, + -0.0464475080370903, + -0.014905349351465702, + 0.0553421825170517, + -0.060036033391952515, + 0.027302566915750504, + -0.05769211798906326, + 0.020448798313736916, + -0.02193785086274147, + -0.024715296924114227, + 0.05368613824248314, + -0.054843612015247345, + -0.0493527352809906, + -0.0036408405285328627, + 0.01888098567724228, + 0.07817717641592026, + 0.012165231630206108, + -0.013434512540698051, + 0.1234184205532074, + 0.02105126529932022, + 0.027825387194752693, + 0.04109129309654236, + -0.01481082197278738, + -0.037877876311540604, + -0.08924141526222229, + 0.014156855642795563, + -0.04031049832701683, + 0.0012453959789127111, + -0.05089078098535538, + 0.0157526396214962, + -0.013785487040877342, + 0.012570018880069256, + 0.03820948675274849, + 0.056189246475696564, + 0.0570443794131279, + -0.00707648042589426, + -0.010196640156209469, + 0.03861375153064728, + -0.06775396317243576, + 8.025951683521271e-05, + -0.01706021837890148, + 0.034831322729587555, + -0.03055954910814762, + 0.005970990285277367, + -0.04690682888031006, + -0.0664185956120491, + 0.06603065133094788, + -0.10048158466815948, + -0.010846846736967564, + 0.04063577204942703, + -0.04530816897749901, + -0.06576434522867203, + 0.024065490812063217, + 0.00985124334692955, + -0.04521741345524788, + -0.024303117766976357, + 0.007082080468535423, + 0.05948451906442642, + -0.0013600765960291028, + 0.06832627952098846, + -0.0816824734210968, + 0.03162050619721413, + -0.07064618170261383, + -0.005621605087071657, + 0.031182067468762398, + 0.028993628919124603, + -0.06745805591344833, + 0.1008504182100296, + -0.019304536283016205, + 0.05470830202102661, + -0.04224247857928276, + 0.03821016848087311, + 0.0177629292011261, + 0.0029355017468333244, + 0.0210754182189703, + 0.036286503076553345, + -0.008670195005834103, + 0.014225011691451073, + -0.03810659795999527, + 0.09428758174180984, + 0.001167136593721807, + -0.04306814447045326, + -0.05250782147049904, + 0.01725144125521183, + 0.1009177640080452, + 0.056033939123153687, + -0.04590430483222008, + 0.03750710189342499, + 0.00973665714263916, + 0.031874917447566986, + -0.028557363897562027, + -0.0427425242960453, + 0.017966706305742264, + 0.06426543742418289, + -0.07949667423963547, + 0.012790117412805557, + 0.07740969210863113, + -0.03154323995113373, + -0.000931435904931277, + 0.028952905908226967, + -0.0016979111824184656, + -0.027679821476340294, + 0.01712878607213497, + -0.0625903308391571, + 0.056609392166137695, + 0.02206997759640217, + -0.04671192169189453, + -0.02998626045882702, + -0.017524294555187225, + 0.11413019150495529, + 0.03503143787384033, + -0.04886762425303459, + -0.01309217605739832, + 0.017934465780854225, + -0.008569798432290554, + -0.011151830665767193, + 0.043749406933784485, + -0.04999162629246712, + -0.02375105582177639, + -0.06315535306930542, + -0.01858431100845337, + 0.010522568598389626, + -0.022048017010092735, + 0.006009046919643879, + -0.05854521319270134, + -0.048333462327718735, + -0.002478170907124877, + -0.015333693474531174, + 0.05189032107591629, + -0.018828751519322395, + 0.032818086445331573, + -0.06960243731737137, + -0.059407517313957214, + -0.01066416222602129, + -0.04799465835094452, + 0.03485500440001488, + -0.006828434765338898, + 0.03854886069893837, + -0.001209061942063272, + 0.01583092473447323, + -0.003763538785278797, + 0.005827051587402821, + -0.06429404765367508, + -0.026753002777695656, + -0.007608311716467142, + 0.023611638695001602, + -0.015527237206697464, + -0.0816955491900444, + 0.07749387621879578, + 0.020281655713915825, + 0.04358011856675148, + 0.06164932623505592, + 0.012244789861142635, + 0.009536119177937508, + -0.01715359278023243, + -0.049351681023836136, + -0.010262561030685902, + -0.040689606219530106, + 0.0015704972902312875, + -0.029288627207279205, + 0.033916302025318146, + 0.022839462384581566, + -0.023955155164003372, + -0.0018260570941492915, + 0.04853229969739914, + 0.029086245223879814, + 0.02011525072157383, + -0.087351955473423, + 0.029166242107748985, + 0.04226355254650116, + 0.013103838078677654, + 0.028118737041950226, + -0.03275945037603378, + -0.06070456653833389, + -0.03526311740279198, + 0.03457321971654892, + 0.000781301234383136, + 0.06521835923194885, + -0.03403833135962486, + -0.05867011100053787, + 0.029102222993969917, + 0.02450171299278736, + -0.012786544859409332, + -0.06446541845798492, + -0.0051344106905162334, + 0.03445170447230339, + 0.06778490543365479, + -0.02216685190796852, + 0.0016194046474993229, + -0.01634589582681656, + -0.0011322996579110622, + -0.01887090690433979, + -0.02892678789794445, + 0.014416128396987915, + 0.0009288133005611598, + 0.00677884416654706, + -0.04446335509419441, + 0.016548747196793556, + -0.03842639550566673, + -0.03163810446858406, + 0.06702737510204315, + -0.03608359023928642, + -0.00025231484323740005, + 0.04340079426765442, + 0.05607728287577629, + 0.031793396919965744, + 0.08414526283740997, + 0.008220396935939789, + -0.01985529251396656, + -0.013045559637248516, + -0.0149798933416605, + 0.06220037117600441, + 0.033296458423137665, + 0.00500292656943202, + 0.004333977587521076, + -0.04320530593395233, + 0.007642753422260284, + -0.03890792280435562, + 0.0051839109510183334, + 0.05762368068099022, + 0.02640019729733467, + 0.011530695483088493, + 0.02300417236983776, + -0.019416140392422676, + -0.007894888520240784, + 0.02734089083969593, + 0.000815258186776191, + 0.053942739963531494, + -0.0436263382434845, + -0.034643787890672684, + 0.07824137806892395, + -0.06709934771060944, + 0.06901289522647858, + 0.08676657825708389, + 0.01688706874847412, + -0.05954931303858757, + 0.004134624730795622, + 0.023650459945201874, + 0.0001446884125471115, + 0.037243153899908066, + 0.05318034440279007, + 0.0700862929224968, + 0.0385315977036953, + -0.00830205250531435, + 0.022020962089300156, + -0.00824003480374813, + 0.025458309799432755, + 0.04254689812660217, + 0.0009686902048997581, + -0.014871773310005665, + 0.051201775670051575, + 0.01027221791446209, + 0.08684585988521576, + -0.02971283532679081, + -0.011146444827318192, + -0.07543549686670303, + -0.020205246284604073, + -0.06203436478972435, + 0.07105137407779694, + -0.06884029507637024, + -0.033693719655275345, + -0.0417039655148983, + -0.031183280050754547, + 0.0323086753487587, + 0.07099177688360214, + 0.0004308670468162745, + -0.0946657806634903, + 0.05404246225953102, + -0.011720084585249424, + 0.045603178441524506, + -0.05754629895091057, + -0.011325608938932419, + 0.010355609469115734, + 0.022307073697447777, + 0.09751570969820023, + -0.03173089772462845, + 0.05594935640692711, + 0.010774122551083565, + 0.025656910613179207, + -0.02179778181016445, + 0.05516326427459717, + -0.035248346626758575, + 0.034484293311834335, + 0.07085457444190979, + 0.028202733024954796, + 0.056037697941064835, + -0.057751286774873734, + 0.018484141677618027, + -0.0036834031343460083, + 0.01223890669643879, + -0.0009950973326340318, + -0.01307816430926323, + 0.03376156836748123, + -0.02969367243349552, + 0.059113480150699615, + 0.04872358962893486, + 0.05968193709850311, + -0.028744438663125038, + -0.05794977769255638, + -0.08101271092891693, + 0.007644148543477058, + -0.03083055466413498, + -0.027795907109975815, + -0.010444259271025658, + -0.02906023897230625, + 0.04509296268224716, + -0.05705117806792259, + -0.04451403394341469, + 0.06550070643424988, + -0.0078123449347913265, + -0.0183242317289114, + -0.040778711438179016, + 0.005235273856669664, + 0.002707386389374733, + 0.06487920135259628, + 0.0973295047879219, + -0.02223711460828781, + -0.05871149152517319, + 0.01749638468027115, + 0.05020421743392944, + 0.027955958619713783, + 0.016088897362351418, + 0.014080396853387356, + 0.0064940787851810455, + -0.017334003001451492, + -0.049333494156599045, + 0.04429780691862106, + -0.005173363257199526, + -0.04948711767792702, + -0.001269756117835641, + -0.003951952792704105, + 0.04227662831544876, + -0.020763786509633064, + -0.050812024623155594, + -0.05954231321811676, + -0.06424717605113983, + -0.01500832848250866, + -0.06810985505580902, + -0.011319112963974476, + -0.00735191535204649, + -0.04203500226140022, + -0.02823590487241745, + 0.06403610110282898, + 0.033493559807538986, + -0.004137557931244373, + -0.04067056253552437, + -0.030258391052484512, + -0.008252452127635479, + -0.056280579417943954, + -0.0440947599709034, + -0.007525031920522451, + 0.04915264993906021, + 0.04837511479854584, + -0.019422918558120728, + 0.031448233872652054, + 0.00733947055414319, + -0.03402920439839363, + 0.05732659995555878, + -0.025952192023396492, + 0.06528374552726746, + -0.024781251326203346, + -0.027520032599568367, + -0.041780468076467514, + -0.05471392720937729, + -0.05062618851661682, + -0.0121277691796422, + -0.05728118494153023, + -0.037124015390872955, + -0.10094387084245682, + 0.0008856018539518118, + 0.016356606036424637, + -0.009727592580020428, + -0.07148565351963043, + 0.013242436572909355, + -0.05578983202576637, + 0.04417295753955841, + -0.05025770515203476, + 0.0524807907640934, + 0.058065030723810196, + 0.04594448581337929, + -0.08914202451705933, + -0.005309537518769503, + -0.0051671178080141544, + 0.020991137251257896, + -0.009967241436243057, + 0.028821321204304695, + -0.038495149463415146, + -0.011333068832755089, + -0.00032505951821804047, + 0.06773139536380768, + 0.01539461500942707, + 0.0052316030487418175, + 0.025828253477811813, + 0.004387897439301014, + 0.0009168533142656088, + -0.05614563450217247, + -0.036197442561388016, + -0.0038549299351871014, + 0.05081174895167351, + 0.02860085852444172, + 0.036911290138959885, + 0.020038267597556114, + 0.0900401696562767, + 0.04283471405506134, + -0.026248479261994362, + -0.014528274536132812, + -0.08037876337766647, + -0.015186730772256851, + -0.046942830085754395, + 0.09666776657104492, + -0.032152704894542694, + 0.1042107418179512, + -0.0037883748300373554, + 0.03532910719513893, + 0.024518869817256927, + -0.006518403068184853, + 3.624148666858673e-05, + -0.05473252385854721, + 0.0038580731488764286, + 0.01619664579629898, + -0.0592433400452137, + -0.028054092079401016, + -0.039563704282045364, + -0.07826728373765945, + 0.007303891237825155, + -0.0016252738423645496, + 0.010634698905050755, + -0.05892583727836609, + -0.1028798520565033, + -0.1025250256061554, + -0.0489053837954998, + 0.0761580839753151, + 0.0003246227279305458, + 0.01764671318233013, + -0.04567689448595047, + 0.0017265045316889882, + 0.1074521392583847, + 0.009256143122911453, + -0.0086295735090971, + 0.025150688365101814, + 0.029408499598503113, + -0.05374184250831604, + -0.08697893470525742, + -0.004331841133534908, + -0.012978748418390751, + 0.01129025686532259, + 0.01291558239609003, + 0.12539006769657135, + 0.0067464374005794525, + 0.04762988165020943, + -0.09101837873458862, + 0.0024143336340785027, + 0.06800898164510727, + -0.0031652532052248716, + -0.03735361620783806, + -0.0008640715386718512, + -0.02979232184588909, + -0.037972591817379, + 0.10696317255496979, + 0.024048063904047012, + 0.006043695844709873, + -0.014625146985054016, + -0.01327919028699398, + -0.07279280573129654, + 0.011475003324449062, + -0.07008174806833267, + 0.03393857553601265, + -0.06376609206199646, + -0.05901316553354263, + 0.03415929153561592, + -0.00576013745740056, + -0.051618244498968124, + -0.00013159774243831635, + -0.003026098944246769, + 0.09039998799562454, + 0.021720316261053085, + 0.034962330013513565, + 0.05111391842365265, + -0.013111330568790436, + -0.07111985236406326, + 0.043959252536296844, + 0.05692610144615173, + 0.012901142239570618, + -0.03638460487127304, + 0.10743413865566254, + -0.0021282576490193605, + -0.04420499876141548, + 0.01582242362201214, + -0.07095066457986832, + -0.011896103620529175, + -0.0898396298289299, + 0.000857154605910182, + 0.02479904145002365, + -0.04015585407614708, + -0.04043566435575485, + -0.0472237765789032, + 0.031227534636855125, + 0.021124064922332764, + -0.0604877769947052, + 0.003218618221580982, + -0.0231316015124321, + 0.017888469621539116, + -0.08809228986501694, + -0.0036133499816060066, + -0.06864125281572342, + -0.04682687297463417, + -0.018113508820533752, + -0.07460294663906097, + 0.031445179134607315, + 0.05917775630950928, + -0.010313867591321468, + 0.001913213636726141, + 0.021329523995518684, + -0.04515153169631958, + 0.044391997158527374, + 0.024442709982395172, + 0.052626948803663254, + 0.0038299085572361946, + 0.015321130864322186, + 0.03426644206047058, + -0.013600368052721024, + -0.056420888751745224, + -0.013546468690037727, + -0.013812181539833546, + 0.025691255927085876, + -0.036974724382162094, + 0.01779022067785263, + -0.06874419748783112, + 0.047782573848962784, + 0.03878454491496086, + -0.007244600914418697, + 0.02038305252790451, + -0.002618989907205105, + 0.005330730229616165, + 0.029592636972665787, + 0.01506439782679081, + -0.006280140485614538, + 0.0839882493019104, + -0.03317708894610405, + 0.0694027841091156, + 0.016044368967413902, + 0.031813107430934906, + -0.03898882120847702, + -0.09924381971359253, + -0.0018308327998965979, + -0.04994996264576912, + -0.027328994125127792, + -0.0730605348944664, + -0.02931971475481987, + 0.0021876508835703135, + 0.03022065758705139, + 0.035129692405462265, + -0.07134779542684555, + -0.014315178617835045, + 0.031005024909973145, + -0.017868271097540855, + -0.013462456874549389, + -0.033486656844615936, + -0.023653019219636917, + -0.04801288992166519, + 0.009975641034543514, + 0.01450454443693161, + -0.08886445313692093, + 0.05838429182767868, + -0.017613688483834267, + -0.0365159772336483, + -0.004224137403070927, + -0.04649507254362106, + 0.010790612548589706, + 0.03452901542186737, + -0.017780426889657974, + 0.0020221667364239693, + -0.03713726997375488, + -0.009614478796720505, + 0.060829438269138336, + -0.04794372618198395, + -0.0035630834754556417, + 0.015318566001951694, + 0.04921897500753403, + 0.036809924989938736, + 0.017779115587472916, + -0.0066700163297355175, + 0.012913006357848644, + -0.017593827098608017, + 0.04107185825705528, + -0.0011484860442578793, + -0.02227785997092724, + -0.07282926142215729, + -0.005404220428317785, + 0.019945429638028145, + -0.03512192144989967, + -0.048513222485780716, + -0.02390464022755623, + -0.04964315518736839, + 0.055427663028240204, + 0.042578473687171936, + -0.05552581697702408, + -0.019406726583838463, + -0.04732907563447952, + -0.01687067560851574, + -0.02169208787381649, + 0.021561047062277794, + 0.0004930216236971319, + 0.04019555076956749, + 0.038148827850818634 + ], + "index": 0, + "object": "embedding" + }, + { + "embedding": [ + -0.019107868894934654, + 0.05969410762190819, + -0.02641526237130165, + -0.00969020463526249, + -0.03747580572962761, + 0.02357102558016777, + 0.09215934574604034, + -0.02301914431154728, + -0.004839807283133268, + 0.009354430250823498, + 0.0667242631316185, + -0.054705146700143814, + 0.0034877739381045103, + -0.09294716268777847, + 0.039650965481996536, + -3.956817090511322e-05, + -0.01878221705555916, + 0.03802841901779175, + 0.04464232549071312, + 0.036792606115341187, + 0.05557376518845558, + 0.01654529571533203, + -0.05781911313533783, + 0.0298917219042778, + 0.05767952278256416, + -0.07013184577226639, + -0.023283272981643677, + -0.02829700894653797, + -0.07846219837665558, + 0.055097613483667374, + -0.031084541231393814, + 0.0370931401848793, + -0.0262261051684618, + -0.003207992995157838, + -0.0501214824616909, + -0.00466768117621541, + -0.028331540524959564, + 0.010863426141440868, + -0.030716603621840477, + 0.02695249393582344, + -0.009500059299170971, + 0.0312824584543705, + -0.016594339162111282, + -0.016109604388475418, + 0.030723711475729942, + 0.009460280649363995, + 0.03169010952115059, + 0.0428958386182785, + 0.06801591068506241, + 0.04352327063679695, + 0.06424146890640259, + 0.02542412094771862, + -0.02557544596493244, + -0.07389100641012192, + 0.024695497006177902, + -0.037883155047893524, + -0.06273537129163742, + -0.033280596137046814, + 0.0942988246679306, + -0.021529264748096466, + 0.005481111817061901, + -0.05713951960206032, + -0.03173011913895607, + 0.08359173685312271, + 0.002509322250261903, + -0.010705582797527313, + -0.02813081070780754, + 0.03218778595328331, + -0.031135477125644684, + 0.054803911596536636, + -0.03086942248046398, + 0.027762817218899727, + 0.050554174929857254, + -0.011865640059113503, + -0.034509144723415375, + -0.0822167620062828, + 0.03028966300189495, + 0.0012372484197840095, + 0.022374756634235382, + 0.005579935386776924, + 0.03646182641386986, + -0.02391068823635578, + -0.022860227152705193, + 0.06766748428344727, + 0.06965604424476624, + -0.055303674191236496, + 0.0024586475919932127, + 0.036844659596681595, + 0.02541314996778965, + 0.01812933385372162, + -0.03368941694498062, + 0.09144852310419083, + 0.09115881472826004, + -0.06697574257850647, + -0.017377778887748718, + -0.010126631706953049, + 0.027187934145331383, + -0.014947411604225636, + 0.05628008395433426, + 0.06307908147573471, + 0.03403352200984955, + 0.0030784416012465954, + 0.06869656592607498, + -0.009399832226336002, + 0.041315484791994095, + -0.010467988438904285, + -0.0483647845685482, + 0.017219247296452522, + -0.03896819427609444, + 0.021415650844573975, + 0.09061326831579208, + -0.005861051380634308, + -0.038267653435468674, + 0.046615395694971085, + 0.04201333597302437, + -0.01590883545577526, + -0.003025552723556757, + 0.021644582971930504, + -0.10279767960309982, + 0.0063465856947004795, + 0.03894897550344467, + -0.018092051148414612, + -0.035921160131692886, + -0.014537656679749489, + 0.009809433482587337, + -0.03156856819987297, + 0.018243683502078056, + -0.07279945909976959, + -0.08304895460605621, + 0.020131003111600876, + -0.003034191206097603, + 0.17061756551265717, + -0.03022359497845173, + -0.06010538339614868, + 0.0001771855168044567, + -0.06383176147937775, + -0.1212034747004509, + 0.030682992190122604, + 0.04772643372416496, + 0.02061346545815468, + 0.044820792973041534, + 0.06503155082464218, + -0.014484420418739319, + -0.07592359185218811, + 0.003911200445145369, + -0.046980120241642, + 0.062438253313302994, + -0.011392018757760525, + 0.007086616475135088, + -0.003980552311986685, + -0.09060041606426239, + 0.021531838923692703, + -0.05317315086722374, + -0.0063044060952961445, + 0.014186644926667213, + 0.05544703081250191, + 0.04073552042245865, + -0.08768859505653381, + -0.1433810442686081, + 0.062245022505521774, + -0.06447340548038483, + 0.07243824005126953, + -0.04838711395859718, + -0.10524970293045044, + -0.09465774893760681, + 0.04338963329792023, + -0.028572693467140198, + 0.08500376343727112, + -0.03209125995635986, + 0.05384884029626846, + 0.05702401325106621, + -0.06152752414345741, + 0.058184098452329636, + 0.09705542773008347, + 0.10502056032419205, + 0.03784438967704773, + 0.030813420191407204, + 0.03487790375947952, + 0.03566966578364372, + 0.12169647216796875, + -0.08527814596891403, + 0.024039991199970245, + 0.049659278243780136, + 0.011523749679327011, + -0.02314302697777748, + 0.002479518298059702, + 0.018091682344675064, + -0.03763652220368385, + 0.04773708060383797, + 0.02359866350889206, + -0.046382155269384384, + -0.07191500067710876, + -0.0137832872569561, + -0.061333637684583664, + 0.0044320980086922646, + 0.011473669670522213, + -0.0004515079490374774, + 0.004205567296594381, + 0.10532690584659576, + 0.04663138464093208, + -0.004316071979701519, + -0.02644043229520321, + 0.04246068373322487, + 0.05435512587428093, + 0.021789541468024254, + 0.03728332743048668, + 0.03247801586985588, + 0.006477495189756155, + -0.03336288779973984, + -0.052549008280038834, + 0.03782998025417328, + 0.0539570115506649, + -0.011990574188530445, + -0.012592736631631851, + -0.028249235823750496, + -0.08427534252405167, + -0.14187216758728027, + -0.015555874444544315, + 0.02031802572309971, + -0.004645025357604027, + 0.07693739980459213, + -0.0019037178717553616, + 0.05387450009584427, + 0.06875354051589966, + -0.0260264053940773, + -0.012445708736777306, + -0.09106626361608505, + -0.05967855826020241, + 0.04270946979522705, + 0.030767718330025673, + 0.004102952778339386, + -0.07895159721374512, + -0.005092627834528685, + -0.05254456400871277, + -0.027765337377786636, + -0.019031543284654617, + 0.015856865793466568, + -0.009976810775697231, + 0.06166425347328186, + -0.09034319221973419, + -0.029368003830313683, + 0.003111080499365926, + 0.013041235506534576, + -0.029530683532357216, + -0.0060139428824186325, + 0.037104107439517975, + 0.048742953687906265, + 0.012147465720772743, + -0.06627201288938522, + -0.14233113825321198, + 0.06595543771982193, + 0.09540640562772751, + -0.027140118181705475, + -0.05786439776420593, + -0.03835649788379669, + 0.04362019523978233, + -0.05224176123738289, + -0.040575262159109116, + 0.026075158268213272, + 0.0486895777285099, + 0.02869992144405842, + -0.02865298092365265, + 0.027256378903985023, + -0.04727815091609955, + -0.01788470149040222, + 0.0029314374551177025, + -0.039456482976675034, + 0.006910055875778198, + 0.019828999415040016, + 0.03293032571673393, + 0.04420895874500275, + 0.04037678241729736, + -0.004165329039096832, + 0.04362497851252556, + 0.01705991104245186, + -0.09046860039234161, + -0.007405324373394251, + 0.02170439064502716, + -0.000971913046669215, + -0.03682924434542656, + -0.0055264937691390514, + 0.00488848052918911, + -0.05618760362267494, + -0.0007306243060156703, + 0.034489840269088745, + 0.036111295223236084, + -0.027665967121720314, + 0.0036469593178480864, + -0.10788348317146301, + 0.032339032739400864, + 0.004036004189401865, + -0.0304102823138237, + 0.10898232460021973, + 0.003966630902141333, + -0.02487463504076004, + 0.011165143921971321, + 0.022842761129140854, + 0.1355801373720169, + -0.00575806712731719, + -0.03804865851998329, + 0.012298420071601868, + 0.135411337018013, + 0.013281743973493576, + -0.010842448100447655, + -0.05865247920155525, + -0.07216284424066544, + 0.00909117516130209, + -0.08173802495002747, + -0.002813630737364292, + 0.025598060339689255, + 0.07495344430208206, + -0.04790157452225685, + 0.012442308478057384, + 0.07229872792959213, + -0.03790329024195671, + 0.06151506304740906, + -0.021866757422685623, + 0.0631132572889328, + 0.025492189452052116, + -0.06090550869703293, + 0.052262693643569946, + 0.03031247854232788, + 0.04965190961956978, + -0.0513898991048336, + -0.02395702712237835, + -0.06624690443277359, + 0.03414173796772957, + -0.002529361518099904, + 0.06878060102462769, + 0.014153602533042431, + -0.06909331679344177, + 0.048220910131931305, + 0.042710382491350174, + 0.04152809828519821, + 0.09201670438051224, + 0.10529816895723343, + -0.009647340513765812, + 0.04514491558074951, + 0.06182157248258591, + 0.038261137902736664, + 0.012247578240931034, + -0.016902048140764236, + -0.054074861109256744, + -0.0027346459683030844, + -0.035286322236061096, + -0.000671595218591392, + -0.020851444453001022, + -0.05912028253078461, + 0.03581051528453827, + -0.04337315261363983, + -0.01956385374069214, + 0.004237719811499119, + -0.06927124410867691, + 0.020569758489727974, + -0.0006926784990355372, + 0.0004869419790338725, + -0.014945785515010357, + 0.06363927572965622, + 0.018962930887937546, + 0.04128069058060646, + 0.08596605062484741, + 0.00627359701320529, + -0.030244803056120872, + 0.029033750295639038, + 0.040679361671209335, + 0.03888079896569252, + -0.01623433455824852, + 0.12628987431526184, + -0.061587922275066376, + 0.11117321997880936, + 0.028206661343574524, + -0.09006542712450027, + -0.17459966242313385, + 0.05753336846828461, + -0.0777580514550209, + -0.055061567574739456, + -0.047371719032526016, + 0.00888530071824789, + -0.04794039577245712, + 0.044454410672187805, + -0.07609839737415314, + -0.050501272082328796, + 0.052621595561504364, + -0.02454296313226223, + -0.06877875328063965, + 0.0022716957610100508, + -0.020329033955931664, + 0.08024442195892334, + -0.023272959515452385, + -0.05816803500056267, + -0.04624331742525101, + 0.08294914662837982, + 0.01656801626086235, + -0.02112448960542679, + -0.09380540996789932, + 0.06970463693141937, + 0.014710181392729282, + 0.04234965890645981, + 0.0002107415348291397, + 0.025668375194072723, + 0.04749423265457153, + -0.03174463286995888, + -0.10041133314371109, + 0.04286760836839676, + 0.059495434165000916, + -0.0024170400574803352, + -0.1331634521484375, + -0.019143972545862198, + -0.045793578028678894, + 0.013072194531559944, + -0.06513761729001999, + -0.0021775441709905863, + 0.07740801572799683, + 0.0128395427018404, + 0.034201547503471375, + 0.002501504961401224, + -0.06347143650054932, + -0.0827707052230835, + -0.058420464396476746, + 0.011762617155909538, + -0.10761692374944687, + 0.06448917835950851, + -0.04513268172740936, + -0.017448261380195618, + 0.03361862152814865, + -0.010465940460562706, + 0.12419401854276657, + 0.01241596695035696, + -0.0641559585928917, + -0.05590023845434189, + 0.0018879227573052049, + 0.1075424998998642, + -0.0632002204656601, + 0.0012930401135236025, + 0.038224510848522186, + -0.023312170058488846, + -0.00465640053153038, + -0.04008292406797409, + -0.03062780573964119, + -0.02024693787097931, + -0.028171975165605545, + 0.03836512938141823, + 0.038529135286808014, + 0.05846807733178139, + 0.022991705685853958, + -0.0016795138362795115, + -0.04207833856344223, + -0.032820925116539, + -0.03261202201247215, + -0.030419277027249336, + 0.03492671623826027, + -0.0626068264245987, + 0.015011549927294254, + -0.07747045904397964, + 0.009282127022743225, + 0.05342179909348488, + 0.004121758043766022, + 0.015549017116427422, + 0.009798477403819561, + 0.09516540914773941, + -0.10548490285873413, + -0.09371929615736008, + -0.07756969332695007, + -0.05806498974561691, + 0.06880338490009308, + -0.026806222274899483, + -0.004507019650191069, + 0.04031221196055412, + 0.07586846500635147, + 0.0010414771968498826, + -0.032703712582588196, + 0.011433696374297142, + 0.029833726584911346, + -0.0257119033485651, + -0.03366890177130699, + 0.03963543847203255, + -0.03344348073005676, + 0.03677061200141907, + 0.0016234205104410648, + 0.036410167813301086, + 0.0027553834952414036, + 0.05725175887346268, + 0.0871000587940216, + 0.017660632729530334, + -0.1307959258556366, + -0.030803510919213295, + -0.06702478975057602, + -0.03890928626060486, + 0.005833339877426624, + 0.046123526990413666, + 0.024221643805503845, + 0.10369864851236343, + -0.04899594187736511, + 0.03488156199455261, + -0.010654409416019917, + -0.029799839481711388, + -0.0498703233897686, + 0.04467075690627098, + -0.00047155001084320247, + 0.03461684286594391, + 0.05542340874671936, + -0.01189647987484932, + 0.05968725308775902, + -0.03660564124584198, + -0.0037804662715643644, + 0.04793388023972511, + -0.07941094785928726, + 0.03307073190808296, + -0.023683249950408936, + 0.0025685373693704605, + -0.04098949581384659, + 0.03376660868525505, + 0.005951263476163149, + 0.07380400598049164, + -0.023361800238490105, + -0.0009826641762629151, + 0.0021398146636784077, + 0.0314042903482914, + -0.02987937442958355, + -0.08601617813110352, + 0.0914551243185997, + 0.0272340327501297, + 0.00570692541077733, + 0.03476465120911598, + -0.025536982342600822, + 0.05501542240381241, + -0.09498315304517746, + -0.017913876101374626, + -0.009813526645302773, + 0.07722225040197372, + -0.10824139416217804, + -0.08675307780504227, + 0.05775047093629837, + 0.10283687710762024, + 0.10858594626188278, + 0.004729479551315308, + -0.03893456608057022, + 0.12252123653888702, + -0.05336784943938255, + 0.007989426143467426, + 0.02518993616104126, + 0.021054377779364586, + -0.01120569184422493, + 0.008962331339716911, + 0.15070155262947083, + -0.041931431740522385, + 0.020063523203134537, + 0.07124665379524231, + -0.015184132382273674, + -0.009105974808335304, + -0.010330158285796642, + 0.002910048933699727, + 0.08601880818605423, + 0.0687614306807518, + -0.007822689600288868, + -0.016773391515016556, + -0.03154626861214638, + -0.07681484520435333, + -0.005057695787400007, + 0.017769012600183487, + 0.025736026465892792, + -0.002089190063998103, + -0.0345032699406147, + 0.06573650240898132, + 0.009012715891003609, + 0.0017626332119107246, + 0.0250503271818161, + 0.016202164813876152, + 0.04089904576539993, + -0.0011557838879525661, + -0.022899556905031204, + 0.020666014403104782, + 0.04018319025635719, + 0.029078686609864235, + -0.007621978875249624, + -0.016741041094064713, + 0.030248675495386124, + 0.02992335520684719, + 0.024699456989765167, + 0.017959201708436012, + 0.02364400401711464, + -0.034220755100250244, + -0.044312484562397, + 0.05544113367795944, + 0.04405776038765907, + -0.06289990246295929, + 0.018241044133901596, + 0.008325253613293171, + -0.029943838715553284, + 0.050102684646844864, + -0.023013044148683548, + 0.055493418127298355, + -0.06803395599126816, + -0.09021510928869247, + 0.08165101706981659, + 0.05944748967885971, + 0.021631119772791862, + -0.10993658006191254, + -0.0366002656519413, + 0.03235526755452156, + 0.019820883870124817, + 0.0018356747459620237, + -0.03975026309490204, + 0.024339156225323677, + 0.04263564944267273, + -0.061034977436065674, + -0.014553683809936047, + 0.0012570091057568789, + -0.024188965559005737, + 0.05914260074496269, + -0.007840420119464397, + -0.06857188791036606, + 0.09867143630981445, + -0.08754199743270874, + -0.0781262144446373, + -0.015508989803493023, + -0.010083363391458988, + 0.07288424670696259, + 0.09142982959747314, + -0.03969590365886688, + -0.05447239801287651, + 0.059492725878953934, + 0.07319212704896927, + -0.01694398559629917, + -0.03204117342829704, + 0.040536362677812576, + -0.008453471586108208, + -0.10774454474449158, + -0.020000411197543144, + -0.03818512707948685, + -0.0015745327109470963, + -0.03628892824053764, + 0.04461211711168289, + -0.05635157227516174, + 0.003746225731447339, + 0.041590671986341476, + 0.12744614481925964, + 0.006540853530168533, + -0.051108427345752716, + 0.015473317354917526, + -0.03978969156742096, + -0.03567656874656677, + 0.04545801877975464, + 0.05113706737756729, + 0.06606247276067734, + -0.039817459881305695, + 0.05209381505846977, + 0.050641030073165894, + 0.009054858237504959, + 0.001490931841544807, + 0.03269848972558975, + 0.037380777299404144, + -0.1146283894777298, + -0.04820196330547333, + 0.003163886023685336, + -0.02449909970164299, + 0.01799364760518074, + 0.016373910009860992, + -0.041310638189315796, + 0.04804148152470589, + -0.015126112848520279, + 0.08803117275238037, + -0.03349269926548004, + -0.005476118065416813, + 0.049157604575157166, + -0.06031497195363045, + 0.011520297266542912, + -0.029003849253058434, + 0.03276553004980087, + 0.05113251507282257, + -0.05430557206273079, + 0.08796515315771103, + 0.031849559396505356, + 0.029127072542905807, + -0.04036870226264, + -0.035829927772283554, + 0.01921452023088932, + -0.05420341342687607, + -0.04428316280245781, + 0.03898577764630318, + -0.0254821740090847, + 0.04274837672710419, + -0.004430112428963184, + 0.021844282746315002, + -0.0277419276535511, + -0.006554972380399704, + 0.02749747969210148, + -0.0060079158283770084, + -0.0759068951010704, + 0.051791753619909286, + -0.05145301669836044, + -0.029623968526721, + -0.12719927728176117, + 0.16616640985012054, + 0.01761988364160061, + -0.062106575816869736, + -0.0028107725083827972, + -0.011166619136929512, + -0.043970100581645966, + -0.05232355743646622, + 0.09471729397773743, + -0.018105845898389816, + -0.031164875254034996, + -0.07069668173789978, + -0.027401957660913467, + 0.03022896498441696, + 0.023299144580960274, + -0.10004950314760208, + 0.05298234894871712, + -0.0990290567278862, + -0.03169042989611626, + 0.06493762880563736, + -0.0012039461871609092, + -0.022033141925930977, + 0.037844426929950714, + -0.09252651780843735, + -0.027259940281510353, + -0.028783030807971954, + -0.15443633496761322, + -0.011268218979239464, + 0.11249776184558868, + -0.04436073452234268, + 0.015984032303094864, + 0.021389255300164223, + -0.01712341420352459, + -0.043895382434129715, + -0.07284197956323624, + 0.0319129079580307, + 0.12249504029750824, + -0.06822671741247177, + -0.031229401007294655, + -0.04616959020495415, + -0.04777440428733826, + 0.01624317653477192, + 0.07043299823999405, + -0.029858168214559555, + -0.050169117748737335, + 0.08853098750114441, + 0.03621404245495796, + -0.07093819230794907, + -0.034914661198854446, + -0.025673825293779373, + -0.02026950754225254, + 0.06507165729999542, + 0.0763045996427536, + 0.02203441597521305, + 0.033576007932424545, + 0.03952609375119209, + 0.02557799592614174, + 0.005753787234425545, + 0.01158105581998825, + 0.04434368386864662, + -0.0012732513714581728, + -0.04557472839951515, + 0.042615748941898346, + -0.013398909009993076, + -0.027536101639270782, + 0.02765466831624508, + 0.03956178203225136, + -0.06656771153211594, + 0.046436857432127, + 0.03554150462150574, + -0.003146965755149722, + 0.001389424316585064, + -0.09146097302436829, + 0.005561611149460077, + 0.016635337844491005, + -0.06795576959848404 + ], + "index": 1, + "object": "embedding" + }, + { + "embedding": [ + -0.061557523906230927, + 0.02080259658396244, + 0.055228427052497864, + 0.0020441869273781776, + 0.0025449786335229874, + -0.04805852845311165, + 0.0265218336135149, + -0.05998262017965317, + -0.0295464675873518, + -0.07836110144853592, + 0.020754694938659668, + -0.018101077526807785, + 0.012781891040503979, + 0.03845624998211861, + -3.4533441066741943e-06, + -0.0718374028801918, + -0.010329673998057842, + 0.019257087260484695, + 0.02170238457620144, + 0.031523268669843674, + 0.09562760591506958, + 0.020851192995905876, + -0.00297796493396163, + 0.09478145837783813, + 0.043912265449762344, + -0.027752766385674477, + 0.03518194332718849, + -0.0646074116230011, + -0.02263837493956089, + 0.017166532576084137, + 0.021467985585331917, + -0.01767192967236042, + 0.09736727923154831, + -0.03964245319366455, + -0.03365505114197731, + -0.006702782586216927, + 0.005792389158159494, + -0.03890980780124664, + -0.0011443658731877804, + 0.014723812229931355, + 0.05521225556731224, + -0.027238909155130386, + 0.058320362120866776, + -0.02367200143635273, + 0.0065787918865680695, + 0.0056058382615447044, + -0.010819255374372005, + -0.039377011358737946, + -0.012212555855512619, + 0.013808563351631165, + 0.0007871052366681397, + -0.002378924982622266, + -0.015141905285418034, + -0.031390365213155746, + -0.06274549663066864, + -0.05993959307670593, + -0.026836197823286057, + 0.10041190683841705, + 0.05616408586502075, + 0.023109061643481255, + 0.05199896916747093, + -0.06549163162708282, + 0.028634920716285706, + -0.044805821031332016, + 0.010857407003641129, + -0.0038166530430316925, + -0.08109555393457413, + 0.044161852449178696, + -0.020472757518291473, + 0.0758325383067131, + -0.06934519112110138, + -0.04711494222283363, + 0.058023568242788315, + 0.016695929691195488, + -0.056938156485557556, + -0.01581818424165249, + 0.01544687058776617, + 0.027362950146198273, + 0.006386633031070232, + -0.029433026909828186, + -0.05808013677597046, + 0.004807379096746445, + 0.04571516439318657, + -0.048068832606077194, + -0.1409703493118286, + -0.04430615156888962, + 0.07560203224420547, + 0.02842158079147339, + -0.021456964313983917, + -0.07939398288726807, + 0.004749900195747614, + -0.03420829400420189, + -0.016520069912075996, + 0.017604999244213104, + 0.026151373982429504, + -0.13602207601070404, + 0.01756151206791401, + 0.06743232160806656, + -0.0788491889834404, + -0.0732865259051323, + -0.00963820144534111, + -0.030407778918743134, + 0.054906539618968964, + 0.014350044541060925, + 0.018225759267807007, + -0.0002081543207168579, + 0.1769949197769165, + 0.024131931364536285, + 0.06296230852603912, + -0.029111331328749657, + -0.03202029690146446, + -0.04699435457587242, + 0.09393177926540375, + 0.010633355006575584, + 0.0035634299274533987, + 0.06478850543498993, + -0.0749504417181015, + 0.010190804488956928, + -0.07949966937303543, + -0.030986765399575233, + -0.007734260056167841, + -0.047853633761405945, + 0.006169784814119339, + -0.0033485540188848972, + -0.06453626602888107, + 0.08211663365364075, + -0.08734812587499619, + -0.026940234005451202, + 0.00634808698669076, + -0.024274475872516632, + 0.008418355137109756, + -0.04505014792084694, + -0.027207395061850548, + -0.0036513102240860462, + 0.029595818370580673, + -0.0897647961974144, + -0.04516728222370148, + 0.04067203402519226, + -0.03197766840457916, + 0.0231638140976429, + -0.02368600107729435, + 0.04237283393740654, + -0.03507782146334648, + 0.01177262794226408, + -0.024702254682779312, + -0.08386675268411636, + 0.026940980926156044, + 0.0779075101017952, + -0.025266939774155617, + 0.04615459218621254, + 0.01339583657681942, + -0.02941860631108284, + 0.02515445463359356, + -0.0320737361907959, + 0.0010209080064669251, + 0.09977539628744125, + -0.018261563032865524, + -0.00983362179249525, + 0.09386462718248367, + -0.06959392130374908, + -0.0006084776832722127, + 0.11735045164823532, + 0.05741734430193901, + -0.0237805787473917, + -0.04109995812177658, + 0.0009611320565454662, + 0.006311706267297268, + -0.041298117488622665, + 0.04715995863080025, + -0.056103333830833435, + 0.02898971363902092, + -0.027803028002381325, + -0.07407600432634354, + 0.004661418031901121, + 0.01099067647010088, + -0.006461405660957098, + 0.022562436759471893, + 0.029299777001142502, + 0.04790095239877701, + -0.01662955991923809, + -0.01823064684867859, + 0.14664961397647858, + 0.003053737571462989, + 0.018857616931200027, + 0.002498770598322153, + -0.012757600285112858, + -0.061637911945581436, + -0.11198734492063522, + 0.014784800820052624, + -0.016342399641871452, + -0.014666472561657429, + -0.021422233432531357, + 0.03471158444881439, + -0.03667265549302101, + 0.03310947120189667, + -0.029424097388982773, + 0.09364338219165802, + 0.08107949048280716, + 0.0010562833631411195, + -0.0027208428364247084, + 0.0709361657500267, + -0.07117032259702682, + 0.041216250509023666, + -0.0035790237598121166, + 0.021134505048394203, + -0.023005999624729156, + 0.03180701658129692, + -0.015317085199058056, + -0.07503004372119904, + 0.03297184780240059, + -0.1122499480843544, + 0.026771968230605125, + -0.003317444585263729, + -0.03583106771111488, + -0.10052846372127533, + -0.01670895703136921, + 0.006044056732207537, + -0.0353948138654232, + -0.06496644020080566, + 0.04254237934947014, + 0.06662790477275848, + -0.02872725948691368, + 0.03233612701296806, + -0.08098772168159485, + -0.002917562611401081, + -0.059007685631513596, + 0.01551723014563322, + -0.0036865416914224625, + 0.03948555141687393, + -0.029730895534157753, + 0.08848481625318527, + -0.04417796432971954, + 0.08919074386358261, + -0.05832821503281593, + 0.07851067185401917, + 0.009961046278476715, + 0.030549589544534683, + 0.04732692986726761, + 0.04392458498477936, + -0.02009996771812439, + 0.031521156430244446, + -0.03206602483987808, + 0.11469870060682297, + -0.024758143350481987, + -0.08026223629713058, + -0.035604171454906464, + 0.018993748351931572, + 0.14987272024154663, + 0.060040105134248734, + -0.017032846808433533, + 0.06244199350476265, + 0.03899195417761803, + 0.06938868761062622, + -0.012093457393348217, + -0.07042790949344635, + 0.0835808590054512, + 0.01002182811498642, + -0.07154907286167145, + -0.03159642964601517, + 0.05388499051332474, + -0.029367676004767418, + 0.031295858323574066, + 0.0238728616386652, + 0.004915574099868536, + -0.04333344101905823, + 0.0211846511811018, + -0.05012655630707741, + 0.07294707745313644, + 0.03529274836182594, + -0.07038716226816177, + -0.028013255447149277, + 0.02531358227133751, + 0.11515265703201294, + 0.04194512963294983, + -0.051548201590776443, + -0.03893586993217468, + -0.007670999970287085, + -0.015665851533412933, + -0.012601067312061787, + 0.05932888388633728, + -0.026280006393790245, + 0.020621582865715027, + -0.08311574906110764, + 0.024060217663645744, + 0.004734879359602928, + -0.013305076397955418, + 0.011913719587028027, + -0.028520511463284492, + 0.011541048064827919, + -0.01646098680794239, + 0.0027226305101066828, + 0.043097518384456635, + -0.03690396621823311, + 0.023397205397486687, + -0.041729021817445755, + -0.04418623819947243, + -0.026759829372167587, + -0.003737540217116475, + 0.028038935735821724, + -0.0103102782741189, + 0.04782361909747124, + -0.04321561008691788, + -0.01046162098646164, + 0.01591915264725685, + 0.037790361791849136, + -0.09842560440301895, + -0.05866103619337082, + 0.012297896668314934, + 0.009950865991413593, + 0.007484015077352524, + -0.05998437479138374, + 0.10837540030479431, + -0.016087345778942108, + 0.03411209210753441, + 0.11232127249240875, + -0.0387527234852314, + 0.04367959126830101, + 0.004913573618978262, + -0.07560715824365616, + 0.005539371632039547, + -0.04728255420923233, + -0.019808584824204445, + -0.07848677784204483, + 0.019333817064762115, + -0.012286359444260597, + -0.0008059663814492524, + -0.03699260950088501, + 0.02564675360918045, + 0.08281515538692474, + 0.01159362681210041, + -0.07901489734649658, + 0.08633352816104889, + 0.0484158881008625, + 0.024328358471393585, + 0.048739202320575714, + -0.023705506697297096, + -0.11965138465166092, + -0.04248884320259094, + 0.10684081166982651, + -0.05587674304842949, + 0.04601799324154854, + -0.03752054646611214, + -0.06610417366027832, + 0.020532017573714256, + 0.05577194318175316, + -0.0351848304271698, + -0.03966183215379715, + 0.039472825825214386, + 0.04662502929568291, + 0.0920429602265358, + 0.05710485950112343, + 0.0015081677120178938, + -0.001661293557845056, + -0.03866681084036827, + 0.008358764462172985, + -0.010966735891997814, + 0.051610253751277924, + 0.012763690203428268, + 0.08436810970306396, + -0.04448515549302101, + 0.004049496725201607, + -0.05853516608476639, + -0.010701366700232029, + 0.0802207812666893, + -0.06702207773923874, + 0.02797039784491062, + 0.05719626322388649, + 0.06924539804458618, + 0.07604339718818665, + 0.04466324672102928, + 0.05305468291044235, + 0.03920542448759079, + 0.02115277200937271, + 0.017460286617279053, + 0.09175240248441696, + 0.03976890444755554, + 0.006327434908598661, + 0.017122600227594376, + -0.020584115758538246, + -0.0022071937564760447, + -0.01142031978815794, + 0.002747416030615568, + 0.0869361013174057, + 0.04037103429436684, + 0.05526987835764885, + 0.0037959632463753223, + 0.046756330877542496, + 0.003939548507332802, + 0.05206673592329025, + 0.005674003157764673, + 0.040892262011766434, + -0.06547341495752335, + -0.03260507062077522, + 0.08396773040294647, + -0.07550634443759918, + 0.12760308384895325, + 0.0880792960524559, + 0.01173308864235878, + -0.09041643887758255, + 0.029585275799036026, + 0.001130781602114439, + 0.0007187369046732783, + 0.04810946434736252, + 0.08175022155046463, + 0.023635948076844215, + -0.0007396190194413066, + -0.044851914048194885, + 0.043525196611881256, + 0.03885793313384056, + -0.0062509928829967976, + 0.06491073966026306, + -0.006760436575859785, + 4.718080163002014e-06, + 0.034302957355976105, + -0.01173165999352932, + 0.12747405469417572, + -0.014666312374174595, + -0.009264315478503704, + -0.10077650845050812, + -0.012223553843796253, + -0.030275540426373482, + 0.08462796360254288, + -0.06931953877210617, + -0.008290097117424011, + -0.061825480312108994, + -0.03543975204229355, + 0.0064462944865226746, + 0.06175720691680908, + 0.041911300271749496, + -0.08280936628580093, + 0.07825805991888046, + 0.0022807137575000525, + 0.05598978325724602, + -0.05291788652539253, + -0.017720498144626617, + -0.0037429446820169687, + -0.00740834092721343, + 0.13099193572998047, + -0.016362376511096954, + 0.04761392995715141, + 0.06243278086185455, + -0.012130548246204853, + -0.014929243363440037, + 0.049694936722517014, + 0.020226312801241875, + 0.03466084972023964, + 0.05942593142390251, + -0.02239811234176159, + 0.05331430584192276, + -0.040120869874954224, + 0.039348915219306946, + -0.013168253935873508, + -0.012476191855967045, + 0.02109885774552822, + -0.01602952741086483, + 0.0010936758480966091, + -0.021984923630952835, + 0.04495074227452278, + 0.04218602553009987, + 0.013104777783155441, + -0.0009330061147920787, + -0.06865502148866653, + -0.07468852400779724, + 0.03262045979499817, + 0.003583319019526243, + -0.024782249704003334, + -0.006680495571345091, + -0.002014060504734516, + 0.04689604789018631, + -0.0004360750026535243, + 0.004111730493605137, + 0.05334358289837837, + 0.021736275404691696, + -0.020955385640263557, + -0.04790278151631355, + 0.040953442454338074, + 0.04858502745628357, + 0.11163617670536041, + 0.11007434129714966, + -0.03981231153011322, + -0.011445174925029278, + -0.005122769623994827, + 0.0803154706954956, + 0.06338779628276825, + 0.0139765040948987, + 0.004219823516905308, + 0.03783654049038887, + -0.04720406234264374, + -0.061881937086582184, + 0.08398488909006119, + -0.03193046152591705, + -0.06009882315993309, + -0.04475605860352516, + -0.03480907157063484, + -0.006613061297684908, + -0.05507068336009979, + -0.05623098835349083, + -0.012239466421306133, + -0.039281658828258514, + 0.013645431958138943, + -0.0984303280711174, + -0.021213950589299202, + 0.03370966762304306, + -0.05870208889245987, + -0.018790647387504578, + 0.09075725823640823, + 0.01939035952091217, + 0.016227634623646736, + -0.05809008702635765, + -0.05329965427517891, + -0.012274257838726044, + -0.07503010332584381, + -0.0560571625828743, + -0.025919314473867416, + 0.07525516301393509, + 0.07574900984764099, + 0.020306071266531944, + 0.05117601528763771, + 0.009903589263558388, + -0.10001925379037857, + 0.07389220595359802, + -0.0358579158782959, + 0.07475733011960983, + -0.050454191863536835, + -0.011644942685961723, + -0.07511253654956818, + -0.02085184119641781, + 0.007209982722997665, + -0.03442830592393875, + -0.07751305401325226, + -0.011530717834830284, + -0.10854385048151016, + -0.026548288762569427, + 0.022584158927202225, + -0.05808578059077263, + -0.06184999272227287, + -0.006361300125718117, + -0.08633283525705338, + -0.007299655117094517, + -0.054048508405685425, + 0.04977639019489288, + 0.0800187811255455, + 0.043838679790496826, + -0.058855533599853516, + 0.0008643732871860266, + -0.011604574508965015, + -0.0005179251893423498, + -0.007619425188750029, + 0.011775720864534378, + -0.04379800707101822, + -0.014153039082884789, + -0.024185743182897568, + 0.06792017072439194, + -0.0032818906474858522, + 0.004900431260466576, + 0.007497119717299938, + 0.01870359480381012, + 0.008026315830647945, + -0.05082084611058235, + -0.0362345427274704, + -0.013726629316806793, + -0.021465320140123367, + 0.04130924493074417, + 0.05518465116620064, + 0.008306142874062061, + 0.12373553216457367, + 0.07854555547237396, + -0.0875948816537857, + -0.050983600318431854, + -0.055993761867284775, + -0.041282135993242264, + -0.02437025122344494, + 0.05205613374710083, + -0.0502597913146019, + 0.08499561995267868, + -0.005645051132887602, + 0.07367569953203201, + -0.015836002305150032, + 0.0162825807929039, + -0.002377419965341687, + -0.0469253808259964, + 0.006652745883911848, + 0.026379568502306938, + -0.08686188608407974, + 0.0301973819732666, + -0.0031743175350129604, + -0.04157540947198868, + -0.0422104112803936, + 0.02118316851556301, + 0.010832742787897587, + -0.029460832476615906, + -0.051823828369379044, + -0.09889776259660721, + -0.02205701172351837, + 0.07898921519517899, + 0.006344629917293787, + 0.04122161120176315, + -0.13566647469997406, + 0.026102155447006226, + 0.10255654901266098, + 0.04816935583949089, + 0.019704462960362434, + -0.0037931432016193867, + 0.04952011629939079, + -0.0624857060611248, + -0.10203205049037933, + -0.04100814461708069, + -0.04298250377178192, + 0.052039649337530136, + -0.009493480436503887, + 0.10994862765073776, + 0.01494740042835474, + 0.04819463938474655, + -0.07886224240064621, + 0.012770792469382286, + 0.05823500081896782, + -0.010228138417005539, + 0.043389249593019485, + -0.04455692693591118, + -0.026159441098570824, + -0.014504816383123398, + 0.1315975934267044, + 0.015806524083018303, + 0.00017872080206871033, + -0.039979465305805206, + -0.01070393156260252, + -0.11038648337125778, + 0.004028037656098604, + -0.09508360177278519, + 0.09150142222642899, + -0.07623880356550217, + -0.09600035846233368, + 0.031263478100299835, + -0.03871247172355652, + -0.00802614912390709, + 0.025084661319851875, + 0.00300199375487864, + 0.08458340167999268, + 0.07256080955266953, + 0.05981824919581413, + 0.033045221120119095, + 0.013377734459936619, + -0.08104311674833298, + 0.025950508192181587, + 0.035431571304798126, + 0.03974687680602074, + -0.08084629476070404, + 0.1328800916671753, + -0.006378353573381901, + -0.03064691461622715, + 0.014535668306052685, + -0.0682513415813446, + 0.001491258735768497, + -0.041070789098739624, + -0.039945997297763824, + 0.00709237577393651, + -0.01808503270149231, + 0.013203002512454987, + -0.011125064454972744, + 0.0527070127427578, + 0.02085830084979534, + -0.07813666015863419, + -0.009450078010559082, + -0.02172713354229927, + -0.01300408598035574, + -0.11026838421821594, + 0.007873781956732273, + -0.1196158304810524, + -0.033466920256614685, + -0.0457322932779789, + -0.06961105763912201, + 0.03899574652314186, + 0.03212570771574974, + 0.0012680359650403261, + 0.016437234356999397, + 0.02134554646909237, + -0.0263697300106287, + 0.12652339041233063, + 0.005523796658962965, + 0.03978269174695015, + 0.015642153099179268, + 0.012732453644275665, + 0.04305964708328247, + 0.03454715758562088, + -0.03824087977409363, + 0.004328976385295391, + 0.0003912262327503413, + 0.027716636657714844, + 0.02396395057439804, + -0.02847343124449253, + -0.016948312520980835, + 0.023767292499542236, + 0.04629465192556381, + -0.03143468126654625, + 0.037742406129837036, + 0.021194443106651306, + -0.03788991644978523, + 0.024483749642968178, + 0.05208025127649307, + -0.031938306987285614, + 0.12170270085334778, + -0.05562039092183113, + 0.08853810280561447, + -0.022249754518270493, + 0.03863701969385147, + -0.02860582433640957, + -0.13264809548854828, + -0.008532378822565079, + -0.0406331866979599, + 0.015312130562961102, + -0.07805967330932617, + 0.006238729692995548, + -0.025534609332680702, + -0.0070103248581290245, + 0.010838434100151062, + -0.03673049807548523, + -0.001783689484000206, + 0.04765395075082779, + -0.04501599073410034, + 0.04099445417523384, + -0.06562845408916473, + -0.023723235353827477, + -0.09627480059862137, + 0.022906223312020302, + 0.05437895655632019, + -0.09688648581504822, + 0.022415542975068092, + -0.02507556416094303, + -0.07629584521055222, + 0.01678617112338543, + -0.04702872037887573, + 0.09093689173460007, + 0.05460728704929352, + 0.013151026330888271, + -0.0032807972747832537, + -0.01958034187555313, + 0.012639516033232212, + 0.03352852165699005, + -0.048807695508003235, + 0.012123597785830498, + 0.021912487223744392, + 0.003014186630025506, + 0.06145930290222168, + 0.06476475298404694, + -0.007475043181329966, + -0.0009288859437219799, + -0.014005833305418491, + 0.059760816395282745, + 0.022914253175258636, + -0.05352196469902992, + -0.07883243262767792, + 0.029276518151164055, + 0.04270949587225914, + -0.03137461096048355, + -0.047380246222019196, + -0.01453434769064188, + -0.07227451354265213, + 0.07678356766700745, + 0.03607282042503357, + -0.04686196520924568, + -0.04268438369035721, + -0.04856279492378235, + 0.022016890347003937, + -0.09514237195253372, + 0.012326696887612343, + 0.043724242597818375, + 0.03722542151808739, + 0.0664031058549881 + ], + "index": 2, + "object": "embedding" + }, + { + "embedding": [ + -0.04192072153091431, + 0.06739765405654907, + -0.0881117507815361, + -0.025434914976358414, + -0.0007976124179549515, + 0.04544219747185707, + 0.023919273167848587, + -0.01714596152305603, + 0.015248444862663746, + -0.041811686009168625, + 0.02325117215514183, + 0.0897035300731659, + 0.012673909775912762, + -0.02059660106897354, + -0.09084810316562653, + -0.015460507944226265, + -0.014105337671935558, + -0.03226720169186592, + -0.02632078155875206, + -0.026455795392394066, + 0.06212672218680382, + 0.023486662656068802, + -0.032582152634859085, + 0.03263164684176445, + -0.02057139202952385, + -0.03550923988223076, + -0.041698552668094635, + -0.048175204545259476, + 0.030519232153892517, + -0.06563308835029602, + 0.05298648402094841, + 0.06691961735486984, + -0.025483068078756332, + 0.0004842057533096522, + -0.007826434448361397, + -0.041435252875089645, + -0.033761776983737946, + 0.045098789036273956, + 0.055017270147800446, + -0.007720989640802145, + -0.10931381583213806, + -0.017970597371459007, + 0.02401716262102127, + -0.006750625558197498, + 0.07090383768081665, + 0.03815016523003578, + -0.006283546797931194, + 0.06242258474230766, + -0.04689883813261986, + 0.006446192041039467, + 0.009382223710417747, + -0.002529083052650094, + -0.00011536478996276855, + -0.0009448041091673076, + -0.030059032142162323, + 0.020660191774368286, + -0.035045746713876724, + 0.012610760517418385, + -0.05114401504397392, + 0.014291507191956043, + -0.01914171688258648, + 0.05595478042960167, + 0.20842894911766052, + 0.04091084748506546, + -0.03339199349284172, + -0.018736684694886208, + -0.04324203357100487, + -0.036510296165943146, + -0.040959205478429794, + -0.055596861988306046, + 0.02378627099096775, + -0.032412514090538025, + 0.03718755021691322, + -0.08895562589168549, + -0.01896924339234829, + 0.0032698852010071278, + -0.023522846400737762, + -0.055508214980363846, + -0.07383961975574493, + 0.014368696138262749, + 0.07959893345832825, + -0.05999409779906273, + 0.10828885436058044, + -0.03971143439412117, + -0.07375017553567886, + -0.03630795702338219, + 0.010715680196881294, + -0.015512369573116302, + -0.03692962974309921, + -0.004445709753781557, + -0.05646027997136116, + 0.022770145907998085, + -0.04066101089119911, + -0.05405808985233307, + 0.06765549629926682, + -0.03342653810977936, + -0.03099502995610237, + -0.03577205538749695, + -0.0030446508899331093, + -0.05078830197453499, + 0.012246816419064999, + -0.05787038058042526, + 0.007146736141294241, + -0.026879100129008293, + 0.0076272012665867805, + 0.0034725889563560486, + 0.019866233691573143, + 0.020599715411663055, + -0.06616891175508499, + 0.025196276605129242, + 0.029114533215761185, + 0.028070561587810516, + -0.01041315495967865, + -0.04222819581627846, + -0.03837141394615173, + -0.10533731430768967, + 0.08254411071538925, + 0.06173647567629814, + -0.11052531003952026, + -0.04129445552825928, + -0.04036591574549675, + 0.04321273788809776, + -0.0712730810046196, + 0.03612561896443367, + -0.02249547466635704, + -0.0016524487873539329, + -0.02399303950369358, + -0.08907151967287064, + 0.06133141741156578, + 0.03303912654519081, + -0.09489106386899948, + 0.09016741812229156, + 0.09704682230949402, + -0.08501327037811279, + -0.012326125986874104, + 0.04504644498229027, + -0.08439379185438156, + -0.032368432730436325, + -0.04417438805103302, + 0.007467896677553654, + -0.004590330179780722, + 0.1162756010890007, + 0.08780170977115631, + -0.008521395735442638, + -0.08520947396755219, + -0.03324158862233162, + -0.08053623884916306, + -0.02580426260828972, + 0.009348656982183456, + -0.005565320607274771, + -0.05610598251223564, + 0.0053667169995605946, + 0.0604676678776741, + 0.015942415222525597, + 0.06819010525941849, + 0.00535653717815876, + 0.0032398959156125784, + 0.08639410883188248, + -0.05580917373299599, + 0.018780594691634178, + -0.10725097358226776, + -0.031721290200948715, + -0.03166975826025009, + 0.051686953753232956, + -0.009960589930415154, + -0.13245539367198944, + -0.03390725329518318, + -0.018940147012472153, + -0.010620973072946072, + -0.031618066132068634, + 0.10258477181196213, + 0.0575074702501297, + -0.08389502018690109, + -0.050234779715538025, + 0.05363093689084053, + -0.07966934144496918, + -0.08889421075582504, + -0.006416057702153921, + -0.046130795031785965, + -0.11978791654109955, + 0.06862123310565948, + 0.056407179683446884, + 0.10906971991062164, + -0.0732492133975029, + 0.061636362224817276, + 0.05034111812710762, + 0.005161208100616932, + 0.024723555892705917, + 0.06685354560613632, + -0.017589008435606956, + 0.016249872744083405, + -0.05354464799165726, + -0.026373241096735, + -0.03794475272297859, + -0.006571537349373102, + 0.016455011442303658, + -0.0014304956421256065, + -0.058218106627464294, + -0.02876633033156395, + -0.016927488148212433, + 0.03287644311785698, + -0.00986045878380537, + 0.07751085609197617, + -0.015117493458092213, + -0.07916144281625748, + -0.012945973314344883, + 0.014852992258965969, + -0.10090044885873795, + 0.012214593589305878, + -0.050443362444639206, + 0.01461424957960844, + 0.009883047081530094, + 0.12654365599155426, + -0.07614471763372421, + 0.06052093580365181, + 0.09604322165250778, + -0.04305556043982506, + 0.11088798195123672, + 0.04705927148461342, + 0.04541826620697975, + 0.06163223087787628, + 0.05465885251760483, + 0.020997850224375725, + 0.01798207499086857, + 0.05652041733264923, + -0.013834050856530666, + 0.033924687653779984, + 0.024586454033851624, + -0.05322431027889252, + 0.04796868562698364, + 0.054416313767433167, + -0.05820561572909355, + -0.10481776297092438, + -0.0012059047585353255, + -0.05775771662592888, + 0.015114232897758484, + 0.031262386590242386, + 0.046472638845443726, + -0.028820939362049103, + -0.07707612961530685, + 0.0767933651804924, + 0.04212813079357147, + -0.02484605461359024, + 0.0163679588586092, + 0.02715056948363781, + -0.012361422181129456, + 0.004774135537445545, + -0.0345633439719677, + 0.0659593939781189, + 0.043033987283706665, + 0.07924427837133408, + -0.09330577403306961, + 0.009446347132325172, + 0.027626752853393555, + -0.008455729112029076, + -0.05381564050912857, + 0.05704919248819351, + 0.015030927956104279, + 0.025730088353157043, + -0.061554379761219025, + 0.056641459465026855, + -0.08030448108911514, + -0.018357248976826668, + 0.03305193409323692, + 0.10640862584114075, + -0.029918858781456947, + -0.033137835562229156, + -0.016921421512961388, + -0.009188657626509666, + -0.05802897363901138, + 0.07496775686740875, + -0.02708374708890915, + -0.023373110219836235, + -0.09614459425210953, + 0.05877238139510155, + -0.07747799903154373, + 0.10141705721616745, + 0.01967947743833065, + 0.0006563410861417651, + 0.011791248805820942, + -0.051714569330215454, + 0.0038117433432489634, + -0.05501708760857582, + 0.020864512771368027, + -0.03387419134378433, + -0.025123801082372665, + 0.03419404476881027, + 0.029600413516163826, + 0.024026183411478996, + 0.022544505074620247, + 0.08429984003305435, + -0.0551738366484642, + -0.0019121072255074978, + 0.017035113647580147, + 0.02882862463593483, + 0.04329182952642441, + -0.09148864448070526, + 0.028495145961642265, + 0.09566251933574677, + 0.06630894541740417, + 0.060001175850629807, + -0.07207918912172318, + 0.033028967678546906, + 0.008056395687162876, + -0.09427481144666672, + -0.06539085507392883, + 0.03939146548509598, + 0.009978732094168663, + 0.07262187451124191, + -0.08413073420524597, + 0.009582656435668468, + -0.039572618901729584, + 0.0654282495379448, + 0.09099354594945908, + 0.004624121356755495, + -0.00033582188189029694, + 0.02869660034775734, + 0.03825712576508522, + 0.01706891506910324, + 0.03238494321703911, + 0.011455582454800606, + -0.04514618590474129, + 0.06231397017836571, + 0.060716379433870316, + 0.09052547067403793, + -0.03407086059451103, + 0.03790238872170448, + 0.024124549701809883, + -0.06114032864570618, + 0.005452956072986126, + -0.007423525210469961, + 0.021313291043043137, + 0.013685769401490688, + 0.09123224765062332, + 0.043988462537527084, + 0.07540571689605713, + -0.011822633445262909, + 0.0366826169192791, + -0.08224806934595108, + -0.04881419986486435, + -0.07339194416999817, + 0.05221825838088989, + 0.03408384695649147, + -0.034514058381319046, + 0.004922253545373678, + 0.020705869421362877, + 0.05300689488649368, + 0.08092878758907318, + -0.0404917448759079, + 0.07416367530822754, + 0.06513980776071548, + -0.015393083915114403, + -0.07563870400190353, + 0.039245620369911194, + 0.041882723569869995, + -0.06333176791667938, + 0.017233457416296005, + -0.01609630510210991, + -0.07249383628368378, + 0.0030244700610637665, + 0.017735213041305542, + 0.02417902834713459, + -0.06096765771508217, + -0.01070717815309763, + 0.03960004448890686, + -0.10560576617717743, + 0.0589430034160614, + 0.07232145220041275, + -0.01776004768908024, + -0.012078851461410522, + -0.07409466058015823, + 0.05335940420627594, + 0.04555449262261391, + 0.05223322659730911, + 0.06394025683403015, + 0.14549089968204498, + 0.044257864356040955, + -0.05797089263796806, + -0.05118202790617943, + -0.008567857556045055, + -0.04519716277718544, + -0.01706848107278347, + 0.015538716688752174, + 0.04001522436738014, + -0.052074022591114044, + -0.03165757283568382, + 0.0666811391711235, + 0.04557286575436592, + 0.06350211054086685, + 0.0762525424361229, + 0.052452653646469116, + 0.0187546294182539, + -0.12399020791053772, + 0.050230611115694046, + 0.03244497627019882, + 0.010298308916389942, + 0.055637210607528687, + 0.025556130334734917, + 0.005960727110505104, + 0.0534348264336586, + -0.04258132725954056, + -0.05930972471833229, + -0.028094790875911713, + 0.019873907789587975, + 0.013205224648118019, + -0.06667505949735641, + -0.06467190384864807, + 0.08182628452777863, + 0.00033584609627723694, + -0.036400213837623596, + -0.016670942306518555, + 0.030610745772719383, + 0.05134936049580574, + -0.04891344904899597, + 0.009583552367985249, + 0.0338241271674633, + 0.0388835072517395, + -0.027264021337032318, + 0.02071349136531353, + 0.001176536432467401, + -0.04819236695766449, + 0.01430914830416441, + -0.031850505620241165, + -0.011204300448298454, + -0.030985558405518532, + -0.0431794673204422, + 0.0004312256060075015, + 0.06011468544602394, + -0.004422799684107304, + -0.06024283915758133, + 0.047397926449775696, + -0.0681692436337471, + 0.09940182417631149, + 0.056953065097332, + 0.0604858361184597, + -0.06183835491538048, + 0.09198040515184402, + -0.050269078463315964, + -0.005923697259277105, + -0.026983562856912613, + -0.007257952354848385, + 0.052908774465322495, + 0.031330373138189316, + -0.03674863651394844, + -0.03832351788878441, + 0.012378538958728313, + 0.02309458516538143, + 0.026386970654129982, + 0.04475753381848335, + -0.05562404543161392, + -0.056457389146089554, + -0.013215215876698494, + 0.04653751850128174, + 0.02619938924908638, + 0.08541132509708405, + 0.055598605424165726, + 0.0037850341759622097, + -0.14201460778713226, + 0.06318259984254837, + 0.03897802531719208, + 0.051111746579408646, + 0.019640441983938217, + 0.14644694328308105, + -0.07291465252637863, + -0.061945416033267975, + 0.02838815748691559, + -0.035905640572309494, + 0.0011565177701413631, + -0.09576383233070374, + 0.021247418597340584, + -0.07210452109575272, + 0.031098658218979836, + -0.054424989968538284, + 0.04758327826857567, + 0.0773940309882164, + -0.07216465473175049, + -0.05858452618122101, + -0.041504062712192535, + 0.018103161826729774, + -0.07168498635292053, + -0.02327563799917698, + 0.03616444021463394, + -0.06272757053375244, + 0.015157959423959255, + -0.05413122847676277, + -0.12320943921804428, + -0.0640324130654335, + -0.04640348255634308, + 0.011250918731093407, + -0.07948537915945053, + 0.007593377958983183, + 0.03566151484847069, + 0.013251551426947117, + 0.05462411046028137, + -0.028793226927518845, + 0.01981176808476448, + 0.05090990290045738, + 0.06517047435045242, + 0.01841190829873085, + -0.1290203332901001, + 0.0196949765086174, + 0.0073050870560109615, + 0.029632581397891045, + 0.047837406396865845, + -0.022116169333457947, + 0.04393791779875755, + 0.14046117663383484, + 0.04017089307308197, + -0.05090271681547165, + 0.06085523962974548, + 0.047485075891017914, + -0.06048053875565529, + -0.009504958055913448, + -0.0029562644194811583, + -0.019157810136675835, + -0.020955054089426994, + 0.10699652880430222, + 0.015047796070575714, + -0.03162265196442604, + -0.003773825941607356, + -0.006379327736794949, + -0.02259492129087448, + -0.039172567427158356, + -0.03541705384850502, + -0.02631019987165928, + 0.04135550186038017, + 0.023632211610674858, + -0.010892857797443867, + -0.0370229035615921, + 0.024737320840358734, + -0.03154825419187546, + 0.009463795460760593, + -0.052806172519922256, + -0.02705029956996441, + -0.03946391120553017, + 0.009689593687653542, + -0.04389646276831627, + 0.06582827866077423, + 0.0408187173306942, + 0.008897271007299423, + -0.06808342039585114, + -0.005568819120526314, + 0.02854752726852894, + -0.09684142470359802, + -0.0020819574128836393, + 0.0037411984521895647, + -0.03214259445667267, + 0.02043287828564644, + 0.025644805282354355, + -0.06106135994195938, + 0.054626986384391785, + -0.042766790837049484, + -0.030941486358642578, + 0.03161783143877983, + 0.023532601073384285, + 0.01513641607016325, + -0.04566654562950134, + -0.098955437541008, + 0.013866923749446869, + 0.042705196887254715, + -0.06457702070474625, + 0.0059195104986429214, + 0.030018063262104988, + 0.008317116647958755, + -0.036617908626794815, + -0.007984509691596031, + 0.0034960301127284765, + -0.0355348102748394, + 0.08715339004993439, + -0.05320737138390541, + 0.043556295335292816, + -0.009977439418435097, + -0.05462354049086571, + 0.018088415265083313, + -0.08066899329423904, + -0.031674113124608994, + 0.018222836777567863, + 0.047705285251140594, + -0.11215700209140778, + 0.009709063917398453, + -0.014690455980598927, + -0.00031382590532302856, + -0.010001042857766151, + -0.015778305009007454, + -0.008657842874526978, + -0.06569178402423859, + -0.04106181859970093, + -0.07239215821027756, + -0.0264374278485775, + -0.03945920243859291, + 0.007897313684225082, + -0.06793543696403503, + -0.02706964872777462, + 0.008016912266612053, + 0.03217436745762825, + 0.04435371235013008, + -0.09273311495780945, + -0.014239432290196419, + 0.04588089510798454, + -0.029641171917319298, + 0.04801453649997711, + 0.028102420270442963, + -0.041053496301174164, + 0.04099264740943909, + -0.020061006769537926, + -0.05948996543884277, + 0.028329623863101006, + 0.05356026813387871, + -0.1339828073978424, + 0.03183523193001747, + 0.04063316062092781, + -0.06726021319627762, + 0.07341201603412628, + -0.16125695407390594, + -0.040080536156892776, + 0.022957872599363327, + -0.0062933024019002914, + 0.03683321550488472, + 0.007304018829017878, + -0.02933444082736969, + -0.022679127752780914, + 0.005107872653752565, + -0.029977502301335335, + -0.004426880739629269, + -0.04625803977251053, + -0.01743447221815586, + -0.0464969277381897, + -0.10984612256288528, + 0.007491269614547491, + -0.04552454873919487, + -0.0013811876997351646, + 0.016381800174713135, + -0.07510838657617569, + 0.03706850856542587, + -0.06878402084112167, + 0.09896547347307205, + -0.03654446452856064, + 0.08149366080760956, + 0.04002750664949417, + 0.08065515756607056, + -0.027192696928977966, + -0.04022808372974396, + 0.020144201815128326, + -0.07413214445114136, + -0.010300585068762302, + 0.006279100198298693, + -0.05615796893835068, + -0.0019370535155758262, + -0.09266659617424011, + 0.025766920298337936, + -0.07226277887821198, + 0.009357654489576817, + -0.07671576738357544, + -0.037181612104177475, + 0.03418143093585968, + -0.027016883715987206, + 0.025881830602884293, + 0.011476525105535984, + 0.017548078671097755, + -0.0077001615427434444, + 0.05045963078737259, + -0.10106693208217621, + -0.10974548757076263, + 0.1600683331489563, + 0.023436646908521652, + 0.042146697640419006, + 0.10251763463020325, + -0.04332251474261284, + 0.11170297861099243, + -0.04360133409500122, + -0.024909527972340584, + 0.005018964875489473, + 0.018967404961586, + -0.011938455514609814, + 0.006434707436710596, + -0.004215696826577187, + 0.04706014692783356, + 0.04977819696068764, + 0.028114834800362587, + -0.05332447215914726, + -0.08680068701505661, + 0.004399196710437536, + 0.00041860525379888713, + 0.010579215362668037, + 0.028827155008912086, + -0.0016008787788450718, + -0.003770905314013362, + 0.02774237096309662, + -0.04213464632630348, + 0.05646880716085434, + 0.02067817561328411, + 0.039564091712236404, + 0.03295405954122543, + 0.07413716614246368, + 0.0012738772202283144, + -0.03566139563918114, + 0.015372633934020996, + -0.020117206498980522, + 0.08616413921117783, + -0.007662500254809856, + -0.09768418222665787, + -0.025586379691958427, + 0.10475053638219833, + 0.01832338608801365, + -0.051782261580228806, + 0.0010143631370738149, + 0.029876161366701126, + -0.03514533117413521, + -0.07534615695476532, + -0.03528827056288719, + -0.022103674709796906, + 0.07141080498695374, + -0.06718991696834564, + 0.022178590297698975, + 0.004428899846971035, + -0.07910066097974777, + 0.027018440887331963, + -0.02196909673511982, + -0.009854234755039215, + -0.12758766114711761, + 0.00032485928386449814, + 0.13802917301654816, + -0.05385074391961098, + -0.005936243571341038, + -0.017549416050314903, + -0.05493646860122681, + -0.047960348427295685, + -0.07576780766248703, + -0.011674131266772747, + 0.0004453658766578883, + 0.006700117606669664, + -0.08096279948949814, + 0.09600193798542023, + 0.12268830090761185, + -0.05676913261413574, + -0.03715287148952484, + -0.021753963083028793, + -0.019186746329069138, + -0.0403582789003849, + 0.014499095268547535, + 0.04421423748135567, + -0.08525583893060684, + -0.0741894319653511, + -0.02288356050848961, + 0.016668524593114853, + 0.07882894575595856, + 0.029720168560743332, + 0.025263387709856033, + 0.07420740276575089, + -0.034052371978759766, + 0.04624175280332565, + -0.10031282901763916, + 0.0167982317507267, + -0.023754164576530457, + -0.07777591794729233, + -0.02446010522544384, + 0.061058010905981064, + 0.05940721184015274, + 0.009616188704967499, + -0.010013721883296967, + 0.007791775744408369, + -0.020672190934419632, + -0.09781245142221451, + -0.04615814611315727, + 0.06525478512048721, + -0.0395856574177742, + -0.04023833945393562, + 0.07923253625631332 + ], + "index": 3, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/6841bb14fa8d.json b/tests/integration/recordings/responses/6841bb14fa8d.json new file mode 100644 index 000000000..69b4522e9 --- /dev/null +++ b/tests/integration/recordings/responses/6841bb14fa8d.json @@ -0,0 +1,61 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "Test trace openai with temperature 0" + } + ], + "max_tokens": 100, + "stream": false, + "temperature": 0.7 + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "oCfxEyX-4Yz4kd-984c2b58fd3f4d13", + "choices": [ + { + "finish_reason": "length", + "index": 0, + "logprobs": null, + "message": { + "content": "When using a language model like OpenAI with a temperature of 0, the model is essentially forced to produce the most likely next word in a sequence, given the context. This means that the output will be very deterministic and less diverse, as the model is not allowed to explore less likely options.\n\nHere's an example of how this could work in practice:\n\n**Prompt:** Write a short story about a character who discovers a hidden world.\n\n**Temperature 0 Response:**\nIn a small village nestled", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [] + }, + "seed": 9269366008132817000 + } + ], + "created": 1758820586, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 100, + "prompt_tokens": 43, + "total_tokens": 143, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + }, + "prompt": [] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/68e59155a09f.json b/tests/integration/recordings/responses/68e59155a09f.json new file mode 100644 index 000000000..89a294a9d --- /dev/null +++ b/tests/integration/recordings/responses/68e59155a09f.json @@ -0,0 +1,802 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": [ + "How does machine learning improve over time?" + ] + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.017091110348701477, + -0.04449904337525368, + 0.05639447644352913, + 0.02757648564875126, + -0.01052725501358509, + -0.023113058879971504, + 0.07145906239748001, + -0.02102668583393097, + -0.034163620322942734, + -0.04799016937613487, + 0.013283752836287022, + -0.018489355221390724, + -0.024232961237430573, + -0.039593327790498734, + -0.039129577577114105, + -0.06230281665921211, + -0.0054303002543747425, + 0.06882823258638382, + -0.013231862336397171, + 0.06959116458892822, + 0.003494634060189128, + 0.034262172877788544, + 0.03474000096321106, + 0.01021556369960308, + 0.062151506543159485, + -0.007965859957039356, + 0.016933385282754898, + -0.007620261516422033, + 0.03465918451547623, + -0.019624345004558563, + 0.026949048042297363, + 0.04594346135854721, + 0.030448030680418015, + -0.0062415460124611855, + 0.024632513523101807, + -0.009094628505408764, + 0.0068628196604549885, + 0.051083847880363464, + 0.025683417916297913, + 0.1110014095902443, + 0.048982519656419754, + 0.01494417805224657, + 0.02383127622306347, + -0.04119957238435745, + 0.04277747869491577, + -0.03204340860247612, + -0.012741178274154663, + -0.03751486539840698, + 0.056586142629384995, + 0.025235753506422043, + 0.01793726161122322, + 0.04099954292178154, + 0.07154829055070877, + 0.041061583906412125, + 0.06809084117412567, + -0.10853584855794907, + 0.08249932527542114, + 0.028061751276254654, + 0.0519598051905632, + -0.06860332190990448, + 0.004958455916494131, + -0.04448959231376648, + 0.09609439969062805, + -0.00619372446089983, + 0.007140932139009237, + 0.017792437225580215, + -0.01650928147137165, + 0.04542657360434532, + -0.006010851822793484, + 0.030694808810949326, + -0.0112632280215621, + -0.0159088633954525, + 0.029067715629935265, + 0.020537303760647774, + -0.036857571452856064, + -0.034286197274923325, + 0.010374762117862701, + 0.029303979128599167, + -0.026281535625457764, + -0.04053294658660889, + -0.007713824976235628, + 0.021145686507225037, + 0.0018956628628075123, + 0.009162032045423985, + -0.003967841621488333, + 0.005385218188166618, + 0.05180187523365021, + -0.01564045064151287, + 0.02468094415962696, + 4.1515566408634186e-05, + 0.015309401787817478, + 0.020134028047323227, + 0.02285873331129551, + -0.0030758781358599663, + 0.010366623289883137, + -0.12862254679203033, + 0.006405234336853027, + -0.00285987532697618, + -0.038957152515649796, + -0.0348617248237133, + -0.04436873272061348, + -0.024569036439061165, + -0.001334832631982863, + -0.01130272913724184, + 0.01797942817211151, + 0.047239724546670914, + 0.1354702264070511, + 0.05538365989923477, + 0.08639367669820786, + 0.011921187862753868, + -0.03216652572154999, + -0.05481015145778656, + 0.026179000735282898, + -0.08212552964687347, + -0.039176810532808304, + 0.0118326460942626, + -0.06838254630565643, + -0.02987653948366642, + -0.0341634601354599, + -0.0033300842624157667, + 0.04591712728142738, + 0.010237805545330048, + 0.033510755747556686, + -0.020220739766955376, + -0.008218149654567242, + 0.07410414516925812, + -0.07220402359962463, + 0.0043516866862773895, + 0.01174078043550253, + -0.004125840030610561, + -0.07815736532211304, + -0.030600078403949738, + -0.014574045315384865, + 0.009469592943787575, + 0.04217822849750519, + -0.05271849408745766, + 0.00037768480251543224, + 0.02528710477054119, + 0.04988700896501541, + 0.013128949329257011, + -0.009709068574011326, + 0.03833962604403496, + -0.004430458880960941, + -0.053310297429561615, + -0.05913899093866348, + -0.06092122197151184, + 0.03597554191946983, + 0.04806441441178322, + 0.014519140124320984, + 0.016532888635993004, + -0.02772163413465023, + 0.02643187716603279, + 0.054130520671606064, + 0.011015541851520538, + 0.010168751701712608, + 0.13184048235416412, + 0.017429586499929428, + -0.09562039375305176, + 0.004120356403291225, + 0.06979147344827652, + 0.01747124269604683, + 0.06685646623373032, + -0.02079174295067787, + -0.1065840870141983, + 0.003666015574708581, + -0.024378009140491486, + -0.018714547157287598, + -0.03100505657494068, + 0.023656615987420082, + 0.04414339363574982, + 0.008101040497422218, + -0.05081212520599365, + -0.028254367411136627, + -0.025158686563372612, + -0.01060985866934061, + -0.020752916112542152, + 0.05147681012749672, + 0.059838782995939255, + 0.015253720805048943, + -0.04351024329662323, + -0.02900739014148712, + 0.10752008110284805, + 0.015021839179098606, + 0.028819581493735313, + 0.04401375353336334, + 0.0011900285026058555, + -0.032843537628650665, + -0.04667872190475464, + 0.023874200880527496, + -0.026197509840130806, + 0.043272413313388824, + -0.04376351833343506, + -0.0036660165060311556, + 0.012742334045469761, + -0.02043633721768856, + 0.0056346505880355835, + 0.06811652332544327, + 0.0940936729311943, + 0.0005089789046905935, + -0.047517020255327225, + 0.03845725208520889, + -0.0416039377450943, + 0.011346561834216118, + 0.0327879935503006, + 0.018543416634202003, + 0.014663814567029476, + 0.03528588265180588, + -0.06245756149291992, + -0.060102980583906174, + 0.06862425059080124, + -0.04480714723467827, + 0.01673327572643757, + -0.013742557726800442, + 0.015649832785129547, + -0.05052841082215309, + 0.014181524515151978, + -0.011470867320895195, + -0.0913846418261528, + -0.01337501686066389, + 0.01687346026301384, + 0.011097698472440243, + 0.03340581804513931, + 0.07328605651855469, + -0.04521005228161812, + -0.014341622591018677, + -0.022116083651781082, + 0.019846217706799507, + -0.03134879842400551, + -0.025689005851745605, + -0.016337616369128227, + -0.009400046430528164, + 0.04813038557767868, + 0.09310487657785416, + -0.023314738646149635, + 0.0449095144867897, + 0.028920302167534828, + 0.03279547765851021, + 0.09780041873455048, + 0.042382802814245224, + -0.027986818924546242, + 0.018036792054772377, + 0.060797013342380524, + 0.029210783541202545, + 0.01824144832789898, + -0.0032405515667051077, + -0.061704110354185104, + 0.032816603779792786, + 0.07891224324703217, + 0.05889542028307915, + -0.0357075110077858, + 0.07179951667785645, + -0.009799567051231861, + 0.040095265954732895, + -0.010397388599812984, + -0.030199842527508736, + 0.0723610669374466, + 0.033793553709983826, + -0.050370991230010986, + -0.019451666623353958, + -0.059583477675914764, + -0.03205019608139992, + -0.008078041486442089, + 0.04325846955180168, + 0.005131071899086237, + -0.01694042980670929, + 0.12373893707990646, + -0.026953179389238358, + 0.08760038018226624, + -0.06059237942099571, + 0.036282479763031006, + 0.02045135386288166, + 0.03446183726191521, + 0.0672442838549614, + -0.03471960127353668, + -0.032043203711509705, + -0.01461110357195139, + -0.02886907011270523, + -0.00020732730627059937, + -0.03269560635089874, + 0.035647809505462646, + -0.019755830988287926, + -0.06200911104679108, + -0.02908874861896038, + 0.01128445751965046, + -0.022167179733514786, + 0.028986983001232147, + 0.03478562831878662, + -0.07198591530323029, + 0.021145109087228775, + 0.00676864106208086, + -0.009777943603694439, + -0.005817399825900793, + 0.012331933714449406, + 0.04287122189998627, + 0.007338544819504023, + -0.014030798338353634, + -0.02205159328877926, + -0.06498151272535324, + 0.0261244997382164, + -0.0016652516787871718, + -0.0012416461249813437, + -0.035079214721918106, + -0.04478784278035164, + 0.017631616443395615, + -0.03870261088013649, + -0.03700083866715431, + -0.03991252928972244, + 0.015349914319813251, + 0.027670124545693398, + -0.02155459113419056, + -0.061771076172590256, + 0.048039596527814865, + 0.020471401512622833, + 0.0814017578959465, + 0.012351211160421371, + -0.024866415187716484, + 0.03714727610349655, + 0.008872346952557564, + 0.04749113693833351, + -0.041523903608322144, + -0.05398213118314743, + 0.024968266487121582, + 0.0023721077013760805, + 0.03205203264951706, + 0.060478370636701584, + -0.057236168533563614, + 0.0046795508824288845, + 0.008967110887169838, + 0.05300765857100487, + 0.04545370489358902, + -0.041764918714761734, + 0.04538821801543236, + 0.017682619392871857, + 0.01751590333878994, + -0.041763801127672195, + -0.030938314273953438, + -0.02912597917020321, + -0.03287437558174133, + 0.05978328734636307, + -0.018110038712620735, + 0.10227105766534805, + -0.005680157337337732, + -0.03592002019286156, + 0.04470396786928177, + 0.058497779071331024, + -0.06304245442152023, + -0.05310345068573952, + 0.01905088871717453, + -0.0435650460422039, + 0.015648307278752327, + 0.010627292096614838, + 0.01209987048059702, + 0.02780025638639927, + -0.0659174993634224, + -0.02292121760547161, + -0.014478329569101334, + 0.027907969430088997, + 0.08582334965467453, + 0.05156566947698593, + 0.020003266632556915, + 0.00862419418990612, + 0.011991214007139206, + -0.057063665241003036, + 0.027426088228821754, + 0.010678093880414963, + -0.006323543842881918, + 0.026447616517543793, + -0.011029284447431564, + 0.005789259914308786, + -0.062225647270679474, + 0.002817378379404545, + 0.037070125341415405, + 0.05859753489494324, + -0.032734066247940063, + 0.0049278102815151215, + 0.005655582528561354, + 0.03440752252936363, + -0.04887422174215317, + 0.014217632822692394, + 0.03378811478614807, + 0.01143213827162981, + -0.0046334643848240376, + 0.008702044375240803, + -0.018078800290822983, + 0.02679763175547123, + 0.009265614673495293, + 0.006912717595696449, + 0.039455097168684006, + 0.08224938809871674, + -0.018994906917214394, + -0.011511171236634254, + 0.013095312751829624, + -0.01595144346356392, + 0.08322206139564514, + 0.0019320690771564841, + 0.09676595777273178, + 0.028369352221488953, + -0.006265261210501194, + -0.04760407656431198, + -0.07077552378177643, + 0.026524502784013748, + -0.045876167714595795, + -0.004767959006130695, + 0.09427748620510101, + 0.0010587290162220597, + 0.029367605224251747, + 0.04943876713514328, + -0.020956382155418396, + 0.011755046434700489, + -0.042785175144672394, + 0.05108770355582237, + -0.010644905269145966, + 0.051502931863069534, + 0.001376797561533749, + -0.02364213950932026, + 0.08517570048570633, + -0.05029089003801346, + 0.009807859547436237, + -0.015292741358280182, + -0.0477706678211689, + -0.03883887082338333, + 0.06258878856897354, + 0.029050428420305252, + 0.027633827179670334, + 0.01516599953174591, + -0.02382349781692028, + -0.04220383241772652, + 0.04617023095488548, + 0.03496578335762024, + -0.018243463709950447, + -0.0061411671340465546, + -0.005748555064201355, + 0.010852155275642872, + -0.010470863431692123, + -0.0401528999209404, + 0.011642354540526867, + -0.05758778378367424, + 0.04819398745894432, + 0.05960371717810631, + 0.0022469316609203815, + -0.001131345983594656, + 0.024024616926908493, + -0.025609636679291725, + 0.04534421116113663, + 0.020421037450432777, + 0.027833566069602966, + 0.0455608069896698, + 0.03330197185277939, + 0.09832030534744263, + -0.01626313105225563, + 0.01641569286584854, + 0.01554944645613432, + -0.013866779394447803, + -0.0638241097331047, + 0.047895193099975586, + 0.042961131781339645, + -0.03384869173169136, + -0.01620139367878437, + 0.08863108605146408, + 0.08185242116451263, + -0.05600340664386749, + -0.006179805379360914, + -0.046521030366420746, + 0.005049159750342369, + -0.03982756659388542, + 0.0018144379137083888, + -0.03435543552041054, + 0.01273403875529766, + 0.008960560895502567, + -0.04060171917080879, + 0.04573140665888786, + -0.018866222351789474, + -0.019972296431660652, + 0.0006385938613675535, + -0.040912169963121414, + 0.04912850633263588, + 0.021389227360486984, + 0.07629404962062836, + 0.07529498636722565, + -0.03599211201071739, + -0.07396151125431061, + -0.06263993680477142, + 0.035700149834156036, + 0.019643796607851982, + -0.014971467666327953, + -0.0449487641453743, + 0.05629347264766693, + 0.002529916586354375, + -0.028406130149960518, + 0.01962902769446373, + 0.021758396178483963, + -0.03318168967962265, + -0.022369498386979103, + -0.039087750017642975, + 0.04942493140697479, + -0.045022908598184586, + -0.0295136459171772, + -0.007183917332440615, + -0.05010795593261719, + 0.0014038635417819023, + -0.04356252774596214, + 0.04660043120384216, + 0.012791723944246769, + 0.01044919341802597, + -0.007226443849503994, + 0.009700221009552479, + 0.04041241481900215, + -0.013270650990307331, + -0.09328791499137878, + -0.04580668732523918, + -0.023542804643511772, + -0.04105115681886673, + 0.01962345279753208, + -0.0022925573866814375, + 0.016483748331665993, + -0.00046286170254461467, + 0.04518749564886093, + 0.03264132887125015, + 0.021030215546488762, + 0.000606459507253021, + 0.018279610201716423, + -0.051501113921403885, + -0.006836078595370054, + 0.0223738644272089, + -0.03288864716887474, + -0.013056786730885506, + 0.03506845235824585, + -0.06893748044967651, + 0.04185912758111954, + -0.059009850025177, + 0.025614604353904724, + -0.13203828036785126, + -0.0230705589056015, + 0.06457994133234024, + -0.03621802479028702, + -0.06727005541324615, + -0.007084821816533804, + 0.005194725468754768, + -0.04151730239391327, + -0.01337746437638998, + 0.007726626470685005, + 0.001198339625261724, + 0.0858355388045311, + -0.04361525923013687, + 0.029421508312225342, + 0.04561106860637665, + 0.04970911517739296, + 0.0021197511814534664, + 0.034886427223682404, + -0.0027102481108158827, + 0.026148471981287003, + -0.005215228535234928, + 0.03527367115020752, + 0.02213597670197487, + 0.006383026950061321, + 0.032270703464746475, + 0.01586599461734295, + -0.016247956082224846, + -0.016213105991482735, + -0.04151308164000511, + 0.061050400137901306, + 0.003419628133997321, + 0.04371068999171257, + -0.003939187154173851, + 0.008316335268318653, + 0.08146052062511444, + 0.02038543112576008, + 0.004892616532742977, + -0.017641207203269005, + -0.04877929389476776, + -0.014308643527328968, + -0.05225956812500954, + 0.01678878627717495, + -0.022617461159825325, + 0.10803868621587753, + 0.004787782672792673, + 0.005488952621817589, + 0.044927410781383514, + -0.0386410690844059, + 0.033641163259744644, + -0.012488718144595623, + 0.017685825005173683, + -0.019066687673330307, + -0.0044423723593354225, + -0.003003643127158284, + -0.046191710978746414, + 0.07452407479286194, + 0.039803750813007355, + -0.07293923199176788, + 0.009332723915576935, + 0.01869172789156437, + 0.006781427655369043, + -0.11368958652019501, + -0.009038697928190231, + 0.002026599831879139, + -0.0118027338758111, + -0.021069113165140152, + -0.012110181152820587, + -0.03503252565860748, + 0.04110250622034073, + 0.07244168221950531, + 0.010852963663637638, + 0.08984149992465973, + -0.027278605848550797, + -0.05750814825296402, + -0.06634411960840225, + -0.05021825432777405, + 0.016627361997961998, + 0.07608447223901749, + -0.006877075415104628, + 0.07241521030664444, + -0.08503241091966629, + -0.0015347690787166357, + -0.11855384707450867, + -0.02338363230228424, + 0.018290942534804344, + -0.06323908269405365, + -0.03858431428670883, + 0.0205442663282156, + 0.03796859830617905, + 0.020063228905200958, + 0.10658621788024902, + 0.035441286861896515, + 0.04583656042814255, + 0.04527920112013817, + -0.019515255466103554, + -0.10461927205324173, + 0.0038011830765753984, + -0.03096143901348114, + 0.03559565171599388, + -0.03741271421313286, + 0.013590610586106777, + 0.03363044559955597, + -0.028492426499724388, + -0.020304789766669273, + 0.0672440156340599, + -0.030570613220334053, + 0.05294065922498703, + 0.06384581327438354, + -0.004913600627332926, + -0.02157355658710003, + 0.026991942897439003, + -0.04970087110996246, + -0.01489020325243473, + 0.02735202945768833, + -0.0607466921210289, + -0.03535424917936325, + 0.02796528860926628, + 0.022950729355216026, + 0.04059499129652977, + 0.01365773193538189, + -0.0333610475063324, + 0.002045154571533203, + 0.05155564472079277, + -0.0031054376158863306, + 0.014623484574258327, + -0.06419086456298828, + -0.028253614902496338, + -0.02575419843196869, + 0.018699679523706436, + 0.05331188067793846, + -0.04458363726735115, + -0.04462023079395294, + -0.012874887324869633, + -0.009783362038433552, + -0.06447328627109528, + 0.027755791321396828, + -0.12949828803539276, + 0.013976480811834335, + -0.04830870404839516, + -0.07408348470926285, + -0.015234938822686672, + 0.03581376001238823, + -0.016954004764556885, + -0.010194940492510796, + 0.05199551209807396, + -0.04343723878264427, + -0.04505506902933121, + -0.026876715943217278, + -0.030063798651099205, + -0.0346873477101326, + 0.006097136996686459, + -0.031271882355213165, + -0.00029016193002462387, + -0.030612265691161156, + 0.05608702823519707, + 0.028940780088305473, + 0.0013379148440435529, + -0.0028184913098812103, + 0.021562576293945312, + -0.05187350884079933, + -0.04708464816212654, + -0.026602864265441895, + -0.025108829140663147, + -0.02762826532125473, + 0.04280998557806015, + -0.041647735983133316, + -0.009514877572655678, + 0.08883954584598541, + 0.01176463533192873, + 0.04458681866526604, + -0.06837990134954453, + 0.01112907100468874, + -0.061027880758047104, + -0.009307433851063251, + -0.027127249166369438, + -0.06876770406961441, + -0.108445905148983, + 0.02236987091600895, + -0.0412885956466198, + 0.009982330724596977, + 0.009275197982788086, + -0.019888408482074738, + 0.019699621945619583, + 0.008489453233778477, + -0.08368164300918579, + -0.06844163686037064, + 0.05367731302976608, + -0.030020998790860176, + 0.014990454539656639, + -0.054819319397211075, + -0.049916017800569534, + -0.023731136694550514, + -0.01989864930510521, + 0.0432029664516449, + -0.042317938059568405, + 0.009375320747494698, + 0.026804260909557343, + -0.018950626254081726, + -0.0015483262250199914, + 0.0028166286647319794, + 0.023358885198831558, + 0.0003610998101066798, + -0.02653382159769535, + -0.030427517369389534, + -0.0759892538189888, + -0.042637135833501816, + 0.014194052666425705, + -0.03227793797850609, + -0.024946041405200958, + -0.010455182753503323, + -0.03190105780959129, + 0.03781573101878166, + 0.03388536721467972, + 0.00973279494792223, + -0.01576327346265316, + -0.015895653516054153, + 0.04316965118050575, + 0.023514561355113983, + 0.03888101503252983, + 0.020031088963150978, + 0.08280724287033081, + -0.009437857195734978, + 0.06786453723907471, + -0.023869356140494347, + -0.002570996293798089, + 0.011280098930001259, + 0.03462803363800049, + -0.005325067788362503, + 0.032147448509931564, + -0.016798241063952446, + 0.04545372352004051, + -0.026565302163362503, + -0.0513574555516243, + 0.03857620060443878, + 0.023602399975061417, + -0.018047289922833443, + 0.06904193758964539 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/69464dfd3a06.json b/tests/integration/recordings/responses/69464dfd3a06.json new file mode 100644 index 000000000..cd7461180 --- /dev/null +++ b/tests/integration/recordings/responses/69464dfd3a06.json @@ -0,0 +1,59 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "Test trace openai 0" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "oCfx5VY-4Yz4kd-984c2a91a8fd8f78", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "This conversation has just begun. I'm happy to chat with you, but I don't have any prior context or information to work with. What would you like to talk about?", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [] + }, + "seed": 5588230703258962000 + } + ], + "created": 1758820554, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 37, + "prompt_tokens": 41, + "total_tokens": 78, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + }, + "prompt": [] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/7550dd0d24bc.json b/tests/integration/recordings/responses/7550dd0d24bc.json new file mode 100644 index 000000000..c9ef94783 --- /dev/null +++ b/tests/integration/recordings/responses/7550dd0d24bc.json @@ -0,0 +1,166 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "Message A: What is the capital of France?" + }, + { + "role": "assistant", + "content": "The capital of France is Paris." + }, + { + "role": "user", + "content": "Message B: What about Spain?" + }, + { + "role": "assistant", + "content": "The capital of Spain is Madrid." + }, + { + "role": "user", + "content": "Message C: And Italy?" + } + ], + "response_format": { + "type": "text" + }, + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfv2aN-4Yz4kd-984c20cb7a8c8fa8", + "choices": [ + { + "delta": { + "content": "[", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 58 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "[", + "seed": null + } + ], + "created": 1758820154, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfv2aN-4Yz4kd-984c20cb7a8c8fa8", + "choices": [ + { + "delta": { + "content": "1", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 16 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "1", + "seed": null + } + ], + "created": 1758820154, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfv2aN-4Yz4kd-984c20cb7a8c8fa8", + "choices": [ + { + "delta": { + "content": "]", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 60 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "]", + "seed": null + } + ], + "created": 1758820154, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfv2aN-4Yz4kd-984c20cb7a8c8fa8", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 128009 + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "text": "", + "seed": 9314001608812126000 + } + ], + "created": 1758820154, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 4, + "prompt_tokens": 92, + "total_tokens": 96, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/8e5b53b9d493.json b/tests/integration/recordings/responses/8e5b53b9d493.json new file mode 100644 index 000000000..1688aab2f --- /dev/null +++ b/tests/integration/recordings/responses/8e5b53b9d493.json @@ -0,0 +1,801 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": "Test encoding format", + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.011256923, + 0.0037174695, + 0.047607094, + -0.03605117, + 0.022678856, + 0.0022196341, + 0.008172763, + -0.07876377, + -0.012652523, + -0.124776885, + -0.07201225, + 0.011470616, + 0.020233244, + -0.03953407, + 0.017867543, + -0.07615726, + 0.015161683, + 0.01493531, + 0.0021282644, + 0.02805457, + 0.0008320583, + 0.022922216, + 0.049158294, + -0.03197842, + 0.020910429, + 0.03798574, + 0.032469492, + 0.009267314, + 0.0883011, + 0.0032435523, + 0.013633923, + 0.0457091, + -0.022143621, + -0.0007423012, + -0.03613117, + 0.052107, + 0.02962152, + 0.045084383, + 0.044733327, + 0.11753868, + 0.05730107, + 0.026509244, + -0.056454167, + -0.017637681, + 0.030301955, + 0.04790331, + -0.025398305, + -0.019705286, + 0.11366949, + 0.05800383, + -0.0072742635, + 0.100181706, + 0.1609472, + 0.0053162435, + 0.01714287, + -0.023215268, + 0.042824704, + 0.04082185, + 0.030668061, + -0.06529372, + 0.008288249, + 0.0325246, + 0.009664108, + -0.031153189, + 0.044064675, + 0.10059426, + 0.036557477, + 0.009674479, + 0.016028037, + 0.02236809, + 0.056538712, + -0.12828006, + 0.016760435, + 0.015355689, + -0.00070172164, + -0.0076741586, + -0.02880062, + -0.011680436, + -0.036522433, + -0.030315956, + 0.023295958, + 0.031333964, + 0.042397793, + -0.063102156, + 0.0669075, + -0.07678097, + 0.0616129, + -0.0071245604, + -0.021313114, + 0.0040440215, + 0.04436404, + 0.05289292, + 0.05803014, + 0.032691576, + 0.037537806, + -0.09712317, + -0.0061692744, + 0.008186577, + -0.0151672475, + -0.05499382, + -0.11011894, + -0.017255861, + 0.061501417, + 0.03551128, + 0.056205165, + 0.07500363, + 0.023062926, + 0.10787879, + 0.063290246, + -0.021196125, + -0.005724647, + 0.019805718, + -0.0063712946, + -0.049270064, + -0.024442751, + 0.018587058, + -0.082689136, + -0.019034613, + 0.005483609, + 0.03418548, + -0.008317338, + 0.06888298, + -0.037655607, + -0.05362105, + -0.010807861, + 0.069666155, + -0.01777964, + -0.015136251, + -0.026567455, + -0.08084807, + -0.078372054, + 0.039493512, + 0.013156698, + 0.07340631, + 0.12035369, + -0.05765069, + 0.025966862, + -0.0045753582, + -0.030865112, + 0.039448086, + -0.037273232, + 0.047059145, + -0.029127738, + -0.024217308, + 0.02748501, + -0.048555836, + 0.017913114, + -0.055981673, + -0.005601368, + -0.04045025, + -0.017308103, + 0.06272273, + 0.012256746, + 0.01575095, + -0.026737463, + 0.04115108, + 0.07562276, + -0.01140116, + 0.022552952, + 0.0443809, + -0.030472409, + -0.021670958, + -0.037897367, + 0.017250286, + -0.033001736, + -0.048738975, + -0.06429833, + -0.015412785, + 0.0036735258, + 0.023700202, + 0.035861194, + -0.05393875, + 0.048050668, + 0.032297045, + 0.021352977, + -0.05701748, + 0.0008330949, + -0.006661303, + -0.0070953164, + -0.043984424, + 0.052504774, + 0.027689766, + 0.031661708, + -0.050054867, + -0.015419155, + -0.013700429, + -0.03579233, + -0.08926211, + -0.034341693, + -0.01738188, + -0.0065487004, + -0.051955026, + 0.0019674778, + 0.0015172043, + 0.024915336, + 0.010987228, + 0.061529815, + 0.09077649, + 0.04394813, + -0.07503514, + 0.043345768, + -0.028357483, + 0.06312762, + 0.025069924, + 0.028561853, + 0.043048594, + 0.017411513, + -0.025240859, + -0.0056393985, + 0.054039005, + 0.008721963, + -0.039967448, + 0.0012871448, + 0.0052062417, + 0.005563228, + 0.042596456, + -0.008794862, + -0.044669237, + 0.04184779, + 0.008726271, + 0.10136058, + 0.040724736, + 0.14168875, + -0.017516509, + -0.11203568, + 0.0010548063, + -0.058536656, + 0.01673066, + 0.007502946, + -0.035662595, + 0.034719367, + -0.0060368567, + 0.13295838, + 0.026423598, + 0.056147255, + 0.04473965, + 0.045232397, + 0.07171366, + 0.009358642, + -0.021109166, + 0.033915937, + 0.0380073, + -0.01451498, + -0.021589639, + 0.062518574, + -0.017531183, + -0.030811403, + 0.024500312, + 0.05383414, + -0.1335839, + 0.01834579, + -0.051048376, + 0.07460228, + 0.03231806, + 0.00962887, + 0.05156732, + 0.016169788, + 0.0062234807, + -0.09062714, + -0.08959952, + 0.025153147, + -0.030351512, + -0.04339584, + 0.007234872, + 0.014588551, + 0.022614833, + -0.08844599, + -0.009002514, + -0.114522785, + 0.08118862, + -0.03023919, + 0.007820294, + 0.043863248, + -0.043678157, + -0.036323708, + 0.006777855, + -0.019326974, + -0.0664114, + -0.019019991, + 0.073445216, + -0.039277073, + -0.0157583, + -0.01931436, + -0.027121417, + -0.028259363, + -0.107222356, + 0.11150329, + -0.012612926, + -0.025338905, + 0.029330198, + 0.011753977, + 0.009784897, + 0.042475123, + -0.004051051, + -0.014803267, + -0.04530689, + -0.01848677, + -0.050840423, + 0.01814009, + 0.0051442874, + -0.033988528, + 0.0033705293, + -0.05515113, + -0.023601055, + -0.06183089, + 0.012501645, + -0.08027637, + 0.022573682, + 0.079796925, + -0.00926268, + -0.02180816, + 0.0059841494, + -0.018863965, + -0.011257763, + 0.055679787, + -0.018714463, + -0.04081558, + -0.017017504, + 0.026006198, + -0.03687599, + -0.05399378, + 0.042955294, + 0.00079697353, + -0.0015601065, + 0.026138263, + -0.01198548, + 0.07594801, + -0.0049053924, + -0.001241132, + 0.022863775, + 0.025632044, + -0.023908222, + -0.02252925, + 0.042020634, + -0.060588334, + 0.05498828, + -0.03466166, + 0.003202133, + -0.015508297, + -0.021138275, + 0.007791096, + 0.052594397, + -0.08649948, + 0.038542755, + 0.011088168, + 0.049710445, + -0.015898548, + 0.013559725, + -0.0012927915, + -0.078937665, + -0.0470789, + 0.02421941, + 0.0050838543, + -0.051634457, + 0.014016644, + 0.059073824, + -0.01279741, + 0.006315097, + 0.028651753, + -0.023221422, + -0.049021006, + -0.08123552, + -0.027243393, + -0.026543872, + 0.040068373, + 0.01465917, + 0.01366034, + -0.07191417, + -0.007906117, + -0.06743931, + -0.040284913, + 0.046346053, + -0.015108051, + -0.067285545, + 0.020757562, + -0.03144588, + -0.02684228, + -0.030008601, + 0.0008360872, + -0.012667347, + -0.0782403, + 0.02436115, + -0.054881096, + -0.010856299, + -0.07653927, + -0.044655506, + -0.02075821, + 0.023765713, + 0.0083463555, + 0.026002545, + -0.003060633, + 0.060491852, + 0.032562606, + 0.029937308, + -0.022013078, + 0.07388013, + 0.017152807, + -0.07095613, + -0.03923808, + 0.0017680842, + 0.0038672008, + -0.053012144, + -0.016951663, + 0.027642388, + 0.016483316, + -0.015618807, + -0.11136081, + 0.006826955, + -0.010586094, + -0.05052998, + -0.04226535, + -0.031801827, + -0.020531418, + -0.06278464, + -0.062224947, + 0.0769673, + -0.0706861, + 0.026174366, + -0.041260213, + 0.058052614, + -0.046227556, + -0.05443509, + 0.007650712, + -0.061986744, + -0.00546975, + -0.042977307, + -0.0147894155, + 0.045748055, + -0.01602859, + 0.018538997, + 0.073324144, + -0.105757244, + -0.010215157, + 0.0069961487, + -0.010474333, + 0.007267861, + -0.043416463, + 0.04171331, + 0.012246647, + -0.024870023, + 0.0067938967, + 0.023995718, + 0.037606664, + -0.034879085, + 0.107255146, + 0.019311333, + 0.008084773, + 0.015113109, + 0.04807634, + -0.011898967, + 0.0028230203, + 0.004201883, + -0.019952193, + -0.083809994, + 0.025964422, + 0.010652608, + 0.021981532, + -0.029947964, + 0.10096241, + -0.0018155909, + -0.078443065, + 0.035357803, + 0.030101022, + 0.08652985, + -0.020698488, + 0.06619985, + 0.011043828, + 0.022531942, + 0.059432585, + -0.08669654, + 0.023926888, + 0.006353244, + -0.046637908, + -0.072916985, + -0.04355625, + -0.010734682, + -0.06298886, + 0.11202974, + -0.008399903, + 0.04045217, + -0.049840588, + -0.051897135, + 0.04921834, + 0.018730633, + 0.07189677, + -0.020521715, + 0.10433443, + -0.0035553537, + 0.015335822, + -0.03326729, + -0.05246277, + -0.038786076, + 0.04000599, + -0.028919725, + -0.017996594, + -0.007428113, + -0.003258321, + 0.0127034895, + -0.0062633064, + 0.0007574967, + -0.060385525, + -0.018971093, + 0.062526286, + -0.025764955, + 0.05286283, + 0.043842334, + 0.044092383, + -0.037126385, + -0.018775577, + 0.007996275, + -0.00028039515, + -0.06591952, + 0.039109394, + 0.022268493, + 0.033030964, + 0.010780152, + 0.051087722, + -0.07398754, + 0.02156791, + -0.03391487, + 0.01900175, + -0.03438655, + -0.050286565, + -0.029407075, + 0.013486627, + 0.006069821, + 0.03566702, + -0.046612754, + 0.030740444, + -0.0637836, + 0.020758858, + 0.013579259, + 0.015677635, + 0.07067559, + -0.03354964, + -0.09833861, + -0.045598283, + 0.046094477, + -0.018735003, + 0.0013117951, + 0.020225674, + -0.025771514, + -0.011772435, + 0.020403381, + 0.048393097, + -0.001137191, + -0.008214463, + -0.024194324, + 0.012559411, + 0.028170707, + -0.038262583, + -0.010594243, + 0.008866333, + 0.02652175, + 0.010765866, + 0.02152175, + 0.007194773, + -0.021046689, + -0.047594506, + -0.05342931, + 0.044459403, + -0.00075621146, + 0.021768885, + 0.061362576, + 0.03243972, + 0.023200674, + 0.012056035, + -0.010374278, + -0.06796502, + -0.0056832493, + 0.048799623, + -0.035878677, + -0.020508701, + 0.03527651, + 0.096402384, + -0.027735645, + 0.11728837, + 0.022490505, + -0.08394513, + -0.010033967, + 0.024851669, + -0.019062884, + 0.00039440763, + -0.10133529, + 0.011722217, + -0.04434193, + -0.030069547, + 0.030103652, + -0.017366616, + 0.046203658, + -0.04393208, + -0.05095759, + -0.04554081, + -0.029142734, + 0.01689045, + 0.008356038, + -0.035321265, + -0.02382173, + -0.0015672153, + 0.06304823, + -0.008137697, + -0.014463008, + 0.045292154, + -0.06497864, + 0.015265712, + 0.008239593, + -0.08195689, + 0.037012544, + 0.04680898, + 0.007484248, + 0.02335733, + -0.06787198, + -0.062197443, + -0.06841327, + -0.039720036, + -0.0105394935, + -0.057220835, + -0.039479975, + 0.029730098, + 0.0697698, + 0.0280752, + 0.0137115335, + -0.0045632124, + -0.01313052, + 0.07553262, + -0.04117193, + -0.14872926, + 0.028015105, + -0.047134113, + -0.016151398, + -0.081647106, + -0.02221662, + -0.036281105, + -0.023036504, + 0.0612415, + -0.018361837, + -0.0238258, + -0.0022532772, + 0.1537845, + 0.006872191, + -0.044352733, + -0.0026320857, + -0.08600976, + 0.005572628, + 0.053448226, + -0.015072955, + -0.029777542, + -0.019132927, + 0.053970527, + 0.005238485, + -0.02418231, + -0.12369688, + 0.0014781327, + 0.059662092, + -0.011181213, + 0.01400666, + 0.023866476, + -0.059490796, + -0.054530527, + -0.011234197, + 0.013823349, + -0.012150345, + -0.09948839, + 0.023659766, + 0.014326883, + -0.02229736, + -0.0024076505, + -0.10091382, + 0.08174192, + -0.024408998, + -0.023222951, + 0.011201234, + 0.013236311, + 0.04317295, + 0.051764306, + 0.07648576, + -0.00061111146, + -0.088623054, + -0.037177067, + 0.038964123, + -0.029959839, + 0.033466227, + -0.08635276, + 0.04128183, + -0.020397836, + 0.056285754, + -0.02570748, + 0.05911732, + 0.0061064134, + -0.01733281, + -0.0875996, + -0.0127257295, + -0.013593507, + -0.04925175, + 0.01888016, + -0.032455195, + -0.023753202, + 0.052025676, + 0.06000905, + 0.04137704, + 0.004952635, + -0.02542677, + 0.00017748028, + -0.041987997, + 0.04760188, + 0.068178274, + -0.060950078, + -0.05742421, + 0.054274186, + -0.048096504, + 0.034568857, + 0.0012921172, + 0.0705816, + -0.014679933, + -0.001761971, + -0.029119784, + 0.008006632, + 0.018063113, + -0.05880496, + -0.052486468, + 0.010976936, + 0.03688557, + 0.061141517, + -0.009467033, + -0.035062946, + -0.06794524, + -0.0609979, + 0.015924038, + -0.03805085, + 0.03977454, + -0.015656536, + 0.014254484, + -0.030620195, + -0.038830906, + -0.013730216, + -0.070247106, + -0.074514836, + 0.037831023, + 0.027780455, + 0.0073002693, + -0.050368425, + 0.040389538, + 0.035920046, + 0.025425838, + 0.006255748, + -0.017454483, + -0.02307413, + 0.05788845, + 0.018672187, + 0.033335716, + 0.01855402, + 0.07957198, + -0.0029801806, + -0.057038378, + 0.010123766, + 0.038190138, + 0.0333764, + 0.075057626, + 0.00592374, + 0.06380629, + -0.028154025, + 0.07188246, + -0.056649268, + -0.019166004, + 0.053392358, + 0.13961181, + -0.08459373, + 0.03255955 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/a0ec01643fa2.json b/tests/integration/recordings/responses/a0ec01643fa2.json new file mode 100644 index 000000000..cba4a4fe2 --- /dev/null +++ b/tests/integration/recordings/responses/a0ec01643fa2.json @@ -0,0 +1,59 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "Test trace openai 1" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "oCfx8Zn-4Yz4kd-984c2ad25ac84cee", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "This conversation has just begun. I'm happy to chat with you. Is there something I can help you with or would you like to test something with me?", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [] + }, + "seed": 2693830755697369600 + } + ], + "created": 1758820564, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 33, + "prompt_tokens": 41, + "total_tokens": 74, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + }, + "prompt": [] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/ae82d694f34c.json b/tests/integration/recordings/responses/ae82d694f34c.json new file mode 100644 index 000000000..aa6bc34c5 --- /dev/null +++ b/tests/integration/recordings/responses/ae82d694f34c.json @@ -0,0 +1,802 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": [ + "What makes Python different from C++ and Java?" + ] + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.02517327293753624, + -0.05927547067403793, + -0.02752850204706192, + -0.03190239518880844, + 0.05084673687815666, + 0.007633775472640991, + 0.00997336208820343, + 0.016745490953326225, + -0.06594915688037872, + 0.024146223440766335, + 0.0005385297699831426, + -0.0006894826656207442, + -0.008592012338340282, + 0.008223236538469791, + 0.03929482772946358, + 0.043699394911527634, + -0.001660426496528089, + 0.025180906057357788, + -0.039375219494104385, + 0.0053853364661335945, + 0.034692440181970596, + 0.01133072841912508, + 0.04649277403950691, + -0.04183154180645943, + 0.024229303002357483, + 0.010672398842871189, + -0.012993639335036278, + 0.016633357852697372, + 0.09620392322540283, + -0.01894748955965042, + 0.00869813933968544, + 0.03333001211285591, + 0.011436302214860916, + -0.053283337503671646, + -0.029240107163786888, + -0.018422791734337807, + -0.011188727803528309, + -0.005999945569783449, + 0.033337924629449844, + 0.08805496990680695, + 0.007277320139110088, + 0.03119608946144581, + -0.005581452511250973, + 0.013757534325122833, + 0.013446818105876446, + 0.04478459060192108, + -0.0281585231423378, + 0.007232429925352335, + -0.02057827264070511, + -0.010735592804849148, + -0.041141167283058167, + -0.013414880260825157, + 0.008774801157414913, + -0.027892043814063072, + -0.02118038199841976, + 0.03535406291484833, + -0.005773103795945644, + 0.011915366165339947, + -0.013362586498260498, + -0.1074339896440506, + 0.010058971121907234, + 0.04685341939330101, + 0.02676686830818653, + -0.04209677129983902, + 0.008211489766836166, + 0.011635981500148773, + 0.03171093761920929, + 0.006887514144182205, + 0.0160739254206419, + -0.003477125195786357, + -0.028246482834219933, + -0.02985866740345955, + 0.012354123406112194, + -0.01321585662662983, + -0.0334138497710228, + 0.05904270336031914, + 0.01702887937426567, + 0.04508252069354057, + -0.02875608205795288, + 0.061527639627456665, + 0.02183707058429718, + -0.04652441293001175, + -0.023998353630304337, + -0.014925649389624596, + -0.03466776758432388, + -0.03714502230286598, + 0.00812164880335331, + 0.05643041431903839, + -0.03370414301753044, + 0.046314384788274765, + 0.042403917759656906, + 0.039711855351924896, + 0.04194587096571922, + -0.044892653822898865, + 0.014381085522472858, + -0.04303320497274399, + 0.02417507767677307, + 0.0024261465296149254, + 0.002907819813117385, + -0.04473122954368591, + -0.033169474452733994, + -0.012776823714375496, + 0.024204110726714134, + 0.030325455591082573, + -0.011538827791810036, + 0.01400262862443924, + 0.07599721848964691, + 0.007355066481977701, + 0.021303648129105568, + 0.030465370044112206, + -0.023435434326529503, + 0.03214404731988907, + 0.013625898398458958, + 0.0068402704782783985, + -0.018856564536690712, + 0.06660695374011993, + -0.017033617943525314, + 0.024832764640450478, + 0.027372173964977264, + -0.022973205894231796, + 0.0640808716416359, + 0.11020645499229431, + -0.010406771674752235, + -0.018275918439030647, + -0.022662967443466187, + 0.07155323028564453, + 0.017646832391619682, + -0.017067432403564453, + 0.025087783113121986, + 0.03291954845190048, + -0.05901481583714485, + 0.07096591591835022, + 0.1088729053735733, + 0.021950585767626762, + 0.044516440480947495, + -0.04362349957227707, + -0.025304825976490974, + 0.03380453214049339, + 0.013806285336613655, + 0.023288749158382416, + -0.032354686409235, + 0.05623454600572586, + -0.0331498384475708, + 0.008732054382562637, + -0.03133315593004227, + -0.08394992351531982, + 0.00966270174831152, + 0.018191881477832794, + -0.017256474122405052, + -0.014849426224827766, + -0.05408606678247452, + -0.054164595901966095, + 0.038517240434885025, + 0.04411592334508896, + 0.014354993589222431, + -0.015497663989663124, + 0.009233307093381882, + 0.04177677258849144, + 0.005623073782771826, + -0.017149949446320534, + -0.008299519307911396, + 0.07599443197250366, + -0.049110863357782364, + -0.040342554450035095, + -0.03237839415669441, + -0.03407994657754898, + 0.04117212072014809, + -0.06504429131746292, + -0.005143352318555117, + -0.02781560830771923, + 0.0030793561600148678, + -0.019363518804311752, + -0.024637293070554733, + 0.05453280359506607, + -0.07453737407922745, + -0.056514766067266464, + -0.03191586583852768, + 0.01347391027957201, + 0.04701421037316322, + 0.04784790799021721, + 0.04504203796386719, + 0.0416475273668766, + 0.027300169691443443, + -0.004853601101785898, + 0.07700737565755844, + 0.0058420440182089806, + -0.020056284964084625, + -0.029256943613290787, + -0.024188874289393425, + -0.044612374156713486, + 0.005700718145817518, + -0.042027492076158524, + 0.013135066255927086, + 0.015223084948956966, + -0.025109533220529556, + 0.09686876088380814, + -0.003817221149802208, + 0.04986831918358803, + -0.020277539268136024, + -0.016653837636113167, + 0.007358207833021879, + -0.010219651274383068, + -0.022081833332777023, + 0.009230331517755985, + 0.02870170958340168, + -0.0009385381708852947, + 0.011477699503302574, + -0.08156480640172958, + -0.023806657642126083, + 0.05778304859995842, + -0.0012239509960636497, + -0.050335925072431564, + 0.08446664363145828, + -0.07200253754854202, + -0.005410981830209494, + 0.04559531435370445, + -0.019777625799179077, + -0.005575160961598158, + 0.04143029823899269, + 0.0014152266085147858, + 0.0402572900056839, + 0.04996470734477043, + 0.05924665182828903, + -0.04288039356470108, + 0.029292447492480278, + -0.07367347925901413, + -0.04015783220529556, + 0.03934734687209129, + 0.006176967639476061, + -0.04073223099112511, + 0.02915194258093834, + 0.04113445803523064, + 0.023132748901844025, + 0.005755419842898846, + -0.000497312459629029, + -0.010455143637955189, + 0.02453756146132946, + 0.008060777559876442, + 0.006233473774045706, + -0.022512169554829597, + 0.0344528965651989, + -0.05065114423632622, + 0.03987080976366997, + 0.009848693385720253, + 0.02637004666030407, + -0.023348400369286537, + 0.040486037731170654, + 0.02671428583562374, + -0.004502414260059595, + -0.06244242191314697, + -0.00591331347823143, + -0.03456953167915344, + 0.03853173553943634, + -0.012725317850708961, + 0.0020869376603513956, + -0.0544876754283905, + 0.0465322844684124, + -0.03705056756734848, + 0.03402971103787422, + -0.012153149582445621, + -0.0025780058931559324, + -0.03231276571750641, + 0.014614064246416092, + 0.040733009576797485, + 0.02793523110449314, + 0.06121594458818436, + -0.10693642497062683, + -0.04121331125497818, + -0.049808602780103683, + 0.00931315403431654, + -0.0005079125403426588, + -0.03773258998990059, + 0.04029921442270279, + 0.006094376090914011, + -0.04541047289967537, + -0.00500077847391367, + 0.008933045901358128, + 0.0165691040456295, + 0.015843873843550682, + 0.0066689420491456985, + -0.042055536061525345, + -0.04772442579269409, + 0.04299677535891533, + -0.0885479673743248, + -0.03510256111621857, + -0.01526320818811655, + -0.002680840902030468, + 0.010199936106801033, + -0.05851084738969803, + 0.004623089451342821, + 0.023245980963110924, + 0.04002177715301514, + 0.006765763740986586, + 0.029415283352136612, + -0.08234964311122894, + -0.0530225895345211, + -0.027365796267986298, + -0.03294917941093445, + -0.027471251785755157, + 0.013792217709124088, + 0.02534564584493637, + 0.06191490963101387, + 0.017584433779120445, + 0.0334448516368866, + 0.0005386894918046892, + 0.0032774577848613262, + 0.01591615378856659, + -0.005250703077763319, + 0.04274865239858627, + -0.06351747363805771, + -0.07786543667316437, + 0.004636826459318399, + 0.07713916897773743, + 0.044997744262218475, + -0.032151103019714355, + 0.025335246697068214, + -0.020933767780661583, + -0.049735575914382935, + 0.03949493169784546, + -0.037822604179382324, + -0.021480482071638107, + -0.01508465874940157, + 0.010943945497274399, + 0.016628814861178398, + 0.09863129258155823, + -0.026716219261288643, + -0.005602245219051838, + 0.027888240292668343, + -0.01338939182460308, + -0.01564818061888218, + -0.017323773354291916, + -0.018854543566703796, + -0.04452570527791977, + -0.030418355017900467, + 0.020177267491817474, + 0.033515896648168564, + -0.04733597859740257, + 0.03742247074842453, + -0.04212302714586258, + 0.019949203357100487, + -0.024253876879811287, + 0.012272280640900135, + -0.0022997513879090548, + 0.03303530439734459, + -0.013598734512925148, + 0.035109736025333405, + -0.016654808074235916, + -0.035140249878168106, + -0.006442326586693525, + -0.024461794644594193, + -0.0680788904428482, + -0.036402251571416855, + -0.02342032641172409, + 0.040693119168281555, + -0.01149903703480959, + 0.025126351043581963, + -0.013343892991542816, + -0.045200083404779434, + -0.059597622603178024, + -0.02602051943540573, + 0.05655312165617943, + -0.05449136719107628, + -0.04953633248806, + -0.04299261420965195, + 0.0021499632857739925, + -0.058740951120853424, + 0.025703098624944687, + 0.026888279244303703, + 0.041148439049720764, + 0.09555676579475403, + -0.019787615165114403, + -0.03098965249955654, + 0.025334808975458145, + -0.03880137577652931, + 0.036906614899635315, + 0.0373193733394146, + -0.019397547468543053, + -0.03890744969248772, + -0.03533877432346344, + 0.01043013297021389, + -0.11240145564079285, + -0.001887193531729281, + 0.023699326440691948, + -0.012832568027079105, + -0.026331709697842598, + -0.03766907379031181, + 0.026428470388054848, + 0.008145553059875965, + -0.00892532430589199, + 0.01250272523611784, + 0.009742435067892075, + -0.0170003529638052, + 0.012004575692117214, + 0.03468174487352371, + -0.005657907575368881, + -0.03972026705741882, + 0.01663101464509964, + -0.023416968062520027, + -0.0009885226609185338, + -0.026063844561576843, + 0.0651560127735138, + 0.00011725723743438721, + -0.022703027352690697, + -0.005461778026074171, + 0.1116209477186203, + 0.03819834068417549, + 0.045459385961294174, + -0.00028157979249954224, + -0.048355814069509506, + 0.013377707451581955, + 0.02303946204483509, + -0.006767316721379757, + -0.019848201423883438, + 0.0033706456888467073, + 0.038057632744312286, + 0.11433175206184387, + -0.035053033381700516, + 0.03242923691868782, + -0.03408103808760643, + -0.053809478878974915, + -0.03179652616381645, + 0.06007275730371475, + -0.0076828645542263985, + -0.038644637912511826, + -0.02685503102838993, + -0.01804836094379425, + 0.06089795380830765, + 0.04324701055884361, + -0.07562246173620224, + -0.04398123547434807, + 0.010064228437840939, + -0.04334224760532379, + 0.014487305656075478, + -0.04711387678980827, + 0.024354685097932816, + 0.03232944384217262, + 0.04015462473034859, + 0.01371450163424015, + -0.04432954266667366, + 0.021805129945278168, + -0.052570246160030365, + 0.06789547950029373, + 0.012027716264128685, + 0.09023753553628922, + -0.08348759263753891, + 0.012259835377335548, + 0.025145262479782104, + 0.056849926710128784, + 0.021562620997428894, + -0.0038998445961624384, + 0.06174313649535179, + 0.03390361741185188, + -0.021384961903095245, + 0.0027765228878706694, + 0.021634142845869064, + 0.0617065355181694, + -0.038299500942230225, + 0.0033859144896268845, + 0.06074449047446251, + 0.02556876465678215, + -0.05028308182954788, + -0.026669925078749657, + -0.008310562931001186, + 0.0007795466226525605, + -0.051417842507362366, + -0.03003445826470852, + 0.023208893835544586, + -0.015607934445142746, + -0.004650155082345009, + -0.09222505241632462, + -0.07439403980970383, + -0.00030001159757375717, + -0.05885722488164902, + -0.03354410454630852, + -0.023885322734713554, + -0.023694748058915138, + -0.002964545274153352, + 0.033897001296281815, + 0.02342289499938488, + -0.008121664635837078, + -0.06673142313957214, + 0.035054516047239304, + 0.006485227961093187, + -0.011049957945942879, + -0.02849774807691574, + -0.003945561125874519, + -0.009321048855781555, + -0.04061659798026085, + -0.014878206886351109, + -0.026920367032289505, + 0.013240729458630085, + -0.00912179984152317, + 0.08025270700454712, + 0.011227552779018879, + 0.01162588782608509, + 0.03911953046917915, + -0.008459963835775852, + -0.011711232364177704, + -0.06549587845802307, + -0.003934463486075401, + 0.05689859390258789, + 0.005052486434578896, + -0.002148434054106474, + -0.031108779832720757, + 0.011704150587320328, + 0.018351705744862556, + 0.06075863167643547, + 0.03104316256940365, + -0.029100103303790092, + -0.06133035942912102, + -0.004201673902571201, + -0.03299975395202637, + -0.004409941844642162, + 0.02532418817281723, + 0.0012186126550659537, + -0.03342881426215172, + -0.011862652376294136, + -0.02509687840938568, + 0.011759525164961815, + 0.01686522550880909, + -0.028010768815875053, + -0.04315534606575966, + 0.01784290373325348, + 0.04763518646359444, + -0.03223493695259094, + -0.002270394703373313, + -0.02766132541000843, + -0.12045251578092575, + 0.010882371105253696, + 0.0055845039896667, + -0.0038317532744258642, + -0.032924551516771317, + 0.007581939455121756, + -0.04714681953191757, + 0.05493198707699776, + -0.10260175168514252, + 0.0184415802359581, + 0.009282311424612999, + 0.030968470498919487, + -0.016823798418045044, + -0.012262364849448204, + 0.026101063936948776, + 0.06509155035018921, + -0.038869716227054596, + -0.02793935500085354, + 0.020369278267025948, + 0.03919598087668419, + 0.017646079882979393, + 0.03126753866672516, + -0.007000391371548176, + -0.045992594212293625, + 0.00960536953061819, + 0.02549203298985958, + 0.014892284758388996, + -0.0028631072491407394, + 0.009483040310442448, + -0.0313774012029171, + -0.019784938544034958, + 0.0016485409578308463, + 0.0068555488251149654, + 0.030234023928642273, + 0.0529765859246254, + 0.015952007845044136, + 0.03150353580713272, + -0.00897759199142456, + 0.027130605652928352, + -0.029791418462991714, + 0.02543175406754017, + 0.031176520511507988, + -0.10031485557556152, + -0.005841521546244621, + -0.04214736074209213, + 0.11366035789251328, + 0.014739606529474258, + 0.03817747160792351, + -0.041414715349674225, + 0.00041041706572286785, + 0.059705231338739395, + -0.04762746021151543, + -0.000670370296575129, + -0.03526808321475983, + -0.01601385325193405, + 0.02779310569167137, + -0.04440660402178764, + -0.06342937052249908, + -0.009988636709749699, + -0.040076956152915955, + 0.025730127468705177, + -0.022812826558947563, + 0.006558165419846773, + -0.0163955707103014, + -0.049426544457674026, + -0.04815229773521423, + -0.04713110625743866, + 0.06885242462158203, + -0.009364955127239227, + -0.02605401538312435, + 0.049001749604940414, + -0.02085917256772518, + 0.017170386388897896, + -0.04500491917133331, + -0.05170299485325813, + 0.015235558152198792, + 0.015570051036775112, + 0.02370995655655861, + 0.023241516202688217, + -0.022776372730731964, + 0.024995196610689163, + -0.04913897067308426, + 0.02573673613369465, + 0.10389196127653122, + 0.013454177416861057, + 0.001859869109466672, + -0.025003504008054733, + -0.028296904638409615, + 0.01799187809228897, + 0.00047568834270350635, + -0.03678290545940399, + 0.03209736570715904, + 0.012836124747991562, + -0.05107932910323143, + 0.05102211609482765, + -0.027505643665790558, + -0.03218458220362663, + 0.01851729489862919, + 0.012394195422530174, + -0.021180691197514534, + -0.009217607788741589, + -0.017660317942500114, + 0.02939329855144024, + 0.0017022376414388418, + 0.05091192573308945, + -0.05493085831403732, + 0.010866599157452583, + -0.025341222062706947, + -0.025223098695278168, + 0.01900743879377842, + 0.03469342365860939, + 0.01142563670873642, + -0.008546913973987103, + 0.0062241884879767895, + -0.010737174190580845, + 0.010820822790265083, + 0.02365770936012268, + 0.027239330112934113, + -0.03450082615017891, + 0.0029956395737826824, + 0.011813182383775711, + 0.025415245443582535, + -0.0012042796006426215, + -0.014137083664536476, + 0.0014223991893231869, + 0.005054670386016369, + -0.034101780503988266, + 0.07151786983013153, + 0.07557526230812073, + -0.0033575203269720078, + -0.029922479763627052, + -0.043816667050123215, + 0.01773776486515999, + 0.05497784912586212, + -0.0015120196621865034, + -0.0025900728069245815, + 0.022179318591952324, + 0.03465230390429497, + 0.006229462567716837, + -0.03738939389586449, + 0.008196177892386913, + 0.010659514926373959, + -0.008288645185530186, + -0.028259970247745514, + -0.040584057569503784, + 0.021006176248192787, + 0.008154059760272503, + -0.033632151782512665, + 0.014476779848337173, + -0.008111199364066124, + -0.07059445232152939, + 0.0218367800116539, + -0.00847222376614809, + -0.026753349229693413, + 0.01831630803644657, + -0.01770036481320858, + -0.0354844406247139, + -0.024901393800973892, + -0.0360034741461277, + -0.011295972391963005, + 0.02604268305003643, + -0.06857088208198547, + 0.07337731868028641, + -0.06401073187589645, + 0.048566631972789764, + -0.012562915682792664, + 0.027890898287296295, + -0.026574552059173584, + -0.010268484242260456, + 0.00534316198900342, + 0.010180947370827198, + -0.0008329132688231766, + 0.08566134423017502, + -0.058507468551397324, + -0.011649815365672112, + 0.06626463681459427, + 0.023633329197764397, + 0.024257145822048187, + 0.006637289188802242, + -0.052131637930870056, + 0.008190560154616833, + -0.03723077103495598, + -0.03907524421811104, + -0.024975212290883064, + -0.04886558651924133, + 0.08183369785547256, + 0.036439407616853714, + 0.006964313797652721, + -0.04853811115026474, + -0.013049819506704807, + 0.020864145830273628, + -0.01652846857905388, + -0.11374097317457199, + 0.000909007852897048, + 0.02748906798660755, + 0.0004783617041539401, + -0.04259035363793373, + -0.01951170526444912, + -0.039266347885131836, + 0.0790289118885994, + -0.03614429011940956, + -0.009888287633657455, + -0.0014079920947551727, + -0.05354578420519829, + -0.05164365842938423, + 0.02401590719819069, + -0.004703827667981386, + -0.015352515503764153, + -0.09520741552114487, + -0.0011139996349811554, + 0.012082983739674091, + -0.11449477076530457, + -0.013903029263019562, + -0.0032681110315024853, + 0.06276882439851761, + -0.0160707738250494, + -0.025801463052630424, + 0.0024566405918449163, + 0.014286108314990997, + 0.008646920323371887, + -0.041887130588293076, + 0.0062835561111569405, + 0.002493197564035654, + -0.03657038137316704, + -0.029064077883958817, + 0.024899492040276527, + -0.023499423637986183, + -0.06424634903669357, + 0.03472882881760597, + -0.045173365622758865, + 0.06708387285470963, + 0.0032126533333212137, + -0.007638201583176851, + 0.010531589388847351, + -0.049638811498880386, + -0.042833518236875534, + 0.05096343532204628, + 0.00997287780046463, + -0.027017751708626747, + -0.00491376593708992, + -1.2727919965982437e-05 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/b734171a0872.json b/tests/integration/recordings/responses/b734171a0872.json new file mode 100644 index 000000000..1b605b012 --- /dev/null +++ b/tests/integration/recordings/responses/b734171a0872.json @@ -0,0 +1,801 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": "This is completely different content", + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.020581583, + 0.03996682, + 0.06342483, + -0.046694994, + -0.07684763, + -0.05265455, + -0.053058416, + -0.008007386, + -0.04512141, + 0.03718547, + -0.026790882, + 0.039592147, + 0.08868821, + -0.054975007, + 0.022950895, + -0.03249339, + 0.05376096, + 0.04878751, + 0.06144113, + 0.08925032, + -0.06345507, + -0.0008829904, + 0.07914291, + -0.028592229, + -0.048433058, + -0.0351529, + 0.028880889, + -0.08001268, + -0.04552556, + -0.080687605, + 0.1400234, + 0.14326853, + 0.02891313, + -0.05588759, + 0.007262874, + 0.026984219, + 0.09121335, + 0.050748702, + 0.017702162, + -0.035733465, + 0.1328057, + -0.08973662, + -0.050988093, + -0.009071953, + 0.00674055, + 0.0138731655, + -0.024637444, + -0.0019375099, + 0.019351467, + 0.041681487, + 0.09368255, + 0.0052818935, + 0.027539922, + -0.031472813, + 0.042352878, + 0.07326235, + 0.010973438, + 0.06776053, + 0.06473745, + 0.031266563, + 0.00057834754, + -0.002110916, + 0.16004054, + -0.0535361, + 0.04453045, + 0.050499436, + 0.03501775, + -0.003733677, + 0.020598825, + -0.079224035, + 0.07070447, + -0.060201976, + 0.006393084, + -0.003781692, + 0.070510566, + -0.047214407, + 0.06080987, + -0.0877733, + -0.08569845, + -0.018021964, + 0.06378409, + 0.027565937, + 0.038700324, + -0.1248613, + 0.00903349, + -0.08429076, + 0.016536232, + 0.025240825, + 0.00043874417, + -0.004602262, + 0.0457946, + -0.03598806, + 0.056914188, + 0.044693712, + 0.011178773, + -0.020428436, + 0.036093723, + 0.031189999, + 0.07220326, + -0.066868156, + -0.020061923, + -0.0563857, + -0.013928966, + -0.034524415, + 0.0041604545, + -0.047119446, + 0.033624567, + 0.06970587, + -0.033320673, + -0.0413748, + 0.01094969, + -0.0100499755, + 0.004480598, + 0.02067311, + -0.021157527, + 0.022485765, + 0.03633523, + 0.0049809627, + 0.02181411, + 0.049156368, + 0.06253565, + 0.059981186, + -0.031591866, + -0.049331754, + 0.033537455, + 0.021542493, + 0.009435254, + 0.025516914, + 0.025417773, + -0.07066102, + 0.011794456, + 0.06311989, + 0.011093616, + 0.08549021, + -0.04281618, + 0.011115061, + 0.07443118, + 0.021961706, + -0.02724888, + -0.00047235374, + 0.016601468, + 0.043411057, + 0.03835865, + 0.01029931, + 0.008437206, + -0.057274926, + -0.045377273, + -0.09733081, + -0.009755395, + 0.028172465, + 0.043972567, + 0.0968819, + 0.052496422, + 0.031553026, + -0.019291716, + 0.034150966, + 0.1310106, + 0.02864821, + -0.047452684, + 0.016342362, + -0.06591784, + -0.064888336, + -0.03380424, + -0.08384223, + 0.023302404, + -0.020427782, + 0.019540966, + 0.02240307, + 0.026848866, + -0.0018868797, + -0.031800512, + -0.073483676, + 0.08840526, + -0.02696041, + -0.042041607, + 0.030633071, + 0.020918656, + 0.06119309, + -0.048348967, + 0.036555305, + 0.033583682, + 0.019630525, + -0.03500669, + -0.020821452, + 0.012256841, + 0.06733756, + 0.036884613, + -0.080063485, + 0.019956889, + -0.01994667, + 0.0011630546, + -0.08307688, + -0.040326167, + -0.03293244, + -0.014897417, + 0.03977495, + 0.036790676, + 0.020645684, + 0.015943283, + -0.05961047, + 0.036905374, + 0.006005009, + 0.033375766, + -0.015491932, + -0.07008363, + -0.031575754, + -0.0065630106, + -0.013962699, + -0.012629252, + 0.046026245, + 0.007901817, + -0.117550366, + -0.06314231, + 0.05348636, + 0.10863247, + 0.053361807, + 0.055756297, + -0.026388792, + -0.011777907, + -0.07197253, + 0.010918023, + 0.020021347, + 0.14850953, + -0.043404948, + -0.04262303, + -0.04904758, + -0.014644666, + -0.0018742547, + -0.0054880613, + -0.015058903, + -0.03137978, + -0.09884002, + 0.048087206, + -0.00044948232, + -0.059237186, + 0.01681299, + 0.06357592, + 0.09665662, + -0.032431144, + -0.021346267, + -0.03630939, + 0.108024776, + 0.011421504, + 0.00090062595, + 0.09738569, + 0.07588425, + -0.038476508, + 0.008637763, + 0.03942589, + 0.03673421, + -0.008536316, + -0.035427485, + -0.0571462, + 0.077514425, + -0.014574157, + -0.06636753, + 0.0356625, + 0.00055575924, + -0.008948914, + 0.00082343427, + 0.0511982, + 0.03143358, + -0.03388075, + -0.013724427, + 0.0551338, + -0.007191376, + -0.05363105, + -0.07718383, + -0.008230843, + 0.10335533, + 0.013668598, + -0.08284561, + 0.05179483, + -0.08437943, + -0.017510848, + -0.05778264, + 0.044004828, + -0.02612715, + -0.0058190715, + 0.013293448, + -0.005663543, + 0.0037016177, + -0.020699238, + 0.00277368, + 0.041328322, + -0.052624915, + 0.020320976, + 0.0033441507, + -0.11465616, + -0.059619453, + -0.029252917, + 0.014145012, + -0.049234822, + 0.025969574, + 0.04118447, + 0.017938918, + -0.009885965, + 0.012801603, + -0.0007332413, + -0.0012993023, + -0.052635074, + 0.064850755, + 0.004576457, + -0.018446025, + -0.069130346, + 0.018532049, + 0.006330208, + 0.039377607, + 0.11237417, + 0.055357743, + -0.0038629018, + 0.048188694, + 0.052925084, + -0.011272187, + -0.012422014, + 0.005874242, + -0.0007749841, + -0.058404274, + -0.022589723, + 0.031956926, + 0.0470711, + 0.027993023, + -0.06112344, + -0.0119517995, + -0.09797626, + -0.073644884, + 0.07465703, + 0.09884925, + -0.035564825, + -0.040369682, + 0.014445328, + -0.052219898, + -0.027498178, + 0.036846854, + -0.09408649, + -0.00027856976, + 0.028489627, + 0.002446708, + -0.043065134, + -0.030562297, + 0.07565528, + -0.0256914, + -0.12143018, + 0.09360902, + 0.015026368, + 0.058814585, + -0.01885037, + 0.04901136, + 0.009521308, + -0.0067844316, + -0.06265128, + 0.029733902, + 0.019703392, + -0.029863501, + 0.033668272, + -0.015967827, + -0.024716265, + 0.07095029, + 0.07264489, + -0.021480447, + -0.040650267, + -0.11752601, + 0.019378915, + -0.042310815, + 0.05690114, + -0.01413233, + 0.058113046, + -0.073345415, + -0.059576523, + -0.09720947, + 0.012149926, + 0.057291746, + -0.03505685, + -0.038375836, + 0.0149342865, + -0.001562935, + -0.023513826, + 0.00014910847, + 0.022598296, + -0.071317434, + -0.06260575, + 4.0522777e-05, + -0.086758316, + -0.013101295, + -0.02990748, + -0.08461068, + 0.016139807, + 0.06101953, + -0.08451055, + -0.046145856, + -0.048467644, + 0.060105037, + 0.024200678, + 0.052542347, + 0.041119967, + -0.0068898834, + 0.09487794, + 0.012641435, + -0.13026047, + 0.06284531, + 0.018659385, + -0.07564698, + 0.006965884, + -0.036618453, + 0.118192144, + -0.04771263, + 0.023280941, + 0.054039616, + -0.114724584, + -0.0918062, + 0.038803104, + -0.09954885, + 0.008216844, + -0.030975524, + -0.030176945, + 0.0397766, + -0.0061745024, + 0.071971394, + -0.041089423, + 0.033857126, + 0.03961017, + -0.03826589, + 0.038435444, + -0.0860421, + 0.08869605, + -0.028628873, + -0.05565758, + 0.056920726, + 0.020458337, + 0.05994542, + 0.08241441, + 0.0400861, + -0.0045191804, + 0.0030094406, + -0.007466077, + -0.02953672, + -0.068642505, + 0.060889505, + -0.029501854, + -0.048823155, + 0.015409609, + 0.018862283, + -0.016425489, + -0.087497436, + 0.067643866, + -0.033761434, + -0.054749027, + -0.03657711, + 0.038102675, + -0.06197178, + 0.045409728, + -0.02127562, + 0.064449035, + -0.0056471447, + 0.067553245, + -0.07137091, + 0.017407946, + -0.09813906, + -0.046500444, + -0.058283363, + -0.018302118, + -0.025382183, + -0.04259567, + 0.022398086, + -0.09098867, + 0.043438766, + -0.07656342, + 0.0028111413, + 0.030880956, + -0.07750997, + 0.07084878, + 0.05344556, + 0.0052658613, + -0.025303314, + -0.04759683, + -0.017034022, + 0.02855913, + -0.04999449, + 0.01974624, + 0.07708244, + -0.011766297, + 0.057390995, + -0.04652422, + 0.023833811, + 0.05608237, + 0.05765577, + 0.05078112, + 0.046039928, + -0.055372067, + -0.044933185, + -0.08522771, + -0.09142792, + 0.012817157, + -0.026148932, + -0.07331254, + 0.11312438, + 0.055893615, + -0.013500698, + 0.008603385, + 0.00057156937, + -0.091709465, + 0.08057745, + -0.011340835, + -0.016915537, + 0.0011427286, + 0.09740327, + -0.029696029, + -0.047760956, + 0.015541391, + 0.0955123, + 0.021890407, + -0.02908531, + 0.030994056, + 0.03820344, + -0.062488347, + 0.015730608, + 0.021182666, + -0.043783836, + 0.02782434, + 0.11151618, + 0.052450567, + 0.00037089732, + 0.03351987, + -0.0054050605, + -0.033424556, + 0.10350312, + 0.065157756, + 0.03392563, + 0.010131469, + -0.053846426, + -0.0022781377, + 0.0014610494, + 0.005763698, + 0.0426489, + -0.08206464, + -0.07099776, + -0.04228286, + 0.07337842, + 0.047744617, + 0.04284143, + 0.06959166, + 0.013133698, + -0.030711556, + 0.009055728, + 0.06162162, + 0.017240932, + -0.039795205, + -0.10877084, + 0.024329182, + -0.0049141976, + -0.038892467, + -0.012901915, + -0.095080145, + 0.05290344, + 0.021141307, + 0.03017632, + -0.0044154925, + -0.10163907, + -0.08186605, + -0.023801327, + 0.035552323, + 0.039041802, + -0.032427292, + 0.07541, + 0.10233232, + 0.018622704, + -0.013646388, + -0.008619573, + 0.020216271, + -0.07897946, + 0.063637026, + -0.08652915, + -0.0100032855, + 0.046902858, + 0.076707095, + 0.02531022, + 0.05425257, + 0.015954422, + -0.033368777, + -0.025112148, + -0.01394599, + -0.04062625, + 0.056534503, + -0.04304168, + -0.060214523, + 0.016551849, + -0.006314451, + 0.060458317, + 0.027808908, + 0.040655438, + -0.031415448, + -0.120496035, + -0.04355332, + 0.002170874, + 0.013876282, + -0.011508199, + -0.046841078, + 0.076444104, + 0.08982719, + 0.0846208, + 0.029678846, + -0.086331986, + 0.14421903, + -0.0030989156, + 0.01598773, + 0.059804816, + -0.0464971, + -0.0058899643, + 0.02542227, + -0.020552263, + 0.10621325, + -0.023809364, + -0.13324538, + -0.075492345, + 0.06716611, + -0.040477127, + -0.046582364, + -0.07376809, + 0.024235222, + 0.070477486, + 0.11006968, + -0.04869493, + 0.078016356, + -0.07615679, + 0.08063025, + -0.016255612, + -0.051746953, + 0.08059405, + -0.0025989392, + -0.073428795, + -0.03987752, + 0.098251894, + -0.006217126, + -0.028130062, + -0.051326722, + -0.0470711, + -0.016759045, + -0.039230157, + -0.020525763, + 0.07148479, + -0.05419997, + -0.025775867, + 0.0070432695, + -0.006410803, + 0.027631486, + 0.037966132, + -0.025654731, + -0.023324372, + 0.026257442, + -0.034822363, + -0.010826962, + 0.020623349, + 0.0523646, + -0.022230538, + 0.028196862, + 0.023292363, + 0.12025986, + -0.022648653, + -0.061013527, + -0.040045265, + 0.022293845, + -0.016287014, + -0.08896512, + -0.021426601, + 0.05109808, + 0.038455352, + 0.055882193, + 0.10342665, + 0.06503611, + 0.07195616, + -0.013601524, + 0.028618002, + 0.03990776, + 0.03236452, + 0.07085622, + 0.0055737793, + 0.013130723, + -0.066394895, + 0.021342268, + 0.0026651763, + -0.012577644, + 0.049445108, + 0.049437333, + 0.0047207237, + -0.02006381, + 0.02022424, + 0.05142978, + 0.01725655, + 0.00037797724, + 0.039846063, + -0.11509461, + -0.013602717, + -0.066661686, + -0.020612884, + 0.012832718, + -0.091352694, + -0.09389515, + 0.07369748, + 0.056452867, + 0.10581744, + -0.06383743, + 0.036662158, + -0.07204409, + 0.012689036, + -0.025724197, + 0.040817674, + -0.06890574, + 0.0055584335, + 0.031956017, + 0.0014588524, + 0.098465145, + 0.0054196557, + 0.056656968, + 0.03322914, + -0.040962957, + -0.015689995, + -0.034545593, + -0.052660752, + -0.044768244, + -0.04419147, + -0.11039146, + 0.015522225, + 0.0052053384, + -0.08471112, + 0.025280464, + -0.03353502, + -0.018717872, + -0.020738749, + 0.0021664763, + -0.011238148, + 0.02322494, + 0.010894536, + -0.09676859, + 0.01013113, + 0.0035604087, + -0.0060942546, + -0.027839229, + -0.0037214137, + 0.053193003, + -0.070640355, + -0.07783396, + 0.005814805, + 0.0064411093, + -0.023913933, + 0.030543711, + -0.07979223, + -0.008982119, + 0.043360766, + -0.048063844, + 0.0017047173, + 0.06882568, + -0.03443207, + 0.015080402, + -0.049461022, + 0.045471057, + -0.031460688, + -0.0028212033, + 0.044725604, + 0.0026248703, + -0.0329393, + -0.034404054, + 0.024516258, + 0.002614168, + -0.047855787, + -0.03149, + 0.14646776, + -0.047660008, + 0.021453902 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/c8a59b661fd5.json b/tests/integration/recordings/responses/c8a59b661fd5.json new file mode 100644 index 000000000..e6ec001a9 --- /dev/null +++ b/tests/integration/recordings/responses/c8a59b661fd5.json @@ -0,0 +1,46 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "prompt": "Say completions", + "max_tokens": 20, + "extra_body": {} + }, + "endpoint": "/v1/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oCfwct8-4Yz4kd-984c2861287d4cc3", + "choices": [ + { + "finish_reason": "length", + "index": 0, + "logprobs": null, + "text": " of the following sentences:\n* The _most_ important thing in life is...\n* The _least", + "seed": 12050749903881546000 + } + ], + "created": 1758820465, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "text.completion", + "system_fingerprint": null, + "usage": { + "completion_tokens": 20, + "prompt_tokens": 3, + "total_tokens": 23, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + }, + "prompt": [] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/d2e057a81717.json b/tests/integration/recordings/responses/d2e057a81717.json new file mode 100644 index 000000000..99b46f6fc --- /dev/null +++ b/tests/integration/recordings/responses/d2e057a81717.json @@ -0,0 +1,61 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "Test trace openai with temperature 1" + } + ], + "max_tokens": 100, + "stream": false, + "temperature": 0.7 + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "oCfxJ43-4Yz4kd-984c2b99bc6a9045", + "choices": [ + { + "finish_reason": "length", + "index": 0, + "logprobs": null, + "message": { + "content": "I'll do my best to generate a response with a temperature of 1. \n\nIn the context of language models like myself, temperature is a parameter that controls the level of randomness or creativity in the generated text. A temperature of 1 is relatively high, which means the model will produce more diverse and potentially less coherent text.\n\nHere's a response with a temperature of 1:\n\n\"The stars shone brightly in the midnight sky, like diamonds scattered across the velvet expanse. The world was bath", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [] + }, + "seed": 8314651915728863000 + } + ], + "created": 1758820596, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 100, + "prompt_tokens": 43, + "total_tokens": 143, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + }, + "prompt": [] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/d5971b8fdb94.json b/tests/integration/recordings/responses/d5971b8fdb94.json new file mode 100644 index 000000000..750537740 --- /dev/null +++ b/tests/integration/recordings/responses/d5971b8fdb94.json @@ -0,0 +1,801 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": "Hello, world!", + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.017041557, + -0.07436493, + 0.02897635, + -0.032216743, + 0.0056444216, + -0.029015187, + 0.06512343, + -0.040310342, + 0.05263593, + 0.0068842396, + 0.019191971, + -0.0064884443, + -0.01664521, + 0.014244285, + 0.036390014, + -0.040292, + 0.031780273, + 0.0039553884, + -0.055303488, + -0.028992416, + -0.02059435, + 0.05677091, + -0.043668333, + -0.014273451, + 0.15328151, + -0.023603301, + -0.049825363, + 0.007869072, + -0.010882995, + -0.033912696, + 0.053697765, + -0.00093928695, + 0.0017799847, + 0.038871024, + -0.069678165, + -0.067093275, + 0.025772842, + -0.057590123, + -0.015825877, + 0.020131286, + 0.020742312, + 0.003915491, + -0.018451879, + 0.020440312, + -0.023613403, + -0.039568678, + -0.013152008, + -0.01871725, + 0.021348018, + -0.019964654, + 0.038607903, + 0.018397795, + -0.0063561443, + -0.018936336, + -0.060981557, + -0.02152846, + 0.027057847, + 0.0014626224, + -0.018241309, + -0.07473041, + -0.02377323, + -0.033910733, + 0.02569418, + -0.024951216, + -0.0076659806, + -0.015425462, + 0.006604636, + 0.09833969, + -0.005054596, + 0.008841989, + -0.01836461, + -0.018554095, + 0.011605144, + -0.016599955, + -0.062196333, + -0.0037542647, + -0.025220644, + -0.027834827, + -0.020460974, + -0.050503097, + 0.032119684, + -0.023387104, + 0.050067227, + -0.05834235, + 0.023189448, + -0.021862485, + 0.023831544, + -0.016663097, + -0.041609522, + 0.025361128, + 0.002924296, + 0.01852158, + 0.08960255, + -0.003265466, + -0.058762494, + -0.06428431, + -0.014671485, + -0.046800107, + 0.02691456, + -0.0059303525, + -0.015431455, + 0.022179665, + 0.014044907, + 0.012218545, + 0.0053836405, + -0.025096457, + 0.009438382, + 0.032498095, + 0.06879721, + 0.056900814, + 0.019497631, + -0.122159146, + -0.106994465, + -0.017456975, + 0.047223866, + 0.06569824, + 0.04780035, + 0.018039258, + -0.0011028647, + -0.05067006, + 0.0106863845, + 0.027489506, + -0.014593985, + -0.039851535, + -0.09175489, + 0.037555773, + -0.060439512, + 0.008525801, + 0.0071557434, + -0.057973035, + -0.054225244, + 0.051505033, + -0.0008626373, + 0.069083415, + 0.064380065, + 0.09843996, + 0.0062191207, + -0.041505292, + -0.05381256, + -0.0073601264, + -0.03288613, + 0.011711341, + -0.09244605, + 0.0069717136, + -0.05722877, + 0.041075893, + 0.06521969, + -0.0018537377, + 0.016272636, + 0.008761483, + -0.029342752, + 0.020412564, + -0.07015791, + 0.033616304, + 0.039998446, + 0.01602917, + 0.044467725, + -0.08176377, + -0.036885373, + 0.03468746, + 0.0024068495, + 0.00056306267, + 0.02546511, + -0.053339135, + -0.027220095, + -0.021510394, + 0.054806393, + -0.005447777, + -0.05690438, + -0.028497366, + 0.01873974, + -0.035461064, + -0.00019089226, + -0.04914238, + 0.030303763, + 0.013396073, + 0.015789565, + -0.07714792, + -0.062155712, + -0.00677417, + 0.02850476, + 0.031491462, + 0.014566345, + 0.012163924, + 0.11814501, + -0.0043511004, + -0.017920421, + 0.004205825, + -0.0015928322, + -0.012145554, + 0.01663168, + -0.071173735, + 0.0029570858, + 0.12899451, + 0.004157568, + 0.010501232, + 0.07710632, + 0.062119417, + 0.021002673, + -0.023212241, + -0.04327007, + -0.0567023, + 0.04590105, + 0.0019161925, + 0.02637205, + 0.029331107, + -0.029769177, + -0.050466795, + -0.08057371, + 0.007419741, + -0.008777471, + 0.02217743, + 0.013535721, + 0.03426775, + 0.04592361, + 0.009423588, + -0.023030678, + -0.024462381, + 0.054334357, + 0.06710402, + 0.077300854, + 0.0300022, + -0.0035417816, + -0.0046773576, + -0.0927158, + -0.0218652, + -0.043468982, + -0.035734102, + -0.038873542, + -0.0412869, + -0.016015923, + 0.0038303286, + 0.08523618, + -0.05200533, + -0.014904317, + -0.016793448, + 0.04478206, + -0.017161047, + 0.02638292, + 0.007849463, + -0.040533304, + -0.017599737, + 0.047704253, + 0.034988616, + -0.013908102, + 0.044121094, + 0.040395457, + -0.010402818, + 0.0063570403, + -0.014962749, + 0.025776524, + 0.023681043, + 0.006042675, + 0.017647373, + 0.016301101, + -0.07793374, + -0.004771094, + 0.012728924, + -0.00047885205, + -0.051591527, + 0.03612118, + -0.02209703, + 0.052075963, + -0.021613466, + -0.026258182, + 0.008102769, + -0.04963262, + 0.00062747014, + -0.012579783, + 0.076374784, + -0.047350414, + -0.007680664, + 0.062471915, + -0.0061351187, + -0.043617643, + 0.023878522, + -0.09653609, + 0.018392054, + -0.039719462, + 0.065271765, + 0.034548305, + 0.004219043, + -0.003628092, + 0.0047836183, + 0.0132732885, + -0.028140727, + -0.015683327, + -0.052812085, + -0.019410037, + 0.06812139, + -0.041178964, + 0.014646207, + -0.0037439142, + 0.0003088275, + -0.04985693, + 0.0223661, + 0.008887433, + 0.0049061268, + 0.042707395, + -0.021471359, + -0.06471383, + 0.0022036259, + 0.030178884, + -0.002764245, + -0.0063233464, + -0.04146522, + -0.008236624, + 0.0037351896, + -0.027550086, + -0.0137326885, + 0.0055276263, + 0.0016785853, + 0.050191414, + 0.02629574, + -0.009129228, + 0.06351977, + -0.037435655, + 0.0467174, + -0.012987377, + -0.007550927, + -0.004503205, + 0.010520655, + 0.064984836, + 0.009879768, + 0.055787366, + -0.042653065, + 0.024189176, + 0.0378726, + -0.032453574, + 0.043519154, + 0.020133087, + -0.055212636, + -0.016188117, + 0.03764466, + -0.022142444, + 0.11164031, + 0.019020407, + -0.008950892, + 0.0517199, + 0.0014494535, + 0.041113462, + -0.0912906, + -0.04723132, + 0.008548748, + 0.028231544, + 0.023689618, + -0.039103802, + -0.034011997, + -0.04731894, + 0.03309799, + -0.044572156, + -0.116778485, + -0.028786778, + 0.05798776, + 0.05287191, + -0.0039562676, + -0.08213019, + -0.01224603, + -0.012757768, + 0.035721667, + 0.012440343, + 0.0053813523, + -0.072770126, + 0.0066190604, + 0.038976185, + -0.037760906, + -0.0031381482, + -0.052277293, + -0.016870236, + -0.053451907, + -0.05629483, + -0.034493946, + -0.0048654405, + 0.022051724, + 0.028501945, + 0.025858566, + -0.023936177, + -0.098391004, + -0.030646492, + -0.049461726, + -0.00086931954, + 0.03593346, + 0.015843417, + -0.03276966, + 0.008957432, + -0.022735167, + -0.012159252, + 0.07607085, + -0.059834506, + 0.004478244, + 0.03439635, + 0.03683821, + 0.062883355, + 0.054430448, + -0.029807799, + 0.0032295138, + 0.08891875, + -0.026941199, + -0.00618463, + -0.022683868, + -0.024138795, + -0.036633875, + 0.02097464, + -0.003001584, + 0.020455033, + 0.043717608, + 0.06566654, + -0.029039463, + -0.0066977167, + -0.04504434, + 0.022257777, + 0.054422457, + 0.029796708, + 0.009008146, + 0.028205348, + 0.06255052, + -0.004475601, + 0.059329458, + -0.038065027, + -0.027933009, + -0.07060949, + 0.013978787, + -0.051300917, + 0.02945564, + -0.008552103, + -0.009436655, + 0.039747514, + -0.016741823, + 0.04740887, + 0.03521937, + -0.012574282, + -0.089222826, + -0.043515395, + -0.04158566, + 0.0016020355, + 0.02684753, + -0.019394692, + -0.02156877, + 0.06316388, + 0.01663444, + 0.015482924, + 0.047349654, + -0.028341234, + 0.013805591, + -0.010708488, + -0.07627738, + 0.08611209, + 0.0089956885, + 0.034438204, + 0.016312746, + -0.03412846, + 0.0770598, + -0.06790466, + 0.036359854, + 0.08038976, + 0.023465984, + -0.019832904, + -0.0011524013, + -0.03804293, + 0.04106918, + -0.028220456, + 0.032340813, + -0.030669356, + -0.004353358, + -0.019439798, + 0.0020563425, + 0.03015629, + -0.06430176, + 0.0034439075, + -0.045720384, + -0.06526568, + -0.0004192516, + -0.016580455, + -0.012596616, + 0.039126, + -0.04699455, + -0.008973794, + 0.015056125, + 0.018929023, + -0.07840811, + -0.014792519, + -0.0044317124, + 0.019588342, + 0.035912346, + -0.035739247, + 0.058755044, + -0.01856197, + 0.021155646, + -0.073580906, + -0.04310776, + -0.023147091, + -0.010232029, + 0.06352039, + 0.039570276, + 0.020424508, + 0.051613245, + 0.013395984, + -0.003908009, + -0.04643392, + 0.019592889, + -0.008484923, + 0.0031434586, + -0.046069775, + -0.01765311, + -0.041277196, + -0.070297986, + 0.012561737, + -0.003500738, + -0.01729488, + -0.0033254062, + 0.053035453, + -0.054218896, + -0.029708259, + -0.0047281524, + 0.019236762, + -0.12249525, + 0.03018237, + -0.028753102, + -0.031858314, + 0.0811298, + -0.005711499, + -0.057587985, + 0.014153141, + 0.0006705577, + -0.024263157, + 0.016729265, + -0.03195949, + -0.007259763, + -0.0035231581, + -0.03890975, + 0.011460382, + -0.06591321, + -0.023756726, + -0.023958001, + 0.030074941, + -0.0040949634, + -0.048368257, + -0.029692868, + 0.027246583, + -0.024747347, + 0.014442731, + -0.00832639, + -0.0002390868, + -0.013635633, + 0.0035843733, + 0.02354072, + -0.012829061, + -0.0060750768, + -0.044952527, + -0.05725624, + 0.031746052, + -0.024419094, + 0.032444403, + -0.029308707, + 0.034302235, + -0.022495607, + 0.015296428, + -0.0057196384, + -7.8588724e-05, + 0.060303975, + 0.06299601, + 0.028222265, + -0.0071411408, + 0.015196491, + 0.02031155, + 0.039635558, + 0.079736926, + 0.008736669, + -0.023079613, + -0.04490686, + -0.021764707, + -0.015199573, + 0.036019534, + -0.0046079857, + 0.04429082, + -0.04291344, + -0.05991891, + -0.006501417, + 0.010603077, + 0.03435066, + -0.065568395, + -0.04424192, + 0.035055783, + 0.019717937, + 0.032764338, + 0.021240309, + -0.01646063, + 0.007835414, + 0.06857148, + -0.013750999, + 0.028333688, + -0.078255735, + -0.047899257, + -0.0006370693, + 0.012606231, + 0.012178417, + -0.013057751, + -0.008095854, + -0.013466724, + 0.019036459, + -0.025450038, + 0.021131655, + -0.02505666, + 0.012961284, + 0.0004236046, + -0.023920864, + -0.055114083, + 0.082351916, + 0.028973032, + 0.025259241, + 0.098259576, + -0.007385416, + 0.003546012, + -0.05316339, + -0.04186183, + 0.043638214, + -0.069299474, + -0.013284585, + -0.010019175, + 0.012883975, + 0.014200739, + -0.013508286, + 0.0086570075, + -0.020393575, + 0.10617594, + 0.028786503, + -0.018674662, + 0.026763268, + -0.0062548965, + -0.07215284, + 0.055464335, + 0.0029595464, + -0.009364344, + -0.096402094, + 0.02823341, + -0.022853011, + 0.04750492, + 0.008378555, + 0.016491622, + 0.01860681, + 0.048116222, + 0.106049344, + -0.028929656, + -0.008896546, + 0.033615295, + -0.0070807124, + -0.05684197, + -0.061439563, + 0.0060220268, + 0.046171866, + -0.01574131, + -0.07562956, + 0.0024098414, + 0.0006304895, + -0.07831614, + 0.060869616, + 0.00076000375, + -0.008209363, + -0.04139266, + -0.085268535, + -0.028194478, + -0.024567788, + -0.04218179, + 0.023546752, + 0.036236234, + 0.017199656, + -0.03315456, + -0.023814544, + 0.038755447, + -0.023165299, + -0.049283065, + -0.006907019, + 0.040826146, + 0.017533792, + -0.036849793, + -0.015506943, + -0.010768763, + -0.08758806, + -0.0295733, + 0.055843282, + -0.012555046, + 0.0076235603, + 0.008802991, + 0.026661193, + -0.023899797, + 0.043548774, + -0.034339137, + -0.027354732, + -0.07583677, + 0.020500224, + 0.036802996, + 0.031019075, + 0.04605757, + -0.004433706, + 0.0108612785, + 0.050121468, + -0.07816735, + -0.014776514, + -0.04565195, + -0.0036854912, + 0.0075577567, + -0.017044865, + 0.030597543, + -0.013623054, + -0.0648466, + -0.0318741, + -0.059455115, + -0.024783187, + -0.0088010235, + 0.11127796, + 0.03429834, + -0.010424589, + -0.06355135, + 0.034265812, + 0.02680333, + -0.007930513, + 0.030092249, + 0.008321974, + 0.03125566, + -0.06832331, + -0.0076806936, + 0.034010306, + -0.087202646, + -0.047684345, + 0.06384632, + -0.026591811, + -0.0016003181, + 0.05721666, + -0.0024700803, + -0.029714238, + 0.07761957, + -0.04561395, + -0.053199258, + 0.030417573, + -0.01958724, + 0.0012449475, + -0.04003076, + 0.08825553, + -0.023196172, + -0.08629044, + -0.049815316, + 0.027229005, + 0.0021765123, + 0.03438692, + -0.09314263, + -0.019655729, + 0.018762926, + 0.025670087, + -0.017116003, + 0.031716976, + -0.05509443, + 0.032953184, + -0.02264915, + 0.04861606, + -0.050201602, + 0.033154316, + 0.009971947, + -0.037610047, + 0.016600395, + -0.031037569, + -0.015495428, + 0.026365642, + -0.043527953, + 0.055781424, + 0.06780075, + -0.015966192, + 0.03201043, + 0.028026119 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/dcbe6260d0a1.json b/tests/integration/recordings/responses/dcbe6260d0a1.json new file mode 100644 index 000000000..643e3c453 --- /dev/null +++ b/tests/integration/recordings/responses/dcbe6260d0a1.json @@ -0,0 +1,2352 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": [ + "First text for base64", + "Second text for base64", + "Third text for base64" + ] + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.021243946626782417, + 0.034794747829437256, + 0.03294198960065842, + -0.028090357780456543, + 0.037979260087013245, + 0.0007518212078139186, + 0.03092937171459198, + -0.0757070928812027, + -0.0089311758056283, + -0.12937317788600922, + -0.03478684276342392, + -0.014693479984998703, + 0.02030082419514656, + -0.03696034476161003, + 0.02939474768936634, + -0.06821902841329575, + -0.009677799418568611, + 0.0005795712932012975, + 0.029995545744895935, + 0.04274674877524376, + -0.0015028107445687056, + -0.008859499357640743, + 0.0410819835960865, + -3.760308027267456e-05, + 0.013448919169604778, + 0.012646213173866272, + 0.010533844120800495, + -0.026266224682331085, + 0.05517255887389183, + 0.0012272180756554008, + -0.026349006220698357, + 0.033021584153175354, + 0.020924728363752365, + -0.003130909986793995, + -0.07338618487119675, + 0.05300657078623772, + 0.017535021528601646, + 0.012835361994802952, + 0.04423525929450989, + 0.1066272035241127, + 0.06260895729064941, + 0.04890596866607666, + -0.04477392137050629, + -0.01750274747610092, + 0.0343162938952446, + 0.10029055178165436, + -0.014948023483157158, + -0.024369262158870697, + 0.06106048822402954, + 0.07602144777774811, + 0.0004884329973720014, + 0.07446408271789551, + 0.11743774265050888, + 0.030932847410440445, + 0.004931860603392124, + -0.08820780366659164, + -0.01851862110197544, + 0.0921822264790535, + 0.04888436570763588, + -0.031682271510362625, + 0.0264931358397007, + 0.0018110721139237285, + -0.026995966210961342, + -0.05950840562582016, + 0.011343052610754967, + 0.07904137670993805, + -0.024950025603175163, + 0.024129478260874748, + 0.033503979444503784, + 0.01735381782054901, + 0.035805437713861465, + -0.1212705671787262, + 0.05092538893222809, + 0.020419137552380562, + 0.006083586718887091, + 0.020212028175592422, + -0.043722283095121384, + 0.02742619998753071, + -0.03652483597397804, + -0.0008565334137529135, + -0.05390670895576477, + 0.028156332671642303, + 0.02802872471511364, + -0.06313633173704147, + -0.027465177699923515, + -0.10524909198284149, + 0.08934938907623291, + 0.013776582665741444, + -0.01413104496896267, + -0.0374874472618103, + 0.05462100729346275, + 0.05183432623744011, + -0.0104093411937356, + 0.02317146211862564, + 0.012575537897646427, + -0.09260094910860062, + -0.05728054791688919, + 0.06886608153581619, + -0.04862228035926819, + -0.06568558514118195, + -0.07427217066287994, + -0.04599063843488693, + 0.0796656534075737, + 0.02040169946849346, + 0.03134843334555626, + 0.06542150676250458, + 0.0446057952940464, + 0.08117026835680008, + 0.06494253128767014, + 0.00807634275406599, + -0.02132454514503479, + 0.015039658173918724, + -0.0053248037584125996, + -0.05536780133843422, + -0.011107254773378372, + 0.06042608618736267, + -0.11041712760925293, + -0.0007388441590592265, + -0.01076942216604948, + 0.023536212742328644, + -0.024439888074994087, + 0.057694707065820694, + -0.0005566216423176229, + -0.022222088649868965, + -0.02083885855972767, + 0.057657815515995026, + -0.03296849876642227, + -0.0348387286067009, + -0.04256873577833176, + -0.030177747830748558, + -0.07543575018644333, + 0.024438725784420967, + 0.0275866761803627, + 0.02123904414474964, + 0.09619438648223877, + -0.10413849353790283, + 0.0076338155195117, + 0.03055821731686592, + -0.06505735963582993, + 0.055635593831539154, + -0.049195848405361176, + 0.07235309481620789, + -0.04930593818426132, + -0.022135699167847633, + 0.0028531793504953384, + -0.04230312630534172, + -0.0005465968861244619, + 0.008261390030384064, + -0.04080177843570709, + 0.006186335813254118, + -0.023405974730849266, + 0.019431626424193382, + 0.01728222891688347, + 0.0259513258934021, + -0.031367070972919464, + 0.012502037920057774, + 0.040825821459293365, + 0.05001406744122505, + 0.04015844687819481, + 0.010462706908583641, + -0.024905573576688766, + 0.07979825884103775, + 0.008362107910215855, + 0.032846204936504364, + 0.027283407747745514, + -0.027066078037023544, + -0.05478755757212639, + -0.02779112197458744, + 0.018969617784023285, + 0.0016592427855357528, + 0.03605928644537926, + -0.03889048844575882, + 0.002129088621586561, + 0.03605295717716217, + 0.053488731384277344, + -0.07981417328119278, + 0.0013098784256726503, + 0.007055372465401888, + 0.035932816565036774, + -0.021957283839583397, + 0.04175853356719017, + 0.024311570450663567, + 0.022088928148150444, + -0.03077773191034794, + -0.023651933297514915, + -0.029449904337525368, + -0.06242407485842705, + -0.09673216938972473, + -0.022156711667776108, + -0.002594852587208152, + -0.03681497275829315, + -0.028873350471258163, + 0.039285652339458466, + -0.013717029243707657, + 0.03909775987267494, + -0.01578403450548649, + 0.07472826540470123, + 0.07584545761346817, + 0.047826215624809265, + -0.01626771129667759, + 0.0754612535238266, + -0.027092115953564644, + 0.04353151470422745, + -0.00043609036947600543, + 0.04202340543270111, + 0.04058298468589783, + 0.04573487490415573, + 0.006294480990618467, + -0.020078429952263832, + 0.05308700352907181, + -0.07461412996053696, + -0.02280886098742485, + 0.006082446780055761, + -0.010309150442481041, + -0.0648636445403099, + 0.03642423823475838, + -0.04575612396001816, + -0.03454422205686569, + 0.03753354027867317, + 0.01559093315154314, + 0.14071153104305267, + 0.03761900216341019, + 0.09063170105218887, + -0.05966372787952423, + -0.0881241112947464, + -0.03742286562919617, + -0.08929157257080078, + -0.004663981031626463, + -0.021736236289143562, + -0.04781720042228699, + 0.07504318654537201, + 0.006156024057418108, + 0.09562328457832336, + 0.01149415597319603, + 0.03671488165855408, + 0.05823316052556038, + -0.004843208473175764, + 0.03940499946475029, + 0.005145011004060507, + -0.0387989841401577, + 0.02801636792719364, + -0.01898770034313202, + -0.01319114863872528, + -0.04162587970495224, + -0.009340304881334305, + -0.028531309217214584, + -0.013548480346798897, + 0.0749879702925682, + 0.029029767960309982, + -0.13125675916671753, + 0.028858788311481476, + 0.016637325286865234, + 0.07098004221916199, + 0.014350894838571548, + 0.025028040632605553, + 0.08852114528417587, + 0.01179411169141531, + 0.003958633169531822, + -0.07466915249824524, + -0.051881562918424606, + 0.016343487426638603, + -0.015593438409268856, + -0.018738843500614166, + 0.023900233209133148, + -0.029499951750040054, + 0.029405502602458, + -0.10045821219682693, + 0.0407489538192749, + -0.08355997502803802, + 0.02037896029651165, + -0.02060963399708271, + -0.006867741234600544, + 0.041690364480018616, + -0.02105969935655594, + -0.031096510589122772, + 0.022436559200286865, + -0.008763480000197887, + -0.060320526361465454, + -0.033940769731998444, + 0.06043842062354088, + -0.046624381095170975, + -0.020693134516477585, + -0.015724539756774902, + 0.0017427188577130437, + -0.04013955593109131, + -0.09141470491886139, + 0.048646699637174606, + -0.011399643495678902, + -0.011805842630565166, + 0.0028939840849488974, + 0.04591585695743561, + 0.03140917420387268, + 0.02115165814757347, + 0.01129426434636116, + -0.04453091695904732, + -0.034225091338157654, + -0.043412696570158005, + -0.0507376603782177, + -0.045656848698854446, + 0.03541470691561699, + 0.0004332195676397532, + -0.015982968732714653, + -0.049344033002853394, + -0.016870534047484398, + -0.02533125877380371, + -0.052366580814123154, + -0.05742982402443886, + 0.014312811195850372, + 0.02991114743053913, + 0.007198266219347715, + -0.056468795984983444, + 0.05485447496175766, + -0.04732056334614754, + 0.0015276444610208273, + 0.08423584699630737, + -0.05577176809310913, + -0.03241731971502304, + 0.005962055176496506, + 0.0438140444457531, + 0.015707187354564667, + -0.07703499495983124, + 0.006147976033389568, + -0.01812780275940895, + -0.0010729017667472363, + 0.0232272669672966, + 0.005022854078561068, + 0.03320878744125366, + -0.005904147867113352, + 0.04386003315448761, + 0.022143641486763954, + -0.030258458107709885, + 0.005923417862504721, + 0.03665343299508095, + 0.03368106856942177, + -0.03855093941092491, + 0.05389492213726044, + -0.03243345394730568, + 0.014403747394680977, + 0.01844039000570774, + -0.04507424309849739, + -0.0353391207754612, + 0.02985268644988537, + -0.1257036328315735, + 0.04566779360175133, + 0.00108715845271945, + 0.011796748265624046, + -0.010499436408281326, + -0.006459049414843321, + 0.019375959411263466, + -0.04014842212200165, + -0.03018513321876526, + 0.0006804278818890452, + -0.024089330807328224, + -0.05178503692150116, + 0.03820057213306427, + 0.04591234400868416, + 0.01584138721227646, + 0.0013118565548211336, + 0.05431056767702103, + -0.04110536351799965, + -0.04406438022851944, + -0.08887076377868652, + -0.04624929651618004, + 0.01865711249411106, + -0.012675807811319828, + -0.00916767306625843, + 0.046412695199251175, + -0.02968359738588333, + 0.034033484756946564, + -0.05128427594900131, + 0.0004786983772646636, + -0.010109355673193932, + 0.016439290717244148, + -0.043365489691495895, + 0.009784338064491749, + -0.014746462926268578, + -0.02255125343799591, + -0.03336954489350319, + -0.013219241052865982, + 0.012832749634981155, + -0.054642386734485626, + 0.021693484857678413, + -0.010907863266766071, + -0.01638379506766796, + -0.004628440830856562, + -0.02702217921614647, + 0.02485765516757965, + 0.0015859740087762475, + 0.014810957945883274, + 0.014514460228383541, + 0.049271535128355026, + -0.011239118874073029, + 0.012005401775240898, + 0.041765641421079636, + -0.06757067143917084, + 0.09190651774406433, + 0.02942199446260929, + -0.07001000642776489, + -0.027379410341382027, + 0.022311899811029434, + 0.006803853902965784, + -0.033739957958459854, + 0.014822928234934807, + 0.07009675353765488, + 0.01265542022883892, + -0.013862154446542263, + -0.13826966285705566, + 0.06718281656503677, + 0.009786676615476608, + -0.04935590550303459, + -0.007003592327237129, + 0.005271278787404299, + 0.003907268401235342, + -0.06191864237189293, + -0.08406338840723038, + 0.059670574963092804, + -0.03440184146165848, + -0.004656089469790459, + -0.05913826450705528, + 0.07360323518514633, + -0.05216832086443901, + 0.01305945124477148, + -0.04029037803411484, + -0.013935432769358158, + -0.008672966621816158, + -0.04508724436163902, + 0.011632713489234447, + 0.04962510988116264, + -0.007929306477308273, + -0.015910180285573006, + 0.11333373934030533, + -0.09912213683128357, + -0.004115979187190533, + -0.046902671456336975, + 0.011006402783095837, + 0.014275251887738705, + -0.0009168803226202726, + 0.053979601711034775, + 0.0040133120492100716, + 0.013177922926843166, + 0.026463385671377182, + 0.04751366749405861, + 0.0579240657389164, + -0.03787180781364441, + 0.08349741250276566, + 0.05076466500759125, + 0.0354430265724659, + 0.029994670301675797, + 0.031569115817546844, + -0.002271361416205764, + -0.03959103301167488, + -0.00116530095692724, + -0.010205492377281189, + -0.055082183331251144, + 0.0010017730528488755, + -0.012688984163105488, + 0.025854796171188354, + 0.019687794148921967, + 0.11897709220647812, + -0.018763957545161247, + -0.09455431252717972, + -0.0004727896011900157, + -0.016428187489509583, + 0.05448509380221367, + -0.02335636131465435, + 0.06281369179487228, + 0.0008048227173276246, + 0.010531709529459476, + 0.07564940303564072, + -0.07394172996282578, + -0.0077888248488307, + 0.028107117861509323, + 0.011597340926527977, + -0.056152522563934326, + -0.05610967427492142, + 0.0048665632493793964, + -0.05508267506957054, + 0.1188877671957016, + 0.013651496730744839, + -0.002225268632173538, + -0.03457065671682358, + -0.07814210653305054, + 0.062431029975414276, + 0.015777068212628365, + 0.05874136835336685, + -0.02467568963766098, + 0.08875864744186401, + -0.023964574560523033, + -0.012265834026038647, + 0.0441846139729023, + -0.06669578701257706, + -0.059913307428359985, + 0.06672590225934982, + -0.030995339155197144, + -0.021182818338274956, + -0.023741241544485092, + 0.017112649977207184, + -0.00318331690505147, + 0.013586549088358879, + 0.016403738409280777, + -0.03456692397594452, + -0.07706793397665024, + 0.07028163969516754, + -0.004563847556710243, + 0.05896731838583946, + 0.03370149806141853, + 0.08598394691944122, + -0.028344471007585526, + -0.00012640655040740967, + -0.020437706261873245, + 0.020452480763196945, + -0.07386474311351776, + -0.022961962968111038, + -0.00956758577376604, + 0.0572735033929348, + 0.00888572633266449, + 0.049277760088443756, + -0.035784464329481125, + -0.024803629145026207, + -0.033097684383392334, + 0.0628223791718483, + -0.037873413413763046, + 0.018132388591766357, + -0.0570320300757885, + -0.03685370087623596, + -0.01412233803421259, + 0.00909410696476698, + -0.05424374341964722, + 0.00796805415302515, + -0.05229536443948746, + 0.009670494124293327, + -0.009895792230963707, + 0.017865560948848724, + 0.05613577738404274, + -0.013700703158974648, + -0.09394590556621552, + -0.06554463505744934, + 0.006992490496486425, + -0.02259184792637825, + -0.024195179343223572, + 0.056506190448999405, + -0.014457941986620426, + 0.023873861879110336, + -0.00012435298413038254, + 0.005703497212380171, + 0.012352116405963898, + -0.02086440473794937, + 0.07235981523990631, + 0.01831240952014923, + 0.009411456063389778, + -0.05372312664985657, + -0.025770995765924454, + -0.004489639308303595, + 0.05335519090294838, + -0.02515813335776329, + -0.00395063403993845, + 0.07238995283842087, + -0.0033302258234471083, + -0.01983746699988842, + -0.01599535159766674, + -0.0008172772941179574, + -0.05466737970709801, + 0.03392226621508598, + 0.07594592124223709, + -0.009340176358819008, + 0.0685979351401329, + 0.03870048373937607, + -0.02050076425075531, + -0.0707913190126419, + 0.002426006831228733, + 0.03580603376030922, + 0.0391516275703907, + -0.0475793331861496, + -0.01934715174138546, + 0.09019213169813156, + -0.023854458704590797, + 0.09640078991651535, + 0.025748809799551964, + -0.04934404045343399, + -0.018955113366246223, + 0.04065977409482002, + -0.003897663438692689, + -0.029766447842121124, + -0.09338818490505219, + 0.015848957002162933, + -0.06712503731250763, + -0.04601748287677765, + 0.013102288357913494, + 0.015960464254021645, + 0.01131692249327898, + -0.09787366539239883, + -0.024784227833151817, + -0.059856679290533066, + -0.018397631123661995, + 0.04785679280757904, + 0.028324270620942116, + -0.021970495581626892, + -0.10152556747198105, + 0.036651235073804855, + 0.10924217104911804, + 0.03857167437672615, + 0.018847741186618805, + -0.018971268087625504, + -0.020804740488529205, + -0.031007297337055206, + -0.03123946115374565, + -0.06185399368405342, + -0.0005774162127636373, + 0.05364489555358887, + 0.034990180283784866, + 0.015288084745407104, + -0.08519966155290604, + -0.02135700359940529, + -0.11396247148513794, + -0.032443221658468246, + 0.03247451409697533, + -0.09251630306243896, + -0.027148332446813583, + -0.0010909098200500011, + 0.03239751607179642, + 0.016580209136009216, + 0.04813570901751518, + -0.02053685672581196, + -0.006615726742893457, + 0.04650004953145981, + -0.05042275786399841, + -0.1390020102262497, + 0.02904166281223297, + -0.08724252879619598, + 0.05358317494392395, + -0.07751209288835526, + -0.08581648021936417, + -0.03441935405135155, + -0.010417298413813114, + 0.05497601628303528, + -0.0005697793676517904, + -0.017994984984397888, + 0.03513611853122711, + 0.17318987846374512, + 0.0068072183057665825, + 0.02047453075647354, + -0.0013765395851805806, + -0.06979061663150787, + 0.0050995745696127415, + 0.04374051094055176, + 0.012496848590672016, + -0.04901368170976639, + 0.06716548651456833, + -0.0057524219155311584, + -0.001631277147680521, + 0.009543255902826786, + -0.12455476820468903, + -0.03447726368904114, + 0.05795378237962723, + -0.03234371170401573, + -0.008605395443737507, + -0.009710922837257385, + -0.02412606216967106, + -0.06345447897911072, + 0.00020711123943328857, + -0.007918517105281353, + 0.012251642532646656, + -0.072933629155159, + -0.005882172845304012, + 0.014688358642160892, + -0.05061021074652672, + -0.01772920787334442, + -0.10720483213663101, + 0.024525122717022896, + -0.03410802409052849, + -0.029861919581890106, + 0.01121978648006916, + 0.03064989671111107, + 0.06948171555995941, + 0.02422528900206089, + 0.041864924132823944, + -0.0060437703505158424, + -0.04014107957482338, + -0.05345838889479637, + 0.08462578058242798, + -0.021888302639126778, + 0.02760351076722145, + -0.06208560988306999, + 0.010669044218957424, + 0.009895195253193378, + 0.04011973366141319, + -0.0027158602606505156, + 0.03309660777449608, + 0.015698090195655823, + 0.0012504097539931536, + -0.06713616102933884, + 0.01714659109711647, + 0.04267580062150955, + -0.100189708173275, + 0.02179231308400631, + -0.05325351282954216, + 0.040056344121694565, + 0.05891250818967819, + 0.06118196249008179, + 0.02449502795934677, + -0.005512666888535023, + -0.05754562094807625, + 0.04250011593103409, + -0.0280450452119112, + 0.05799516290426254, + 0.05134669318795204, + -0.07423847913742065, + -0.052621182054281235, + 0.044754717499017715, + -0.0498635396361351, + -0.024358481168746948, + 0.017813928425312042, + 0.049917787313461304, + -0.06214871630072594, + 0.028665436431765556, + -0.045065607875585556, + 0.026900598779320717, + 0.050857800990343094, + -0.067425936460495, + 0.004570877179503441, + 0.000553375983145088, + 0.011435381136834621, + 0.02447129599750042, + 0.035013604909181595, + 0.008408213965594769, + -0.09106679260730743, + -0.05746156722307205, + 0.019560588523745537, + -0.07232211530208588, + 0.04495194926857948, + -0.07498367130756378, + 0.023491332307457924, + 0.00814443826675415, + -0.033822815865278244, + 0.0007444656221196055, + -0.05174757167696953, + -0.07039020955562592, + 0.047565776854753494, + 0.045103445649147034, + -0.0015524910995736718, + 0.0266417246311903, + 0.025849921628832817, + 0.04197035729885101, + 0.05096474662423134, + -0.03653767332434654, + -0.010587411932647228, + -0.0294844601303339, + 0.05015818029642105, + 0.04084649309515953, + 0.028987864032387733, + -0.04201335832476616, + 0.07595627754926682, + -0.021202752366662025, + -0.03432992473244667, + 0.021856922656297684, + 0.022634290158748627, + -0.003617837093770504, + 0.0707993432879448, + 0.004863708280026913, + 0.05238958075642586, + -0.032469477504491806, + 0.007123141083866358, + -0.04516129195690155, + -0.05961206182837486, + 0.07076875120401382, + 0.096811443567276, + -0.027327029034495354, + 0.06346990913152695 + ], + "index": 0, + "object": "embedding" + }, + { + "embedding": [ + -0.015361337922513485, + 0.04979732632637024, + 0.03271178901195526, + -0.023676365613937378, + 0.04331335425376892, + 0.00562778115272522, + 0.03926454484462738, + -0.06629609316587448, + -0.005185229703783989, + -0.12151318043470383, + -0.008604802191257477, + -0.032601498067379, + 0.011911311186850071, + -0.03212691843509674, + 0.028529010713100433, + -0.06378806382417679, + -0.009742745198309422, + -0.01227179728448391, + 0.03821500390768051, + 0.049727663397789, + 0.0056787827052176, + -0.0215577594935894, + 0.028353586792945862, + 0.009897884912788868, + 0.014786846935749054, + 0.00024352222681045532, + 0.01381521113216877, + -0.04508408531546593, + 0.022661438211798668, + -0.0010912897996604443, + -0.04025668650865555, + 0.023755939677357674, + 0.0451127290725708, + -0.008986257016658783, + -0.08380444347858429, + 0.046146638691425323, + 0.010871831327676773, + 0.0017496348591521382, + 0.03738158196210861, + 0.08895260095596313, + 0.07399918138980865, + 0.04653134196996689, + -0.02871764823794365, + -0.014150945469737053, + 0.02770884335041046, + 0.1143602654337883, + -0.006745737046003342, + -0.021923422813415527, + 0.024092191830277443, + 0.08299314230680466, + 0.01074399147182703, + 0.05946294218301773, + 0.07587448507547379, + 0.03752659633755684, + -0.013794900849461555, + -0.11456605792045593, + -0.045754849910736084, + 0.1185627356171608, + 0.05171286314725876, + -0.00011203205212950706, + 0.03786885738372803, + -0.020881952717900276, + -0.04263683781027794, + -0.0693858191370964, + 6.804987788200378e-05, + 0.06546545773744583, + -0.04958876594901085, + 0.02872016280889511, + 0.02686113491654396, + 0.01706119067966938, + 0.024307388812303543, + -0.10877911746501923, + 0.06306217610836029, + 0.018824364989995956, + 0.009414511732757092, + 0.029292665421962738, + -0.03701861575245857, + 0.04195621982216835, + -0.024835936725139618, + 0.0075477007776498795, + -0.08807897567749023, + 0.028510818257927895, + 0.02435067668557167, + -0.06579336524009705, + -0.07196126878261566, + -0.10865594446659088, + 0.09111516922712326, + 0.014166605658829212, + -0.013762171380221844, + -0.053920987993478775, + 0.04987506568431854, + 0.04085454344749451, + -0.04871196672320366, + 0.014562679454684258, + 2.7124769985675812e-05, + -0.07960894703865051, + -0.07389690726995468, + 0.09588716924190521, + -0.05884701758623123, + -0.05994487181305885, + -0.050043534487485886, + -0.05509130656719208, + 0.0815657302737236, + 0.006192589178681374, + 0.009257589466869831, + 0.05459251627326012, + 0.05741984024643898, + 0.05948534980416298, + 0.054572172462940216, + 0.023488275706768036, + -0.019055640324950218, + 0.00615002540871501, + -0.0032463304232805967, + -0.046519290655851364, + -0.009281368926167488, + 0.07151860743761063, + -0.11087965220212936, + 0.013657445088028908, + -0.02288041263818741, + 0.00833470281213522, + -0.011994874104857445, + 0.04166214168071747, + 0.019814645871520042, + -0.005959265399724245, + -0.029590584337711334, + 0.0467841774225235, + -0.03742105886340141, + -0.04282886162400246, + -0.04398249089717865, + -0.005584442522376776, + -0.06762321293354034, + 0.016560424119234085, + 0.0217873677611351, + -0.006113113835453987, + 0.07774721831083298, + -0.11724946647882462, + -0.0002933871001005173, + 0.039364125579595566, + -0.08362074941396713, + 0.05478771775960922, + -0.04234299063682556, + 0.07230759412050247, + -0.048544302582740784, + -0.01755920611321926, + -0.00995259452611208, + -0.035509686917066574, + -0.00980092491954565, + 0.039687275886535645, + -0.040955644100904465, + 0.0381891131401062, + -0.012842523865401745, + 0.004032530356198549, + 0.016712332144379616, + 0.029597990214824677, + -0.034297894686460495, + 0.006014276295900345, + 0.011363453231751919, + 0.06677766889333725, + 0.04599393531680107, + -0.014803525060415268, + -0.016744986176490784, + 0.11920218914747238, + 0.030317414551973343, + 0.04242571443319321, + 0.03874458745121956, + -0.01793624646961689, + -0.036565884947776794, + -0.03301650285720825, + 0.024855205789208412, + -0.010297720320522785, + 0.04388566315174103, + -0.03274819254875183, + -0.016810191795229912, + 0.03532342612743378, + 0.06536063551902771, + -0.0817088782787323, + 0.006184013094753027, + 0.011433233506977558, + 0.06383803486824036, + -0.009013976901769638, + 0.025454776361584663, + 0.02626669965684414, + 0.011064855381846428, + -0.02197151631116867, + -0.027108222246170044, + -0.028486957773566246, + -0.06910926848649979, + -0.09564097970724106, + -0.0111482422798872, + 0.00673531973734498, + -0.04979623109102249, + -0.01774590089917183, + 0.05719239264726639, + -0.021102268248796463, + 0.03859343379735947, + -0.03388996794819832, + 0.06620153039693832, + 0.05658755823969841, + 0.04461687430739403, + 0.008244774304330349, + 0.08090010285377502, + -0.020973902195692062, + 0.027902625501155853, + -0.005069726146757603, + 0.04092751443386078, + 0.028494378551840782, + 0.04706457257270813, + 0.02406517043709755, + -0.01908239722251892, + 0.047541894018650055, + -0.10538053512573242, + -0.017673633992671967, + 0.003507752437144518, + -0.014344931580126286, + -0.08872779458761215, + 0.03517497703433037, + -0.05151273310184479, + -0.023954737931489944, + 0.023528343066573143, + 0.009684438817203045, + 0.15286873281002045, + 0.027397500351071358, + 0.06226097792387009, + -0.06906573474407196, + -0.07003753632307053, + -0.05613531917333603, + -0.08828873932361603, + -0.007893010973930359, + -0.029567312449216843, + -0.05602081120014191, + 0.08579984307289124, + 0.014959411695599556, + 0.07096278667449951, + -0.003278569784015417, + 0.022950153797864914, + 0.057388585060834885, + -0.026718785986304283, + 0.018892308697104454, + 0.0030237678438425064, + -0.038765233010053635, + 0.024887332692742348, + -0.03802492469549179, + -0.007899444550275803, + -0.05057225748896599, + -0.0390341617166996, + -0.0393683947622776, + -0.005173178855329752, + 0.09574467688798904, + 0.019188078120350838, + -0.11092545837163925, + 0.03209153190255165, + 0.058751750737428665, + 0.059988170862197876, + -0.0016372561221942306, + 0.02613435499370098, + 0.09558931738138199, + 0.012428957037627697, + -0.0026045830454677343, + -0.060734279453754425, + -0.027990173548460007, + 0.006931353360414505, + -0.01127802487462759, + -0.0020152078941464424, + 0.03164041042327881, + -0.05462252348661423, + 0.024447927251458168, + -0.09599866718053818, + 0.061225686222314835, + -0.0571819506585598, + -0.013216754421591759, + -0.013812162913382053, + -0.018582651391625404, + 0.04117383807897568, + -0.004140737000852823, + -0.011398440226912498, + 0.02741027995944023, + -0.006830500438809395, + -0.05662134289741516, + -0.04001370444893837, + 0.04929124936461449, + -0.04428812488913536, + -0.02879948727786541, + -0.025966327637434006, + 0.009408105164766312, + -0.04173823073506355, + -0.07505793869495392, + 0.021572459489107132, + -0.007669119630008936, + -0.002902193693444133, + -0.006382218562066555, + 0.05644381791353226, + 0.040468472987413406, + 0.009106801822781563, + 0.017947839573025703, + -0.04145249351859093, + -0.03256900981068611, + -0.05382244661450386, + -0.044650137424468994, + -0.06638733297586441, + 0.046384405344724655, + 0.02809322625398636, + -0.01998932659626007, + -0.04632442817091942, + -0.010976413264870644, + -0.00509654963389039, + -0.073309987783432, + -0.04585064575076103, + 0.008297815918922424, + 0.0039430540055036545, + 0.015605848282575607, + -0.07540711760520935, + 0.06524986773729324, + -0.0617227628827095, + 0.008256766013801098, + 0.09450311213731766, + -0.06782697886228561, + -0.018096381798386574, + 0.012561279349029064, + 0.03959236294031143, + 0.03463498502969742, + -0.08430229872465134, + -0.014576047658920288, + -0.02732141688466072, + 0.0023050191812217236, + 0.01132742315530777, + 0.017395304515957832, + 0.007441606372594833, + -0.0005612037493847311, + 0.05836282670497894, + 0.017117882147431374, + -0.062275663018226624, + 0.015526678413152695, + 0.05699259787797928, + 0.027221817523241043, + -0.02318861335515976, + 0.037044625729322433, + -0.03516511619091034, + 0.01816411130130291, + 0.03657243400812149, + -0.0540056936442852, + -0.041532788425683975, + 0.01776343397796154, + -0.1374245584011078, + 0.048444654792547226, + 0.001481178100220859, + -0.01506276149302721, + -0.006925682537257671, + -0.010343946516513824, + 0.027674799785017967, + -0.01607011817395687, + -0.011990036815404892, + 0.000328991562128067, + -0.03176268935203552, + -0.04833264276385307, + 0.04565209895372391, + 0.029886703938245773, + 0.02656581811606884, + 0.009315724484622478, + 0.06952857226133347, + -0.05008822679519653, + -0.039076611399650574, + -0.0869642049074173, + -0.04559170827269554, + 0.046816784888505936, + -0.042257022112607956, + -0.009282849729061127, + 0.05430670082569122, + -0.0024332876782864332, + 0.04428991675376892, + -0.03964092209935188, + 0.020234989002346992, + -0.022099189460277557, + 0.024847362190485, + -0.022718198597431183, + 0.0034596140030771494, + -0.001875469577498734, + -0.01668890006840229, + -0.026463262736797333, + -0.013704000972211361, + 0.012499495409429073, + -0.03913261368870735, + 0.019017167389392853, + 0.010459711775183678, + -0.008595886640250683, + 0.020271865651011467, + -0.021375395357608795, + 0.03144679218530655, + -0.004564618691802025, + 0.019402271136641502, + 0.01132645457983017, + 0.06189865991473198, + -0.042048193514347076, + 0.005936063826084137, + 0.04543835669755936, + -0.08055179566144943, + 0.10063067078590393, + 0.04266902431845665, + -0.048124704509973526, + -0.025517867878079414, + 0.029023073613643646, + 0.009926171973347664, + -0.014497719705104828, + 0.039107274264097214, + 0.0890098586678505, + 0.009432201273739338, + -0.010217288509011269, + -0.1440952867269516, + 0.09182045608758926, + 0.012247048318386078, + -0.037289105355739594, + 0.027401182800531387, + 0.021840354427695274, + 0.016772400587797165, + -0.05396120995283127, + -0.08320195972919464, + 0.052276089787483215, + -0.012742032296955585, + -0.01752757653594017, + -0.05801304802298546, + 0.07745608687400818, + -0.051807988435029984, + 0.04372185096144676, + -0.06284715980291367, + 0.0043107192032039165, + -0.007824349217116833, + -0.0494004525244236, + 0.016916688531637192, + 0.04830336198210716, + -0.0010573450708761811, + -0.03315906971693039, + 0.12929977476596832, + -0.08101428300142288, + -0.0027075791731476784, + -0.0722334161400795, + 0.009380863048136234, + 0.012343528680503368, + 0.02405666559934616, + 0.06400652229785919, + -0.0024543001782149076, + 0.03233429417014122, + 0.025860365480184555, + 0.04825374484062195, + 0.056571926921606064, + -0.034791190177202225, + 0.06618403643369675, + 0.05867554992437363, + 0.05182604119181633, + 0.029335688799619675, + 0.024195488542318344, + 0.001890279003418982, + -0.06057992950081825, + -0.010036561638116837, + -0.0021472577936947346, + -0.04559304937720299, + -0.011949785985052586, + -0.023587634786963463, + 0.026771588250994682, + 0.039690300822257996, + 0.12270307540893555, + -0.029393410310149193, + -0.09134140610694885, + -0.016705969348549843, + -0.04571916535496712, + 0.034329887479543686, + -0.02967034839093685, + 0.05135393515229225, + -0.011602927930653095, + -0.0018752372125163674, + 0.07674635201692581, + -0.06370355188846588, + -0.01882878504693508, + 0.039709366858005524, + 0.044876694679260254, + -0.03650888800621033, + -0.06003671512007713, + 0.010745085775852203, + -0.04883512482047081, + 0.11235933005809784, + 0.02238980308175087, + -0.020656201988458633, + -0.02710459567606449, + -0.0775383785367012, + 0.06174652278423309, + 0.011263877153396606, + 0.0485197938978672, + -0.028834793716669083, + 0.06819545477628708, + -0.045194387435913086, + -0.02543921023607254, + 0.07541649043560028, + -0.06487034261226654, + -0.06507067382335663, + 0.05682060122489929, + -0.032081909477710724, + -0.022331714630126953, + -0.026010040193796158, + 0.024498462677001953, + -0.010863200761377811, + 0.019683634862303734, + 0.022145412862300873, + -0.024490060284733772, + -0.09808242321014404, + 0.06603729724884033, + 0.0008643332403153181, + 0.053186941891908646, + 0.029886461794376373, + 0.09229453653097153, + -0.02558288723230362, + 0.0009047302883118391, + -0.02650485746562481, + 0.026190437376499176, + -0.07194231450557709, + -0.04317126423120499, + -0.02306477539241314, + 0.060700833797454834, + 0.015479233115911484, + 0.038826487958431244, + -0.004164276644587517, + -0.04245039075613022, + -0.03095369227230549, + 0.07360131293535233, + -0.03196020796895027, + 0.040354955941438675, + -0.06453597545623779, + -0.05701097846031189, + -0.02466483600437641, + -0.007983763702213764, + -0.03923703730106354, + -0.006017658859491348, + -0.05010092258453369, + 0.003703599562868476, + -0.026579122990369797, + 0.02254307270050049, + 0.052385956048965454, + -0.008452912792563438, + -0.07548537105321884, + -0.06657058000564575, + -0.016360051929950714, + -0.018614931032061577, + -0.03082110732793808, + 0.07257220149040222, + -0.001414465717971325, + 0.041274577379226685, + -0.008301679976284504, + -0.01321034412831068, + 0.015248333103954792, + -0.020154261961579323, + 0.101469025015831, + 0.01585543528199196, + 0.002645175438374281, + -0.049937617033720016, + -0.03522094711661339, + -0.007624450605362654, + 0.06031561270356178, + -0.03901735693216324, + -0.01669773831963539, + 0.09752428531646729, + 0.003536623204126954, + -0.005628792569041252, + -0.0032295831479132175, + -0.02563372440636158, + -0.06533733755350113, + 0.03446664288640022, + 0.07987730950117111, + -0.02419549785554409, + 0.08040162920951843, + 0.04983095824718475, + -0.022777540609240532, + -0.06979881227016449, + -0.004015090875327587, + 0.020165536552667618, + 0.06837652623653412, + -0.05738420411944389, + -0.04372645542025566, + 0.08846695721149445, + -0.022193668410182, + 0.0711817666888237, + 0.018215814605355263, + -0.030950257554650307, + -0.029878899455070496, + 0.044328805059194565, + 0.010670371353626251, + -0.047608181834220886, + -0.08216201514005661, + 0.02052650973200798, + -0.06995323300361633, + -0.05452963709831238, + 0.005458220839500427, + 0.03337837755680084, + 0.0025598257780075073, + -0.116226926445961, + -0.02156931906938553, + -0.05796385183930397, + -0.009794939309358597, + 0.05544780194759369, + 0.03582090884447098, + -0.014857760630548, + -0.1300913542509079, + 0.05724838748574257, + 0.1262546330690384, + 0.061897747218608856, + 0.030348174273967743, + -0.03668152540922165, + -0.0060008675791323185, + -0.051052678376436234, + -0.046703752130270004, + -0.04180048406124115, + -0.022444427013397217, + 0.054750073701143265, + 0.04374520108103752, + 0.01672930270433426, + -0.08269748091697693, + -0.005237598437815905, + -0.13462458550930023, + -0.030058937147259712, + 0.055429887026548386, + -0.0993039608001709, + -0.007333341054618359, + -0.01444720197468996, + 0.011755740270018578, + 0.009830908849835396, + 0.06294649839401245, + -0.018156779929995537, + -0.002377038123086095, + 0.022828172892332077, + -0.04380093514919281, + -0.1374298334121704, + 0.02294309064745903, + -0.10297873616218567, + 0.08140749484300613, + -0.07215467095375061, + -0.1083482950925827, + -0.02114628069102764, + 0.001371038262732327, + 0.04278431087732315, + 0.010219978168606758, + -0.01512727327644825, + 0.052158843725919724, + 0.16372422873973846, + 0.013676319271326065, + 0.05495218187570572, + 0.0007175997598096728, + -0.05663706734776497, + 0.012069991789758205, + 0.037649329751729965, + 0.01948447711765766, + -0.0512474849820137, + 0.11020005494356155, + -0.023771697655320168, + -0.0012304888805374503, + 0.020092930644750595, + -0.1146860346198082, + -0.0438794381916523, + 0.04300037398934364, + -0.03867381811141968, + -0.019312717020511627, + -0.024950552731752396, + -0.002534549916163087, + -0.05829746276140213, + 0.008972163312137127, + -0.012780758552253246, + 0.016386160627007484, + -0.05619106441736221, + -0.018208717927336693, + 0.012152047827839851, + -0.07076022773981094, + -0.01682194694876671, + -0.10017739981412888, + -0.005465097259730101, + -0.02382689341902733, + -0.03370961546897888, + 0.017112525179982185, + 0.03918546810746193, + 0.07431663572788239, + 0.015576801262795925, + 0.03063770942389965, + -0.004469059407711029, + -0.014501787722110748, + -0.05347658693790436, + 0.09268268197774887, + -0.00994704756885767, + 0.02416958659887314, + -0.042959343641996384, + 0.0054460130631923676, + 0.021496713161468506, + 0.03000027686357498, + 0.005273900460451841, + 0.026996662840247154, + 0.02276689000427723, + -0.0014472146285697818, + -0.060917966067790985, + 0.027655525133013725, + 0.061502259224653244, + -0.11952031403779984, + 0.030011385679244995, + -0.05687326937913895, + 0.060966480523347855, + 0.06150035932660103, + 0.061746325343847275, + 0.0011644040932878852, + -0.0001445966772735119, + -0.05848454684019089, + 0.05940479040145874, + -0.014085628092288971, + 0.05619577690958977, + 0.03799273446202278, + -0.07565603405237198, + -0.04841205105185509, + 0.031207634136080742, + -0.04953097924590111, + -0.056904587894678116, + 0.033963192254304886, + 0.0389089360833168, + -0.07990080118179321, + 0.03592197224497795, + -0.04781241714954376, + 0.027791690081357956, + 0.05541560426354408, + -0.06685712933540344, + 0.03614518418908119, + -0.01009571272879839, + -0.0020356131717562675, + 0.005716889165341854, + 0.048633426427841187, + 0.029368242248892784, + -0.09492899477481842, + -0.04998498037457466, + 0.011321512050926685, + -0.08635962754487991, + 0.04048946872353554, + -0.09824447333812714, + 0.03232910856604576, + 0.026718610897660255, + -0.02435564249753952, + 0.010990184731781483, + -0.02275647222995758, + -0.05113140493631363, + 0.04541943222284317, + 0.04781690984964371, + -0.012362008914351463, + 0.059204503893852234, + 0.012072917073965073, + 0.04243623837828636, + 0.04804222658276558, + -0.04864563047885895, + -0.008150506764650345, + -0.02444041147828102, + 0.045178886502981186, + 0.04454648867249489, + 0.03072039783000946, + -0.07096579670906067, + 0.05970869958400726, + -0.028193918988108635, + -0.020626066252589226, + 0.024492233991622925, + 0.008633643388748169, + -0.025644412264227867, + 0.06317812204360962, + -0.00013752281665802002, + 0.038114745169878006, + -0.020713621750473976, + -0.020945874974131584, + -0.03710843622684479, + -0.07926821708679199, + 0.068260557949543, + 0.07304906100034714, + 0.0012549443636089563, + 0.06902801245450974 + ], + "index": 1, + "object": "embedding" + }, + { + "embedding": [ + -0.012515432201325893, + 0.03260233998298645, + 0.02720189094543457, + -0.03063809871673584, + 0.03477800264954567, + -0.0005420063971541822, + 0.03848633915185928, + -0.07008987665176392, + -0.005540861748158932, + -0.12454225867986679, + -0.03335544839501381, + -0.01859859749674797, + 0.016931841149926186, + -0.0417923778295517, + 0.02759881317615509, + -0.05975465476512909, + -0.014693298377096653, + 0.004260290879756212, + 0.0316493920981884, + 0.04292448237538338, + -0.015032760798931122, + -0.012787492014467716, + 0.0445796437561512, + -0.00853970367461443, + 0.008431212045252323, + 0.014480143785476685, + 0.004353893455117941, + -0.022154586389660835, + 0.055982958525419235, + -0.002053084783256054, + -0.029908252879977226, + 0.03852834925055504, + 0.015174348838627338, + 0.005734920967370272, + -0.07095876336097717, + 0.056373488157987595, + 0.021792849525809288, + 0.01672499068081379, + 0.04869721084833145, + 0.11365382373332977, + 0.05500693991780281, + 0.05714111775159836, + -0.057067856192588806, + -0.015970412641763687, + 0.04116453230381012, + 0.10372499376535416, + -0.014045807532966137, + -0.023079970851540565, + 0.05282428488135338, + 0.07795163244009018, + 0.002015302889049053, + 0.0719466581940651, + 0.11998643726110458, + 0.03806350380182266, + 0.009247318841516972, + -0.08772578090429306, + -0.01913667656481266, + 0.08762997388839722, + 0.04261832311749458, + -0.041809290647506714, + 0.019670585170388222, + 0.003269221168011427, + -0.031362734735012054, + -0.05653807520866394, + 0.0086217587813735, + 0.07690869271755219, + -0.008498962968587875, + 0.01883823610842228, + 0.034656062722206116, + 0.012021624483168125, + 0.04522744566202164, + -0.11988889425992966, + 0.05314110592007637, + 0.021781332790851593, + 0.0069904024712741375, + 0.022117121145129204, + -0.045297060161828995, + 0.030793005600571632, + -0.036237362772226334, + 0.00751606747508049, + -0.05219532176852226, + 0.031398966908454895, + 0.017320938408374786, + -0.05713142082095146, + -0.02045215107500553, + -0.10069804638624191, + 0.0858391746878624, + 0.009377778507769108, + -0.022318389266729355, + -0.03138192370533943, + 0.050704389810562134, + 0.06078115105628967, + -0.01579766720533371, + 0.015833856537938118, + 0.004209970589727163, + -0.08698860555887222, + -0.05849804729223251, + 0.07033050805330276, + -0.04091642424464226, + -0.06414582580327988, + -0.07127337902784348, + -0.04292427748441696, + 0.07248425483703613, + 0.017845110967755318, + 0.02412467449903488, + 0.06425701826810837, + 0.02847393788397312, + 0.07783179730176926, + 0.05828293412923813, + 0.014767034910619259, + -0.01587904617190361, + 0.019848834723234177, + -0.01861366629600525, + -0.057433173060417175, + -0.015352700836956501, + 0.06340795010328293, + -0.10458502918481827, + -0.0013390789972618222, + -0.0007215099176391959, + 0.026150047779083252, + -0.02329542487859726, + 0.06535427272319794, + 0.0006045400514267385, + -0.019903065636754036, + -0.014266586862504482, + 0.046450741589069366, + -0.025217456743121147, + -0.03382576256990433, + -0.04488691687583923, + -0.024416420608758926, + -0.08216138184070587, + 0.030968768522143364, + 0.033012744039297104, + 0.017675388604402542, + 0.09381162375211716, + -0.09850151836872101, + 0.004139481578022242, + 0.03229626268148422, + -0.06893876940011978, + 0.05431831628084183, + -0.053904321044683456, + 0.0735350176692009, + -0.053244028240442276, + -0.023420289158821106, + -0.002636925783008337, + -0.03822736814618111, + -0.00785704143345356, + 0.003931798040866852, + -0.03736377879977226, + 0.008813220076262951, + -0.030051087960600853, + 0.01478652935475111, + 0.013907031156122684, + 0.03155709058046341, + -0.03207581117749214, + 0.001005080179311335, + 0.039515431970357895, + 0.05144026502966881, + 0.03285501152276993, + 0.025997433811426163, + -0.022351136431097984, + 0.08124064654111862, + -0.00038137283991090953, + 0.03365359455347061, + 0.029545608907938004, + -0.02969249337911606, + -0.05561249703168869, + -0.028099672868847847, + 0.01337841060012579, + 0.006064951419830322, + 0.03557957336306572, + -0.040300022810697556, + 0.006043149158358574, + 0.037366122007369995, + 0.057810332626104355, + -0.0819191262125969, + -0.000972002453636378, + 0.004794939886778593, + 0.03518398106098175, + -0.01995996944606304, + 0.042792342603206635, + 0.009072910062968731, + 0.023623615503311157, + -0.030623145401477814, + -0.024775559082627296, + -0.030295735225081444, + -0.057979218661785126, + -0.08435564488172531, + -0.022110700607299805, + -0.0043212613090872765, + -0.04147777333855629, + -0.026760468259453773, + 0.03731884807348251, + -0.009823962114751339, + 0.03550677374005318, + -0.011399107053875923, + 0.06699027121067047, + 0.07271561771631241, + 0.042543623596429825, + -0.010588261298835278, + 0.07651684433221817, + -0.014598710462450981, + 0.03448832780122757, + -0.002902877749875188, + 0.04212474077939987, + 0.0471639409661293, + 0.04418337717652321, + 0.0016587156569585204, + -0.017351144924759865, + 0.05114859342575073, + -0.0682496652007103, + -0.02260199747979641, + 0.00673691974952817, + -0.0077768792398273945, + -0.06297172605991364, + 0.040459513664245605, + -0.05914584547281265, + -0.04049861431121826, + 0.0461801141500473, + 0.012582770548760891, + 0.14274302124977112, + 0.04847661405801773, + 0.08519135415554047, + -0.057096946984529495, + -0.08793361485004425, + -0.03734228014945984, + -0.09761207550764084, + -0.001482452149502933, + -0.030877260491251945, + -0.041506871581077576, + 0.0691782683134079, + 0.012989937327802181, + 0.08646338433027267, + 0.01953308656811714, + 0.023443715646862984, + 0.057724956423044205, + -0.007654010783880949, + 0.03466172516345978, + 0.0006843915907666087, + -0.04486618936061859, + 0.024276461452245712, + -0.021629629656672478, + -0.022282570600509644, + -0.035966772586107254, + -0.005518535152077675, + -0.026481663808226585, + -0.013767787255346775, + 0.06516901403665543, + 0.01969030871987343, + -0.13317345082759857, + 0.019300242885947227, + 0.019933084025979042, + 0.06287774443626404, + 0.013750261627137661, + 0.03447985649108887, + 0.07810985296964645, + 0.018358970060944557, + 0.012795176357030869, + -0.06612854450941086, + -0.058563198894262314, + 0.016424410045146942, + -0.02067185379564762, + -0.015918921679258347, + 0.025390373542904854, + -0.028407646343111992, + 0.03124193102121353, + -0.10122860223054886, + 0.04197580739855766, + -0.08963284641504288, + 0.026146190240979195, + -0.01856786198914051, + -0.010458329692482948, + 0.031608697026968, + -0.021787671372294426, + -0.028194308280944824, + 0.02720602974295616, + -0.008009547367691994, + -0.06270723789930344, + -0.03005572222173214, + 0.0553298182785511, + -0.046275507658720016, + -0.025675464421510696, + -0.007803676649928093, + -0.00633775070309639, + -0.04232168197631836, + -0.08986468613147736, + 0.04186020791530609, + -0.006163034588098526, + -0.014706314541399479, + -0.002399338409304619, + 0.054564133286476135, + 0.02417084388434887, + 0.028201937675476074, + 0.0034926559310406446, + -0.04690483585000038, + -0.026523549109697342, + -0.05147939175367355, + -0.05148949474096298, + -0.05623650923371315, + 0.036759570240974426, + 0.00020510796457529068, + -0.014181791804730892, + -0.049038566648960114, + -0.02344380132853985, + -0.0317348949611187, + -0.0425717867910862, + -0.05112219601869583, + 0.01621064729988575, + 0.02486266754567623, + -0.00010788533836603165, + -0.04794544354081154, + 0.052890051156282425, + -0.045355793088674545, + 0.0008289514225907624, + 0.07432115077972412, + -0.06217609718441963, + -0.03727240115404129, + 0.01275230385363102, + 0.0683804526925087, + 0.02098444290459156, + -0.07274900376796722, + 0.0001914510503411293, + -0.00959416851401329, + -0.0031833224929869175, + 0.025968821719288826, + 0.003827204927802086, + 0.030850160866975784, + -0.004250509198755026, + 0.04129109904170036, + 0.024965768679976463, + -0.02617574669420719, + 0.002525634365156293, + 0.03409614413976669, + 0.027047012001276016, + -0.04093309864401817, + 0.06229269877076149, + -0.02466038428246975, + 0.01959075592458248, + 0.011115537956357002, + -0.03819743171334267, + -0.04244459792971611, + 0.02954724431037903, + -0.1223335936665535, + 0.0425892136991024, + 0.0009347691084258258, + 0.014465676620602608, + -0.004433237947523594, + -0.0181916281580925, + 0.01647932454943657, + -0.04831191897392273, + -0.041808366775512695, + -0.011575737036764622, + -0.029532505199313164, + -0.04887956380844116, + 0.039505910128355026, + 0.05488383024930954, + 0.014826108701527119, + -0.0035568978637456894, + 0.04775412380695343, + -0.03506261110305786, + -0.041741132736206055, + -0.08753718435764313, + -0.05189897119998932, + 0.016402943059802055, + -0.017528891563415527, + -0.014408205635845661, + 0.04142659157514572, + -0.03414402902126312, + 0.030394863337278366, + -0.05494023486971855, + -0.0020147650502622128, + -0.015078254044055939, + 0.014495639130473137, + -0.048556774854660034, + -0.0017153157386928797, + -0.019573288038372993, + -0.016060980036854744, + -0.03694693371653557, + -0.01534409262239933, + 0.018440935760736465, + -0.05878711864352226, + 0.025446785613894463, + -0.013849408365786076, + -0.02725357934832573, + 0.003758995793759823, + -0.03052379935979843, + 0.023064110428094864, + 0.003202371532097459, + 0.012115336023271084, + 0.017133090645074844, + 0.05075334012508392, + -0.007249451708048582, + 0.012151451781392097, + 0.03456561639904976, + -0.06746973097324371, + 0.07573828101158142, + 0.01949349232017994, + -0.07276243716478348, + -0.015839863568544388, + 0.018274053931236267, + 0.003989342134445906, + -0.03206317499279976, + 0.010148841887712479, + 0.06937778741121292, + 0.013019630685448647, + -0.012600183486938477, + -0.13619281351566315, + 0.0681464821100235, + 0.004287313669919968, + -0.05014709755778313, + -0.010993806645274162, + 0.011272232048213482, + 0.0038220612332224846, + -0.0731922909617424, + -0.08350039273500443, + 0.04869406670331955, + -0.030828624963760376, + -0.003825632855296135, + -0.048009078949689865, + 0.07904882729053497, + -0.0480419360101223, + 0.014385851100087166, + -0.035874683409929276, + -0.009149832651019096, + 0.0022898276802152395, + -0.04600370675325394, + 0.016496647149324417, + 0.04642873629927635, + -0.005550712812691927, + -0.015640679746866226, + 0.10773736983537674, + -0.10888604819774628, + -0.004197744186967611, + -0.04975472763180733, + 0.018129728734493256, + 0.016478830948472023, + 0.007430907338857651, + 0.041030142456293106, + 0.0028355473186820745, + 0.01874443329870701, + 0.022451285272836685, + 0.05587637424468994, + 0.0629202276468277, + -0.038079120218753815, + 0.08001914620399475, + 0.050176240503787994, + 0.029776310548186302, + 0.03715231642127037, + 0.027659498155117035, + 0.004129384644329548, + -0.04897352680563927, + -0.0036505744792521, + -0.012148413807153702, + -0.0634574294090271, + -0.00014068372547626495, + -0.015438939444720745, + 0.0234787967056036, + 0.023546701297163963, + 0.11989669501781464, + -0.02286195009946823, + -0.09922581166028976, + 0.010974395088851452, + -0.015065480023622513, + 0.04465459659695625, + -0.019842462614178658, + 0.0668787956237793, + 1.804158091545105e-05, + 0.007084874901920557, + 0.06900306046009064, + -0.07443176954984665, + -0.016705479472875595, + 0.027354076504707336, + 0.011424290016293526, + -0.053201232105493546, + -0.05392533168196678, + 0.005875579547137022, + -0.06356683373451233, + 0.11036472767591476, + 0.006547355558723211, + -0.008861691690981388, + -0.03610360249876976, + -0.0851614773273468, + 0.05843200162053108, + 0.008612367324531078, + 0.05748013034462929, + -0.032950904220342636, + 0.08398287743330002, + -0.023840034380555153, + -0.010651693679392338, + 0.04326775297522545, + -0.06472321599721909, + -0.05850466713309288, + 0.07644739747047424, + -0.029800835996866226, + -0.017040502279996872, + -0.02012176625430584, + 0.0241094958037138, + -0.004349792841821909, + 0.01589028351008892, + 0.026318684220314026, + -0.017132360488176346, + -0.0760699138045311, + 0.06471116840839386, + 0.0036099611315876245, + 0.057122085243463516, + 0.02487128973007202, + 0.09268424659967422, + -0.03311850503087044, + 0.00805120263248682, + -0.01722189038991928, + 0.027575809508562088, + -0.07266110181808472, + -0.020801866427063942, + -0.002835495164617896, + 0.054792169481515884, + -0.00043203120003454387, + 0.05070323869585991, + -0.03546581789851189, + -0.03175608441233635, + -0.02117747813463211, + 0.05899014696478844, + -0.04069221392273903, + 0.012186076492071152, + -0.0477367602288723, + -0.042937543243169785, + -0.011687318794429302, + 0.007221126928925514, + -0.06172960624098778, + 0.011092118918895721, + -0.04225287586450577, + 0.00943679641932249, + -0.0035681461449712515, + 0.02226758562028408, + 0.04908335208892822, + 0.0050078872591257095, + -0.08368325978517532, + -0.06465264409780502, + 0.019280916079878807, + -0.02791602537035942, + -0.016978342086076736, + 0.05448430776596069, + -0.018466975539922714, + 0.027838630601763725, + 0.006129787303507328, + -0.00636322982609272, + 0.012559954077005386, + -0.01729779876768589, + 0.08228688687086105, + 0.018394023180007935, + 0.014464118517935276, + -0.053292542695999146, + -0.01751112751662731, + -0.009948067367076874, + 0.05636981874704361, + -0.023487884551286697, + -0.009742247872054577, + 0.07505694776773453, + -0.005170504096895456, + -0.003190675051882863, + -0.00279915239661932, + 0.0005545867024920881, + -0.053126152604818344, + 0.037578996270895004, + 0.0763295441865921, + -0.014111213386058807, + 0.06626037508249283, + 0.03896726295351982, + -0.006059445906430483, + -0.0651235282421112, + 0.01087851170450449, + 0.03649519383907318, + 0.04939142242074013, + -0.055007562041282654, + -0.022154496982693672, + 0.0862228125333786, + -0.025579020380973816, + 0.09164395183324814, + 0.03109506517648697, + -0.05226036161184311, + -0.013268224895000458, + 0.04804699867963791, + 4.490138962864876e-05, + -0.0385504774749279, + -0.08635174483060837, + 0.013357405550777912, + -0.06919165700674057, + -0.04143214225769043, + 0.016120348125696182, + 0.019461655989289284, + 0.008062552660703659, + -0.10073893517255783, + -0.023437203839421272, + -0.05571995675563812, + -0.0134874964132905, + 0.04823806881904602, + 0.03130027651786804, + -0.025198806077241898, + -0.09797971695661545, + 0.03771478682756424, + 0.10405509173870087, + 0.03516940772533417, + 0.01420576125383377, + -0.024177469313144684, + -0.01987389661371708, + -0.030255047604441643, + -0.02431170642375946, + -0.0625421479344368, + 0.008973737247288227, + 0.05231521278619766, + 0.0426374226808548, + 0.0066823940724134445, + -0.09096067398786545, + -0.01626681350171566, + -0.11594285815954208, + -0.0359799899160862, + 0.029743840917944908, + -0.10215539485216141, + -0.03258639574050903, + 0.0018218549666926265, + 0.03432832658290863, + 0.01830124296247959, + 0.047193076461553574, + -0.025630492717027664, + -0.000209759920835495, + 0.04906989261507988, + -0.04863372817635536, + -0.13231651484966278, + 0.02664823830127716, + -0.08732496201992035, + 0.047821857035160065, + -0.06816985458135605, + -0.07838636636734009, + -0.04244186356663704, + -0.005295990966260433, + 0.05835377424955368, + 0.000430088461143896, + -0.015599140897393227, + 0.03446502611041069, + 0.16954639554023743, + -0.0026430650614202023, + 0.018939455971121788, + 0.002524139592424035, + -0.05941304564476013, + -0.00018306449055671692, + 0.040990184992551804, + 0.0026893923059105873, + -0.04742790013551712, + 0.061212047934532166, + -0.008863217197358608, + 0.0034324615262448788, + 0.01018920261412859, + -0.1257857233285904, + -0.033470820635557175, + 0.06259030848741531, + -0.032041486352682114, + -0.013030152767896652, + -0.015315528959035873, + -0.0262373685836792, + -0.06656482815742493, + -0.006664900109171867, + -0.005345784593373537, + 0.02795189805328846, + -0.06794386357069016, + -0.007617181167006493, + 0.018953045830130577, + -0.04215746372938156, + -0.020535781979560852, + -0.0974135473370552, + 0.021170664578676224, + -0.03232649341225624, + -0.02226462960243225, + 0.0033799775410443544, + 0.03139590099453926, + 0.07702428847551346, + 0.020632006227970123, + 0.04135206341743469, + -0.005838264711201191, + -0.04882073029875755, + -0.0546310618519783, + 0.08807472884654999, + -0.02597636543214321, + 0.02731456607580185, + -0.07378196716308594, + 0.0023201811127364635, + 0.015087456442415714, + 0.03850467503070831, + 6.568059325218201e-05, + 0.028357921168208122, + 0.008075999096035957, + 0.01279203500598669, + -0.07228657603263855, + 0.02025614306330681, + 0.042001038789749146, + -0.10098549723625183, + 0.01813703402876854, + -0.05564628541469574, + 0.04947810247540474, + 0.06144997105002403, + 0.06511534005403519, + 0.028459731489419937, + -0.0202501080930233, + -0.054074160754680634, + 0.035052791237831116, + -0.02881743386387825, + 0.05614350363612175, + 0.0564420223236084, + -0.06703104823827744, + -0.05826301500201225, + 0.045137058943510056, + -0.050847675651311874, + -0.024736888706684113, + 0.014058568514883518, + 0.05113906040787697, + -0.06775201112031937, + 0.034619346261024475, + -0.049128640443086624, + 0.024221250787377357, + 0.04866266995668411, + -0.06085849925875664, + 0.0019210544414818287, + 0.012623196467757225, + 0.012382696382701397, + 0.028603874146938324, + 0.03873681649565697, + 0.007176251616328955, + -0.080104760825634, + -0.06235386058688164, + 0.025732800364494324, + -0.06737439334392548, + 0.04096699506044388, + -0.079249806702137, + 0.016131388023495674, + 0.010090269148349762, + -0.034486234188079834, + 0.0038874847814440727, + -0.05507781729102135, + -0.07303879410028458, + 0.04909278079867363, + 0.046375684440135956, + 0.0017833691090345383, + 0.029175374656915665, + 0.02261977642774582, + 0.034264303743839264, + 0.04648405686020851, + -0.038263995200395584, + -0.008774058893322945, + -0.0252663753926754, + 0.036237649619579315, + 0.03748451545834541, + 0.0358039066195488, + -0.04108024761080742, + 0.07002699375152588, + -0.028500907123088837, + -0.02754187397658825, + 0.029117228463292122, + 0.02439846843481064, + 0.0012119816383346915, + 0.06623277813196182, + 0.0010657437378540635, + 0.05972994118928909, + -0.027077756822109222, + 0.009675722569227219, + -0.048254966735839844, + -0.05424213036894798, + 0.07243489474058151, + 0.08056811988353729, + -0.031383778899908066, + 0.05910726264119148 + ], + "index": 2, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/e8b427b3d631.json b/tests/integration/recordings/responses/e8b427b3d631.json new file mode 100644 index 000000000..89a16720e --- /dev/null +++ b/tests/integration/recordings/responses/e8b427b3d631.json @@ -0,0 +1,802 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": [ + "How do systems learn without explicit programming?" + ] + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.028625313192605972, + 0.009644811041653156, + 0.0526261106133461, + -0.010888906195759773, + -0.009496178478002548, + 0.001263381214812398, + 0.023293282836675644, + -0.08243905007839203, + -0.026478247717022896, + -0.13464388251304626, + -0.0512986034154892, + 0.026655403897166252, + 0.0030439384281635284, + -0.035521239042282104, + 0.020391393452882767, + -0.07780768722295761, + 0.006606558337807655, + 0.008830295875668526, + -0.001793196308426559, + 0.022731754928827286, + 0.049890514463186264, + 0.013548094779253006, + 0.012267746031284332, + 0.03063983842730522, + 0.06707301735877991, + -0.007570159155875444, + 0.04272060468792915, + 0.002707085572183132, + 0.07793699949979782, + -0.0068320054560899734, + 0.004189986269921064, + 0.02070143073797226, + 0.015760784968733788, + 0.0042287008836865425, + -0.03386549651622772, + 0.02033020369708538, + 0.01456975657492876, + 0.048187460750341415, + 0.03820285201072693, + 0.10077767074108124, + 0.04321419447660446, + 0.01897420734167099, + -0.014983413740992546, + -0.018025003373622894, + 0.04455850273370743, + 0.022786501795053482, + -0.011920962482690811, + -0.008890517055988312, + 0.11744298040866852, + 0.03246714919805527, + -0.029088173061609268, + 0.09496089071035385, + 0.12422505766153336, + 0.0069929324090480804, + 0.0178871750831604, + -0.05463777855038643, + 0.03657285496592522, + 0.04830474033951759, + 0.06253045797348022, + -0.05359767749905586, + 0.025412533432245255, + 0.01953939162194729, + 0.021154027432203293, + -0.02993696928024292, + 0.028013402596116066, + 0.07734477519989014, + -0.016874393448233604, + 0.030011700466275215, + 6.0238875448703766e-05, + 0.023803716525435448, + 0.009123258292675018, + -0.07111874222755432, + 0.02250090055167675, + 0.04815131053328514, + -0.008147301152348518, + -0.005537823773920536, + -0.016138499602675438, + 0.035387761890888214, + -0.0352698490023613, + -0.025574462488293648, + -0.010039239190518856, + 0.03524880111217499, + 0.04696853831410408, + -0.04174993932247162, + -0.000597537902649492, + -0.08016331493854523, + 0.10956454277038574, + -0.016568735241889954, + -0.016319751739501953, + -0.017709530889987946, + 0.041958339512348175, + 0.04584357887506485, + 0.03287360444664955, + 0.018359653651714325, + 0.04788267984986305, + -0.12737058103084564, + 0.007353549357503653, + -0.00445661460980773, + -0.041159022599458694, + -0.04949790611863136, + -0.06846798211336136, + -0.018516182899475098, + 0.058480989187955856, + 0.009973258711397648, + 0.0295123178511858, + 0.06923972070217133, + 0.081133633852005, + 0.1264415681362152, + 0.06378389894962311, + -0.02661179006099701, + -0.03658208250999451, + -0.000912379240617156, + 0.030871083959937096, + -0.05931675806641579, + -0.023184625431895256, + 0.039929017424583435, + -0.09083712100982666, + -0.0017611589282751083, + -0.011387099511921406, + -0.00693067442625761, + -0.02676786482334137, + 0.03417220711708069, + -0.02904115431010723, + -0.029341822490096092, + -0.030477264896035194, + 0.08719369769096375, + -0.04031936824321747, + -0.02029283717274666, + -0.02824019454419613, + -0.051644641906023026, + -0.07474397867918015, + -0.0038978576194494963, + -0.008521780371665955, + 0.057304758578538895, + 0.12079010158777237, + -0.08006061613559723, + -0.00023946911096572876, + 0.012549451552331448, + -0.018327832221984863, + 0.02607034333050251, + -0.026688536629080772, + 0.06374310702085495, + -0.03221059590578079, + -0.0324493870139122, + 0.03480648994445801, + -0.07498053461313248, + 0.011165045201778412, + -0.006876140367239714, + -0.020638445392251015, + -0.020414652302861214, + -0.04233550652861595, + 0.08592729270458221, + 0.02854750119149685, + -0.004440763499587774, + -0.017464132979512215, + 0.06481487303972244, + 0.0724131390452385, + -0.02446877211332321, + 0.04632553830742836, + 0.03923669457435608, + -0.010415825992822647, + 0.012624293565750122, + -0.015182485803961754, + -0.0016301083378493786, + 0.0013908827677369118, + -0.0366278700530529, + -0.06706399470567703, + -0.0017571141943335533, + 0.0017132752109318972, + 0.023335183039307594, + 0.02417340688407421, + -0.039039384573698044, + 0.007053125184029341, + 0.007630909793078899, + 0.04440589249134064, + -0.037289854139089584, + 0.01810174249112606, + 0.005866652820259333, + 0.008196947164833546, + -0.0303290244191885, + 0.05941026285290718, + 0.042503952980041504, + 0.012326585128903389, + -0.034453555941581726, + 0.006171736866235733, + -0.018924523144960403, + -0.0459442138671875, + -0.11310747265815735, + -0.03640446811914444, + -0.013007266446948051, + 0.03633805736899376, + -0.0325576551258564, + 0.0018916280241683125, + -0.011488232761621475, + 0.017741020768880844, + -0.007206412963569164, + 0.10348206758499146, + 0.10330463945865631, + 0.06081323325634003, + -0.06818842887878418, + 0.06551844626665115, + -0.04395010694861412, + 0.06050333008170128, + 0.021237587556242943, + 0.06765849143266678, + 0.020056981593370438, + 0.027479903772473335, + -0.010500827804207802, + -0.05388624593615532, + 0.05339483544230461, + -0.0213683620095253, + -0.020162755623459816, + 0.021549290046095848, + -0.005261938087642193, + -0.02159097045660019, + 0.04545314237475395, + 0.005680753383785486, + -0.03225092962384224, + 0.024309150874614716, + 0.030616233125329018, + 0.07422983646392822, + 0.026326946914196014, + 0.11893181502819061, + -0.032128795981407166, + -0.08504871279001236, + 0.002689552726224065, + -0.05723441764712334, + -0.007339973468333483, + 0.030395880341529846, + -0.03447697311639786, + 0.041313640773296356, + -0.012177404016256332, + 0.15924645960330963, + 0.007271280977874994, + 0.111238494515419, + 0.03315158933401108, + 0.029128430411219597, + 0.06465847790241241, + 0.005114587023854256, + -0.048711519688367844, + 0.08425623178482056, + 0.011614371091127396, + 0.03426260128617287, + -0.02214323729276657, + -0.005649253260344267, + -0.04427102580666542, + -0.025260724127292633, + 0.09123050421476364, + 0.055081237107515335, + -0.12634575366973877, + 0.03898511081933975, + -0.009349959902465343, + 0.10305799543857574, + 0.007667106110602617, + -0.0027667051181197166, + 0.08985280245542526, + 0.01930035464465618, + -0.0392981581389904, + -0.08319897949695587, + -0.08484388142824173, + 0.007134219631552696, + 0.0065269810147583485, + -0.05087956413626671, + 0.012833445332944393, + -0.002945164917036891, + 0.05391121283173561, + -0.06924069672822952, + 0.03136086091399193, + -0.10177676379680634, + 0.03596206381917, + -0.02389192022383213, + 0.05924130603671074, + 0.057269271463155746, + -0.010541991330683231, + -0.0406109020113945, + 0.0182547178119421, + -0.032190173864364624, + -0.04907294735312462, + -0.022161107510328293, + 0.0739339217543602, + -0.029147034510970116, + 0.0037474066484719515, + -0.03018752671778202, + -0.023249927908182144, + -0.015383096411824226, + -0.09470201283693314, + 0.0773773118853569, + -0.027345556765794754, + -0.0055006989277899265, + 0.0180343110114336, + 0.005922022741287947, + -0.019098954275250435, + -0.0004729041538666934, + 0.0007953455788083375, + -0.0033485391177237034, + -0.06081382557749748, + -0.010261679999530315, + -0.046479422599077225, + 0.02741287462413311, + 0.0127688804641366, + -0.008467267267405987, + -0.05143937095999718, + -0.03136477991938591, + -0.0019047032110393047, + -0.052847668528556824, + -0.02513357810676098, + -0.08015158772468567, + 0.039745401591062546, + 0.04605329409241676, + 0.0016742408042773604, + -0.05091538652777672, + 0.0445074662566185, + -0.03700404241681099, + -0.010182363912463188, + 0.08301099389791489, + -0.03250614181160927, + -0.03088577836751938, + -0.014350837096571922, + -0.009772134944796562, + -0.07475752383470535, + -0.060355402529239655, + 0.04241859167814255, + -0.012378721497952938, + 0.015629982575774193, + 0.033994343131780624, + -0.009667688049376011, + 0.04006745293736458, + -0.013781498186290264, + 0.021493006497621536, + 0.01062044221907854, + -0.03500600531697273, + 0.01835126429796219, + 0.014531598426401615, + 0.044000912457704544, + -0.02036239020526409, + 0.04688846692442894, + -0.0877162292599678, + 0.011904492974281311, + 0.03603767976164818, + -0.040766313672065735, + 0.020568832755088806, + 0.03657219186425209, + -0.08737213909626007, + 0.03322440758347511, + 0.02375749684870243, + 0.03609689697623253, + -0.019078781828284264, + 0.024186642840504646, + -0.007216745521873236, + -0.04318151995539665, + -0.028063487261533737, + 0.019065067172050476, + 0.02101775072515011, + -0.05957315117120743, + -0.014263416640460491, + 0.03555794805288315, + 0.0019766625482589006, + 0.04911893233656883, + 0.04590733349323273, + -0.03957784175872803, + -0.030610496178269386, + -0.04111376404762268, + -0.02033582329750061, + 0.006346330512315035, + 0.053494278341531754, + 0.014476560987532139, + 0.04860546439886093, + -0.023068532347679138, + 0.021707303822040558, + -0.04493881016969681, + -0.027079777792096138, + 0.04397837817668915, + 0.0118066081777215, + -0.004798768553882837, + 0.042905017733573914, + 0.005226527340710163, + -0.03075316548347473, + -0.030176855623722076, + 0.013604848645627499, + -0.0032692099921405315, + -0.04218987375497818, + 0.025406524538993835, + -0.016121670603752136, + -0.014863152988255024, + -0.0429101325571537, + -0.026481537148356438, + -0.012901737354695797, + 0.0442282110452652, + 0.036592260003089905, + 0.039383288472890854, + 0.003789229318499565, + 0.05980289354920387, + -0.0044682323932647705, + 0.07192400097846985, + -0.026064269244670868, + 0.11905914545059204, + 0.046934809535741806, + -0.06404329091310501, + -0.06687674671411514, + 0.0077804806642234325, + 0.011265481822192669, + -0.017687633633613586, + -0.014395356178283691, + 0.08574871718883514, + 0.0031307553872466087, + 0.021320363506674767, + -0.08204923570156097, + 0.009053068235516548, + 0.023229874670505524, + -0.052366625517606735, + -0.01396441925317049, + -0.03636457398533821, + -0.020884208381175995, + -0.02954680472612381, + -0.06550683081150055, + 0.08037273585796356, + -0.06033521890640259, + 0.01978268101811409, + -0.032372940331697464, + 0.022555716335773468, + -0.05029283091425896, + -0.016428381204605103, + 0.0025750305503606796, + -0.04512976109981537, + -0.03814585879445076, + -0.04166992008686066, + -0.011879000812768936, + 0.049479953944683075, + -0.02096664160490036, + -0.00909265223890543, + 0.06755069643259048, + -0.0926649197936058, + -0.002196504035964608, + -0.018177812919020653, + -0.005087037570774555, + 0.0161594171077013, + -0.01627577282488346, + 0.09823250025510788, + 0.025837138295173645, + -0.01585749164223671, + 0.02263566479086876, + 0.01224441546946764, + 0.024671562016010284, + -0.033585235476493835, + 0.1028127670288086, + 0.04315044358372688, + 0.020170297473669052, + -0.007471140008419752, + 0.049660082906484604, + 0.007516088895499706, + -0.010756206698715687, + -0.002503633964806795, + -0.033192023634910583, + -0.07095880061388016, + 0.019720053300261497, + 0.022650761529803276, + -0.005902944598346949, + -0.007311234250664711, + 0.10586094111204147, + 0.018423765897750854, + -0.06882017105817795, + -0.005236598197370768, + 0.02164839580655098, + 0.09039415419101715, + -0.01244199089705944, + 0.0474860854446888, + -0.0025995743926614523, + 0.02571304515004158, + 0.04335891455411911, + -0.06636872887611389, + 0.03492670878767967, + 0.02623179368674755, + -0.051421213895082474, + -0.06957545876502991, + -0.035445429384708405, + -0.0009482369641773403, + -0.02960582636296749, + 0.13412357866764069, + 0.019430331885814667, + 0.024845613166689873, + -0.04852084815502167, + -0.056044016033411026, + 0.062490787357091904, + 0.04769270494580269, + 0.03782081604003906, + -0.022404221817851067, + 0.11534290015697479, + -0.005633706226944923, + 0.0005008987500332296, + 0.025920547544956207, + -0.01304088905453682, + -0.05654619261622429, + 0.0008111510542221367, + -0.04102508723735809, + -0.01159842498600483, + -0.04102790355682373, + -0.018860163167119026, + -0.01706078089773655, + -0.005253573879599571, + 0.0071600270457565784, + -0.0641237124800682, + 0.01663907617330551, + 0.06719237565994263, + -0.027118725702166557, + 0.05404188111424446, + 0.06418643891811371, + 0.046228472143411636, + 0.00460213515907526, + -0.04415186867117882, + -0.000821807247120887, + -0.01879318617284298, + -0.06903015822172165, + 0.02069322019815445, + 0.01168833114206791, + 0.06540673226118088, + -0.004066139459609985, + 0.054738085716962814, + -0.034385669976472855, + 0.04338647425174713, + -0.04916132614016533, + 0.03518104925751686, + -0.02761712856590748, + -0.009327040985226631, + -0.007298008538782597, + 0.01527714729309082, + -0.02005157433450222, + 0.0429161936044693, + -0.03560428321361542, + 0.021534021943807602, + -0.08968672156333923, + 0.02676641382277012, + -0.004024573136121035, + -0.0036590290255844593, + 0.10452567040920258, + -0.060867004096508026, + -0.12179668247699738, + -0.03129281476140022, + 0.005221501924097538, + -0.0313928984105587, + -0.019577259197831154, + 0.042463574558496475, + -0.0006677712081000209, + 0.009064980782568455, + 0.003938136622309685, + 0.06904369592666626, + -0.008350541815161705, + 0.001019842573441565, + -0.016418535262346268, + 0.019143449142575264, + 0.021327154710888863, + -0.04326558858156204, + -0.0032139429822564125, + 0.051620472222566605, + 0.0051500024273991585, + 0.006842610891908407, + 0.017715459689497948, + 0.03285397216677666, + -0.029920704662799835, + -0.04683506861329079, + -0.05269252881407738, + 0.04261148348450661, + -0.021699104458093643, + 0.009875484742224216, + 0.038206521421670914, + 0.023899832740426064, + 0.04733270779252052, + 0.025072474032640457, + -0.011955616995692253, + -0.0911836326122284, + -0.027430472895503044, + 0.03977897763252258, + -0.04646480828523636, + 0.009046212770044804, + 0.016102170571684837, + 0.08183404058218002, + -0.03012625128030777, + 0.13459521532058716, + 0.024172481149435043, + -0.06742963194847107, + -0.01054252777248621, + -0.002808552235364914, + -0.01470745075494051, + 0.020792432129383087, + -0.10967203229665756, + 0.0326918289065361, + -0.013522210530936718, + -0.012200890108942986, + 0.019441930577158928, + -0.007326868362724781, + 0.01742427609860897, + -0.00791930966079235, + -0.015951860696077347, + -0.07966145873069763, + -0.02597867138683796, + 0.028643600642681122, + -0.0009648172999732196, + -0.018818242475390434, + -0.06351518630981445, + -0.0025841889437288046, + 0.06423984467983246, + 0.03219998627901077, + 0.023542635142803192, + 0.03236274793744087, + -0.04657657444477081, + 0.0035329016391187906, + -0.03991316258907318, + -0.08277847617864609, + 0.026228271424770355, + 0.06054516136646271, + -0.031066352501511574, + 0.016718082129955292, + -0.05617064610123634, + -0.05071862041950226, + -0.05031099542975426, + -0.038091082125902176, + 0.03737860545516014, + -0.03760669007897377, + -0.02294175513088703, + 0.004769078455865383, + 0.036339402198791504, + 0.01194134633988142, + 0.05540051311254501, + -0.0023583073634654284, + -0.0004474227025639266, + 0.03956727683544159, + -0.026903294026851654, + -0.14041468501091003, + 0.023754306137561798, + -0.06810899823904037, + 0.034333907067775726, + -0.07242204248905182, + -0.06669372320175171, + -0.004059847444295883, + -0.05053563788533211, + 0.04531155154109001, + 0.0096511822193861, + -0.02245948649942875, + 0.03169103339314461, + 0.13549870252609253, + -0.012408362701535225, + -0.02813619002699852, + 0.007518284022808075, + -0.1057506576180458, + 0.011356416158378124, + 0.039891116321086884, + 0.020536471158266068, + -0.04081280156970024, + 0.0358579196035862, + 0.047813210636377335, + 0.00611690990626812, + -0.03651907667517662, + -0.09735521674156189, + -0.037454377859830856, + 0.06075636297464371, + -0.017364319413900375, + 0.01145813800394535, + -0.0012936473358422518, + -0.040848348289728165, + -0.054882243275642395, + -0.004391546826809645, + 0.02311932109296322, + -0.059448402374982834, + -0.08560369908809662, + 0.024578850716352463, + -0.018858933821320534, + -0.04784354940056801, + 0.01785934343934059, + -0.1501590758562088, + 0.0545523464679718, + -0.028424229472875595, + -0.04118866100907326, + 0.03065965510904789, + 0.020051728934049606, + 0.02137753553688526, + 0.04693467542529106, + 0.09217966347932816, + -0.003789104986935854, + -0.03935939818620682, + -0.015190028585493565, + 0.02737855538725853, + -0.0399165078997612, + 0.02010611817240715, + -0.07557865232229233, + 0.07543471455574036, + -0.007976854220032692, + 0.042613375931978226, + -0.0014642559690400958, + 0.05411304160952568, + 0.03604671359062195, + -0.016428142786026, + -0.06250452250242233, + -0.015860218554735184, + 0.006275616120547056, + -0.07317031919956207, + -0.0053979321382939816, + -0.013590694405138493, + -0.036944758147001266, + 0.026295272633433342, + 0.07390531897544861, + 0.00654491176828742, + 0.06338920444250107, + -0.07365646958351135, + 0.02546025440096855, + -0.0912703424692154, + 0.03761362284421921, + 0.054920073598623276, + -0.07621566951274872, + -0.04062889888882637, + 0.041005026549100876, + -0.03953169658780098, + 0.009674740023911, + 0.01588456705212593, + 0.016106106340885162, + -0.014508946798741817, + -0.02321682870388031, + -0.031492218375205994, + -0.007039207033813, + 0.0502975694835186, + -0.07446885854005814, + -0.021667229011654854, + -0.016179269179701805, + 0.007176062557846308, + 0.028238704428076744, + -0.012822098098695278, + 0.011626574210822582, + -0.07122310250997543, + -0.059748850762844086, + 0.00676912534981966, + -0.061197683215141296, + 0.03426061198115349, + -0.007777668070048094, + 0.05285013094544411, + -0.010367357172071934, + -0.04381755739450455, + -0.04318838566541672, + -0.04743385314941406, + -0.07497932761907578, + 0.052410174161195755, + 0.003218524158000946, + -0.0017081985715776682, + -0.005368508864194155, + 0.04883018881082535, + 0.05742465704679489, + 0.051667261868715286, + 0.016194365918636322, + -0.028298640623688698, + -0.0371987409889698, + 0.07627178728580475, + 0.02160925231873989, + 0.028924649581313133, + -0.0026495244819670916, + 0.13363255560398102, + 0.0059050279669463634, + -0.03723873198032379, + 0.03029952198266983, + 0.03271273523569107, + -0.001898010727018118, + 0.059062160551548004, + -0.00840494129806757, + 0.04586789384484291, + -0.031058136373758316, + 0.042859043926000595, + -0.05417613312602043, + -0.056918635964393616, + 0.03155701607465744, + 0.1333579570055008, + -0.05978989601135254, + 0.053831737488508224 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/ef4d211b38bf.json b/tests/integration/recordings/responses/ef4d211b38bf.json new file mode 100644 index 000000000..b47f714b1 --- /dev/null +++ b/tests/integration/recordings/responses/ef4d211b38bf.json @@ -0,0 +1,59 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "Say hello" + } + ], + "max_tokens": 20 + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "oCfwSxL-4Yz4kd-984c278f1f0b4d19", + "choices": [ + { + "finish_reason": "length", + "index": 0, + "logprobs": null, + "message": { + "content": "Hello! It's nice to meet you. Is there something I can help you with or would you", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [] + }, + "seed": 11825451844891908000 + } + ], + "created": 1758820431, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 20, + "prompt_tokens": 37, + "total_tokens": 57, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + }, + "prompt": [] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/f4c5ae637cd1.json b/tests/integration/recordings/responses/f4c5ae637cd1.json new file mode 100644 index 000000000..cd47130c8 --- /dev/null +++ b/tests/integration/recordings/responses/f4c5ae637cd1.json @@ -0,0 +1,59 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "max_tokens": 10 + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "oCfwJnF-4Yz4kd-984c26e45a790f88", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "Hello. How can I assist you today?", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [] + }, + "seed": 6760981245874068000 + } + ], + "created": 1758820404, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 10, + "prompt_tokens": 36, + "total_tokens": 46, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + }, + "prompt": [] + } + }, + "is_streaming": false + } +} From c88c4ff2c63536350ca9f714bf804f7fc69995c0 Mon Sep 17 00:00:00 2001 From: Charlie Doern Date: Fri, 26 Sep 2025 10:18:07 -0400 Subject: [PATCH 24/27] feat: introduce API leveling, post_training, eval to v1alpha (#3449) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # What does this PR do? Rather than have a single `LLAMA_STACK_VERSION`, we need to have a `_V1`, `_V1ALPHA`, and `_V1BETA` constant. This also necessitated addition of `level` to the `WebMethod` so that routing can be handeled properly. For backwards compat, the `v1` routes are being kept around and marked as `deprecated`. When used, the server will log a deprecation warning. Deprecation log: Screenshot 2025-09-25 at 2 43 36 PM move: 1. post_training to `v1alpha` as it is under heavy development and not near its final state 2. eval: job scheduling is not implemented. Relies heavily on the datasetio API which is under development missing implementations of specific routes indicating the structure of those routes might change. Additionally eval depends on the `inference` API which is going to be deprecated, eval will likely need a major API surface change to conform to using completions properly implements leveling in #3317 note: integration tests will fail until the SDK is regenerated with v1alpha/inference as opposed to v1/inference ## Test Plan existing tests should pass with newly generated schema. Conformance will also pass as these routes are not the ones we currently test for stability Signed-off-by: Charlie Doern --- docs/openapi_generator/generate.py | 6 +- docs/openapi_generator/pyopenapi/generator.py | 2 +- .../openapi_generator/pyopenapi/operations.py | 233 ++++--- docs/static/llama-stack-spec.html | 653 ++++++++++++++++++ docs/static/llama-stack-spec.yaml | 458 ++++++++++++ llama_stack/apis/agents/agents.py | 40 +- .../apis/batch_inference/batch_inference.py | 5 +- llama_stack/apis/batches/batches.py | 9 +- llama_stack/apis/benchmarks/benchmarks.py | 13 +- llama_stack/apis/datasetio/datasetio.py | 5 +- llama_stack/apis/datasets/datasets.py | 9 +- llama_stack/apis/eval/eval.py | 32 +- llama_stack/apis/files/files.py | 11 +- llama_stack/apis/inference/inference.py | 23 +- llama_stack/apis/inspect/inspect.py | 7 +- llama_stack/apis/models/models.py | 11 +- .../apis/post_training/post_training.py | 19 +- llama_stack/apis/prompts/prompts.py | 15 +- llama_stack/apis/providers/providers.py | 5 +- llama_stack/apis/safety/safety.py | 5 +- llama_stack/apis/scoring/scoring.py | 5 +- .../scoring_functions/scoring_functions.py | 9 +- llama_stack/apis/shields/shields.py | 9 +- .../synthetic_data_generation.py | 3 +- llama_stack/apis/telemetry/telemetry.py | 29 +- llama_stack/apis/tools/rag_tool.py | 5 +- llama_stack/apis/tools/tools.py | 17 +- llama_stack/apis/vector_dbs/vector_dbs.py | 9 +- llama_stack/apis/vector_io/vector_io.py | 39 +- llama_stack/apis/version.py | 4 +- llama_stack/core/client.py | 20 +- llama_stack/core/server/routes.py | 30 +- llama_stack/core/server/tracing.py | 8 + llama_stack/schema_utils.py | 16 +- .../src/llama_stack_api_weather/weather.py | 3 +- 35 files changed, 1507 insertions(+), 260 deletions(-) diff --git a/docs/openapi_generator/generate.py b/docs/openapi_generator/generate.py index c27bc6440..54031d839 100644 --- a/docs/openapi_generator/generate.py +++ b/docs/openapi_generator/generate.py @@ -16,7 +16,7 @@ import sys import fire import ruamel.yaml as yaml -from llama_stack.apis.version import LLAMA_STACK_API_VERSION # noqa: E402 +from llama_stack.apis.version import LLAMA_STACK_API_V1 # noqa: E402 from llama_stack.core.stack import LlamaStack # noqa: E402 from .pyopenapi.options import Options # noqa: E402 @@ -25,7 +25,7 @@ from .pyopenapi.utility import Specification, validate_api # noqa: E402 def str_presenter(dumper, data): - if data.startswith(f"/{LLAMA_STACK_API_VERSION}") or data.startswith( + if data.startswith(f"/{LLAMA_STACK_API_V1}") or data.startswith( "#/components/schemas/" ): style = None @@ -58,7 +58,7 @@ def main(output_dir: str): server=Server(url="http://any-hosted-llama-stack.com"), info=Info( title="Llama Stack Specification", - version=LLAMA_STACK_API_VERSION, + version=LLAMA_STACK_API_V1, description="""This is the specification of the Llama Stack that provides a set of endpoints and their corresponding interfaces that are tailored to best leverage Llama Models.""", diff --git a/docs/openapi_generator/pyopenapi/generator.py b/docs/openapi_generator/pyopenapi/generator.py index 5ac712f02..cdbf1c60c 100644 --- a/docs/openapi_generator/pyopenapi/generator.py +++ b/docs/openapi_generator/pyopenapi/generator.py @@ -829,7 +829,7 @@ class Generator: else: raise NotImplementedError(f"unknown HTTP method: {op.http_method}") - route = op.get_route() + route = op.get_route(op.webmethod) route = route.replace(":path", "") print(f"route: {route}") if route in paths: diff --git a/docs/openapi_generator/pyopenapi/operations.py b/docs/openapi_generator/pyopenapi/operations.py index 045e33848..ce33d3bb9 100644 --- a/docs/openapi_generator/pyopenapi/operations.py +++ b/docs/openapi_generator/pyopenapi/operations.py @@ -11,7 +11,7 @@ import typing from dataclasses import dataclass from typing import Any, Callable, Dict, Iterable, Iterator, List, Optional, Tuple, Union -from llama_stack.apis.version import LLAMA_STACK_API_VERSION +from llama_stack.apis.version import LLAMA_STACK_API_V1, LLAMA_STACK_API_V1BETA, LLAMA_STACK_API_V1ALPHA from termcolor import colored @@ -113,11 +113,13 @@ class EndpointOperation: request_examples: Optional[List[Any]] = None response_examples: Optional[List[Any]] = None - def get_route(self) -> str: - if self.route is not None: - return "/".join(["", LLAMA_STACK_API_VERSION, self.route.lstrip("/")]) + def get_route(self, webmethod) -> str: + api_level = webmethod.level - route_parts = ["", LLAMA_STACK_API_VERSION, self.name] + if self.route is not None: + return "/".join(["", api_level, self.route.lstrip("/")]) + + route_parts = ["", api_level, self.name] for param_name, _ in self.path_params: route_parts.append("{" + param_name + "}") return "/".join(route_parts) @@ -152,33 +154,39 @@ def _get_endpoint_functions( functions = inspect.getmembers(endpoint, inspect.isfunction) for func_name, func_ref in functions: - webmethod = getattr(func_ref, "__webmethod__", None) - if not webmethod: + webmethods = [] + + # Check for multiple webmethods (stacked decorators) + if hasattr(func_ref, "__webmethods__"): + webmethods = func_ref.__webmethods__ + + if not webmethods: continue - print(f"Processing {colored(func_name, 'white')}...") - operation_name = func_name - - if webmethod.method == "GET": - prefix = "get" - elif webmethod.method == "DELETE": - prefix = "delete" - elif webmethod.method == "POST": - prefix = "post" - elif operation_name.startswith("get_") or operation_name.endswith("/get"): - prefix = "get" - elif ( - operation_name.startswith("delete_") - or operation_name.startswith("remove_") - or operation_name.endswith("/delete") - or operation_name.endswith("/remove") - ): - prefix = "delete" - else: - # by default everything else is a POST - prefix = "post" + for webmethod in webmethods: + print(f"Processing {colored(func_name, 'white')}...") + operation_name = func_name + + if webmethod.method == "GET": + prefix = "get" + elif webmethod.method == "DELETE": + prefix = "delete" + elif webmethod.method == "POST": + prefix = "post" + elif operation_name.startswith("get_") or operation_name.endswith("/get"): + prefix = "get" + elif ( + operation_name.startswith("delete_") + or operation_name.startswith("remove_") + or operation_name.endswith("/delete") + or operation_name.endswith("/remove") + ): + prefix = "delete" + else: + # by default everything else is a POST + prefix = "post" - yield prefix, operation_name, func_name, func_ref + yield prefix, operation_name, func_name, func_ref def _get_defining_class(member_fn: str, derived_cls: type) -> type: @@ -239,105 +247,101 @@ def get_endpoint_operations( "update", ], ): - # extract routing information from function metadata - webmethod = getattr(func_ref, "__webmethod__", None) - if webmethod is not None: + # Get all webmethods for this function + webmethods = getattr(func_ref, "__webmethods__", []) + + # Create one EndpointOperation for each webmethod + for webmethod in webmethods: route = webmethod.route route_params = _get_route_parameters(route) if route is not None else None public = webmethod.public request_examples = webmethod.request_examples response_examples = webmethod.response_examples - else: - route = None - route_params = None - public = False - request_examples = None - response_examples = None - # inspect function signature for path and query parameters, and request/response payload type - signature = get_signature(func_ref) + # inspect function signature for path and query parameters, and request/response payload type + signature = get_signature(func_ref) - path_params = [] - query_params = [] - request_params = [] - multipart_params = [] + path_params = [] + query_params = [] + request_params = [] + multipart_params = [] - for param_name, parameter in signature.parameters.items(): - param_type = _get_annotation_type(parameter.annotation, func_ref) + for param_name, parameter in signature.parameters.items(): + param_type = _get_annotation_type(parameter.annotation, func_ref) - # omit "self" for instance methods - if param_name == "self" and param_type is inspect.Parameter.empty: - continue + # omit "self" for instance methods + if param_name == "self" and param_type is inspect.Parameter.empty: + continue - # check if all parameters have explicit type - if parameter.annotation is inspect.Parameter.empty: + # check if all parameters have explicit type + if parameter.annotation is inspect.Parameter.empty: + raise ValidationError( + f"parameter '{param_name}' in function '{func_name}' has no type annotation" + ) + + is_multipart = _is_multipart_param(param_type) + + if prefix in ["get", "delete"]: + if route_params is not None and param_name in route_params: + path_params.append((param_name, param_type)) + else: + query_params.append((param_name, param_type)) + else: + if route_params is not None and param_name in route_params: + path_params.append((param_name, param_type)) + elif is_multipart: + multipart_params.append((param_name, param_type)) + else: + request_params.append((param_name, param_type)) + + # check if function has explicit return type + if signature.return_annotation is inspect.Signature.empty: raise ValidationError( - f"parameter '{param_name}' in function '{func_name}' has no type annotation" + f"function '{func_name}' has no return type annotation" ) - is_multipart = _is_multipart_param(param_type) - - if prefix in ["get", "delete"]: - if route_params is not None and param_name in route_params: - path_params.append((param_name, param_type)) - else: - query_params.append((param_name, param_type)) + return_type = _get_annotation_type(signature.return_annotation, func_ref) + + # operations that produce events are labeled as Generator[YieldType, SendType, ReturnType] + # where YieldType is the event type, SendType is None, and ReturnType is the immediate response type to the request + if typing.get_origin(return_type) is collections.abc.Generator: + event_type, send_type, response_type = typing.get_args(return_type) + if send_type is not type(None): + raise ValidationError( + f"function '{func_name}' has a return type Generator[Y,S,R] and therefore looks like an event but has an explicit send type" + ) else: - if route_params is not None and param_name in route_params: - path_params.append((param_name, param_type)) - elif is_multipart: - multipart_params.append((param_name, param_type)) + event_type = None + + def process_type(t): + if typing.get_origin(t) is collections.abc.AsyncIterator: + # NOTE(ashwin): this is SSE and there is no way to represent it. either we make it a List + # or the item type. I am choosing it to be the latter + args = typing.get_args(t) + return args[0] + elif typing.get_origin(t) is typing.Union: + types = [process_type(a) for a in typing.get_args(t)] + return typing._UnionGenericAlias(typing.Union, tuple(types)) + else: + return t + + response_type = process_type(return_type) + + if prefix in ["delete", "remove"]: + http_method = HTTPMethod.DELETE + elif prefix == "post": + http_method = HTTPMethod.POST + elif prefix == "get": + http_method = HTTPMethod.GET + elif prefix == "set": + http_method = HTTPMethod.PUT + elif prefix == "update": + http_method = HTTPMethod.PATCH else: - request_params.append((param_name, param_type)) + raise ValidationError(f"unknown prefix {prefix}") - # check if function has explicit return type - if signature.return_annotation is inspect.Signature.empty: - raise ValidationError( - f"function '{func_name}' has no return type annotation" - ) - - return_type = _get_annotation_type(signature.return_annotation, func_ref) - - # operations that produce events are labeled as Generator[YieldType, SendType, ReturnType] - # where YieldType is the event type, SendType is None, and ReturnType is the immediate response type to the request - if typing.get_origin(return_type) is collections.abc.Generator: - event_type, send_type, response_type = typing.get_args(return_type) - if send_type is not type(None): - raise ValidationError( - f"function '{func_name}' has a return type Generator[Y,S,R] and therefore looks like an event but has an explicit send type" - ) - else: - event_type = None - - def process_type(t): - if typing.get_origin(t) is collections.abc.AsyncIterator: - # NOTE(ashwin): this is SSE and there is no way to represent it. either we make it a List - # or the item type. I am choosing it to be the latter - args = typing.get_args(t) - return args[0] - elif typing.get_origin(t) is typing.Union: - types = [process_type(a) for a in typing.get_args(t)] - return typing._UnionGenericAlias(typing.Union, tuple(types)) - else: - return t - - response_type = process_type(return_type) - - if prefix in ["delete", "remove"]: - http_method = HTTPMethod.DELETE - elif prefix == "post": - http_method = HTTPMethod.POST - elif prefix == "get": - http_method = HTTPMethod.GET - elif prefix == "set": - http_method = HTTPMethod.PUT - elif prefix == "update": - http_method = HTTPMethod.PATCH - else: - raise ValidationError(f"unknown prefix {prefix}") - - result.append( - EndpointOperation( + # Create an EndpointOperation for this specific webmethod + operation = EndpointOperation( defining_class=_get_defining_class(func_name, endpoint), name=operation_name, func_name=func_name, @@ -354,7 +358,10 @@ def get_endpoint_operations( request_examples=request_examples if use_examples else None, response_examples=response_examples if use_examples else None, ) - ) + + # Store the specific webmethod with this operation + operation.webmethod = webmethod + result.append(operation) if not result: raise ValidationError(f"no eligible endpoint operations in type {endpoint}") diff --git a/docs/static/llama-stack-spec.html b/docs/static/llama-stack-spec.html index 36cb025c4..5a61221c1 100644 --- a/docs/static/llama-stack-spec.html +++ b/docs/static/llama-stack-spec.html @@ -175,6 +175,43 @@ } } }, + "/v1alpha/post-training/job/cancel": { + "post": { + "responses": { + "200": { + "description": "OK" + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "PostTraining (Coming Soon)" + ], + "summary": "Cancel a training job.", + "description": "Cancel a training job.", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CancelTrainingJobRequest" + } + } + }, + "required": true + } + } + }, "/v1/post-training/job/cancel": { "post": { "responses": { @@ -1179,6 +1216,60 @@ } } }, + "/v1alpha/eval/benchmarks/{benchmark_id}/evaluations": { + "post": { + "responses": { + "200": { + "description": "EvaluateResponse object containing generations and scores.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluateResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Eval" + ], + "summary": "Evaluate a list of rows on a benchmark.", + "description": "Evaluate a list of rows on a benchmark.", + "parameters": [ + { + "name": "benchmark_id", + "in": "path", + "description": "The ID of the benchmark to run the evaluation on.", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluateRowsRequest" + } + } + }, + "required": true + } + } + }, "/v1/eval/benchmarks/{benchmark_id}/evaluations": { "post": { "responses": { @@ -1366,6 +1457,85 @@ ] } }, + "/v1alpha/eval/benchmarks/{benchmark_id}": { + "get": { + "responses": { + "200": { + "description": "A Benchmark.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Benchmark" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Benchmarks" + ], + "summary": "Get a benchmark by its ID.", + "description": "Get a benchmark by its ID.", + "parameters": [ + { + "name": "benchmark_id", + "in": "path", + "description": "The ID of the benchmark to get.", + "required": true, + "schema": { + "type": "string" + } + } + ] + }, + "delete": { + "responses": { + "200": { + "description": "OK" + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Benchmarks" + ], + "summary": "Unregister a benchmark.", + "description": "Unregister a benchmark.", + "parameters": [ + { + "name": "benchmark_id", + "in": "path", + "description": "The ID of the benchmark to unregister.", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, "/v1/eval/benchmarks/{benchmark_id}": { "get": { "responses": { @@ -2079,6 +2249,50 @@ ] } }, + "/v1alpha/post-training/job/artifacts": { + "get": { + "responses": { + "200": { + "description": "A PostTrainingJobArtifactsResponse.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostTrainingJobArtifactsResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "PostTraining (Coming Soon)" + ], + "summary": "Get the artifacts of a training job.", + "description": "Get the artifacts of a training job.", + "parameters": [ + { + "name": "job_uuid", + "in": "query", + "description": "The UUID of the job to get the artifacts of.", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, "/v1/post-training/job/artifacts": { "get": { "responses": { @@ -2123,6 +2337,50 @@ ] } }, + "/v1alpha/post-training/job/status": { + "get": { + "responses": { + "200": { + "description": "A PostTrainingJobStatusResponse.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostTrainingJobStatusResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "PostTraining (Coming Soon)" + ], + "summary": "Get the status of a training job.", + "description": "Get the status of a training job.", + "parameters": [ + { + "name": "job_uuid", + "in": "query", + "description": "The UUID of the job to get the status of.", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, "/v1/post-training/job/status": { "get": { "responses": { @@ -2167,6 +2425,40 @@ ] } }, + "/v1alpha/post-training/jobs": { + "get": { + "responses": { + "200": { + "description": "A ListPostTrainingJobsResponse.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListPostTrainingJobsResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "PostTraining (Coming Soon)" + ], + "summary": "Get all training jobs.", + "description": "Get all training jobs.", + "parameters": [] + } + }, "/v1/post-training/jobs": { "get": { "responses": { @@ -2538,6 +2830,103 @@ ] } }, + "/v1alpha/eval/benchmarks/{benchmark_id}/jobs/{job_id}": { + "get": { + "responses": { + "200": { + "description": "The status of the evaluation job.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Job" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Eval" + ], + "summary": "Get the status of a job.", + "description": "Get the status of a job.", + "parameters": [ + { + "name": "benchmark_id", + "in": "path", + "description": "The ID of the benchmark to run the evaluation on.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "job_id", + "in": "path", + "description": "The ID of the job to get the status of.", + "required": true, + "schema": { + "type": "string" + } + } + ] + }, + "delete": { + "responses": { + "200": { + "description": "OK" + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Eval" + ], + "summary": "Cancel a job.", + "description": "Cancel a job.", + "parameters": [ + { + "name": "benchmark_id", + "in": "path", + "description": "The ID of the benchmark to run the evaluation on.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "job_id", + "in": "path", + "description": "The ID of the job to cancel.", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, "/v1/eval/benchmarks/{benchmark_id}/jobs/{job_id}": { "get": { "responses": { @@ -2635,6 +3024,59 @@ ] } }, + "/v1alpha/eval/benchmarks/{benchmark_id}/jobs/{job_id}/result": { + "get": { + "responses": { + "200": { + "description": "The result of the job.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluateResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Eval" + ], + "summary": "Get the result of a job.", + "description": "Get the result of a job.", + "parameters": [ + { + "name": "benchmark_id", + "in": "path", + "description": "The ID of the benchmark to run the evaluation on.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "job_id", + "in": "path", + "description": "The ID of the job to get the result of.", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, "/v1/eval/benchmarks/{benchmark_id}/jobs/{job_id}/result": { "get": { "responses": { @@ -2750,6 +3192,75 @@ ] } }, + "/v1alpha/eval/benchmarks": { + "get": { + "responses": { + "200": { + "description": "A ListBenchmarksResponse.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListBenchmarksResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Benchmarks" + ], + "summary": "List all benchmarks.", + "description": "List all benchmarks.", + "parameters": [] + }, + "post": { + "responses": { + "200": { + "description": "OK" + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Benchmarks" + ], + "summary": "Register a benchmark.", + "description": "Register a benchmark.", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RegisterBenchmarkRequest" + } + } + }, + "required": true + } + } + }, "/v1/eval/benchmarks": { "get": { "responses": { @@ -4783,6 +5294,50 @@ } } }, + "/v1alpha/post-training/preference-optimize": { + "post": { + "responses": { + "200": { + "description": "A PostTrainingJob.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostTrainingJob" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "PostTraining (Coming Soon)" + ], + "summary": "Run preference optimization of a model.", + "description": "Run preference optimization of a model.", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PreferenceOptimizeRequest" + } + } + }, + "required": true + } + } + }, "/v1/post-training/preference-optimize": { "post": { "responses": { @@ -5178,6 +5733,60 @@ } } }, + "/v1alpha/eval/benchmarks/{benchmark_id}/jobs": { + "post": { + "responses": { + "200": { + "description": "The job that was created to run the evaluation.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Job" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Eval" + ], + "summary": "Run an evaluation on a benchmark.", + "description": "Run an evaluation on a benchmark.", + "parameters": [ + { + "name": "benchmark_id", + "in": "path", + "description": "The ID of the benchmark to run the evaluation on.", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RunEvalRequest" + } + } + }, + "required": true + } + } + }, "/v1/eval/benchmarks/{benchmark_id}/jobs": { "post": { "responses": { @@ -5499,6 +6108,50 @@ } } }, + "/v1alpha/post-training/supervised-fine-tune": { + "post": { + "responses": { + "200": { + "description": "A PostTrainingJob.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostTrainingJob" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "PostTraining (Coming Soon)" + ], + "summary": "Run supervised fine-tuning of a model.", + "description": "Run supervised fine-tuning of a model.", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SupervisedFineTuneRequest" + } + } + }, + "required": true + } + } + }, "/v1/post-training/supervised-fine-tune": { "post": { "responses": { diff --git a/docs/static/llama-stack-spec.yaml b/docs/static/llama-stack-spec.yaml index c4b82b630..9c0558658 100644 --- a/docs/static/llama-stack-spec.yaml +++ b/docs/static/llama-stack-spec.yaml @@ -109,6 +109,32 @@ paths: schema: $ref: '#/components/schemas/BatchCompletionRequest' required: true + /v1alpha/post-training/job/cancel: + post: + responses: + '200': + description: OK + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - PostTraining (Coming Soon) + summary: Cancel a training job. + description: Cancel a training job. + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CancelTrainingJobRequest' + required: true /v1/post-training/job/cancel: post: responses: @@ -832,6 +858,44 @@ paths: schema: $ref: '#/components/schemas/EmbeddingsRequest' required: true + /v1alpha/eval/benchmarks/{benchmark_id}/evaluations: + post: + responses: + '200': + description: >- + EvaluateResponse object containing generations and scores. + content: + application/json: + schema: + $ref: '#/components/schemas/EvaluateResponse' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Eval + summary: Evaluate a list of rows on a benchmark. + description: Evaluate a list of rows on a benchmark. + parameters: + - name: benchmark_id + in: path + description: >- + The ID of the benchmark to run the evaluation on. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/EvaluateRowsRequest' + required: true /v1/eval/benchmarks/{benchmark_id}/evaluations: post: responses: @@ -962,6 +1026,61 @@ paths: required: true schema: type: string + /v1alpha/eval/benchmarks/{benchmark_id}: + get: + responses: + '200': + description: A Benchmark. + content: + application/json: + schema: + $ref: '#/components/schemas/Benchmark' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Benchmarks + summary: Get a benchmark by its ID. + description: Get a benchmark by its ID. + parameters: + - name: benchmark_id + in: path + description: The ID of the benchmark to get. + required: true + schema: + type: string + delete: + responses: + '200': + description: OK + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Benchmarks + summary: Unregister a benchmark. + description: Unregister a benchmark. + parameters: + - name: benchmark_id + in: path + description: The ID of the benchmark to unregister. + required: true + schema: + type: string /v1/eval/benchmarks/{benchmark_id}: get: responses: @@ -1458,6 +1577,37 @@ paths: required: true schema: type: string + /v1alpha/post-training/job/artifacts: + get: + responses: + '200': + description: A PostTrainingJobArtifactsResponse. + content: + application/json: + schema: + $ref: '#/components/schemas/PostTrainingJobArtifactsResponse' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - PostTraining (Coming Soon) + summary: Get the artifacts of a training job. + description: Get the artifacts of a training job. + parameters: + - name: job_uuid + in: query + description: >- + The UUID of the job to get the artifacts of. + required: true + schema: + type: string /v1/post-training/job/artifacts: get: responses: @@ -1489,6 +1639,37 @@ paths: required: true schema: type: string + /v1alpha/post-training/job/status: + get: + responses: + '200': + description: A PostTrainingJobStatusResponse. + content: + application/json: + schema: + $ref: '#/components/schemas/PostTrainingJobStatusResponse' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - PostTraining (Coming Soon) + summary: Get the status of a training job. + description: Get the status of a training job. + parameters: + - name: job_uuid + in: query + description: >- + The UUID of the job to get the status of. + required: true + schema: + type: string /v1/post-training/job/status: get: responses: @@ -1520,6 +1701,30 @@ paths: required: true schema: type: string + /v1alpha/post-training/jobs: + get: + responses: + '200': + description: A ListPostTrainingJobsResponse. + content: + application/json: + schema: + $ref: '#/components/schemas/ListPostTrainingJobsResponse' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - PostTraining (Coming Soon) + summary: Get all training jobs. + description: Get all training jobs. + parameters: [] /v1/post-training/jobs: get: responses: @@ -1804,6 +2009,75 @@ paths: required: false schema: type: integer + /v1alpha/eval/benchmarks/{benchmark_id}/jobs/{job_id}: + get: + responses: + '200': + description: The status of the evaluation job. + content: + application/json: + schema: + $ref: '#/components/schemas/Job' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Eval + summary: Get the status of a job. + description: Get the status of a job. + parameters: + - name: benchmark_id + in: path + description: >- + The ID of the benchmark to run the evaluation on. + required: true + schema: + type: string + - name: job_id + in: path + description: The ID of the job to get the status of. + required: true + schema: + type: string + delete: + responses: + '200': + description: OK + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Eval + summary: Cancel a job. + description: Cancel a job. + parameters: + - name: benchmark_id + in: path + description: >- + The ID of the benchmark to run the evaluation on. + required: true + schema: + type: string + - name: job_id + in: path + description: The ID of the job to cancel. + required: true + schema: + type: string /v1/eval/benchmarks/{benchmark_id}/jobs/{job_id}: get: responses: @@ -1873,6 +2147,43 @@ paths: required: true schema: type: string + /v1alpha/eval/benchmarks/{benchmark_id}/jobs/{job_id}/result: + get: + responses: + '200': + description: The result of the job. + content: + application/json: + schema: + $ref: '#/components/schemas/EvaluateResponse' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Eval + summary: Get the result of a job. + description: Get the result of a job. + parameters: + - name: benchmark_id + in: path + description: >- + The ID of the benchmark to run the evaluation on. + required: true + schema: + type: string + - name: job_id + in: path + description: The ID of the job to get the result of. + required: true + schema: + type: string /v1/eval/benchmarks/{benchmark_id}/jobs/{job_id}/result: get: responses: @@ -1953,6 +2264,55 @@ paths: required: false schema: type: integer + /v1alpha/eval/benchmarks: + get: + responses: + '200': + description: A ListBenchmarksResponse. + content: + application/json: + schema: + $ref: '#/components/schemas/ListBenchmarksResponse' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Benchmarks + summary: List all benchmarks. + description: List all benchmarks. + parameters: [] + post: + responses: + '200': + description: OK + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Benchmarks + summary: Register a benchmark. + description: Register a benchmark. + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RegisterBenchmarkRequest' + required: true /v1/eval/benchmarks: get: responses: @@ -3454,6 +3814,36 @@ paths: schema: $ref: '#/components/schemas/OpenaiSearchVectorStoreRequest' required: true + /v1alpha/post-training/preference-optimize: + post: + responses: + '200': + description: A PostTrainingJob. + content: + application/json: + schema: + $ref: '#/components/schemas/PostTrainingJob' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - PostTraining (Coming Soon) + summary: Run preference optimization of a model. + description: Run preference optimization of a model. + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PreferenceOptimizeRequest' + required: true /v1/post-training/preference-optimize: post: responses: @@ -3735,6 +4125,44 @@ paths: schema: $ref: '#/components/schemas/ResumeAgentTurnRequest' required: true + /v1alpha/eval/benchmarks/{benchmark_id}/jobs: + post: + responses: + '200': + description: >- + The job that was created to run the evaluation. + content: + application/json: + schema: + $ref: '#/components/schemas/Job' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Eval + summary: Run an evaluation on a benchmark. + description: Run an evaluation on a benchmark. + parameters: + - name: benchmark_id + in: path + description: >- + The ID of the benchmark to run the evaluation on. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RunEvalRequest' + required: true /v1/eval/benchmarks/{benchmark_id}/jobs: post: responses: @@ -3961,6 +4389,36 @@ paths: schema: $ref: '#/components/schemas/SetDefaultVersionRequest' required: true + /v1alpha/post-training/supervised-fine-tune: + post: + responses: + '200': + description: A PostTrainingJob. + content: + application/json: + schema: + $ref: '#/components/schemas/PostTrainingJob' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - PostTraining (Coming Soon) + summary: Run supervised fine-tuning of a model. + description: Run supervised fine-tuning of a model. + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/SupervisedFineTuneRequest' + required: true /v1/post-training/supervised-fine-tune: post: responses: diff --git a/llama_stack/apis/agents/agents.py b/llama_stack/apis/agents/agents.py index 7dd3e9289..e53ca82e2 100644 --- a/llama_stack/apis/agents/agents.py +++ b/llama_stack/apis/agents/agents.py @@ -27,6 +27,7 @@ from llama_stack.apis.inference import ( ) from llama_stack.apis.safety import SafetyViolation from llama_stack.apis.tools import ToolDef +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.schema_utils import json_schema_type, register_schema, webmethod from .openai_responses import ( @@ -481,7 +482,7 @@ class Agents(Protocol): - Agents can also use Memory to retrieve information from knowledge bases. See the RAG Tool and Vector IO APIs for more details. """ - @webmethod(route="/agents", method="POST", descriptive_name="create_agent") + @webmethod(route="/agents", method="POST", descriptive_name="create_agent", level=LLAMA_STACK_API_V1) async def create_agent( self, agent_config: AgentConfig, @@ -494,7 +495,10 @@ class Agents(Protocol): ... @webmethod( - route="/agents/{agent_id}/session/{session_id}/turn", method="POST", descriptive_name="create_agent_turn" + route="/agents/{agent_id}/session/{session_id}/turn", + method="POST", + descriptive_name="create_agent_turn", + level=LLAMA_STACK_API_V1, ) async def create_agent_turn( self, @@ -524,6 +528,7 @@ class Agents(Protocol): route="/agents/{agent_id}/session/{session_id}/turn/{turn_id}/resume", method="POST", descriptive_name="resume_agent_turn", + level=LLAMA_STACK_API_V1, ) async def resume_agent_turn( self, @@ -549,6 +554,7 @@ class Agents(Protocol): @webmethod( route="/agents/{agent_id}/session/{session_id}/turn/{turn_id}", method="GET", + level=LLAMA_STACK_API_V1, ) async def get_agents_turn( self, @@ -568,6 +574,7 @@ class Agents(Protocol): @webmethod( route="/agents/{agent_id}/session/{session_id}/turn/{turn_id}/step/{step_id}", method="GET", + level=LLAMA_STACK_API_V1, ) async def get_agents_step( self, @@ -586,7 +593,12 @@ class Agents(Protocol): """ ... - @webmethod(route="/agents/{agent_id}/session", method="POST", descriptive_name="create_agent_session") + @webmethod( + route="/agents/{agent_id}/session", + method="POST", + descriptive_name="create_agent_session", + level=LLAMA_STACK_API_V1, + ) async def create_agent_session( self, agent_id: str, @@ -600,7 +612,7 @@ class Agents(Protocol): """ ... - @webmethod(route="/agents/{agent_id}/session/{session_id}", method="GET") + @webmethod(route="/agents/{agent_id}/session/{session_id}", method="GET", level=LLAMA_STACK_API_V1) async def get_agents_session( self, session_id: str, @@ -616,7 +628,7 @@ class Agents(Protocol): """ ... - @webmethod(route="/agents/{agent_id}/session/{session_id}", method="DELETE") + @webmethod(route="/agents/{agent_id}/session/{session_id}", method="DELETE", level=LLAMA_STACK_API_V1) async def delete_agents_session( self, session_id: str, @@ -629,7 +641,7 @@ class Agents(Protocol): """ ... - @webmethod(route="/agents/{agent_id}", method="DELETE") + @webmethod(route="/agents/{agent_id}", method="DELETE", level=LLAMA_STACK_API_V1) async def delete_agent( self, agent_id: str, @@ -640,7 +652,7 @@ class Agents(Protocol): """ ... - @webmethod(route="/agents", method="GET") + @webmethod(route="/agents", method="GET", level=LLAMA_STACK_API_V1) async def list_agents(self, start_index: int | None = None, limit: int | None = None) -> PaginatedResponse: """List all agents. @@ -650,7 +662,7 @@ class Agents(Protocol): """ ... - @webmethod(route="/agents/{agent_id}", method="GET") + @webmethod(route="/agents/{agent_id}", method="GET", level=LLAMA_STACK_API_V1) async def get_agent(self, agent_id: str) -> Agent: """Describe an agent by its ID. @@ -659,7 +671,7 @@ class Agents(Protocol): """ ... - @webmethod(route="/agents/{agent_id}/sessions", method="GET") + @webmethod(route="/agents/{agent_id}/sessions", method="GET", level=LLAMA_STACK_API_V1) async def list_agent_sessions( self, agent_id: str, @@ -682,7 +694,7 @@ class Agents(Protocol): # # Both of these APIs are inherently stateful. - @webmethod(route="/openai/v1/responses/{response_id}", method="GET") + @webmethod(route="/openai/v1/responses/{response_id}", method="GET", level=LLAMA_STACK_API_V1) async def get_openai_response( self, response_id: str, @@ -694,7 +706,7 @@ class Agents(Protocol): """ ... - @webmethod(route="/openai/v1/responses", method="POST") + @webmethod(route="/openai/v1/responses", method="POST", level=LLAMA_STACK_API_V1) async def create_openai_response( self, input: str | list[OpenAIResponseInput], @@ -719,7 +731,7 @@ class Agents(Protocol): """ ... - @webmethod(route="/openai/v1/responses", method="GET") + @webmethod(route="/openai/v1/responses", method="GET", level=LLAMA_STACK_API_V1) async def list_openai_responses( self, after: str | None = None, @@ -737,7 +749,7 @@ class Agents(Protocol): """ ... - @webmethod(route="/openai/v1/responses/{response_id}/input_items", method="GET") + @webmethod(route="/openai/v1/responses/{response_id}/input_items", method="GET", level=LLAMA_STACK_API_V1) async def list_openai_response_input_items( self, response_id: str, @@ -759,7 +771,7 @@ class Agents(Protocol): """ ... - @webmethod(route="/openai/v1/responses/{response_id}", method="DELETE") + @webmethod(route="/openai/v1/responses/{response_id}", method="DELETE", level=LLAMA_STACK_API_V1) async def delete_openai_response(self, response_id: str) -> OpenAIDeleteResponseObject: """Delete an OpenAI response by its ID. diff --git a/llama_stack/apis/batch_inference/batch_inference.py b/llama_stack/apis/batch_inference/batch_inference.py index b2aa637e2..43ade0221 100644 --- a/llama_stack/apis/batch_inference/batch_inference.py +++ b/llama_stack/apis/batch_inference/batch_inference.py @@ -17,6 +17,7 @@ from llama_stack.apis.inference import ( ToolDefinition, ToolPromptFormat, ) +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.schema_utils import webmethod @@ -30,7 +31,7 @@ class BatchInference(Protocol): including (post-training, evals, etc). """ - @webmethod(route="/batch-inference/completion", method="POST") + @webmethod(route="/batch-inference/completion", method="POST", level=LLAMA_STACK_API_V1) async def completion( self, model: str, @@ -50,7 +51,7 @@ class BatchInference(Protocol): """ ... - @webmethod(route="/batch-inference/chat-completion", method="POST") + @webmethod(route="/batch-inference/chat-completion", method="POST", level=LLAMA_STACK_API_V1) async def chat_completion( self, model: str, diff --git a/llama_stack/apis/batches/batches.py b/llama_stack/apis/batches/batches.py index c6bbd92eb..5890cbe04 100644 --- a/llama_stack/apis/batches/batches.py +++ b/llama_stack/apis/batches/batches.py @@ -8,6 +8,7 @@ from typing import Literal, Protocol, runtime_checkable from pydantic import BaseModel, Field +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.schema_utils import json_schema_type, webmethod try: @@ -42,7 +43,7 @@ class Batches(Protocol): Note: This API is currently under active development and may undergo changes. """ - @webmethod(route="/openai/v1/batches", method="POST") + @webmethod(route="/openai/v1/batches", method="POST", level=LLAMA_STACK_API_V1) async def create_batch( self, input_file_id: str, @@ -62,7 +63,7 @@ class Batches(Protocol): """ ... - @webmethod(route="/openai/v1/batches/{batch_id}", method="GET") + @webmethod(route="/openai/v1/batches/{batch_id}", method="GET", level=LLAMA_STACK_API_V1) async def retrieve_batch(self, batch_id: str) -> BatchObject: """Retrieve information about a specific batch. @@ -71,7 +72,7 @@ class Batches(Protocol): """ ... - @webmethod(route="/openai/v1/batches/{batch_id}/cancel", method="POST") + @webmethod(route="/openai/v1/batches/{batch_id}/cancel", method="POST", level=LLAMA_STACK_API_V1) async def cancel_batch(self, batch_id: str) -> BatchObject: """Cancel a batch that is in progress. @@ -80,7 +81,7 @@ class Batches(Protocol): """ ... - @webmethod(route="/openai/v1/batches", method="GET") + @webmethod(route="/openai/v1/batches", method="GET", level=LLAMA_STACK_API_V1) async def list_batches( self, after: str | None = None, diff --git a/llama_stack/apis/benchmarks/benchmarks.py b/llama_stack/apis/benchmarks/benchmarks.py index 8d0a25e7b..d87d45a60 100644 --- a/llama_stack/apis/benchmarks/benchmarks.py +++ b/llama_stack/apis/benchmarks/benchmarks.py @@ -8,6 +8,7 @@ from typing import Any, Literal, Protocol, runtime_checkable from pydantic import BaseModel, Field from llama_stack.apis.resource import Resource, ResourceType +from llama_stack.apis.version import LLAMA_STACK_API_V1, LLAMA_STACK_API_V1ALPHA from llama_stack.schema_utils import json_schema_type, webmethod @@ -53,7 +54,8 @@ class ListBenchmarksResponse(BaseModel): @runtime_checkable class Benchmarks(Protocol): - @webmethod(route="/eval/benchmarks", method="GET") + @webmethod(route="/eval/benchmarks", method="GET", level=LLAMA_STACK_API_V1, deprecated=True) + @webmethod(route="/eval/benchmarks", method="GET", level=LLAMA_STACK_API_V1ALPHA) async def list_benchmarks(self) -> ListBenchmarksResponse: """List all benchmarks. @@ -61,7 +63,8 @@ class Benchmarks(Protocol): """ ... - @webmethod(route="/eval/benchmarks/{benchmark_id}", method="GET") + @webmethod(route="/eval/benchmarks/{benchmark_id}", method="GET", level=LLAMA_STACK_API_V1, deprecated=True) + @webmethod(route="/eval/benchmarks/{benchmark_id}", method="GET", level=LLAMA_STACK_API_V1ALPHA) async def get_benchmark( self, benchmark_id: str, @@ -73,7 +76,8 @@ class Benchmarks(Protocol): """ ... - @webmethod(route="/eval/benchmarks", method="POST") + @webmethod(route="/eval/benchmarks", method="POST", level=LLAMA_STACK_API_V1, deprecated=True) + @webmethod(route="/eval/benchmarks", method="POST", level=LLAMA_STACK_API_V1ALPHA) async def register_benchmark( self, benchmark_id: str, @@ -94,7 +98,8 @@ class Benchmarks(Protocol): """ ... - @webmethod(route="/eval/benchmarks/{benchmark_id}", method="DELETE") + @webmethod(route="/eval/benchmarks/{benchmark_id}", method="DELETE", level=LLAMA_STACK_API_V1, deprecated=True) + @webmethod(route="/eval/benchmarks/{benchmark_id}", method="DELETE", level=LLAMA_STACK_API_V1ALPHA) async def unregister_benchmark(self, benchmark_id: str) -> None: """Unregister a benchmark. diff --git a/llama_stack/apis/datasetio/datasetio.py b/llama_stack/apis/datasetio/datasetio.py index 1183983cc..27e5336bc 100644 --- a/llama_stack/apis/datasetio/datasetio.py +++ b/llama_stack/apis/datasetio/datasetio.py @@ -8,6 +8,7 @@ from typing import Any, Protocol, runtime_checkable from llama_stack.apis.common.responses import PaginatedResponse from llama_stack.apis.datasets import Dataset +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.schema_utils import webmethod @@ -20,7 +21,7 @@ class DatasetIO(Protocol): # keeping for aligning with inference/safety, but this is not used dataset_store: DatasetStore - @webmethod(route="/datasetio/iterrows/{dataset_id:path}", method="GET") + @webmethod(route="/datasetio/iterrows/{dataset_id:path}", method="GET", level=LLAMA_STACK_API_V1) async def iterrows( self, dataset_id: str, @@ -44,7 +45,7 @@ class DatasetIO(Protocol): """ ... - @webmethod(route="/datasetio/append-rows/{dataset_id:path}", method="POST") + @webmethod(route="/datasetio/append-rows/{dataset_id:path}", method="POST", level=LLAMA_STACK_API_V1) async def append_rows(self, dataset_id: str, rows: list[dict[str, Any]]) -> None: """Append rows to a dataset. diff --git a/llama_stack/apis/datasets/datasets.py b/llama_stack/apis/datasets/datasets.py index f347e0e29..be0cbf09a 100644 --- a/llama_stack/apis/datasets/datasets.py +++ b/llama_stack/apis/datasets/datasets.py @@ -10,6 +10,7 @@ from typing import Annotated, Any, Literal, Protocol from pydantic import BaseModel, Field from llama_stack.apis.resource import Resource, ResourceType +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.schema_utils import json_schema_type, register_schema, webmethod @@ -145,7 +146,7 @@ class ListDatasetsResponse(BaseModel): class Datasets(Protocol): - @webmethod(route="/datasets", method="POST") + @webmethod(route="/datasets", method="POST", level=LLAMA_STACK_API_V1) async def register_dataset( self, purpose: DatasetPurpose, @@ -214,7 +215,7 @@ class Datasets(Protocol): """ ... - @webmethod(route="/datasets/{dataset_id:path}", method="GET") + @webmethod(route="/datasets/{dataset_id:path}", method="GET", level=LLAMA_STACK_API_V1) async def get_dataset( self, dataset_id: str, @@ -226,7 +227,7 @@ class Datasets(Protocol): """ ... - @webmethod(route="/datasets", method="GET") + @webmethod(route="/datasets", method="GET", level=LLAMA_STACK_API_V1) async def list_datasets(self) -> ListDatasetsResponse: """List all datasets. @@ -234,7 +235,7 @@ class Datasets(Protocol): """ ... - @webmethod(route="/datasets/{dataset_id:path}", method="DELETE") + @webmethod(route="/datasets/{dataset_id:path}", method="DELETE", level=LLAMA_STACK_API_V1) async def unregister_dataset( self, dataset_id: str, diff --git a/llama_stack/apis/eval/eval.py b/llama_stack/apis/eval/eval.py index 83a0a8e56..bb81778f1 100644 --- a/llama_stack/apis/eval/eval.py +++ b/llama_stack/apis/eval/eval.py @@ -13,6 +13,7 @@ from llama_stack.apis.common.job_types import Job from llama_stack.apis.inference import SamplingParams, SystemMessage from llama_stack.apis.scoring import ScoringResult from llama_stack.apis.scoring_functions import ScoringFnParams +from llama_stack.apis.version import LLAMA_STACK_API_V1, LLAMA_STACK_API_V1ALPHA from llama_stack.schema_utils import json_schema_type, register_schema, webmethod @@ -83,7 +84,8 @@ class EvaluateResponse(BaseModel): class Eval(Protocol): """Llama Stack Evaluation API for running evaluations on model and agent candidates.""" - @webmethod(route="/eval/benchmarks/{benchmark_id}/jobs", method="POST") + @webmethod(route="/eval/benchmarks/{benchmark_id}/jobs", method="POST", level=LLAMA_STACK_API_V1, deprecated=True) + @webmethod(route="/eval/benchmarks/{benchmark_id}/jobs", method="POST", level=LLAMA_STACK_API_V1ALPHA) async def run_eval( self, benchmark_id: str, @@ -97,7 +99,10 @@ class Eval(Protocol): """ ... - @webmethod(route="/eval/benchmarks/{benchmark_id}/evaluations", method="POST") + @webmethod( + route="/eval/benchmarks/{benchmark_id}/evaluations", method="POST", level=LLAMA_STACK_API_V1, deprecated=True + ) + @webmethod(route="/eval/benchmarks/{benchmark_id}/evaluations", method="POST", level=LLAMA_STACK_API_V1ALPHA) async def evaluate_rows( self, benchmark_id: str, @@ -115,7 +120,10 @@ class Eval(Protocol): """ ... - @webmethod(route="/eval/benchmarks/{benchmark_id}/jobs/{job_id}", method="GET") + @webmethod( + route="/eval/benchmarks/{benchmark_id}/jobs/{job_id}", method="GET", level=LLAMA_STACK_API_V1, deprecated=True + ) + @webmethod(route="/eval/benchmarks/{benchmark_id}/jobs/{job_id}", method="GET", level=LLAMA_STACK_API_V1ALPHA) async def job_status(self, benchmark_id: str, job_id: str) -> Job: """Get the status of a job. @@ -125,7 +133,13 @@ class Eval(Protocol): """ ... - @webmethod(route="/eval/benchmarks/{benchmark_id}/jobs/{job_id}", method="DELETE") + @webmethod( + route="/eval/benchmarks/{benchmark_id}/jobs/{job_id}", + method="DELETE", + level=LLAMA_STACK_API_V1, + deprecated=True, + ) + @webmethod(route="/eval/benchmarks/{benchmark_id}/jobs/{job_id}", method="DELETE", level=LLAMA_STACK_API_V1ALPHA) async def job_cancel(self, benchmark_id: str, job_id: str) -> None: """Cancel a job. @@ -134,7 +148,15 @@ class Eval(Protocol): """ ... - @webmethod(route="/eval/benchmarks/{benchmark_id}/jobs/{job_id}/result", method="GET") + @webmethod( + route="/eval/benchmarks/{benchmark_id}/jobs/{job_id}/result", + method="GET", + level=LLAMA_STACK_API_V1, + deprecated=True, + ) + @webmethod( + route="/eval/benchmarks/{benchmark_id}/jobs/{job_id}/result", method="GET", level=LLAMA_STACK_API_V1ALPHA + ) async def job_result(self, benchmark_id: str, job_id: str) -> EvaluateResponse: """Get the result of a job. diff --git a/llama_stack/apis/files/files.py b/llama_stack/apis/files/files.py index 124e4bc8e..7e45b55ee 100644 --- a/llama_stack/apis/files/files.py +++ b/llama_stack/apis/files/files.py @@ -11,6 +11,7 @@ from fastapi import File, Form, Response, UploadFile from pydantic import BaseModel, Field from llama_stack.apis.common.responses import Order +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.providers.utils.telemetry.trace_protocol import trace_protocol from llama_stack.schema_utils import json_schema_type, webmethod @@ -104,7 +105,7 @@ class OpenAIFileDeleteResponse(BaseModel): @trace_protocol class Files(Protocol): # OpenAI Files API Endpoints - @webmethod(route="/openai/v1/files", method="POST") + @webmethod(route="/openai/v1/files", method="POST", level=LLAMA_STACK_API_V1) async def openai_upload_file( self, file: Annotated[UploadFile, File()], @@ -127,7 +128,7 @@ class Files(Protocol): """ ... - @webmethod(route="/openai/v1/files", method="GET") + @webmethod(route="/openai/v1/files", method="GET", level=LLAMA_STACK_API_V1) async def openai_list_files( self, after: str | None = None, @@ -146,7 +147,7 @@ class Files(Protocol): """ ... - @webmethod(route="/openai/v1/files/{file_id}", method="GET") + @webmethod(route="/openai/v1/files/{file_id}", method="GET", level=LLAMA_STACK_API_V1) async def openai_retrieve_file( self, file_id: str, @@ -159,7 +160,7 @@ class Files(Protocol): """ ... - @webmethod(route="/openai/v1/files/{file_id}", method="DELETE") + @webmethod(route="/openai/v1/files/{file_id}", method="DELETE", level=LLAMA_STACK_API_V1) async def openai_delete_file( self, file_id: str, @@ -172,7 +173,7 @@ class Files(Protocol): """ ... - @webmethod(route="/openai/v1/files/{file_id}/content", method="GET") + @webmethod(route="/openai/v1/files/{file_id}/content", method="GET", level=LLAMA_STACK_API_V1) async def openai_retrieve_file_content( self, file_id: str, diff --git a/llama_stack/apis/inference/inference.py b/llama_stack/apis/inference/inference.py index bd4737ca7..4f5332b5f 100644 --- a/llama_stack/apis/inference/inference.py +++ b/llama_stack/apis/inference/inference.py @@ -21,6 +21,7 @@ from llama_stack.apis.common.content_types import ContentDelta, InterleavedConte from llama_stack.apis.common.responses import Order from llama_stack.apis.models import Model from llama_stack.apis.telemetry import MetricResponseMixin +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.models.llama.datatypes import ( BuiltinTool, StopReason, @@ -1026,7 +1027,7 @@ class InferenceProvider(Protocol): model_store: ModelStore | None = None - @webmethod(route="/inference/completion", method="POST") + @webmethod(route="/inference/completion", method="POST", level=LLAMA_STACK_API_V1) async def completion( self, model_id: str, @@ -1049,7 +1050,7 @@ class InferenceProvider(Protocol): """ ... - @webmethod(route="/inference/batch-completion", method="POST", experimental=True) + @webmethod(route="/inference/batch-completion", method="POST", experimental=True, level=LLAMA_STACK_API_V1) async def batch_completion( self, model_id: str, @@ -1070,7 +1071,7 @@ class InferenceProvider(Protocol): raise NotImplementedError("Batch completion is not implemented") return # this is so mypy's safe-super rule will consider the method concrete - @webmethod(route="/inference/chat-completion", method="POST") + @webmethod(route="/inference/chat-completion", method="POST", level=LLAMA_STACK_API_V1) async def chat_completion( self, model_id: str, @@ -1110,7 +1111,7 @@ class InferenceProvider(Protocol): """ ... - @webmethod(route="/inference/batch-chat-completion", method="POST", experimental=True) + @webmethod(route="/inference/batch-chat-completion", method="POST", experimental=True, level=LLAMA_STACK_API_V1) async def batch_chat_completion( self, model_id: str, @@ -1135,7 +1136,7 @@ class InferenceProvider(Protocol): raise NotImplementedError("Batch chat completion is not implemented") return # this is so mypy's safe-super rule will consider the method concrete - @webmethod(route="/inference/embeddings", method="POST") + @webmethod(route="/inference/embeddings", method="POST", level=LLAMA_STACK_API_V1) async def embeddings( self, model_id: str, @@ -1155,7 +1156,7 @@ class InferenceProvider(Protocol): """ ... - @webmethod(route="/inference/rerank", method="POST", experimental=True) + @webmethod(route="/inference/rerank", method="POST", experimental=True, level=LLAMA_STACK_API_V1) async def rerank( self, model: str, @@ -1174,7 +1175,7 @@ class InferenceProvider(Protocol): raise NotImplementedError("Reranking is not implemented") return # this is so mypy's safe-super rule will consider the method concrete - @webmethod(route="/openai/v1/completions", method="POST") + @webmethod(route="/openai/v1/completions", method="POST", level=LLAMA_STACK_API_V1) async def openai_completion( self, # Standard OpenAI completion parameters @@ -1225,7 +1226,7 @@ class InferenceProvider(Protocol): """ ... - @webmethod(route="/openai/v1/chat/completions", method="POST") + @webmethod(route="/openai/v1/chat/completions", method="POST", level=LLAMA_STACK_API_V1) async def openai_chat_completion( self, model: str, @@ -1281,7 +1282,7 @@ class InferenceProvider(Protocol): """ ... - @webmethod(route="/openai/v1/embeddings", method="POST") + @webmethod(route="/openai/v1/embeddings", method="POST", level=LLAMA_STACK_API_V1) async def openai_embeddings( self, model: str, @@ -1310,7 +1311,7 @@ class Inference(InferenceProvider): - Embedding models: these models generate embeddings to be used for semantic search. """ - @webmethod(route="/openai/v1/chat/completions", method="GET") + @webmethod(route="/openai/v1/chat/completions", method="GET", level=LLAMA_STACK_API_V1) async def list_chat_completions( self, after: str | None = None, @@ -1328,7 +1329,7 @@ class Inference(InferenceProvider): """ raise NotImplementedError("List chat completions is not implemented") - @webmethod(route="/openai/v1/chat/completions/{completion_id}", method="GET") + @webmethod(route="/openai/v1/chat/completions/{completion_id}", method="GET", level=LLAMA_STACK_API_V1) async def get_chat_completion(self, completion_id: str) -> OpenAICompletionWithInputMessages: """Describe a chat completion by its ID. diff --git a/llama_stack/apis/inspect/inspect.py b/llama_stack/apis/inspect/inspect.py index 91d9c3da7..e859dbe59 100644 --- a/llama_stack/apis/inspect/inspect.py +++ b/llama_stack/apis/inspect/inspect.py @@ -8,6 +8,7 @@ from typing import Protocol, runtime_checkable from pydantic import BaseModel +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.providers.datatypes import HealthStatus from llama_stack.schema_utils import json_schema_type, webmethod @@ -57,7 +58,7 @@ class ListRoutesResponse(BaseModel): @runtime_checkable class Inspect(Protocol): - @webmethod(route="/inspect/routes", method="GET") + @webmethod(route="/inspect/routes", method="GET", level=LLAMA_STACK_API_V1) async def list_routes(self) -> ListRoutesResponse: """List all available API routes with their methods and implementing providers. @@ -65,7 +66,7 @@ class Inspect(Protocol): """ ... - @webmethod(route="/health", method="GET") + @webmethod(route="/health", method="GET", level=LLAMA_STACK_API_V1) async def health(self) -> HealthInfo: """Get the current health status of the service. @@ -73,7 +74,7 @@ class Inspect(Protocol): """ ... - @webmethod(route="/version", method="GET") + @webmethod(route="/version", method="GET", level=LLAMA_STACK_API_V1) async def version(self) -> VersionInfo: """Get the version of the service. diff --git a/llama_stack/apis/models/models.py b/llama_stack/apis/models/models.py index 1af6fc9df..a4f6a888b 100644 --- a/llama_stack/apis/models/models.py +++ b/llama_stack/apis/models/models.py @@ -10,6 +10,7 @@ from typing import Any, Literal, Protocol, runtime_checkable from pydantic import BaseModel, ConfigDict, Field, field_validator from llama_stack.apis.resource import Resource, ResourceType +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.providers.utils.telemetry.trace_protocol import trace_protocol from llama_stack.schema_utils import json_schema_type, webmethod @@ -102,7 +103,7 @@ class OpenAIListModelsResponse(BaseModel): @runtime_checkable @trace_protocol class Models(Protocol): - @webmethod(route="/models", method="GET") + @webmethod(route="/models", method="GET", level=LLAMA_STACK_API_V1) async def list_models(self) -> ListModelsResponse: """List all models. @@ -110,7 +111,7 @@ class Models(Protocol): """ ... - @webmethod(route="/openai/v1/models", method="GET") + @webmethod(route="/openai/v1/models", method="GET", level=LLAMA_STACK_API_V1) async def openai_list_models(self) -> OpenAIListModelsResponse: """List models using the OpenAI API. @@ -118,7 +119,7 @@ class Models(Protocol): """ ... - @webmethod(route="/models/{model_id:path}", method="GET") + @webmethod(route="/models/{model_id:path}", method="GET", level=LLAMA_STACK_API_V1) async def get_model( self, model_id: str, @@ -130,7 +131,7 @@ class Models(Protocol): """ ... - @webmethod(route="/models", method="POST") + @webmethod(route="/models", method="POST", level=LLAMA_STACK_API_V1) async def register_model( self, model_id: str, @@ -150,7 +151,7 @@ class Models(Protocol): """ ... - @webmethod(route="/models/{model_id:path}", method="DELETE") + @webmethod(route="/models/{model_id:path}", method="DELETE", level=LLAMA_STACK_API_V1) async def unregister_model( self, model_id: str, diff --git a/llama_stack/apis/post_training/post_training.py b/llama_stack/apis/post_training/post_training.py index c16221289..30a51f765 100644 --- a/llama_stack/apis/post_training/post_training.py +++ b/llama_stack/apis/post_training/post_training.py @@ -13,6 +13,7 @@ from pydantic import BaseModel, Field from llama_stack.apis.common.content_types import URL from llama_stack.apis.common.job_types import JobStatus from llama_stack.apis.common.training_types import Checkpoint +from llama_stack.apis.version import LLAMA_STACK_API_V1, LLAMA_STACK_API_V1ALPHA from llama_stack.schema_utils import json_schema_type, register_schema, webmethod @@ -283,7 +284,8 @@ class PostTrainingJobArtifactsResponse(BaseModel): class PostTraining(Protocol): - @webmethod(route="/post-training/supervised-fine-tune", method="POST") + @webmethod(route="/post-training/supervised-fine-tune", method="POST", level=LLAMA_STACK_API_V1, deprecated=True) + @webmethod(route="/post-training/supervised-fine-tune", method="POST", level=LLAMA_STACK_API_V1ALPHA) async def supervised_fine_tune( self, job_uuid: str, @@ -310,7 +312,8 @@ class PostTraining(Protocol): """ ... - @webmethod(route="/post-training/preference-optimize", method="POST") + @webmethod(route="/post-training/preference-optimize", method="POST", level=LLAMA_STACK_API_V1, deprecated=True) + @webmethod(route="/post-training/preference-optimize", method="POST", level=LLAMA_STACK_API_V1ALPHA) async def preference_optimize( self, job_uuid: str, @@ -332,7 +335,8 @@ class PostTraining(Protocol): """ ... - @webmethod(route="/post-training/jobs", method="GET") + @webmethod(route="/post-training/jobs", method="GET", level=LLAMA_STACK_API_V1, deprecated=True) + @webmethod(route="/post-training/jobs", method="GET", level=LLAMA_STACK_API_V1ALPHA) async def get_training_jobs(self) -> ListPostTrainingJobsResponse: """Get all training jobs. @@ -340,7 +344,8 @@ class PostTraining(Protocol): """ ... - @webmethod(route="/post-training/job/status", method="GET") + @webmethod(route="/post-training/job/status", method="GET", level=LLAMA_STACK_API_V1, deprecated=True) + @webmethod(route="/post-training/job/status", method="GET", level=LLAMA_STACK_API_V1ALPHA) async def get_training_job_status(self, job_uuid: str) -> PostTrainingJobStatusResponse: """Get the status of a training job. @@ -349,7 +354,8 @@ class PostTraining(Protocol): """ ... - @webmethod(route="/post-training/job/cancel", method="POST") + @webmethod(route="/post-training/job/cancel", method="POST", level=LLAMA_STACK_API_V1, deprecated=True) + @webmethod(route="/post-training/job/cancel", method="POST", level=LLAMA_STACK_API_V1ALPHA) async def cancel_training_job(self, job_uuid: str) -> None: """Cancel a training job. @@ -357,7 +363,8 @@ class PostTraining(Protocol): """ ... - @webmethod(route="/post-training/job/artifacts", method="GET") + @webmethod(route="/post-training/job/artifacts", method="GET", level=LLAMA_STACK_API_V1, deprecated=True) + @webmethod(route="/post-training/job/artifacts", method="GET", level=LLAMA_STACK_API_V1ALPHA) async def get_training_job_artifacts(self, job_uuid: str) -> PostTrainingJobArtifactsResponse: """Get the artifacts of a training job. diff --git a/llama_stack/apis/prompts/prompts.py b/llama_stack/apis/prompts/prompts.py index e6a376c3f..c56185e25 100644 --- a/llama_stack/apis/prompts/prompts.py +++ b/llama_stack/apis/prompts/prompts.py @@ -10,6 +10,7 @@ from typing import Protocol, runtime_checkable from pydantic import BaseModel, Field, field_validator, model_validator +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.providers.utils.telemetry.trace_protocol import trace_protocol from llama_stack.schema_utils import json_schema_type, webmethod @@ -95,7 +96,7 @@ class ListPromptsResponse(BaseModel): class Prompts(Protocol): """Protocol for prompt management operations.""" - @webmethod(route="/prompts", method="GET") + @webmethod(route="/prompts", method="GET", level=LLAMA_STACK_API_V1) async def list_prompts(self) -> ListPromptsResponse: """List all prompts. @@ -103,7 +104,7 @@ class Prompts(Protocol): """ ... - @webmethod(route="/prompts/{prompt_id}/versions", method="GET") + @webmethod(route="/prompts/{prompt_id}/versions", method="GET", level=LLAMA_STACK_API_V1) async def list_prompt_versions( self, prompt_id: str, @@ -115,7 +116,7 @@ class Prompts(Protocol): """ ... - @webmethod(route="/prompts/{prompt_id}", method="GET") + @webmethod(route="/prompts/{prompt_id}", method="GET", level=LLAMA_STACK_API_V1) async def get_prompt( self, prompt_id: str, @@ -129,7 +130,7 @@ class Prompts(Protocol): """ ... - @webmethod(route="/prompts", method="POST") + @webmethod(route="/prompts", method="POST", level=LLAMA_STACK_API_V1) async def create_prompt( self, prompt: str, @@ -143,7 +144,7 @@ class Prompts(Protocol): """ ... - @webmethod(route="/prompts/{prompt_id}", method="PUT") + @webmethod(route="/prompts/{prompt_id}", method="PUT", level=LLAMA_STACK_API_V1) async def update_prompt( self, prompt_id: str, @@ -163,7 +164,7 @@ class Prompts(Protocol): """ ... - @webmethod(route="/prompts/{prompt_id}", method="DELETE") + @webmethod(route="/prompts/{prompt_id}", method="DELETE", level=LLAMA_STACK_API_V1) async def delete_prompt( self, prompt_id: str, @@ -174,7 +175,7 @@ class Prompts(Protocol): """ ... - @webmethod(route="/prompts/{prompt_id}/set-default-version", method="PUT") + @webmethod(route="/prompts/{prompt_id}/set-default-version", method="PUT", level=LLAMA_STACK_API_V1) async def set_default_version( self, prompt_id: str, diff --git a/llama_stack/apis/providers/providers.py b/llama_stack/apis/providers/providers.py index 8a1e93d8f..d1cff0f6c 100644 --- a/llama_stack/apis/providers/providers.py +++ b/llama_stack/apis/providers/providers.py @@ -8,6 +8,7 @@ from typing import Any, Protocol, runtime_checkable from pydantic import BaseModel +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.providers.datatypes import HealthResponse from llama_stack.schema_utils import json_schema_type, webmethod @@ -45,7 +46,7 @@ class Providers(Protocol): Providers API for inspecting, listing, and modifying providers and their configurations. """ - @webmethod(route="/providers", method="GET") + @webmethod(route="/providers", method="GET", level=LLAMA_STACK_API_V1) async def list_providers(self) -> ListProvidersResponse: """List all available providers. @@ -53,7 +54,7 @@ class Providers(Protocol): """ ... - @webmethod(route="/providers/{provider_id}", method="GET") + @webmethod(route="/providers/{provider_id}", method="GET", level=LLAMA_STACK_API_V1) async def inspect_provider(self, provider_id: str) -> ProviderInfo: """Get detailed information about a specific provider. diff --git a/llama_stack/apis/safety/safety.py b/llama_stack/apis/safety/safety.py index 25ee03ec1..98367e9b0 100644 --- a/llama_stack/apis/safety/safety.py +++ b/llama_stack/apis/safety/safety.py @@ -11,6 +11,7 @@ from pydantic import BaseModel, Field from llama_stack.apis.inference import Message from llama_stack.apis.shields import Shield +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.providers.utils.telemetry.trace_protocol import trace_protocol from llama_stack.schema_utils import json_schema_type, webmethod @@ -97,7 +98,7 @@ class ShieldStore(Protocol): class Safety(Protocol): shield_store: ShieldStore - @webmethod(route="/safety/run-shield", method="POST") + @webmethod(route="/safety/run-shield", method="POST", level=LLAMA_STACK_API_V1) async def run_shield( self, shield_id: str, @@ -113,7 +114,7 @@ class Safety(Protocol): """ ... - @webmethod(route="/openai/v1/moderations", method="POST") + @webmethod(route="/openai/v1/moderations", method="POST", level=LLAMA_STACK_API_V1) async def run_moderation(self, input: str | list[str], model: str) -> ModerationObject: """Classifies if text and/or image inputs are potentially harmful. :param input: Input (or inputs) to classify. diff --git a/llama_stack/apis/scoring/scoring.py b/llama_stack/apis/scoring/scoring.py index 8ca599b44..03d943e94 100644 --- a/llama_stack/apis/scoring/scoring.py +++ b/llama_stack/apis/scoring/scoring.py @@ -9,6 +9,7 @@ from typing import Any, Protocol, runtime_checkable from pydantic import BaseModel from llama_stack.apis.scoring_functions import ScoringFn, ScoringFnParams +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.schema_utils import json_schema_type, webmethod # mapping of metric to value @@ -61,7 +62,7 @@ class ScoringFunctionStore(Protocol): class Scoring(Protocol): scoring_function_store: ScoringFunctionStore - @webmethod(route="/scoring/score-batch", method="POST") + @webmethod(route="/scoring/score-batch", method="POST", level=LLAMA_STACK_API_V1) async def score_batch( self, dataset_id: str, @@ -77,7 +78,7 @@ class Scoring(Protocol): """ ... - @webmethod(route="/scoring/score", method="POST") + @webmethod(route="/scoring/score", method="POST", level=LLAMA_STACK_API_V1) async def score( self, input_rows: list[dict[str, Any]], diff --git a/llama_stack/apis/scoring_functions/scoring_functions.py b/llama_stack/apis/scoring_functions/scoring_functions.py index 541067766..fe49723ab 100644 --- a/llama_stack/apis/scoring_functions/scoring_functions.py +++ b/llama_stack/apis/scoring_functions/scoring_functions.py @@ -18,6 +18,7 @@ from pydantic import BaseModel, Field from llama_stack.apis.common.type_system import ParamType from llama_stack.apis.resource import Resource, ResourceType +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.schema_utils import json_schema_type, register_schema, webmethod @@ -160,7 +161,7 @@ class ListScoringFunctionsResponse(BaseModel): @runtime_checkable class ScoringFunctions(Protocol): - @webmethod(route="/scoring-functions", method="GET") + @webmethod(route="/scoring-functions", method="GET", level=LLAMA_STACK_API_V1) async def list_scoring_functions(self) -> ListScoringFunctionsResponse: """List all scoring functions. @@ -168,7 +169,7 @@ class ScoringFunctions(Protocol): """ ... - @webmethod(route="/scoring-functions/{scoring_fn_id:path}", method="GET") + @webmethod(route="/scoring-functions/{scoring_fn_id:path}", method="GET", level=LLAMA_STACK_API_V1) async def get_scoring_function(self, scoring_fn_id: str, /) -> ScoringFn: """Get a scoring function by its ID. @@ -177,7 +178,7 @@ class ScoringFunctions(Protocol): """ ... - @webmethod(route="/scoring-functions", method="POST") + @webmethod(route="/scoring-functions", method="POST", level=LLAMA_STACK_API_V1) async def register_scoring_function( self, scoring_fn_id: str, @@ -198,7 +199,7 @@ class ScoringFunctions(Protocol): """ ... - @webmethod(route="/scoring-functions/{scoring_fn_id:path}", method="DELETE") + @webmethod(route="/scoring-functions/{scoring_fn_id:path}", method="DELETE", level=LLAMA_STACK_API_V1) async def unregister_scoring_function(self, scoring_fn_id: str) -> None: """Unregister a scoring function. diff --git a/llama_stack/apis/shields/shields.py b/llama_stack/apis/shields/shields.py index ec1b85349..5d967cf02 100644 --- a/llama_stack/apis/shields/shields.py +++ b/llama_stack/apis/shields/shields.py @@ -9,6 +9,7 @@ from typing import Any, Literal, Protocol, runtime_checkable from pydantic import BaseModel from llama_stack.apis.resource import Resource, ResourceType +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.providers.utils.telemetry.trace_protocol import trace_protocol from llama_stack.schema_utils import json_schema_type, webmethod @@ -49,7 +50,7 @@ class ListShieldsResponse(BaseModel): @runtime_checkable @trace_protocol class Shields(Protocol): - @webmethod(route="/shields", method="GET") + @webmethod(route="/shields", method="GET", level=LLAMA_STACK_API_V1) async def list_shields(self) -> ListShieldsResponse: """List all shields. @@ -57,7 +58,7 @@ class Shields(Protocol): """ ... - @webmethod(route="/shields/{identifier:path}", method="GET") + @webmethod(route="/shields/{identifier:path}", method="GET", level=LLAMA_STACK_API_V1) async def get_shield(self, identifier: str) -> Shield: """Get a shield by its identifier. @@ -66,7 +67,7 @@ class Shields(Protocol): """ ... - @webmethod(route="/shields", method="POST") + @webmethod(route="/shields", method="POST", level=LLAMA_STACK_API_V1) async def register_shield( self, shield_id: str, @@ -84,7 +85,7 @@ class Shields(Protocol): """ ... - @webmethod(route="/shields/{identifier:path}", method="DELETE") + @webmethod(route="/shields/{identifier:path}", method="DELETE", level=LLAMA_STACK_API_V1) async def unregister_shield(self, identifier: str) -> None: """Unregister a shield. diff --git a/llama_stack/apis/synthetic_data_generation/synthetic_data_generation.py b/llama_stack/apis/synthetic_data_generation/synthetic_data_generation.py index a7af44b28..c13e2c17c 100644 --- a/llama_stack/apis/synthetic_data_generation/synthetic_data_generation.py +++ b/llama_stack/apis/synthetic_data_generation/synthetic_data_generation.py @@ -10,6 +10,7 @@ from typing import Any, Protocol from pydantic import BaseModel from llama_stack.apis.inference import Message +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.schema_utils import json_schema_type, webmethod @@ -59,7 +60,7 @@ class SyntheticDataGenerationResponse(BaseModel): class SyntheticDataGeneration(Protocol): - @webmethod(route="/synthetic-data-generation/generate") + @webmethod(route="/synthetic-data-generation/generate", level=LLAMA_STACK_API_V1) def synthetic_data_generate( self, dialogs: list[Message], diff --git a/llama_stack/apis/telemetry/telemetry.py b/llama_stack/apis/telemetry/telemetry.py index 8d1b5d697..29dd23989 100644 --- a/llama_stack/apis/telemetry/telemetry.py +++ b/llama_stack/apis/telemetry/telemetry.py @@ -16,6 +16,7 @@ from typing import ( from pydantic import BaseModel, Field +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.models.llama.datatypes import Primitive from llama_stack.schema_utils import json_schema_type, register_schema, webmethod @@ -412,7 +413,7 @@ class QueryMetricsResponse(BaseModel): @runtime_checkable class Telemetry(Protocol): - @webmethod(route="/telemetry/events", method="POST") + @webmethod(route="/telemetry/events", method="POST", level=LLAMA_STACK_API_V1) async def log_event( self, event: Event, @@ -425,7 +426,7 @@ class Telemetry(Protocol): """ ... - @webmethod(route="/telemetry/traces", method="POST", required_scope=REQUIRED_SCOPE) + @webmethod(route="/telemetry/traces", method="POST", required_scope=REQUIRED_SCOPE, level=LLAMA_STACK_API_V1) async def query_traces( self, attribute_filters: list[QueryCondition] | None = None, @@ -443,7 +444,9 @@ class Telemetry(Protocol): """ ... - @webmethod(route="/telemetry/traces/{trace_id:path}", method="GET", required_scope=REQUIRED_SCOPE) + @webmethod( + route="/telemetry/traces/{trace_id:path}", method="GET", required_scope=REQUIRED_SCOPE, level=LLAMA_STACK_API_V1 + ) async def get_trace(self, trace_id: str) -> Trace: """Get a trace by its ID. @@ -453,7 +456,10 @@ class Telemetry(Protocol): ... @webmethod( - route="/telemetry/traces/{trace_id:path}/spans/{span_id:path}", method="GET", required_scope=REQUIRED_SCOPE + route="/telemetry/traces/{trace_id:path}/spans/{span_id:path}", + method="GET", + required_scope=REQUIRED_SCOPE, + level=LLAMA_STACK_API_V1, ) async def get_span(self, trace_id: str, span_id: str) -> Span: """Get a span by its ID. @@ -464,7 +470,12 @@ class Telemetry(Protocol): """ ... - @webmethod(route="/telemetry/spans/{span_id:path}/tree", method="POST", required_scope=REQUIRED_SCOPE) + @webmethod( + route="/telemetry/spans/{span_id:path}/tree", + method="POST", + required_scope=REQUIRED_SCOPE, + level=LLAMA_STACK_API_V1, + ) async def get_span_tree( self, span_id: str, @@ -480,7 +491,7 @@ class Telemetry(Protocol): """ ... - @webmethod(route="/telemetry/spans", method="POST", required_scope=REQUIRED_SCOPE) + @webmethod(route="/telemetry/spans", method="POST", required_scope=REQUIRED_SCOPE, level=LLAMA_STACK_API_V1) async def query_spans( self, attribute_filters: list[QueryCondition], @@ -496,7 +507,7 @@ class Telemetry(Protocol): """ ... - @webmethod(route="/telemetry/spans/export", method="POST") + @webmethod(route="/telemetry/spans/export", method="POST", level=LLAMA_STACK_API_V1) async def save_spans_to_dataset( self, attribute_filters: list[QueryCondition], @@ -513,7 +524,9 @@ class Telemetry(Protocol): """ ... - @webmethod(route="/telemetry/metrics/{metric_name}", method="POST", required_scope=REQUIRED_SCOPE) + @webmethod( + route="/telemetry/metrics/{metric_name}", method="POST", required_scope=REQUIRED_SCOPE, level=LLAMA_STACK_API_V1 + ) async def query_metrics( self, metric_name: str, diff --git a/llama_stack/apis/tools/rag_tool.py b/llama_stack/apis/tools/rag_tool.py index 651016bd1..ed7847e23 100644 --- a/llama_stack/apis/tools/rag_tool.py +++ b/llama_stack/apis/tools/rag_tool.py @@ -11,6 +11,7 @@ from pydantic import BaseModel, Field, field_validator from typing_extensions import runtime_checkable from llama_stack.apis.common.content_types import URL, InterleavedContent +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.providers.utils.telemetry.trace_protocol import trace_protocol from llama_stack.schema_utils import json_schema_type, register_schema, webmethod @@ -185,7 +186,7 @@ class RAGQueryConfig(BaseModel): @runtime_checkable @trace_protocol class RAGToolRuntime(Protocol): - @webmethod(route="/tool-runtime/rag-tool/insert", method="POST") + @webmethod(route="/tool-runtime/rag-tool/insert", method="POST", level=LLAMA_STACK_API_V1) async def insert( self, documents: list[RAGDocument], @@ -200,7 +201,7 @@ class RAGToolRuntime(Protocol): """ ... - @webmethod(route="/tool-runtime/rag-tool/query", method="POST") + @webmethod(route="/tool-runtime/rag-tool/query", method="POST", level=LLAMA_STACK_API_V1) async def query( self, content: InterleavedContent, diff --git a/llama_stack/apis/tools/tools.py b/llama_stack/apis/tools/tools.py index 52b86375a..12bd9efa2 100644 --- a/llama_stack/apis/tools/tools.py +++ b/llama_stack/apis/tools/tools.py @@ -12,6 +12,7 @@ from typing_extensions import runtime_checkable from llama_stack.apis.common.content_types import URL, InterleavedContent from llama_stack.apis.resource import Resource, ResourceType +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.providers.utils.telemetry.trace_protocol import trace_protocol from llama_stack.schema_utils import json_schema_type, webmethod @@ -151,7 +152,7 @@ class ListToolDefsResponse(BaseModel): @runtime_checkable @trace_protocol class ToolGroups(Protocol): - @webmethod(route="/toolgroups", method="POST") + @webmethod(route="/toolgroups", method="POST", level=LLAMA_STACK_API_V1) async def register_tool_group( self, toolgroup_id: str, @@ -168,7 +169,7 @@ class ToolGroups(Protocol): """ ... - @webmethod(route="/toolgroups/{toolgroup_id:path}", method="GET") + @webmethod(route="/toolgroups/{toolgroup_id:path}", method="GET", level=LLAMA_STACK_API_V1) async def get_tool_group( self, toolgroup_id: str, @@ -180,7 +181,7 @@ class ToolGroups(Protocol): """ ... - @webmethod(route="/toolgroups", method="GET") + @webmethod(route="/toolgroups", method="GET", level=LLAMA_STACK_API_V1) async def list_tool_groups(self) -> ListToolGroupsResponse: """List tool groups with optional provider. @@ -188,7 +189,7 @@ class ToolGroups(Protocol): """ ... - @webmethod(route="/tools", method="GET") + @webmethod(route="/tools", method="GET", level=LLAMA_STACK_API_V1) async def list_tools(self, toolgroup_id: str | None = None) -> ListToolsResponse: """List tools with optional tool group. @@ -197,7 +198,7 @@ class ToolGroups(Protocol): """ ... - @webmethod(route="/tools/{tool_name:path}", method="GET") + @webmethod(route="/tools/{tool_name:path}", method="GET", level=LLAMA_STACK_API_V1) async def get_tool( self, tool_name: str, @@ -209,7 +210,7 @@ class ToolGroups(Protocol): """ ... - @webmethod(route="/toolgroups/{toolgroup_id:path}", method="DELETE") + @webmethod(route="/toolgroups/{toolgroup_id:path}", method="DELETE", level=LLAMA_STACK_API_V1) async def unregister_toolgroup( self, toolgroup_id: str, @@ -238,7 +239,7 @@ class ToolRuntime(Protocol): rag_tool: RAGToolRuntime | None = None # TODO: This needs to be renamed once OPEN API generator name conflict issue is fixed. - @webmethod(route="/tool-runtime/list-tools", method="GET") + @webmethod(route="/tool-runtime/list-tools", method="GET", level=LLAMA_STACK_API_V1) async def list_runtime_tools( self, tool_group_id: str | None = None, mcp_endpoint: URL | None = None ) -> ListToolDefsResponse: @@ -250,7 +251,7 @@ class ToolRuntime(Protocol): """ ... - @webmethod(route="/tool-runtime/invoke", method="POST") + @webmethod(route="/tool-runtime/invoke", method="POST", level=LLAMA_STACK_API_V1) async def invoke_tool(self, tool_name: str, kwargs: dict[str, Any]) -> ToolInvocationResult: """Run a tool with the given arguments. diff --git a/llama_stack/apis/vector_dbs/vector_dbs.py b/llama_stack/apis/vector_dbs/vector_dbs.py index 47820fa0f..521d129c6 100644 --- a/llama_stack/apis/vector_dbs/vector_dbs.py +++ b/llama_stack/apis/vector_dbs/vector_dbs.py @@ -9,6 +9,7 @@ from typing import Literal, Protocol, runtime_checkable from pydantic import BaseModel from llama_stack.apis.resource import Resource, ResourceType +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.providers.utils.telemetry.trace_protocol import trace_protocol from llama_stack.schema_utils import json_schema_type, webmethod @@ -65,7 +66,7 @@ class ListVectorDBsResponse(BaseModel): @runtime_checkable @trace_protocol class VectorDBs(Protocol): - @webmethod(route="/vector-dbs", method="GET") + @webmethod(route="/vector-dbs", method="GET", level=LLAMA_STACK_API_V1) async def list_vector_dbs(self) -> ListVectorDBsResponse: """List all vector databases. @@ -73,7 +74,7 @@ class VectorDBs(Protocol): """ ... - @webmethod(route="/vector-dbs/{vector_db_id:path}", method="GET") + @webmethod(route="/vector-dbs/{vector_db_id:path}", method="GET", level=LLAMA_STACK_API_V1) async def get_vector_db( self, vector_db_id: str, @@ -85,7 +86,7 @@ class VectorDBs(Protocol): """ ... - @webmethod(route="/vector-dbs", method="POST") + @webmethod(route="/vector-dbs", method="POST", level=LLAMA_STACK_API_V1) async def register_vector_db( self, vector_db_id: str, @@ -107,7 +108,7 @@ class VectorDBs(Protocol): """ ... - @webmethod(route="/vector-dbs/{vector_db_id:path}", method="DELETE") + @webmethod(route="/vector-dbs/{vector_db_id:path}", method="DELETE", level=LLAMA_STACK_API_V1) async def unregister_vector_db(self, vector_db_id: str) -> None: """Unregister a vector database. diff --git a/llama_stack/apis/vector_io/vector_io.py b/llama_stack/apis/vector_io/vector_io.py index 3e8065cfb..2850863c4 100644 --- a/llama_stack/apis/vector_io/vector_io.py +++ b/llama_stack/apis/vector_io/vector_io.py @@ -15,6 +15,7 @@ from pydantic import BaseModel, Field from llama_stack.apis.inference import InterleavedContent from llama_stack.apis.vector_dbs import VectorDB +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.providers.utils.telemetry.trace_protocol import trace_protocol from llama_stack.providers.utils.vector_io.vector_utils import generate_chunk_id from llama_stack.schema_utils import json_schema_type, webmethod @@ -437,7 +438,7 @@ class VectorIO(Protocol): # this will just block now until chunks are inserted, but it should # probably return a Job instance which can be polled for completion - @webmethod(route="/vector-io/insert", method="POST") + @webmethod(route="/vector-io/insert", method="POST", level=LLAMA_STACK_API_V1) async def insert_chunks( self, vector_db_id: str, @@ -455,7 +456,7 @@ class VectorIO(Protocol): """ ... - @webmethod(route="/vector-io/query", method="POST") + @webmethod(route="/vector-io/query", method="POST", level=LLAMA_STACK_API_V1) async def query_chunks( self, vector_db_id: str, @@ -472,7 +473,7 @@ class VectorIO(Protocol): ... # OpenAI Vector Stores API endpoints - @webmethod(route="/openai/v1/vector_stores", method="POST") + @webmethod(route="/openai/v1/vector_stores", method="POST", level=LLAMA_STACK_API_V1) async def openai_create_vector_store( self, name: str | None = None, @@ -498,7 +499,7 @@ class VectorIO(Protocol): """ ... - @webmethod(route="/openai/v1/vector_stores", method="GET") + @webmethod(route="/openai/v1/vector_stores", method="GET", level=LLAMA_STACK_API_V1) async def openai_list_vector_stores( self, limit: int | None = 20, @@ -516,7 +517,7 @@ class VectorIO(Protocol): """ ... - @webmethod(route="/openai/v1/vector_stores/{vector_store_id}", method="GET") + @webmethod(route="/openai/v1/vector_stores/{vector_store_id}", method="GET", level=LLAMA_STACK_API_V1) async def openai_retrieve_vector_store( self, vector_store_id: str, @@ -528,7 +529,7 @@ class VectorIO(Protocol): """ ... - @webmethod(route="/openai/v1/vector_stores/{vector_store_id}", method="POST") + @webmethod(route="/openai/v1/vector_stores/{vector_store_id}", method="POST", level=LLAMA_STACK_API_V1) async def openai_update_vector_store( self, vector_store_id: str, @@ -546,7 +547,7 @@ class VectorIO(Protocol): """ ... - @webmethod(route="/openai/v1/vector_stores/{vector_store_id}", method="DELETE") + @webmethod(route="/openai/v1/vector_stores/{vector_store_id}", method="DELETE", level=LLAMA_STACK_API_V1) async def openai_delete_vector_store( self, vector_store_id: str, @@ -558,7 +559,7 @@ class VectorIO(Protocol): """ ... - @webmethod(route="/openai/v1/vector_stores/{vector_store_id}/search", method="POST") + @webmethod(route="/openai/v1/vector_stores/{vector_store_id}/search", method="POST", level=LLAMA_STACK_API_V1) async def openai_search_vector_store( self, vector_store_id: str, @@ -584,7 +585,7 @@ class VectorIO(Protocol): """ ... - @webmethod(route="/openai/v1/vector_stores/{vector_store_id}/files", method="POST") + @webmethod(route="/openai/v1/vector_stores/{vector_store_id}/files", method="POST", level=LLAMA_STACK_API_V1) async def openai_attach_file_to_vector_store( self, vector_store_id: str, @@ -602,7 +603,7 @@ class VectorIO(Protocol): """ ... - @webmethod(route="/openai/v1/vector_stores/{vector_store_id}/files", method="GET") + @webmethod(route="/openai/v1/vector_stores/{vector_store_id}/files", method="GET", level=LLAMA_STACK_API_V1) async def openai_list_files_in_vector_store( self, vector_store_id: str, @@ -624,7 +625,9 @@ class VectorIO(Protocol): """ ... - @webmethod(route="/openai/v1/vector_stores/{vector_store_id}/files/{file_id}", method="GET") + @webmethod( + route="/openai/v1/vector_stores/{vector_store_id}/files/{file_id}", method="GET", level=LLAMA_STACK_API_V1 + ) async def openai_retrieve_vector_store_file( self, vector_store_id: str, @@ -638,7 +641,11 @@ class VectorIO(Protocol): """ ... - @webmethod(route="/openai/v1/vector_stores/{vector_store_id}/files/{file_id}/content", method="GET") + @webmethod( + route="/openai/v1/vector_stores/{vector_store_id}/files/{file_id}/content", + method="GET", + level=LLAMA_STACK_API_V1, + ) async def openai_retrieve_vector_store_file_contents( self, vector_store_id: str, @@ -652,7 +659,9 @@ class VectorIO(Protocol): """ ... - @webmethod(route="/openai/v1/vector_stores/{vector_store_id}/files/{file_id}", method="POST") + @webmethod( + route="/openai/v1/vector_stores/{vector_store_id}/files/{file_id}", method="POST", level=LLAMA_STACK_API_V1 + ) async def openai_update_vector_store_file( self, vector_store_id: str, @@ -668,7 +677,9 @@ class VectorIO(Protocol): """ ... - @webmethod(route="/openai/v1/vector_stores/{vector_store_id}/files/{file_id}", method="DELETE") + @webmethod( + route="/openai/v1/vector_stores/{vector_store_id}/files/{file_id}", method="DELETE", level=LLAMA_STACK_API_V1 + ) async def openai_delete_vector_store_file( self, vector_store_id: str, diff --git a/llama_stack/apis/version.py b/llama_stack/apis/version.py index 53ad6a854..6af039b1f 100644 --- a/llama_stack/apis/version.py +++ b/llama_stack/apis/version.py @@ -4,4 +4,6 @@ # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. -LLAMA_STACK_API_VERSION = "v1" +LLAMA_STACK_API_V1 = "v1" +LLAMA_STACK_API_V1BETA = "v1beta" +LLAMA_STACK_API_V1ALPHA = "v1alpha" diff --git a/llama_stack/core/client.py b/llama_stack/core/client.py index 03e4fb051..49e01794e 100644 --- a/llama_stack/core/client.py +++ b/llama_stack/core/client.py @@ -15,7 +15,6 @@ import httpx from pydantic import BaseModel, parse_obj_as from termcolor import cprint -from llama_stack.apis.version import LLAMA_STACK_API_VERSION from llama_stack.providers.datatypes import RemoteProviderConfig _CLIENT_CLASSES = {} @@ -114,7 +113,24 @@ def create_api_client_class(protocol) -> type: break kwargs[param.name] = args[i] - url = f"{self.base_url}/{LLAMA_STACK_API_VERSION}/{webmethod.route.lstrip('/')}" + # Get all webmethods for this method (supports multiple decorators) + webmethods = getattr(method, "__webmethods__", []) + + if not webmethods: + raise RuntimeError(f"Method {method} has no webmethod decorators") + + # Choose the preferred webmethod (non-deprecated if available) + preferred_webmethod = None + for wm in webmethods: + if not getattr(wm, "deprecated", False): + preferred_webmethod = wm + break + + # If no non-deprecated found, use the first one + if preferred_webmethod is None: + preferred_webmethod = webmethods[0] + + url = f"{self.base_url}/{preferred_webmethod.level}/{preferred_webmethod.route.lstrip('/')}" def convert(value): if isinstance(value, list): diff --git a/llama_stack/core/server/routes.py b/llama_stack/core/server/routes.py index 7baf20da5..4970d0bf8 100644 --- a/llama_stack/core/server/routes.py +++ b/llama_stack/core/server/routes.py @@ -14,7 +14,6 @@ from starlette.routing import Route from llama_stack.apis.datatypes import Api, ExternalApiSpec from llama_stack.apis.tools import RAGToolRuntime, SpecialToolGroup -from llama_stack.apis.version import LLAMA_STACK_API_VERSION from llama_stack.core.resolver import api_protocol_map from llama_stack.schema_utils import WebMethod @@ -54,22 +53,23 @@ def get_all_api_routes( protocol_methods.append((f"{tool_group.value}.{name}", method)) for name, method in protocol_methods: - if not hasattr(method, "__webmethod__"): + # Get all webmethods for this method (supports multiple decorators) + webmethods = getattr(method, "__webmethods__", []) + if not webmethods: continue - # The __webmethod__ attribute is dynamically added by the @webmethod decorator - # mypy doesn't know about this dynamic attribute, so we ignore the attr-defined error - webmethod = method.__webmethod__ # type: ignore[attr-defined] - path = f"/{LLAMA_STACK_API_VERSION}/{webmethod.route.lstrip('/')}" - if webmethod.method == hdrs.METH_GET: - http_method = hdrs.METH_GET - elif webmethod.method == hdrs.METH_DELETE: - http_method = hdrs.METH_DELETE - else: - http_method = hdrs.METH_POST - routes.append( - (Route(path=path, methods=[http_method], name=name, endpoint=None), webmethod) - ) # setting endpoint to None since don't use a Router object + # Create routes for each webmethod decorator + for webmethod in webmethods: + path = f"/{webmethod.level}/{webmethod.route.lstrip('/')}" + if webmethod.method == hdrs.METH_GET: + http_method = hdrs.METH_GET + elif webmethod.method == hdrs.METH_DELETE: + http_method = hdrs.METH_DELETE + else: + http_method = hdrs.METH_POST + routes.append( + (Route(path=path, methods=[http_method], name=name, endpoint=None), webmethod) + ) # setting endpoint to None since don't use a Router object apis[api] = routes diff --git a/llama_stack/core/server/tracing.py b/llama_stack/core/server/tracing.py index c48fc4d33..4c6df5b42 100644 --- a/llama_stack/core/server/tracing.py +++ b/llama_stack/core/server/tracing.py @@ -45,6 +45,14 @@ class TracingMiddleware: logger.debug(f"No matching route found for path: {path}, falling back to FastAPI") return await self.app(scope, receive, send) + # Log deprecation warning if route is deprecated + if getattr(webmethod, "deprecated", False): + logger.warning( + f"DEPRECATED ROUTE USED: {scope.get('method', 'GET')} {path} - " + f"This route is deprecated and may be removed in a future version. " + f"Please check the docs for the supported version." + ) + trace_attributes = {"__location__": "server", "raw_path": path} # Extract W3C trace context headers and store as trace attributes diff --git a/llama_stack/schema_utils.py b/llama_stack/schema_utils.py index 93382a881..4f8b4edff 100644 --- a/llama_stack/schema_utils.py +++ b/llama_stack/schema_utils.py @@ -13,6 +13,7 @@ from .strong_typing.schema import json_schema_type, register_schema # noqa: F40 @dataclass class WebMethod: + level: str | None = None route: str | None = None public: bool = False request_examples: list[Any] | None = None @@ -23,6 +24,7 @@ class WebMethod: descriptive_name: str | None = None experimental: bool | None = False required_scope: str | None = None + deprecated: bool | None = False T = TypeVar("T", bound=Callable[..., Any]) @@ -31,6 +33,7 @@ T = TypeVar("T", bound=Callable[..., Any]) def webmethod( route: str | None = None, method: str | None = None, + level: str | None = None, public: bool | None = False, request_examples: list[Any] | None = None, response_examples: list[Any] | None = None, @@ -38,6 +41,7 @@ def webmethod( descriptive_name: str | None = None, experimental: bool | None = False, required_scope: str | None = None, + deprecated: bool | None = False, ) -> Callable[[T], T]: """ Decorator that supplies additional metadata to an endpoint operation function. @@ -51,9 +55,10 @@ def webmethod( """ def wrap(func: T) -> T: - func.__webmethod__ = WebMethod( # type: ignore + webmethod_obj = WebMethod( route=route, method=method, + level=level, public=public or False, request_examples=request_examples, response_examples=response_examples, @@ -61,7 +66,16 @@ def webmethod( descriptive_name=descriptive_name, experimental=experimental, required_scope=required_scope, + deprecated=deprecated, ) + + # Store all webmethods in a list to support multiple decorators + if not hasattr(func, "__webmethods__"): + func.__webmethods__ = [] # type: ignore + func.__webmethods__.append(webmethod_obj) # type: ignore + + # Keep the last one as __webmethod__ for backwards compatibility + func.__webmethod__ = webmethod_obj # type: ignore return func return wrap diff --git a/tests/external/llama-stack-api-weather/src/llama_stack_api_weather/weather.py b/tests/external/llama-stack-api-weather/src/llama_stack_api_weather/weather.py index de1427bfd..e97a9d8fb 100644 --- a/tests/external/llama-stack-api-weather/src/llama_stack_api_weather/weather.py +++ b/tests/external/llama-stack-api-weather/src/llama_stack_api_weather/weather.py @@ -6,6 +6,7 @@ from typing import Protocol +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.providers.datatypes import Api, ProviderSpec, RemoteProviderSpec from llama_stack.schema_utils import webmethod @@ -28,7 +29,7 @@ class WeatherProvider(Protocol): A protocol for the Weather API. """ - @webmethod(route="/weather/locations", method="GET") + @webmethod(route="/weather/locations", method="GET", level=LLAMA_STACK_API_V1) async def get_available_locations() -> dict[str, list[str]]: """ Get the available locations. From 926c3ada41a40e034cd3b57067107e755b747ed1 Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Fri, 26 Sep 2025 11:44:43 -0400 Subject: [PATCH 25/27] chore: prune mypy exclude list (#3561) # What does this PR do? prune the mypy exclude list, build a stronger foundation for quality code ## Test Plan ci --- llama_stack/apis/inference/inference.py | 1 + .../remote/inference/databricks/databricks.py | 2 +- .../remote/inference/groq/__init__.py | 4 +--- .../remote/inference/sambanova/__init__.py | 4 +--- .../remote/inference/sambanova/sambanova.py | 2 +- .../utils/inference/model_registry.py | 2 +- llama_stack/providers/utils/kvstore/config.py | 10 +++++----- .../utils/kvstore/mongodb/mongodb.py | 11 +++++++--- .../providers/utils/kvstore/sqlite/sqlite.py | 7 +++++++ pyproject.toml | 20 ------------------- 10 files changed, 26 insertions(+), 37 deletions(-) diff --git a/llama_stack/apis/inference/inference.py b/llama_stack/apis/inference/inference.py index 4f5332b5f..c43cee6a8 100644 --- a/llama_stack/apis/inference/inference.py +++ b/llama_stack/apis/inference/inference.py @@ -914,6 +914,7 @@ class OpenAIEmbeddingData(BaseModel): """ object: Literal["embedding"] = "embedding" + # TODO: consider dropping str and using openai.types.embeddings.Embedding instead of OpenAIEmbeddingData embedding: list[float] | str index: int diff --git a/llama_stack/providers/remote/inference/databricks/databricks.py b/llama_stack/providers/remote/inference/databricks/databricks.py index 25fd9f3b7..6eac6e4f4 100644 --- a/llama_stack/providers/remote/inference/databricks/databricks.py +++ b/llama_stack/providers/remote/inference/databricks/databricks.py @@ -24,7 +24,6 @@ from llama_stack.apis.inference import ( LogProbConfig, Message, Model, - ModelType, OpenAICompletion, ResponseFormat, SamplingParams, @@ -34,6 +33,7 @@ from llama_stack.apis.inference import ( ToolDefinition, ToolPromptFormat, ) +from llama_stack.apis.models import ModelType from llama_stack.log import get_logger from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin diff --git a/llama_stack/providers/remote/inference/groq/__init__.py b/llama_stack/providers/remote/inference/groq/__init__.py index 1506e0b06..cca333ccf 100644 --- a/llama_stack/providers/remote/inference/groq/__init__.py +++ b/llama_stack/providers/remote/inference/groq/__init__.py @@ -4,12 +4,10 @@ # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. -from llama_stack.apis.inference import Inference - from .config import GroqConfig -async def get_adapter_impl(config: GroqConfig, _deps) -> Inference: +async def get_adapter_impl(config: GroqConfig, _deps): # import dynamically so the import is used only when it is needed from .groq import GroqInferenceAdapter diff --git a/llama_stack/providers/remote/inference/sambanova/__init__.py b/llama_stack/providers/remote/inference/sambanova/__init__.py index a3a7b8fbd..2a5448041 100644 --- a/llama_stack/providers/remote/inference/sambanova/__init__.py +++ b/llama_stack/providers/remote/inference/sambanova/__init__.py @@ -4,12 +4,10 @@ # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. -from llama_stack.apis.inference import Inference - from .config import SambaNovaImplConfig -async def get_adapter_impl(config: SambaNovaImplConfig, _deps) -> Inference: +async def get_adapter_impl(config: SambaNovaImplConfig, _deps): from .sambanova import SambaNovaInferenceAdapter assert isinstance(config, SambaNovaImplConfig), f"Unexpected config type: {type(config)}" diff --git a/llama_stack/providers/remote/inference/sambanova/sambanova.py b/llama_stack/providers/remote/inference/sambanova/sambanova.py index 6121e81f7..4d8fd11cd 100644 --- a/llama_stack/providers/remote/inference/sambanova/sambanova.py +++ b/llama_stack/providers/remote/inference/sambanova/sambanova.py @@ -25,7 +25,7 @@ class SambaNovaInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): def __init__(self, config: SambaNovaImplConfig): self.config = config - self.environment_available_models = [] + self.environment_available_models: list[str] = [] LiteLLMOpenAIMixin.__init__( self, litellm_provider_name="sambanova", diff --git a/llama_stack/providers/utils/inference/model_registry.py b/llama_stack/providers/utils/inference/model_registry.py index ff15b2d43..746ebd8f6 100644 --- a/llama_stack/providers/utils/inference/model_registry.py +++ b/llama_stack/providers/utils/inference/model_registry.py @@ -20,7 +20,7 @@ logger = get_logger(name=__name__, category="providers::utils") class RemoteInferenceProviderConfig(BaseModel): - allowed_models: list[str] | None = Field( + allowed_models: list[str] | None = Field( # TODO: make this non-optional and give a list() default default=None, description="List of models that should be registered with the model registry. If None, all models are allowed.", ) diff --git a/llama_stack/providers/utils/kvstore/config.py b/llama_stack/providers/utils/kvstore/config.py index d1747d65b..7b6a79350 100644 --- a/llama_stack/providers/utils/kvstore/config.py +++ b/llama_stack/providers/utils/kvstore/config.py @@ -28,7 +28,7 @@ class CommonConfig(BaseModel): class RedisKVStoreConfig(CommonConfig): - type: Literal[KVStoreType.redis.value] = KVStoreType.redis.value + type: Literal["redis"] = KVStoreType.redis.value host: str = "localhost" port: int = 6379 @@ -50,7 +50,7 @@ class RedisKVStoreConfig(CommonConfig): class SqliteKVStoreConfig(CommonConfig): - type: Literal[KVStoreType.sqlite.value] = KVStoreType.sqlite.value + type: Literal["sqlite"] = KVStoreType.sqlite.value db_path: str = Field( default=(RUNTIME_BASE_DIR / "kvstore.db").as_posix(), description="File path for the sqlite database", @@ -69,7 +69,7 @@ class SqliteKVStoreConfig(CommonConfig): class PostgresKVStoreConfig(CommonConfig): - type: Literal[KVStoreType.postgres.value] = KVStoreType.postgres.value + type: Literal["postgres"] = KVStoreType.postgres.value host: str = "localhost" port: int = 5432 db: str = "llamastack" @@ -113,11 +113,11 @@ class PostgresKVStoreConfig(CommonConfig): class MongoDBKVStoreConfig(CommonConfig): - type: Literal[KVStoreType.mongodb.value] = KVStoreType.mongodb.value + type: Literal["mongodb"] = KVStoreType.mongodb.value host: str = "localhost" port: int = 27017 db: str = "llamastack" - user: str = None + user: str | None = None password: str | None = None collection_name: str = "llamastack_kvstore" diff --git a/llama_stack/providers/utils/kvstore/mongodb/mongodb.py b/llama_stack/providers/utils/kvstore/mongodb/mongodb.py index bab87a4aa..4d60949c1 100644 --- a/llama_stack/providers/utils/kvstore/mongodb/mongodb.py +++ b/llama_stack/providers/utils/kvstore/mongodb/mongodb.py @@ -7,6 +7,7 @@ from datetime import datetime from pymongo import AsyncMongoClient +from pymongo.asynchronous.collection import AsyncCollection from llama_stack.log import get_logger from llama_stack.providers.utils.kvstore import KVStore @@ -19,8 +20,13 @@ log = get_logger(name=__name__, category="providers::utils") class MongoDBKVStoreImpl(KVStore): def __init__(self, config: MongoDBKVStoreConfig): self.config = config - self.conn = None - self.collection = None + self.conn: AsyncMongoClient | None = None + + @property + def collection(self) -> AsyncCollection: + if self.conn is None: + raise RuntimeError("MongoDB connection is not initialized") + return self.conn[self.config.db][self.config.collection_name] async def initialize(self) -> None: try: @@ -32,7 +38,6 @@ class MongoDBKVStoreImpl(KVStore): } conn_creds = {k: v for k, v in conn_creds.items() if v is not None} self.conn = AsyncMongoClient(**conn_creds) - self.collection = self.conn[self.config.db][self.config.collection_name] except Exception as e: log.exception("Could not connect to MongoDB database server") raise RuntimeError("Could not connect to MongoDB database server") from e diff --git a/llama_stack/providers/utils/kvstore/sqlite/sqlite.py b/llama_stack/providers/utils/kvstore/sqlite/sqlite.py index 6a6a170dc..5b782902e 100644 --- a/llama_stack/providers/utils/kvstore/sqlite/sqlite.py +++ b/llama_stack/providers/utils/kvstore/sqlite/sqlite.py @@ -9,9 +9,13 @@ from datetime import datetime import aiosqlite +from llama_stack.log import get_logger + from ..api import KVStore from ..config import SqliteKVStoreConfig +logger = get_logger(name=__name__, category="providers::utils") + class SqliteKVStoreImpl(KVStore): def __init__(self, config: SqliteKVStoreConfig): @@ -50,6 +54,9 @@ class SqliteKVStoreImpl(KVStore): if row is None: return None value, expiration = row + if not isinstance(value, str): + logger.warning(f"Expected string value for key {key}, got {type(value)}, returning None") + return None return value async def delete(self, key: str) -> None: diff --git a/pyproject.toml b/pyproject.toml index 86a32f978..a26c4d645 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -259,15 +259,12 @@ exclude = [ "^llama_stack/models/llama/llama3/tokenizer\\.py$", "^llama_stack/models/llama/llama3/tool_utils\\.py$", "^llama_stack/providers/inline/agents/meta_reference/", - "^llama_stack/providers/inline/agents/meta_reference/agent_instance\\.py$", - "^llama_stack/providers/inline/agents/meta_reference/agents\\.py$", "^llama_stack/providers/inline/datasetio/localfs/", "^llama_stack/providers/inline/eval/meta_reference/eval\\.py$", "^llama_stack/providers/inline/inference/meta_reference/inference\\.py$", "^llama_stack/models/llama/llama3/generation\\.py$", "^llama_stack/models/llama/llama3/multimodal/model\\.py$", "^llama_stack/models/llama/llama4/", - "^llama_stack/providers/inline/inference/meta_reference/quantization/fp8_impls\\.py$", "^llama_stack/providers/inline/inference/sentence_transformers/sentence_transformers\\.py$", "^llama_stack/providers/inline/post_training/common/validator\\.py$", "^llama_stack/providers/inline/safety/code_scanner/", @@ -278,19 +275,13 @@ exclude = [ "^llama_stack/providers/remote/agents/sample/", "^llama_stack/providers/remote/datasetio/huggingface/", "^llama_stack/providers/remote/datasetio/nvidia/", - "^llama_stack/providers/remote/inference/anthropic/", "^llama_stack/providers/remote/inference/bedrock/", "^llama_stack/providers/remote/inference/cerebras/", "^llama_stack/providers/remote/inference/databricks/", "^llama_stack/providers/remote/inference/fireworks/", - "^llama_stack/providers/remote/inference/gemini/", - "^llama_stack/providers/remote/inference/groq/", "^llama_stack/providers/remote/inference/nvidia/", - "^llama_stack/providers/remote/inference/openai/", "^llama_stack/providers/remote/inference/passthrough/", "^llama_stack/providers/remote/inference/runpod/", - "^llama_stack/providers/remote/inference/sambanova/", - "^llama_stack/providers/remote/inference/sample/", "^llama_stack/providers/remote/inference/tgi/", "^llama_stack/providers/remote/inference/together/", "^llama_stack/providers/remote/inference/watsonx/", @@ -310,7 +301,6 @@ exclude = [ "^llama_stack/providers/remote/vector_io/qdrant/", "^llama_stack/providers/remote/vector_io/sample/", "^llama_stack/providers/remote/vector_io/weaviate/", - "^llama_stack/providers/tests/conftest\\.py$", "^llama_stack/providers/utils/bedrock/client\\.py$", "^llama_stack/providers/utils/bedrock/refreshable_boto_session\\.py$", "^llama_stack/providers/utils/inference/embedding_mixin\\.py$", @@ -318,12 +308,9 @@ exclude = [ "^llama_stack/providers/utils/inference/model_registry\\.py$", "^llama_stack/providers/utils/inference/openai_compat\\.py$", "^llama_stack/providers/utils/inference/prompt_adapter\\.py$", - "^llama_stack/providers/utils/kvstore/config\\.py$", "^llama_stack/providers/utils/kvstore/kvstore\\.py$", - "^llama_stack/providers/utils/kvstore/mongodb/mongodb\\.py$", "^llama_stack/providers/utils/kvstore/postgres/postgres\\.py$", "^llama_stack/providers/utils/kvstore/redis/redis\\.py$", - "^llama_stack/providers/utils/kvstore/sqlite/sqlite\\.py$", "^llama_stack/providers/utils/memory/vector_store\\.py$", "^llama_stack/providers/utils/scoring/aggregation_utils\\.py$", "^llama_stack/providers/utils/scoring/base_scoring_fn\\.py$", @@ -331,13 +318,6 @@ exclude = [ "^llama_stack/providers/utils/telemetry/trace_protocol\\.py$", "^llama_stack/providers/utils/telemetry/tracing\\.py$", "^llama_stack/strong_typing/auxiliary\\.py$", - "^llama_stack/strong_typing/deserializer\\.py$", - "^llama_stack/strong_typing/inspection\\.py$", - "^llama_stack/strong_typing/schema\\.py$", - "^llama_stack/strong_typing/serializer\\.py$", - "^llama_stack/distributions/groq/groq\\.py$", - "^llama_stack/distributions/llama_api/llama_api\\.py$", - "^llama_stack/distributions/sambanova/sambanova\\.py$", "^llama_stack/distributions/template\\.py$", ] From b6e2934f7b3c1e62e4241dee7f13ee21712e38a4 Mon Sep 17 00:00:00 2001 From: Ben Browning Date: Fri, 26 Sep 2025 12:09:48 -0400 Subject: [PATCH 26/27] fix: Gracefully handle errors when listing MCP tools (#2544) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # What does this PR do? When listing (and lazily indexing) tools, it's possible for an error to get thrown by individual toolgroups if for example an MCP toolgroup is unable to connect to its `mcp_endpoint`. This logs a warning in the server when that happens, logs a full stack trace of the error if debug logging is enabled, and just returns the list of tools from all working toolgroups instead of throwing an error to the client when a single toolgroup is temporarily or permanently misbehaving. The exception to the above is authentication errors, which we specifically send all the way back to the client as that's how we indicate to the client that it needs to provide authentication data for the remote MCP servers. Closes #2540 ## Test Plan A new unit test was added to test this exception handling, which is run as part of our regular test suite but also manually run to specifically verify this fix via: ``` uv run pytest -sv --asyncio-mode=auto \ tests/unit/distribution/routers/test_routing_tables.py ``` To verify the additional debug logging is printing properly: ``` LLAMA_STACK_LOGGING=core=debug \ uv run pytest -sv --asyncio-mode=auto \ tests/unit/distribution/routers/test_routing_tables.py ``` The mcp integration tests were run as below (and by CI): ``` ollama run llama3.2:3b ENABLE_OLLAMA="ollama" \ OLLAMA_INFERENCE_MODEL="meta-llama/Llama-3.2-3B-Instruct" \ LLAMA_STACK_CONFIG=starter \ uv run pytest -sv tests/integration/tool_runtime/test_mcp.py \ --text-model meta-llama/Llama-3.2-3B-Instruct ``` --------- Signed-off-by: Ben Browning Signed-off-by: Sébastien Han Co-authored-by: Sébastien Han --- llama_stack/core/routing_tables/toolgroups.py | 15 ++++++++++-- .../routers/test_routing_tables.py | 23 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/llama_stack/core/routing_tables/toolgroups.py b/llama_stack/core/routing_tables/toolgroups.py index eeea406c1..8172b9b5f 100644 --- a/llama_stack/core/routing_tables/toolgroups.py +++ b/llama_stack/core/routing_tables/toolgroups.py @@ -9,7 +9,7 @@ from typing import Any from llama_stack.apis.common.content_types import URL from llama_stack.apis.common.errors import ToolGroupNotFoundError from llama_stack.apis.tools import ListToolGroupsResponse, ListToolsResponse, Tool, ToolGroup, ToolGroups -from llama_stack.core.datatypes import ToolGroupWithOwner +from llama_stack.core.datatypes import AuthenticationRequiredError, ToolGroupWithOwner from llama_stack.log import get_logger from .common import CommonRoutingTableImpl @@ -54,7 +54,18 @@ class ToolGroupsRoutingTable(CommonRoutingTableImpl, ToolGroups): all_tools = [] for toolgroup in toolgroups: if toolgroup.identifier not in self.toolgroups_to_tools: - await self._index_tools(toolgroup) + try: + await self._index_tools(toolgroup) + except AuthenticationRequiredError: + # Send authentication errors back to the client so it knows + # that it needs to supply credentials for remote MCP servers. + raise + except Exception as e: + # Other errors that the client cannot fix are logged and + # those specific toolgroups are skipped. + logger.warning(f"Error listing tools for toolgroup {toolgroup.identifier}: {e}") + logger.debug(e, exc_info=True) + continue all_tools.extend(self.toolgroups_to_tools[toolgroup.identifier]) return ListToolsResponse(data=all_tools) diff --git a/tests/unit/distribution/routers/test_routing_tables.py b/tests/unit/distribution/routers/test_routing_tables.py index bbfea3f46..456a5d041 100644 --- a/tests/unit/distribution/routers/test_routing_tables.py +++ b/tests/unit/distribution/routers/test_routing_tables.py @@ -10,6 +10,7 @@ from unittest.mock import AsyncMock import pytest +from llama_stack.apis.common.content_types import URL from llama_stack.apis.common.type_system import NumberType from llama_stack.apis.datasets.datasets import Dataset, DatasetPurpose, URIDataSource from llama_stack.apis.datatypes import Api @@ -645,3 +646,25 @@ async def test_models_source_interaction_cleanup_provider_models(cached_disk_dis # Cleanup await table.shutdown() + + +async def test_tool_groups_routing_table_exception_handling(cached_disk_dist_registry): + """Test that the tool group routing table handles exceptions when listing tools, like if an MCP server is unreachable.""" + + exception_throwing_tool_groups_impl = ToolGroupsImpl() + exception_throwing_tool_groups_impl.list_runtime_tools = AsyncMock(side_effect=Exception("Test exception")) + + table = ToolGroupsRoutingTable( + {"test_provider": exception_throwing_tool_groups_impl}, cached_disk_dist_registry, {} + ) + await table.initialize() + + await table.register_tool_group( + toolgroup_id="test-toolgroup-exceptions", + provider_id="test_provider", + mcp_endpoint=URL(uri="http://localhost:8479/foo/bar"), + ) + + tools = await table.list_tools(toolgroup_id="test-toolgroup-exceptions") + + assert len(tools.data) == 0 From 88ad5d6d7319667eae1c0a04d8e99349cb98c13b Mon Sep 17 00:00:00 2001 From: Eric Huang Date: Fri, 26 Sep 2025 10:35:11 -0700 Subject: [PATCH 27/27] chore: introduce write queue for response_store # What does this PR do? ## Test Plan --- llama_stack/core/datatypes.py | 6 + .../utils/responses/responses_store.py | 110 +++++++++++++++++- .../meta_reference/test_openai_responses.py | 6 +- .../utils/responses/test_responses_store.py | 21 ++++ 4 files changed, 136 insertions(+), 7 deletions(-) diff --git a/llama_stack/core/datatypes.py b/llama_stack/core/datatypes.py index b5558c66f..6a297f012 100644 --- a/llama_stack/core/datatypes.py +++ b/llama_stack/core/datatypes.py @@ -433,6 +433,12 @@ class InferenceStoreConfig(BaseModel): num_writers: int = Field(default=4, description="Number of concurrent background writers") +class ResponsesStoreConfig(BaseModel): + sql_store_config: SqlStoreConfig + max_write_queue_size: int = Field(default=10000, description="Max queued writes for responses store") + num_writers: int = Field(default=4, description="Number of concurrent background writers") + + class StackRunConfig(BaseModel): version: int = LLAMA_STACK_RUN_CONFIG_VERSION diff --git a/llama_stack/providers/utils/responses/responses_store.py b/llama_stack/providers/utils/responses/responses_store.py index 829cd8a62..b9fceb1ab 100644 --- a/llama_stack/providers/utils/responses/responses_store.py +++ b/llama_stack/providers/utils/responses/responses_store.py @@ -3,6 +3,9 @@ # # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. +import asyncio +from typing import Any + from llama_stack.apis.agents import ( Order, ) @@ -14,24 +17,51 @@ from llama_stack.apis.agents.openai_responses import ( OpenAIResponseObject, OpenAIResponseObjectWithInput, ) -from llama_stack.core.datatypes import AccessRule +from llama_stack.core.datatypes import AccessRule, ResponsesStoreConfig from llama_stack.core.utils.config_dirs import RUNTIME_BASE_DIR +from llama_stack.log import get_logger from ..sqlstore.api import ColumnDefinition, ColumnType from ..sqlstore.authorized_sqlstore import AuthorizedSqlStore -from ..sqlstore.sqlstore import SqliteSqlStoreConfig, SqlStoreConfig, sqlstore_impl +from ..sqlstore.sqlstore import SqliteSqlStoreConfig, SqlStoreConfig, SqlStoreType, sqlstore_impl + +logger = get_logger(name=__name__, category="responses_store") class ResponsesStore: - def __init__(self, sql_store_config: SqlStoreConfig, policy: list[AccessRule]): - if not sql_store_config: - sql_store_config = SqliteSqlStoreConfig( + def __init__( + self, + config: ResponsesStoreConfig | SqlStoreConfig, + policy: list[AccessRule], + ): + # Handle backward compatibility + if not isinstance(config, ResponsesStoreConfig): + # Legacy: SqlStoreConfig passed directly as config + config = ResponsesStoreConfig( + sql_store_config=config, + ) + + self.config = config + self.sql_store_config = config.sql_store_config + if not self.sql_store_config: + self.sql_store_config = SqliteSqlStoreConfig( db_path=(RUNTIME_BASE_DIR / "sqlstore.db").as_posix(), ) - self.sql_store = AuthorizedSqlStore(sqlstore_impl(sql_store_config), policy) + self.sql_store = None + self.policy = policy + + # Disable write queue for SQLite to avoid concurrency issues + self.enable_write_queue = self.sql_store_config.type != SqlStoreType.sqlite + + # Async write queue and worker control + self._queue: asyncio.Queue[tuple[OpenAIResponseObject, list[OpenAIResponseInput]]] | None = None + self._worker_tasks: list[asyncio.Task[Any]] = [] + self._max_write_queue_size: int = config.max_write_queue_size + self._num_writers: int = max(1, config.num_writers) async def initialize(self): """Create the necessary tables if they don't exist.""" + self.sql_store = AuthorizedSqlStore(sqlstore_impl(self.sql_store_config), self.policy) await self.sql_store.create_table( "openai_responses", { @@ -42,9 +72,68 @@ class ResponsesStore: }, ) + if self.enable_write_queue: + self._queue = asyncio.Queue(maxsize=self._max_write_queue_size) + for _ in range(self._num_writers): + self._worker_tasks.append(asyncio.create_task(self._worker_loop())) + else: + logger.info("Write queue disabled for SQLite to avoid concurrency issues") + + async def shutdown(self) -> None: + if not self._worker_tasks: + return + if self._queue is not None: + await self._queue.join() + for t in self._worker_tasks: + if not t.done(): + t.cancel() + for t in self._worker_tasks: + try: + await t + except asyncio.CancelledError: + pass + self._worker_tasks.clear() + + async def flush(self) -> None: + """Wait for all queued writes to complete. Useful for testing.""" + if self.enable_write_queue and self._queue is not None: + await self._queue.join() + async def store_response_object( self, response_object: OpenAIResponseObject, input: list[OpenAIResponseInput] ) -> None: + if self.enable_write_queue: + if self._queue is None: + raise ValueError("Responses store is not initialized") + try: + self._queue.put_nowait((response_object, input)) + except asyncio.QueueFull: + logger.warning(f"Write queue full; adding response id={getattr(response_object, 'id', '')}") + await self._queue.put((response_object, input)) + else: + await self._write_response_object(response_object, input) + + async def _worker_loop(self) -> None: + assert self._queue is not None + while True: + try: + item = await self._queue.get() + except asyncio.CancelledError: + break + response_object, input = item + try: + await self._write_response_object(response_object, input) + except Exception as e: # noqa: BLE001 + logger.error(f"Error writing response object: {e}") + finally: + self._queue.task_done() + + async def _write_response_object( + self, response_object: OpenAIResponseObject, input: list[OpenAIResponseInput] + ) -> None: + if self.sql_store is None: + raise ValueError("Responses store is not initialized") + data = response_object.model_dump() data["input"] = [input_item.model_dump() for input_item in input] @@ -73,6 +162,9 @@ class ResponsesStore: :param model: The model to filter by. :param order: The order to sort the responses by. """ + if not self.sql_store: + raise ValueError("Responses store is not initialized") + if not order: order = Order.desc @@ -100,6 +192,9 @@ class ResponsesStore: """ Get a response object with automatic access control checking. """ + if not self.sql_store: + raise ValueError("Responses store is not initialized") + row = await self.sql_store.fetch_one( "openai_responses", where={"id": response_id}, @@ -113,6 +208,9 @@ class ResponsesStore: return OpenAIResponseObjectWithInput(**row["response_object"]) async def delete_response_object(self, response_id: str) -> OpenAIDeleteResponseObject: + if not self.sql_store: + raise ValueError("Responses store is not initialized") + row = await self.sql_store.fetch_one("openai_responses", where={"id": response_id}) if not row: raise ValueError(f"Response with id {response_id} not found") diff --git a/tests/unit/providers/agents/meta_reference/test_openai_responses.py b/tests/unit/providers/agents/meta_reference/test_openai_responses.py index a964bc219..38ce365c1 100644 --- a/tests/unit/providers/agents/meta_reference/test_openai_responses.py +++ b/tests/unit/providers/agents/meta_reference/test_openai_responses.py @@ -42,10 +42,12 @@ from llama_stack.apis.inference import ( ) from llama_stack.apis.tools.tools import Tool, ToolGroups, ToolInvocationResult, ToolParameter, ToolRuntime from llama_stack.core.access_control.access_control import default_policy +from llama_stack.core.datatypes import ResponsesStoreConfig from llama_stack.providers.inline.agents.meta_reference.responses.openai_responses import ( OpenAIResponsesImpl, ) from llama_stack.providers.utils.responses.responses_store import ResponsesStore +from llama_stack.providers.utils.sqlstore.sqlstore import SqliteSqlStoreConfig from tests.unit.providers.agents.meta_reference.fixtures import load_chat_completion_fixture @@ -677,7 +679,9 @@ async def test_responses_store_list_input_items_logic(): # Create mock store and response store mock_sql_store = AsyncMock() - responses_store = ResponsesStore(sql_store_config=None, policy=default_policy()) + responses_store = ResponsesStore( + ResponsesStoreConfig(sql_store_config=SqliteSqlStoreConfig(db_path="mock_db_path")), policy=default_policy() + ) responses_store.sql_store = mock_sql_store # Setup test data - multiple input items diff --git a/tests/unit/utils/responses/test_responses_store.py b/tests/unit/utils/responses/test_responses_store.py index 44d4b30da..4e5256c1b 100644 --- a/tests/unit/utils/responses/test_responses_store.py +++ b/tests/unit/utils/responses/test_responses_store.py @@ -67,6 +67,9 @@ async def test_responses_store_pagination_basic(): input_list = [create_test_response_input(f"Input for {response_id}", f"input-{response_id}")] await store.store_response_object(response, input_list) + # Wait for all queued writes to complete + await store.flush() + # Test 1: First page with limit=2, descending order (default) result = await store.list_responses(limit=2, order=Order.desc) assert len(result.data) == 2 @@ -110,6 +113,9 @@ async def test_responses_store_pagination_ascending(): input_list = [create_test_response_input(f"Input for {response_id}", f"input-{response_id}")] await store.store_response_object(response, input_list) + # Wait for all queued writes to complete + await store.flush() + # Test ascending order pagination result = await store.list_responses(limit=1, order=Order.asc) assert len(result.data) == 1 @@ -145,6 +151,9 @@ async def test_responses_store_pagination_with_model_filter(): input_list = [create_test_response_input(f"Input for {response_id}", f"input-{response_id}")] await store.store_response_object(response, input_list) + # Wait for all queued writes to complete + await store.flush() + # Test pagination with model filter result = await store.list_responses(limit=1, model="model-a", order=Order.desc) assert len(result.data) == 1 @@ -192,6 +201,9 @@ async def test_responses_store_pagination_no_limit(): input_list = [create_test_response_input(f"Input for {response_id}", f"input-{response_id}")] await store.store_response_object(response, input_list) + # Wait for all queued writes to complete + await store.flush() + # Test without limit (should use default of 50) result = await store.list_responses(order=Order.desc) assert len(result.data) == 2 @@ -212,6 +224,9 @@ async def test_responses_store_get_response_object(): input_list = [create_test_response_input("Test input content", "input-test-resp")] await store.store_response_object(response, input_list) + # Wait for all queued writes to complete + await store.flush() + # Retrieve the response retrieved = await store.get_response_object("test-resp") assert retrieved.id == "test-resp" @@ -242,6 +257,9 @@ async def test_responses_store_input_items_pagination(): ] await store.store_response_object(response, input_list) + # Wait for all queued writes to complete + await store.flush() + # Verify all items are stored correctly with explicit IDs all_items = await store.list_response_input_items("test-resp", order=Order.desc) assert len(all_items.data) == 5 @@ -319,6 +337,9 @@ async def test_responses_store_input_items_before_pagination(): ] await store.store_response_object(response, input_list) + # Wait for all queued writes to complete + await store.flush() + # Test before pagination with descending order # In desc order: [Fifth, Fourth, Third, Second, First] # before="before-3" should return [Fifth, Fourth]
- -